Repository navigation
fix(spec): liveness ledger rows cite the seam modules that now hold the moved engine bodies - #25796
Conversation
…he moved engine bodies The #25222 refactor series moved AutomationEngine method bodies into seam modules and left one-hop wrappers in engine.ts. The ledger kept citing the wrappers. Once resumeInternal's body moved into run-resume.ts, engine.ts no longer named `screens` anywhere (its only mention was an unrelated comment in that body), so translation/flows.screens failed key-mention anchoring and check:liveness went red on main, failing 23 tests in check-liveness.test.ts. Re-point the citations whose cited body moved: registerConnector, executeWithoutRetry, resumeInternal, deriveTriggerBinding (with the shared resolveFlowTriggerKind that now reads `flow.type`), translatedFlowTemplate and renderRefusalMessage. The screens row cites flowScreenCopyKey, the file that spells its address; the renderer it hands each slot to never names the key. No row deleted, no baseline touched, no engine edit. Claude-Session: https://claude.ai/code/session_011mK1nJznx2PNFgCuCwwCjM Co-authored-by: Claude <noreply@anthropic.com>
The ledger ships in @objectstack/spec's tarball (`files` lists `liveness`), so the re-pointed citations publish. Claude-Session: https://claude.ai/code/session_011mK1nJznx2PNFgCuCwwCjM Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift Check
What this run could not see
Coarse fallback — 144 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
|
Dispatch seat record. ACCEPTed on card #25790. Generated by Claude Code |
main's #25796 rewrote the `translation/flows.screens` evidence to cite the seam modules, superseding the ledger hunk this branch carried from #25751; the conflict resolves to main's row, so this branch no longer touches the ledger. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X4d6XVfcfxL17bMpptytcc
Requested by Tesla · project thread
Fixes #25790
Part of #25677 (cutover prep I:
mainmust read green before the cutover PR).Clause-②: no
Metadata-protocol: none
What was red, measured on
main5612dd9check-liveness.test.tsfails 23 tests, but they are 23 tests with one cause, not 23 rows. Every one of them runs the gate over a verbatim copy of the shipped ledgers and asserts exit 0; each failsexpected 1 to be +0on the same single finding:engine.tsno longer namesscreensat all. Its one mention was an unrelated comment ("states two screens down") insideresumeInternal's body, which 0189524 moved torun-resume.ts:1462. So the row was anchored by accident before, and the move exposed a citation whose cited body had already left the file.The 23
engine.ts#lines the card counts are 22 citation rows plus one historicalnote. All 22 still resolve and anchor except thescreensrow, but 7 of them cite a method whose body now lives in a seam module, so the code their prose quotes is no longer in the cited body. This PR re-points six of them; the seventh (row 21) keeps its citation for the reason in the table. The other 15 cite bodies still inengine.tsand are unchanged.The rows
SA=packages/services/service-automation/src/. Bodies located by reading each cited method at 5612dd9 (a wrapper saysThe body lives in ./X.ts).name,label,type,description,iconSA/engine.ts#getConnectorDescriptorsengine.ts(name: def.name…)actions.children.keySA/engine.ts#registerConnectorSA/plugin-extension-api.ts#registerConnectorif (typeof handlers[action.key] !== 'function')throw is atplugin-extension-api.ts:349. Prose also namedgetConnectorActionHandler, which does not exist; the method isresolveConnectorAction(engine.ts:3820).resolveConnectorActionEffect/getConnectorDescriptorspointers unchanged (bodies inengine.ts)actions.children.label,description,inputSchema,outputSchemaSA/engine.ts#getConnectorDescriptorsengine.tsactions.children.effectSA/engine.ts#resolveConnectorActionEffect,#getConnectorDescriptorsfind((a) => a.key === actionId)?.effectis atengine.ts:3838successMessageSA/engine.ts#executeWithoutRetry,SA/engine.ts#resumeInternalSA/dag-traversal.ts#executeWithoutRetry,SA/run-resume.ts#resumeInternalsuccessMessage: flow.successMessageatdag-traversal.ts:1278; resumed run atrun-resume.ts:1552errorMessageSA/engine.ts#retryExecution,SA/engine.ts#resumeInternalretryExecutionunchanged,SA/run-resume.ts#resumeInternalretryExecution's body is inengine.ts(errorMessage: flowErrorMessage); quotederrorMessage: flow.errorMessageatrun-resume.ts:1809statusSA/engine.ts#registerFlow,#isFlowEnabledengine.ts; quote verbatim at:4171typeSA/engine.ts#resolveTriggerBindingSA/plugin-extension-api.ts#deriveTriggerBinding,packages/spec/src/automation/flow-trigger-kind.ts#resolveFlowTriggerKindresolveTriggerBindingis a lookup that hands the flow toderiveTriggerBinding, whose body moved. The quotedflow.type === 'schedule'exists nowhere now; the read isf.type === 'schedule'/f.type === 'api'in the shared resolver. Prose rewritten to matchpull.children.mappingSA/engine.ts#AutomationEngine(pullConnectorSource)engine.ts:4554flows.label,flows.successMessage,flows.errorMessage(producer)SA/engine.ts#AutomationEngineexecute()inengine.tscopiesflow.label/flow.successMessage/flow.errorMessage(:5786,:5782,:6054);produceris not key-mention-scannedflows.screens(the red row)SA/engine.ts#renderFlowTextSlotpackages/spec/src/system/i18n-resolver.ts#flowScreenCopyKey; the renderer is named in thescreen-nodes.tsclause, which calls itnode-text-rendering.ts#renderFlowTextSlot) never namesscreenseither (it readsslot.key), so citing it would stay red. The gate's own remedy is to cite the file that names the key:flowScreenCopyKeyspells the address. Not exemptedflows.refusalsSA/engine.ts#renderRefusalMessagenode-text-rendering.tsnever namesrefusals(it is spelled byflowRefusalMessageKey), so re-pointing would red the row.engine.tsstill names the key (setI18nServiceSourcedocblock,:4527) and the method is still the group's entry pointflows.refusals.children.messageSA/engine.ts#translatedFlowTemplate,SA/engine.ts#renderRefusalMessageSA/node-text-rendering.ts#translatedFlowTemplate,SA/node-text-rendering.ts#renderRefusalMessagemessagetriggersrow,noteSA/engine.ts#registerConnectornote7 rows edited (6, 12, 13, 15, 20, 21, 22), 0 rows deleted, no status changed.
undrilled-containers.baseline.jsonandkey-mention.baseline.jsonare untouched, and so areengine.tsand every seam module.Verification (head be47c5b)
pnpm --filter @objectstack/spec check:liveness: exit 1 before, exit 0 after.evidence paths: 766 … 766 resolved(was 762),symbol anchors: 992 … 992 naming a symbol the cited file contains(was 991),key-mention anchoring: 766 … 765 anchored, 1 exempt(was 760 anchored, 1 UNANCHORED).vitest run scripts/liveness/inpackages/spec: before 23 failed / 48 passed incheck-liveness.test.ts; after 12/12 files, 350/350 tests.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack): 65 families, all exit 0 on be47c5b after a full workspace build;--ranreconciles 65 run, 0 NOT-MEASURED, 0 UNRUN.@objectstack/specpatch, becauselivenessis in the package'sfilesand ships.The 8/8 red on the same
mainrunRun 40187126172's
Test Core (8/8)annotation isplugin-pinyin-search … pnpm run test exited (1). The job log body could not be read from this container, so which test failed is NOT MEASURED. The package passes locally at this head, 4/4 files and 39/39 tests. That matches cutover bill item 26 (theboot-reconcile.integration.test.ts5 s timing class); it is reported here, not fixed.Acceptance notes
pnpm check:liveness(root) is not a root script; the command ispnpm --filter @objectstack/spec check:liveness.flow.jsonrows cite bareSA/engine.tswith no symbol. They anchor at this head. Carrier: none.Generated by Claude Code