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