Repository navigation
qa(checklist): access-security — 65 ledger edits from the 18.2.0 release sweep (#25807) #25835
Description
Filing gate: maintainer-directed task. Filed by the 18.2.0 release-assessment thread · session_01G3h9iZTpL8aCiXbfsp8H5u. ⛔ Not a claim, ⛔ not dispatched.
Maintainer's words (project thread, 2026-10-25, verbatim): 22:54Z 「约 300 条清单准确性问题:是不是应该开卡?」, then 22:55Z 「写issue,不派发」.
Parent: wave anchor #25807 (18.2.0 release test sweep). RUNNER's extraction obligation parks checklist-accuracy findings on the anchor; the maintainer asked for them as issues, so the wave's findings are split into one card per ledger file and the anchor links each card. This is not a release blocker, so it carries no target:v18.
Reader who acts: the lane owning docs/qa/platform-checklist/** (domain:devx). Dedupe (open and closed): no card holds these lines; the 18.0 precedent closed its accuracy rows on its anchor #24579.
Wanted
For each line below, edit docs/qa/platform-checklist/areas/access-security.json: revise the item's text, bump its revision, and append a history entry citing the run record the line comes from. Keep pnpm check:platform-checklist green. A line that turns out to describe a product defect rather than stale text gets its own card instead of a ledger edit.
Findings (65)
From #25812 — priority:P0, 23 items, at 6679644a, pin b41ed7f68956
access-security.crud-permission-matrixknownGaps[1]: a plain member reads the whole orgsys_userdirectory, not a self-scoped row (sys_account/sys_sessionare the self-scoped ones); the pin header says 6 delegate × sys_* rows, the matrix has 4.access-security.walled-environment-metadata-operator-only: steps name showcase objects while the wall-* dogfood pins boot the CRM app — worth stating in the item.
From #25815 — release-18.2.0-tier1, 156 items, at 6679644a, pin b41ed7f68956 (clause labels: aK = acceptance[K], nK = negative[K])
access-security.activation-write-operator-gatea0/n2: ref claims the 'full posture x identity matrix' but automation-activation-posture-gate.test.ts has no caller-without-manage_metadata case; FLOW_ENABLEMENT_DENY_MESSAGE is asserted by no test in the repoaccess-security.activation-write-operator-gatea1: action-activation-posture-gate.test.ts › REFUSES a caller withoutmanage_metadata, in every posture asserts only toContain('manage_metadata') at the unit layer — not the 'functionally equivalent to deleting it' rationale nor 'a packaged action' subject, and it runs onlysingleaccess-security.activation-write-operator-gatea3: packages/qa/dogfood/test/packaged-activation-ledger-reach.dogfood.test.ts (not in ref) asserts one deployment-level row with no tenant column over HTTP, but as the dev admin, not a manage_metadata-without-platform_admin personaaccess-security.activation-write-operator-gatea5: boot-log restart re-hydration corroboration is not covered by any pin (test half only)access-security.anonymous-deny-surfacesa4: pin's /meta member contrast is .not.toBe(401), clause demands 200access-security.anonymous-deny-surfacesa5: ref lists seven families but not the public-forms both-sides contrast; no pin covers itaccess-security.anonymous-deny-surfacesn0: ref does not cover the post-DELETE authed GET /automation/showcase_reassign_wizard 200 read-backaccess-security.anonymous-floor-v18-doorsa1: the sweep's EVERYTHING_ELSE expectation checks status 401 + an error envelope, never error.code; UNAUTHENTICATED is asserted only in the unit pins (i18n, settings, api-description), none for /notifications, /keys, /share-linksaccess-security.anonymous-floor-v18-doorsa3: DOOR_CLASSES[1] (share-link token face) uses REFUSED_WITHOUT_A_SUBJECT, which accepts 401 — the clause's 'not 401' is not asserted by any pinaccess-security.anonymous-floor-v18-doorsa2: rest-docs-viewer-retired.pin asserts no registration on RestServer/route manager; no pin compares GET /api/v1/docs to the never-served control path, anonymous and adminaccess-security.anonymous-floor-v18-doorsa4: the dogfood submit asserts 2xx and keys ['id'] on the showcase (step 4's forged owner_id/status not sent); exact 201 is asserted only by the Hono-transport pin over a protocol doubleaccess-security.crud-permission-matrixref:packages/verify/src/verify.ts/rls.ts(objectstack verify --rls) are a CLI proof, not test files — no pin here drives them; the object-level RLS half is unscored by the dogfood pins.access-security.crud-permission-matrixa3: ref says the pin reaches clause 3; it probes only showcase_private_note (inquiry/invoice/invoice_line VAMA reads not asserted).access-security.crud-permission-matrixa6: verify text says '45 rows × 4 verbs at revision 6'; the pin judges 41 rows (164 cells) and explicitly excludes the 4 sys_* rows, so clause 6 cannot be pinned whole.access-security.crud-permission-matrixref says 'showcase-permission-zoo pins on both sides' the delegate subtree gate: its out-of-subtree case asserts only non-2xx, not 403 PERMISSION_DENIED as the ref states.access-security.crud-permission-matrixref header comment in the pin says '6 showcase_field_ops_delegate × sys_* rows'; the ref and the pin's own assertion say 4 (2 retired).access-security.deployment-tables-platform-onlya0: packages/plugins/plugin-security/src/authz-identity-objects-boot-refusal.test.ts asserts SecurityPlugin's boot refusal when sys_user/sys_member/sys_organization are missing — nothing about the seven deployment tables or manage_platform_settingsaccess-security.deployment-tables-platform-onlya1/a2: no pin drives either door over HTTP; both remain live-run clausesaccess-security.fls-mask-and-stripa2: admin-side budget write (both sides of the lock) is asserted by neither pin, and the ref's STILL MANUAL list does not name itaccess-security.fls-mask-and-stripa0: zoo FLS case asserts the name PATCH status only; the clause's 're-reads changed' leg is unpinnedaccess-security.grant-table-write-contracta1/a3/a4: api-oracle clauses are pinned only at the engine layer (real ObjectQL + SqlDriver, errors mapped by resolveThrownHttpError); no pin in the ref drives the /data door over HTTP for themaccess-security.grant-table-write-contracta2: permission-set-assignment-window.dogfood.test.ts › 'the door refuses a window whose end is not after its start…' asserts [400, VALIDATION_FAILED] and fields [[valid_until, rule_violation]] only; the authored message, constraint absent/not 'unevaluable' and the valid-window 201 control are not asserted over HTTPaccess-security.me-permissions-aggregation-paritya2: me-apps-and-everyone-baseline pin asserts only the member side (no gated app); the admin-sees-gated-app half is unpinned.access-security.me-permissions-aggregation-paritya3: the anonymous trio's 200 shapes are pinned only in hono-current-user-endpoints.test.ts on a bare HonoServerPlugin with no auth service or auth gate — the 401-floor regression the clause guards is not reachable there; the dogfood anonymous /me/apps case asserts body.apps ?? [] only, never the status.access-security.me-permissions-aggregation-paritya5: packages/plugins/plugin-hono-server/src/current-user-endpoints-localization.test.ts asserts the locale/timezone floors (unit) and is not in the ref.access-security.meta-authoring-trail-and-audience-gatesa2: meta-view-dashboard-audience-gate.test.ts drives RestServer with a mock server/protocol (unit) and covers list pruning + by-name refusal only — no /published, /layers or ?state=draft door, and no /history case for a studio.access holder lacking the view's requiredPermissionsaccess-security.meta-authoring-trail-and-audience-gatesn0: the 304 assertion ('a caller who no longer holds the capability is never answered a 304…') exists only at the unit layeraccess-security.no-active-org-session-semanticsref prose is stale: it describes a group CONTROL 'a NON-EMPTY membership set lands, even with no active organization'; on this tree that case is 'a NON-EMPTY membership set with NO active organization: an insert has nowhere to land, and is refused the same way' (asserts refusal)access-security.no-active-org-session-semanticsa1/a2/n1: packages/qa/dogfood/test/no-active-organization-write-refusal.dogfood.test.ts (HTTP 403 naming the missing org + nothing written) exists and is not in the refaccess-security.no-active-org-session-semanticsa3/n0: packages/qa/dogfood/test/sharing-rule-org-less-caller.dogfood.test.ts (plugin-sharing: amanage_sharingholder whose session has no ACTIVE organization reads every tenant's sharing rules (adminOrgScope falls open) #8158 org-scoped manage_sharing holder over HTTP) exists and is not in the refaccess-security.no-active-org-session-semanticsa7 (group, engine layer): packages/plugins/plugin-security/src/no-active-organization-insert-union-scope.test.ts (real ObjectQL + SqlDriver, group refusal and nothing stored) exists and is not in the ref; still in-process, not the live walled boot a7 requiresaccess-security.no-active-org-session-semanticsref says the pin 'pins every clause of this item at unit level' — a3, a4, a5, a6 have no case in it at any levelaccess-security.org-admin-assignment-boundaryn2: the three-posture posture file only exercises admin_full_access out-of-boundary; the full set list (adminScope, platform-capability, org-admin sets, mcp agent ceilings) is asserted only by the unit gate in delegated-admin-gate.test.ts, not per postureaccess-security.owd-sharing-matrixa0: verify's admin re-read of the denied PATCH is not asserted by showcase-private-owd (status only); clause text otherwise pinned; by-id GET asserted as not-200 rather than non-2xxaccess-security.owd-sharing-matrixa2/a3/a5: ref implies all four OWD models pinned, but no pin covers modifyAllRecords bypass, public_read_write, or auditor VAMAaccess-security.owd-sharing-matrixa4: showcase-invoice-cbp boots a test-local fallback set (showcase_cbp_member), not the showcase C1/C2 personas, and asserts no list exclusion; controlled-by-parent.dogfood.test.ts uses a synthetic cbp_account/cbp_note fixture, not showcase_invoice_lineaccess-security.parent-and-organization-write-guardsa1/a2/n0: the walled organization-removal refusal and the unreadable-header parity are pinned only in-process (engine + SecurityPlugin over SQL drivers, thrown statusCode / resolveThrownHttpError) — the api-oracle legs have no HTTP pin; precedent QA run · tier1:24681-touched (63/82) · 307ce4c4 · 2026-10-20 · 10 PASS / 53 PARTIAL / 0 FAIL / 0 BLOCKED / 19 NOT-RUN #24840 scored them PASS (rev 4) before the layer rule.access-security.platform-owner-email-anchorn0: admin-standing-surface.test.ts never asserts ADMIN_STANDING_NON_TABLE_INPUTS (the OS_PLATFORM_OWNER_EMAIL non-table declaration n0 cites); the declaration is unpinnedaccess-security.platform-owner-email-anchora0-a3: ref correctly records these as STILL MANUAL live-HTTP arms; unit pins do not score themaccess-security.public-form-withdrawal-layersa0: ref concedes the no-organization read of step 4 has no end-to-end pin, so a0 cannot score from pins alone (the save 200 /env-wide/ and both doors 404 FORM_NOT_FOUND, landed 0, are pinned)access-security.public-form-withdrawal-layersa2-a5: the rest pin is a unit (RestServer over a mocked protocol), the protocol pin an in-process protocol over a stub registry; both fit the [test] oracleaccess-security.record-access-explaina1: ref 'explain vama_bypass case' asserts vama_bypass via in-process security.explain() (isSystem context), not the POST /api/v1/security/explain door the oracle namesaccess-security.record-access-explaina2/a3/n0: pin has no plain-member (deny-side) explain call; only the GET denial half is pinnedaccess-security.record-view-read-auditn0: the item says the ledger failure is 'reported once per process'; read-audit.test.ts '[finding] plugin-audit: a THIRD copy of both #15166 defects lives inread-audit.ts— process-wide boolean plus an unconditional datasource remedy #18247' cases pin once per CAUSE (a second distinct cause reports again at error) — item text is stale.access-security.record-view-read-audita4: verify cites sys_job as the excluded name; the pin probes sys_audit_log / sys_session, and no pin observes the AuditPlugin install line ('record-view auditing installed on N object(s)').access-security.rls-both-sidesa4: ref names packages/verify/src/rls.ts, a source file, not a test; no pin runs runRlsProofs over the showcase (rls-fixture/rls-multitenant dogfood run it on purpose-built fixtures only)access-security.rls-both-sidesa2/n0: the pin's foreign PATCH asserts only status >=300; the row-unchanged re-read the clause requires is pinned for a fixture object in packages/qa/dogfood/test/rls-fixture.dogfood.test.ts, not for showcase_private_noteaccess-security.security-catalog-activation-and-clone-doorsa2: the audience-anchor 400 (everyone/guest) is asserted only in packages/runtime/src/domains/catalog-activation-door.test.ts (handler with fakes); the dogfood pin drives the 404 arm onlyaccess-security.security-catalog-activation-and-clone-doorsa3: dogfood clone pin drives 200 + dropped keys, 409 (another set's name), 404, bad-name 400, 403; anonymous 401, the source's own name 409 and the closed-body 400 are unit-onlyaccess-security.security-catalog-one-holder-and-boot-reporta1: packages/cloud-connection/src/marketplace-install-local-catalog-name-collision.test.ts (not in ref) asserts 422 PLUGIN_REGISTER_FAILED + nothing registered on POST /marketplace/install-local (in-process plugin, stubbed cloud fetch) — the ref's pins only reach manifest.register / boot refusalaccess-security.security-catalog-one-holder-and-boot-reporta2: permission-set-owner-registration.test.ts proves VALIDATION_ERROR/400 at registerApp, not on a permission-set save door; no HTTP pin for the saveaccess-security.security-catalog-one-holder-and-boot-reporta3: CLI is run via MigrateSecurityCatalogOverlays.run in-process (oclif), not a spawned process — acceptable for the build oracleaccess-security.security-catalog-one-holder-and-boot-reporta4: catalog-reference-report.test.ts asserts the [security] error/info lines on a vi.fn logger; the ≤50-names cap is not visibly assertedaccess-security.share-link-combined-gatesa1/a2: packages/runtime/src/domains/share-links-refusal-order.test.ts asserts the anonymous no-password-oracle and email-audience identical-refusal rows but is not in the ref (in-process layer, would not score the api clause either)access-security.share-link-combined-gatesa3: ref names share-links-messages-audience.test.ts for acceptance[3]; its harness is in-process route entries (no Hono/HTTP), so it scores a0 only, not the api oracleaccess-security.walled-environment-metadata-operator-onlya2: single-posture leg is pinned as a manage_metadata holder below the operator (stronger than 'admin'); no case drives the seeded admin specifically on singleaccess-security.write-path-guardsa4/a6: ref names owner-anchor-and-bulk-writes for bulk writes, but its bulk cases are engine-direct ql.update/ql.delete owner scoping — no createMany stamping, no per-row validationaccess-security.write-path-guardsa5: showcase-readonly-when-parent asserts single-row PATCH strips + header X-ObjectStack-Dropped-Fields; the mixed updateMany results[i].droppedFields leg and the line's product field are unpinnedaccess-security.write-path-guardsa0: showcase-static-readonly asserts no droppedFields on the INSERT strip (verify names droppedFields)access-security.write-path-guardsn1: objectql pins use a recording/fake driver (real engine) and other objects, not showcase lead_score
From #25817 — release-18.2.0-manual-set, 29 items, at 6679644a, pin b41ed7f68956
access-security.capability-declaration-lifecycle: step 8 expectscapabilities.0.scope, but the index is the entry's position (.2when appended).access-security.capability-declaration-lifecycle: The surface ismixed, yet no clause has a browser oracle.
From #25823 — addendum, identity-auth.admin-lifecycle-operations at 17f8217b, after #25626
access-security.no-active-org-session-semanticsrev 8: its member-less operator create-user producer is stale after feat(plugin-auth): multi-org Create User joins the administrator's current organization #25626 — the operator must create andset-activean organization first.
Acceptance
- Every line above is either applied (item revised,
revisionbumped,historycites the record) or answered on this card with the reason it was not. pnpm check:platform-checklistis green.- The PR links this card and [sweep] v18.2.0 release test sweep #25807.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop · 2026-10-26T11:32Z
Session:
session_01GgKuGD9Ats95jBbJRZrf4a(card thread, dispatched by seat sessionsession_01LKHDniRQSWjRJyDtacwpEd)Account:
os-elon-muskBranch:
claude/project-thread-sbnzcl(the harness-pinned branch for the card thread; it names no issue, so this claim is the identity record)Worktree:
objectstack-issue-25835Domain:
domain:devxSeat:
domain:devx#1(seat post #6023)File surface: docs/qa/platform-checklist/areas/access-security.json only (stop on breach; explain in the report)
Container & model:
M,mode:thread,model: default tier,effort: highClause-②: no
Metadata-protocol: none
Responsibility: Card #25835: 65 access-security ledger edits from the 18.2.0 sweep, plus retired-pin text in this area file
Thread-read: none
Serial constraints cleared: own area file only; #26035 slice 1 out of scope
Dispatched under the maintainer's 「同意」 to the director's ruling batch 1, item 5A (devx dispatches p1–p3). Dispatch order:
/mnt/project-files/pm-devx-seat/dispatch-25835.md.docs(qa): access-security ledger edits from the 18.2.0 sweep, part 2
objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 25835, "status": "done", "branch": "claude/project-thread-sbnzcl", "pr": "https://github.com/objectstack-ai/objectstack/pull/26101", "session": "session_01GgKuGD9Ats95jBbJRZrf4a", "premise_still_valid": true, "summary": "All 65 lines re-read on main b4199c96; 62 applied across 24 items of areas/access-security.json (revision bumped once per item, one history entry each citing #25812 / #25815 / #25817 / #25823), plus the retired-pin text in share-link-landing-page knownGaps[2] (history cites #26035). No status or clause assertion changed; the edits are almost all automated.ref now naming what each pin asserts, at which layer, and which legs stay live. Three lines are answered here instead of edited (answers below). Two lines held only in part and their history says so: activation a0/n2 (the FLOW_ENABLEMENT_DENY_MESSAGE sentence IS asserted by value in automation-toggle-deny-message.test.ts) and anonymous-floor a1 (UNAUTHENTICATED is asserted on other faces of /notifications, /keys, /share-links, not on the three GET faces). No line was a product defect; nothing filed.", "answered_not_edited": [ "crud-permission-matrix — the pin header's '6 showcase_field_ops_delegate x sys_* rows': the stale number is a comment in packages/qa/dogfood/test/showcase-crud-persona-matrix.dogfood.test.ts, outside this card's one-file surface; the ledger already says 4 and the pin's own assertion says 4.", "platform-owner-email-anchor a0-a3: the record confirms automated.ref already records these as STILL MANUAL live-HTTP arms the unit pins do not score; no edit owed.", "capability-declaration-lifecycle — surface 'mixed' with no browser oracle: not applied. In this ledger 'mixed' names an item driven on more than one execution surface, browser or not (31 other active mixed items carry no screenshot or dom oracle); this item is driven over the API and the build / CLI." ], "tests": "docs-only diff; no package touched, so no build closure or package tests owed. pnpm check:platform-checklist exit 0 on 9738ffad ('check-platform-checklist: OK — 16 areas, 329 items').", "gates": "node scripts/check-ci-filter-parity.mjs :: exit 0; node scripts/check-closing-keyword-parity.mjs :: exit 0; node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0; node scripts/check-comment-mask-corpus.mjs :: exit 0; pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0; pnpm check:cross-package-test-inputs :: exit 0; pnpm check:doc-authoring :: exit 0; pnpm check:driver-memory-census :: exit 0; pnpm check:gitlink-declared :: exit 0; pnpm check:nul-bytes :: exit 0; pnpm check:platform-checklist :: exit 0; pnpm check:refd-timer-probe :: exit 0; pnpm check:watch-hint-literal :: exit 0; check:doc-formula-expressions first exited 3 (prerequisite) and exits 0 after pnpm --filter '@objectstack/lint...' build (lock VERDICT command-exit 0); dispatch-gates --ran: 13 derived, 13 run, 0 NOT-MEASURED; check-governed-merges --test: NOT governed. CI check-runs: in_progress at report time.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "6 — reads only: issue_read x4 (#25835 get + comments, #24784, #25823), pull_request_read x1 (#26101), plus subscribe_pr_activity (harness subscription, not a GitHub write)", "api_writes": "3 — relay pr_create (POST /pulls, assignees, labels skip-changeset), this comment (POST /issues/25835/comments), pr_request_reviewers os-elon-musk on #26101", "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed — showcase-crud-persona-matrix.dogfood.test.ts header comment says 6 delegate x sys_* rows, its assertion says 4 (test-file text)", "carrier: the next walled group run of access-security.no-active-org-session-semantics · noted, not filed — knownGaps[4]/[5] still read #24784 as open; it closed 2026-10-20 (PR #24819), and their own text asks for a live re-run before the line drops", "carrier: #25850 and the identity-auth ledger card · noted, not filed — after #25626, identity-auth.workspace-org-switch personas[2] and RUNNER.md's 'Walled personas come from the admin door' membershipCreated:false sentence are stale (#25823); RUNNER's objectui-repo-only standing fact predates ui/ landing in this repo" ] }Generated by Claude Code