Repository navigation
test(dogfood): pin access-security checklist clauses at the oracle's layer, slice 3 - #26905
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>
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): |
Contributor
Author
维护者速读
席位核对ACCEPT ·
Generated by Claude Code |
This was referenced Oct 27, 2026
This was referenced Oct 27, 2026
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 Warren · project thread
Refs #26571 (slice 3 of 4, items: access-security.anonymous-floor-v18-doors, access-security.meta-authoring-trail-and-audience-gates, access-security.security-catalog-activation-and-clone-doors, access-security.security-catalog-one-holder-and-boot-report, access-security.grant-table-write-contract)
Clause-②: no
Metadata-protocol: none
维护者速读
automated.ref逐条款改写,另外按席位要求把第二批 3 个条目(以及本批 one-holder 条目)的automated.kind从unit改成dogfood;每个条目revision加一、history记本卡。meta-view-audience-alternate-doors.dogfood.test.ts(受限视图在 /published、/layers、?state=draft、/history 各入口的拒绝,以及 ETag 回放不得 304);②security-catalog-one-holder-http.dogfood.test.ts(install-local 重名拒绝与启动日志 50 条上限);③access-security.json的 kind 改动。cd packages/qa/dogfood && pnpm exec vitest run test/meta-view-audience-alternate-doors.dogfood.test.ts(需先按 dogfood 惯例 build 依赖闭包),预期Tests 8 passed。What changes
Each clause is pinned at the layer its oracle names.
apiis the in-process HTTP stack of@objectstack/verify, andlogis the process output captured across a boot. All changes are inpackages/qa/dogfood/**, with no product code changes. Every new assertion was written against today's behaviour and is green.anonymous-floor-v18-doors(isolated). Each of steps[0]'s six doors answers an anonymous caller 401 withUNAUTHENTICATEDorAUTH_REQUIRED. The admin's same GET is served 200 on every door except/keys, which serves POST alone and answers the admin's GET 405. A bogus share-link token gets a 4xx that is not 401. An anonymous form submit that forgesowner_idandstatusanswers 201 with exactly{ id }, and neither forged value is stored.showcase-anonymous-deny-surfacesgains the admin leg of the retired/docscomparison, which is read-only and stays in the shared projectmeta-view-audience-alternate-doors(isolated). The admin saves a scratch list view gated onmanage_users, plus a draft. Asetup.access-only member does not see it inGET /meta/viewand gets 403PERMISSION_DENIEDon the plain read,/published,/layersand?state=draft. On/historythat member gets 403FORBIDDENfirst, while astudio.accessmember gets the audience refusalPERMISSION_DENIED. The admin reads every door. When the member replays the admin's ETag, the answer is 403, never 304, beside the control that the admin's own replay is a 304catalog-activation-door: switching offeveryoneorguestis refused 400 naming the anchor, and no row is written.permission-set-clone-door: the source's own name is 409RESOURCE_CONFLICT. A closed body (a key missing, or an extra key) is 400VALIDATION_FAILEDand nothing is saved. An anonymous caller is 401security-catalog-one-holder-http(isolated).POST /marketplace/install-localwith an inline manifest redeclaringshowcase_auditoranswers 422PLUGIN_REGISTER_FAILED, naming the set andcom.example.showcase, andGET /packagesis unchanged. A permission-set save whose bodypackageIdnames another package answers 400VALIDATION_ERRORatpackageId. The boot log, captured across two boots of one database file: the clean boot logs one INFO line; after 51 grants naming no catalog set are planted, the next boot logs one ERROR line with the grant ids capped at 50 (more: 1)grant-table-write-contract(isolated), overPOST /data/sys_user_permission_set.permission_set_idgets 400INVALID_FIELD. A duplicate grant gets 409UNIQUE_VIOLATION. A grant naming someone else asgranted_bystores the admin.permission-set-assignment-windowgains the authored message, the absence of theunevaluableconstraint, and the valid-window 201 controlLedger:
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. Each getsrevision+1 and a history row; their refs are unchanged.dogfoodtoo, because its rewritten ref now leads with the dogfood pins. The order named only the three slice-2 items, so this one is a deviation, listed below.Clauses left as they are, each with its reason in the item's
automated.ref:testoracle).buildoracle accepts.Tests
Head
abf45d31, before the final no-overlap merge of main, ran the eight touched files underos-verify-lock:Test Files 8 passed (8),Tests 127 passed (127)(VERDICT command-exit 0).pnpm --filter @objectstack/dogfood typecheck: exit 0. The merge that followed brought in onlyplugin-auth's set-manager change, other area ledgers and unrelated dogfood files. The full dogfood battery is CI's.Acceptance notes
GET /api/v1/keysanswers the admin 405METHOD_NOT_ALLOWED, because the dispatcher registers every verb on/keys(runtime(dispatcher): anonymous GET / PUT / PATCH / DELETE on /api/v1/keys answer 405 METHOD_NOT_ALLOWED instead of the 401 UNAUTHENTICATED the v18 anonymous floor states for every /keys verb — only POST is mounted #23909) and the domain serves POST alone. The admin control there is therefore omitted, and the anonymous 401 is the floor's by the same argument the item's knownGaps makes.title. Anamecolumn is refused at author time (list-view-field-unknown), becauseshowcase_taskhas nonamefield.com.example.qa-one-holder, because install-local refuses an underscore in a package id with 400PLUGIN_MANIFEST_INVALIDbefore registration.Verification
Local gate subset on head
6f533694(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