Repository navigation
docs(qa): 18.0 sweep anchor round 13 — QA round 3 surface:cli findings in cli.json, plus three carried items - #24850
Merged
objectstack-fleet[bot] merged 5 commits intoOct 20, 2026
Conversation
…B6 (#24579 round 13) Ten cli.json items take one revision bump and one history row each: migrate-duplicates-inventory (C1, C2), dev-boot-contract (C3, C4), migrate-meta-codemod (C5), doctor-health-report (C6), hook-body-extraction-gates (C7), validate-v18-authoring-verdicts and verify-derived-proof-families (C8, theme-B narrowing), qa-suite-execution (C9) and build-own-contract (B6). Each finding re-read at base 7697ddc. Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
…-read (#24579 round 13) no-active-org-session-semantics knownGaps[3] gains ADR-0131 D7's reading of sys_audit_log.tenant_id (attribution field, object permission governs); acceptance[4] stays, no ADR states the member-less answer. owd-save-gate acceptance[0] re-reads the probe with ?state=draft for its ?mode=draft leg (META_ITEM_READ_PARAMS). Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
…[2] (#24579 round 13) action-page-member.integration.test.ts's dead-link case compares the invalid, expired and consumed pages byte for byte with renderResultPage(kind) and no request, which renders no summary rows. Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
…8-sweep-round13 Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
The twelve history rows this round appended carried the branch name as their ref until the pull request existed; they now name it. Only those twelve strings change. 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-round13
branch
October 20, 2026 10:48
This was referenced Oct 20, 2026
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
Round 13 of the 18.0 sweep's wave anchor (claim
6288038866, PM loop round 22). It covers QA round 3'ssurface:clichecklist-accuracy findings C1–C9 (QA record #24786) and B6 (QA record #24787) incli.json, plus three items carried on the anchor. Only checklist text changes. Twelve items in three area files (cli.json9,access-security.json2,approvals.json1) each take onerevisionbump and onehistoryrow naming the record and the finding. There is no product code, test, pin, changeset text orRUNNER.mdchange.Every finding was re-read in the code at base
7697ddcf94before it was written, and all of them hold. Every source cited below is byte-identical at the mergedorigin/main5cb6e6e0aa. A scripted textual editor made the edits: it re-parses each area file and asserts that only the target items changed, and in each of them only the declared fields, plusrevision(+1) and one appendedhistoryrow. The raw file is never re-serialized.Changes
7697ddcf94)cli.migrate-duplicates-inventoryacceptance[3].verify--json, stdout is the plan document alone and every boot line goes to stderr; only the human path prints the registry lines on stdoutpackages/cli/src/utils/json-stdout.ts#reserveStdoutForJson, taken bybootSchemaStackwhenjsonOutputis set; the objectql registry logs throughconsole.log; the[metadata_spec_invalid]lines areconsole.error/console.warncli.migrate-duplicates-inventoryfixtures.requires[1]showcase_field_zoo.f_autonumber), so declare a second one; dropuniq_OBJ_organization_id_FIELDbefore seeding the repeat; plan then reports that drop asindex_mismatchpackages/drivers/driver-sql/src/schema-drift.ts#buildIndexName, and the declared-index-missing arm there (index_mismatch, actual(absent)); the autonumber defaultunique: 'organization'cli.dev-boot-contractfixtures.requires[2](new)pnpm objectui:build; on an unbuilt tree/_console/answers 503 "The ObjectStack Console is not built …", recordedblocked(environment)packages/cli/src/utils/console.ts#createConsoleNotBuiltPlugin;scripts/build-console.shcli.dev-boot-contractvariants[6]sharingModel, or the compile fails onsecurity-owd-unsetandos devexits 1packages/lint/src/validate-security-posture.ts#SECURITY_OWD_UNSET(severityerror);dev.ts"Compile failed — fix errors above before starting dev server", thenprocess.exit(1)cli.migrate-meta-codemodsteps[6]os validate" → "Migrated stack does not yet pass schema validation — N refusal(s) left after the chain. Resolve them, then runos validate:", then each refusalpackages/cli/src/commands/migrate/meta.ts#printSchemaVerdictcli.doctor-health-reportacceptance[0].clause,acceptance[0].verify,steps[0]Package-authored scheduled work, ON or OFF), plus the config block'sPlatform protocolrow; the verify names the rows by their push sites and checks instead of a countpackages/cli/src/commands/doctor.ts#scheduledWorkCheck; the run body's unguardedresults.pushcalls;checkProtocolVersionGapin the config blockcli.hook-body-extraction-gatesacceptance[6].verifyFORBIDDEN_PATTERNSentry, with no number (and the warning block lists at most 20)packages/cli/src/utils/extract-hook-body.ts#FORBIDDEN_PATTERNS, 14 entries at basecli.validate-v18-authoring-verdictsautomated.refos validateoros buildcli.verify-derived-proof-familiesautomated.refpackages/cli/test/verify-delete-behaviors.test.ts"NEGATIVE CONTROL: reports a cascade a hook undid, counts it, and exits 1" (it spawns the CLI and asserts exit 1,contradicted,contradicted 1, hardFailures 1); every pin uses its own fixture stackcli.qa-suite-executionfixtures.requires[0]scripts/check-console-sha.mjs"ℹ No console dist … skipping SHA check", exit 0;scripts/check-dev-prereqs.mjsruns first in the rootdevchaincli.build-own-contractacceptance[3].clause,acceptance[3].verify,fixtures.knownGaps[0](new)success/error/issuesagainst validatevalid/errors; the load-time refusal iserror+code(STACK_SCHEMA_INVALID) with no finding list on both; the judged parity stays warnings and conversionsemitJsonpayloads incompile.tsandvalidate.ts;packages/cli/src/utils/format.ts#errorCodeFieldscopiescodeandhttpStatusonly. The governing-text gap: no spec docblock or ADR states either command's--jsonshape (only theconversionselement,packages/spec/src/stack-provenance.ts#stackConversionsOf)access-security.no-active-org-session-semanticsfixtures.knownGaps[3]packages/plugins/plugin-audit/src/objects/sys-audit-log.object.ts(systemFields: { tenant: false },tenant_iddocblock,defaultRowScopesys_audit_log_org)access-security.owd-save-gateacceptance[0].verify,acceptance[0].evidenceGET …/qa_owd_probe?state=draftfor the?mode=draftleg; the evidence names both readspackages/rest/src/meta-item-read-gate.ts#META_ITEM_READ_PARAMS(state, nevermode)approvals.email-action-token-doorautomated.refaction-page-member.integration.test.ts"a dead link — unknown, expired, consumed — is told on the page with 200, through GET and POST alike": each page byte-equal torenderResultPage(kind)with no request, which renders the summary rows only when handed one (packages/plugins/plugin-approvals/src/action-link-pages.ts#renderResultPage); the file's two parity cases hold the self-hosted mount to the same bytesCarried item 11 — the governing-text decision
The rule applied: governing text decides a clause, and a clause is re-scoped only where an ADR, spec docblock or AGENTS.md rule states the answer. ADR-0131 D7 states the attribution reading.
sys_audit_logis deployment-level state with no organization column. The organization a row is about "becomes a plain attribution field under a name the tenant-field resolver does not claim, never the tenancy anchor". Such objects "are governed by object permission, not by the wall". D9 scopes the no-NULL rule to tenant-column objects ("column ⇒ in scope"). This moves acceptance[4]'s premise: its "invisible to RLS readers" was written for #8245, when the ledger was walled. It does not answer the question, though. No ADR states that a member-less actor's audit row may carry a NULL attribution, and none states that the platform operator reads such rows. The operator's 200 and the user's 403 that QA run #24783 measured come from the implementation: the object'sdefaultRowScopetenant_id == current_user.organization_id, which a NULL row matches for no organization reader. So the clause stays as written, and knownGaps[3] gains the D7 reading. This falsifies the dispatch's hypothesis 2 in its conclusion: D7 does state the attribution reading, but not the two facts an alignment needs.Items left alone, with reasons
access-security.no-active-org-session-semanticsacceptance[4]: kept as written, by the decision above.cli.hook-body-extraction-gatessteps[0] and acceptance[0].verify still say "fourteen at base 9a7838e".FORBIDDEN_PATTERNSstill holds 14 entries at7697ddcf94, so both are true as dated readings.cli.dev-boot-contractacceptance[0] (clause, verify, evidence): unchanged. Its console leg stands; the new requires[2] says what the leg needs and how to record it when the Console is unbuilt.cli.build-own-contractacceptance[0]'s success key list: unchanged. B6 names only acceptance[3], and QA run QA run · surface:build (5/7) · 580fd4ed · 2026-10-20 · 4 PASS / 1 PARTIAL / 0 FAIL / 0 BLOCKED / 2 NOT-RUN #24787 scored acceptance[0] a pass.FORBIDDEN_PATTERNSis a declared array and is now the anchor. It does not hold for C6: doctor has no row roster, because its rows are pushed inline inrun(). That verify now names the push sites and checks, and states no count.Gates
The derived list is
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, computed on the actual change set: 3 paths vs merge base5cb6e6e0aa, 118 changed lines. It gives 13 commands. Each one ran at headb66554b1ad, with its exit code captured before any pipe, and each exited 0:pnpm check:platform-checklist·pnpm check:nul-bytes·pnpm check:doc-authoring·pnpm check:cross-package-test-inputs·pnpm check:driver-memory-census·pnpm check:gitlink-declared·pnpm check:refd-timer-probe·pnpm check:watch-hint-literal·pnpm --filter @objectstack/lint run check:doc-formula-expressions(after a lockedturbo run build --filter=@objectstack/lint... --concurrency=2) ·node scripts/check-ci-filter-parity.mjs·node scripts/check-closing-keyword-parity.mjs·node scripts/check-closing-keyword-parity.mjs --self-test·node scripts/check-comment-mask-corpus.mjsThe
--ranreconciliation reads "13 derived, 13 run, 0 NOT-MEASURED, 0 UNRUN", a derived zero because all 13 recorded an exit code. No per-PR CI job runspnpm check:platform-checklist, so this local reading is its evidence:7697ddcf94b66554b1adThe history rows'
refare written as this PR's number in the commit that follows this PR's creation. That commit changes only those twelve strings, and the gate readings at that final head are in the report on #24579.Serial check:
origin/mainwas merged before this PR was opened. None of the 14 open PRs touchescli.json,access-security.jsonorapprovals.json, or anydocs/qa/path, so nogit merge-treeprobe was owed.Changeset:
docs/qa/**ships in no package. No public package'sfiles[]names it, and the root package is private. So this PR carriesskip-changesetand touches no.changeset/*.md.Acceptance notes
os build --jsonandos validate --jsoncarries the error's message andcode, but not the structured zodissues. TheSTACK_SCHEMA_INVALIDledger row (packages/spec/src/api/error-code-ledger.zod.ts) says that error carries them, anderrorCodeFieldscopies onlycodeandhttpStatus. The message renders those issues as text: theStackSchemaInvalidErrordocblock inpackages/spec/src/stack.zod.tssays "the message already renders those, and the envelope's job is the machine-readable half". The CLI payload declares noissueskey, so this is not a breach of a declared contract. It is recorded incli.build-own-contractknownGaps[0] and filed nowhere (carrier: none).Generated by Claude Code