Repository navigation
cutover-prep(ui-merge): check:liveness is red on main — ledger rows cite service-automation/src/engine.ts bodies that #25734 / #25725 moved into seam modules; Test Core 1/8 fails on every PR built on main (parent #25677) #25790
Description
Filing gate ③ + ④: pre-freeze prep card of the epic #25677 (pm:epic; epic PM session_01RSDL3SFtJaKzcymvCD8RsU). Part of #25677. Lands in objectstack-ai/objectstack main before the cutover freeze (#25752 step 2): the cutover PR's acceptance reads "CI green on the merged tree", and that reading is impossible while main itself carries a red Test Core shard.
谁付代价(业务筛): main's scheduled CI run 40187126172 on 5612dd9 fails Test Core 1/8 — 23 failures, all in packages/spec/scripts/liveness/check-liveness.test.ts, which runs against the shipped liveness ledgers — and 8/8 (plugin-pinyin-search, the 5 s boot-reconcile timing class already on the cutover bill as item 26; passes locally). Every PR branch rebased onto main inherits the 1/8 red, so (a) the cutover PR (#25752 step 4) and the Tier H landings behind it (4a #25745, PR B #25697, 4b PR 2 #25712) cannot show a clean reading, (b) the sharded Test Core attribution the epic relies on (one failed task per red shard) is polluted by a known red, and (c) a real liveness regression in a PR is invisible. Measured by the 4a thread at 11:33Z and commented on #25745 as "not this PR's".
维护者速读
main 上 check:liveness 红了:存活台账(packages/spec/liveness/*.json,共 23 行)引用 service-automation/src/engine.ts 里的函数体做证据,#25734/#25725 把这些函数体搬进了 seam 模块(run-resume.ts 等),engine.ts 只剩一跳委托。本卡把台账行指回新位置(或让读取器跟随这一跳),⛔ 不删行、不放宽基线。切换 PR 需要 main 绿。
Cause (read on 5612dd9)
git grep -c "service-automation/src/engine.ts#" -- packages/spec/liveness/*.json: connector.json 12, flow.json 4, job.json 1, translation.json 6 — 23 rows, matching the 23 failures.- The cited symbols still exist by name in
engine.ts(AutomationEngine,renderRefusalMessage,translatedFlowTemplate,flowRefusalMessageKey), but since0189524a41(refactor(service-automation): move AutomationEngine.resumeInternal's body into run-resume.ts (#25222 slice 8b) #25734, slice 8b) andf3fea0a03d(refactor(service-automation): move 14 delete-bearing AutomationEngine bodies into their seam modules #25725) they are one-hop wrappers (return renderRefusalMessage.call(host, …)) whose bodies live in the seam modules; the evidence text the ledger rows describe is no longer in the cited body. Confirm which assertion each of the 23 rows fails before changing anything.
What to change (objectstack, one draft PR to main)
- Reproduce:
pnpm check:liveness(root) andpnpm --filter @objectstack/spec exec vitest run scripts/liveness/check-liveness.test.tsonmain; list the 23 failing rows with the assertion each fails. - Re-point each row's
producer/evidencecitation at the seam module and symbol that now holds the body (e.g.packages/services/service-automation/src/run-resume.ts#…), keeping the row's prose accurate; where the reader could instead follow a one-hop delegation (ascheck:test-source-aliasdoes for a same-package helper, [finding] check:test-source-alias's clocked-window rule cannot see a load routed through a helper — the defect it documents sat green in packages/cli for the whole of #17180 #17658), prefer the ledger edit — it is the measured state, and the reader's rule should not loosen. - ⛔ Do not delete rows, do not add them to
undrilled-containers.baseline.json, do not widen any baseline. ⛔ Do not touchengine.tsor the seam modules (the refactor series [maintainer] refactor(service-automation): splitsrc/engine.ts(13,735 lines, +2,199 in 30 days) along itsAutomationEngineseams, one move-only slice per PR #25222 owns them). - Also read the 8/8 pinyin failure on that run: if it is the bill-26 timing class, say so in the PR body and leave it; if not, report.
Acceptance
pnpm check:livenessexit 0 onmain+ your diff;check-liveness.test.ts0 failures; the nextmainCI run after merge shows Test Core 1/8 green.- Row count unchanged (23 rows re-pointed, none deleted);
gen:*outputs that read the ledgers (skills references, if any) regenerated and committed if they change. - PR body: the 23-row table (row → old citation → new citation → failing assertion),
Fixes #<this card>,Part of #25677.
Size: S–M (mechanical over 23 rows; judgment only on where each body landed). Clause-②: no. Metadata-protocol: none. Responsibility: defect introduced by the #25222 refactor series (#25734 slice 8b, #25725) — the ledger was not moved with the bodies; not a seat defect of this epic.
风险
- A row may cite a body that was split across two seam modules; cite the one holding the evidence text, and say so.
- If the liveness reader has its own "symbol exists" check that passes while the evidence-text check fails, the fix is still the ledger, not the reader.
Dedupe
search_issues 2026-10-25 11:36Z 「check:liveness engine.ts seam liveness ledger red main」 and the #25222 slice PRs: no open card names the ledger drift; #25734 and #25725 are merged refactor PRs with no follow-up. New.
Activity
objectstack-fleet commentedon Oct 25, 2026
Claim: PM loop round 1
Session:
session_011mK1nJznx2PNFgCuCwwCjMAccount:
os-tesla(the seat's linked user; the card's assignee)Branch:
claude/project-thread-hograsWorktree:
objectstack-issue-25790Domain:
domain:specSeat:
domain:spec#1File surface:
packages/spec/liveness/*.json citations only, plus regenerated gen:* outputs that read them(stop on breach; explain in the report)Container & model:
S,mode:thread,model: opus (default judgment tier),effort: highClause-②: no
Metadata-protocol: none
Responsibility: defect introduced by the #25222 refactor series (#25734, #25725) — ledger not moved with the bodies; not a seat defect of this epic
Thread-read: none
Premise: holds — 23 rows cite service-automation/src/engine.ts# bodies; 23 failures in check-liveness.test.ts on main 5612dd9
Serial constraints cleared: no other open card edits packages/spec/liveness/*.json; the #25222 series owns packages/services/service-automation/src/** and is not touched
Resume-from: none
Dispatched by the epic seat (
session_01RSDL3SFtJaKzcymvCD8RsU) under the pm-dispatch frame; order:/mnt/project-files/d1-merge/dispatch/I-25790-liveness-ledger-drift.md. Part of #25677.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
os-dev-report
{
"issue": 25790,
"status": "done",
"branch": "claude/project-thread-hogras",
"pr": "#25796",
"head": "be47c5b147",
"session": "session_011mK1nJznx2PNFgCuCwwCjM",
"premise_still_valid": true,
"summary": "Ledger-only fix. On main 5612dd9 the 23 check-liveness.test.ts failures are 23 tests with ONE cause: key-mention anchoring reports a single UNANCHORED pair, translation/flows.screens -> service-automation/src/engine.ts. engine.ts's only mention of
screenswas an unrelated comment inside resumeInternal's body, which 0189524 moved to run-resume.ts:1462. Audited all 22 engine.ts# citation rows (the 23rd grep line is a historical note): 7 cite a method whose body moved to a seam module. Re-pointed 6 (connector actions.key -> plugin-extension-api.ts#registerConnector; flow successMessage -> dag-traversal.ts#executeWithoutRetry + run-resume.ts#resumeInternal; flow errorMessage -> run-resume.ts#resumeInternal; flow type -> plugin-extension-api.ts#deriveTriggerBinding + spec flow-trigger-kind.ts#resolveFlowTriggerKind; translation flows.screens -> spec i18n-resolver.ts#flowScreenCopyKey; flows.refusals.message -> node-text-rendering.ts#translatedFlowTemplate + #renderRefusalMessage). flows.refusals keeps engine.ts#renderRefusalMessage (node-text-rendering.ts never namesrefusals, so re-pointing would red it; engine.ts still names it). The other 15 rows cite bodies still in engine.ts and are unchanged. 0 rows deleted, no status changed, no baseline touched, no engine/seam edit. Patch changeset for @objectstack/spec becauselivenessis in its files[].","tests": "At be47c5b: pnpm --filter @objectstack/spec check:liveness exit 0 (before: exit 1). Counts before -> after: evidence paths 762/762 -> 766/766 resolved; symbol anchors 991/991 -> 992/992; key-mention 762 asked / 760 anchored / 1 exempt / 1 UNANCHORED -> 766 / 765 / 1 / 0. packages/spec vitest run scripts/liveness/: before check-liveness.test.ts 23 failed / 48 passed; after 12/12 files, 350/350 tests (os-verify-lock VERDICT command-exit 0). Pinyin 8/8 read: plugin-pinyin-search vitest run 4/4 files, 39/39 tests locally (VERDICT command-exit 0). No ablation: the diff changes ledger data, not tested behaviour.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at be47c5b derived 65; all 65 exit 0, exit captured before any pipe (record: /mnt/project-files/d1-merge/out/I-25790-gates-ran.list). First pass: check-plugin-teardown-shape --self-test exit 3 (shallow clone) -> exit 0 after fetching pinned 621a487; check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content exit 3 (no dist) -> exit 0 after a full workspace build (turbo 76/76). --ran: 65 derived, 65 run, 0 NOT-MEASURED, 0 UNRUN. PR check-runs at report time: 45 total, 7 success, 11 skipped, 27 in_progress.",
"dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
"mcp_calls": "0 GitHub MCP calls (reads through REST curl). 1 non-GitHub platform call: claude-code-remote subscribe_pr_activity on #25796.",
"api_writes": "2 relay writes: pr_create via scripts/pm/fleet-write/dispatch.mjs (run 40194151917, #25796, body 7815 bytes sent = stored, assignee os-tesla, no labels), and this os-dev-report comment via scripts/pm/post-stamped.mjs. Plus 2 git pushes.",
"files_changed": [
"packages/spec/liveness/connector.json",
"packages/spec/liveness/flow.json",
"packages/spec/liveness/translation.json",
".changeset/25790-spec-liveness-seam-citations.md"
],
"line_budget": "+19 / -7 (ledger +7/-7, changeset +12)",
"deviations": [
"Branch is the platform-designated thread branch claude/project-thread-hogras (per FRAME), not claude/issue-25790-*.",
"Order section 2 falsified: the 23 failures are 23 tests on one unanchored row, not 23 failing rows. The 22 citation rows were still audited, as the card asks.",
"Card acceptance 'Row count unchanged (23 rows re-pointed)': 7 rows edited (6 re-pointed, 1 prose-only), 15 verified unchanged, 1 historical note left as written. Re-pointing a row whose body is still in engine.ts would make the citation false.",
"flows.screens is not re-pointed at the body (node-text-rendering.ts#renderFlowTextSlot): that file never names
screens, so the row would stay red. It cites spec i18n-resolver.ts#flowScreenCopyKey, the file that spells the key, per the gate's own REPOINT remedy; the renderer is named by symbol in the screen-nodes clause. No key-mention exemption added.","flow
typeprose rewritten: the quotedflow.type === 'schedule'exists nowhere at 5612dd9; the read is in spec resolveFlowTriggerKind. connector actions.key prose named a nonexistentgetConnectorActionHandler; corrected to resolveConnectorAction.","The card's
pnpm check:liveness(root) is not a root script; ran pnpm --filter @objectstack/spec check:liveness.","Added a patch changeset (the order did not name one): the ledger ships in @objectstack/spec's tarball."
],
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted, not filed · 17 flow.json rows cite bare service-automation/src/engine.ts (no symbol); they anchor at be47c5b, not audited for moved bodies · in the PR's Acceptance notes",
"carrier: cutover bill item 26 · Test Core 8/8 on run 40187126172 = plugin-pinyin-search
pnpm run testexited 1 (annotation); job log body unreadable from this container (blob host 403), so the failing test is NOT MEASURED; package passes 39/39 locally; consistent with the boot-reconcile 5 s timing class · reported in the PR body, not fixed"]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
ACCEPT — dispatch seat. objectstack#25796 (head
be47c5b147, branchclaude/project-thread-hogras, +19/−7, 4 files) is accepted as the fix for this card.Checked against the order (
/mnt/project-files/d1-merge/dispatch/I-25790-liveness-ledger-drift.md) and the seat's report (card comment 6397779111):translation/flows.screens → engine.ts, whose onlyscreenswas a comment insideresumeInternal's body that0189524a41(refactor(service-automation): move AutomationEngine.resumeInternal's body into run-resume.ts (#25222 slice 8b) #25734) moved. All 22engine.ts#rows audited: 6 re-pointed at the seam bodies, 1 kept onengine.tswith prose only (flows.refusals:node-text-rendering.tsnever namesrefusals), 15 unchanged because their bodies still live inengine.ts;flows.screensnow citespackages/spec/src/i18n-resolver.ts#flowScreenCopyKey, the one body that names the key.engine.ts/ seam-module edit, noskills/**change. The 4th file is the@objectstack/specpatch changeset —liveness/is in spec'sfiles[], so the ledger publishes; accepted.check:liveness0 (key-mention 765 anchored, 1 exempt, 0 unanchored); liveness vitest 12/12 files, 350/350;dispatch-gates65 derived, 65 exit 0,--ran0 NOT-MEASURED / 0 UNRUN.check-governed-merges --pr objectstack-ai/objectstack#25796: NOT governed (0 of 4 paths hit the register), 26 changed lines ≤ 3000 — ordinary queue landing.Landing: the seat flips the PR ready and arms auto-merge via the relay now.
Fixes #25790closes this card on merge; the nextmainrun then reads Test Core 1/8 green, which the cutover PR (#25752 step 4) needs.Generated by Claude Code