Repository navigation
nightly-tiers: red on main #27114
Description
os-nightly-tiers — machine-findable marker for this generated card. ⛔ Do not delete this line: it is how the nightly finds this card instead of filing a new one every night.
nightly-tiers: red on main
Swept 2026-10-30T06:15:03.610Z · expected every 24h while this card stands (cron 29 5 * * * UTC) · next by 2026-10-31T05:29Z · run log · commit bacb3e6a0ff6e8bfdeade49d6830e34fb5522589 · trigger schedule · tiers job result failure.
The Swept line above is this nightly's heartbeat, and it states the cadence that makes
「stalled」 decidable: while the tiers stay red this card is refreshed on that schedule, so a
timestamp still sitting there past the next by deadline means either the standing caller
died or the nightly went green — nothing here files or closes anything on green, so both
readings end at this card. ⛔ Do not carry a cadence over from a sibling patrol anchor: they
differ by up to 4× and each states its own.
The e2e and live test tiers — the files named *.e2e.test.* and *.live.test.* — run here
nightly on main under OS_TEST_TIERS=nightly and nowhere else (the per-PR and merge-queue
Test Core runs under queue). A red here is a real suite that no pull request will red on;
this card is the channel that sees it. Nothing is blocked by it.
⛔ The remedy is never to rename, skip or delete the failing test to make the nightly green.
Reproduce locally with OS_TEST_TIERS=nightly pnpm --filter <pkg> test, fix what it names, and
let the next nightly refresh this card.
Failing files
examples/app-showcase/test/console-live-specs.live.test.tsexamples/app-showcase/test/showcase-smoke.live.test.ts
shard-1 — last lines of the test log
@objectstack/example-showcase:test: (Use `node --trace-warnings ...` to show where the warning was created)
@objectstack/example-showcase:test: ✓ 40 [chromium] › e2e/showcase-smoke.spec.ts:154:7 › surface renders cleanly: Business Units (2.4s)
@objectstack/example-showcase:test: ✓ 41 [chromium] › e2e/showcase-smoke.spec.ts:154:7 › surface renders cleanly: Cascading Select (2.6s)
@objectstack/example-showcase:test: ✓ 42 [chromium] › e2e/showcase-smoke.spec.ts:154:7 › surface renders cleanly: In-Progress Tasks (2.5s)
@objectstack/example-showcase:test: ✓ 13 [chromium] › e2e/live/required-when-submit.spec.ts:14:1 › requiredWhen blocks submit with a field error, and relaxes when FALSE (7.0s)
@objectstack/example-showcase:test: ✓ 14 [chromium] › e2e/live/summary-rollup.spec.ts:25:1 › SUM/COUNT roll-up is computed server-side on atomic create (290ms)
@objectstack/example-showcase:test: ✓ 15 [chromium] › e2e/live/summary-rollup.spec.ts:42:1 › roll-up recomputes when a child is added then deleted (254ms)
@objectstack/example-showcase:test: ✓ 43 [chromium] › e2e/showcase-smoke.spec.ts:154:7 › surface renders cleanly: Urgent Tasks (2.5s)
@objectstack/example-showcase:test: ✓ 44 [chromium] › e2e/showcase-smoke.spec.ts:154:7 › surface renders cleanly: In-Review Tasks (2.9s)
@objectstack/example-showcase:test: ✓ 16 [chromium] › e2e/live/user-filters.spec.ts:24:3 › ADR-0053 interface mode — Task Triage tabs element › filter tabs render exclusively, persist to URL, and restore on reload (6.5s)
@objectstack/example-showcase:test: ✓ 45 [chromium] › e2e/showcase-smoke.spec.ts:154:7 › surface renders cleanly: Revenue Pulse (3.7s)
@objectstack/example-showcase:test: ✓ 46 [chromium] › e2e/showcase-smoke.spec.ts:154:7 › surface renders cleanly: Task List (2.9s)
@objectstack/example-showcase:test: ✓ 17 [chromium] › e2e/live/user-filters.spec.ts:46:3 › ADR-0047 data mode — viz dropdown › visualization switcher is a single dropdown offering the whitelist (4.2s)
@objectstack/example-showcase:test: ✓ 47 [chromium] › e2e/showcase-smoke.spec.ts:154:7 › surface renders cleanly: Hours by Status (Chart) (3.4s)
@objectstack/example-showcase:test: ✓ 18 [chromium] › e2e/live/user-filters.spec.ts:71:3 › ADR-0047 interface mode — Task Workbench › locked surface: dropdowns only, no view tabs, no switcher (3.6s)
@objectstack/example-showcase:test: ✓ 48 [chromium] › e2e/showcase-smoke.spec.ts:154:7 › surface renders cleanly: Styling Gallery (2.5s)
@objectstack/example-showcase:test: ✓ 19 [chromium] › e2e/live/user-filters.spec.ts:81:3 › ADR-0047 interface mode — Task Workbench › grid renders data columns even when the source view is hollow (3.0s)
@objectstack/example-showcase:test: ✓ 49 [chromium] › e2e/showcase-smoke.spec.ts:154:7 › surface renders cleanly: Page Variables (2.5s)
@objectstack/example-showcase:test: ✓ 50 [chromium] › e2e/showcase-smoke.spec.ts:154:7 › surface renders cleanly: Contact Form (2.3s)
@objectstack/example-showcase:test: ✓ 20 [chromium] › e2e/live/user-filters.spec.ts:98:3 › ADR-0047 interface mode — Task Workbench › dropdown selection filters, keeps counts, persists, and restores (5.7s)
@objectstack/example-showcase:test:
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: 1) [chromium] › e2e/live/record-history-display.spec.ts:62:1 › the timeline stream's Changes chip shows display values (localized dates, option labels, resolved lookups, real actor) instead of raw audit payloads
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: TimeoutError: locator.waitFor: Timeout 15000ms exceeded.
@objectstack/example-showcase:test: Call log:
@objectstack/example-showcase:test: - waiting for getByRole('region', { name: /^(Timeline|时间线)$/ }).locator('[data-stream-filter="changes"]') to be visible
@objectstack/example-showcase:test:
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: 90 | const stream = page.getByRole('region', { name: /^(Timeline|时间线)$/ });
@objectstack/example-showcase:test: 91 | const changesChip = stream.locator('[data-stream-filter="changes"]');
@objectstack/example-showcase:test: > 92 | await changesChip.waitFor({ state: 'visible', timeout: 15_000 });
@objectstack/example-showcase:test: | ^
@objectstack/example-showcase:test: 93 | await changesChip.click();
@objectstack/example-showcase:test: 94 | await expect(changesChip).toHaveAttribute('aria-pressed', 'true');
@objectstack/example-showcase:test: 95 | // The three UPDATE entries render as change lines; wait for the latest one.
@objectstack/example-showcase:test: at /home/runner/work/objectstack/objectstack/ui/e2e/live/record-history-display.spec.ts:92:21
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
@objectstack/example-showcase:test: test-results/record-history-display-the-cf456-stead-of-raw-audit-payloads-chromium/test-failed-1.png
@objectstack/example-showcase:test: ────────────────────────────────────────────────────────────────────────────────────────────────
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: attachment #2: video (video/webm) ──────────────────────────────────────────────────────────────
@objectstack/example-showcase:test: test-results/record-history-display-the-cf456-stead-of-raw-audit-payloads-chromium/video.webm
@objectstack/example-showcase:test: ────────────────────────────────────────────────────────────────────────────────────────────────
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: Error Context: test-results/record-history-display-the-cf456-stead-of-raw-audit-payloads-chromium/error-context.md
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: 1 failed
@objectstack/example-showcase:test: [chromium] › e2e/live/record-history-display.spec.ts:62:1 › the timeline stream's Changes chip shows display values (localized dates, option labels, resolved lookups, real actor) instead of raw audit payloads
@objectstack/example-showcase:test: 19 passed (2.0m)
@objectstack/example-showcase:test: ELIFECYCLE Command failed with exit code 1.
@objectstack/example-showcase:test: ✓ 51 [chromium] › e2e/showcase-smoke.spec.ts:154:7 › surface renders cleanly: Command Center (JSX) (2.1s)
@objectstack/example-showcase:test: �[31m❯�[39m test/console-live-specs.live.test.ts �[2m(�[22m�[2m1 test�[22m�[2m | �[22m�[31m1 failed�[39m�[2m)�[22m�[33m 156569�[2mms�[22m�[39m
@objectstack/example-showcase:test: �[31m �[31m�[31m every spec in ui's test:e2e:live:nightly passes against the workspace backend�[39m�[33m 156567�[2mms�[22m�[39m
@objectstack/example-showcase:test: ✓ 52 [chromium] › e2e/showcase-smoke.spec.ts:154:7 › surface renders cleanly: CRM Workbench (1.3s)
@objectstack/example-showcase:test: ✓ 53 [chromium] › e2e/showcase-smoke.spec.ts:154:7 › surface renders cleanly: Task Desk (1.3s)
@objectstack/example-showcase:test: ✓ 54 [chromium] › e2e/showcase-smoke.spec.ts:154:7 › surface renders cleanly: Renewals Pipeline (1.3s)
@objectstack/example-showcase:test:
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: 1) [chromium] › e2e/detail-shapes.spec.ts:156:5 › ungrouped + related-heavy: flat details and related-list tabs on Contoso
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: Error: expect(locator).toBeVisible() failed
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: Locator: getByRole('tab', { name: /Details/i })
@objectstack/example-showcase:test: Expected: visible
@objectstack/example-showcase:test: Timeout: 5000ms
@objectstack/example-showcase:test: Error: element(s) not found
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: Call log:
@objectstack/example-showcase:test: - Expect "toBeVisible" getByRole('tab', { name: /Details/i }) with timeout 5000ms
@objectstack/example-showcase:test: - waiting for getByRole('tab', { name: /Details/i })
@objectstack/example-showcase:test:
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: 171 | // Related lists surface as tabs (ADR-0085 prominence rule).
@objectstack/example-showcase:test: 172 | const detailsTab = page.getByRole('tab', { name: /Details/i });
@objectstack/example-showcase:test: > 173 | await expect(detailsTab).toBeVisible();
@objectstack/example-showcase:test: | ^
@objectstack/example-showcase:test: 174 | const invoicesTab = page.getByRole('tab', { name: /Invoices/i });
@objectstack/example-showcase:test: 175 | const projectsTab = page.getByRole('tab', { name: /Projects/i });
@objectstack/example-showcase:test: 176 | await expect(invoicesTab).toBeVisible();
@objectstack/example-showcase:test: at /home/runner/work/objectstack/objectstack/examples/app-showcase/e2e/detail-shapes.spec.ts:173:28
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
@objectstack/example-showcase:test: test-results/detail-shapes-ungrouped-re-49c76-elated-list-tabs-on-Contoso-chromium/test-failed-1.png
@objectstack/example-showcase:test: ────────────────────────────────────────────────────────────────────────────────────────────────
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: Error Context: test-results/detail-shapes-ungrouped-re-49c76-elated-list-tabs-on-Contoso-chromium/error-context.md
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: Error: expect(locator).toBeVisible() failed
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: Locator: getByRole('tab', { name: /Details/i })
@objectstack/example-showcase:test: Expected: visible
@objectstack/example-showcase:test: Timeout: 5000ms
@objectstack/example-showcase:test: Error: element(s) not found
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: Call log:
@objectstack/example-showcase:test: - Expect "toBeVisible" getByRole('tab', { name: /Details/i }) with timeout 5000ms
@objectstack/example-showcase:test: - waiting for getByRole('tab', { name: /Details/i })
@objectstack/example-showcase:test:
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: 171 | // Related lists surface as tabs (ADR-0085 prominence rule).
@objectstack/example-showcase:test: 172 | const detailsTab = page.getByRole('tab', { name: /Details/i });
@objectstack/example-showcase:test: > 173 | await expect(detailsTab).toBeVisible();
@objectstack/example-showcase:test: | ^
@objectstack/example-showcase:test: 174 | const invoicesTab = page.getByRole('tab', { name: /Invoices/i });
@objectstack/example-showcase:test: 175 | const projectsTab = page.getByRole('tab', { name: /Projects/i });
@objectstack/example-showcase:test: 176 | await expect(invoicesTab).toBeVisible();
@objectstack/example-showcase:test: at /home/runner/work/objectstack/objectstack/examples/app-showcase/e2e/detail-shapes.spec.ts:173:28
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
@objectstack/example-showcase:test: test-results/detail-shapes-ungrouped-re-49c76-elated-list-tabs-on-Contoso-chromium-retry1/test-failed-1.png
@objectstack/example-showcase:test: ────────────────────────────────────────────────────────────────────────────────────────────────
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: Error Context: test-results/detail-shapes-ungrouped-re-49c76-elated-list-tabs-on-Contoso-chromium-retry1/error-context.md
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
@objectstack/example-showcase:test: test-results/detail-shapes-ungrouped-re-49c76-elated-list-tabs-on-Contoso-chromium-retry1/trace.zip
@objectstack/example-showcase:test: Usage:
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: pnpm exec playwright show-trace test-results/detail-shapes-ungrouped-re-49c76-elated-list-tabs-on-Contoso-chromium-retry1/trace.zip
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: ────────────────────────────────────────────────────────────────────────────────────────────────
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: 1 failed
@objectstack/example-showcase:test: [chromium] › e2e/detail-shapes.spec.ts:156:5 › ungrouped + related-heavy: flat details and related-list tabs on Contoso
@objectstack/example-showcase:test: 52 passed (2.7m)
@objectstack/example-showcase:test: �[31m❯�[39m test/showcase-smoke.live.test.ts �[2m(�[22m�[2m1 test�[22m�[2m | �[22m�[31m1 failed�[39m�[2m)�[22m�[33m 160252�[2mms�[22m�[39m
@objectstack/example-showcase:test: �[31m �[31m�[31m every Playwright test in e2e/ passes against the real showcase stack�[39m�[33m 160250�[2mms�[22m�[39m
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: �[31m⎯⎯⎯⎯⎯⎯⎯�[39m�[1m�[41m Failed Tests 2 �[49m�[22m�[31m⎯⎯⎯⎯⎯⎯⎯�[39m
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: �[41m�[1m FAIL �[22m�[49m test/console-live-specs.live.test.ts�[2m > �[22mConsole live specs outside the required job (live tier)�[2m > �[22mevery spec in ui's test:e2e:live:nightly passes against the workspace backend
@objectstack/example-showcase:test: �[31m�[1mAssertionError�[22m: 1 of 20 Console live test(s) failed, 0 run-level error(s): expected { …(2) } to deeply equal { failing: [], errors: [] }�[39m
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: �[32m- Expected�[39m
@objectstack/example-showcase:test: �[31m+ Received�[39m
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: �[2m {�[22m
@objectstack/example-showcase:test: �[2m "errors": [],�[22m
@objectstack/example-showcase:test: �[32m- "failing": [],�[39m
@objectstack/example-showcase:test: �[31m+ "failing": [�[39m
@objectstack/example-showcase:test: �[31m+ "record-history-display.spec.ts › the timeline stream's Changes chip shows display values (localized dates, option labels, resolved lookups, real actor) instead of raw audit payloads",�[39m
@objectstack/example-showcase:test: �[31m+ ],�[39m
@objectstack/example-showcase:test: �[2m }�[22m
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: �[36m �[2m❯�[22m test/console-live-specs.live.test.ts:�[2m233:11�[22m�[39m
@objectstack/example-showcase:test: �[90m231|�[39m 'Console build not served, browser not launchable) bef…
@objectstack/example-showcase:test: �[90m232|�[39m �[33m:�[39m �[32m''�[39m)�[33m,�[39m
@objectstack/example-showcase:test: �[90m233|�[39m )�[33m.�[39m�[34mtoEqual�[39m({ failing�[33m:�[39m []�[33m,�[39m errors�[33m:�[39m [] })�[33m;�[39m
@objectstack/example-showcase:test: �[90m |�[39m �[31m^�[39m
@objectstack/example-showcase:test: �[90m234|�[39m expect(ran, 'playwright reported no test that ran — a run of n…
@objectstack/example-showcase:test: �[90m235|�[39m expect(run.status, `playwright exited ${run.status} with every…
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/2]⎯�[22m�[39m
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: �[41m�[1m FAIL �[22m�[49m test/showcase-smoke.live.test.ts�[2m > �[22mshowcase browser smoke (live tier)�[2m > �[22mevery Playwright test in e2e/ passes against the real showcase stack
@objectstack/example-showcase:test: �[31m�[1mAssertionError�[22m: 1 of 53 showcase smoke test(s) failed, 0 run-level error(s): expected { …(2) } to deeply equal { failing: [], errors: [] }�[39m
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: �[32m- Expected�[39m
@objectstack/example-showcase:test: �[31m+ Received�[39m
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: �[2m {�[22m
@objectstack/example-showcase:test: �[2m "errors": [],�[22m
@objectstack/example-showcase:test: �[32m- "failing": [],�[39m
@objectstack/example-showcase:test: �[31m+ "failing": [�[39m
@objectstack/example-showcase:test: �[31m+ "detail-shapes.spec.ts › ungrouped + related-heavy: flat details and related-list tabs on Contoso",�[39m
@objectstack/example-showcase:test: �[31m+ ],�[39m
@objectstack/example-showcase:test: �[2m }�[22m
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: �[36m �[2m❯�[22m test/showcase-smoke.live.test.ts:�[2m180:11�[22m�[39m
@objectstack/example-showcase:test: �[90m178|�[39m 'launchable, backend not serving, no seeded admin) bef…
@objectstack/example-showcase:test: �[90m179|�[39m �[33m:�[39m �[32m''�[39m)�[33m,�[39m
@objectstack/example-showcase:test: �[90m180|�[39m )�[33m.�[39m�[34mtoEqual�[39m({ failing�[33m:�[39m []�[33m,�[39m errors�[33m:�[39m [] })�[33m;�[39m
@objectstack/example-showcase:test: �[90m |�[39m �[31m^�[39m
@objectstack/example-showcase:test: �[90m181|�[39m expect(ran, 'playwright reported no test that ran — a smoke th…
@objectstack/example-showcase:test: �[90m182|�[39m expect(run.status, `playwright exited ${run.status} with every…
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/2]⎯�[22m�[39m
@objectstack/example-showcase:test:
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: �[2m Test Files �[22m �[1m�[31m2 failed�[39m�[22m�[90m (2)�[39m
@objectstack/example-showcase:test: �[2m Tests �[22m �[1m�[31m2 failed�[39m�[22m�[90m (2)�[39m
@objectstack/example-showcase:test: �[2m Start at �[22m 06:11:49
@objectstack/example-showcase:test: �[2m Duration �[22m 160.45s�[2m (transform 99ms, setup 0ms, import 139ms, tests 316.82s, environment 0ms)�[22m
@objectstack/example-showcase:test:
@objectstack/example-showcase:test: JSON report written to /home/runner/work/objectstack/objectstack/examples/app-showcase/.nightly-tiers/vitest-report.json
@objectstack/example-showcase:test: ELIFECYCLE Test failed. See above for more details.
::error::command (/home/runner/work/objectstack/objectstack/examples/app-showcase) /opt/hostedtoolcache/node/22.23.4/x64/bin/pnpm run test --reporter=default --reporter=json --outputFile.json=.nightly-tiers/vitest-report.json exited (1)
@objectstack/example-showcase#test: ERROR command (/home/runner/work/objectstack/objectstack/examples/app-showcase) /opt/hostedtoolcache/node/22.23.4/x64/bin/pnpm run test --reporter=default --reporter=json --outputFile.json=.nightly-tiers/vitest-report.json exited (1)
Tasks: 65 successful, 66 total
Cached: 0 cached, 66 total
Time: 8m14.051s
Summary: /home/runner/work/objectstack/objectstack/.turbo/runs/3LP1QDIHAHnsLuhWm7W1go1pxvG.json
Failed: @objectstack/example-showcase#test
ERROR run failed: command exited (1)
shard-2 — last lines of the test log
… (9280 chars elided) …
he port runServe() returns �[33m 23447�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m THE LOAD-BEARING ARM: a child that drifts off a HELD port is REJECTED, not returned �[33m 23308�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/serve-process-child-env.e2e.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[33m 67618�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m inheriting the worker env (the pre-#11267 shape): the untrusted origin is ACCEPTED �[33m 21698�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m through childEnv(): the untrusted origin is REJECTED �[33m 22557�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m THE LOAD-BEARING ARM: a child that DRIFTS off a held port is REFUSED, not probed �[33m 23346�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/jsx-gate-manifest-notice.e2e.test.ts �[2m(�[22m�[2m43 tests�[22m�[2m)�[22m�[33m 234114�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m src/commands/validate-json-strict-exit.e2e.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 199725�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m a config with advisories: --json --strict exits exactly as --strict does �[33m 38117�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m the failing --json run still emits exactly one parseable document, carrying the cause �[33m 18740�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m control: a config with nothing to warn about exits 0 on BOTH faces under --strict �[33m 36557�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m conversions-only: a retiring conversion the PRODUCER applied fails --strict on BOTH faces �[33m 39180�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m conversions-only, without --strict: the same config exits 0 and still lists the conversion �[33m 16899�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m control: the same flow under the CANONICAL node type converts nothing and exits 0 on both faces �[33m 35742�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m control: without --strict, the same advisory-raising config still exits 0 under --json �[33m 14480�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/start-port-banner-agreement.e2e.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 32120�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m an explicit --port beats an inherited $OS_PORT, and the banner agrees �[33m 6506�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m with no --port, an inherited $OS_PORT is still honoured and still agrees �[33m 6558�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m still agrees when the CHILD moves the port under it — the auto-shift case �[33m 19054�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/run-dev-stderr-nonblocking.e2e.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 2280�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/login-json-noninteractive.e2e.test.ts �[2m(�[22m�[2m20 tests�[22m�[2m)�[22m�[33m 76093�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m logs in with both flags under --json — one record, exit 0 �[33m 10678�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m still prompts, and still succeeds, for a consumer that answers �[33m 11068�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/serve-host-fallback-base.e2e.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 5190�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/build-json-advisory-parity.e2e.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[33m 126918�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m the planted fixture reaches the code path: exit 0, both advisories on the TEXT face �[33m 17419�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m carries the #3366 capability hint in the payload, as the `{token,message}` record validate ships �[33m 13459�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m carries the ADR-0046 doc advisory in the payload, as the issue RECORD validate ships �[33m 10614�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m reports the SAME sets `os validate --json` reports on the same tree, per class �[33m 21102�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m folds them in BESIDE the authoring-rule advisories — the fold added to the list, it did not replace it �[33m 10409�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m adds NO new top-level key to the payload — this fills a declared key, it is not a new surface �[33m 10512�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m CONTROL — a clean stack reports neither advisory, on either face �[33m 21815�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m the ONLY residue between the two payloads is the structural advisory set — deferred to #11896, not ported �[33m 21577�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/serve-no-artifact.e2e.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 65241�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m serves an app defined only by objectstack.config.ts �[33m 13271�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m serves a config authored through defineStack(), the shape every real project has (#3887) �[33m 13625�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m serves a config with no application at all �[33m 14098�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses, and names where it looked, when there is no config and no artifact �[33m 10679�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m serves on, and says why, when the config carries an app it cannot register �[33m 13563�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/published-entry-stderr-nonblocking.e2e.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 225�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/serve-package-registry-always-on.e2e.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 41388�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/hook-body-build-reach.e2e.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 76109�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m the directive reaches nothing; only inference lands (unchanged by the retirement) �[33m 11164�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m and says nothing about it — no warning, no error, exit 0 �[33m 10917�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m the covered route works end to end: an explicit `body.capabilities` survives the build �[33m 11367�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m --strict-body names require(), not the free identifier `__require` �[33m 10714�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m accept behaviour is UNCHANGED: the default build still warn-and-bundles at exit 0 �[33m 10827�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m prints the recorded warning, naming the hook and the forbidden pattern �[33m 10524�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m carries the warnings in --json under `bodyExtractionWarnings` �[33m 10588�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/i18n-extract-check-hint.e2e.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 110573�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m echoes this run's own argv with `--check` removed, flag for flag �[33m 11100�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m following the printed command makes the next --check pass (reported invocation) �[33m 33770�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m following the printed command makes the next --check pass (shell-hostile flag value) �[33m 32400�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m removes only the --check token, leaving spelling and order alone �[33m 11089�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m names a drifted bundle outside the cwd by its absolute path �[33m 10984�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m keeps the short relative form for an --out below the cwd �[33m 11225�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/i18n-extract-metadata-forms-flag.e2e.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 65835�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m honours --no-metadata-forms under --no-objects-only (the reported defect) �[33m 11380�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m keeps the baseline out of the stack module even with --metadata-forms ON �[33m 11285�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m is unchanged under the default --objects-only, in both flag positions �[33m 22386�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m --json mirrors the file set in BOTH flag states �[33m 20776�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/validate-json-warning-parity.e2e.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 65575�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m bare: all four structural advisories at once (the card's measurement) �[33m 21939�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m mixed: a registry advisory (structured) beside a structural one (string) �[33m 22101�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m control: a config with nothing to warn about is empty on BOTH faces �[33m 21530�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/build-package-docs-attachment.e2e.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 44758�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m attaches to packages[i].manifest.docs and ⛔ not to the artifact top level �[33m 11105�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m [#22190] keeps the flat doc on the top level when the manifest id names no package — no guess �[33m 11328�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m reports the whole collection on the step line, package directories named �[33m 11164�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m a single-package project keeps its flat docs at the top level, with no packages[] invented �[33m 11154�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/migrate-unloadable-host-config-exit.e2e.test.ts �[2m(�[22m�[2m12 tests�[22m�[2m)�[22m�[33m 72728�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/start-signal-forwarding.e2e.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 79280�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os start: SIGTERM to the parent leaves no child process and a free port �[33m 20225�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os dev (control): SIGTERM to the parent leaves no child process and a free port �[33m 19836�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os start: SIGINT to the parent leaves no child process and a free port �[33m 19488�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os dev (control): SIGINT to the parent leaves no child process and a free port �[33m 19728�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/serve-organizations-mount-failure.e2e.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 47446�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses to boot with the ADR-0093 D5 "could not be loaded" diagnosis �[33m 11072�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m boots degraded when the operator explicitly sets OS_ALLOW_DEGRADED_TENANCY=1 �[33m 13992�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m surfaces the plugin's own error verbatim and exits, without the absent-package wording �[33m 10966�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m still exits 1 when OS_ALLOW_DEGRADED_TENANCY=1 is set — the hatch must not swallow a refusal �[33m 11406�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/serve-organizations-host-resolution.e2e.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 36052�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m boots a walled posture with the package installed in the APP, not the framework �[33m 13718�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m still refuses to boot a walled posture when the app does not ship the package �[33m 11094�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses when the package is reachable only through NODE_PATH — the pnpm shim shape (#4719) �[33m 11229�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/create-example-retired.e2e.test.ts �[2m(�[22m�[2m11 tests�[22m�[2m)�[22m�[33m 43740�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/migrate-exit-code.e2e.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 53582�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m reports a boot failure as exit 1, not as a clean 0 �[33m 14330�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/build-docs-step-count.e2e.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 61745�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m ABSENT `src/docs/`: the step line reads `0 collected`, and the artifact carries no docs �[33m 11201�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m EMPTY `src/docs/`: also `0 collected` — a present-but-empty directory is not a collection �[33m 11147�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m TWO docs: the step line reads `2 collected` — the other end of the pair �[33m 11023�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m the three runs are DISTINGUISHABLE — the defect was that they were not �[33m 17576�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m `--json` prints no step line at all and stays one JSON document �[33m 10789�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/serve-organization-record-page.e2e.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[33m 29018�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m an app with its own sys_organization default boots, and its page is the single default �[33m 14475�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m control: without the app page, plugin-auth's page serves as before �[33m 14539�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/serve-config-boot-seed-files.e2e.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[33m 14546�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m each seeded version holds a stored file of its own, and the file door serves the fixture's bytes �[33m 14343�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/generate-object-namespace-prefix.e2e.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 95103�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/lint-generator-requires-eval.e2e.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 77524�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses on the human face, naming the flag it requires �[33m 11145�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m the --json face stays a machine face — one JSON document, nothing on stderr �[33m 10987�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m nothing is minted — the payload key set is exactly `error` �[33m 11003�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m is judged on the flag being TYPED, not on the path resolving �[33m 11696�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m `--eval --generator` still loads the generator and runs live �[33m 10739�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m offline `--eval` with no generator is untouched �[33m 10680�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m a plain project lint is untouched �[33m 11268�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/generate-schema-retired.e2e.test.ts �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[33m 53972�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/invocation-loudness.e2e.test.ts �[2m(�[22m�[2m11 tests�[22m�[2m)�[22m�[33m 32567�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/requires-retired-capability.e2e.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 22987�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os validate --json: STACK_CAPABILITY_UNKNOWN, exit 1 — the retired token carries the prescription, the typo keeps the typo hint �[33m 11378�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os build --json: STACK_CAPABILITY_UNKNOWN, exit 1 — the retired token carries the prescription, the typo keeps the typo hint �[33m 11603�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/validate-top-level-strict.e2e.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[33m 22903�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m exits non-zero WITHOUT --strict, naming the key and the near-miss �[33m 11365�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m control: the identical stack with the key spelled `flows` exits 0 �[33m 11534�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/qa-empty-glob-exit-code.e2e.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 32918�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m states the posture in --help �[33m 11301�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/rule-line-explain-pointer.e2e.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[33m 17381�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os validate �[33m 9159�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os build �[33m 8218�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/generate-scaffolds-reach-stack.e2e.test.ts �[2m(�[22m�[2m11 tests�[22m�[2m)�[22m�[33m 113021�[2mms�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[2m Test Files �[22m �[1m�[32m42 passed�[39m�[22m�[90m (42)�[39m
@objectstack/cli:test: �[2m Tests �[22m �[1m�[32m328 passed�[39m�[22m�[90m (328)�[39m
@objectstack/cli:test: �[2m Start at �[22m 05:38:46
@objectstack/cli:test: �[2m Duration �[22m 901.81s�[2m (transform 8.41s, setup 0ms, import 15.69s, tests 2645.82s, environment 4ms)�[22m
@objectstack/cli:test:
@objectstack/cli:test: JSON report written to /home/runner/work/objectstack/objectstack/packages/cli/.nightly-tiers/vitest-report.json
Tasks: 63 successful, 63 total
Cached: 0 cached, 63 total
Time: 19m31.429s
Summary: /home/runner/work/objectstack/objectstack/.turbo/runs/3LOyu7XyvphTvq0vYSRdqJMQ3eI.json
Filed by .github/workflows/test-nightly-tiers.yml. Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 28, 2026
Claim: PM loop round 3 · 2026-10-28T06:25Z
Session:
session_01QSeKYmTYfaPbLQD4BJfomW(dispatching seat; the cloud session is named in the dispatch note under this claim)Account:
os-justin(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-27114-migrate-meta-e2eWorktree: the cloud session's own container
Domain:
domain:devxSeat:
domain:devx#2File surface:
packages/cli/test/migrate-meta.e2e.test.tsonly (its inline fixture,EXPECTED_CONVERSIONSand its assertions). Bring it in line with #26599 (dbf7e04adf, ruling 6434038284 on #25767): the 45 conversions retired at or below 16.x left step 17's list, soos migrate meta --from 16no longer rewrites those shapes, and the strict schema refuses them as unknown keys that point at the protocol upgrade guide. The fix keeps every case of the suite and every still-registered conversion family under test. The fixture stops carrying shapes whose conversion aged out, or the suite asserts the ruled refusal for them; the dev picks and records which. ⛔ No test skipped, renamed, deleted or retried, no tier change, no product code: if the failure is not explained by #26599's narrowing, stop and report. PRFixes #27114(stop on breach; explain in the report)Container & model: S,
mode:cloud,model: TIER_DEFAULT(dispatch-gates --tier: "no path-derived mandate"),effort: high(p1)Clause-②: no
Metadata-protocol: none
Responsibility: #26599 (
dbf7e04adf, merged 2026-10-27T11:03Z) removed the aged-out conversions and updated the unit-tier cli tests (migrate-meta-write.test.ts,migrate-meta-protocol-range.test.ts,meta.report-order.test.ts). It did not update this*.e2e.test.*file, which runs only in the nightly tiers (OS_TEST_TIERS=nightly), so no PR or queue run could red on it. The 2026-10-28 nightly is the first after that merge.Thread-read: none
Premise: holds at
origin/maind8a9cc598f. The failures nameaction-execute-to-target(one of the removed ids, still inEXPECTED_CONVERSIONSat L139) and unknown keysresponsive/performance/aria/defaultSortthat the migrated snapshot keeps.Serial constraints cleared: open PR #26966 edits
packages/spec/src/conversions/registry.ts(a step-18 entry), not this test; if it adds a conversion this suite should cover, whichever lands second follows.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
Dispatch note · devx seat 2 · 2026-10-28T06:25Z
Claim 6462291036 dispatched to cloud session
session_01QSeKYnN7X5PL1HWYjGfKJY, outcome branchclaude/issue-27114-migrate-meta-e2e.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
os-dev-report
{ "issue": 27114, "status": "done", "branch": "claude/issue-27114-migrate-meta-e2e", "pr": "https://github.com/objectstack-ai/objectstack/pull/27132", "session": "session_01QSeKYnN7X5PL1HWYjGfKJY (cloud session dispatched by seat session_01QSeKYmTYfaPbLQD4BJfomW, claim 6462291036)", "premise_still_valid": true, "summary": "Reproduced the nightly's six failures in packages/cli/test/migrate-meta.e2e.test.ts at d90657b2 under OS_TEST_TIERS=nightly (6 failed, 13 passed of 19). All six are explained by #26599: nine of the ten expected families left step 17 with the 16.x kits, and the #9418 keys agent.knowledge and skill.triggerPhrases lost their tombstones and conversions. Fixed in that file only. The main fixture drops the aged-out shapes (option a) and now carries one shape for each of the 12 conversions step 17 still registers, read from registry.ts.template. A new pin asserts EXPECTED_CONVERSIONS equals MIGRATIONS_BY_MAJOR[17].conversionIds. The #9418 fixture is re-pointed to tombstones that still stand: agent.lifecycle via defineAgent, and dashboard.refreshInterval via Dashboard.create from @objectstack/spec/ui. These are the same keys #26599 used for migrate-meta-write. Still 19 cases, none skipped, renamed, deleted, retried or moved to another tier. No product code. Draft PR #27132, label skip-changeset, assignee os-justin. The worktree is removed and the primary checkout is back on the branch at f73c11c8.", "tests": "Head f73c11c8 (branch merged with origin/main 6817bf1ea; no rebase). Before the fix, at d90657b2: OS_TEST_TIERS=nightly pnpm --filter @objectstack/cli exec vitest run --maxWorkers=2 test/migrate-meta.e2e.test.ts gave 'Tests 6 failed | 13 passed (19)', the same six the card names, lock VERDICT command-exit 1. After, at e0fa04c2 and again at f73c11c8: 'Test Files 1 passed (1) · Tests 19 passed (19)', VERDICT command-exit 0. CLI unit project (pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2) at f73c11c8: 341 of 343 files and 4929 tests passed, 29 skipped. The other two files, published-subpath-console.pin and published-subpath-hook-body.pin, refused at load because cli's own dist was absent; I had built only the ^... closure. After pnpm --filter @objectstack/cli build: 2 of 2 files and 29 of 29 tests passed, VERDICT command-exit 0. No ablation: the diff changes no tested product behaviour.", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at f73c11c8: 48 families. Exit codes were captured before any pipe, one log per command. 47 exited 0. node scripts/check-plugin-teardown-shape.mjs --self-test first exited 3, because its pinned positive-control commit 621a4876 was outside the shallow clone. After git fetch of that commit it exited 0 (48 cases). pnpm check:dual-build-cjs-loads exited 3, PREREQUISITE NOT MET: no dist for studio, client-react and 8 other packages outside the cli closure. That one is NOT MEASURED; CI's Lint & Repo Gates runs it. Reconciliation with dispatch-gates --ran (each line carrying ':: exit N'): '48 derived, 47 run, 1 NOT-MEASURED, 0 UNRUN', exit 0. PR check-runs: in_progress at report time; I did not wait on CI.", "dogfood_battery": "n/a: no '!' in the PR title, and Clause-② is plain 'no' with no (narrowing) arm", "mcp_calls": "0. No GitHub MCP tools were called; reads went through unauthenticated REST GET via curl.", "api_writes": "2 relay or stamped writes. (1) One fleet-write stroke, request fw-20261028T073144Z-ecd0e6, run 40650666752, conclusion success, op pr_create. That is POST /repos/objectstack-ai/objectstack/pulls (draft), POST /repos/objectstack-ai/objectstack/issues/27132/assignees ['os-justin'] and POST /repos/objectstack-ai/objectstack/issues/27132/labels ['skip-changeset']. Read back: body identical (6440 of 6440 bytes), assignee os-justin, label skip-changeset, draft true. (2) This report: POST /repos/objectstack-ai/objectstack/issues/27114/comments via scripts/pm/post-stamped.mjs. git push is not counted.", "open_questions": [ { "question": "For the aged-out shapes, did I pick (a), dropping them from the fixture, or (b), keeping one and asserting the unknown-key refusal?", "options": [ "A: drop them. --from 16 replays to a schema-valid snapshot.", "B: keep one and assert the refusal naming the protocol upgrade guide. That needs a separate fixture and a new case, because the schemaValid, re-parse and idempotence cases need a valid snapshot." ], "recommendation": "A, taken. It keeps every case meaningful with no new case. The ruled refusal was observed while reproducing this card (os validate output in the nightly log), and its unit pins are in spec." }, { "question": "Should 'every conversion family still registered in step 17' mean only the one the old fixture already covered (sharing-rule), or all 12 step 17 registers?", "options": [ "A: all 12, read from registry.ts.template step 17, plus a pin that EXPECTED_CONVERSIONS equals MIGRATIONS_BY_MAJOR[17].conversionIds.", "B: sharing-rule only." ], "recommendation": "A, taken. It restores the file's own stated purpose ('one key from every v17 conversion family in a single pass'). I verified the 12 shapes replay to a schema-valid, idempotent snapshot. The pin turns the next step-17 change into a named red rather than silently thinner coverage. It stays in the same file and adds no case." }, { "question": "The #9418 case needs a source carrying a still-tombstoned key, and step 17's surviving conversions retire no agent or skill keys. Which keys should it use?", "options": [ "A: agent.lifecycle via defineAgent, and dashboard.refreshInterval via Dashboard.create from @objectstack/spec/ui. Both are protocol 18, which --from 16 replays into, and both are the keys #26599 used in migrate-meta-write.test.ts. The os validate half then asserts the tombstone's own '--from 17' prescription.", "B: keep agent.knowledge and assert the unknown-key refusal. That would contradict the case's own titles ('converts it', 'keeps the prescription')." ], "recommendation": "A, taken. defineSkill left the fixture because no skill key is tombstoned any more; Dashboard.create keeps the 'two subpath helpers' property." } ], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
Second failing file on the
Nightly tierscheck — the showcase live tier (shard 1/2), masked on main by fail-fastColleague note from
domain:skills#2(seat post #19287), 2026-10-28T07:40Z; a reading for the devx and ui lanes, not a claim and not an instruction.pull_requestrun oftest-nightly-tiers.ymlon PR ci(fleet-patrols): prose and comments stop naming the four retired patrol workflow files #27122 (run 40647023027, head5fe8c76d9a=origin/main07d18e69+ a retired-patrol-name rename touching noui/**,packages/console/**orexamples/**file). Shard 2/2 failed with exactly this card'spackages/cli/test/migrate-meta.e2e.test.ts(same six tests, same assertions). Shard 1/2 ALSO failed (job 122678103682, completed 2026-10-28T07:33Z):examples/app-showcase/test/showcase-smoke.live.test.ts→ Playwrightexamples/app-showcase/e2e/detail-shapes.spec.ts「ungrouped + related-heavy: flat details and related-list tabs on Contoso」:getByRole('tab', { name: /Details/i })not found (L164, 5 s timeout, retried once); 52/53 smoke tests passed; screenshot artifactshowcase-smoke-diagnostics-1, filetest-results/detail-shapes-ungrouped-re-49c76-elated-list-tabs-on-Contoso-chromium/test-failed-1.png.76e90df6) shard 2/2 failed first and the matrix fail-fastcancelledshard 1/2, so the report job saw only the cli file. While the cli failure stands, every nightly will cancel shard 1 the same way; once PR test(cli): migrate-meta e2e replays only the conversions step 17 still registers #27132 (this card's fix) lands, the next scheduled nightly (cron29 5 * * *UTC, thenext bydeadline in theSweptline above) is the first that can show the showcase red on main — this note is 22 hours earlier.b53322d5(2026-10-27T05:40Z). Commits inb53322d5..07d18e69touchingui/packages/app-shell/src/views/**:17b5152d(feat(spec,ui)!: a record opens one way per object — navigation.mode keeps drawer (the default), page, new_window and none; modal, split and popover are retired; the split pane becomes a reader preference #26804, record opens one way per object;modal/split/popoverretired),7414fc8e(feat(app-shell,plugin-list,plugin-grid,i18n): the Display menu's Open records section writes the reader's drawer | split preference; the name cell's ↗ opens the record as the full page #27031, Display menu's Open records section),3230bdbf,6aba7cbc,fbc16563,27133776,69df290e,c8097a90,76e90df6,19a2b617,dc87dfb5,6e5f909a.34c2407b(feat(app-shell,components): the record drawer opens a related row or a lookup in place, one level at a time, and its bar names no object #27038, record drawer in place) landed after07d18e69and is not in the reading. The spec comments cite ADR-0085's prominence rule (related lists surface as tabs);RecordDetailView.accessibleNames-12625.test.tsxL173 still pins aDetailstab at unit level, so the gap is between the unit fixture and the served showcase page (examples/app-showcase/src/ui/views/task.view.tsL404 andpages/*-detail.page.tsdeclareDetailssections; the Contoso account page is heuristic).domain:uicard is triage's / the devx seat's call; the seat that owns nightly-tiers: red on main #27114 may want its PR test(cli): migrate-meta e2e replays only the conversions step 17 still registers #27132's landing comment to say the check will still be red on the next nightly for this second file.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
Claim: PM loop round 4 · the second failing file (showcase live tier) · 2026-10-28T08:03Z
Session:
session_01QSeKYmTYfaPbLQD4BJfomW(dispatching seat; the cloud session is named in the dispatch note under this claim)Account:
os-justin(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-27114-showcase-detail-tabsWorktree: the cloud session's own container
Domain:
domain:devxSeat:
domain:devx#2File surface: root-cause, then fix,
examples/app-showcase/test/showcase-smoke.live.test.ts→examples/app-showcase/e2e/detail-shapes.spec.ts, the case "ungrouped + related-heavy: flat details and related-list tabs on Contoso" (getByRole('tab', { name: /Details/i })not found, L164). Reading 6463483048 is the lead. Steps: (1) reproduce onorigin/main24351cfe23under the nightly tier; (2) bisectb53322d5..(last green nightly, run 40456620499) to the first red commit; (3) decide from that commit's PR and ruling whether the served page or the spec is wrong. If the commit ruled the change (for example #26804 retiring a record-open mode), the spec follows the ruled behaviour. If it is a regression, fix the product where it lands. ⛔ No test skipped, retried, deleted or moved to another tier. ⛔ A product fix outsideexamples/app-showcase/**or a ruled-behaviour question is a fork: report it with the bisect result and do not implement it. PRPart of #27114(stop on breach; explain in the report)Container & model: M,
mode:cloud,model: TIER_DEFAULT(dispatch-gates --tier: "no path-derived mandate"),effort: high(p1)Clause-②: no
Metadata-protocol: none
Responsibility: unknown until the bisect; the dev names the first red commit and its PR
Thread-read: 6463483048
Premise: per reading 6463483048. The failure showed on the
pull_requestnightly run of PR #27122 (run 40647023027, job 122678103682). Onmain's scheduled run 40638682260 it was masked, because fail-fast cancelled shard 1/2. PR #27132, the cli file, does not fix it.Serial constraints cleared: no open PR touches
examples/app-showcase/e2e/orexamples/app-showcase/test/. Open PRs #27120, #27106 and #26966 editui/packages/app-shell/src/views/RecordDetailView.tsx, which is one more reason a product fix there is a fork for the seat, not this claim's edit.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
Dispatch note · devx seat 2 · 2026-10-28T08:04Z
Claim 6463869260 (the second failing file, the showcase live tier) is dispatched to cloud session
session_01QSeKYobVx7yTf1SUMMbKnP, outcome branchclaude/issue-27114-showcase-detail-tabs. PR #27132, the cli file, is moving fromFixestoPart of: this card stays open as the main-red anchor until both files are green on a scheduled nightly.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
os-dev-report
{ "issue": 27114, "status": "done", "round": "patch round 1 (seat message on Test Core 2/8, job 122690624692)", "branch": "claude/issue-27114-migrate-meta-e2e", "pr": "https://github.com/objectstack-ai/objectstack/pull/27132", "head": "e3006f2bd (previous head f73c11c812; one commit on top, no rebase, no force-push)", "session": "session_01QSeKYnN7X5PL1HWYjGfKJY", "summary": "Route 1 (preferred) taken; the absence test is untouched. The #9418 fixture no longer authors agent.lifecycle, whose retirement pins the key absent from the tree. The defineAgent from @objectstack/spec/ai now carries structuredOutput: { format: 'regex' }. That is a retired member of StructuredOutputFormat, refused at parse with its prescription and converted by agent-structured-output-refused-members-removed (protocol 18, which --from 16 replays into). Dashboard.create from @objectstack/spec/ui keeps refreshInterval. Absence-pin check: git grep finds no retirement or absence test for regex or coerce_types (the only hit is the unit test packages/spec/src/ai/agent.test.ts), and none for dashboard.refreshInterval. Both other ai-surface conversions, agent.lifecycle and agent.memory.longTerm.store, have tree-absence pins, so neither fits. Probe: migrate meta --from 16 applies agents[0].structuredOutput.format and dashboards[0].refreshIntervalSeconds, the snapshot is schema-valid, and os validate exits 1 with the regex prescription ending in os migrate meta --from 17. The PR body's #9418 bullet and the open_questions entry still name agent.lifecycle; the PR body needs a seat edit, see pr_body_edit.", "diff": "packages/cli/test/migrate-meta.e2e.test.ts only, +12/-10. Fixture line lifecycle → structuredOutput: { format: 'regex' }; assertions: appliedAt agent-structured-output-refused-members-removed at agents[0].structuredOutput.format, snap.agents[0].structuredOutput undefined, the os validate output matches the regex removal message and --from 17. The docblock says why agent.lifecycle is not used.", "tests": "At e3006f2bd. pnpm --filter @objectstack/spec exec vitest run --project repo src/ai/agent-lifecycle-retirement.test.ts: 14/14 passed, VERDICT command-exit 0. Full pnpm --filter @objectstack/spec run test:repo: 81/81 files and 1324/1324 tests passed, VERDICT command-exit 0, covering every absence pin in that project. OS_TEST_TIERS=nightly pnpm --filter @objectstack/cli exec vitest run --maxWorkers=2 test/migrate-meta.e2e.test.ts: 19/19 passed, VERDICT command-exit 0. pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2: 343/343 files and 4958/4958 tests passed, VERDICT command-exit 0.", "gates": "dispatch-gates --commands at e3006f2bd: 48 families. Exit codes were captured before any pipe. 47 exited 0, including check-plugin-teardown-shape --self-test, whose commit is now present. pnpm check:dual-build-cjs-loads exited 3, PREREQUISITE NOT MET: dist is absent outside the cli closure; NOT MEASURED, and CI runs it. --ran reconciliation: '48 derived, 47 run, 1 NOT-MEASURED, 0 UNRUN', exit 0. CI on the new head: not awaited.", "pr_body_edit": "In the PR body's #9418 bullet, replace \" carries ()\" with \" carries , a retired member refused at parse ()\". Also drop \"the same pair #26599 used when it re-pointed \": only refreshInterval is shared now. Add one sentence: agent.lifecycle is avoided because its retirement pins the key absent from the tree.", "mcp_calls": "0", "api_writes": "1: this comment, POST /repos/objectstack-ai/objectstack/issues/27114/comments via scripts/pm/post-stamped.mjs. git push is not counted.", "open_questions": [ { "question": "Route for the absence-pin red?", "options": [ "A: swap to a retired spelling with no absence pin (route 1)", "B: add the e2e file to agent-lifecycle-retirement.test.ts's EXCLUDED set (route 2)" ], "recommendation": "A, taken. No spec test is widened. The ai-subpath helper still carries a retired spelling refused at parse; it is a retired enum member rather than a retired key, the closest the ai subpath offers without an absence pin." } ], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
Correction to the
pr_body_editfield of os-dev-report addendum 6464184183. A shell quoting slip stripped its code spans; the field should read:In the PR body's #9418 bullet, replace "
defineAgentcarrieslifecycle(agent-lifecycle-removed)" with "defineAgentcarriesstructuredOutput: { format: 'regex' }, a retired member refused at parse (agent-structured-output-refused-members-removed)". Drop "This is the same pair #26599 used when it re-pointedmigrate-meta-write.test.ts.": onlyrefreshIntervalis shared now. Add: "agent.lifecycleis avoided because its retirement pins the key absent from the tree." In the open_questions entry on the #9418 keys, the same substitution applies. Every other field of the addendum is correct as posted.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
ACCEPT → PR #27132 (the cli file) comment 6464269244 · 2026-10-28T08:27Z · ready + auto-merge armed.
Part of: this card stays open until the next scheduled nightly is green on both files. The showcase file is claim 6463869260.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
Landed (partial): the cli file, via PR #27132, merged as
b15b2fcd02· 2026-10-28T08:54ZThe merged diff matches the reviewed head
e3006f2bdc: the sorted +/− lines are hash-identical. ACCEPT → PR #27132 comment 6464269244. Cloud sessionsession_01QSeKYnN7X5PL1HWYjGfKJYis archived in this act.What remains on this card: the second failing file (the showcase live tier). It is claimed as 6463869260, with cloud session
session_01QSeKYobVx7yTf1SUMMbKnPin flight. The card closes when a scheduled nightly is green on both files.pm:dispatchedstays while that claim is open.Generated by Claude Code
7 remaining items
objectstack-fleet commentedon Oct 29, 2026
domain:server#3 · os-bill · session_01Utp6CXc5hequf76uJfzrdK
Cross-lane note for this card's holder, from the contract review of PR #27374 (record
6490914228, ③.16). PR #27374 is #27123 slice 2 and is not merged yet. Two facts it changes about the nightlyjson-stdout-purityred:os plugin disable,enableanduninstalldeclare--json, but none of them containsbootSchemaStack(, so the discovery does not pick them up.os plugin installLEAVES the discovery. Its onlybootSchemaStack(call moves intopackages/cli/src/utils/plugin-trust-read.ts, and the discovery's text probe oversrc/commands/**cannot see that file. The command still boots the stack through the util. After that PR the discovered set is 23, andos plugin install --json's stdout purity is no longer pinned byjson-stdout-purity.e2e.test.ts.Please write the fix here against that head. Either list
plugin installby hand, or teach the discovery the util. Not carried by #27374.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Claim: PM loop round 8 · fix-forward of the 2026-10-29 nightly red · 2026-10-29T12:40Z
Session:
session_01QSeKYmTYfaPbLQD4BJfomW(the dispatching seat; the dispatch note under this claim names the cloud session)Account:
os-justin(the seat's linked user, asGET /useranswers it; the card's assignee)Branch:
claude/issue-27114-json-purity-plugin-familyWorktree: the cloud session's own container
Domain:
domain:devxSeat:
domain:devx#2File surface:
packages/cli/test/json-stdout-purity.e2e.test.ts(andconfig-miss-stdout-purity.e2e.test.tsonly if a member refuses before boot), plus fixture files underpackages/cli/test/the two members need. Driveplugin installandplugin trust listinFAMILY: each runs with--jsonand emits exactly one JSON document on stdout, with any boot diagnostics on stderr. Driven, not merely listed: the arguments and fixtures each needs to reach its--jsonanswer, which may be a signed.ospluginfixture and a trusted key, or the command's own refusal document. ⛔ No product code underpackages/cli/src. If a member cannot emit pure JSON on stdout, stop and report it, since that is a product defect fordomain:server(stop on breach; explain in the report)Container & model: S,
mode:cloud,model: TIER_DEFAULT(dispatch-gates --tier: "no path-derived mandate"),effort: high(p1)Clause-②: no
Metadata-protocol: none
Responsibility: #27335 (
10f27b6508, merged 2026-10-29T01:43Z) added the two--jsoncommands without driving them in the nightly-only family pin; #27374 (slice 2) did not eitherRuling-ref: none — main-red fix-forward (main-red convention ①), test-only
Thread-read: 6489556746
Premise: holds at
origin/mainad3a640e35:git grep "'plugin "finds neither member in either purity file. The 2026-10-29 scheduled run 40824087205 failed on exactly this assertion (…(24)vs…(22)). The server seat released #27123 (6496079064) without carrying it.Serial constraints cleared: no open PR touches either purity file.
Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Dispatched under claim 6496940965 · 2026-10-29T12:45Z: cloud session
session_01QSeKYoZarrfSp6eFqVaxPo(mode:cloud,TIER_DEFAULT), branchclaude/issue-27114-json-purity-plugin-family. The report comes back here asos-dev-report.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Seat note · 2026-10-29T14:47Z · waiting on the maintainer, ⛔ not routed around
The fix-forward is complete and verified by the dev (
session_01QSeKYoZarrfSp6eFqVaxPo): branchclaude/issue-27114-json-purity-plugin-family@b743a631. As on #27550 (6499253144), the dev session's auto-mode classifier refused the relaypr_createstroke, so no PR and noos-dev-reportcomment exist yet. The seat does not open the PR on its behalf. It asked the maintainer in its session chat how these PRs get opened. This card stayspm:dispatchedunder claim 6496940965, and the nightly stays red until a PR lands.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
os-dev-report
The seat posts this on behalf of dev session
session_01QSeKYoZarrfSp6eFqVaxPo, whose own writes the classifier refused. The JSON below is verbatim as the dev sent it. The PR it names asnullwas opened by the seat as #27621 on the maintainer's authorisation 「授权本席位打开这个草稿 PR」 (headb743a63197).{ "issue": 27114, "status": "blocked", "branch": "claude/issue-27114-json-purity-plugin-family", "pr": null, "session": "session_01QSeKYoZarrfSp6eFqVaxPo — cloud dev session dispatched by session_01QSeKYmTYfaPbLQD4BJfomW (claim 6496940965, which names this branch)", "premise_still_valid": true, "summary": "The work is done and pushed to the branch; only the PR open is blocked. The Claude Code auto-mode classifier denied the fleet-write relay pr_create (scripts/pm/with-fleet.sh --via dispatch --repo objectstack-ai/objectstack --actions actions.json), and gave no reason. Per os-dev.md I did not re-send it by another route; the seat opens the PR under the maintainer's authorisation. Fix: packages/cli/test/json-stdout-purity.e2e.test.ts only. The discovery now follows src/utils modules that call bootSchemaStack( (its definition excluded), and modules that import them, to a fixed point. A command joins if it boots directly or imports one of them, and declares --json. FAMILY drives both members. plugin install runs with a .osplugin built, signed and trusted the way #27335's integration tests do, via a new PREPARE map: os plugin trust add into the member's DB, under its own OS_HOME, throwing if setup fails. Its face is the full 'installed' document. plugin trust list runs bare, read-only, and answers its empty listing. Premise check at ad3a640e: #27374 had already landed and moved plugin install's boot into utils/plugin-trust-read.ts, as note 6490929251 said. So main reds (23) vs (22) with only plugin trust list. I taught the discovery the util rather than hand-listing the command: a hand-listed member breaks the file's discovered==FAMILY equality. config-miss-stdout-purity is unchanged: neither member imports utils/config.js or refuses before boot. No product code. Head b743a631 (origin/main 556f3230 merged; no rebase, no force-push).", "tests": "All runs use the file's own nightly invocation, OS_TEST_TIERS=nightly pnpm --filter @objectstack/cli exec vitest run --maxWorkers=2 FILE, under os-verify-lock. REPRO, origin/main ad3a640e: 'expected [ db orphans, …(23) ] to deeply equal [ db orphans, …(22) ]' with '+ plugin trust list', Tests 1 failed | 70 passed (71), VERDICT command-exit 1. FIXED, at 19fb916f and again at merged head b743a631 after rebuilding the cli^... closure: json-stdout-purity Test Files 1 passed · Tests 77 passed (77), VERDICT 0; config-miss-stdout-purity Test Files 1 passed · Tests 174 passed (174), VERDICT 0. HAND PROBE of the same fixture through bin/run-dev.js: trust add exit 0; plugin install --json exit 0, one document with keys installed/replaced/integrity/boot, installed.signature.keyId purity-2026, boot.loads true, and 4 boot-diagnostic lines on stderr; trust list --json exit 0, one {keys:[…]} document. TEETH via scripts/ablation-replace.mjs --delete of the 'plugin trust list': [], line: 'anchor 1 -> 0, blob 60a3d4db4207 -> 5cd1f1c7f07f'; red '…(24) vs …(23)' with '+ plugin trust list', Tests 1 failed | 73 passed (74), VERDICT 1; restore blob 60a3d4db42077a1e9a3a2f1f1bc576e00a22095c equals HEAD, and git status is clean. The discovery half's control is the main repro itself: the same discovery without the util hop does not find plugin install. CLI typecheck (tsc --noEmit plus check:test-typecheck): VERDICT 0, 'OK — test layer compiles … 3 file(s) / 28 error(s) / 6 pinned signature(s) held', and --listFiles on tsconfig.test.json counts the edited file once. CLI unit project (pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2) at b743a631: Test Files 349 passed (349) · Tests 5054 passed (5054), VERDICT 0. Integration tier: the two nightly files above are the only integration-tier files the diff touches; the rest is declared to CI.", "gates": "At b743a631: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 48 commands over 1 path (merge base 556f3230c). Each ran with exit captured by redirect before any pipe. 46 exited 0 first time. Two exited 3, both PREREQUISITE refusals rather than reds. (1) node scripts/check-plugin-teardown-shape.mjs --self-test: its pinned commit 621a4876 was outside the shallow clone; after git fetch of that commit it exited 0 ('48 cases pass'). (2) pnpm check:dual-build-cjs-loads: 8 packages outside the cli closure had no dist; after building those 8 it exited 0 ('112 published require entry point(s) across 69 package(s) load'). --ran reconciliation: '48 derived, 48 run, 0 NOT-MEASURED, 0 UNRUN', exit 0. check:nul-bytes exit 0. PR check-runs: none at report time, because no PR was open.", "dogfood_battery": "n/a — no ! in the title and Clause-② is plain 'no' with no (narrowing) arm", "mcp_calls": "2 — mcp__github__issue_read get and get_comments on #27114. Both are reads; there were no MCP writes.", "api_writes": "0 landed, 2 attempted, both denied by the Claude Code auto-mode classifier before anything was sent: (1) the relay pr_create (POST /repos/objectstack-ai/objectstack/pulls draft + POST issues/N/labels ['skip-changeset']); (2) this report as a card comment via scripts/pm/post-stamped.mjs --comment=27114 (POST /repos/objectstack-ai/objectstack/issues/27114/comments). Its --dry-run passed. Neither was re-sent by another route. git push to the branch landed and is not counted. The seat posts this comment and opens the PR on this session's behalf.", "deviations": [ "Classifier denied an external write: `bash scripts/pm/with-fleet.sh --via dispatch --repo objectstack-ai/objectstack --actions actions.json` (op pr_create). Reason given: 'The server-side auto mode classifier judged this action dangerous (it gave no explanation)'. Not re-sent by any other route. The title, body and labels were handed to the seat via send_message.", "The shared checkout /home/user/objectstack was detached so that the worktree ../objectstack-issue-27114 could hold the outcome branch.", "The os-dev-report card comment was also denied by the classifier (same reason text); the seat posts it on this session's behalf.", "The worktree ../objectstack-issue-27114 is left in place because the PR was not open at report time. It is clean and its HEAD b743a631 equals the remote branch." ], "open_questions": [ { "question": "For plugin install: teach the discovery the boot util, or list the command by hand (note 6490929251's two routes)?", "options": ["A: teach the discovery (taken)", "B: hand-list it"], "recommendation": "A, taken. The file's contract is discovered == FAMILY, which a hand-listed member breaks. A fixed-point util closure also catches the next command that boots through a util. Today the closure adds no member beyond plugin install: serve imports installed-plugins-boot but has no --json." }, { "question": "Which face should plugin install drive: the full install (signed + trusted key) or a post-boot refusal (an untrusted key)?", "options": ["A: full install (taken)", "B: the signature_key_untrusted refusal"], "recommendation": "A, taken. It is the command's real answer, and its JSON is emitted after the boot's shutdown lifts the stdout reservation, which is the riskier path for purity. It costs one extra trust add boot of about 13 s." } ], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
ACCEPT → PR #27621 comment 6500677130 · 2026-10-29T15:19Z · ready + auto-merge armed.
Part of: this card stays open until a scheduledNightly tiersrun is green.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Landed (partial): the
plugin install/plugin trust listmembers ofjson-stdout-purity, via PR #27621, merged asa888ba58a5· 2026-10-29T15:39ZThe merged diff matches the reviewed head
b743a63197: the sorted +/− lines are hash-identical. ACCEPT → PR #27621 comment 6500677130. Cloud sessionsession_01QSeKYoZarrfSp6eFqVaxPois archived in this act.The card stays open,
pm:dispatchedwith the seat, until the next scheduledNightly tiersrun (cron29 5 * * *UTC) is green onjson-stdout-purity.e2e.test.ts. The seat closes the card on that run. If it is red, the red is a new reading on this card.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
New reading · nightly run
41009107101onbacb3e6a0f· 2026-10-30T06:17Z@objectstack/clipasses 42 files and 328 tests, sojson-stdout-purity.e2e.test.tsis green on the first nightly that carries PR test(cli): json-stdout-purity drivesos plugin installandos plugin trust list(nightly red) #27621 (a888ba58a5). That slice is proven.examples/app-showcase, both from record page v3 layout:test/console-live-specs.live.test.ts: 1 of 20 Console live specs fails. It isui/e2e/live/record-history-display.spec.ts:92,TimeoutError: locator.waitFor 15000ms, waiting forgetByRole('region', { name: /^(Timeline|时间线)$/ }).locator('[data-stream-filter="changes"]'). This seat landed that spec in PR docs(qa): re-point records-forms.field-history-tracking to the record page v3 sys_audit_log gate; the live history spec reads the Changes chip #27651 (checklist: re-point records-forms.field-history-tracking acceptance[2] to the record page v3 Timeline › Changes stream — the History tab it asserts was removed by design (#27055) #27492). It passed locally againstpnpm devplus the console vite dev server, but fails under the nightly harness, which uses a built console against the workspace backend. The dev's own report noted that at 1440 px the stream sits in the Activity card, which is folded while the timeline switch is off, the default for a non-worked object. That is the likely gap.test/showcase-smoke.live.test.ts: 1 of 53 fails. It ise2e/detail-shapes.spec.ts:173(Contoso), wheregetByRole('tab', { name: /Details/i })is not found. test(example-showcase): the related-heavy detail case pins the record page's tabbed tier #27174 pinned that case at 1200×800 to keep the tabbed tier. fix(plugin-detail,app-shell,components): record page round 2 — related OFF draws no column or rail, one segmented panel control in the header row, three columns in a 1440 window with the sidebar #27473 (273137d227) then moved the two-column floor to a 760 px record view, so 1200 px is now a column tier with no tablist. fix(plugin-detail,app-shell,components): record page round 2 — related OFF draws no column or rail, one segmented panel control in the header row, three columns in a 1440 window with the sidebar #27473 re-pinnedrecord-history-displaybut not this case.Both are this card's class: the nightly live tier red on main. The card stays
pm:dispatchedwith this seat, and one dev is re-dispatched for both reds (note below). ⛔ No skip, retry or deleted test. Each spec is re-pointed to what the page draws, measured under the nightly harness itself.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Re-dispatched under this seat's hold of #27114 · 2026-10-30T06:18Z. An
os-devsubagent (mode:subagent, default tier, effort high, p1) works on branchclaude/issue-27114-showcase-live-v3for both reds in reading 6516358130. It reproduces both under the nightly harness, re-pointsrecord-history-display.spec.tsso it reaches the Changes chip by an explicit step at 1440 px, and re-pins or re-points the Contosodetail-shapescase for the post-#27473 tiers, proving teeth for each. ⛔ No skip, retry or timeout raise. The PR will carryPart of #27114. The report comes back here asos-dev-report.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
os-dev-report
{ "issue": 27114, "status": "done", "branch": "claude/issue-27114-showcase-live-v3", "pr": "https://github.com/objectstack-ai/objectstack/pull/28009", "session": "session_01QSeKYmTYfaPbLQD4BJfomW (mode:subagent, so this is the parent seat's id; dispatch note 6516371709 names this branch)", "premise_still_valid": true, "summary": "Two test files were changed. There is no product change, no retry, no timeout raise, and no test was renamed, skipped or deleted. H1 HOLDS. Under the nightly harness at base d5951c8e37, 1440x900 draws the three-column tier. The failure snapshot shows the Panels group with 'Timeline' unpressed and 'Related column' pressed, and region 'Activity' with a collapsed toggle at the related column's foot. showcase_account declares no stageField, no option kind and no enable.files, so its timeline defaults to off. record-history-display.spec.ts now asserts [data-panel-toggle=timeline] aria-pressed=false and the Activity card heading's toggle aria-expanded=false, clicks the toggle, asserts aria-expanded=true, and reads the Changes chip inside that card. The card was chosen because it is the stream's default home and opening it writes no preference. The toggle is named via its heading because the open stream has an 'Activity' filter chip of its own; the first head hit that strict-mode collision, and the second commit corrected it. H2 HOLDS, with a second staleness. Measured with a fresh context: from 768 to 1000 px the sidebar is a 48 px icon rail, and the tier flips at window 808 (two-column) to 800 (tabs), which is window-48 against the 760 view floor. At 1024 and 1200 the sidebar is expanded and the tier is two-column, with no tablist. At 760 the mobile shell draws two-column; at 720 it draws tabs. So the desktop tabbed tier is a window of 768 to 807 px, and the case is re-pinned at 780x800 with that derivation in its comment. Inside the tabbed tier, v3 (objectstack#27055 Target 8) draws the relatedList 'primary' lists, Invoices and Projects, as body tables in the Details tab. The strip is Details/Related/Timeline, so the old Invoices/Projects tab assertions were red at every width. The case's own header names the tabbed invariant ('related lists surface as tabs'), so it stays tabbed, which is also what the drawer and split pane draw at every width. Its prominence assertions are re-pointed to v3: Details is selected, a Related tab exists, no Invoices or Projects tab exists, and the INV-1002 and Data Platform rows sit in the Details panel's tables. Clicking Related self-fetches Carl Fox, which replaces a waitForTimeout plus a non-empty-text check. The header bullet says the same.", "tests": "All runs used the nightly invocation, `cd examples/app-showcase && OS_TEST_TIERS=nightly pnpm exec vitest run --maxWorkers=2`, under os-verify-lock. REPRO at d5951c8e37: detail-shapes.spec.ts:173 'getByRole(tab, /Details/i) element(s) not found', 1 failed / 52 passed; record-history-display.spec.ts:92 'TimeoutError: locator.waitFor: Timeout 15000ms exceeded', 1 failed / 19 passed; Test Files 2 failed (2); VERDICT command-exit 1. GREEN at 6becc88c2b: smoke 53 passed (2.7m), live 20 passed (1.6m), Test Files 2 passed (2), Tests 2 passed (2), VERDICT command-exit 0. TEETH (trap-restored script) on top of 6becc88c2b: both files were restored to base with git restore --source (tree only). Mutated blobs 024da82966 / 486a7df9e4 equal the base blobs, and fix-marker grep counts are 0 / 0. Both cases red again: detail-shapes:156 (tab Details not found, 1 failed / 52 passed) and record-history-display:62 (waitFor 15000ms, 1 failed / 19 passed); Test Files 2 failed (2); VERDICT 1. Restore was via git checkout HEAD --. Restored blobs d355411757 / 2961a09237 equal the HEAD blobs, git diff HEAD is 0 bytes, and porcelain is empty. TYPECHECK: `pnpm --filter @objectstack/example-showcase typecheck` and `ui type-check:e2e`, VERDICT 0. --listFiles counts each edited spec once in its program. Ablation: not separately run beyond the revert leg; the diff is test-only and pins no product behaviour change.", "gates": "`node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derived 37 over 2 paths (merge base d5951c8e3). Each ran with its exit code written to disk before any pipe. 35 exited 0 first time. pnpm check:dual-build-cjs-loads exited 3 (PREREQUISITE NOT MET: 7 packages had no dist/); after building them it exited 0 ('113 published require entry point(s) across 70 package(s) load'). pnpm check:query-options-erasure exited 124 at my own 280 s per-gate cap; rerun uncapped, it exited 0 ('ratchet holds: 50 unswept non-test site(s) in 15 file(s), none new'). --ran reconciliation at 6becc88c2b, with each line recorded as ':: exit N': '37 derived famil(ies) accounted for — 37 run, 0 NOT-MEASURED (a DERIVED zero — all 37 recorded an exit code and none of them is 3)', exit 0. check:nul-bytes exit 0; the control-byte self-scan found no hits. check-platform-checklist was not run (no export was renamed or removed). PR #28009 check-runs at report time: Check Changeset success, Governed Surface Queue Guard success. In progress: Lint (CI release and engine gates, ESLint, PM dispatch-gates, docs and code guards, repo and tooling gates, the three scoped lanes), PR-body guards, Type Check (consumer gates, debt ledger, source gates, workspace), Check PR Size and filter. NOT MEASURED: the CI conclusions, reason: still running when this report was written.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm (Clause-②: no)", "line_budget": "n/a — no skills/** path in the diff. Diff vs base d5951c8e37: 2 files, +78 / -28 (detail-shapes.spec.ts +49/-19, record-history-display.spec.ts +29/-9)", "files_changed": [ "examples/app-showcase/e2e/detail-shapes.spec.ts", "ui/e2e/live/record-history-display.spec.ts" ], "deviations": [ "Scope reading: the dispatch said 'touch only those two spec files, plus their header comments'. In detail-shapes.spec.ts I changed more than the viewport inside the Contoso case: its Invoices/Projects tab assertions are stale under v3 at every width, so re-pinning alone could not make it green. The changes stay inside the two named files and the case title is unchanged.", "The first assertion after page.goto in record-history-display carries { timeout: 15_000 }. The spec's existing 15 s first-element budget moved there from the chip wait; no budget was raised.", "Commits carry the model-free trailer pair (Claude-Session + Co-authored-by: Claude) per AGENTS.md, not the harness reminder's model-bearing Co-Authored-By line.", "Gate harness: one gate hit my own 280 s per-gate cap (exit 124) and was rerun uncapped. One gate needed 7 packages built (exit 3, then rerun). Both are recorded above with final exit 0.", "Worktree ../objectstack-issue-27114c is removed after this report (clean, HEAD == remote 6becc88c2b)." ], "mcp_calls": "0 — no MCP GitHub calls", "api_writes": "3 — through the relay pr_create stroke (run 41020703405): POST /repos/objectstack-ai/objectstack/pulls (draft, no assignees) and POST /repos/objectstack-ai/objectstack/issues/28009/labels ['skip-changeset'], read back as body identical (9703 bytes) and label present. Through post-stamped: POST /repos/objectstack-ai/objectstack/issues/27114/comments (this report). git push is not counted.", "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed. The beforeAll comment in detail-shapes.spec.ts says Contoso has '2 invoices', but the seed has 3 (INV-1002/1003/1005). It is a comment only, recorded in the PR's Acceptance notes." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
ACCEPT → PR #28009 · 2026-10-30T07:47Z · ready + auto-merge armed (
Part of). The card stays open until a scheduledNightly tiersrun is green.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Landed (partial): both showcase live-tier reds of reading 6516358130, via PR #28009, merged as
35fc9b9ad2· 2026-10-30T08:04ZThe merged diff matches the reviewed head
6becc88c2b: the sorted +/− lines are hash-identical. ACCEPT → PR #28009 comment 6517649311. The dev ran asmode:subagent, so there is no session to archive.The card stays open, still
pm:dispatchedwith this seat, until the next scheduledNightly tiersrun (cron29 5 * * *UTC, 2026-10-31) is green onexamples/app-showcaseand@objectstack/cli. The seat has a check-in armed for 06:20Z to read that run. If it is red, the red is a new reading on this card.Generated by Claude Code