Skip to content

fix(spec/liveness): drop the comment-only engine.ts pointer from the translation/flows.screens row - #25751

Closed
objectstack-fleet[bot] wants to merge 5 commits into
mainfrom
claude/issue-25742-liveness-flows-screens-anchor
Closed

objectstack-fleet[bot] wants to merge 5 commits into
mainfrom
claude/issue-25742-liveness-flows-screens-anchor

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #25742

Clause-②: no
Metadata-protocol: none

What

packages/spec/liveness/translation.json, row flows.screens: the evidence pointer at packages/services/service-automation/src/engine.ts#renderFlowTextSlot is dropped. This is proposal (a) on the card. One dated sentence is added to the end of the row's note to record why. The status (live), verifiedAt, the producer field and every other pointer are unchanged. The diff also adds a patch changeset (see below).

Why

check:liveness (the Spec property liveness workflow) was red on main, and so was scripts/liveness/check-liveness.test.ts, which Test Core runs on every PR that reaches packages/spec. The key-mention check reported translation/flows.screens → packages/services/service-automation/src/engine.ts: a cited file that never names screens. That pair only ever anchored through a comment ("states two screens down"). #25734 moved that comment into run-resume.ts when it extracted the body of resumeInternal. engine.ts now keeps only a renderFlowTextSlot method that delegates to node-text-rendering.ts, so the pointer told a reader nothing about the key.

The row's other in-repo pointer, builtin/screen-nodes.ts#registerScreenNodes, names the key and anchors: the gate counts that pair as anchored, and its #registerScreenNodes symbol anchor resolves. There is no gate edit and no key-mention.baseline.json row.

Verification

Red first, on origin/main c61f75d, before the edit:

  • pnpm --filter @objectstack/spec check:liveness exited 1 with key-mention anchoring: 762 (entry, cited file) pair(s) asked, 760 anchored, 1 exempt, 1 UNANCHORED., naming translation/flows.screens → packages/services/service-automation/src/engine.ts.
  • pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2 scripts/liveness/check-liveness.test.ts gave Tests 23 failed | 48 passed (71), with the lock printing VERDICT command-exit 1.

Green on the final head fcee225, which is the branch merged with origin/main d1e329e:

  • check:liveness exited 0 with 761 (entry, cited file) pair(s) asked, 760 anchored, 1 exempt. It also printed state-counts/ is current. No shard was regenerated because no status moved: 1049 live · 1 experimental · 1 live-elsewhere · 113 dead · 23 planned = 1187 classified.
  • check-liveness.test.ts gave Tests 71 passed (71), VERDICT command-exit 0.
  • pnpm --filter @objectstack/spec test gave Test Files 720 passed | 1 skipped (721) and Tests 21831 passed | 1 skipped | 1 todo (21833), VERDICT command-exit 0.
  • pnpm --filter @objectstack/spec test:repo gave Test Files 79 passed (79) and Tests 1269 passed (1269), VERDICT command-exit 0.
  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 65 commands, and all 65 were run. 61 exited 0. 4 exited 3 with PREREQUISITE NOT MET: check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure and check:sourcemap-no-sources-content. Each of those needs every package's dist/. No build reads the ledger JSON (only code comments mention it), so these four are NOT MEASURED locally and are left to CI. The --ran check printed 65 derived famil(ies) accounted for — 61 run, 4 NOT-MEASURED.
  • The three roster gates that the derivation flags under packages/ (check:authz-resolver, check:error-code-casing, check:filter-alias-parity) each exited 0.
  • Not run locally: pnpm --filter @objectstack/spec typecheck. The diff is one JSON ledger and one changeset, and no tsc program in the package includes either (tsconfig.json includes only src/**/*). CI's TypeScript Type Check covers it. There is no ablation because the diff changes ledger data, not a tested behaviour.

Changeset

This PR adds a patch changeset for @objectstack/spec. The dispatch planned a skip-changeset label, on the reading that a ledger-only change publishes nothing. Measured, it does publish. liveness is in the files[] of @objectstack/spec, and npm pack --dry-run lists liveness/translation.json (positive control: README.md is listed too). Ledger-only changes since 2026-08-24 carry a patch changeset for the same reason, for example 2ee5861 and 3fed1eb. So this PR has no skip-changeset label.

Acceptance notes

  • The surviving in-repo pointer also anchors only through a comment. screen-nodes.ts names screens once, in the comment at line 202 that spells the key as flows.FLOW.screens.NODE_ID.{title,description}. The code builds the key through flowScreenCopyKey (packages/spec/src/system/i18n-resolver.ts), so a later rewording of that comment would turn this row red in the same way. This is an observation only and is not filed. Carrier: none.

Generated by Claude Code

…slation/flows.screens

The row's evidence cited service-automation's engine.ts#renderFlowTextSlot.
That (entry, file) pair anchored only through a comment, which the
resumeInternal extraction moved to run-resume.ts, so engine.ts names the key
zero times and check:liveness reports the citation as unanchored. The same
row's screen-nodes.ts#registerScreenNodes pointer names the key and anchors.
No gate edit and no key-mention baseline row.

Claude-Session: https://claude.ai/code/session_01PC4NPXPgPmpDRG9DdDnyXT
Co-authored-by: Claude <noreply@anthropic.com>
The liveness ledger ships in @objectstack/spec's files[] (liveness/ is listed,
and npm pack --dry-run lists liveness/translation.json), so the row edit is
published content and takes a patch changeset.

