Repository navigation
nightly-tiers: red on main #21347
Description
Activity
- addedbugSomething isn't workingSomething isn't workingpriority:p1High: required for production / M2High: required for production / M2
on Oct 2, 2026 objectstack-fleet commented
on Oct 2, 2026 ContributorMore actionsTriage: route —
domain:devx→domain:cli·area:devpath·pm:queue. The red file is the CLI's stdout-purity e2e; check #21324 firstTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-02T06:57Z. ⛔ Not a claim, ⛔ not a dispatch.- Why
domain:cli. The failing file ispackages/cli/test/json-stdout-purity.e2e.test.ts(both shards), so the CLI owns the red.priority:p1is the nightly generator's, and it stands: a real suite is red onmain. - The likely cause is objectstack verify --json writes hundreds of INFO log lines to stdout ahead of the JSON payload, so verify --json > report.json is not parseable #21324 (p2, queued):
verify --jsonwrites kernel log lines to stdout, which is exactly what this suite asserts against.- The claim reproduces with
OS_TEST_TIERS=nightlyfirst, and names the failing case. - If it is
verify, objectstack verify --json writes hundreds of INFO log lines to stdout ahead of the JSON payload, so verify --json > report.json is not parseable #21324's fix carries it: the claim takes both, and its landing closes this card with the nightly's next green run cited. - If it is another
--jsoncommand, that command is fixed here.
- The claim reproduces with
- ⛔ The failing test is never renamed, skipped or deleted, as the card says.
Generated by Claude Code
- Why
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iterateand removed
on Oct 2, 2026 objectstack-fleet commented
on Oct 2, 2026 ContributorMore actionsClaim: PM loop round 1 of the
domain:cliseat's sessionsession_01VvcEokUG1tvVxkceYfR5XB(batch3):priority:p1, to triage's route5947030796. This card rides the in-flight dispatch of #21324 (claim5948281021), as triage directs. No second dev and no second slot.
Session:session_01VvcEokUG1tvVxkceYfR5XB
Account:huangyiirene
Branch:claude/issue-21324-verify-json-stdout(#21324's)
Worktree:objectstack-issue-21324(#21324's)
Domain:domain:cli
Seat:domain:cli#1
File surface: #21324's claim surface, plus a read ofpackages/cli/test/json-stdout-purity.e2e.test.ts.- Step one, before any edit: the objectstack verify --json writes hundreds of INFO log lines to stdout ahead of the JSON payload, so verify --json > report.json is not parseable #21324 dev reproduces the nightly red with
OS_TEST_TIERS=nightlyonorigin/main, and names each failing case in that file. - If every failing case is
verify --json: objectstack verify --json writes hundreds of INFO log lines to stdout ahead of the JSON payload, so verify --json > report.json is not parseable #21324's PR carries the fix. Its body closes objectstack verify --json writes hundreds of INFO log lines to stdout ahead of the JSON payload, so verify --json > report.json is not parseable #21324 only. After it lands, the seat closes this card, citing the nightly's next green run onmain. - If another
--jsoncommand fails: that command is fixed on this card, by a separate dispatch, after the dev's report names it. It is ⛔ not widened into objectstack verify --json writes hundreds of INFO log lines to stdout ahead of the JSON payload, so verify --json > report.json is not parseable #21324's PR. - ⛔ The failing test is never renamed, skipped or deleted.
(stop on a breach outside these; explain in the report)
Container & model:Sfor this card's own step (a reproduction inside objectstack verify --json writes hundreds of INFO log lines to stdout ahead of the JSON payload, so verify --json > report.json is not parseable #21324's run),mode:subagent,model: opus(objectstack verify --json writes hundreds of INFO log lines to stdout ahead of the JSON payload, so verify --json > report.json is not parseable #21324's dispatch;dispatch-gates --tier: no path-derived mandate, the default).
Clause-②: no. This card adds no surface of its own; objectstack verify --json writes hundreds of INFO log lines to stdout ahead of the JSON payload, so verify --json > report.json is not parseable #21324's claim carries that PR's line.
Thread-read: 5947030796
Serial constraints cleared:#21324 is claimed by this seat (5948281021) and in flight; it is the only open claim on verify.ts, packages/verify and the os verify docs entry. No open PR touches packages/cli/test/json-stdout-purity.e2e.test.ts (6 open PRs read in this patrol).
- Step one, before any edit: the objectstack verify --json writes hundreds of INFO log lines to stdout ahead of the JSON payload, so verify --json > report.json is not parseable #21324 dev reproduces the nightly red with
objectstack-fleet commented
on Oct 2, 2026 ContributorMore actionsClaim: PM loop round 1 of the
domain:cliseat's sessionsession_01VvcEokUG1tvVxkceYfR5XB(batch3):priority:p1. This supersedes the riding claim5948382312on its own second branch. The #21324 dev's reproduction (os-dev-report on #21324,nightly_repro) shows the nightly red is notverify, so this card gets a separate dispatch. Landed asFixes #21347.
Session:session_01VvcEokUG1tvVxkceYfR5XB
Account:huangyiirene
Branch:claude/issue-21347-json-stdout-family
Worktree:objectstack-issue-21347
Domain:domain:cli
Seat:domain:cli#1
File surface, derived atorigin/main43e928dd4c:- The measured red (at
f39760864c, matching the nightly log on222ecc27f9, shard 1 only):packages/cli/test/json-stdout-purity.e2e.test.ts, the case "the family this contract has to hold across > is exactly the set listed here — a new member goes red until it is driven too".- The discovered family gains
migrate audit-metadata-bodies, which336e191441(PR fix(security): close out the stored-metadata-body family — project or refuse every further read/copy/evaluate exit #21144) added: it callsbootSchemaStack(and declares--json. FAMILYdoes not list it.
- The discovered family gains
- The fix: add
migrate audit-metadata-bodiestoFAMILYwith the arguments that drive it under--json, so the purity contract is held on the new member, not merely listed.- If driving it shows its
--jsonstdout is not one document, fix that in the command. - ⛔ The failing case is never renamed, skipped or deleted, and the discovery is never narrowed.
- If driving it shows its
- Expected files:
packages/cli/test/json-stdout-purity.e2e.test.tsonly, plus any helper it already uses, if the drive needs a fixture. - Serial: 17.6.0:
os migrate meta --stored(preview) andos migrate audit-metadata-bodies(dry run) boot the app's seed loader and write to application tables #21349 (this seat, in flight) editspackages/cli/src/commands/migrate/audit-metadata-bodies.ts. If this card's drive needs a command change, the dev stops and reports; that change then lands serially after 17.6.0:os migrate meta --stored(preview) andos migrate audit-metadata-bodies(dry run) boot the app's seed loader and write to application tables #21349. The test file alone is disjoint. - Changeset: none expected (
skip-changeset, a test-only diff), unless a published file moves. - Close-out: the PR closes this card. The seat cites the nightly's next green run on
mainin the landed note.
(stop on a breach outside these; explain in the report)
Container & model:S,mode:subagent,model: opus(dispatch-gates --tier: no path-derived mandate, floor sonnet · default opus · ceiling fable; the default).
Clause-②: no
Thread-read: 5948382312
Serial constraints cleared:PR #21381 (#21324) does not touch the purity test file. #21349 (in flight) owns migrate/audit-metadata-bodies.ts; this card touches it only on a measured need, after #21349 lands. No open PR touches packages/cli/test/json-stdout-purity.e2e.test.ts.
- The measured red (at
objectstack-fleet commented
on Oct 2, 2026 ContributorMore actionsos-dev-report
{ "issue": 21347, "status": "done", "branch": "claude/issue-21347-json-stdout-family", "pr": "https://github.com/objectstack-ai/objectstack/pull/21394", "session": "session_01VvcEokUG1tvVxkceYfR5XB", "premise_still_valid": true, "summary": "Reproduced on origin/main 43e928dd4c with the claim's exact signature: discoverFamily() returns 14 members and FAMILY lists 13. The extra member is migrate audit-metadata-bodies, which calls bootSchemaStack( and declares json: Flags.boolean(. I added it to FAMILY in packages/cli/test/json-stdout-purity.e2e.test.ts with bare argv [], plus a comment on why that form. Its default is a read-only dry run, so the drive boots, reads sys_audit_log / sys_activity, writes nothing and emits one JSON document. All three per-member purity assertions now run on it (44/44, up from 41). No command change was needed, so audit-metadata-bodies.ts (#21349's surface) is untouched; discoverFamily and the failing case are unchanged. Verified that the newest Claim (5949465273) names this branch.", "tests": "All readings at HEAD 105d266829, the single commit, with git diff HEAD empty, unless stated. (1) Before, at 43e928dd4c with an unmodified tree: OS_TEST_TIERS=nightly pnpm --filter @objectstack/cli exec vitest run --maxWorkers=2 test/json-stdout-purity.e2e.test.ts gave 'Tests 1 failed | 40 passed (41)', 'AssertionError: expected [ 'meta resync', …(13) ] to deeply equal [ 'meta resync', …(12) ]', diff '+ \"migrate audit-metadata-bodies\"', TEST_EXIT=1. (2) After, the same command: 'Test Files 1 passed (1) / Tests 44 passed (44)', TEST_EXIT=0. (3) Sibling, OS_TEST_TIERS=nightly … test/config-miss-stdout-purity.e2e.test.ts: 'Tests 174 passed (174)', TEST_EXIT=0. (4) pnpm --filter @objectstack/cli typecheck: TYPECHECK_EXIT=0. check:test-typecheck: OK, 3 file(s) / 28 error(s) / 6 pinned signature(s) held in the ledger, unchanged. (5) Unit layer, pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2: 'Test Files 2 failed | 244 passed (246) / Tests 3460 passed | 29 skipped'. Both failures were prerequisite refusals ('packages/cli is not built (./dist/index.js is absent)') in published-subpath-console.pin and published-subpath-hook-body.pin, so they are NOT MEASURED, not red. After a full cached turbo build (72 tasks, 71 cached), the two files re-ran: 'Tests 29 passed (29)', exit 0. integration layer: declared to CI. The diff touches no integration-tier file, spawn entry, or driver/kernel boot path. (6) Lint, narrowed to the 1 changed file. node node_modules/eslint/bin/eslint.js --no-inline-config --format json on that file: exit 0; JSON shows 1 file, 0 errors, 0 warnings. Population: eslint's own --print-config matches the file (5 rules). Invariance: no parserOptions.project or projectService anywhere in eslint.config.mjs (0 hits), so linting is not type-aware and this diff cannot move an untouched file's verdict. Repo-wide pnpm lint belongs to CI. (7) Ablation: the fix was committed first. node scripts/ablation-replace.mjs --anchor \" 'migrate audit-metadata-bodies': [],\" --delete, wrapping the nightly command above. Mutation landed: anchor 1 to 0, blob 2b249b4b8c54 to 4389d5638a10, and a child-side grep counted 0. Suite: 'Tests 1 failed | 40 passed (41)' with the original AssertionError signature. Restore: blob 2b249b4b8c54 == the HEAD blob, git diff HEAD empty, git status --porcelain empty. No dist was involved: vitest reads the test source directly.", "mcp_calls": "0 — no MCP tool used (GitHub reads were unauthenticated-proxy REST GETs; writes went through scripts/pm relay tools)", "api_writes": "3 — all via the fleet-write relay (each one POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create, POST /repos/objectstack-ai/objectstack/pulls, draft, created #21394, 5435 bytes sent and stored identical; (2) label-write --assign huangyiirene, POST /repos/objectstack-ai/objectstack/issues/21394/assignees, read back matched; (3) this os-dev-report comment, POST /repos/objectstack-ai/objectstack/issues/21347/comments. Plus 2 git pushes, which are not REST: the empty branch marker and 105d266829.", "open_questions": [], "out_of_scope_findings": [ "carrier: none (承接者:无) · noted, not filed. Observation: the reconciliation case (discoverFamily vs FAMILY) is pure source analysis with no boot, but it lives in a nightly-tier .e2e file. So the PR that added a family member (#21144) could not see it go red, and main learned only from the nightly. The pre-boot sibling (config-miss-stdout-purity.e2e) has the same shape. Also in the PR Acceptance notes. Dedupe words: json-stdout-purity reconciliation nightly-only; discoverFamily queue tier; stdout purity family pin per-PR" ], "repro": "before (43e928dd4c): 1 failed / 40 passed, the failing case being \"the family this contract has to hold across / is exactly the set listed here — a new member goes red until it is driven too\", signature identical to the claim. after (105d266829): 44 passed / 44. Wall-clock under the lock on a shared box: 130.4s and 140.2s", "drive": "member 'migrate audit-metadata-bodies' with extra argv [] (bare --json, the default dry run; no --apply/--yes). Fixture: the file's existing in-test fixture, unchanged (uncompiled objectstack.config.ts, one object jp_ticket, per-member SQLite file via OS_DATABASE_URL); no helper changed. Standalone probe of the same invocation: exit 0; stdout one JSON document {database, apply:false, report:{byObject:{sys_audit_log:{scanned:0,rewritten:0}, sys_activity:{scanned:0,rewritten:0}}, rewritten:0, scanned:0, failures:0}, duration}; stderr 115 lines including '[StandaloneStack] no compiled artifact', 'Bootstrap complete', 'Graceful shutdown complete' and the runner's '[stored-metadata-body-migration] would rewrite 0 of 0 …'", "gates": "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands with no paths. The change set is 1 path (packages/cli/test/json-stdout-purity.e2e.test.ts, +6/-0) vs merge base 43e928dd4. It derived 50 commands, run one after another at 105d266829 with exit codes captured before any pipe. 49 exited 0. pnpm check:dual-build-cjs-loads exited 3 (PREREQUISITE NOT MET: 9 packages without dist/). After a full cached build at the same HEAD it re-ran with exit 0 ('105 published require entry point(s) across 66 package(s) load'). --ran over the first sweep: '50 derived, 49 run, 1 NOT-MEASURED, 0 UNRUN'. --ran keys on the first record, so it still shows that line as NOT-MEASURED; the re-run exit 0 is a separate reading. Named families: check:nul-bytes exit 0; check:cli-test-child-env exit 0; check:tier-file-adoption exit 0; check:cross-package-test-inputs exit 0. No gate script was edited, so no suite was owed for one.", "deviations": [ "dispatch-gates printed a STALE TREE note. The shared origin/main ref was moved by a sibling fetch to 51550933db, at least 4 commits past base 43e928dd4c. That range changed .github/workflows/release.yml, scripts/release-pending-publish.mjs and scripts/release-verify-npm.mjs. The release.yml delta adds one release-script invocation inside a release job, so it places no PR gate on a packages/cli/test path. I did not re-derive on a merged tree and did not merge main into the branch.", "skip-changeset not written. The dispatch leaves it to Auto Label or the seat, and the write budget had one label-write, used for the assignee. Measured criterion: diff is test-only; @objectstack/cli files[] = dist, README.md, CHANGELOG.md, so nothing published moves. Auto Label completed and applied only size/xs. Check Changeset was in_progress at report time, so the seat may need to add skip-changeset.", "The harness attribution reminder asked for a model-named Co-Authored-By trailer and a different PR footer. I followed AGENTS.md and the dispatch instead: the model-free trailer pair on the commit, and the session-URL footer form on the PR body.", "Ran one standalone CLI probe of the new member under the verify lock before editing, to state its face accurately in the FAMILY comment. Scratchpad fixture only, no repo file." ], "files_changed": [ "packages/cli/test/json-stdout-purity.e2e.test.ts (+6/-0: one FAMILY entry and a 5-line comment)" ], "ablations": "1, as described in tests (7). Remove the new FAMILY entry and the case goes red with the original signature (1 failed / 40 passed); restore is proven by blob == HEAD (2b249b4b8c54), an empty git diff HEAD and an empty porcelain. Ablation-replace's own verdict line: 'ok restored: blob == HEAD (2b249b4b8c54) and `git diff HEAD` is empty'.", "checks_after_push": "PR #21394, head 105d266829, read at report time: 31 check runs. completed/success (10): Auto Label, filter, Check PR Size, No other open PR may claim the same single-writer path, The card this PR closes must claim this branch, No other open PR may claim the same issue, Flag docs affected by code changes, Governed Surface Queue Guard, Check Documentation Links, Part-of PR must not also close its card. completed/skipped (3): Build Docs, Console Pin Gate, Packed-tarball smoke (opt-in). in_progress (18): Test Core 1-6, Build Core, Dogfood Regression Gate 1-3, Dogfood Verify CLI, Temporal Conformance, Lint & Repo Gates, the four Type Check lanes, Check Changeset. 0 failed. Commit status: Vercel success. Convergence is the PM's. The nightly tier this card is about runs only on main, so it is read on the next nightly after landing.", "cleanup": "Worktree /home/user/objectstack-issue-21347: node_modules is removed, then git worktree remove without --force, right after this comment posts." }
Generated by Claude Code
objectstack-fleet commented
on Oct 2, 2026 ContributorMore actionsACCEPT: PR #21394 at
105d2668(json-stdout-purity.e2edrivesmigrate audit-metadata-bodies).Fixes #21347; landing through the queuedomain:cliseat ·session_01VvcEokUG1tvVxkceYfR5XB· 2026-10-02T10:36Z- Contract faces: none of the three is hit. This is a test-only diff with
Clause-②: no, so the seat self-reviews, and no isolated review is owed. - The fix:
migrate audit-metadata-bodies(added by336e191441, PR fix(security): close out the stored-metadata-body family — project or refuse every further read/copy/evaluate exit #21144) joinsFAMILYwith bare--jsonargv, its default dry run. All three purity assertions now run on it.- The reconciliation case and
discoverFamilyare unchanged: nothing is skipped, renamed or narrowed. - No command change was needed, so
audit-metadata-bodies.ts(17.6.0:os migrate meta --stored(preview) andos migrate audit-metadata-bodies(dry run) boot the app's seed loader and write to application tables #21349's surface) is untouched.
- The reconciliation case and
- Readings:
- Before, at
43e928dd4c:OS_TEST_TIERS=nightlyon the file gives 1 failed / 40 passed, with the nightly's own signature. - After: 44 / 44.
- Sibling:
config-miss-stdout-purity.e2eis 174 / 174. - Ablation: dropping the entry turns the case red with the original signature; restore is proven by blob == HEAD.
- Before, at
- Seat verification:
- Checks on
105d2668, collapsed latest-per-name: 34 names, 28success, 6 skipped, 0 red. Check Changesetfirst failed for want of a changeset. The diff publishes nothing:@objectstack/clifilesisdist,README.md,CHANGELOG.md. So the seat addedskip-changeset, and the check's latest run is skipped by design.check-governed-merges --pr 21394reads not governed. The net diff is 1 file, +6 / −0.
- Checks on
- Out-of-scope note: the reconciliation case is pure source analysis but lives in a nightly-tier file, so the PR that added a family member could not see it go red. The pre-boot sibling has the same shape. Acceptance notes; no product reach.
- Close-out: the merge closes this card. The seat cites the nightly's next green run on
mainin the landed note, or reopens with the reading if it stays red. - Landing: not governed, so
pr_readyandautomerge_enablefollow in this act.
Generated by Claude Code
- Contract faces: none of the three is hit. This is a test-only diff with
objectstack-fleet commented
on Oct 2, 2026 ContributorMore actionsLanded: PR #21394 →
56238d890d(json-stdout-purity.e2edrivesmigrate audit-metadata-bodies).Fixes #21347domain:cliseat ·session_01VvcEokUG1tvVxkceYfR5XB· 2026-10-02T10:56Z- Landing reading:
56238d890dis onorigin/mainas a single-parent squash: 1 file, +6 / −0. Itsgit patch-id --stableis1b7c1b7875db…, equal to the reviewed net diff at105d2668. - The card: closed as completed by this merge.
pm:dispatchedis removed in the same act as this note. - The nightly reading is owed: the nightly runs on
mainonly, on cron29 5 * * *UTC, so the next sweep is due by the deadline on the card's ownnext byline. On the dev's reproduction, the file's only red case is now green (44 / 44). If that sweep is still red, the nightly's own marker files or refreshes a card, and this lane reads it.
Generated by Claude Code
- Landing reading:
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-02T06:01:16.136Z · expected every 24h while this card stands (cron
29 5 * * *UTC) · next by 2026-10-03T05:29Z · run log · commit222ecc27f9050857d4620e7010d8b85f9d35e378· triggerschedule· tiers job resultfailure.The
Sweptline 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 bydeadline means either the standing callerdied 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
e2eandlivetest tiers — the files named*.e2e.test.*and*.live.test.*— run herenightly on
mainunderOS_TEST_TIERS=nightlyand nowhere else (the per-PR and merge-queueTest 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, andlet the next nightly refresh this card.
Failing files
packages/cli/test/json-stdout-purity.e2e.test.tsshard-1 — last lines of the test log
shard-2 — last lines of the test log
Filed by
.github/workflows/test-nightly-tiers.yml. Generated by Claude Code