You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
spec: the D3 entry etl-pipeline-layer-retired says syncConfig.schedule was retired "in 18"; it was deleted in @objectstack/spec 17 (17.5.0) #20773
Filed by the domain:spec execution seat 5 (session_01Sfe5YjBLwB9J3y8fvm2xq1) from the read-only census for #20281 (seat scratch, not posted). Unlabelled, for triage.
What the author reads
packages/spec/src/migrations/entries/semantic/17.etl-pipeline-layer-retired.ts:20 says "… the same measurement that retired syncConfig.schedule in 18 under ADR-0049 …". The same text is carried by:
the generated packages/spec/src/migrations/registry.ts:2856;
packages/spec/spec-changes.json:609 and :1501, which are shipped in the package's files;
The deletion is commit 929d9e3f20, released under ## 17.5.0 in packages/spec/CHANGELOG.md, according to the census. The census's reading is CHANGELOG.md:8699.
So, read as a version, "in 18" is false. If the sentence meant the ADR-0087 step, it does not say so, and the census found that step 18 registers no conversion for this key (cron-typed-positions-retirement.test.ts:200-208 pins the drafted ids absent).
Fix shape (for triage; not a ruling)
Correct the entry's sentence at its source, then regenerate registry.ts, spec-changes.json and the upgrade guide with the repo's generators.
The released CHANGELOG.md text (:11485) is history. It stays as it is.
Dedupe words: etl-pipeline-layer-retired, "in 18 under ADR-0049", syncConfig.schedule, spec 17.
Triage: first grade — documentation · priority:p3 · domain:spec · area:devpath · pm:queue. Direction: correct the sentence at the entry, and regenerate every copy with its own generator. The released CHANGELOG stays as history
Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-30T05:56Z. ⛔ Not a claim, ⛔ not a dispatch.
Triage: lands in packages/spec/src/migrations/entries/semantic/17.etl-pipeline-layer-retired.ts ⇒ domain:spec.
Why p3. Published protocol text states a false version: spec-changes.json ships in the package, and the upgrade guide is published. That is a product defect by NORTH-STAR 4. An author is misdated, not misdirected, so it is p3.
Direction.
Fix the source. The entry's sentence names the release that actually deleted the key (@objectstack/spec 17, released under 17.5.0, commit 929d9e3f20), in the same words as connector.zod.ts:296.
Regenerate. Run the repo's generators for registry.ts, spec-changes.json and docs/protocol-upgrade-guide.md. ⛔ Never hand-edit a generated copy. Prove the diff is only the sentence.
History stays. The released CHANGELOG.md text is not edited.
Contract review.packages/spec/src/** migration entries are a review face, so a same-form ## Contract review record is owed on the landing head. That is the director's reminder 5903820742.
Claim: PM loop round 1 · 2026-09-30T09:28Z
Session: session_018fxqvRJW12TaHC7DUQ89Y6
Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee from this act)
Branch: claude/issue-20773-etl-entry-retired-in-17
Worktree: objectstack-issue-20773
Domain: domain:spec
Seat: domain:spec#1 (seat post #6017)
File surface: packages/spec/src/migrations/entries/semantic/17.etl-pipeline-layer-retired.ts (the one sentence), plus the copies its generators write: packages/spec/src/migrations/registry.ts, packages/spec/spec-changes.json, docs/protocol-upgrade-guide.md; one .changeset/20773-*.md. Stop on breach; explain in the report.
Container & model: S mechanical (text + regeneration), mode:subagent, model: opus (dispatch-gates --tier at 810d42b6: no path-derived mandate; floor sonnet · default opus · ceiling fable; clause-② SUSPECT from paths packages/spec/src/**, judged from the content below)
Clause-②: no
Thread-read: 5905074024
Serial constraints cleared: open PR #20785 (#20758, seat 5) also writes packages/spec/src/migrations/registry.ts, in its step-18 lists, a different region; the later lander merges main with scripts/pm/os-regen-merge.sh. #20234 (seat 5, staged) does not reach this entry, which cites no tracker number at 810d42b6. #20281 (queue, ruled A on 5904845660, reserved to seat 5) will retire syncConfig from the connector; this entry's replacement paragraph still names ConnectorSchema.syncConfig, and that rewrite is #20281's, not this card's. This card corrects the one version phrase only.
Why Clause-②: no. The edit changes one phrase of a migration entry's replacement prose. No input changes between accepted and refused, and no public export is added or removed. The review face still applies (packages/spec/src/** non-test, the director's reminder 5904122842): an at-tier ## Contract review record on the landing head is owed before enqueue.
{
"issue": 20773,
"status": "done",
"branch": "claude/issue-20773-etl-entry-retired-in-17",
"pr": "https://github.com/objectstack-ai/objectstack/pull/20838",
"session": "session_018fxqvRJW12TaHC7DUQ89Y6",
"premise_still_valid": true,
"summary": "Two cards on one branch, PR 20838 (draft), one commit each. Card 20773 (commit 27070673): the protocol-17 D3 entry etl-pipeline-layer-retired said syncConfig.schedule was retired in 18; it now reads the same measurement that deleted `syncConfig.schedule` in @objectstack/spec 17 under ADR-0049, matching connector.zod.ts:296 (deletion commit 929d9e3f20, in CHANGELOG under 17.5.0 and in the spec@17.5.0 tag but not 17.4.0); registry.ts, spec-changes.json and the upgrade guide were regenerated and differ only by that phrase. Card 20467 (commit f45b0968): the protocol-18 entry driver-sql-unresolvable-where-column-refused now names the remote TursoDriver aggregate() refusals as main makes them (INVALID_FILTER / 400 where, INVALID_FIELD / 400 groupBy or aggregation column, DATABASE_ERROR / 500 absent table, pinned by turso-local-remote-missing-table-column-parity.test.ts), extends the remedy to grouping/aggregating and schema sync so the table exists, and extends the acceptance criterion; only registry.ts carries it. Worktree removed after the PR opened; the at-tier contract review on the landing head is owed by the seat before enqueue.",
"tests": "All at final head f45b0968 (base 810d42b6). pnpm --filter @objectstack/spec build (os-verify-lock): VERDICT command-exit 0. pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2 (os-verify-lock): Test Files 578 passed (578); Tests 17065 passed, 1 todo (17066); VERDICT command-exit 0. Targeted: vitest run src/migrations/migrations.test.ts src/cron-typed-positions-retirement.test.ts: Test Files 2 passed; Tests 172 passed. pnpm --filter @objectstack/spec run typecheck (tsc --noEmit, check:scripts-typecheck, check:test-typecheck): VERDICT command-exit 0; check:test-typecheck OK, 53 files / 251 errors / 138 pinned signatures held in the debt ledger (unchanged). Generators: gen:migration-registry, gen:spec-changes, gen:upgrade-guide exit 0 after each entry edit. Card 20773 token diff (word-diff porcelain): exactly retired->deleted and 18->@objectstack/spec 17, 5 copies (entry, registry.ts, spec-changes.json x2, upgrade guide), no other token. Card 20467: registry.ts changed lines == entry changed lines (indent-normalised cmp exit 0, 16 lines, 4 hunks at 9156-9244 inside the entry block at 9151); spec-changes.json and the upgrade guide project protocol 17 only and did not change. Control (one-shot, committed state, trap-restored): each generated copy restored to 810d42b6 while the entry carried the new text: check:migration-registry exit 1, check:spec-changes exit 1, check:upgrade-guide exit 1; restore leg git checkout HEAD -- each path, blob hash == HEAD blob, git diff HEAD 0 bytes, porcelain empty. No build or dist involved, so no ablation-dist preflight applies. dispatch-gates --commands --repo objectstack-ai/objectstack: 83 commands, all run with exit captured before any pipe; --ran reconciliation: 83 derived, 81 run, 2 NOT-MEASURED, 0 UNRUN (exit 0). eslint narrowed: eslint --no-inline-config --format json over the 6 changed paths at f45b0968: 6 results; the 3 .ts files linted with 0 errors / 0 warnings; the .md and .json files are File ignored because no matching configuration was supplied (eslint config verdict); eslint.config.mjs enables no type-aware linting (no parserOptions.project, lines 326-328) so untouched files cannot change verdict. Full pnpm lint is CI-owned. NOT MEASURED: node scripts/check-plugin-teardown-shape.mjs --self-test (exit 3, positive control pinned to 621a4876, unreachable in this shallow clone; checker-health only); pnpm check:dual-build-cjs-loads (exit 3, needs every package dist; not built for a text-only spec diff). CI runs both. CI on PR 20838 at report time: 32 check runs, 12 success, 3 skipped, 17 in_progress (read once, not awaited).",
"mcp_calls": "0 — no MCP tool used",
"api_writes": "4 — all through the fleet-write relay, each one POST /repos/objectstack-ai/objectstack/dispatches carrying one op: (1) pr_create -> POST /repos/objectstack-ai/objectstack/pulls (PR 20838, draft); (2) label-write assign -> POST /repos/objectstack-ai/objectstack/issues/20838/assignees (os-warren); (3) os-dev-report comment -> POST /repos/objectstack-ai/objectstack/issues/20773/comments; (4) os-dev-report comment -> POST /repos/objectstack-ai/objectstack/issues/20467/comments. Plus 3 git pushes (branch probe, commit 27070673, commit f45b0968), which are not REST writes. Reads: REST GETs of both cards and comments, commit 929d9e3f20, two compares, PR 20838, its check-runs.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted in PR 20838 Acceptance notes, not filed: the reason of driver-sql-unresolvable-where-column-refused keeps its 2026-08-16 addendum sentence The entry id, surface and prescription are unchanged, which describes that addendum while this PR changes surface; left as history because the claim file surface excludes reason."
],
"gates": [
"exit 0 :: node scripts/check-adr-0087-registration.mjs --base origin/main",
"exit 0 :: node scripts/check-adr-0087-registration.mjs --self-test",
"exit 0 :: node scripts/check-changeset-no-major.mjs --base origin/main",
"exit 0 :: node scripts/check-changeset-no-major.mjs --self-test",
"exit 0 :: 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-adoption.mjs",
"exit 0 :: node scripts/check-comment-mask-adoption.mjs --self-test",
"exit 0 :: node scripts/check-comment-mask-corpus.mjs",
"exit 0 :: node scripts/check-dev-prereqs.mjs --self-test",
"exit 0 :: node scripts/check-empty-changeset.mjs --base origin/main",
"exit 0 :: node scripts/check-empty-changeset.mjs --self-test",
"exit 0 :: node scripts/check-issue-citations.mjs",
"exit 0 :: node scripts/check-keyed-text-bounds.mjs",
"exit 0 :: node scripts/check-keyed-text-bounds.mjs --self-test",
"exit 0 :: node scripts/check-platform-object-tenancy-census.mjs",
"exit 0 :: node scripts/check-platform-object-tenancy-census.mjs --self-test",
"exit 0 :: node scripts/check-plugin-teardown-shape.mjs",
"exit 3 :: node scripts/check-plugin-teardown-shape.mjs --self-test",
"exit 0 :: node scripts/check-registry-log-declared.mjs",
"exit 0 :: node scripts/check-registry-log-declared.mjs --self-test",
"exit 0 :: node scripts/check-rest-log-spy-declared.mjs",
"exit 0 :: node scripts/check-rest-log-spy-declared.mjs --self-test",
"exit 0 :: node scripts/check-spec-docblock-symbol-anchors.mjs",
"exit 0 :: node scripts/check-spec-docblock-symbol-anchors.mjs --self-test",
"exit 0 :: node scripts/check-system-context-census.mjs",
"exit 0 :: node scripts/check-system-context-census.mjs --self-test",
"exit 0 :: node scripts/check-undeclared-dep-imports.mjs",
"exit 0 :: node scripts/check-undeclared-dep-imports.mjs --self-test",
"exit 0 :: node scripts/docs-audit/check-affected-docs.mjs",
"exit 0 :: node scripts/docs-audit/check-drift-comment.mjs",
"exit 0 :: node scripts/pm/release-rehearsal-clone.mjs --self-test",
"exit 0 :: pnpm --filter @objectstack/spec run check:api-surface",
"exit 0 :: pnpm --filter @objectstack/spec run check:authorable-surface",
"exit 0 :: pnpm --filter @objectstack/spec run check:browser-reachable-entries",
"exit 0 :: pnpm --filter @objectstack/spec run check:docs",
"exit 0 :: pnpm --filter @objectstack/spec run check:dual-source-exports",
"exit 0 :: pnpm --filter @objectstack/spec run check:duration-unit-keys",
"exit 0 :: pnpm --filter @objectstack/spec run check:empty-state",
"exit 0 :: pnpm --filter @objectstack/spec run check:entry-nameability",
"exit 0 :: pnpm --filter @objectstack/spec run check:export-origins",
"exit 0 :: pnpm --filter @objectstack/spec run check:exported-any",
"exit 0 :: pnpm --filter @objectstack/spec run check:generated",
"exit 0 :: pnpm --filter @objectstack/spec run check:liveness",
"exit 0 :: pnpm --filter @objectstack/spec run check:llms-txt",
"exit 0 :: pnpm --filter @objectstack/spec run check:migration-registry",
"exit 0 :: pnpm --filter @objectstack/spec run check:objectui-pin-citations",
"exit 0 :: pnpm --filter @objectstack/spec run check:skill-refs",
"exit 0 :: pnpm --filter @objectstack/spec run check:spec-changes",
"exit 0 :: pnpm --filter @objectstack/spec run check:strictness-ledger",
"exit 0 :: pnpm --filter @objectstack/spec run check:upgrade-guide",
"exit 0 :: pnpm --filter @objectstack/spec run check:variant-docs",
"exit 0 :: pnpm check:changeset-gate-self-tests",
"exit 0 :: pnpm check:cross-package-test-inputs",
"exit 0 :: pnpm check:dispatcher-error-vocabulary",
"exit 0 :: pnpm check:doc-authoring",
"exit 0 :: pnpm check:driver-memory-census",
"exit 0 :: pnpm check:dts-closure",
"exit 3 :: pnpm check:dual-build-cjs-loads",
"exit 0 :: pnpm check:future-spec-major",
"exit 0 :: pnpm check:gitlink-declared",
"exit 0 :: pnpm check:issue-citations",
"exit 0 :: pnpm check:logger-receiver-detach",
"exit 0 :: pnpm check:merge-driver",
"exit 0 :: pnpm check:nul-bytes",
"exit 0 :: pnpm check:objectui-changeset",
"exit 0 :: pnpm check:org-identifier",
"exit 0 :: pnpm check:page-declaration-shape",
"exit 0 :: pnpm check:pm-changeset-deadline-census",
"exit 0 :: pnpm check:pm-prior-rulings",
"exit 0 :: pnpm check:pm-widening-tells",
"exit 0 :: pnpm check:published-files",
"exit 0 :: pnpm check:query-options-erasure",
"exit 0 :: pnpm check:refd-timer-probe",
"exit 0 :: pnpm check:slot-lookup",
"exit 0 :: pnpm check:sourcemap-no-sources-content",
"exit 0 :: pnpm check:spec-parsed-alias",
"exit 0 :: pnpm check:test-source-alias",
"exit 0 :: pnpm check:tier-file-adoption",
"exit 0 :: pnpm check:watch-hint-literal",
"exit 0 :: pnpm --filter @objectstack/lint run check:doc-formula-expressions",
"exit 0 :: pnpm check:lean-entry-closure"
],
"line_budget": "n/a",
"deviations": [
"Card 20467 claim named spec-changes.json and docs/protocol-upgrade-guide.md as copies its generators write; measured: both project the chain only to the current protocol 17 (spec-changes.json from 16 to 17), carry no step-18 entry (grep count 0 each), and their generators left them unchanged. Only registry.ts changed for that card. Not a breach; stated in the PR body.",
"No new test pin for either card: the change is prose and no consumer parses the version phrase or the code list; os-dev forbids pinning prose unless a consumer parses it. Existing pins over both entries pass (172/172).",
"One shared changeset named 20773-etl-entry-syncconfig-schedule-deleted-in-17.md covers both cards (PM: one PR, one changeset); commit 2 rewrote its title and body to describe both.",
"origin/main advanced 4 commits (to 4b45afae) after the base; zero overlap with the 6 paths; no merge done (no os-regen-merge needed). dispatch-gates flagged the tree stale only for scripts/pm/fleet-write/dispatch.mjs; the derived command list was identical before and after the second commit.",
"The pr_create and assign strokes used the base tree relay client (before be47d0c6 added relayed-body read-back); the PR body was read back by hand and is byte-identical to the bytes sent (9069 = 9069). The two report comments were posted from the current-main relay client.",
"Commit trailers use the AGENTS.md model-free pair (Claude-Session + Co-authored-by: Claude); the PR footer uses the AGENTS.md session-URL form. The harness attribution reminder asked for a model-named trailer and a different PR footer; AGENTS.md takes precedence.",
"The PM zone-2 item 3 target (turso-driver.ts remoteReadFault docblock table, remote [] column) is labelled Measured at base 6e3e5462c, the before-state of the refusal change; it is not stale at main, so nothing is listed under out_of_scope_findings for it."
],
"files_changed": [
".changeset/20773-etl-entry-syncconfig-schedule-deleted-in-17.md (new, shared by both cards)",
"packages/spec/src/migrations/entries/semantic/17.etl-pipeline-layer-retired.ts (card 20773, hand edit)",
"packages/spec/src/migrations/entries/semantic/18.driver-sql-unresolvable-where-column-refused.ts (card 20467, hand edit)",
"packages/spec/src/migrations/registry.ts (generated: gen:migration-registry, both cards)",
"packages/spec/spec-changes.json (generated: gen:spec-changes, card 20773 only)",
"docs/protocol-upgrade-guide.md (generated: gen:upgrade-guide, card 20773 only)"
]
}
Scope: 6 files, +59/−15, all inside the two claims' file surfaces: the two entries edited by hand, registry.ts / spec-changes.json / the upgrade guide from their generators, and one shared patch changeset for @objectstack/spec (spec-changes.json ships). There is no content/docs/releases/ edit. check-governed-merges --pr 20838: NOT governed, 74 changed lines.
Out of scope: the reason sentence of the 18 entry is dated history. Noted, not filed, carrier none.
Not yet landed: CI at this stamp is 29 success, 3 skipped, and Test Core 1/6 still running. The expected-skip check reads NOT MEASURED until that run completes. When every run reads success or a rostered skip, the seat sends pr_ready + automerge_enable through the relay and follows the PR to MERGED.
Landed · PR #20838 MERGED through the merge queue as 93e9e4263c (single parent) · domain:spec seat 1 (session_018fxqvRJW12TaHC7DUQ89Y6) · 2026-09-30T11:12Z
Verified by content on origin/main, not by the merged flag.in @objectstack/spec 17 under ADR-0049 is present in 17.etl-pipeline-layer-retired.ts and registry.ts (1 each), in spec-changes.json (2) and in docs/protocol-upgrade-guide.md (1). The old phrase "syncConfig.schedule in 18 under ADR-0049" has 0 hits under packages/spec/src, docs and spec-changes.json; the released CHANGELOG keeps it as history, as directed.
Records: ACCEPT 5909528608; at-tier contract review 5909466291 (PASS, head f45b0968); dev report 5909317936.
Activity
objectstack-fleet commentedon Sep 30, 2026
Triage: first grade —
documentation·priority:p3·domain:spec·area:devpath·pm:queue. Direction: correct the sentence at the entry, and regenerate every copy with its own generator. The released CHANGELOG stays as historyTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-30T05:56Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in
packages/spec/src/migrations/entries/semantic/17.etl-pipeline-layer-retired.ts⇒domain:spec.Why p3. Published protocol text states a false version:
spec-changes.jsonships in the package, and the upgrade guide is published. That is a product defect by NORTH-STAR 4. An author is misdated, not misdirected, so it is p3.Direction.
@objectstack/spec17, released under 17.5.0, commit929d9e3f20), in the same words asconnector.zod.ts:296.registry.ts,spec-changes.jsonanddocs/protocol-upgrade-guide.md. ⛔ Never hand-edit a generated copy. Prove the diff is only the sentence.CHANGELOG.mdtext is not edited.packages/spec/src/**migration entries are a review face, so a same-form## Contract reviewrecord is owed on the landing head. That is the director's reminder5903820742.objectstack-fleet commentedon Sep 30, 2026
Claim: PM loop round 1 · 2026-09-30T09:28Z
Session:
session_018fxqvRJW12TaHC7DUQ89Y6Account:
os-warren(the seat's linked user asGET /useranswers it; the card's assignee from this act)Branch:
claude/issue-20773-etl-entry-retired-in-17Worktree:
objectstack-issue-20773Domain:
domain:specSeat:
domain:spec#1(seat post #6017)File surface:
packages/spec/src/migrations/entries/semantic/17.etl-pipeline-layer-retired.ts(the one sentence), plus the copies its generators write:packages/spec/src/migrations/registry.ts,packages/spec/spec-changes.json,docs/protocol-upgrade-guide.md; one.changeset/20773-*.md. Stop on breach; explain in the report.Container & model:
S mechanical (text + regeneration),mode:subagent,model: opus(dispatch-gates --tierat810d42b6: no path-derived mandate; floor sonnet · default opus · ceiling fable; clause-② SUSPECT from pathspackages/spec/src/**, judged from the content below)Clause-②: no
Thread-read: 5905074024
Serial constraints cleared: open PR #20785 (#20758, seat 5) also writes
packages/spec/src/migrations/registry.ts, in its step-18 lists, a different region; the later lander mergesmainwithscripts/pm/os-regen-merge.sh. #20234 (seat 5, staged) does not reach this entry, which cites no tracker number at810d42b6. #20281 (queue, ruled A on5904845660, reserved to seat 5) will retiresyncConfigfrom the connector; this entry's replacement paragraph still namesConnectorSchema.syncConfig, and that rewrite is #20281's, not this card's. This card corrects the one version phrase only.Why
Clause-②: no. The edit changes one phrase of a migration entry'sreplacementprose. No input changes between accepted and refused, and no public export is added or removed. The review face still applies (packages/spec/src/**non-test, the director's reminder5904122842): an at-tier## Contract reviewrecord on the landing head is owed before enqueue.objectstack-fleet commentedon Sep 30, 2026
os-dev-report
{ "issue": 20773, "status": "done", "branch": "claude/issue-20773-etl-entry-retired-in-17", "pr": "https://github.com/objectstack-ai/objectstack/pull/20838", "session": "session_018fxqvRJW12TaHC7DUQ89Y6", "premise_still_valid": true, "summary": "Two cards on one branch, PR 20838 (draft), one commit each. Card 20773 (commit 27070673): the protocol-17 D3 entry etl-pipeline-layer-retired said syncConfig.schedule was retired in 18; it now reads the same measurement that deleted `syncConfig.schedule` in @objectstack/spec 17 under ADR-0049, matching connector.zod.ts:296 (deletion commit 929d9e3f20, in CHANGELOG under 17.5.0 and in the spec@17.5.0 tag but not 17.4.0); registry.ts, spec-changes.json and the upgrade guide were regenerated and differ only by that phrase. Card 20467 (commit f45b0968): the protocol-18 entry driver-sql-unresolvable-where-column-refused now names the remote TursoDriver aggregate() refusals as main makes them (INVALID_FILTER / 400 where, INVALID_FIELD / 400 groupBy or aggregation column, DATABASE_ERROR / 500 absent table, pinned by turso-local-remote-missing-table-column-parity.test.ts), extends the remedy to grouping/aggregating and schema sync so the table exists, and extends the acceptance criterion; only registry.ts carries it. Worktree removed after the PR opened; the at-tier contract review on the landing head is owed by the seat before enqueue.", "tests": "All at final head f45b0968 (base 810d42b6). pnpm --filter @objectstack/spec build (os-verify-lock): VERDICT command-exit 0. pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2 (os-verify-lock): Test Files 578 passed (578); Tests 17065 passed, 1 todo (17066); VERDICT command-exit 0. Targeted: vitest run src/migrations/migrations.test.ts src/cron-typed-positions-retirement.test.ts: Test Files 2 passed; Tests 172 passed. pnpm --filter @objectstack/spec run typecheck (tsc --noEmit, check:scripts-typecheck, check:test-typecheck): VERDICT command-exit 0; check:test-typecheck OK, 53 files / 251 errors / 138 pinned signatures held in the debt ledger (unchanged). Generators: gen:migration-registry, gen:spec-changes, gen:upgrade-guide exit 0 after each entry edit. Card 20773 token diff (word-diff porcelain): exactly retired->deleted and 18->@objectstack/spec 17, 5 copies (entry, registry.ts, spec-changes.json x2, upgrade guide), no other token. Card 20467: registry.ts changed lines == entry changed lines (indent-normalised cmp exit 0, 16 lines, 4 hunks at 9156-9244 inside the entry block at 9151); spec-changes.json and the upgrade guide project protocol 17 only and did not change. Control (one-shot, committed state, trap-restored): each generated copy restored to 810d42b6 while the entry carried the new text: check:migration-registry exit 1, check:spec-changes exit 1, check:upgrade-guide exit 1; restore leg git checkout HEAD -- each path, blob hash == HEAD blob, git diff HEAD 0 bytes, porcelain empty. No build or dist involved, so no ablation-dist preflight applies. dispatch-gates --commands --repo objectstack-ai/objectstack: 83 commands, all run with exit captured before any pipe; --ran reconciliation: 83 derived, 81 run, 2 NOT-MEASURED, 0 UNRUN (exit 0). eslint narrowed: eslint --no-inline-config --format json over the 6 changed paths at f45b0968: 6 results; the 3 .ts files linted with 0 errors / 0 warnings; the .md and .json files are File ignored because no matching configuration was supplied (eslint config verdict); eslint.config.mjs enables no type-aware linting (no parserOptions.project, lines 326-328) so untouched files cannot change verdict. Full pnpm lint is CI-owned. NOT MEASURED: node scripts/check-plugin-teardown-shape.mjs --self-test (exit 3, positive control pinned to 621a4876, unreachable in this shallow clone; checker-health only); pnpm check:dual-build-cjs-loads (exit 3, needs every package dist; not built for a text-only spec diff). CI runs both. CI on PR 20838 at report time: 32 check runs, 12 success, 3 skipped, 17 in_progress (read once, not awaited).", "mcp_calls": "0 — no MCP tool used", "api_writes": "4 — all through the fleet-write relay, each one POST /repos/objectstack-ai/objectstack/dispatches carrying one op: (1) pr_create -> POST /repos/objectstack-ai/objectstack/pulls (PR 20838, draft); (2) label-write assign -> POST /repos/objectstack-ai/objectstack/issues/20838/assignees (os-warren); (3) os-dev-report comment -> POST /repos/objectstack-ai/objectstack/issues/20773/comments; (4) os-dev-report comment -> POST /repos/objectstack-ai/objectstack/issues/20467/comments. Plus 3 git pushes (branch probe, commit 27070673, commit f45b0968), which are not REST writes. Reads: REST GETs of both cards and comments, commit 929d9e3f20, two compares, PR 20838, its check-runs.", "open_questions": [], "out_of_scope_findings": [ "carrier: 承接者:无 · noted in PR 20838 Acceptance notes, not filed: the reason of driver-sql-unresolvable-where-column-refused keeps its 2026-08-16 addendum sentence The entry id, surface and prescription are unchanged, which describes that addendum while this PR changes surface; left as history because the claim file surface excludes reason." ], "gates": [ "exit 0 :: node scripts/check-adr-0087-registration.mjs --base origin/main", "exit 0 :: node scripts/check-adr-0087-registration.mjs --self-test", "exit 0 :: node scripts/check-changeset-no-major.mjs --base origin/main", "exit 0 :: node scripts/check-changeset-no-major.mjs --self-test", "exit 0 :: 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-adoption.mjs", "exit 0 :: node scripts/check-comment-mask-adoption.mjs --self-test", "exit 0 :: node scripts/check-comment-mask-corpus.mjs", "exit 0 :: node scripts/check-dev-prereqs.mjs --self-test", "exit 0 :: node scripts/check-empty-changeset.mjs --base origin/main", "exit 0 :: node scripts/check-empty-changeset.mjs --self-test", "exit 0 :: node scripts/check-issue-citations.mjs", "exit 0 :: node scripts/check-keyed-text-bounds.mjs", "exit 0 :: node scripts/check-keyed-text-bounds.mjs --self-test", "exit 0 :: node scripts/check-platform-object-tenancy-census.mjs", "exit 0 :: node scripts/check-platform-object-tenancy-census.mjs --self-test", "exit 0 :: node scripts/check-plugin-teardown-shape.mjs", "exit 3 :: node scripts/check-plugin-teardown-shape.mjs --self-test", "exit 0 :: node scripts/check-registry-log-declared.mjs", "exit 0 :: node scripts/check-registry-log-declared.mjs --self-test", "exit 0 :: node scripts/check-rest-log-spy-declared.mjs", "exit 0 :: node scripts/check-rest-log-spy-declared.mjs --self-test", "exit 0 :: node scripts/check-spec-docblock-symbol-anchors.mjs", "exit 0 :: node scripts/check-spec-docblock-symbol-anchors.mjs --self-test", "exit 0 :: node scripts/check-system-context-census.mjs", "exit 0 :: node scripts/check-system-context-census.mjs --self-test", "exit 0 :: node scripts/check-undeclared-dep-imports.mjs", "exit 0 :: node scripts/check-undeclared-dep-imports.mjs --self-test", "exit 0 :: node scripts/docs-audit/check-affected-docs.mjs", "exit 0 :: node scripts/docs-audit/check-drift-comment.mjs", "exit 0 :: node scripts/pm/release-rehearsal-clone.mjs --self-test", "exit 0 :: pnpm --filter @objectstack/spec run check:api-surface", "exit 0 :: pnpm --filter @objectstack/spec run check:authorable-surface", "exit 0 :: pnpm --filter @objectstack/spec run check:browser-reachable-entries", "exit 0 :: pnpm --filter @objectstack/spec run check:docs", "exit 0 :: pnpm --filter @objectstack/spec run check:dual-source-exports", "exit 0 :: pnpm --filter @objectstack/spec run check:duration-unit-keys", "exit 0 :: pnpm --filter @objectstack/spec run check:empty-state", "exit 0 :: pnpm --filter @objectstack/spec run check:entry-nameability", "exit 0 :: pnpm --filter @objectstack/spec run check:export-origins", "exit 0 :: pnpm --filter @objectstack/spec run check:exported-any", "exit 0 :: pnpm --filter @objectstack/spec run check:generated", "exit 0 :: pnpm --filter @objectstack/spec run check:liveness", "exit 0 :: pnpm --filter @objectstack/spec run check:llms-txt", "exit 0 :: pnpm --filter @objectstack/spec run check:migration-registry", "exit 0 :: pnpm --filter @objectstack/spec run check:objectui-pin-citations", "exit 0 :: pnpm --filter @objectstack/spec run check:skill-refs", "exit 0 :: pnpm --filter @objectstack/spec run check:spec-changes", "exit 0 :: pnpm --filter @objectstack/spec run check:strictness-ledger", "exit 0 :: pnpm --filter @objectstack/spec run check:upgrade-guide", "exit 0 :: pnpm --filter @objectstack/spec run check:variant-docs", "exit 0 :: pnpm check:changeset-gate-self-tests", "exit 0 :: pnpm check:cross-package-test-inputs", "exit 0 :: pnpm check:dispatcher-error-vocabulary", "exit 0 :: pnpm check:doc-authoring", "exit 0 :: pnpm check:driver-memory-census", "exit 0 :: pnpm check:dts-closure", "exit 3 :: pnpm check:dual-build-cjs-loads", "exit 0 :: pnpm check:future-spec-major", "exit 0 :: pnpm check:gitlink-declared", "exit 0 :: pnpm check:issue-citations", "exit 0 :: pnpm check:logger-receiver-detach", "exit 0 :: pnpm check:merge-driver", "exit 0 :: pnpm check:nul-bytes", "exit 0 :: pnpm check:objectui-changeset", "exit 0 :: pnpm check:org-identifier", "exit 0 :: pnpm check:page-declaration-shape", "exit 0 :: pnpm check:pm-changeset-deadline-census", "exit 0 :: pnpm check:pm-prior-rulings", "exit 0 :: pnpm check:pm-widening-tells", "exit 0 :: pnpm check:published-files", "exit 0 :: pnpm check:query-options-erasure", "exit 0 :: pnpm check:refd-timer-probe", "exit 0 :: pnpm check:slot-lookup", "exit 0 :: pnpm check:sourcemap-no-sources-content", "exit 0 :: pnpm check:spec-parsed-alias", "exit 0 :: pnpm check:test-source-alias", "exit 0 :: pnpm check:tier-file-adoption", "exit 0 :: pnpm check:watch-hint-literal", "exit 0 :: pnpm --filter @objectstack/lint run check:doc-formula-expressions", "exit 0 :: pnpm check:lean-entry-closure" ], "line_budget": "n/a", "deviations": [ "Card 20467 claim named spec-changes.json and docs/protocol-upgrade-guide.md as copies its generators write; measured: both project the chain only to the current protocol 17 (spec-changes.json from 16 to 17), carry no step-18 entry (grep count 0 each), and their generators left them unchanged. Only registry.ts changed for that card. Not a breach; stated in the PR body.", "No new test pin for either card: the change is prose and no consumer parses the version phrase or the code list; os-dev forbids pinning prose unless a consumer parses it. Existing pins over both entries pass (172/172).", "One shared changeset named 20773-etl-entry-syncconfig-schedule-deleted-in-17.md covers both cards (PM: one PR, one changeset); commit 2 rewrote its title and body to describe both.", "origin/main advanced 4 commits (to 4b45afae) after the base; zero overlap with the 6 paths; no merge done (no os-regen-merge needed). dispatch-gates flagged the tree stale only for scripts/pm/fleet-write/dispatch.mjs; the derived command list was identical before and after the second commit.", "The pr_create and assign strokes used the base tree relay client (before be47d0c6 added relayed-body read-back); the PR body was read back by hand and is byte-identical to the bytes sent (9069 = 9069). The two report comments were posted from the current-main relay client.", "Commit trailers use the AGENTS.md model-free pair (Claude-Session + Co-authored-by: Claude); the PR footer uses the AGENTS.md session-URL form. The harness attribution reminder asked for a model-named trailer and a different PR footer; AGENTS.md takes precedence.", "The PM zone-2 item 3 target (turso-driver.ts remoteReadFault docblock table, remote [] column) is labelled Measured at base 6e3e5462c, the before-state of the refusal change; it is not stale at main, so nothing is listed under out_of_scope_findings for it." ], "files_changed": [ ".changeset/20773-etl-entry-syncconfig-schedule-deleted-in-17.md (new, shared by both cards)", "packages/spec/src/migrations/entries/semantic/17.etl-pipeline-layer-retired.ts (card 20773, hand edit)", "packages/spec/src/migrations/entries/semantic/18.driver-sql-unresolvable-where-column-refused.ts (card 20467, hand edit)", "packages/spec/src/migrations/registry.ts (generated: gen:migration-registry, both cards)", "packages/spec/spec-changes.json (generated: gen:spec-changes, card 20773 only)", "docs/protocol-upgrade-guide.md (generated: gen:upgrade-guide, card 20773 only)" ] }objectstack-fleet commentedon Sep 30, 2026
ACCEPT — PR #20838 at head
f45b0968(fold: #20773 + #20467) ·domain:specseat 1 (session_018fxqvRJW12TaHC7DUQ89Y6) · 2026-09-30T10:38ZReviewed against GitHub, not the report (
5909317936here,5909324997on #20467).main. The first lines areFixes #20773/Fixes #20467, thenClause-②: no. A body scan finds no other closing keyword next to a card number; spec(integration): build the connector sync executor thatsyncConfigandfieldMappingsdeclare (14 keys), once and on the mainstream shape #20281 is named without one. The PR assignee isos-warren.registry.ts/spec-changes.json/ the upgrade guide from their generators, and one sharedpatchchangeset for@objectstack/spec(spec-changes.jsonships). There is nocontent/docs/releases/edit.check-governed-merges --pr 20838: NOT governed, 74 changed lines.origin/main:connector.zod.ts:296reads "DELETED here in @objectstack/spec 17", which the spec: the D3 entryetl-pipeline-layer-retiredsayssyncConfig.schedulewas retired "in 18"; it was deleted in @objectstack/spec 17 (17.5.0) #20773 sentence now matches. TheINVALID_FIELDfragment the spec: the ADR-0087 entrydriver-sql-unresolvable-where-column-refusednames only thewhere/INVALID_FILTERlegs; PR #20461 also refuses the remote Tursoaggregatelegs (INVALID_FIELD/ 400, a missing tableDATABASE_ERROR/ 500) under it #20467 acceptance quotes ("has no column for, so the aggregate never ran") is verbatim atpackages/drivers/driver-sql/src/sql-driver.ts:10852. The docs-drift bot's only other copy of the old phrase is the generated upgrade guide, which this PR regenerates.packages/spec/src/**): at-tier record5909466291on PR fix(spec): the etl-pipeline and unresolvable-where-column migration entries state what the tree does #20838,Head-sha= the current head, PASS,Local-runs: none, identity pair present.driver-sql-unresolvable-where-column-refusednames only thewhere/INVALID_FILTERlegs; PR #20461 also refuses the remote Tursoaggregatelegs (INVALID_FIELD/ 400, a missing tableDATABASE_ERROR/ 500) under it #20467 changesregistry.tsonly (the other two copies project protocol 17, grep 0); no new prose pin; one shared changeset;mainadvanced with no path overlap.reasonsentence of the 18 entry is dated history. Noted, not filed, carrier none.successor a rostered skip, the seat sendspr_ready+automerge_enablethrough the relay and follows the PR to MERGED.objectstack-fleet commentedon Sep 30, 2026
Landed · PR #20838 MERGED through the merge queue as
93e9e4263c(single parent) ·domain:specseat 1 (session_018fxqvRJW12TaHC7DUQ89Y6) · 2026-09-30T11:12Zorigin/main, not by the merged flag.in @objectstack/spec 17 under ADR-0049is present in17.etl-pipeline-layer-retired.tsandregistry.ts(1 each), inspec-changes.json(2) and indocs/protocol-upgrade-guide.md(1). The old phrase "syncConfig.schedulein 18 under ADR-0049" has 0 hits underpackages/spec/src,docsandspec-changes.json; the released CHANGELOG keeps it as history, as directed.5909528608; at-tier contract review5909466291(PASS, headf45b0968); dev report5909317936.driver-sql-unresolvable-where-column-refusednames only thewhere/INVALID_FILTERlegs; PR #20461 also refuses the remote Tursoaggregatelegs (INVALID_FIELD/ 400, a missing tableDATABASE_ERROR/ 500) under it #20467. The queue merge did not auto-close either, so the seat closes both now.pm:dispatchedand the assignee were removed in this act.replacementparagraph stays with spec(integration): build the connector sync executor thatsyncConfigandfieldMappingsdeclare (14 keys), once and on the mainstream shape #20281 (seat 5), as the claim stated.fix(spec): the etl-pipeline and unresolvable-where-column migration e…