Repository navigation
qa(checklist): re-point 36 stale access-security, api-backend and approvals items to what main does - #33400
Queued
objectstack-fleet[bot] wants to merge 3 commits into
Queued
qa(checklist): re-point 36 stale access-security, api-backend and approvals items to what main does#33400objectstack-fleet[bot] wants to merge 3 commits into
objectstack-fleet[bot] wants to merge 3 commits into
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
…rovals items to what main does Each item's text is re-read from source on main and re-pointed where the v18.4.0 sweep found it stale: the refusal codes and statuses a caller now meets, the doors a console click actually posts, the app a request page opens under, the runtime fixtures a run needs, and counts that grew (route ledgers, retired definitions). Two negatives read the design now: the status mirror's user-less cascade fails only if its data operation lands, and a forged delegation may be refused at the object gate as well as by the delegation guard. One revision bump and one history row per item. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FEkQ5kHpQrXX5yTHRb5h4F
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 branch has not been deployed
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 #33332
Clause-②: no
Metadata-protocol: none
维护者速读
approvals.request-page-reply-and-reader-visibility(第 102 行):main 上普通成员已经能读 sys_approval_request([Decision] Should an approver be able to see and decide their pending approvals over MCP? #32442 裁决 1B),所以 404 那条腿不再需要临时授权;再看approvals.record-page-decisions(第 159 行)acceptance[2] 的 clause 改了措辞。pnpm check:platform-checklist,预期退出码 0。What changes
docs/qa/platform-checklist/areas/access-security.json(16 items),api-backend.json(9 items) andapprovals.json(11 items), text only. Each item gets exactly onerevisionbump and onehistoryrow citing #33332, the QA record(s) the row came from, and the base it was read at (fca5f89c). No other file.Every row was re-measured from source on
origin/mainfca5f89cbefore its edit. None turned out already right as a whole (row 211's knownGaps half was), none needs a live drive to settle, and none needs a ruling, so there are noneeds_decisionrows.access-security.ai-service-account-agent-ceilingapprovals.account-app-entryapprovals.account-app-entryaccess-security.walled-environment-metadata-operator-onlyaccess-security.no-active-org-session-semanticsaccess-security.permission-set-package-resolutionapi-backend.automation-namespace-addressaccess-security.credential-use-audit-rowapi-backend.client-sdk-namespace-addressapi-backend.api-methods-verb-gateapi-backend.retired-def-refusalapi-backend.aggregate-contract-matrixaccess-security.activation-write-operator-gateapprovals.status-mirror-fieldapi-backend.automation-namespace-addressaccess-security.share-link-landing-pageaccess-security.security-catalog-one-holder-and-boot-reportapprovals.request-page-reply-and-reader-visibilityaccess-security.capability-declaration-lifecycleapprovals.quorum-m-of-napprovals.inbox-metadata-actionsapprovals.decision-action-matrixapi-backend.route-ledger-live-parityapprovals.notification-deep-linkapprovals.ooo-delegation-rerouteapprovals.record-page-decisionsapprovals.sla-escalationaccess-security.public-form-withdrawal-layersaccess-security.security-catalog-activation-and-clone-doorsapi-backend.action-activation-door-contractapi-backend.rest-crud-config-contractapprovals.decision-only-via-serviceapi-backend.package-rest-lifecycleaccess-security.record-view-read-auditaccess-security.suggested-binding-loopaccess-security.agent-ceiling-set-assignment-refusalaccess-security.share-link-capability-tokensaccess-security.walled-environment-metadata-operator-onlyaccess-security.readonly-package-locks-studioWhy
The card's readings are from the v18.4.0 sweep's QA records (the #32908 ledger names each one) and were not driven live. The source on main confirms each, with three places where main had moved past the record:
member_defaultgrants every internal member read onsys_approval_request, and the request read gate narrows the rows (default-permission-sets.ts,request-read-gate.ts), so the stock non-participant member drives the 404 leg itself. The runtime grant recipe moved to the reader leg's scratch object, where it is still needed.merchantandamount(plus the report) are required;categoryis optional andstatusdefaults tosubmitted. The step names the source fields, and the record's 400 for statuspending(not an option).Tests
No test added or changed: the diff is checklist text. Nothing to ablate (os-dev.md: docs are not ablated).
Acceptance notes
approvals.status-mirror-fieldnegative[2]: the flow fires on the sweep's user-less mirror by design, and since The #1888 user-less fail-open is wider than the lint that guards it — record-change flows fired by a system write run UNSCOPED, unlinted #3760 its data operations are refused, so the FAIL is the data operation landing, as the QA record suggested.approvals.ooo-delegation-reroutenegative[3]: a stock demo persona forging a delegation is refused 403PERMISSION_DENIEDat the object gate before the delegation guard's 403FORBIDDEN; both are the refusal the entry asks for, and an accepted foreign-delegator write is still the FAIL.approvals.record-page-decisionsacceptance[2]'s clause now names the action door the bar posts, which forwards to the approvals route. What it requires is unchanged.api-backend.error-envelope-ledgerINVALID_FILTER face is out of scope, as the order says, and is not touched.skip-changeset:docs/qa/**ships in no package.claude/project-thread-v8xylofromorigin/mainafter qa(checklist): name the persona and status of three approvals refusals a non-reader gets as 404 #33327 merged. A force-push is reserved forclaude/issue-*branches (AGENTS.md section 3), soorigin/mainwas merged into the branch instead; the diff againstorigin/mainwas empty before the edit commit.Verification
On head
b4df2eaa(branchclaude/project-thread-v8xylo, merge baseorigin/mainfca5f89c), 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-expressionsneeds@objectstack/lintbuilt in a fresh worktree; built first withpnpm --filter "@objectstack/lint..." build(exit 0).dispatch-gates --ran: "16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED", exit 0.--tier: no path-derived mandate; 451 changed lines, under the 3000 human-merge threshold.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