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-28T06:19:26.244Z · expected every 24h while this card stands (cron 29 5 * * * UTC) · next by 2026-10-29T05:29Z · run log · commit 76e90df6135f585916934c3b6ee3d148d7b850d2 · 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
packages/cli/test/migrate-meta.e2e.test.ts
shard-2 — last lines of the test log
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os start: SIGTERM to the parent leaves no child process and a free port �[33m 23606�[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 23069�[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 23400�[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 23229�[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 55645�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses to boot with the ADR-0093 D5 "could not be loaded" diagnosis �[33m 12841�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m boots degraded when the operator explicitly sets OS_ALLOW_DEGRADED_TENANCY=1 �[33m 16384�[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 13347�[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 13064�[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 43333�[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 16573�[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 13002�[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 13746�[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 52469�[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 63363�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m reports a boot failure as exit 1, not as a clean 0 �[33m 13744�[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 72636�[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 12672�[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 12735�[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 13311�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m the three runs are DISTINGUISHABLE — the defect was that they were not �[33m 20914�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m `--json` prints no step line at all and stays one JSON document �[33m 12995�[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 35014�[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 17266�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m control: without the app page, plugin-auth's page serves as before �[33m 17742�[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 17694�[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 17512�[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 113502�[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 90213�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses on the human face, naming the flag it requires �[33m 13136�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m the --json face stays a machine face — one JSON document, nothing on stderr �[33m 12846�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m nothing is minted — the payload key set is exactly `error` �[33m 12798�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m is judged on the flag being TYPED, not on the path resolving �[33m 12553�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m `--eval --generator` still loads the generator and runs live �[33m 13178�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m offline `--eval` with no generator is untouched �[33m 12998�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m a plain project lint is untouched �[33m 12696�[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 65276�[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 38391�[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 26168�[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 13578�[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 12582�[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 38689�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m states the posture in --help �[33m 12940�[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 25278�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m exits non-zero WITHOUT --strict, naming the key and the near-miss �[33m 12659�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m control: the identical stack with the key spelled `flows` exits 0 �[33m 12611�[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 19205�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os validate �[33m 9897�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os build �[33m 9302�[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 129336�[2mms�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[31m⎯⎯⎯⎯⎯⎯⎯�[39m�[1m�[41m Failed Tests 6 �[49m�[22m�[31m⎯⎯⎯⎯⎯⎯⎯�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[41m�[1m FAIL �[22m�[49m �[30m�[45m integration �[49m�[39m test/migrate-meta.e2e.test.ts�[2m > �[22mos migrate meta --from 16 (e2e over the real CLI)�[2m > �[22mreplays the v17 chain and reports schema-valid output
@objectstack/cli:test: �[31m�[1mAssertionError�[22m: expected false to be true // Object.is equality�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[32m- Expected�[39m
@objectstack/cli:test: �[31m+ Received�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[32m- true�[39m
@objectstack/cli:test: �[31m+ false�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[36m �[2m❯�[22m test/migrate-meta.e2e.test.ts:�[2m178:36�[22m�[39m
@objectstack/cli:test: �[90m176|�[39m �[34mit�[39m(�[32m'replays the v17 chain and reports schema-valid output'�[39m�[33m,�[39m () �[33m=>�[39m {
@objectstack/cli:test: �[90m177|�[39m �[34mexpect�[39m(out�[33m.�[39mparsed�[33m.�[39m�[35mfrom�[39m)�[33m.�[39m�[34mtoBe�[39m(�[34m16�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m178|�[39m �[34mexpect�[39m(out�[33m.�[39mparsed�[33m.�[39mschemaValid)�[33m.�[39m�[34mtoBe�[39m(�[35mtrue�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m |�[39m �[31m^�[39m
@objectstack/cli:test: �[90m179|�[39m })�[33m;�[39m
@objectstack/cli:test: �[90m180|�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/6]⎯�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[41m�[1m FAIL �[22m�[49m �[30m�[45m integration �[49m�[39m test/migrate-meta.e2e.test.ts�[2m > �[22mos migrate meta --from 16 (e2e over the real CLI)�[2m > �[22mattributes at least one rewrite to every expected v17 conversion family
@objectstack/cli:test: �[31m�[1mAssertionError�[22m: expected a rewrite from action-execute-to-target; got sharing-rule-access-level-full-to-edit: expected false to be true // Object.is equality�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[32m- Expected�[39m
@objectstack/cli:test: �[31m+ Received�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[32m- true�[39m
@objectstack/cli:test: �[31m+ false�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[36m �[2m❯�[22m test/migrate-meta.e2e.test.ts:�[2m184:88�[22m�[39m
@objectstack/cli:test: �[90m182|�[39m const ids = new Set(out.parsed.applied.map((a: any) => a.conversio…
@objectstack/cli:test: �[90m183|�[39m �[35mfor�[39m (�[35mconst�[39m id �[35mof�[39m �[33mEXPECTED_CONVERSIONS�[39m) {
@objectstack/cli:test: �[90m184|�[39m expect(ids.has(id), `expected a rewrite from ${id}; got ${[...id…
@objectstack/cli:test: �[90m |�[39m �[31m^�[39m
@objectstack/cli:test: �[90m185|�[39m }
@objectstack/cli:test: �[90m186|�[39m })�[33m;�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/6]⎯�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[41m�[1m FAIL �[22m�[49m �[30m�[45m integration �[49m�[39m test/migrate-meta.e2e.test.ts�[2m > �[22mos migrate meta --from 16 (e2e over the real CLI)�[2m > �[22mthe --out snapshot re-parses under the CURRENT schema and carries the rewrites
@objectstack/cli:test: �[31m�[1mAssertionError�[22m: [{"code":"unrecognized_keys","keys":["responsive","performance"],"path":["views",0,"list"],"message":"Unrecognized key(s) on this list view: `responsive`, `performance`. Keys retired before the previous protocol major are no longer prescribed here — see the protocol upgrade guide: https://objectstack.ai/docs/protocol-upgrade. Until these shapes were closed an unknown key was dropped silently — the view still rendered, without whatever the key was meant to configure."},{"code":"unrecognized_keys","keys":["defaultSort","aria"],"path":["views",0,"form"],"message":"Unrecognized key(s) on this form view: `defaultSort`, `aria`. Did you mean `defaultSort` → `defaults`? Keys retired before the previous protocol major are no longer prescribed here — see the protocol upgrade guide: https://objectstack.ai/docs/protocol-upgrade. Until these shapes were closed an unknown key was dropped silently — the view still rendered, without whatever the key was meant to configure."},{"code":"unrecognized_keys","keys":["aria","performance"],"path":["dashboards",0],"message":"Unrecognized key(s) on this dashboard: `aria`, `performance`. Keys retired before the previous protocol major are no longer prescribed here — see the protocol upgrade guide: https://objectstack.ai/docs/protocol-upgrade. Until this shape was closed these were dropped silently — the dashboard still rendered, without whatever the key was meant to configure."}]: expected false to be true // Object.is equality�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[32m- Expected�[39m
@objectstack/cli:test: �[31m+ Received�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[32m- true�[39m
@objectstack/cli:test: �[31m+ false�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[36m �[2m❯�[22m test/migrate-meta.e2e.test.ts:�[2m215:99�[22m�[39m
@objectstack/cli:test: �[90m213|�[39m const snap = JSON.parse(readFileSync(join(dir, 'migrated.json'), '…
@objectstack/cli:test: �[90m214|�[39m �[35mconst�[39m parsed �[33m=�[39m �[33mObjectStackDefinitionSchema�[39m�[33m.�[39m�[34msafeParse�[39m(snap)�[33m;�[39m
@objectstack/cli:test: �[90m215|�[39m expect(parsed.success, JSON.stringify(parsed.success ? '' : parsed…
@objectstack/cli:test: �[90m |�[39m �[31m^�[39m
@objectstack/cli:test: �[90m216|�[39m
@objectstack/cli:test: �[90m217|�[39m �[90m// Spot-check one rewrite per family on the snapshot itself.�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/6]⎯�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[41m�[1m FAIL �[22m�[49m �[30m�[45m integration �[49m�[39m test/migrate-meta.e2e.test.ts�[2m > �[22mos migrate meta --from 16 (e2e over the real CLI)�[2m > �[22mis idempotent: replaying the chain on the migrated snapshot applies zero changes
@objectstack/cli:test: �[31m�[1mAssertionError�[22m: expected false to be true // Object.is equality�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[32m- Expected�[39m
@objectstack/cli:test: �[31m+ Received�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[32m- true�[39m
@objectstack/cli:test: �[31m+ false�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[36m �[2m❯�[22m test/migrate-meta.e2e.test.ts:�[2m254:33�[22m�[39m
@objectstack/cli:test: �[90m252|�[39m �[35mconst�[39m again �[33m=�[39m �[33mJSON�[39m�[33m.�[39m�[34mparse�[39m(stdout)�[33m;�[39m
@objectstack/cli:test: �[90m253|�[39m �[34mexpect�[39m(again�[33m.�[39mapplied)�[33m.�[39m�[34mtoEqual�[39m([])�[33m;�[39m
@objectstack/cli:test: �[90m254|�[39m �[34mexpect�[39m(again�[33m.�[39mschemaValid)�[33m.�[39m�[34mtoBe�[39m(�[35mtrue�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m |�[39m �[31m^�[39m
@objectstack/cli:test: �[90m255|�[39m } �[35mfinally�[39m {
@objectstack/cli:test: �[90m256|�[39m try { rmSync(dir2, { recursive: true, force: true }); } catch { …
@objectstack/cli:test:
@objectstack/cli:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/6]⎯�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[41m�[1m FAIL �[22m�[49m �[30m�[45m integration �[49m�[39m test/migrate-meta.e2e.test.ts�[2m > �[22mos migrate meta over a source carrying a retired key (#9418)�[2m > �[22mloads it, converts it, and reports the migrated stack schema-valid
@objectstack/cli:test: �[31m�[1mAssertionError�[22m: expected undefined to be 'agents[0].knowledge' // Object.is equality�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[32m- Expected:�[39m
@objectstack/cli:test: "agents[0].knowledge"
@objectstack/cli:test:
@objectstack/cli:test: �[31m+ Received:�[39m
@objectstack/cli:test: undefined
@objectstack/cli:test:
@objectstack/cli:test: �[36m �[2m❯�[22m test/migrate-meta.e2e.test.ts:�[2m437:54�[22m�[39m
@objectstack/cli:test: �[90m435|�[39m // …and through helpers imported from a spec subpath, which is whe…
@objectstack/cli:test: �[90m436|�[39m // tolerance scoped to `defineStack` alone would still have refuse…
@objectstack/cli:test: �[90m437|�[39m expect(appliedAt.get('agent-knowledge-removed')).toBe('agents[0].k…
@objectstack/cli:test: �[90m |�[39m �[31m^�[39m
@objectstack/cli:test: �[90m438|�[39m expect(appliedAt.get('skill-trigger-phrases-removed')).toBe('skill…
@objectstack/cli:test: �[90m439|�[39m �[34mexpect�[39m(parsed�[33m.�[39mschemaValid)�[33m.�[39m�[34mtoBe�[39m(�[35mtrue�[39m)�[33m;�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/6]⎯�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[41m�[1m FAIL �[22m�[49m �[30m�[45m integration �[49m�[39m test/migrate-meta.e2e.test.ts�[2m > �[22mos migrate meta over a source carrying a retired key (#9418)�[2m > �[22mstill refuses the same source everywhere else — `os validate` keeps the prescription
@objectstack/cli:test: �[31m�[1mAssertionError�[22m: expected '\n◆ Validate\n───────────────────────…' to match /`agent\.knowledge` was removed/�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[32m- Expected:�[39m
@objectstack/cli:test: /`agent\.knowledge` was removed/
@objectstack/cli:test:
@objectstack/cli:test: �[31m+ Received:�[39m
@objectstack/cli:test: "
@objectstack/cli:test: ◆ Validate
@objectstack/cli:test: ────────────────────────────────────────
@objectstack/cli:test: → Loading configuration...
@objectstack/cli:test:
@objectstack/cli:test: ✗ [
@objectstack/cli:test: {
@objectstack/cli:test: \"code\": \"unrecognized_keys\",
@objectstack/cli:test: \"keys\": [
@objectstack/cli:test: \"knowledge\"
@objectstack/cli:test: ],
@objectstack/cli:test: \"path\": [],
@objectstack/cli:test: \"message\": \"Unrecognized key(s) on this agent: `knowledge`. Keys retired before the previous protocol major are no longer prescribed here — see the protocol upgrade guide: https://objectstack.ai/docs/protocol-upgrade. Until this shape was closed these were dropped silently — the agent still registered and still answered, minus whatever the key was meant to configure or constrain.\"
@objectstack/cli:test: }
@objectstack/cli:test: ]
@objectstack/cli:test: "
@objectstack/cli:test:
@objectstack/cli:test: �[36m �[2m❯�[22m test/migrate-meta.e2e.test.ts:�[2m461:22�[22m�[39m
@objectstack/cli:test: �[90m459|�[39m refused �[33m=�[39m �[35mtrue�[39m�[33m;�[39m
@objectstack/cli:test: �[90m460|�[39m const output = `${String(e.stdout ?? '')}${String(e.stderr ?? ''…
@objectstack/cli:test: �[90m461|�[39m �[34mexpect�[39m(output)�[33m.�[39m�[34mtoMatch�[39m(�[36m/`agent\.knowledge` was removed/�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m |�[39m �[31m^�[39m
@objectstack/cli:test: �[90m462|�[39m �[34mexpect�[39m(output)�[33m.�[39m�[34mtoMatch�[39m(�[36m/os migrate meta --from 16/�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m463|�[39m }
@objectstack/cli:test:
@objectstack/cli:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/6]⎯�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test:
@objectstack/cli:test: �[2m Test Files �[22m �[1m�[31m1 failed�[39m�[22m�[2m | �[22m�[1m�[32m41 passed�[39m�[22m�[90m (42)�[39m
@objectstack/cli:test: �[2m Tests �[22m �[1m�[31m6 failed�[39m�[22m�[2m | �[22m�[1m�[32m322 passed�[39m�[22m�[90m (328)�[39m
@objectstack/cli:test: �[2m Start at �[22m 05:40:11
@objectstack/cli:test: �[2m Duration �[22m 1080.45s�[2m (transform 9.52s, setup 0ms, import 18.41s, tests 3169.14s, environment 6ms)�[22m
@objectstack/cli:test:
@objectstack/cli:test: JSON report written to /home/runner/work/objectstack/objectstack/packages/cli/.nightly-tiers/vitest-report.json
@objectstack/cli:test: ELIFECYCLE Test failed. See above for more details.
::error::command (/home/runner/work/objectstack/objectstack/packages/cli) /opt/hostedtoolcache/node/22.23.3/x64/bin/pnpm run test --shard=2/2 --reporter=default --reporter=json --outputFile.json=.nightly-tiers/vitest-report.json exited (1)
@objectstack/cli#test: ERROR command (/home/runner/work/objectstack/objectstack/packages/cli) /opt/hostedtoolcache/node/22.23.3/x64/bin/pnpm run test --shard=2/2 --reporter=default --reporter=json --outputFile.json=.nightly-tiers/vitest-report.json exited (1)
Tasks: 61 successful, 62 total
Cached: 0 cached, 62 total
Time: 23m42.418s
Summary: /home/runner/work/objectstack/objectstack/.turbo/runs/3LJLC20pRbpJElPAXtomaa3yhWw.json
Failed: @objectstack/cli#test
ERROR run failed: command exited (1)
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
objectstack-fleet commentedon Oct 28, 2026
os-dev-report
{ "issue": 27114, "status": "done", "branch": "claude/issue-27114-showcase-detail-tabs", "pr": "https://github.com/objectstack-ai/objectstack/pull/27174", "session": "session_01QSeKYobVx7yTf1SUMMbKnP — cloud dev session; dispatched by session_01QSeKYmTYfaPbLQD4BJfomW (claim 6463869260, which names this branch)", "premise_still_valid": true, "summary": "Reproduced on origin/main 24351cfe under the nightly invocation: 52/53, detail-shapes.spec.ts:156 'ungrouped + related-heavy' fails at getByRole('tab', {name: /Details/i}). The screenshot shows the record page's two-column tier: two columns, a 'Related 5' toggle, no tablist. Bisect boundary: 1f1eda4d (0d07de2f^) gives 53/53 green and 0d07de2f (#26758) gives 52/53 red, both on full trees at those commits. #26758 implements the maintainer's ruling 1 on epic #26676 (「抽屉和整页是同一张页在两个宽度。」). Its table rules that a 1024-1279 px container gets details · timeline plus a Related (N) toggle, and only below 1024 px gets the tab strip. So this is RULED behaviour, not a regression. #26758 fixed its own ui/e2e/live specs by pinning a 1200 px viewport and missed this showcase case. The fix pins page.setViewportSize(1200x800) in that one case: +8 lines, no assertion touched, nothing skipped, retried or moved. PR #27174 is a draft, Part of #27114, label skip-changeset.", "tests": "Nightly invocation each time: cd examples/app-showcase && CI=1 OS_TEST_TIERS=nightly OS_TEST_CHROMIUM_EXECUTABLE_PATH=/opt/pw-browsers/chromium pnpm exec vitest run --maxWorkers=2 test/showcase-smoke.live.test.ts, after turbo build --filter=@objectstack/example-showcase^... and pnpm console:build. Readings: main 24351cfe '1 failed / 52 passed', VERDICT command-exit 1. Bisect 1f1eda4d '53 passed', exit 0. Bisect 0d07de2f '1 failed / 52 passed' at the same L165 assertion, exit 1. Fix 9bfc7e48 '53 passed', exit 0. Merged head f81fbddd (origin/main 3346da26 brought a RecordDetailView.tsx change, so it was rebuilt and re-run) '53 passed, Test Files 1 passed', exit 0. pnpm --filter @objectstack/example-showcase typecheck: exit 0; its tsconfig includes e2e/**/*, and --listFiles counts the spec once. No ablation: no tested behaviour changed, and the bisect legs are the before/after proof.", "gates": "At f81fbddd: dispatch-gates --commands --repo objectstack-ai/objectstack derived 37 commands over 1 path. All 37 exit 0, each exit captured by redirect before any pipe. Exception: pnpm check:dual-build-cjs-loads first exited 3 (PREREQUISITE NOT MET: 7 packages outside the showcase closure had no dist/). After building those 7 it exited 0 ('112 published require entry point(s) across 69 package(s) load'). --ran on the exit-annotated record: '37 derived famil(ies) accounted for — 37 run, 0 NOT-MEASURED (a DERIVED zero)'. check:nul-bytes exit 0. CI check-runs on PR #27174: in_progress at report time, not waited on.", "dogfood_battery": "n/a — no in the PR title and no (narrowing) arm", "mcp_calls": "0 — no MCP GitHub calls, read or write. Reads were unauthenticated REST GETs: issue comments, and PR #27174 for the label and assignee read-back.", "api_writes": "2 — (1) fleet-write relay pr_create (repository_dispatch fw-20261028T091641Z-d72015, run 40662992802; POST pulls, plus the issues/27174/assignees and issues/27174/labels legs), read back identical, 4833 bytes; (2) this os-dev-report comment via scripts/pm/post-stamped.mjs on issue 27114. Plus git push to the branch (not a REST write).", "open_questions": [ { "question": "Pin the viewport per case or per file? #26758 used file-level test.use for its two ui/e2e specs.", "options": [ "A per case: page.setViewportSize in the Contoso case only (taken)", "B file-level test.use({viewport:1200x800})" ], "recommendation": "A, because the other three detail-shapes cases pass at the default Desktop Chrome viewport. A file-level pin would quietly move them off the column tier they render in today." }, { "question": "Should the showcase smoke also assert the column tiers (Related (N) toggle at 1280, three columns at a wider viewport)? The ruled #26758 layout has no live e2e at the showcase level.", "options": [ "A leave it to #26758's unit pins (RecordDetailView.recordPageTiers-26678) — no new card", "B a ui-lane card for a live showcase column-tier case" ], "recommendation": "A for this card. Adding coverage is outside a nightly-red fix; the seat can weigh B." }, { "question": "Trailer conflict: the harness reminder asked for 'Co-Authored-By: Claude Opus 5.5'. The repo's pre-push check:commit-card-trailers refused it, and os-dev.md requires the model-free pair.", "options": [ "A follow the repo (taken): the commit was amended before its first push to 'Co-authored-by: Claude' + Claude-Session" ], "recommendation": "A. The repo rule takes precedence, per the reminder's own clause." } ], "out_of_scope_findings": [ "carrier: none · noted, not filed — #26758's own PR body says 'Three columns need about 1536 px of screen with the sidebar open', so at common laptop widths the showcase record page sits in the two-column tier. That is ruled behaviour, recorded only so the next reader of a 'no tablist' red goes straight to the tier." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
ACCEPT → PR #27174 (the showcase file) comment 6465320140 · 2026-10-28T09:25Z · ready + auto-merge armed. With PR #27132 merged, both failing files have fixes. This card closes on the first scheduled nightly that is green on both.
Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
Landed (partial): the showcase file, via PR #27174, merged as
2f96d874fa· 2026-10-28T09:37ZThe merged diff matches the reviewed head
f81fbddd6c: the sorted +/− lines are hash-identical. ACCEPT → PR #27174 comment 6465320140. Cloud sessionsession_01QSeKYobVx7yTf1SUMMbKnPis archived in this act.Both failing files of this card now have a fix on
main: the cli file via #27132 (b15b2fcd02) and the showcase file via this PR. The card stays open,pm:dispatchedwith the seat, until the next scheduledNightly tiersrun (cron29 5 * * *UTC) is green on both files. The seat reads that run and closes the card on it. If it is red, the red is a new reading on this card.Generated by Claude Code