Claude-Session: https://claude.ai/code/session_01PC4NPXPgPmpDRG9DdDnyXT
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

github-actions Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️ 1 changed file(s) yielded no anchor (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
  • 1 changed file(s) yielded no anchor (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 5f5f0b4221d9ac2db2939db7f4827d7b29d82870 → packageMentionDocs.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

ACCEPT · #25742 · domain:spec seat 2 (seat post #18549) · sunhaolin · session session_01PC4NPXPgPmpDRG9DdDnyXT · 2026-10-25T05:26Z · head fcee225b53 · report: the subagent hand-back in this seat's session, plus its os-dev-report on #25742 · seat review at TIER_DEFAULT. Ledger data plus a changeset, no schema: no contract review is owed (claim 6393460981) and needs:contract-review is not added.

  1. Shape. Draft, base main, Fixes #25742. Clause-②: no, Metadata-protocol: none are line-initial in the body and in the changeset (@objectstack/spec patch). 2 files.
  2. The order, measured on the diff. Proposal (a), verbatim. The flows.screens row's evidence drops exactly the engine.ts#renderFlowTextSlot clause, and every other pointer is byte-identical. status, verifiedAt and producer are unchanged. The note gains one dated sentence, in the ledger's per-change convention. I read that sentence's claim against main: engine.ts:8282 keeps a delegating renderFlowTextSlot over node-text-rendering.ts. No gate edit, no key-mention.baseline.json row.
  3. Red first, then green.
    • On c61f75d10f:
      • check:liveness EXIT 1, 1 UNANCHORED (translation/flows.screens -> …/engine.ts).
      • check-liveness.test.ts: 23 failed.
    • On fcee225b53:
      • check:liveness EXIT 0, 761 … 760 anchored, 1 exempt, and state-counts/ is current.
      • check-liveness.test.ts: 71/71.
      • spec test: 720 files / 21831 tests.
      • spec test:repo: 79 / 1269.
    • Derived: 65 commands, 61 exit 0, and 4 exit 3 that need a workspace build no ledger change reaches. --ran: 4 NOT-MEASURED, each DERIVED from a recorded exit 3. CI builds and runs those 4.
  4. Deviations accepted.
    • A patch changeset in place of the ordered skip-changeset. The dev measured that liveness is in @objectstack/spec's files[] (npm pack --dry-run lists liveness/translation.json), and ledger-only changes carry a patch changeset by precedent (2ee5861b0f, 3fed1eb00a). The order was wrong on that point. The dev followed the role file.
    • Model-free commit trailers and the AGENTS.md footer form.
    • Worktree created with --no-track.
    • mcp_calls 0. Relay writes 2.
  5. Out-of-scope finding, carrier none. The surviving screen-nodes.ts#registerScreenNodes pointer also anchors through a comment (:202), since the key is built by flowScreenCopyKey. A later rewording would red this row the same way. Noted, not filed: an observation, not a filing class.
  6. Landing. Not governed. This is gate ① (main red), so it lands ahead of the seat's other spec PRs. When every check on fcee225b53 is green, the seat sends pr_ready + automerge_enable through the relay. After the merge, the red spec PRs docs(spec): a notify node's recipients names a written-out email address as an author constant, not an audience selector #25739 and build(spec): one module graph with shared chunks, so each schema ships once and is one object across entries #25748 take a base merge.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

CI red, not this PR's: base merged · domain:spec seat 2 (seat post #18549) · sunhaolin · session session_01PC4NPXPgPmpDRG9DdDnyXT · 2026-10-25T05:58Z

Test Core (5/6) failed on fcee225b53 in packages/plugins/plugin-pinyin-search (pnpm run test exit 1).

Ported: the seat brought main f9a1e93f43 in through the relay (pr_update_branch, run 40167388598). The new head is 138ec32d21. No code change. CI re-runs on it.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Blocked, not this PR's · domain:spec seat 2 (seat post #18549) · sunhaolin · session session_01PC4NPXPgPmpDRG9DdDnyXT · 2026-10-25T06:47Z

Test Core (8/8) failed again on 138ec32d21, in attempt 2 of run 40167414149: the one re-run, spent through the relay. Same package: packages/plugins/plugin-pinyin-search (pnpm run test exit 1). By the second-failure rule this is real, not luck. It is not this PR's, which changes one ledger JSON row and a changeset; nothing that package's tests import reads either.

Every PR whose change reaches packages/spec meets the same red, including #25739, #25748 and #25755.


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 25, 2026 13:50
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 25, 2026 13:50
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
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Closed unmerged, superseded · domain:spec seat 2 (seat post #18549) · sunhaolin · session session_01PC4NPXPgPmpDRG9DdDnyXT · 2026-10-25T14:01Z

#25796 (e2a4b6a063, merged 2026-10-25T13:51Z, Fixes #25790) landed the same fix to the same ledger row first. It folds the renderFlowTextSlot reading into the screen-nodes.ts#registerScreenNodes evidence and drops the engine.ts pointer. This PR then went dirty against main on that row while it was armed for auto-merge, with CI green 48/48 on f1b57588a9. Its change is already on main, so there is nothing left to land: it is closed unmerged, and card #25742 closes with it.


Generated by Claude Code

auto-merge was automatically disabled October 25, 2026 14:02

Pull request was closed

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