docs(plugin-approvals): recall's docblock summary line states the status, not an exclusive actor set - #16360
Conversation
…tus, not an exclusive actor set The block opened "Withdraw a pending request (submitter only)" and its third paragraph stated the #3424 privileged override reaching a PENDING request. Both cannot be true; `overrideAdmits` settles it in the paragraph's favour by short-circuiting the non-submitter guard on a pending row. The summary line is what an editor hover and any single-line extraction show, so it is the half that gets read alone. The line now reads "Withdraw an undecided request." — status is the axis and the actor rules stay with the paragraphs that already state them correctly, the same structural move the `IApprovalService.recall` docstring makes on the spec side. Comment-only: no guard, branch or signature changed. It ships in the published `dist/index.d.ts`, so it takes a patch changeset rather than `skip-changeset`. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XpTx2tbq3pZRYAdoGt6E6Y
📓 Docs Drift CheckThis PR changes 1 package(s): 1 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
What this run could not see
Coarse fallback — 5 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin ee98e04d8cc51c0b2b024d426b9537c75b673dce && git checkout ee98e04d8cc51c0b2b024d426b9537c75b673dce
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin a87163c89b96b57fa4d1002b63fa9e77d039d01b a6d91b289f833b67413301bfaea0e09a47ff8771 && git checkout -B drift-repro a87163c89b96b57fa4d1002b63fa9e77d039d01b && git merge --no-ff a6d91b289f833b67413301bfaea0e09a47ff8771
node scripts/docs-audit/affected-docs.mjs --json a87163c89b96b57fa4d1002b63fa9e77d039d01b
|
Fixes #15643
ApprovalService.recall's docblock opened withWithdraw a pending request (submitter only).and then, three paragraphs down, stated the privileged override correctly —The #3424 privileged override reaches a PENDING request only (#12775, maintainer ruling 2026-09-02).Both cannot be true, and the code settles it in the paragraph's favour:overrideAdmitsshort-circuits the non-submitter guard on apendingrow.Nobody who reads the whole block is misled — it corrects itself before the reader leaves it. What is wrong is the summary line: the one an editor shows on hover and the one any single-line extraction takes, and often the only line that gets read.
The change
One line, inside the docblock:
Status becomes the axis instead of one general rule plus corrections, and the actor rules stay with the paragraphs that already state them correctly — the same structural move the
IApprovalService.recalldocstring makes on the spec side (#14670). "Undecided" is this contract's own vocabulary:ApprovalRecallInputis already documented as "Input for recalling (withdrawing) an undecided request", and the two statuses the method accepts (pending,returned) are exactly the undecided ones — every other status throwsINVALID_STATE.Deliberately untouched
overrideAdmitsand the non-submitter guard under it — not one character. No behaviour moves.isOverrideActor's docblock — it already names all four levers (approve / reject / reassign / recall). It is the evidence here, not the defect.packages/spec— that half belongs toIApprovalService.recalldocstring says "only the submitter (or a system context)" — it predates the #3424 admin override and does not carry the pending-only scope #14670 and is outside this PR's fence.Evidence
Comment-only, mechanically.
git diff -U0is one hunk of one line; both sides begin with*and sit inside the docblock spanning lines 3148-3167 (/**..*/). Changed non-comment lines: 0.The same reading before and after, not merely green.
3e270d4e2:pnpm --filter @objectstack/plugin-approvals test->Test Files 41 passed (41)/Tests 690 passed (690)a6d91b289: identical ->Test Files 41 passed (41)/Tests 690 passed (690)Typecheck, with its coverage confirmed rather than assumed.
pnpm --filter @objectstack/plugin-approvals typecheckexits 0, echoing the script it ran (tsc --noEmit && tsc --noEmit -p tsconfig.scripts.json && pnpm check:test-typecheck).tsc -p tsconfig.json --listFilesOnlylists 480 files, andapproval-service.tsis one of them.Gates. The family was derived mechanically on the final head —
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsata6d91b289— and all 51 commands were run, each exit code captured immediately after a single redirect, never through a pipe. 49 were green on the first pass.check:dual-build-cjs-loadsandcheck:i18nreturned exit 3PREREQUISITE NOT MET(both read built output); afterturbo run build --filter='!@objectstack/docs'both were re-run into real readings and are green — 103 published require entry points across 66 packages load, and 9 i18n packages report in sync. The four artifact-roster families the deriver flagged as keeping their roster under one of these paths were run too:check-changeset-fixed,check:authz-resolver,check:error-code-casing,check:filter-alias-parity— all exit 0.Changeset:
patch, and why notskip-changesetJudged, not defaulted.
skip-changesetis for a diff that publishes nothing from any released package.@objectstack/plugin-approvalsis published and shipsdist, and this docblock sits on a public method of an exported class, so the prose ships: after the build,packages/plugins/plugin-approvals/dist/index.d.tscarries the new summary line. Repo practice agrees — documentation-only docstring corrections in a published package took a patch changeset in #16246 and #16191, and the spec-side correction from #14670 is a pending@objectstack/spec: patch; the comment-only change that carried no changeset (b45c3f6c8) edited comments inside a method body, which never reach the emitted declarations.Generated by Claude Code