Repository navigation
docs(qa): 18.0 sweep anchor round 2 — expression-editors' RLS clauses to the engine's error tier, a consumed-changeset citation, and §3 accuracy corrections in five areas - #24632
Merged
objectstack-fleet[bot] merged 8 commits intoOct 19, 2026
Conversation
… measured as inaccurate Checklist-accuracy findings of QA run #24557 (platform-core, 5b14b7f), each re-derived from source at 8fbbd50: builtin-apps-nav-render, home-admin-cluster-links, notification-center, v18-boot-refusals, package-lifecycle-enable-disable, docs-audience-gate, runtime-config-boot-read, manifest-install-contract, marketplace-install-local-lifecycle, serve-composition-v18, url-overlay-contract, activation-ledger-row-contract. One revision and one history row per item; history refs are a placeholder until the PR exists. Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
…weep measured as inaccurate Checklist-accuracy findings of QA run #24559 (access-security, 5b14b7f) and round 2's #24601 (ba4afcc), each re-derived from source at 8fbbd50: sharing-rules-widen, record-share-grant-revoke, scope-depth-asymmetry, fls-mask-and-strip, record-access-explain, anonymous-floor-v18-doors, meta-authoring-trail-and-audience-gates, grant-table-write-contract, deployment-tables-platform-only, share-link-combined-gates, audit-log-browser, permission-matrix-edit-loop, capability-declaration-lifecycle. One revision and one history row per item. Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
…e's provenance from the 18.0 sweep Checklist-accuracy findings of QA run #24560 (attachments-storage, 5b14b7f), re-derived from source at 8fbbd50: orphan-tombstone-reap names the unit pin that covers two reap-guard variants; chunked-upload-integrity records that no pin drives a chunked door after an organization switch. The qa-media-constraints recipe's provenance records that the run replayed it live (recipes carry no revision or history of their own). Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
…measured as inaccurate Checklist-accuracy findings of QA run #24538 (identity-auth, 5b14b7f), each re-derived from source at 8fbbd50: invitation-scope-gates, api-key-ui-lifecycle, org-membership-team-management, self-service-password-reset, self-signup-gate, auth-gate-held-session-raw-host-families, default-organization-boot-invariant, self-service-profile-password. One revision and one history row per item. Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
…ed as inaccurate Checklist-accuracy findings of QA run #24542 (approvals, 5b14b7f), each re-derived from source at 8fbbd50: per-group-signoff, quorum-m-of-n, decision-action-matrix, account-app-entry, approver-resolution-matrix, request-page-reply-and-reader-visibility. email-action-token-door and act-door-and-admin-rescue-slate are left alone. One revision and one history row per item. Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
…ror tier, and fold a consumed changeset path into prose studio-authoring.expression-editors acceptance[2] and [4] encoded the editor's warning tier for a non-lowerable RLS read predicate; the engine refuses it at error tier (rls-predicate-unenforceable, ADR-0056 D4) and the item's own negative[0] fails any divergence. Run records: QA run #24604 (ba4afcc) and #24571 (5b14b7f). cli.organization-ownership-ceremony: the source path entry .changeset/pre/15212-180-guards-fresh-single-only.md dangles once 18.0.0 is versioned; it joins the item's prose list of consumed v18 changesets. A citation fold, so no revision. Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
…8-sweep-accuracy-round2
The history rows were committed with a placeholder ref because the pull request had no number before it was opened. This commit changes exactly those 42 strings and nothing else. Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
Seat reviewACCEPT ·
This seat readies the PR and queues it with auto-merge. Generated by Claude Code |
objectstack-fleet
Bot
deleted the
claude/issue-24579-v18-sweep-accuracy-round2
branch
October 19, 2026 19:29
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.
Refs #24579
Clause-②: no
Part of #24579: the wave anchor's second dispatch (round 1, #24622, landed §1's five rows). This PR lands three parts: (a) the §1 row round 2 added, (b) the rider from the #24622 review, and (c) §3's checklist-accuracy findings for platform-core, access-security, attachments-storage, identity-auth and approvals. The card stays open for §2, §4, the other areas' §3 bullets and round 2's other additions.
The diff edits checklist content only (
docs/qa/platform-checklist/areas/, seven files). No product code, test or pin changes. Every finding below was re-derived from source at the base8fbbd5082f(and, for console claims, objectui at the console pin4016370a) before the item was edited. A finding that did not hold is in the left-alone list with the reading that refuted it. Each edited item takes onerevisionbump and onehistoryrow that names its run record(s) and carries this PR asref. Several findings on one item make one revision.(a) §1 — the round-2 row
studio-authoring.expression-editorsacceptance[2].clause,acceptance[2].verify,acceptance[4].clause,acceptance[4].evidence,acceptance[4].verify,fixtures.knownGaps[3](added),steps[0],steps[4],variants[2]acceptance[2] and acceptance[4] required a non-pushdownable USING read filter to be an advisory WARNING with Save enabled and fail-open framing. The engine refuses that predicate at ERROR tier:
packages/lint/src/validate-rls-predicate-enforceability.tsemitsrls-predicate-unenforceablewith severityerror(ADR-0056 D4), the ruleos buildand publish run, and the runtime fails CLOSED (the dropped policy grants no access). negative[0] already fails any editor verdict that differs from the engine, so the item contradicted itself (#24604 scored acceptance[4] "pass (as written)" beside a negative[0] FAIL). Both clauses now expect the error tier. Four more fields ride the same re-point so the item stays consistent:validate_expressionhas no RLS site.celAuthoring.tslintCelPredicate). The clauses therefore FAIL until Studio RLS editor rates a non-lowerable USING predicate a WARNING ("can … WIDEN access") and autosaves it, while publish / os build refuse it as an error (rls-predicate-unenforceable, fail-closed) objectui#13061 lands.(b) the #24622 rider
cli.organization-ownership-ceremonysource: the path entry.changeset/pre/15212-180-guards-fresh-single-only.mdremoved,15212-180-guards-fresh-single-onlyappended to the prose entry "v18 changesets (.changeset/pre/, consumed into 18.0.0-next.*): …"The path entry dangles once 18.0.0 is versioned, because the version render consumes
.changeset/pre/*.md. Ledger rule, measured:check:platform-checklistrequires onlyrevisionequal to the lasthistoryrow's revision, and the README bumps "on any semantic edit", meaning one that would let an old run result read as valid against changed clauses. A citation fold changes no clause, step or fixture a run judges, and this item already took a revision today for #24622, so no revision and no history row. Counter-reading, for the record: the ledger has bumped for a source-only addition before (platform-core.boot-health, its "source-ref addition" row). If the seat reads the rule that way, the fix is a revision-3 row naming this PR. The item'sfixtures.knownGaps[0]prose also names.changeset/pre/15212-180-guards-fresh-single-only.mdin a sentence, and that mention was left as it is: the ruling names the source entry only.(c) §3 — five areas
Run records: platform-core #24557 (with round 2's #24603, whose accuracy section is empty); access-security #24559 (with #24601); attachments-storage #24560; identity-auth #24538; approvals #24542. Each area stays at or below 15 edited items: 12, 13, 2, 8 and 6.
platform-core
platform-core.builtin-apps-nav-rendersteps[2],steps[5]platform-core.package-lifecycle-enable-disablesteps[0]platform-core.notification-centeracceptance[0].verify,acceptance[5].clause,acceptance[5].verify,steps[0],steps[7]platform-core.docs-audience-gateacceptance[3].clause,acceptance[3].verify,fixtures.knownGaps[0]platform-core.manifest-install-contractfixtures.knownGaps[3],negative[2]platform-core.activation-ledger-row-contractacceptance[4].clause,acceptance[4].verify,fixtures.knownGaps[0],fixtures.requires[1],negative[5],steps[0],steps[2],title,variants[4](added)platform-core.marketplace-install-local-lifecyclefixtures.requires[0],personas[1],steps[3]platform-core.runtime-config-boot-readsteps[1]platform-core.url-overlay-contractacceptance[4].clause,acceptance[4].evidence,acceptance[4].verify,automated.ref,steps[5]platform-core.home-admin-cluster-linksacceptance[3].clause,acceptance[3].verifyplatform-core.v18-boot-refusalsacceptance[1].clause,acceptance[1].verify,acceptance[3].verify,steps[1]platform-core.serve-composition-v18fixtures.requires[1]access-security
access-security.record-access-explainsteps[1]access-security.fls-mask-and-stripsteps[5]access-security.scope-depth-asymmetryautomated.ref,steps[0]access-security.sharing-rules-widenacceptance[4].clause,acceptance[4].evidence,acceptance[4].verify,steps[6]access-security.record-share-grant-revokeacceptance[6].clause,acceptance[6].evidence,acceptance[6].verifyaccess-security.audit-log-browseracceptance[5].verify,steps[7]access-security.permission-matrix-edit-loopsteps[0],steps[1],steps[3]access-security.capability-declaration-lifecycleacceptance[1].verify,steps[7]access-security.anonymous-floor-v18-doorsfixtures.knownGaps[1]access-security.meta-authoring-trail-and-audience-gatesacceptance[2].clause,acceptance[2].verify,steps[1]access-security.grant-table-write-contractacceptance[2].clause,acceptance[2].verifyaccess-security.deployment-tables-platform-onlyautomated.ref,steps[2]access-security.share-link-combined-gatesautomated.refattachments-storage
attachments-storage.orphan-tombstone-reapacceptance[0].verify,automated.refattachments-storage.chunked-upload-integrityacceptance[0].clause,fixtures.knownGaps(new, one entry)Area-level edit, no item: the
qa-media-constraintsrecipe'sprovenancesaid "not yet proven by a live run". QA run #24560 replayed it cleanly and scoredattachments-storage.field-accept-maxsize-server-enforcedon it, and the provenance now says so. Recipes carry norevisionorhistoryof their own (the validator's #10885 note), so this edit has no history row.identity-auth
identity-auth.invitation-scope-gatesautomated.ref,fixtures.requires[0],fixtures.requires[1]identity-auth.api-key-ui-lifecyclesource[2]identity-auth.self-service-profile-passwordfixtures.knownGaps[0],fixtures.requires[2],steps[7]identity-auth.org-membership-team-managementacceptance[3].clause,steps[5]identity-auth.self-service-password-resetacceptance[0].oracleidentity-auth.self-signup-gatesteps[0]identity-auth.auth-gate-held-session-raw-host-familiesfixtures.requires[1]identity-auth.default-organization-boot-invariantacceptance[1].verify,steps[0]approvals
approvals.per-group-signoffacceptance[3].verifyapprovals.quorum-m-of-nfixtures.requires[1]approvals.decision-action-matrixacceptance[1].verify,steps[7]approvals.account-app-entryacceptance[6].verify,fixtures.requires[2]approvals.approver-resolution-matrixacceptance[3].verify,acceptance[4].verify,acceptance[5].verify,steps[6],steps[7]approvals.request-page-reply-and-reader-visibilityautomated.ref,steps[1]Pin-coverage additions (PM hypothesis 2: added only where the file exists, reports at least 1 test under its package's vitest at the base, and asserts a clause the item states). Each was run singly under the shared verify lock after building the dependency closure (
turbo run build, 34 tasks, exit 0):automated.refpackages/runtime/src/domains/share-links-messages-audience.test.tspackages/services/service-automation/src/sys-flow-dispatch.object.test.tspackages/services/service-realtime/src/objects/sys-presence.object.test.tspackages/services/service-storage/src/attachment-lifecycle.test.tspackages/plugins/plugin-approvals/src/request-read-gate.integration.test.tsattachments-storage.chunked-upload-integritygets no pin: no test drives a chunked door after an organization switch. The guard's only door-level pin is the presigned commit door's inerror-envelope.conformance.test.ts. So acceptance[0] stops claiming the org-switch guard, and a knownGap records the unpinned leg.Findings left alone, each with the reading that refuted or excluded it
platform-core.boot-health, round 2's "the check-console-injection replay line still says 'not the published one'": no area file carries a check-console-injection line. At the base, a search of all 16 area files forcheck-console-injection,console-injectionandpublished onefinds zero matches. The sentence is the output ofscripts/check-console-injection.mjs(its success line), which is product text and outside this checklist-only ruling.platform-core.settings-hub-roundtrip(value_domain; no user-scoped namespace): excluded, because open PR feat(service-settings)!: the settings audit trail's global rung moves to a deployment-level sibling, sys_platform_setting_audit (18.x step 2, expand-first) #24590 holds the item.platform-core.settings-organization-isolation-and-platform-rung, plus the walled legs ofaccess-security.walled-environment-metadata-operator-only,activation-write-operator-gate,grant-table-write-contractacceptance[4] andparent-and-organization-write-guards: §2 (walled posture), so not this round. The record's "the minimal object body must declare sharingModel" note sits onwalled-environment-metadata-operator-onlysteps[0], a walled-boot step, and is left for that item's §2 revision.platform-core.metadata-authoring-roundtrip(the objectuistudio-record-page/studio-object-designerspecs are red at their own pin): §2's "objectui live e2e is not green at its pin" theme.platform-core.docs-audience-gateacceptance[2] (the unknown-audience-shape branch is unreachable live and has no test),access-security.rls-both-sidesacceptance[5],access-security.crud-permission-matrixacceptance[5], the marketplace-browse egress gap,access-security.parent-and-organization-write-guards(no controlled_by_parent fixture),access-security.platform-owner-email-anchor(no HTTP verified-email path), every identity-auth "Fixture gaps" row, and every approvals "Fixture gaps" row (includingrequest-page-reply-and-reader-visibilityacceptance[2]/[3] being unreachable on stock): §4, not this round.attachments-storage.chunked-upload-integrityacceptance[1] (chunk numbering base): already corrected on main by docs(qa): re-point five 18.0 sweep red-row clauses to the shipped contract #24622 (revision 2 numbers chunks from 0 and expectsmissingChunks[1]). Its second-organization fixture is §2.access-security.share-link-combined-gates, "showcase has no ai_conversations object": already in acceptance[3] since docs(qa): re-point five 18.0 sweep red-row clauses to the shipped contract #24622 ("the stock showcase has no ai_conversations object, so 400 UNSUPPORTED is the open answer there"). The item is otherwise one of the round-1 items excluded by the ruling.access-security.owd-save-gatenegative[0] "skipped": a run note (that runner booted before the console build landed), not a statement the item gets wrong.access-security.capability-declaration-lifecycle, "DELETE /api/v1/meta/capability/NAME is a 200 no-op": no clause or step asserts the DELETE door, so nothing in the item is inaccurate. The 200-that-deletes-nothing answer is a product observation and is not encoded here (see Acceptance notes).attachments-storage.inline-grid-receipt-cells(objectui-only pin scored by hand): a run-method note under RUNNER's objectui-pin protocol, not an inaccuracy.auth-method-matrix(discovery also answered under /api/v1/auth, which the record calls harmless; the item requires only the root mount) andtwo-factor-enrollment-reveal(the record calls the anonymous 400 "consistent with the clause").admin-lifecycle-operations's impersonation-banner note is a UX observation outside every clause.two-factor-verify-to-activate/-backup-codes/-disable-lifecycle("worth naming" a SQLite-file rig as an alternative to the in-process read, which still works).auth-gate-held-session-raw-host-familiesboots withpnpm dev -- --fresh, AGENTS.md's documented backend-only boot.inbox-metadata-actions(a simpler persona path; the reassign path the item names works).decision-only-via-servicesteps[6] (the run drove the trigger API instead of the row action; the step is accurate).request-page-reply-and-reader-visibility's boot line (accurate).approvals.email-action-token-door(all three of its rows): excluded, because it turns on fix(plugin-approvals): a reminder's notification payload carries no one-tap action token #24620.approvals.act-door-and-admin-rescue-slatefixtures.requires ("no mail harness needed — the raw links sit in sys_notification.payload.actions after a remind"): refuted since fix(plugin-approvals): a reminder's notification payload carries no one-tap action token #24620 landed (65a8eeb7d4, merged into this branch). A reminder's notification payload carries no one-tap action token any more, so that alternative no longer exists. It belongs with email-action-token-door's fix(plugin-approvals): a reminder's notification payload carries no one-tap action token #24620 follow-up.automated.refquality list:access-security.scope-depth-asymmetryis taken above. The other named items (flow-node-type-matrix,trigger-type-matrix,crud-roundtrip,connector-declarative-boot, thehook-wrappers/hook-binderrefs) are in other areas and not this round's.PM hypotheses, measured
5b14b7f3and base8fbbd5082f, the cited sources changed in three files.packages/objectql/src/registry.ts(fix(objectql): report a bound action named like one its target already lists, and registerAction replacing another owner's handler #24526) andpackages/plugins/plugin-auth/src/auth-manager.ts(feat(plugin-email,plugin-auth): identity mail persists to sys_identity_email, the deployment-level sibling of sys_email (18.x step 3, 8b-0d′) #24587) changed, but not in the cited symbols (NamespaceConflictError, the org-MFA cache).packages/plugins/plugin-approvals/src/approval-service.tschanged with feat(automation)!: an approval decision resumes a flow as the person who decided #24527 and then fix(plugin-approvals): a reminder's notification payload carries no one-tap action token #24620 (merged here); neither touchesrowFromRequestorcomment. Main's movement staled one finding (act-door, by fix(plugin-approvals): a reminder's notification payload carries no one-tap action token #24620). Two more were already handled on main (chunked numbering and share-link ai_conversations, both by docs(qa): re-point five 18.0 sweep red-row clauses to the shipped contract #24622). One was wrong at the base itself (boot-health).check:platform-checklistread 860/870 resolved at the base and 872/882 at head: 12 anchors added, none lost, the 10 on the named [finding] the platform-checklist corpus resolves symbol anchors with its OWN rule, not the shared resolver — a permissive token match where the ruling says there is to be exactly one implementation #16898 residual unchanged, 18 file floors held. No re-pointed anchor was refused.Gates
Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackfrom the merge-base (13 families), run at head0b5ec6bc9e, each exit code captured before any pipe:node scripts/check-ci-filter-parity.mjsnode scripts/check-closing-keyword-parity.mjsnode scripts/check-closing-keyword-parity.mjs --self-testnode scripts/check-comment-mask-corpus.mjspnpm --filter @objectstack/lint run check:doc-formula-expressionspnpm check:cross-package-test-inputspnpm check:doc-authoringpnpm check:driver-memory-censuspnpm check:gitlink-declaredpnpm check:nul-bytespnpm check:platform-checklistpnpm check:refd-timer-probepnpm check:watch-hint-literal--ranreconciliation: "13 derived famil(ies) accounted for — 13 run, 0 NOT-MEASURED (a DERIVED zero — all 13 recorded an exit code and none of them is 3)".check:platform-checklistruns in no per-PR CI, so its local reading is the evidence: "check-platform-checklist: OK — 16 areas, 327 items (322 active, 1 planned) … symbol anchors: 872/882 resolved … 10 on the named #16898 residual, 18 file floors held". The historyrefof the 42 revised items is a placeholder until this PR has a number. The fill commit after creation changes exactly those 42 strings, and the gates are re-run on that head (reported on the card). No exported symbol was renamed or removed, socheck-platform-checklist.mjs --changed-fromhas nothing to judge. Changeset: none. No published package'sfiles[]listsdocs/qa, soskip-changeset.Acceptance notes
access-security.capability-declaration-lifecycle: QA run QA run · access-security (31/35) · 5b14b7f3 · 2026-10-19 · 25 PASS / 4 PARTIAL / 2 FAIL / 0 BLOCKED / 4 NOT-RUN #24559 measuredDELETE /api/v1/meta/capability/NAMEanswering 200 while removing nothing, on a code-only type whose PUT answers 403 NOT_CREATABLE. No clause covers it, and it is noted here for the seat rather than filed from a checklist PR.platform-core.boot-health: the "not the published one" wording lives inscripts/check-console-injection.mjs's success line. Whether it is stale is a product-text question for the seat that owns that script.Generated by Claude Code