Repository navigation
qa(checklist): name the persona and status of three approvals refusals a non-reader gets as 404 - #33327
Merged
Conversation
…s a non-reader gets as 404 approvals.request-page-reply-and-reader-visibility acceptance[1], approvals.quorum-m-of-n steps[4] and approvals.decision-action-matrix acceptance[6] expected 403 FORBIDDEN from a caller who cannot read the request. ApprovalService.refuseUnreadableRequest answers that caller REQUEST_NOT_FOUND (404) before any slate or submitter check, so the request's existence never leaks; 403 stays the answer to a reader who holds no slot. Each item gets a revision bump and a history row. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FEkQ5kHpQrXX5yTHRb5h4F
This was referenced Nov 14, 2026
Contributor
Author
|
domain:devx#4 · os-project-manager · session_01FEkQ5ooRyyS95kdyC2dPEX 席位核对 · ACCEPT · head
|
objectstack-fleet
Bot
added this pull request to the merge queue
Nov 14, 2026
Any commits made after this event will not be merged.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by Leehom · project thread
domain:devx#4 · os-project-manager · session_01FEkQ5kHpQrXX5yTHRb5h4F
Fixes #33275
Clause-②: no
Metadata-protocol: none
维护者速读
docs/qa/platform-checklist/areas/approvals.json:回复请求页的「组织成员发评论」、法定人数的「不在任何审批岗位上的人再批一次」、决策动作矩阵的「非提交人撤回」。三条现在都点名是哪类人,以及这类人拿到什么回答。approvals.json里approvals.decision-action-matrix的 acceptance[6] verify(新增点名两类人,并排除管理员);其余两处是同一句口径。pnpm check:platform-checklist,预期退出码 0。What changes
docs/qa/platform-checklist/areas/approvals.json, three items, text only:approvals.request-page-reply-and-reader-visibilityREQUEST_NOT_FOUND, no row lands; 403 named as the answer to a caller who CAN read the request and is neither pending approver nor submitter (a past actor, or a record reader on an object that declares the flag); the service-layer pins it cites are named for what they holdapprovals.quorum-m-of-nREQUEST_NOT_FOUND, tally unchanged either wayapprovals.decision-action-matrixREQUEST_NOT_FOUND; ⛔ not the dev admin, whose override recalls a pending request by design (#3424)Each item gets a
historyrow citing this card. No clause sentence changed. No other item, no other file.Why
Re-measured from source on
origin/main87330e8 before any edit (the card's readings came from PR #33273's Acceptance notes and were not driven live):packages/plugins/plugin-approvals/src/approval-service.tsrefuseUnreadableRequest(L10154): a caller who is not the override actor and for whomrequestRowForCaller(…, enforceVisibility = true)finds nothing is thrownREQUEST_NOT_FOUND: ID, byte for byte what a missing id gets.packages/rest/src/approvals-routes.tshandleApprovalError(L199–L200) mapsFORBIDDEN→ 403 andREQUEST_NOT_FOUND→ 404.visibleRequestIds(L9706): the submitter, a current approver (any acting address), anyone whoseactor_idoracted_asis on asys_approval_actionrow of it, the override actor (sees everything), plus the record-reader tier only where the object declaresenable.approvalsVisibleToReaders.git grep approvalsVisibleToReaders -- examples/→ 0 hits (exit 1; control: the same grep inpackages/plugins/plugin-approvals/src→ hits inapproval-service.tsandapprovals-plugin.ts).comment(L7428) →loadPendingRow(L2341) →refuseUnreadableRequest, then the slot checkFORBIDDEN: actor '…' is not on this request(L7442). Clause 1 stale: the org member is no participant, so 404.decideNode(L5270) asks it, thenFORBIDDEN: actor '…' is not a pending approver(L5281). Clause 2 half stale: Ada acted, so she reads the request and gets the 403; a user on no position who never acted gets 404.recall(L6120) asks it, then the submitter / override check,FORBIDDENwith theapproval_recall_not_submittercopy (L6164). Clause 3 under-specified: 403 for a reader, 404 for a non-reader, and the dev admin's override admits a pending recall, so the admin is no persona for the denied leg.automated.ref, so per RUNNER rule 6 they are evidence of that layer only):approval-service.test.tsL2104 "comment: submitter and approver may reply; outsiders may not" (outsider →REQUEST_NOT_FOUND), L2925 "every caller shape…" (stranger →REQUEST_NOT_FOUND, override admin on no slot →FORBIDDEN);recall-refusal-user-copy.test.tsL316 "a plain non-submitter is still refused, and the request is untouched" (both legs: the pending approveru2, a reader who did not submit →FORBIDDEN; strangeru7→REQUEST_NOT_FOUND; the request stays pending).approvals.decision-action-matrixnegative[2] is not stale and is unchanged: it fails any accepted POST from an actor the service should deny, whatever status the refusal carries.Tests
No test added or changed: the diff is checklist text, and the product behaviour it now describes is already pinned at the service layer (above). Nothing to ablate (os-dev.md: docs are not ablated).
Acceptance notes
skip-changeset:docs/qa/**ships in no package. There is nopackage.jsonunderdocs/, the root package isprivate: true, and no workspacepackage.jsonnamesdocs/qaorplatform-checklist.areas/*.json; it is told to leave these three clauses alone.origin/mainhad not moved the file since PR qa(checklist): re-point eight stale checklist items across five cards to the product at e540baf8 #33273 at branch time.Verification
On head
fd55e259(branchclaude/project-thread-v8xylo, merge baseorigin/main87330e8), the list fromnode scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(16 commands), each exit code captured before any pipe:16 derived, 16 run, all exit 0; --ran reconciliation exit 0
check:doc-formula-expressionsfirst answered exit 3 (PREREQUISITE NOT MET, nothing measured:@objectstack/formulaand@objectstack/lintunbuilt in a fresh worktree). Built them under the verify lock (turbo run build --filter=@objectstack/formula --filter=@objectstack/lint, VERDICT command-exit 0), reran: exit 0.dispatch-gates --ran: "16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED", exit 0.No package is touched, so there is no package build, test, typecheck or scoped
pnpm lintowed; every other family is CI's and is read from this PR's check-runs.Generated by Claude Code
🤖 Generated with Claude Code
https://claude.ai/code/session_01FEkQ5kHpQrXX5yTHRb5h4F