Repository navigation
test(dogfood): pin access-security checklist clauses at the api oracle's layer, slice 1 - #26797
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>
📓 Docs Drift Check1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them, so this run has nothing to list — not a clean bill of health. This check sees only pages that NAME a derived anchor: one that documents this change in prose, or enumerates it in an authoring dialect, names none and stays invisible to it on every run. What this run could not see
Coarse fallback — 2 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 227eab16f199ea47de6f7682c7b41bda399d9f02 && git checkout 227eab16f199ea47de6f7682c7b41bda399d9f02
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 665059b6056c4caf54e631d678203d8c9dc4aba3 fd634911182e3356a394d7859d8ce95b72e44e81 && git checkout -B drift-repro 665059b6056c4caf54e631d678203d8c9dc4aba3 && git merge --no-ff fd634911182e3356a394d7859d8ce95b72e44e81
node scripts/docs-audit/affected-docs.mjs --json 665059b6056c4caf54e631d678203d8c9dc4aba3 |
维护者速读
席位核对ACCEPT ·
Generated by Claude Code |
Requested by Warren · project thread
Refs #26571 (slice 1 of about 4, items: access-security.rls-both-sides, access-security.write-path-guards, access-security.crud-permission-matrix, access-security.owd-sharing-matrix, access-security.fls-mask-and-strip)
Clause-②: no
Metadata-protocol: none
维护者速读
automated.ref改写成逐条款对应、revision加一、history记本卡。showcase-crud-persona-matrix.dogfood.test.ts新增的 delegate × sys_* 16 格用例(含 sys_user 的 405);②showcase-readonly-when-parent.dogfood.test.ts的 updateMany 逐行用例;③access-security.json里 crud-permission-matrix 的新automated.ref。cd packages/qa/dogfood && pnpm exec vitest run test/showcase-crud-persona-matrix.dogfood.test.ts(需先按 dogfood 惯例 build 依赖闭包),预期Tests 49 passed。What changes
Pins at the layer each clause's oracle names (
api: the in-process HTTP stack of@objectstack/verify), inpackages/qa/dogfood/**only. No product code changes. Every new assertion was written against today's behaviour and is green.showcase-private-owd: the admin re-reads the foreign note after the refused PATCH (whole record equal), and the admin's filtered list carries every note the file createdshowcase-static-readonly: INSERT strip advertised in bodydroppedFieldsand theX-ObjectStack-Dropped-Fieldsheader.owner-anchor-and-bulk-writes: member RESTcreateManystamps the caller on all three rows; the admin's forge-insert and disown pass.showcase-readonly-when-parent: the paid line'sproductis held; a mixedupdateManyreportsresults[i].droppedFields(readonly_when) on the locked row only, and the open row lands;updateManywithcontinueOnError: truefails the row belowmin: 0alone (VALIDATION_FAILED, unchanged) and applies both neighbours, with the default stop shape (tailNOT_ATTEMPTED) pinned beside itshowcase-crud-persona-matrix: the auditor's viewAllRecords over a foreign inquiry, invoice and line (by id and filtered list) against a contributor who holds read without the bit; the first denied cell of every set re-run as the admin answers 2xx; and the 16showcase_field_ops_delegate×sys_*cells driven by a member holding exactly that set, withsys_usercreate and delete scored 405OBJECT_API_METHOD_NOT_ALLOWEDfor the delegate and the adminshowcase-private-owd/showcase-public-read-owd: non-2xx by-id read, PATCH at least 400, admin re-read unchanged. Newshowcase-invoice-line-contributor-pair(shared-showcase project): two stockshowcase_contributormembers C1/C2 and a stockshowcase_auditor; C2's filtered list excludes C1's line while C1's identical list carries it, C2's by-id read and PATCH are refused with the row unchanged, C1 reads and edits it, the auditor lists and reads itshowcase-permission-zoo: the contributor's name edit re-reads changed; the admin's budget write on a seeded project lands and re-reads changed (raised, then put back)Ledger: each of the five items gets a rewritten
automated.refthat maps clauses to cases,revision+1, and ahistoryrow citing #26571. The owd-sharing-matrix ref also names two existingshowcase-crud-persona-matrixcases that already pinned its acceptance[2] (modifyAllRecords) and acceptance[3] (showcase_contributor/showcase_member_default×showcase_projectedit cells), which revision 5 recorded as unpinned.vitest.config.ts: the new file joinsSHARED_SHOWCASE. It meets that list's three eligibility rules: plain showcase boot, onlysys_user_permission_setrows for its own sign-ups, and every list filtered to its own row.Clauses left as they are, each with its reason in the item's
automated.ref:blocked(fixture)per knownGaps[2] (the guest anchor intake is not observable on a member persona).dom/ browser oracle. The dogfood suite drives no browser and the ruling adds no CI lane, so they stay a run's browser leg.Tests
Head
fd634911, the eight touched files, underos-verify-lock:Test Files 8 passed (8),Tests 103 passed (103)(VERDICT command-exit 0).pnpm --filter @objectstack/dogfood typecheck: exit 0. The full dogfood battery is CI's (no!in the title, no narrowing arm).Acceptance notes
acceptance[6].verifyandsteps[6]still describe the 16 delegate cells as hand-driven, and the same file's header comment said "6 delegate rows" (now corrected to 4 in the test header). The two item-text fields sit outside this slice's claimed edit surface (automated.ref,revision,history); the history row says so.fd634911: the delegate's 16 cells answer exactly the matrix, unioned with nothing —sys_business_unit,sys_business_unit_memberandsys_userread 200, every withheld verb 403PERMISSION_DENIED,sys_usercreate and delete 405,sys_user_positioncreate 201 and read/edit/delete 200 on the delegate's own in-subtree row.Verification
Local gate subset on head
fd634911(origin/main merged, including #26337):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'sWhyis folded into 维护者速读 andWhat changes; its Human Minimum items hold as follows: 1 n/a (no spec), 2 yes, 3 no formatter ran,pnpm lintleft to CI, 4 yes, 5 n/a (publishes nothing), 6 n/a, 7 yes, 8 yes.Generated by Claude Code