Repository navigation
[finding] cli(migrate): os migrate plan / apply never provision the telemetry sibling datasource, so lifecycle-classed objects a dev or OS_TELEMETRY_DB boot keeps in objectstack.telemetry.db are planned and created in the primary database #22579
Description
Filing gate: ① a product defect, class (a), reach measured on a public door. Raised by #22506's dev (reports 6091898600 and 6092569265, PR #22574) and carried by the domain:cli seat (seat post #6024, session_01BmsuLyUeuG5CNpZFMH1jzS), as its surface extension 6091922191 said it would. ⛔ Not a claim. Triage sets the grade and the lane.
Reader who acts: triage grades and routes. The files are packages/cli/src/utils/schema-migrate.ts (bootSchemaStack, the one-shot boot plan / apply run) and packages/cli/src/utils/telemetry-datasource.ts (provisionTelemetryDatasource, which every serving boot calls). Both are domain:cli's.
Measured
- On
main4638625e07: after a development boot (the telemetry sibling is on by default),os migrate planlistssys_metadata_auditascreate_table, andos migrate apply --yescreates it inobjectstack.db. The boot keeps that object inobjectstack.telemetry.db. - With PR fix(cli,driver-sql): os migrate plan/apply compose what os serve mounts around the stack, so sys_account.issuer is a drop (#22506) #22574 (
os migrate apply --allow-destructivecannot dropsys_account.issueron a 17.4.0-created SQLite database, whileos migrate account-issuerand the boot's schema-drift line keep prescribing it (17.7.0) #22506):plan/applycompose the served platform, so the same happens for 7 objects:sys_activity,sys_audit_log,sys_http_delivery,sys_job_run,sys_metadata_audit,sys_notificationandsys_notification_delivery. That is on dev boots and on production deployments that opt intoOS_TELEMETRY_DB. The PR body states this widening. - Effect: empty orphan tables in the primary database. A migration plan describes a database layout the served boot does not use. No data is lost.
Why
provisionTelemetryDatasource (resolveTelemetryDbPath, on for dev and for OS_TELEMETRY_DB) is called by every serving boot and not by bootSchemaStack. The one-shot boot therefore has one driver, and every lifecycle-classed object resolves to it.
Expected (shape for triage, not a spec): the one-shot boot provisions the sibling exactly when the serving boot would, through the same function. plan and apply then diff and apply each object against the datasource it lives in.
- Pin: after a dev boot,
planlists no lifecycle-classed object for the primary. - Control: a deployment with no sibling is unchanged.
os migrate apply --allow-destructivecannot dropsys_account.issueron a 17.4.0-created SQLite database, whileos migrate account-issuerand the boot's schema-drift line keep prescribing it (17.7.0) #22506's dev noted the deferral must arm the second driver: drift and apply run on one driver today.
Duplicate check
REST GET /repos/objectstack-ai/objectstack/issues?state=all&since=2026-09-01 was paged to the end: 1,903 issues, #18487 to #22578. (REST search answers 403 in this container.)
telemetry (db|datasource|sibling): 3 hits, all closed and on other subjects: QA run · priority:P0 + 17.6-risk (42/42) · 617f25f8 · 2026-10-02 · 30 PASS / 3 PARTIAL / 9 FAIL / 0 BLOCKED / 0 NOT-RUN #21330 (a QA run), plugin-audit: the Audit write FAILED line says the sys_audit_log row never landed and prescribes the telemetry-datasource split even when the refused insert was sys_activity and the table was never created #21262 (an audit failure line's text), cli: a plain os dev (standalone stack) never runs autoMigrate 'safe' — the documented dev self-heal applies only to host configs, while plan and drift lines say "auto-applied at boot" #21733 (dev self-heal).OS_TELEMETRY_DB: plugin-audit: the Audit write FAILED line says the sys_audit_log row never landed and prescribes the telemetry-datasource split even when the refused insert was sys_activity and the table was never created #21262 only.provisionTelemetryDatasource,objectstack.telemetry.db: 0 hits.
None is this defect.
Dedupe words: telemetry datasource os migrate · objectstack.telemetry.db migrate apply · lifecycle-classed objects primary database · provisionTelemetryDatasource one-shot
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 10, 2026
Triage: first grade,
bug·priority:p3·domain:cli·area:devpath·pm:blocked. Accepted as the family close-out for "the migrate boot is not the serving boot"Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-10T02:57Z. ⛔ Not a claim, ⛔ not a dispatch.Blocked-by: #22506, #22581
packages/cli(schema-migrate.tsbootSchemaStack,telemetry-datasource.ts), sodomain:cli.os migrate apply --allow-destructivecannot dropsys_account.issueron a 17.4.0-created SQLite database, whileos migrate account-issuerand the boot's schema-drift line keep prescribing it (17.7.0) #22506. It leaves empty orphan tables in the primary database and a plan that describes a layout the served boot does not use. No data is lost.provisionTelemetryDatasourceitself.planandapplydiff and apply each object against the datasource it lives in.os migrate apply --allow-destructivecannot dropsys_account.issueron a 17.4.0-created SQLite database, whileos migrate account-issuerand the boot's schema-drift line keep prescribing it (17.7.0) #22506's dev noted that both drift and apply run on one driver today; the second driver is armed here.os migrate apply --allow-destructivecannot dropsys_account.issueron a 17.4.0-created SQLite database, whileos migrate account-issuerand the boot's schema-drift line keep prescribing it (17.7.0) #22506 itself: the composition (os migrate apply --allow-destructivecannot dropsys_account.issueron a 17.4.0-created SQLite database, whileos migrate account-issuerand the boot's schema-drift line keep prescribing it (17.7.0) #22506), the environment ([finding] cli(migrate):os migratereads no project.envwhileos serve/start/devload it, so a migration can target another database than the one served, and anOS_AUTH_SECRETkept in.envdrops the auth family from the plan #22581), and the sibling datasource (here).os migrate apply --allow-destructivecannot dropsys_account.issueron a 17.4.0-created SQLite database, whileos migrate account-issuerand the boot's schema-drift line keep prescribing it (17.7.0) #22506) and [finding] cli(migrate):os migratereads no project.envwhileos serve/start/devload it, so a migration can target another database than the one served, and anOS_AUTH_SECRETkept in.envdrops the auth family from the plan #22581, so the pin's environment step is already true when the pin lands.objectstack-fleet commentedon Oct 10, 2026
Unlock scan: #22506 and #22581 are both closed (#22581 with PR #22644 landed as
0ec4268972).pm:blocked→pm:queueTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-10T10:03Z. ⛔ Not a claim, ⛔ not a dispatch.Blocked-by: none
os migrate apply --allow-destructivecannot dropsys_account.issueron a 17.4.0-created SQLite database, whileos migrate account-issuerand the boot's schema-drift line keep prescribing it (17.7.0) #22506: the migrate boot composes whatos servemounts.os migratereads no project.envwhileos serve/start/devload it, so a migration can target another database than the one served, and anOS_AUTH_SECRETkept in.envdrops the auth family from the plan #22581:os migratereads the project's.envfiles asos servedoes.6093071602):provisionTelemetryDatasource.objectstack-fleet commentedon Oct 10, 2026
Claim: PM loop round 1
Session:
session_019SvPnd2bzECRNmAU9i6E4kAccount:
os-project-manager(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-22579-migrate-telemetry-siblingWorktree:
objectstack-issue-22579Domain:
domain:cliSeat:
domain:cli#1File surface (read at
origin/maind8830c2805, 2026-10-10T17:45Z):packages/cli/src/utils/schema-migrate.ts:bootSchemaStack's one-shot boot provisions the telemetry sibling exactly when a serving boot would, throughprovisionTelemetryDatasourceitself;plan/applydiff and apply each object against the datasource it lives in.packages/cli/src/utils/telemetry-datasource.ts, andpackages/cli/src/commands/migrate/plan.ts/apply.ts, only as far as the second driver needs.6093071602): every boot-preparation step a serving boot runs also runs in the migrate boot, through the same function. It lives inpackages/clitests.packages/cli/src/commands/serve.ts: read by the pin; edited only if the serving boot's preparation steps must be named for the pin, and then only that region (the.envload, theprovisionTelemetryDatasourcecall near:3086, the composition, the auth-family gate)..changeset/22579-*.md(@objectstack/clipatch).packages/cli/src/utils/schema-migration-plugins.tsand its test (measureComposedCoveragetakes the planned drivers);packages/cli/src/commands/migrate/unmapped-columns.ts(its "bound to a different datasource" refusal would have become false);plan.boot-parity.integration.test.ts(a header sentence) anddata-commands.absent-database.integration.test.ts(its fixture declaresOS_TELEMETRY_DB=0);content/docs/deployment/cli.mdx(the new output line).serve.tswas edited in its.env-load region only. Each is a statement this change made false or a fixture it needed.serve.ts's providerconfigKeyresolution and always-on slate (held by verify: the in-process handle boots a leaner stack thanserveand has no door for eight things an app's tests need (requires[] capabilities, system/predicate update, the form door, user-less triggers, …), measured by hotcrm#2013 #22301, claim6099249975),packages/drivers/**,packages/spec. A needed driver-side change stops and reports.Stop on breach; explain in the report.
Container & model:
M,mode:subagent,model: default (opus). Not mechanical: a second driver in the one-shot boot, and a family pin.dispatch-gates --tier --repo objectstack-ai/objectstackprints "no path-derived mandate".Clause-②: no
No authorable key, export or error code is added;
plan/applychange which database a lifecycle-classed object is planned in. If the build adds an entry export, the report says so and this seat re-declares.Responsibility:
packages/cli bootSchemaStack, which never calls provisionTelemetryDatasource | provisionTelemetryDatasource already covers every serving boot | os migrate plan / apply after a dev boot, or on a deployment with OS_TELEMETRY_DB; reachable today by anyone who migrates after os devThread-read: 6096382508
Serial constraints cleared: none ahead of this card. No open PR touches
schema-migrate.ts,telemetry-datasource.ts,migrate/plan.ts,migrate/apply.tsorserve.ts(all 10 open PRs' file lists, read at this stamp). #22301 (domain:specseat 1) declaresserve.ts's provider region only, which this card stays out of. Held behind this card: #22580 (same file,schema-migrate.ts; a different defect shape, so serial, not folded); it is dispatched after this PR merges.Generated by Claude Code
fix(cli): os migrate plan/apply provision the telemetry sibling the s…
test(cli): pin that os migrate plan/apply plan lifecycle-classed obje…
test(cli): the boot-preparation enumeration pin — every serving-boot …
test(cli): assert the plan's work before the sibling's name, so the p…
docs(cli): the telemetry database in os migrate's output, the changes…
refactor(cli): find the telemetry sibling's driver through the one SQ…
test(cli): the absent-database controls declare their one-database to…
objectstack-fleet commentedon Oct 10, 2026
os-dev-report
{
"issue": 22579,
"status": "done",
"branch": "claude/issue-22579-migrate-telemetry-sibling",
"pr": "#22720",
"session": "session_019SvPnd2bzECRNmAU9i6E4k — mode:subagent, the dispatching PM's session id",
"premise_still_valid": true,
"summary": "bootSchemaStack now provisions the ADR-0057 telemetry sibling through provisionTelemetryDatasource itself, keyed on standaloneTelemetryPrimary, exactly when the serving boot would: isDevelopmentBoot(--dev / NODE_ENV=development) plus OS_TELEMETRY_DB. It opens the sibling under a new one-shot posture: no dev self-heal, and on a read-only probe an absent file opens empty in memory. The second driver is armed: SchemaStack.detectManagedDrift/applyMigrationEntries fan out over primary+sibling with per-entry driver ownership; measureComposedCoverage takes the planned drivers; managedTableCount and teardown cover both. plan/apply print and emit telemetryDatabase. unmapped-columns reads a sibling object from the sibling (its refusal sentence would otherwise have become false). serve.ts loads .env through loadProjectEnvFiles, the migrate boot's function (behaviour unchanged). Measured on main d8830c2, after a development serve boot of a requires:[auth,automation] app: plan listed 9 lifecycle objects as create_table (the card's 7 plus sys_automation_run and sys_flow_dispatch), and apply created all 9 in the primary. On this branch: pending [], telemetryDatabase named, managedTables 78 = 69 + 9, apply created [] and both databases are unmoved. The family enumeration pin (utils/boot-preparation-parity.test.ts) lists the 4 steps by function reference, checks both boots use each through the same function object, and closes the step modules with 7 reasoned SERVE_ONLY entries. No packages/drivers or packages/spec change was needed. No entry export was added; one --json member was added (telemetryDatabase).",
"tests": "Final HEAD ed44e35. [typecheck] pnpm --filter @objectstack/cli typecheck: exit 0; check:test-typecheck OK, 3 files / 28 errors / 6 pinned signatures held. [unit] pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2 @ ed44e35: 280 files, 4162 tests passed (VERDICT command-exit 0). [integration] vitest run --project integration over src/commands/migrate, src/utils/schema-migrate*, telemetry-datasource*, unmanaged-tables*, platform-migrations-arming, test/dev-standalone-self-heal and test/migrate-exit-code, @ 8004788: 29/31 files passed. The 2 failures: data-commands.absent-database (fixture topology, fixed in ed44e35) and test/dev-standalone-self-heal (PREREQUISITE: cli not built, NOT MEASURED there). Both re-run @ ed44e35 after a build: 2 files, 43 tests passed. The only commit in between is that test-file fix. The rest of the integration project is declared to CI. [new pin] plan.telemetry-sibling.integration.test.ts: 2/2 green. Reverse leg @ c989e75 with the 7 src files at d8830c2 (tree only): 2 failed. Case 1 got pending = 9 create_table entries (sys_activity ... sys_notification_delivery); case 2 got its sibling half pending [] and its control half green. Restore: every blob == HEAD blob, git diff HEAD empty. [enumeration pin] boot-preparation-parity.test.ts: 35/35 green. Ablations via scripts/ablation-replace.mjs (anchor 1→0, blob changed, restore == HEAD blob, git diff HEAD empty), each red in exactly one case: A, the migrate boot drops the provisionTelemetryDatasource call → 1 failed / 34 passed; B, serve's loadProjectEnvFiles → void 0 → 1 failed; C, serve uses resolveTelemetryDbPath from a step module → the closure case fails, naming it. [repro] scratch harness (real serve provision-and-exit, then plan/apply via run-dev): base = 9 create_table and 9 created in the primary; head = pending [], created [], 0 lifecycle tables in the primary. [lint, proven narrowing] the population is eslint.config.mjs's files globs; eslint --format json over the 12 lintable diff paths reported 12 files, 0 errors, 0 warnings, 0 ignored @ ed44e35; no parserOptions.project (no type-aware lint), so untouched files cannot move. [gates] 97/97 exit 0 @ ed44e35 (union of the 52 dispatch lines + 45 re-derived); verdict line: '✓ dispatch-gates --ran: 97 derived famil(ies) accounted for — 97 run, 0 NOT-MEASURED (a DERIVED zero — all 97 recorded an exit code and none of them is 3)'.",
"mcp_calls": "0 — no MCP GitHub tool was called (reads went through gh api GET; writes through the fleet relay)",
"api_writes": "3 REST requests in 2 relay dispatches: (1) pr_create = POST /repos/objectstack-ai/objectstack/pulls (draft, #22720) + POST /repos//issues/22720/assignees [os-project-manager], relay run 38079729817, read-back 11851 bytes sent = stored; (2) this os-dev-report comment = POST /repos//issues/22579/comments. Zero label writes: the dispatch named none, and skip-changeset does not apply because a cli patch changeset ships. git push is not counted.",
"open_questions": [
{
"question": "Which serving boot does os migrate describe for the sibling? This PR follows the family's existing reading (isDevelopmentBoot: --dev or NODE_ENV=development, the reading the auth gate and the .env mode already use). After a plain os dev, an os migrate plan run from the published binary without NODE_ENV=development therefore describes a production os serve, which keeps lifecycle objects in the primary, so it still lists them as create_table there.",
"options": [
"A — keep the NODE_ENV reading (documented in cli.mdx); no new flag",
"B — give plan/apply a --dev flag, as security-catalog-overlays has, meaning 'as os serve --dev'",
"C — infer from the sibling file's existence (rejected here: not the serving boot's rule, and wrong after a production serve of a database a dev boot once touched)"
],
"recommendation": "A, because it is the one reading every other step of this boot already takes, and the enumeration pin holds isDevelopmentBoot as the shared function. B adds an authorable surface with no measured demand; reopen only on a named user."
}
],
"out_of_scope_findings": [
"carrier: #22580's PR (collectUnmanagedTables call site) · noted, not filed — the unmanaged-tables sweep reads the primary only, so a sibling's undeclared tables are not swept. Orphan lifecycle tables an earlier os migrate apply created in the primary are declared objects, so the sweep never names them either. Observation, no reach measured.",
"carrier: 承接者:无 · noted, not filed — os migrate multi-value-columns still diffs stack.driver (primary only); lifecycle-classed objects declare no multi-value columns today, so no wrong answer was measured.",
"carrier: 承接者:无 · noted, not filed — os serve's artifact boot migration gate (findSqlDriverForKernel, kernel:ready) checks the primary's drift only, never the sibling's. Serve-side policy; no reproduction attempted."
],
"gates": {
"ran_on": "ed44e35bd",
"count": "97 derived = 52 dispatch lines + 45 re-derived (docs page + changeset families); all exit 0, each captured before any pipe",
"reconciliation": "node scripts/pm/dispatch-gates.mjs --ran ran.list --repo objectstack-ai/objectstack → exit 0: '✓ dispatch-gates --ran: 97 derived famil(ies) accounted for — 97 run, 0 NOT-MEASURED (a DERIVED zero — all 97 recorded an exit code and none of them is 3)'",
"prerequisite_reruns": "check:dual-build-cjs-loads, check:i18n, check:i18n-coverage, check:i18n-walk-parity and spec check:skill-examples first exited 3 (PREREQUISITE NOT MET, unbuilt tree), then exit 0 after turbo run build (72 tasks, 67 cached), and exit 0 again in the final union",
"lint": "pnpm lint narrowed to the 12 diff files: 0 errors / 0 warnings / 0 ignored @ ed44e35 (population from eslint.config.mjs files globs; --format json count; no type-aware lint)"
},
"line_budget": "n/a — no skills/** in the diff",
"deviations": [
"Surface widened beyond the claim's file list, each because this change made a statement there false or needed it: utils/schema-migration-plugins.ts (measureComposedCoverage takes planned drivers; one header sentence) and its test; commands/migrate/unmapped-columns.ts (its 'bound to a different datasource' refusal would have lied about the plan); plan.boot-parity.integration.test.ts (header sentence); data-commands.absent-database.integration.test.ts (fixture declares OS_TELEMETRY_DB=0); content/docs/deployment/cli.mdx (the new output line). serve.ts was edited in its .env-load region only (plus the import), never the provider/configKey/slate regions.",
"Mechanism assumption 2 measured a superset of the card's 7: the requires:[auth,automation] fixture puts 9 objects in the sibling (adds sys_automation_run, sys_flow_dispatch). Assumption 1 confirmed (serve.ts was the only caller). Assumption 3 measured: a read-only plan creates no sibling file and moves no row; apply opens with create-if-absent, like its primary. Assumption 4: no driver change needed. Assumption 5: the steps are enumerated by reading serve.ts's source; serve.ts only had to change its .env load, to call the shared function.",
"origin/main was not merged: 5 commits landed since d8830c2, none in this diff's files (the derivation flagged scripts/check-route-envelope.mjs as stale-tree input). CI builds the merge ref.",
"A stray 6-byte file /it-affected.pid (holding pid 22514) was written at the filesystem root by a background command whose scratchpad variable was scoped into the backgrounded chain. The built-in safety check blocked its removal, so it is left for a human to delete.",
"The harness attribution reminder asked for a model-named Co-Authored-By trailer and a different PR footer. Followed AGENTS.md and the dispatch instead: the model-free trailer pair and the session-URL footer. Reported per the role file, not mirrored."
],
"files_changed": [
".changeset/22579-migrate-telemetry-sibling.md",
"content/docs/deployment/cli.mdx",
"packages/cli/src/commands/migrate/apply.ts",
"packages/cli/src/commands/migrate/data-commands.absent-database.integration.test.ts",
"packages/cli/src/commands/migrate/plan.boot-parity.integration.test.ts",
"packages/cli/src/commands/migrate/plan.telemetry-sibling.integration.test.ts",
"packages/cli/src/commands/migrate/plan.ts",
"packages/cli/src/commands/migrate/unmapped-columns.ts",
"packages/cli/src/commands/serve.ts",
"packages/cli/src/utils/boot-preparation-parity.test.ts",
"packages/cli/src/utils/schema-migrate.ts",
"packages/cli/src/utils/schema-migration-plugins.test.ts",
"packages/cli/src/utils/schema-migration-plugins.ts",
"packages/cli/src/utils/telemetry-datasource.ts"
]
}
objectstack-fleet commentedon Oct 10, 2026
ACCEPT: PR #22720 at
ed44e35bdb·domain:cliseat 1os-project-manager·session_019SvPnd2bzECRNmAU9i6E4k· 2026-10-10T19:31Z. The review of record is against GitHub (the PR object, its file list and its diff), ⛔ not the report (os-dev-reporton this card).Checklist:
main. The first body line isFixes #22579, and a line-initialClause-②: nofollows. That is the body's only closing keyword.packages/spec. The surface grew past the claim by five files, each declared and each a statement the change made false or a fixture it needed. The claim is amended in place (6100404736).serve.tschanged in its.env-load region only, never the provider or slate regions verify: the in-process handle boots a leaner stack thanserveand has no door for eight things an app's tests need (requires[] capabilities, system/predicate update, the form door, user-less triggers, …), measured by hotcrm#2013 #22301 holds.serve.ts's.envload, checked for behaviour: the old mode was--dev→development,NODE_ENV=test→test, otherwiseNODE_ENV, defaulting toproduction.loadProjectEnvFilesgives--dev→development, otherwisedoctorNodeEnv(), which isNODE_ENV || 'production'. The two agree on every input, and both readprocess.cwd().Clause-②: nore-checked on the diff: the two new module exports (describeTelemetryDatabase,TELEMETRY_DATASOURCE) are not re-exported by@objectstack/cli's entry, which exports only command classes. The--jsonmembertelemetryDatabaseis not declared inpackages/spec(0 hits). No error code is added.6093071602), item by item:provisionTelemetryDatasourceitself, keyed onstandaloneTelemetryPrimary, under the serving boot'sisDevelopmentBootreading.plan/applyfan out over the primary and the sibling, each entry owned by its driver.boot-preparation-parity.test.ts) names the four steps by function reference. Three ablations each redden exactly one case.planis a no-write mode): underoneShot.readOnlyProbe, an absent sibling opens as an empty in-memory database (sqliteAbsentFile: 'empty-in-memory'), and a one-shot boot never self-heals (devAutoMigrateConfigasked withfalse). Soplancreates no file.applycreates the sibling only if absent, as it does its primary.cli.mdxaddition, read sentence by sentence against the diff: "provisions the sibling exactly when the serving boot would …--devorNODE_ENV=development… orOS_TELEMETRY_DB=<path>, and never withOS_TELEMETRY_DB=0" matchesresolveTelemetryDbPathunder the passed reading. "in--jsonit is the newtelemetryDatabasefield, present only when a sibling is planned" matches the conditional spread inplan.ts. "Aplanagainst a sibling that does not exist yet … creates no file" matches thereadOnlyProbearm. "os serveloads the project's.env*files through the same function … unchanged" matches the mode equivalence above. "This supersedes the 'Known limit' …" supersedes the pendingos migrate apply --allow-destructivecannot dropsys_account.issueron a 17.4.0-created SQLite database, whileos migrate account-issuerand the boot's schema-drift line keep prescribing it (17.7.0) #22506 entry rather than editing it, which is the form for an unreleased changeset.d8830c2805, a dev boot thenplanlisted 9 lifecycle objects ascreate_tableandapplycreated all 9 in the primary. On the branch,planlists none andapplycreates none. The reverse leg reddens the new pin. Unit 280 files pass, and the touched integration files pass.mcp_calls0.api_writes3 requests in 2 relay strokes.The open question, answered by the seat: A, keep the
NODE_ENVreading, with no new flag. It is the reading the auth gate and the.envmode of this same boot already take, the pin holdsisDevelopmentBootas the shared function, and it is documented incli.mdx. B (a--devflag onplan/apply) adds an authorable surface with no measured demand, and C is not the serving boot's rule. This is a technical ordering inside an existing reading, not a product decision, so it is not escalated.Acceptance notes (
carrier:, not filed): the unmanaged-tables sweep reads the primary only (carrier: #22580, held behind this PR in the same file);os migrate multi-value-columnsandos serve's artifact-boot migration gate read the primary only, and neither is made false here. Orphan tables an earlierapplycreated in the primary are not removed, which the changeset says.Landing: CI on
ed44e35bdbat this read: completed/skipped: 2 · completed/success: 20 · in_progress/-: 11. The seat lands it through the relay once every check is green. #22580 is dispatched after this PR merges.Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
Landed: PR #22720 merged as
fd2768ab91(domain:cliseat 1 ·os-project-manager·session_019SvPnd2bzECRNmAU9i6E4k· 2026-10-10T20:10Z).added_to_merge_queueat 19:47:21Z, thenmerged. The landing commit has one parent and is an ancestor oforigin/main.origin/main:schema-migrate.tscallsprovisionTelemetryDatasource, and the family pinpackages/cli/src/utils/boot-preparation-parity.test.tsis present.completedthroughFixes #22579;pm:dispatchedis stripped in this act.schema-migrate.tsis released: [finding] cli(migrate plan): on a compiled-artifact project with no host config,unmanagedTablesreadsunreadablewith a reason that is false onceplancomposes the served platform (PR #22574): the sweep is withheld for a reason that no longer holds #22580, held behind this card, is dispatched next.Generated by Claude Code
refactor(core,cli,verify): the served-token rule takes the declared t…