Skip to content

fix(spec): liveness ledger rows cite the seam modules that now hold the moved engine bodies - #25796

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-hogras
Oct 25, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-hogras

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Tesla · project thread

Fixes #25790
Part of #25677 (cutover prep I: main must read green before the cutover PR).

Clause-②: no
Metadata-protocol: none

What was red, measured on main 5612dd9

check-liveness.test.ts fails 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 fails expected 1 to be +0 on the same single finding:

key-mention anchoring: 762 (entry, cited file) pair(s) asked, 760 anchored, 1 exempt, 1 UNANCHORED.
✗ translation/flows.screens → packages/services/service-automation/src/engine.ts

engine.ts no longer names screens at all. Its one mention was an unrelated comment ("states two screens down") inside resumeInternal's body, which 0189524 moved to run-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 historical note. All 22 still resolve and anchor except the screens row, 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 in engine.ts and are unchanged.

The rows

SA = packages/services/service-automation/src/. Bodies located by reading each cited method at 5612dd9 (a wrapper says The body lives in ./X.ts).

# Ledger row Old citation New citation Measured
1–5 connector name, label, type, description, icon SA/engine.ts#getConnectorDescriptors unchanged body still in engine.ts (name: def.name …)
6 connector actions.children.key SA/engine.ts#registerConnector SA/plugin-extension-api.ts#registerConnector the quoted if (typeof handlers[action.key] !== 'function') throw is at plugin-extension-api.ts:349. Prose also named getConnectorActionHandler, which does not exist; the method is resolveConnectorAction (engine.ts:3820). resolveConnectorActionEffect / getConnectorDescriptors pointers unchanged (bodies in engine.ts)
7–10 connector actions.children.label, description, inputSchema, outputSchema SA/engine.ts#getConnectorDescriptors unchanged body in engine.ts
11 connector actions.children.effect SA/engine.ts#resolveConnectorActionEffect, #getConnectorDescriptors unchanged the quoted find((a) => a.key === actionId)?.effect is at engine.ts:3838
12 flow successMessage SA/engine.ts#executeWithoutRetry, SA/engine.ts#resumeInternal SA/dag-traversal.ts#executeWithoutRetry, SA/run-resume.ts#resumeInternal quoted successMessage: flow.successMessage at dag-traversal.ts:1278; resumed run at run-resume.ts:1552
13 flow errorMessage SA/engine.ts#retryExecution, SA/engine.ts#resumeInternal retryExecution unchanged, SA/run-resume.ts#resumeInternal retryExecution's body is in engine.ts (errorMessage: flowErrorMessage); quoted errorMessage: flow.errorMessage at run-resume.ts:1809
14 flow status SA/engine.ts#registerFlow, #isFlowEnabled unchanged both bodies in engine.ts; quote verbatim at :4171
15 flow type SA/engine.ts#resolveTriggerBinding SA/plugin-extension-api.ts#deriveTriggerBinding, packages/spec/src/automation/flow-trigger-kind.ts#resolveFlowTriggerKind resolveTriggerBinding is a lookup that hands the flow to deriveTriggerBinding, whose body moved. The quoted flow.type === 'schedule' exists nowhere now; the read is f.type === 'schedule' / f.type === 'api' in the shared resolver. Prose rewritten to match
16 job pull.children.mapping SA/engine.ts#AutomationEngine (pullConnectorSource) unchanged body in engine.ts:4554
17–19 translation flows.label, flows.successMessage, flows.errorMessage (producer) SA/engine.ts#AutomationEngine unchanged execute() in engine.ts copies flow.label / flow.successMessage / flow.errorMessage (:5786, :5782, :6054); producer is not key-mention-scanned
20 translation flows.screens (the red row) SA/engine.ts#renderFlowTextSlot packages/spec/src/system/i18n-resolver.ts#flowScreenCopyKey; the renderer is named in the screen-nodes.ts clause, which calls it the renderer's body (node-text-rendering.ts#renderFlowTextSlot) never names screens either (it reads slot.key), so citing it would stay red. The gate's own remedy is to cite the file that names the key: flowScreenCopyKey spells the address. Not exempted
21 translation flows.refusals SA/engine.ts#renderRefusalMessage citation unchanged; prose points at the drilled child node-text-rendering.ts never names refusals (it is spelled by flowRefusalMessageKey), so re-pointing would red the row. engine.ts still names the key (setI18nServiceSource docblock, :4527) and the method is still the group's entry point
22 translation flows.refusals.children.message SA/engine.ts#translatedFlowTemplate, SA/engine.ts#renderRefusalMessage SA/node-text-rendering.ts#translatedFlowTemplate, SA/node-text-rendering.ts#renderRefusalMessage both bodies moved; the file names message
note connector retired triggers row, note names SA/engine.ts#registerConnector unchanged a dated record of the retirement, not a citation; the gate does not read note

7 rows edited (6, 12, 13, 15, 20, 21, 22), 0 rows deleted, no status changed. undrilled-containers.baseline.json and key-mention.baseline.json are untouched, and so are engine.ts and 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/ in packages/spec: before 23 failed / 48 passed in check-liveness.test.ts; after 12/12 files, 350/350 tests.
  • Derived gates (node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack): 65 families, all exit 0 on be47c5b after a full workspace build; --ran reconciles 65 run, 0 NOT-MEASURED, 0 UNRUN.
  • Changeset: @objectstack/spec patch, because liveness is in the package's files and ships.

The 8/8 red on the same main run

Run 40187126172's Test Core (8/8) annotation is plugin-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 (the boot-reconcile.integration.test.ts 5 s timing class); it is reported here, not fixed.

Acceptance notes

  • The card's mechanism assumption "23 rows ↔ 23 failures" does not hold: 23 tests fail on one row. The 22 citation rows were audited anyway, as the card asks.
  • The card's pnpm check:liveness (root) is not a root script; the command is pnpm --filter @objectstack/spec check:liveness.
  • Not audited here: 17 flow.json rows cite bare SA/engine.ts with no symbol. They anchor at this head. Carrier: none.

Generated by Claude Code

…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>
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tooling labels Oct 25, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️ 3 changed file(s) yielded no anchor (packages/spec/liveness/connector.json, packages/spec/liveness/flow.json, packages/spec/liveness/translation.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 3 changed file(s) yielded no anchor (packages/spec/liveness/connector.json, packages/spec/liveness/flow.json, packages/spec/liveness/translation.json) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 144 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 0790d0a4696a26135f350d39b1cf4cc6a1af860f → packageMentionDocs.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Dispatch seat record. ACCEPTed on card #25790. check-governed-merges --pr objectstack-ai/objectstack#25796 on the final file list: NOT governed (0 of 4 paths in the register; 7 surfaces govern objectstack), 26 changed lines (+19/−7) under the 3000-line human-merge threshold. CI on head be47c5b147: 48 checks, 37 success, 11 skipped, 0 failed; all five required contexts green. check:liveness 0 unanchored. Flipping ready and arming auto-merge (ordinary queue landing). No reviewer requested; this lands on the dispatch seat's verdict.


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 25, 2026 13:19
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 25, 2026 13:19
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 25, 2026
Merged via the queue into main with commit e2a4b6a Oct 25, 2026
49 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-hogras branch October 25, 2026 13:51
os-tesla pushed a commit that referenced this pull request Oct 25, 2026
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tooling

Projects

None yet

2 participants