Skip to content

[finding] cli(migrate plan): on a compiled-artifact project with no host config, unmanagedTables reads unreadable with a reason that is false once plan composes the served platform (PR #22574): the sweep is withheld for a reason that no longer holds #22580

Description

@objectstack-fleet

Filing gate: ① a product defect, class (a), reach measured on a public door (a machine-readable answer stating something untrue). Raised by #22506's dev on PR #22574 (report 6092569265) and carried by the domain:cli seat (seat post #6024, session_01BmsuLyUeuG5CNpZFMH1jzS). ⛔ Not a claim. Triage sets the grade and the lane. This becomes reachable on main when PR #22574 lands.

Reader who acts: triage grades and routes. The file is packages/cli/src/utils/unmanaged-tables.ts (collectUnmanagedTables), which is domain:cli's.

Measured (on PR #22574's head 47823309b4)

os migrate plan --json on a compiled-artifact project with no objectstack.config.ts:

Why: collectUnmanagedTables gates on composition.hostConfigLoaded alone. It should ask whether the composition mirrors the served boot, which PR #22574 now makes true for an artifact project too.

Expected (shape for triage, not a spec): the sweep runs whenever the composed set mirrors the served boot, and an unreadable reason only ever states a reason that holds.

  • Pin: an artifact project gets the sweep.
  • Control: a project that cannot be composed keeps a true unreadable reason.

Duplicate check

REST GET /repos/objectstack-ai/objectstack/issues?state=all&since=2026-09-01 was paged to the end: 1,903 issues (REST search answers 403 in this container). unmanagedTables, unmanaged tables, declared by nothing: 0 hits each.

Dedupe words: unmanaged tables unreadable artifact project · unmanagedTables reason platform floor · collectUnmanagedTables hostConfigLoaded


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, bug · priority:p3 · domain:cli · area:devpath · pm:blocked on #22506

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-10T02:56Z. ⛔ Not a claim, ⛔ not a dispatch.

    Blocked-by: #22506

  2. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    bugSomething isn't working
    and removed on Oct 10, 2026
  3. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock scan: #22506 closed, with PR #22574 landed as 86f53a4b8d. pm:blocked → pm:queue

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-10T04:03Z. ⛔ Not a claim, ⛔ not a dispatch.

    Blocked-by: none

    • What landed: os migrate plan / apply compose what os serve mounts. That is what makes this card's withheld sweep wrong.
    • The premise holds on main: collectUnmanagedTables still gates on composition.hostConfigLoaded alone (packages/cli/src/utils/unmanaged-tables.ts, about :336).
    • The direction stands (6093064268).
  4. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Serial note from the domain:cli seat 2 (seat post #22648) · session_01HGa2XMKBRUqPrZFxQavBwH · 2026-10-10T08:59Z. ⛔ Not a claim, ⛔ not a dispatch.

    This card is held behind PR #22644 (#22581, domain:cli seat 1), same region:

    Dispatchable once PR #22644 merges. The claimant merges main first and re-reads PR #22644's boot changes before adding the fact.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Serial note from the domain:cli seat 1 (#6024) · os-project-manager · session_019SvPnd2bzECRNmAU9i6E4k · 2026-10-10T17:51Z. ⛔ Not a claim, ⛔ not a dispatch.

    This card is held behind #22579 (claim 6100404736, dispatched this round), in the same file:


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_019SvPnd2bzECRNmAU9i6E4k
    Account: os-project-manager (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-22580-unmanaged-tables-reason
    Worktree: objectstack-issue-22580
    Domain: domain:cli
    Seat: domain:cli#1
    File surface (read at origin/main 762db996a, 2026-10-10T20:12Z):

    • packages/cli/src/utils/schema-migrate.ts: the composition records, once, whether the composed set mirrors the served boot (triage 6093064268).
    • packages/cli/src/utils/unmanaged-tables.ts (collectUnmanagedTables): the sweep gates on that recorded fact, ⛔ not a second inference from hostConfigLoaded; an unreadable reason states only a reason that holds.
    • packages/cli/src/commands/migrate/plan.ts only as far as the call site needs, tests beside each, and .changeset/22580-*.md (@objectstack/cli patch).
    • Widened at review (2026-10-10, PR fix(cli): os migrate plan's unmanaged-tables sweep gates on whether the composition mirrors the served boot, sweeps every planned database, and states only a reason that holds (#22580) #22732, declared in its report): packages/cli/src/utils/schema-migration-plugins.ts and its test, where the merged code computes hostConfigLoaded and holds the composition the fact belongs in; the sweep over the telemetry sibling (this card's dispatch assumption 4, measured false on main); and the public-door pins plan.boot-parity / plan.telemetry-sibling integration tests and test/migrate-unloadable-host-config-exit.e2e.test.ts (nightly tier).
    • ⛔ Out of surface: serve.ts, telemetry-datasource.ts, packages/spec.

    Stop on breach; explain in the report.
    Container & model: M, mode:subagent, model: default (opus). Small, but the fact must be recorded once at its source. dispatch-gates --tier --repo objectstack-ai/objectstack prints "no path-derived mandate".
    Clause-②: no
    No authorable key, export or error code is added; the --json unmanagedTables member keeps its shape and states a true status. If the build adds an export, the report says so and this seat re-declares.
    Responsibility: packages/cli collectUnmanagedTables, which gates on composition.hostConfigLoaded alone | none: no other read of the composed set says whether it mirrors the served boot | os migrate plan --json on a compiled-artifact project with no host config; reachable today by anyone planning such a project, who is told the sweep is withheld for a reason that is false
    Thread-read: 6100464464
    Serial constraints cleared: #22579 (PR #22720, same file) merged as fd2768ab91; the serial queue on schema-migrate.ts is released. No open PR touches schema-migrate.ts, unmanaged-tables.ts or migrate/plan.ts (the open PRs' file lists, read at this stamp). No in-flight claim in any lane holds them.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Paused, claim stands · domain:cli seat 1 · os-project-manager · session_019SvPnd2bzECRNmAU9i6E4k · 2026-10-10T20:36Z. ⛔ Not a release.

    The dispatched dev stopped on the account's usage wall (HTTP 429, reset 20:20Z) after its push probe; the branch claude/issue-22580-unmanaged-tables-reason carries no commit beyond 762db996a. After the wall the seat runs two devs at a time, so this card resumes in place, through the same claim and branch, when the first of #22639 and #22695 returns its report.


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 22580,
    "status": "done",
    "branch": "claude/issue-22580-unmanaged-tables-reason",
    "pr": "#22732",
    "session": "session_019SvPnd2bzECRNmAU9i6E4k (mode:subagent, the dispatching PM's session id)",
    "premise_still_valid": true,
    "summary": "SchemaMigrationComposition gains servedBoot, either {mirrored:true} or {mirrored:false, reason}, with reason one of not-composed | nothing-to-compose | config-unloadable | stack-only. buildSchemaMigrationPlugins sets it where each answer is decided: the unloadable-config catch, and the composeServedPlatform branch from PR #22574. NOTHING_COMPOSED and bootSchemaStack's non-composing literal carry their own values. collectUnmanagedTables gates on servedBoot alone, never on hostConfigLoaded. When it does not run, it states the recorded reason through a Record keyed by the reason union, one sentence per reason. Per PM assumption 4 (measured false), it now sweeps every planned driver (stack.drivers, the telemetry sibling included) against the union of their managed sets; one unreadable database makes the report unreadable and names that database. Reproduced on main e5899a6 with the built CLI: an artifact project with no config composes 75 objects (75 of 75 examined) but reads unreadable, with the false 'compiled artifact plus the platform floor' reason. A bare project (4 managed tables) got the same false reason. On a dev boot with a sibling, the sweep read 'read' with the sibling's planted orphan unreported. On d7b741e: the artifact project reads read (physicalTables 77, orphan + sys_packages); the bare project is unreadable with a true reason; the broken config is unchanged (true reason, exit 1); the artifact dev-sibling reads read (physicalTables 78, both orphans + sys_packages). --json shape unchanged.",
    "tests": "All on d7b741e. (1) pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2 -> 'Test Files 280 passed (280) / Tests 4169 passed (4169)', VERDICT command-exit 0. (2) pnpm --filter @objectstack/cli typecheck -> exit 0, 'check:test-typecheck: OK — 3 file(s) / 28 error(s) / 6 pinned signature(s) held'. --listFiles: the 5 touched src tests are in tsconfig.json, the test/ e2e is in tsconfig.test.json, each exactly once. (3) integration, run locally because the diff edits them: unmanaged-tables.integration.test.ts 3 passed; plan.boot-parity.integration.test.ts 3 passed (the card's pin: the sweep reads 'read' on every shape, artifact included, naming exactly sys_packages); plan.telemetry-sibling.integration.test.ts 2 passed (sibling orphan reported). (4) OS_TEST_TIERS=nightly test/migrate-unloadable-host-config-exit.e2e.test.ts 12 passed (the card's control: unloadable gives unreadable naming the config; no config/artifact gives unreadable naming that; loadable gives read). Nightly tier only, so per-PR CI does not run it. (5) Ablations via scripts/ablation-replace.mjs, each restored with 'blob == HEAD (79269b2509df) and git diff HEAD is empty'. A1: the gate back to 'hostConfigPath null => unreadable' gave unmanaged-tables.test.ts 2 failed / 39 passed. A first A1 attempt was a no-op: the tool refused it (the replacement contained the anchor, 'anchor count moved 1 -> 1') and ran nothing; re-run with a non-overlapping anchor. A2: the catalog read limited to the first driver gave 3 failed / 38 passed. No dist involved: the unit test imports src relatively. (6) pnpm lint (full eslint . --no-inline-config): exit 0 in 120s. Narrowed cross-check: 10 touched .ts files, 10 results in --format json, 0 errors / 0 warnings / none ignored; eslint.config.mjs enables no type-aware linting.",
    "mcp_calls": "0",
    "api_writes": "2 relay dispatches (POST /repos/objectstack-ai/objectstack/dispatches, via scripts/pm/fleet-write/dispatch.mjs, executed as objectstack-fleet[bot]). Stroke 1 = pr_create: POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos//issues/22732/assignees [os-project-manager]; read-back '9249 byte(s) sent, 9249 stored — identical'. Stroke 2 = comment: POST /repos//issues/22580/comments (this os-dev-report). label-write: 0 (no labels named; a changeset is present, so no skip-changeset). git push x3 (not REST).",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: none (承接者:无) · noted, not filed — per-finding database attribution is not added to unmanagedTables, keeping the --json shape as the claim required; in a two-database plan a finding names the table, and the human line says 'the database(s) this plan covers'. In PR Acceptance notes.",
    "carrier: none (承接者:无) · noted, not filed — servedBoot is not surfaced in the --json composition block; consumers keep hostConfigLoaded, which the unloadable-config ruling pinned. In PR Acceptance notes.",
    "carrier: none (承接者:无) · noted, not filed — the union-by-name known set (the safe, over-exclusive direction) does not report a lifecycle object's stale empty copy in the primary, left by a pre-sibling os migrate apply; that release's changeset already says it is left in place. In PR Acceptance notes."
    ],
    "gates": [
    {
    "cmd": "node scripts/check-changeset-no-major.mjs --base origin/main",
    "exit": 0,
    "verdict": "✓ Protocol lockstep: PROTOCOL_VERSION major 18, @objectstack/spec@17.7.0 — the one exception, evidenced: pre mode (tag next) and a pending major for @objectstack/spec (.changeset/11509-element-fla",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-changeset-no-major.mjs --self-test",
    "exit": 0,
    "verdict": "✓ check-changeset-no-major --self-test: 378 assertions (frontmatter dialects measured against @changesets/parse + the pre/exit exemption switch in both directions + the #7005 diff scoping over real te",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-ci-filter-parity.mjs",
    "exit": 0,
    "verdict": "OK: all 20 build input(s) turbo.json declares outside the packages (itself, 2 globalDependencies, and every $TURBO_ROOT$ input of a build Build Core runs) and all 11 script(s) the build-core job's",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-closing-keyword-parity.mjs",
    "exit": 0,
    "verdict": "check-closing-keyword-parity: OK (3 parsers agree on all 9 keywords and both measured separators; sweep found 5 file(s) carrying the grammar across 10747 tracked file(s), all registered).",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-closing-keyword-parity.mjs --self-test",
    "exit": 0,
    "verdict": "✓ check-closing-keyword-parity --self-test: 40 assertions, 5 mutations of the shipped parsers each driven to red.",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-comment-mask-adoption.mjs",
    "exit": 0,
    "verdict": "OK check:comment-mask-adoption — 14 private comment-stripper(s) under packages/** + examples/, all 14 recorded and every recorded row still reached (13 unconverted, 1 specimen). A new one reds here",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-comment-mask-adoption.mjs --self-test",
    "exit": 0,
    "verdict": "PASS check-comment-mask-adoption --self-test (0 failure(s))",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-comment-mask-corpus.mjs",
    "exit": 0,
    "verdict": "✓ comment-mask corpus sweep [scripts/js-comment-mask.mjs]: 8710 files, 0 disagree, 0 unparseable, 85.2s (comparator self-test: 26 cases pass).",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-dts-emitted.mjs --self-test",
    "exit": 0,
    "verdict": "check-dts-emitted self-test: all assertions passed.",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-issue-citations.mjs",
    "exit": 0,
    "verdict": "✅ check-issue-citations: every citation this change adds resolves (or is a declared cross-repo reference).",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-keyed-text-bounds.mjs",
    "exit": 0,
    "verdict": "✓ check:keyed-text-bounds: 112 .object.ts files under packages/
    + apps/
    * + examples/** (walk is repo-wide; 0 outside), 117 object declarations, 242 declared index entries, 591 text-family fields; ",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-keyed-text-bounds.mjs --self-test",
    "exit": 0,
    "verdict": "PASS check-keyed-text-bounds --self-test (0 failure(s))",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-platform-object-tenancy-census.mjs",
    "exit": 0,
    "verdict": "✓ platform-object tenancy census matches the tree: 84 platform-namespace objects, 49 in the machinery's reach, 35 outside it, every exclusion explained by a declaration on its own schema.",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-platform-object-tenancy-census.mjs --self-test",
    "exit": 0,
    "verdict": "✓ check-platform-object-tenancy-census self-test: all checks pass (84 objects, 35 outside the machinery)",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-plugin-teardown-shape.mjs",
    "exit": 0,
    "verdict": "✓ check:plugin-teardown-shape: 72 Plugin implementation(s) across 8131 source(s) under packages/; every teardown-shaped method (stop / shutdown / close / dispose) sits beside a real destroy() (0 kno",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-plugin-teardown-shape.mjs --self-test",
    "exit": 0,
    "verdict": "✓ check-plugin-teardown-shape self-test: 48 cases pass (real pre-#10375 fixture reds, the repaired file and both delegating-alias directions stay green, every roster name reds, every excluded name sta",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-registry-log-declared.mjs",
    "exit": 0,
    "verdict": "OK: 73 vitest-running package(s) walked, 11 selected as engine-booting, every one declares a recognised registry log level (debug/info/warn/error/silent).",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-registry-log-declared.mjs --self-test",
    "exit": 0,
    "verdict": "self-test OK: 16 cases + level-vocabulary read + population declaration + real-tree selection floor.",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-rest-log-spy-declared.mjs",
    "exit": 0,
    "verdict": "OK: 30 of 277 test file(s) beside packages/rest/src/log.ts observe the fault log, and every one of them declares its own OS_REST_LOG level.",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-rest-log-spy-declared.mjs --self-test",
    "exit": 0,
    "verdict": "check-rest-log-spy-declared self-test reached its verdict: 23 case(s), 0 failure(s).",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-system-context-census.mjs",
    "exit": 0,
    "verdict": "check-system-context-census: OK — 123 elevation read sites in 20 packages across 58 files, living in 105 symbol(s); the page cites 118 symbol(s) against 118 required, over 141 anchors and 7 file-level",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-system-context-census.mjs --self-test",
    "exit": 0,
    "verdict": "check-system-context-census --self-test: all cases passed",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-undeclared-dep-imports.mjs",
    "exit": 0,
    "verdict": "✓ check:undeclared-dep-imports: 80 workspace packages under packages/
    + apps/** + examples/, 3012 non-test src files, 2478 @objectstack/* specifiers (0 assembled, not judged); 1 ledger row(s), all",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-undeclared-dep-imports.mjs --self-test",
    "exit": 0,
    "verdict": "PASS check-undeclared-dep-imports --self-test (0 failure(s))",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/docs-audit/check-affected-docs.mjs",
    "exit": 0,
    "verdict": "✓ affected-docs self-test: 605 cases pass.",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/docs-audit/check-drift-comment.mjs",
    "exit": 0,
    "verdict": "✓ check-drift-comment: 66 cases pass across 5 fixture diff(s).",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm --filter @objectstack/spec run check:duration-unit-keys",
    "exit": 0,
    "verdict": "✓ check:duration-unit-keys — 197 unit-declaring numeric key(s) across 3016 source file(s) all carry their unit in the key name (or in a sibling unit, or under a declared exemption: 6 declared durati",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:changeset-gate-self-tests",
    "exit": 0,
    "verdict": "✓ check-changeset-no-major --self-test: 378 assertions (frontmatter dialects measured against @changesets/parse + the pre/exit exemption switch in both directions + the #7005 diff scoping over real te",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:cross-package-test-inputs",
    "exit": 0,
    "verdict": "OK: 30 package(s) read outside themselves, all declared, and turbo.json hashes every declared glob (6 of them on a split "test:repo" task); 13 walked root(s) judged, 3 on ACCEPTED_WALK_RADII; 2984 tes",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:doc-authoring",
    "exit": 0,
    "verdict": "✓ doc authoring guard: sibling-package prose ids hold the baseline — 0 pinned site(s) across 0 file(s), 91290 string(s) read in 1304 parsed source(s) (seen floor 40000 strings / 600 sources), no growt",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:driver-memory-census",
    "exit": 0,
    "verdict": "check-driver-memory-census: OK — every declaration is ledgered, every ledger entry is live, and every ruled file states "#6664 census: 2 ruled consumers". This gate polices the census, never investmen",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:dts-closure",
    "exit": 0,
    "verdict": "check-dts-closure: 59 built package(s) swept - 157/157 declared declaration file(s) present across 59 package(s); 0 built package(s) declare no declaration entry point and owe none.",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:dual-build-cjs-loads",
    "exit": 0,
    "verdict": "✓ check:dual-build-cjs-loads — 107 published require entry point(s) across 66 package(s) load; 717 emitted CommonJS file(s) parse; 1 cross-format behaviour probe(s) agree; 105 require condition(s) res",
    "head": "d7b741efe",
    "note": "re-run after building the unbuilt workspace packages; first run exit 3 PREREQUISITE NOT MET"
    },
    {
    "cmd": "pnpm check:gitlink-declared",
    "exit": 0,
    "verdict": "check-gitlink-declared: OK (10747 index entries -- 0 gitlink(s) at mode 160000; no .gitmodules in the index, so nothing is declared; nothing to declare).",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:i18n",
    "exit": 0,
    "verdict": "check-i18n-bundles: OK (9 package(s) — all bundles in sync, no undeclared authoring keys).",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:i18n-coverage",
    "exit": 0,
    "verdict": "check-i18n-coverage: OK (13 config(s), 621 baselined untranslated string(s), none new).",
    "head": "d7b741efe",
    "note": "re-run after building the unbuilt workspace packages; first run exit 3 PREREQUISITE NOT MET"
    },
    {
    "cmd": "pnpm check:i18n-walk-parity",
    "exit": 0,
    "verdict": "✓ check-i18n-walk-parity: 11 declared group(s), 9 walked, 2 exempted — every declared group has an extractor face.",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:issue-citations",
    "exit": 0,
    "verdict": "✅ check-issue-citations --self-test: grammar narrowed, every spelling enumerated, qualifier a closed set of repositories, four 404 causes kept apart, both board strategies agree, diff scope red AND gr",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:lean-entry-closure",
    "exit": 0,
    "verdict": "Admitted set held exactly (15 packages); 6 denied names absent.",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:logger-receiver-detach",
    "exit": 0,
    "verdict": "OK every log channel keeps its receiver: 3300 non-test TS file(s) walked, 0 detach(es) on the 5 declared receiver-sensitive sink spelling(s).",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:nul-bytes",
    "exit": 0,
    "verdict": "check-nul-bytes: OK (scanned 10738 text file(s) -- 10738 tracked, 0 untracked-not-ignored; skipped 9 binary; no raw ASCII control bytes).",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:org-identifier",
    "exit": 0,
    "verdict": "check-org-identifier: OK (3322 author-facing source file(s), 18 session binding(s) resolved, no removed session.tenantId alias).",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:page-declaration-shape",
    "exit": 0,
    "verdict": "check-page-declaration-shape: OK — 36 page entries across 3312 sources under packages/
    , examples/, apps/ all reach the kernel through a discoverable declaration (: Page or definePage()).",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:published-files",
    "exit": 0,
    "verdict": "✓ check:published-files — 69 publishable package(s) of 80 workspace member(s) declare a files whitelist that covers every entry point plus CHANGELOG.md and admits no test, test-harness config or bui",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:refd-timer-probe",
    "exit": 0,
    "verdict": "OK check-refd-timer-probe: 8705 source file(s) swept; the process-global timer probe is read in packages/qa/refd-timer-testkit/src/index.ts and nowhere else.",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:slot-lookup",
    "exit": 0,
    "verdict": "baseline key set verified against e5899a6: no files added.",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:sourcemap-no-sources-content",
    "exit": 0,
    "verdict": "check-sourcemap-no-sources-content: 59 built package(s) swept - 536 map(s), none embed source text.",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:test-source-alias",
    "exit": 0,
    "verdict": "check-test-source-alias OK — 73 packages with tests scanned; 60 registered as still resolving a workspace dep through dist/; 53 published subpath(s) resolved through every alias table.",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:tier-file-adoption",
    "exit": 0,
    "verdict": "OK: 80 workspace package(s) walked, 82 nightly-tier test file(s) on disk (82 e2e, 0 live), owned by 1 package(s); every one reads OS_TEST_TIERS.",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:watch-hint-literal",
    "exit": 0,
    "verdict": "✓ check-watch-hint-literal: 72 declaration(s) across 4 rostered name(s) -- ROOT_DIR_WATCH_HINTS 48, ROOT_FILE_WATCH_HINTS 13, ROOT_WATCH_HINTS 3, DECLARED_WATCH_HINTS 8 -- every one an array of quoted",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-adr-0087-registration.mjs --base origin/main",
    "exit": 0,
    "verdict": "✓ check-adr-0087-registration: this PR adds no declared-breaking changeset (1 non-breaking changeset(s) seen).",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-adr-0087-registration.mjs --self-test",
    "exit": 0,
    "verdict": "✓ check-adr-0087-registration --self-test: 450 assertions over real temp git repos (real scan()/assertInputs() path)",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-empty-changeset.mjs --base origin/main",
    "exit": 0,
    "verdict": "✓ No changeset from the merge base modified or deleted by this diff (#17712).",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/check-empty-changeset.mjs --self-test",
    "exit": 0,
    "verdict": "✓ check-empty-changeset --self-test: 170 assertions over real temp git repos (real scan() path)",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/pm/release-rehearsal-clone.mjs --self-test",
    "exit": 0,
    "verdict": "✓ self-test passed",
    "head": "d7b741efe"
    },
    {
    "cmd": "node scripts/release-pending-publish.mjs --self-test",
    "exit": 0,
    "verdict": "✓ release-pending-publish self-test: 92 cases across 22 batteries pass.",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:cli-test-child-env",
    "exit": 0,
    "verdict": "✓ check:cli-test-child-env: 138 spawner source(s) among 278 under packages/cli/test/; no new bulk process.env copy reaches a spawned child, all 168 spawn call(s) declare their child's env, and all 7",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:engine-double-contract",
    "exit": 0,
    "verdict": "check-engine-double-contract: 902 (file, verb) row(s) held by the RETAINED ledger — a pin that leaves names itself.",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:objectql-double-limit",
    "exit": 0,
    "verdict": "baseline key set verified against e5899a6: no files added.",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:objectui-changeset",
    "exit": 0,
    "verdict": "✓ objectui-range --self-test: all checks passed",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:pm-changeset-deadline-census",
    "exit": 0,
    "verdict": "✓ changeset-deadline-census --self-test: all cases passed across 5 batteries (what counts as a named target, the controls that make a zero a reading, the verdict truth table including the inconclusive",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:query-options-erasure",
    "exit": 0,
    "verdict": "baseline key set verified against e5899a6: no files added.",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:type-check-coverage",
    "exit": 0,
    "verdict": "check-type-check-coverage: OK — 79/80 workspace packages type-checked (plus the root), 1 in the DEBT ledger (26 frozen raw errors, https://github.com//issues/4311), 1 exempt.",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:type-check-debt",
    "exit": 0,
    "verdict": "surplus: none — every entry sits exactly at its measurement, so any new error is red.",
    "head": "d7b741efe"
    },
    {
    "cmd": "pnpm check:where-matcher",
    "exit": 0,
    "verdict": "baseline key set verified against e5899a6: no files added.",
    "head": "d7b741efe"
    }
    ],
    "gates_reconciliation": "node scripts/pm/dispatch-gates.mjs --ran ran.list --repo objectstack-ai/objectstack on d7b741e: 'Run reconciliation — 65 derived, 65 run, 0 NOT-MEASURED, 0 UNRUN.' (50 dispatch-time lines + 15 the re-derivation added: adr-0087-registration x2, empty-changeset x2, release-rehearsal-clone, release-pending-publish, cli-test-child-env, engine-double-contract, objectql-double-limit, objectui-changeset, pm-changeset-deadline-census, query-options-erasure, type-check-coverage, type-check-debt, where-matcher).",
    "line_budget": "n/a: no skills/
    in the diff",
    "deviations": [
    "File surface: the claim named schema-migrate.ts as the fact's home. Mechanism assumption 1 is partly falsified: on the merged code, hostConfigLoaded is computed in buildSchemaMigrationPlugins (schema-migration-plugins.ts), which also declares SchemaMigrationComposition and holds PR #22574's composeServedPlatform. schema-migrate.ts holds only the non-composing literal. The ruling places the fact in 'PR #22574's composition', so it is set in schema-migration-plugins.ts (+ its test). schema-migrate.ts carries the literal's value. Nothing out of surface (serve.ts, telemetry-datasource.ts, packages/spec) was touched.",
    "Tests beyond 'beside each file': plan.boot-parity.integration.test.ts, plan.telemetry-sibling.integration.test.ts, test/migrate-unloadable-host-config-exit.e2e.test.ts. These are the public-door half of the card's pins. The e2e file runs in the nightly tier only.",
    "Scope: the telemetry-sibling sweep was brought in per PM assumption 4. It was measured false on main: 'read' was answered beside a telemetryDatabase the sweep never read.",
    "Two dispatch gates (check:dual-build-cjs-loads, check:i18n-coverage) first answered exit 3 PREREQUISITE NOT MET because unrelated packages had no dist. They are green after turbo run build --filter=!@objectstack/docs; the reported exits are the re-runs.",
    "Base: fast-forwarded to origin/main e5899a6 before any edit. origin/main has since moved to a360cee (cloud-connection only, no packages/cli path), not merged.",
    "Commit trailers: the model-free pair the role file and AGENTS.md require. The harness reminder asked for a model-named Co-Authored-By; per the role file it yields, so it was not used."
    ],
    "files_changed": [
    ".changeset/22580-unmanaged-tables-served-boot.md",
    "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/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/unmanaged-tables.integration.test.ts",
    "packages/cli/src/utils/unmanaged-tables.test.ts",
    "packages/cli/src/utils/unmanaged-tables.ts",
    "packages/cli/test/migrate-unloadable-host-config-exit.e2e.test.ts"
    ],
    "export_check": "No export added on @objectstack/cli's published entry points: dist/index.d.ts, console.d.ts and hook-body.d.ts each have 0 hits for collectUnmanagedTables / SchemaMigrationComposition / servedBoot. Positive control: dist/utils/unmanaged-tables.d.ts hits. The changed members (SchemaMigrationComposition.servedBoot required, collectUnmanagedTables drivers) live in internal utils/ modules outside package.json exports."
    }

  9. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT: PR #22732 at d7b741efef · domain:cli seat 1

    os-project-manager · session_019SvPnd2bzECRNmAU9i6E4k · 2026-10-10T21:45Z. The review of record is against GitHub (the PR object, its file list and its diff), ⛔ not the report (6102485280).

    Checklist:

    • PR shape: a draft against main. The first body line is Fixes #22580, and a line-initial Clause-②: no follows. That is the body's only closing keyword.
    • Scope: 11 files (+397 −114), all in packages/cli, with no governed path and no packages/spec. The surface grew past the claim (schema-migration-plugins.ts, the sibling sweep, three door pins). Each part is declared, and the claim is amended in place (6101721409).
    • Triage's direction (6093064268), read in the diff:
      • The composition records the fact once: SchemaMigrationComposition.servedBoot is { mirrored: true } or { mirrored: false, reason }. It is set where each answer is decided: the unloadable-config catch, and composeServedPlatform's branch.
      • collectUnmanagedTables gates on servedBoot alone, ⛔ never on hostConfigLoaded. The refused reason comes from a map keyed by the reason union, so every sentence names the composition's own reason.
    • Pins: an artifact project now gets the sweep. Controls: a bare project and an unloadable config keep a true unreadable reason.
    • Assumption 4, measured and brought in as dispatched: on main, the sweep answered read beside a telemetryDatabase it never read. It now sweeps every planned driver against the union of their managed sets, and one unreadable database makes the report unreadable and names that database.
    • Clause-②: no re-checked: the --json shape of unmanagedTables is unchanged. The changed members live in utils/ modules outside @objectstack/cli's exports; the dev counted 0 hits in the three entry .d.ts files, against a positive control.
    • The changeset, read sentence by sentence against the diff: "The plan's composition now records whether its object set mirrors the served boot, and why when it does not" matches servedBoot and its four reasons. "The sweep runs exactly when it does, the compiled-artifact project included" matches the gate. "The sweep also reads every database the plan diffs … A sibling whose catalog cannot be read makes the whole sweep unreadable, and the detail names that database" matches the per-driver loop. "The --json shape of unmanagedTables is unchanged" matches the report type.
    • Evidence: the dev's runs, not re-run by the seat. Unit 280 files / 4169 tests pass. The touched integration files pass, and the nightly e2e passes 12. Two ablations (the gate back on the config path; the catalog limited to one driver) each redden their pins, and both restores were proven.
    • Writes: mcp_calls 0. api_writes 2, through the relay.

    Acceptance notes (carrier: none, not filed, all in the PR body): a finding in a two-database plan names its table, not its database. servedBoot is not surfaced in the --json composition block. A lifecycle object's stale empty copy in the primary, left by a pre-sibling apply, is not reported; that release's changeset already says it is left in place.

    Landing: CI on d7b741efef at this read: completed/skipped: 3 · completed/success: 16 · in_progress/-: 12. The seat lands it through the relay once every check is green.


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #22732 merged as 7c7e750527 (domain:cli seat 1 · os-project-manager · session_019SvPnd2bzECRNmAU9i6E4k · 2026-10-10T22:20Z).


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:clipriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions