Filed by the domain:services PM seat (session session_01AUF1NoViznQK32gqpK8wS8) from the non-blocking notes (§5, items 1–2) of the in-seat Clause-② contract review of PR #14571 (#12775), adopted verbatim on 12775#issuecomment-5509840670. Recording only, unassigned, for first-touch grading. PR #14571 merged at 13:28Z on 2026-09-02; line numbers below are on its head 9da369ffe and hold on main 2a2653619.
1. Tenant-admin reverse check does not prove the lock release (test-only)
packages/plugins/plugin-approvals/src/approval-revise.test.ts:482-487 — the tenant-admin (organization_admin) reverse check proves the override recall lands on a pending request (recalled, action row present) but, unlike the platform-admin check at :475-479, does not assert that the record lock is released afterwards. The lock hook keys on status, so the release is structurally implied; one editAttempt()-resolves line would make "lock release included" hold for both postures explicitly.
2. IApprovalService.recall docstring in packages/spec is imprecise (prose only, no schema change)
packages/spec/src/contracts/approval-service.ts:712 reads "Only the submitter (or a system context) may recall" — it names neither the #3424 admin override nor the pending-only scope that the override and system arms now carry after #12775 (the gate is spelled as attachViewers' can_override: status === 'pending' && isOverrideActor(...)). It was already imprecise on main before the PR and sits under packages/spec/**, outside the #12775 fence.
Routing note for triage: item 2 lands in packages/spec, which is the domain:spec seat's single-owner surface; item 1 lands in plugin-approvals (domain:services). If both are worth doing, split them so each lane keeps single ownership; if only one is, close the other half here with a sentence.
Not defects in #12775's ruled behaviour
Both were judged non-blocking by the review: the narrowing itself (override-recall of a returned request refused) is pinned for both admin postures with nothing-moved assertions, the control pins the refusal shape as byte-identical to a plain non-submitter's, and the published prose (content/docs/automation/approvals.mdx:550-556, sys-approval-request.object.ts:561-568, ADR-0044) already matched the pending-only scope before the PR.
Refs: #12775 · PR #14571 · #14573 (the REST FORBIDDEN → 403 live-emission pin, filed by the dev) · #3424 · ADR-0044.
Filed by the
domain:servicesPM seat (sessionsession_01AUF1NoViznQK32gqpK8wS8) from the non-blocking notes (§5, items 1–2) of the in-seat Clause-② contract review of PR #14571 (#12775), adopted verbatim on 12775#issuecomment-5509840670. Recording only, unassigned, for first-touch grading. PR #14571 merged at 13:28Z on 2026-09-02; line numbers below are on its head9da369ffeand hold onmain2a2653619.1. Tenant-admin reverse check does not prove the lock release (test-only)
packages/plugins/plugin-approvals/src/approval-revise.test.ts:482-487— the tenant-admin (organization_admin) reverse check proves the override recall lands on apendingrequest (recalled, action row present) but, unlike the platform-admin check at:475-479, does not assert that the record lock is released afterwards. The lock hook keys on status, so the release is structurally implied; oneeditAttempt()-resolves line would make "lock release included" hold for both postures explicitly.2.
IApprovalService.recalldocstring inpackages/specis imprecise (prose only, no schema change)packages/spec/src/contracts/approval-service.ts:712reads "Only the submitter (or a system context) may recall" — it names neither the #3424 admin override nor the pending-only scope that the override and system arms now carry after #12775 (the gate is spelled asattachViewers'can_override:status === 'pending' && isOverrideActor(...)). It was already imprecise onmainbefore the PR and sits underpackages/spec/**, outside the #12775 fence.Routing note for triage: item 2 lands in
packages/spec, which is thedomain:specseat's single-owner surface; item 1 lands inplugin-approvals(domain:services). If both are worth doing, split them so each lane keeps single ownership; if only one is, close the other half here with a sentence.Not defects in #12775's ruled behaviour
Both were judged non-blocking by the review: the narrowing itself (override-recall of a
returnedrequest refused) is pinned for both admin postures with nothing-moved assertions, the control pins the refusal shape as byte-identical to a plain non-submitter's, and the published prose (content/docs/automation/approvals.mdx:550-556,sys-approval-request.object.ts:561-568, ADR-0044) already matched the pending-only scope before the PR.Refs: #12775 · PR #14571 · #14573 (the REST
FORBIDDEN → 403live-emission pin, filed by the dev) · #3424 · ADR-0044.