Repository navigation
test(dogfood): pin the last access-security checklist clauses at the oracle's layer, slice 4 - #26941
Merged
Merged
Conversation
Claude-Session: https://claude.ai/code/session_01JQwxbWKBLcQCG7FBS17aMA Co-authored-by: Claude <noreply@anthropic.com>
…s layer (#26571) Items: rls-both-sides, write-path-guards, crud-permission-matrix, owd-sharing-matrix, fls-mask-and-strip. Each item's automated.ref names the new cases, revision bumped, history row cites the card. Claude-Session: https://claude.ai/code/session_01JQwxbWKBLcQCG7FBS17aMA Co-authored-by: Claude <noreply@anthropic.com>
…layer, slice 2 Slice 2 covers anonymous-deny-surfaces, public-form-withdrawal-layers, activation-write-operator-gate, platform-owner-email-anchor and record-view-read-audit: two pins extended, three new isolated pins, and each item's automated.ref, revision and history updated. No product code changes. Claude-Session: https://claude.ai/code/session_01JQwxbWKBLcQCG7FBS17aMA Co-authored-by: Claude <noreply@anthropic.com>
…layer, slice 3 Slice 3 covers anonymous-floor-v18-doors, meta-authoring-trail-and-audience-gates, security-catalog-activation-and-clone-doors, security-catalog-one-holder-and-boot-report and grant-table-write-contract: four pins extended, four new isolated pins, each item's automated.ref, revision and history updated, and automated.kind set to dogfood where the ref now leads with a dogfood pin. No product code changes. Claude-Session: https://claude.ai/code/session_01JQwxbWKBLcQCG7FBS17aMA Co-authored-by: Claude <noreply@anthropic.com>
…oracle's layer, slice 4 Three new isolated showcase pins drive the clauses the 18.2.0 sweep scored PARTIAL over in-process HTTP: - parent-and-organization-write-guards: the walled organization-emptying PATCH (403 PERMISSION_DENIED, empty-org inserts stamped) on a posture-only boot, and unreadable/nonexistent master parity on a plain master_detail detail and on the controlled_by_parent invoice line; - deployment-tables-platform-only: org admin 403 and platform admin 200 on the seven deployment-level tables, and 400 INVALID_FIELD on an organization_id filter; - share-link-combined-gates: anonymous byte-identical refusals across the password and email variants, and the resolve/messages pairing. The ledger items get the new refs, revisions and history rows, with kind moved to dogfood where the ref now leads with the dogfood pin. Claude-Session: https://claude.ai/code/session_01JQwxbWKBLcQCG7FBS17aMA Co-authored-by: Claude <noreply@anthropic.com>
Contributor
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
…s pin header Comment-only: the file pins 400 reference_not_found on showcase_task with the admin control, and the master-edit gate's identical 403 on the controlled_by_parent invoice line with the invoice owner's control. Claude-Session: https://claude.ai/code/session_01JQwxbWKBLcQCG7FBS17aMA Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
维护者速读
席位核对ACCEPT ·
|
This was referenced Oct 27, 2026
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 Warren · project thread
Fixes #26571 (slice 4 of 4, items: access-security.parent-and-organization-write-guards, access-security.deployment-tables-platform-only, access-security.share-link-combined-gates)
Clause-②: no
Metadata-protocol: none
维护者速读
automated.ref逐条款改写,其中 deployment-tables-platform-only 和 share-link-combined-gates 的automated.kind改为dogfood;每个条目revision加一、history记本卡。本片之后 qa(checklist): access-security — pin the Tier 1 clauses the 18.2.0 sweep scored partial at the layer their oracle names (18 items) #26571 无剩余条目。parent-and-organization-write-guards.dogfood.test.ts(posture-only 隔离启动下清空 organization_id 被 403,以及不可读与不存在表头返回相同 400);②share-link-combined-gates.dogfood.test.ts(匿名各变体字节级相同的拒绝体,/resolve 与 /messages 配对);③ Acceptance notes 里关于 controlled_by_parent 明细返回 403 而非 400 的说明。cd packages/qa/dogfood && pnpm exec vitest run test/parent-and-organization-write-guards.dogfood.test.ts(需先按 dogfood 惯例 build 依赖闭包),预期Tests 6 passed。What changes
Each clause is pinned at the layer its oracle names:
apiis the in-process HTTP stack of@objectstack/verify. All changes are inpackages/qa/dogfood/**plus the area ledger, with no product code changes. Every new assertion was written against today's behaviour and is green. All three files boot their own showcase (isolated), since each writes records, mints links or creates an organization.parent-and-organization-write-guards. acceptance[1]: amultiTenant: 'posture-only'boot (the tenancy service reportsisolated, the wall active and not degraded, asserted). An organization owner who is not the platform administrator PATCHes their ownshowcase_private_notewithorganization_id: nulland gets 403PERMISSION_DENIED; the row keeps its organization, and the same caller's PATCH that leaves the column alone is admitted. Inserts sendingorganization_idnulland''are stamped with the caller's active organization. acceptance[2] / negative[0]: a member holding a scratch set that writesshowcase_taskand whose row policy selects noshowcase_projectPOSTs a task naming a seeded project it cannot read (asserted) and one naming a project id that exists nowhere. Both answer 400 withreference_not_found, and the bodies are equal field by field once the named id is normalised. Nothing lands, and the admin's identical POST lands. The same parity is measured on thecontrolled_by_parentinvoice line, as described in the Acceptance notesdeployment-tables-platform-only. A Default Organization member'ssys_memberrole is promoted toadmin. A guard asserts it resolves anorganization_adminset, holds nomanage_platform_settings, and is not the platform administrator. On each of the seven tables (sys_job,sys_job_queue,sys_job_run,sys_migration,sys_migration_journal,sys_flow_dispatch,sys_presence),GET /api/v1/data/TABLEis 403PERMISSION_DENIEDfor the org admin and 200 for the platform administrator. The platform administrator's URL-encodedorganization_idfilter is 400INVALID_FIELDon eachshare-link-combined-gates. The admin mints two links throughPOST /api/v1/share-linkson the seeded published client brief. Link A (signed_in+ password), resolved anonymously with no password, a wrong one and the right one (UTF-8 header form), answers 401SIGN_IN_REQUIREDwith three byte-identical bodies. Link B (email+ password) answers 404INVALID_OR_EXPIREDto five non-entitled variants, byte-identical with an unknown token's body; the allowlisted email with the right password resolves 200. The same eight calls are paired with/messages: 404NOT_FOUNDwherever/resolverefused, and 400UNSUPPORTEDon the one call it passedLedger:
automated.refthat maps clauses to cases,revision+1, and ahistoryrow citing qa(checklist): access-security — pin the Tier 1 clauses the 18.2.0 sweep scored partial at the layer their oracle names (18 items) #26571.automated.kindunittodogfood, and share-link-combined-gates moves fromconformancetodogfood, since each ref now leads with the dogfood pin. parent-and-organization-write-guards was alreadydogfood.Clauses left as they are, each with its reason in the item's
automated.ref:testoracle).cbp-parent-attachment-comment-gatesandcbp-explain-master-write.No clause is left as a live leg.
Tests
On head
bc2b4dce(origin/main merged), with the closure rebuilt, the three new files ran underos-verify-lock:Test Files 3 passed (3),Tests 25 passed (25)(VERDICT command-exit 0). That is 15 in deployment-tables-platform-only, 4 in share-link-combined-gates and 6 in parent-and-organization-write-guards.pnpm --filter @objectstack/dogfood typecheck: exit 0. The final merge of main, right before this PR, brought crud-permission-matrix's ledger row (#26923, no overlap with these three items), app-shell fixes, docs, and two runtime/metadata-protocol refusals that none of these doors read. The full dogfood battery is CI's.Acceptance notes
controlled_by_parentline (showcase_invoice_line), a stock contributor naming another contributor's invoice and one naming a missing invoice both get the ADR-0055 §3 master-edit gate's 403PERMISSION_DENIED. That gate runs before the reference check. The two bodies are byte-identical, so negative[0] holds there, and the file pins that. The 400reference_not_foundcomparison is pinned onshowcase_task, a plainmaster_detaildetail ofshowcase_project. That matchesengine-unreadable-master-detail-header.test.ts, whose controls keep acontrolled_by_parentdetail unchanged. If the item's clause is meant to require 400 on thecontrolled_by_parentfixture too, that is a clause question for the seat, not a pin gap.showcase_projectwith a row policy that selects nothing, and a guard asserts the member's by-id read is refused.os serveboot are unchanged. They describe the live run's fixture. The pin uses the in-processposture-onlywalled boot thatno-active-organization-write-refusalandwall-catalog-refusalalready use.Verification
Local gate subset on head
bc2b4dce(origin/main merged):node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderives 55 families. All 55 ran and exited 0, and--ranreconciles55 derived famil(ies) accounted for — 55 run, 0 NOT-MEASURED. Repository-wide scans (pnpm lint, the full dogfood battery) are CI's.node scripts/check-platform-checklist.mjs:check-platform-checklist: OK — 16 areas, 329 items (324 active, 1 planned).Changeset: none.
@objectstack/dogfoodis private anddocs/qa/**ships in no package, so this PR carriesskip-changeset.Template note:
.github/PULL_REQUEST_TEMPLATE.md'sWhysection is folded into 维护者速读 and What changes. Its Human Minimum items: 1 n/a (no spec); 2 yes; 3 no formatter ran, andpnpm lintis left to CI; 4 yes; 5 n/a (publishes nothing); 6 n/a; 7 yes; 8 yes.Generated by Claude Code