feat(supervise): first-class continuity on graph edges — fresh | resume | steer, all ledgered - #725

Merged
drewstone merged 2 commits into
mainfrom
feat/graph-continuity
Aug 3, 2026
Merged

feat(supervise): first-class continuity on graph edges — fresh | resume | steer, all ledgered#725
drewstone merged 2 commits into
mainfrom
feat/graph-continuity

Conversation

@drewstone

Copy link
Copy Markdown
Contributor

Owner directive from #694: fresh respawns, session RESUMES, and live steers must all be expressible as plain data. This ships the axis.

  • Delegates edges declare continuity: 'fresh' | 'resume' (per-spawn override on the tool); every ledger row and journal edge event stamps the effective mode — fresh/resume on spawns, steer on steer legs and analyzes deliveries. Zero ambiguity about how any hop continued.
  • Resume: a new live worker on the same node whose executor receives resume: { ofWorker, sequence } and owns session re-attachment; spend continuous in the one conserved pool; caps count resumes like spawns. Refused loud: no prior settled worker, prior still live (that's steer — the error says so), riding a semantic key, unresumable seams (workerFromBackend fails loud rather than ledger a resume that never happened — post-audit hardening). Resume after a FAILED prior is deliberately allowed (the seam decides salvageability) — tested and stated.
  • examples/graphs/shot-loop-resumed.ts: the VB resumed-shot loop as pure data — shots stamp fresh/resume/resume, lineage chain proven at the seam.
  • Back-compat: continuity-free graphs byte-identical (audit probe chore: agent-runtime 0.5.5 — unify agent-eval / agent-knowledge dep tree #6: all 10 new tests FAIL against old src — they test the feature, not tautologies).

Adversarially audited SHIP: lineage plumbing, dedup-distinctness, stamp integrity, refusals, and spend arithmetic all micro-revert-falsified; racing resumes proven safe (zero async gap).

0.127.0 + CHANGELOG. Suite 2364; typecheck/lint/build/docs/version-gate green.

…sals — fresh | resume | steer as ledgered data
A delegates edge accepts continuity: 'fresh' | 'resume' (edge default;
spawn_agent takes a per-call override). A resume traversal targets a node
whose prior worker has SETTLED: the kernel spawns a NEW live worker bound
to the same node whose spawn context carries resume: { ofWorker, sequence }
(WorkerResumeContext) — the executor seam owns the session re-attachment;
the kernel keeps identity, ordering, ledger truth, and spend continuity in
the one conserved pool. Traversal caps count resumes exactly like fresh
spawns.
Fail-loud refusals at the tool: resume-no-prior (explicit resume with no
settled prior; the DECLARED edge default instead degrades to fresh on the
node's first spawn), resume-while-live (steer is the live-worker channel,
the error says so), resume-with-key (keys are run-once, resume runs again).
Resume lineage is process-local — the same boundary as the analyst-run
marker — and stated where it lives.
EdgeTraversal and the journal 'edge' event gain
continuity: 'fresh' | 'resume' | 'steer' — spawns stamp their effective
mode, every mid-run delivery into a live recipient (driver steer legs,
every analyzes delivery) stamps 'steer'. validateGraph refuses nonsense
values and analyzes edges carrying the field.
Threaded as continuityByProfile through SuperviseOptions →
SupervisorAgentDeps → DriverAgentOptions / serveCoordinationMcp →
CoordinationToolsOptions; runGraph derives it from delegates edges. Kernel
exports ContinuityMode, WorkerResumeContext, TraversalContinuity.
New example examples/graphs/shot-loop-resumed.ts (the VB shot shape as
data: shot 1 fresh, shots 2-3 resume the prior settled session), proven
offline in tests/examples/graph-topologies.test.ts; kernel continuity
suite in tests/kernel/graph.test.ts. Edges without continuity behave
byte-identically to before. Bump 0.127.0.
… pin resume-after-failed-prior policy
A backend seam with no session re-attachment accepting a resume spawn
would ledger continuity:'resume' over a brand-new session — a stamp
asserting something that never happened. Refuse loud; session-resuming
makeWorkerAgent seams are the resume consumers. Failed-prior resume is
deliberately allowed (the seam decides salvageability) — now tested and
stated.

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Auto-approved drewstone PR — d2986340

This PR was opened by the trusted drewstone account.
The full PR reviewer audit still runs separately and will publish findings if it detects issues.

tangletools · auto-approval · reason: drewstone_author · 2026-08-03T19:43:21Z

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Value Audit — sound

Verdictsound
Concerns2 (1 low, 1 weak-concern)
Heuristic0.0s
Duplication0.0s
Interrogation140.3s (2 bridge agents)
Total140.3s

💰 Value — sound

Adds node-level session continuity (fresh|resume|steer) as plain data on graph edges — a clean new axis that the three existing primitives (process-resume, key, steer) genuinely don't cover, built on the existing makeWorkerAgent seam and edge ledger.

  • What it does: A delegates edge (or per-call spawn_agent arg) may declare continuity: 'resume'. On any spawn after the node's first, the kernel resolves the node's most recent SETTLED worker (by profile.name = node id), mints a NEW live worker, and hands its executor seam WorkerSpawnContext.resume = { ofWorker, sequence } — the lineage the seam uses to re-attach the backend session. The kernel keeps identity, or
  • Goals it achieves: Make 'fresh respawn vs session resume vs live steer' expressible as ONE FIELD on a graph edge, so a resumed shot-loop (shot 1 settles failed → shot 2 continues shot 1's session context, spend continuous in one pool) is data, not a hand-rolled driver loop. Secondary: eliminate ledger ambiguity — every hop now states how it continued, so 'did traversal 2 continue traversal 1's session or start fresh
  • Assessment: Sound and in-grain. The change fills a real gap: I checked the three adjacent primitives and none covers 'spawn a NEW worker that continues a SETTLED prior worker's session'. Scope.resume/ResumedWork (types.ts:711) is PROCESS-crash recovery — it re-adopts settled work without spawning; key/SpawnOpts.key (types.ts:503) is idempotency — a completed key returns its cached result WITHOUT re-running; s
  • Better / existing approach: none — this is the right approach. Searched for an existing mechanism to extend: Scope.resume (types.ts:711) is process-level crash recovery, a different concept; SpawnOpts.key (types.ts:503) is run-once idempotency, structurally incompatible (extending key to mean 'run again with lineage' would break its exactly-once guarantee); steer (types.ts:644 Scope.send) targets LIVE workers, not settled on
  • Model: opencode/zai-coding-plan/glm-5.2
  • Bridge attempts: 2
  • Bridge warning: opencode/kimi-for-coding/k2p7: opencode: opencode error

🎯 Usefulness — sound

A coherent, fully-threaded continuity axis (fresh/resume/steer) that extends the edge-ledger and fail-closed spawn patterns in the codebase's grain, with comprehensive refusals and correct back-compat — no equivalent reinvented, no materially better approach.

  • Integration: Fully reachable. continuityByProfile is plumbed through runGraph → supervise → supervisorAgent (both arms) → driverAgent → serveCoordinationMcp → createCoordinationTools (verified at graph.ts:718-721,933; supervise.ts:1587,1668; supervisor-agent.ts:509,592; coordination-driver.ts:367; coordination-mcp.ts:156). The per-call continuity arg is a live MCP tool parameter (coordination.ts:1796-1810),
  • Fit with existing patterns: Excellent. Extends the established edge-ledger observability contract (continuity is a new column on EdgeTraversal/graph.ts:142-167 and the journal edge event/types.ts:939-944) and the established fail-closed spawn-resolution discipline (resolves before assignment/budget, coordination.ts:1862-1872). Does NOT compete with the key idempotency mechanism (explicitly refused resume-with-key) or steer
  • Real-world viability: Holds up. Refusals cover every realistic misuse and are tested (graph.test.ts: resume-no-prior, resume-while-live, resume-with-key, resume-after-failed-prior, nonsense value on edge, continuity-on-analyzes-edge). Racing resumes are safe: resolveContinuity is synchronous, reads the live view + ledger, and hands off to scope.spawn with no await gap (coordination.ts:1114-1167, 1884-1888). latestSettl
  • Model: opencode/zai-coding-plan/glm-5.2
  • Bridge attempts: 1

🔎 Heuristic Signals

🟡 Cruft: console debug addedexamples/graphs/shared.ts

  • console.log(

🎯 Usefulness Audit

🟡 'resume' is overloaded between continuity-resume and durable Scope.resume[ergonomics] ``

The word 'resume' now names two distinct concepts at two layers: continuity 'resume' (WorkerResumeContext / spawnContext.resume — per-node session re-attachment WITHIN one process) and the pre-existing durable Scope.resume (ResumedWork / scope.resume — cross-process restart from a journal). Both are surfaced on adjacent surfaces (a single spawn context could in principle carry both spawnContext.resume AND come from a scope.resume path). They are documented as distinct and operate at different la


What this audit checks

It judges the change on its merits — not whether it was tasked out in an issue. Unticketed, fast-moving work is fine; the question is whether the change is good and whether a better or existing approach should be used instead.

PassWhat it asks
HeuristicVague title? Whitespace-only or cruft-bearing diff? (content signals only)
DuplicationDo added function/class names already exist elsewhere in the repo?
Value AuditWhat does it do? What goal does it achieve? Is it good? Better architecture or already-exists?
Usefulness AuditDoes it integrate and fit? Will it hold up in real use and actually get used?

Findings are concerns, not blocks — the human reviewer decides what to do with them.

value-audit · 20260803T194758Z

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@drewstone@tangletools
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(supervise): first-class continuity on graph edges — fresh | resume | steer, all ledgered - #725

Merged
drewstone merged 2 commits into
mainfrom
feat/graph-continuity
Aug 3, 2026
Merged

feat(supervise): first-class continuity on graph edges — fresh | resume | steer, all ledgered#725
drewstone merged 2 commits into
mainfrom
feat/graph-continuity

Conversation

@drewstone

Copy link
Copy Markdown
Contributor

Owner directive from #694: fresh respawns, session RESUMES, and live steers must all be expressible as plain data. This ships the axis.

  • Delegates edges declare continuity: 'fresh' | 'resume' (per-spawn override on the tool); every ledger row and journal edge event stamps the effective mode — fresh/resume on spawns, steer on steer legs and analyzes deliveries. Zero ambiguity about how any hop continued.
  • Resume: a new live worker on the same node whose executor receives resume: { ofWorker, sequence } and owns session re-attachment; spend continuous in the one conserved pool; caps count resumes like spawns. Refused loud: no prior settled worker, prior still live (that's steer — the error says so), riding a semantic key, unresumable seams (workerFromBackend fails loud rather than ledger a resume that never happened — post-audit hardening). Resume after a FAILED prior is deliberately allowed (the seam decides salvageability) — tested and stated.
  • examples/graphs/shot-loop-resumed.ts: the VB resumed-shot loop as pure data — shots stamp fresh/resume/resume, lineage chain proven at the seam.
  • Back-compat: continuity-free graphs byte-identical (audit probe chore: agent-runtime 0.5.5 — unify agent-eval / agent-knowledge dep tree #6: all 10 new tests FAIL against old src — they test the feature, not tautologies).

Adversarially audited SHIP: lineage plumbing, dedup-distinctness, stamp integrity, refusals, and spend arithmetic all micro-revert-falsified; racing resumes proven safe (zero async gap).

0.127.0 + CHANGELOG. Suite 2364; typecheck/lint/build/docs/version-gate green.

…sals — fresh | resume | steer as ledgered data
A delegates edge accepts continuity: 'fresh' | 'resume' (edge default;
spawn_agent takes a per-call override). A resume traversal targets a node
whose prior worker has SETTLED: the kernel spawns a NEW live worker bound
to the same node whose spawn context carries resume: { ofWorker, sequence }
(WorkerResumeContext) — the executor seam owns the session re-attachment;
the kernel keeps identity, ordering, ledger truth, and spend continuity in
the one conserved pool. Traversal caps count resumes exactly like fresh
spawns.
Fail-loud refusals at the tool: resume-no-prior (explicit resume with no
settled prior; the DECLARED edge default instead degrades to fresh on the
node's first spawn), resume-while-live (steer is the live-worker channel,
the error says so), resume-with-key (keys are run-once, resume runs again).
Resume lineage is process-local — the same boundary as the analyst-run
marker — and stated where it lives.
EdgeTraversal and the journal 'edge' event gain
continuity: 'fresh' | 'resume' | 'steer' — spawns stamp their effective
mode, every mid-run delivery into a live recipient (driver steer legs,
every analyzes delivery) stamps 'steer'. validateGraph refuses nonsense
values and analyzes edges carrying the field.
Threaded as continuityByProfile through SuperviseOptions →
SupervisorAgentDeps → DriverAgentOptions / serveCoordinationMcp →
CoordinationToolsOptions; runGraph derives it from delegates edges. Kernel
exports ContinuityMode, WorkerResumeContext, TraversalContinuity.
New example examples/graphs/shot-loop-resumed.ts (the VB shot shape as
data: shot 1 fresh, shots 2-3 resume the prior settled session), proven
offline in tests/examples/graph-topologies.test.ts; kernel continuity
suite in tests/kernel/graph.test.ts. Edges without continuity behave
byte-identically to before. Bump 0.127.0.
… pin resume-after-failed-prior policy
A backend seam with no session re-attachment accepting a resume spawn
would ledger continuity:'resume' over a brand-new session — a stamp
asserting something that never happened. Refuse loud; session-resuming
makeWorkerAgent seams are the resume consumers. Failed-prior resume is
deliberately allowed (the seam decides salvageability) — now tested and
stated.

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Auto-approved drewstone PR — d2986340

This PR was opened by the trusted drewstone account.
The full PR reviewer audit still runs separately and will publish findings if it detects issues.

tangletools · auto-approval · reason: drewstone_author · 2026-08-03T19:43:21Z

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Value Audit — sound

Verdictsound
Concerns2 (1 low, 1 weak-concern)
Heuristic0.0s
Duplication0.0s
Interrogation140.3s (2 bridge agents)
Total140.3s

💰 Value — sound

Adds node-level session continuity (fresh|resume|steer) as plain data on graph edges — a clean new axis that the three existing primitives (process-resume, key, steer) genuinely don't cover, built on the existing makeWorkerAgent seam and edge ledger.

  • What it does: A delegates edge (or per-call spawn_agent arg) may declare continuity: 'resume'. On any spawn after the node's first, the kernel resolves the node's most recent SETTLED worker (by profile.name = node id), mints a NEW live worker, and hands its executor seam WorkerSpawnContext.resume = { ofWorker, sequence } — the lineage the seam uses to re-attach the backend session. The kernel keeps identity, or
  • Goals it achieves: Make 'fresh respawn vs session resume vs live steer' expressible as ONE FIELD on a graph edge, so a resumed shot-loop (shot 1 settles failed → shot 2 continues shot 1's session context, spend continuous in one pool) is data, not a hand-rolled driver loop. Secondary: eliminate ledger ambiguity — every hop now states how it continued, so 'did traversal 2 continue traversal 1's session or start fresh
  • Assessment: Sound and in-grain. The change fills a real gap: I checked the three adjacent primitives and none covers 'spawn a NEW worker that continues a SETTLED prior worker's session'. Scope.resume/ResumedWork (types.ts:711) is PROCESS-crash recovery — it re-adopts settled work without spawning; key/SpawnOpts.key (types.ts:503) is idempotency — a completed key returns its cached result WITHOUT re-running; s
  • Better / existing approach: none — this is the right approach. Searched for an existing mechanism to extend: Scope.resume (types.ts:711) is process-level crash recovery, a different concept; SpawnOpts.key (types.ts:503) is run-once idempotency, structurally incompatible (extending key to mean 'run again with lineage' would break its exactly-once guarantee); steer (types.ts:644 Scope.send) targets LIVE workers, not settled on
  • Model: opencode/zai-coding-plan/glm-5.2
  • Bridge attempts: 2
  • Bridge warning: opencode/kimi-for-coding/k2p7: opencode: opencode error

🎯 Usefulness — sound

A coherent, fully-threaded continuity axis (fresh/resume/steer) that extends the edge-ledger and fail-closed spawn patterns in the codebase's grain, with comprehensive refusals and correct back-compat — no equivalent reinvented, no materially better approach.

  • Integration: Fully reachable. continuityByProfile is plumbed through runGraph → supervise → supervisorAgent (both arms) → driverAgent → serveCoordinationMcp → createCoordinationTools (verified at graph.ts:718-721,933; supervise.ts:1587,1668; supervisor-agent.ts:509,592; coordination-driver.ts:367; coordination-mcp.ts:156). The per-call continuity arg is a live MCP tool parameter (coordination.ts:1796-1810),
  • Fit with existing patterns: Excellent. Extends the established edge-ledger observability contract (continuity is a new column on EdgeTraversal/graph.ts:142-167 and the journal edge event/types.ts:939-944) and the established fail-closed spawn-resolution discipline (resolves before assignment/budget, coordination.ts:1862-1872). Does NOT compete with the key idempotency mechanism (explicitly refused resume-with-key) or steer
  • Real-world viability: Holds up. Refusals cover every realistic misuse and are tested (graph.test.ts: resume-no-prior, resume-while-live, resume-with-key, resume-after-failed-prior, nonsense value on edge, continuity-on-analyzes-edge). Racing resumes are safe: resolveContinuity is synchronous, reads the live view + ledger, and hands off to scope.spawn with no await gap (coordination.ts:1114-1167, 1884-1888). latestSettl
  • Model: opencode/zai-coding-plan/glm-5.2
  • Bridge attempts: 1

🔎 Heuristic Signals

🟡 Cruft: console debug addedexamples/graphs/shared.ts

  • console.log(

🎯 Usefulness Audit

🟡 'resume' is overloaded between continuity-resume and durable Scope.resume[ergonomics] ``

The word 'resume' now names two distinct concepts at two layers: continuity 'resume' (WorkerResumeContext / spawnContext.resume — per-node session re-attachment WITHIN one process) and the pre-existing durable Scope.resume (ResumedWork / scope.resume — cross-process restart from a journal). Both are surfaced on adjacent surfaces (a single spawn context could in principle carry both spawnContext.resume AND come from a scope.resume path). They are documented as distinct and operate at different la


What this audit checks

It judges the change on its merits — not whether it was tasked out in an issue. Unticketed, fast-moving work is fine; the question is whether the change is good and whether a better or existing approach should be used instead.

PassWhat it asks
HeuristicVague title? Whitespace-only or cruft-bearing diff? (content signals only)
DuplicationDo added function/class names already exist elsewhere in the repo?
Value AuditWhat does it do? What goal does it achieve? Is it good? Better architecture or already-exists?
Usefulness AuditDoes it integrate and fit? Will it hold up in real use and actually get used?

Findings are concerns, not blocks — the human reviewer decides what to do with them.

value-audit · 20260803T194758Z

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@drewstone@tangletools
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(supervise): first-class continuity on graph edges — fresh | resume | steer, all ledgered - #725

Merged
drewstone merged 2 commits into
mainfrom
feat/graph-continuity
Aug 3, 2026
Merged

feat(supervise): first-class continuity on graph edges — fresh | resume | steer, all ledgered#725
drewstone merged 2 commits into
mainfrom
feat/graph-continuity

Conversation

@drewstone

Copy link
Copy Markdown
Contributor

Owner directive from #694: fresh respawns, session RESUMES, and live steers must all be expressible as plain data. This ships the axis.

  • Delegates edges declare continuity: 'fresh' | 'resume' (per-spawn override on the tool); every ledger row and journal edge event stamps the effective mode — fresh/resume on spawns, steer on steer legs and analyzes deliveries. Zero ambiguity about how any hop continued.
  • Resume: a new live worker on the same node whose executor receives resume: { ofWorker, sequence } and owns session re-attachment; spend continuous in the one conserved pool; caps count resumes like spawns. Refused loud: no prior settled worker, prior still live (that's steer — the error says so), riding a semantic key, unresumable seams (workerFromBackend fails loud rather than ledger a resume that never happened — post-audit hardening). Resume after a FAILED prior is deliberately allowed (the seam decides salvageability) — tested and stated.
  • examples/graphs/shot-loop-resumed.ts: the VB resumed-shot loop as pure data — shots stamp fresh/resume/resume, lineage chain proven at the seam.
  • Back-compat: continuity-free graphs byte-identical (audit probe chore: agent-runtime 0.5.5 — unify agent-eval / agent-knowledge dep tree #6: all 10 new tests FAIL against old src — they test the feature, not tautologies).

Adversarially audited SHIP: lineage plumbing, dedup-distinctness, stamp integrity, refusals, and spend arithmetic all micro-revert-falsified; racing resumes proven safe (zero async gap).

0.127.0 + CHANGELOG. Suite 2364; typecheck/lint/build/docs/version-gate green.

…sals — fresh | resume | steer as ledgered data
A delegates edge accepts continuity: 'fresh' | 'resume' (edge default;
spawn_agent takes a per-call override). A resume traversal targets a node
whose prior worker has SETTLED: the kernel spawns a NEW live worker bound
to the same node whose spawn context carries resume: { ofWorker, sequence }
(WorkerResumeContext) — the executor seam owns the session re-attachment;
the kernel keeps identity, ordering, ledger truth, and spend continuity in
the one conserved pool. Traversal caps count resumes exactly like fresh
spawns.
Fail-loud refusals at the tool: resume-no-prior (explicit resume with no
settled prior; the DECLARED edge default instead degrades to fresh on the
node's first spawn), resume-while-live (steer is the live-worker channel,
the error says so), resume-with-key (keys are run-once, resume runs again).
Resume lineage is process-local — the same boundary as the analyst-run
marker — and stated where it lives.
EdgeTraversal and the journal 'edge' event gain
continuity: 'fresh' | 'resume' | 'steer' — spawns stamp their effective
mode, every mid-run delivery into a live recipient (driver steer legs,
every analyzes delivery) stamps 'steer'. validateGraph refuses nonsense
values and analyzes edges carrying the field.
Threaded as continuityByProfile through SuperviseOptions →
SupervisorAgentDeps → DriverAgentOptions / serveCoordinationMcp →
CoordinationToolsOptions; runGraph derives it from delegates edges. Kernel
exports ContinuityMode, WorkerResumeContext, TraversalContinuity.
New example examples/graphs/shot-loop-resumed.ts (the VB shot shape as
data: shot 1 fresh, shots 2-3 resume the prior settled session), proven
offline in tests/examples/graph-topologies.test.ts; kernel continuity
suite in tests/kernel/graph.test.ts. Edges without continuity behave
byte-identically to before. Bump 0.127.0.
… pin resume-after-failed-prior policy
A backend seam with no session re-attachment accepting a resume spawn
would ledger continuity:'resume' over a brand-new session — a stamp
asserting something that never happened. Refuse loud; session-resuming
makeWorkerAgent seams are the resume consumers. Failed-prior resume is
deliberately allowed (the seam decides salvageability) — now tested and
stated.

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Auto-approved drewstone PR — d2986340

This PR was opened by the trusted drewstone account.
The full PR reviewer audit still runs separately and will publish findings if it detects issues.

tangletools · auto-approval · reason: drewstone_author · 2026-08-03T19:43:21Z

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Value Audit — sound

Verdictsound
Concerns2 (1 low, 1 weak-concern)
Heuristic0.0s
Duplication0.0s
Interrogation140.3s (2 bridge agents)
Total140.3s

💰 Value — sound

Adds node-level session continuity (fresh|resume|steer) as plain data on graph edges — a clean new axis that the three existing primitives (process-resume, key, steer) genuinely don't cover, built on the existing makeWorkerAgent seam and edge ledger.

  • What it does: A delegates edge (or per-call spawn_agent arg) may declare continuity: 'resume'. On any spawn after the node's first, the kernel resolves the node's most recent SETTLED worker (by profile.name = node id), mints a NEW live worker, and hands its executor seam WorkerSpawnContext.resume = { ofWorker, sequence } — the lineage the seam uses to re-attach the backend session. The kernel keeps identity, or
  • Goals it achieves: Make 'fresh respawn vs session resume vs live steer' expressible as ONE FIELD on a graph edge, so a resumed shot-loop (shot 1 settles failed → shot 2 continues shot 1's session context, spend continuous in one pool) is data, not a hand-rolled driver loop. Secondary: eliminate ledger ambiguity — every hop now states how it continued, so 'did traversal 2 continue traversal 1's session or start fresh
  • Assessment: Sound and in-grain. The change fills a real gap: I checked the three adjacent primitives and none covers 'spawn a NEW worker that continues a SETTLED prior worker's session'. Scope.resume/ResumedWork (types.ts:711) is PROCESS-crash recovery — it re-adopts settled work without spawning; key/SpawnOpts.key (types.ts:503) is idempotency — a completed key returns its cached result WITHOUT re-running; s
  • Better / existing approach: none — this is the right approach. Searched for an existing mechanism to extend: Scope.resume (types.ts:711) is process-level crash recovery, a different concept; SpawnOpts.key (types.ts:503) is run-once idempotency, structurally incompatible (extending key to mean 'run again with lineage' would break its exactly-once guarantee); steer (types.ts:644 Scope.send) targets LIVE workers, not settled on
  • Model: opencode/zai-coding-plan/glm-5.2
  • Bridge attempts: 2
  • Bridge warning: opencode/kimi-for-coding/k2p7: opencode: opencode error

🎯 Usefulness — sound

A coherent, fully-threaded continuity axis (fresh/resume/steer) that extends the edge-ledger and fail-closed spawn patterns in the codebase's grain, with comprehensive refusals and correct back-compat — no equivalent reinvented, no materially better approach.

  • Integration: Fully reachable. continuityByProfile is plumbed through runGraph → supervise → supervisorAgent (both arms) → driverAgent → serveCoordinationMcp → createCoordinationTools (verified at graph.ts:718-721,933; supervise.ts:1587,1668; supervisor-agent.ts:509,592; coordination-driver.ts:367; coordination-mcp.ts:156). The per-call continuity arg is a live MCP tool parameter (coordination.ts:1796-1810),
  • Fit with existing patterns: Excellent. Extends the established edge-ledger observability contract (continuity is a new column on EdgeTraversal/graph.ts:142-167 and the journal edge event/types.ts:939-944) and the established fail-closed spawn-resolution discipline (resolves before assignment/budget, coordination.ts:1862-1872). Does NOT compete with the key idempotency mechanism (explicitly refused resume-with-key) or steer
  • Real-world viability: Holds up. Refusals cover every realistic misuse and are tested (graph.test.ts: resume-no-prior, resume-while-live, resume-with-key, resume-after-failed-prior, nonsense value on edge, continuity-on-analyzes-edge). Racing resumes are safe: resolveContinuity is synchronous, reads the live view + ledger, and hands off to scope.spawn with no await gap (coordination.ts:1114-1167, 1884-1888). latestSettl
  • Model: opencode/zai-coding-plan/glm-5.2
  • Bridge attempts: 1

🔎 Heuristic Signals

🟡 Cruft: console debug addedexamples/graphs/shared.ts

  • console.log(

🎯 Usefulness Audit

🟡 'resume' is overloaded between continuity-resume and durable Scope.resume[ergonomics] ``

The word 'resume' now names two distinct concepts at two layers: continuity 'resume' (WorkerResumeContext / spawnContext.resume — per-node session re-attachment WITHIN one process) and the pre-existing durable Scope.resume (ResumedWork / scope.resume — cross-process restart from a journal). Both are surfaced on adjacent surfaces (a single spawn context could in principle carry both spawnContext.resume AND come from a scope.resume path). They are documented as distinct and operate at different la


What this audit checks

It judges the change on its merits — not whether it was tasked out in an issue. Unticketed, fast-moving work is fine; the question is whether the change is good and whether a better or existing approach should be used instead.

PassWhat it asks
HeuristicVague title? Whitespace-only or cruft-bearing diff? (content signals only)
DuplicationDo added function/class names already exist elsewhere in the repo?
Value AuditWhat does it do? What goal does it achieve? Is it good? Better architecture or already-exists?
Usefulness AuditDoes it integrate and fit? Will it hold up in real use and actually get used?

Findings are concerns, not blocks — the human reviewer decides what to do with them.

value-audit · 20260803T194758Z

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@drewstone@tangletools
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(supervise): first-class continuity on graph edges — fresh | resume | steer, all ledgered - #725

Merged
drewstone merged 2 commits into
mainfrom
feat/graph-continuity
Aug 3, 2026
Merged

feat(supervise): first-class continuity on graph edges — fresh | resume | steer, all ledgered#725
drewstone merged 2 commits into
mainfrom
feat/graph-continuity

Conversation

@drewstone

Copy link
Copy Markdown
Contributor

Owner directive from #694: fresh respawns, session RESUMES, and live steers must all be expressible as plain data. This ships the axis.

  • Delegates edges declare continuity: 'fresh' | 'resume' (per-spawn override on the tool); every ledger row and journal edge event stamps the effective mode — fresh/resume on spawns, steer on steer legs and analyzes deliveries. Zero ambiguity about how any hop continued.
  • Resume: a new live worker on the same node whose executor receives resume: { ofWorker, sequence } and owns session re-attachment; spend continuous in the one conserved pool; caps count resumes like spawns. Refused loud: no prior settled worker, prior still live (that's steer — the error says so), riding a semantic key, unresumable seams (workerFromBackend fails loud rather than ledger a resume that never happened — post-audit hardening). Resume after a FAILED prior is deliberately allowed (the seam decides salvageability) — tested and stated.
  • examples/graphs/shot-loop-resumed.ts: the VB resumed-shot loop as pure data — shots stamp fresh/resume/resume, lineage chain proven at the seam.
  • Back-compat: continuity-free graphs byte-identical (audit probe chore: agent-runtime 0.5.5 — unify agent-eval / agent-knowledge dep tree #6: all 10 new tests FAIL against old src — they test the feature, not tautologies).

Adversarially audited SHIP: lineage plumbing, dedup-distinctness, stamp integrity, refusals, and spend arithmetic all micro-revert-falsified; racing resumes proven safe (zero async gap).

0.127.0 + CHANGELOG. Suite 2364; typecheck/lint/build/docs/version-gate green.

…sals — fresh | resume | steer as ledgered data
A delegates edge accepts continuity: 'fresh' | 'resume' (edge default;
spawn_agent takes a per-call override). A resume traversal targets a node
whose prior worker has SETTLED: the kernel spawns a NEW live worker bound
to the same node whose spawn context carries resume: { ofWorker, sequence }
(WorkerResumeContext) — the executor seam owns the session re-attachment;
the kernel keeps identity, ordering, ledger truth, and spend continuity in
the one conserved pool. Traversal caps count resumes exactly like fresh
spawns.
Fail-loud refusals at the tool: resume-no-prior (explicit resume with no
settled prior; the DECLARED edge default instead degrades to fresh on the
node's first spawn), resume-while-live (steer is the live-worker channel,
the error says so), resume-with-key (keys are run-once, resume runs again).
Resume lineage is process-local — the same boundary as the analyst-run
marker — and stated where it lives.
EdgeTraversal and the journal 'edge' event gain
continuity: 'fresh' | 'resume' | 'steer' — spawns stamp their effective
mode, every mid-run delivery into a live recipient (driver steer legs,
every analyzes delivery) stamps 'steer'. validateGraph refuses nonsense
values and analyzes edges carrying the field.
Threaded as continuityByProfile through SuperviseOptions →
SupervisorAgentDeps → DriverAgentOptions / serveCoordinationMcp →
CoordinationToolsOptions; runGraph derives it from delegates edges. Kernel
exports ContinuityMode, WorkerResumeContext, TraversalContinuity.
New example examples/graphs/shot-loop-resumed.ts (the VB shot shape as
data: shot 1 fresh, shots 2-3 resume the prior settled session), proven
offline in tests/examples/graph-topologies.test.ts; kernel continuity
suite in tests/kernel/graph.test.ts. Edges without continuity behave
byte-identically to before. Bump 0.127.0.
… pin resume-after-failed-prior policy
A backend seam with no session re-attachment accepting a resume spawn
would ledger continuity:'resume' over a brand-new session — a stamp
asserting something that never happened. Refuse loud; session-resuming
makeWorkerAgent seams are the resume consumers. Failed-prior resume is
deliberately allowed (the seam decides salvageability) — now tested and
stated.

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Auto-approved drewstone PR — d2986340

This PR was opened by the trusted drewstone account.
The full PR reviewer audit still runs separately and will publish findings if it detects issues.

tangletools · auto-approval · reason: drewstone_author · 2026-08-03T19:43:21Z

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Value Audit — sound

Verdictsound
Concerns2 (1 low, 1 weak-concern)
Heuristic0.0s
Duplication0.0s
Interrogation140.3s (2 bridge agents)
Total140.3s

💰 Value — sound

Adds node-level session continuity (fresh|resume|steer) as plain data on graph edges — a clean new axis that the three existing primitives (process-resume, key, steer) genuinely don't cover, built on the existing makeWorkerAgent seam and edge ledger.

  • What it does: A delegates edge (or per-call spawn_agent arg) may declare continuity: 'resume'. On any spawn after the node's first, the kernel resolves the node's most recent SETTLED worker (by profile.name = node id), mints a NEW live worker, and hands its executor seam WorkerSpawnContext.resume = { ofWorker, sequence } — the lineage the seam uses to re-attach the backend session. The kernel keeps identity, or
  • Goals it achieves: Make 'fresh respawn vs session resume vs live steer' expressible as ONE FIELD on a graph edge, so a resumed shot-loop (shot 1 settles failed → shot 2 continues shot 1's session context, spend continuous in one pool) is data, not a hand-rolled driver loop. Secondary: eliminate ledger ambiguity — every hop now states how it continued, so 'did traversal 2 continue traversal 1's session or start fresh
  • Assessment: Sound and in-grain. The change fills a real gap: I checked the three adjacent primitives and none covers 'spawn a NEW worker that continues a SETTLED prior worker's session'. Scope.resume/ResumedWork (types.ts:711) is PROCESS-crash recovery — it re-adopts settled work without spawning; key/SpawnOpts.key (types.ts:503) is idempotency — a completed key returns its cached result WITHOUT re-running; s
  • Better / existing approach: none — this is the right approach. Searched for an existing mechanism to extend: Scope.resume (types.ts:711) is process-level crash recovery, a different concept; SpawnOpts.key (types.ts:503) is run-once idempotency, structurally incompatible (extending key to mean 'run again with lineage' would break its exactly-once guarantee); steer (types.ts:644 Scope.send) targets LIVE workers, not settled on
  • Model: opencode/zai-coding-plan/glm-5.2
  • Bridge attempts: 2
  • Bridge warning: opencode/kimi-for-coding/k2p7: opencode: opencode error

🎯 Usefulness — sound

A coherent, fully-threaded continuity axis (fresh/resume/steer) that extends the edge-ledger and fail-closed spawn patterns in the codebase's grain, with comprehensive refusals and correct back-compat — no equivalent reinvented, no materially better approach.

  • Integration: Fully reachable. continuityByProfile is plumbed through runGraph → supervise → supervisorAgent (both arms) → driverAgent → serveCoordinationMcp → createCoordinationTools (verified at graph.ts:718-721,933; supervise.ts:1587,1668; supervisor-agent.ts:509,592; coordination-driver.ts:367; coordination-mcp.ts:156). The per-call continuity arg is a live MCP tool parameter (coordination.ts:1796-1810),
  • Fit with existing patterns: Excellent. Extends the established edge-ledger observability contract (continuity is a new column on EdgeTraversal/graph.ts:142-167 and the journal edge event/types.ts:939-944) and the established fail-closed spawn-resolution discipline (resolves before assignment/budget, coordination.ts:1862-1872). Does NOT compete with the key idempotency mechanism (explicitly refused resume-with-key) or steer
  • Real-world viability: Holds up. Refusals cover every realistic misuse and are tested (graph.test.ts: resume-no-prior, resume-while-live, resume-with-key, resume-after-failed-prior, nonsense value on edge, continuity-on-analyzes-edge). Racing resumes are safe: resolveContinuity is synchronous, reads the live view + ledger, and hands off to scope.spawn with no await gap (coordination.ts:1114-1167, 1884-1888). latestSettl
  • Model: opencode/zai-coding-plan/glm-5.2
  • Bridge attempts: 1

🔎 Heuristic Signals

🟡 Cruft: console debug addedexamples/graphs/shared.ts

  • console.log(

🎯 Usefulness Audit

🟡 'resume' is overloaded between continuity-resume and durable Scope.resume[ergonomics] ``

The word 'resume' now names two distinct concepts at two layers: continuity 'resume' (WorkerResumeContext / spawnContext.resume — per-node session re-attachment WITHIN one process) and the pre-existing durable Scope.resume (ResumedWork / scope.resume — cross-process restart from a journal). Both are surfaced on adjacent surfaces (a single spawn context could in principle carry both spawnContext.resume AND come from a scope.resume path). They are documented as distinct and operate at different la


What this audit checks

It judges the change on its merits — not whether it was tasked out in an issue. Unticketed, fast-moving work is fine; the question is whether the change is good and whether a better or existing approach should be used instead.

PassWhat it asks
HeuristicVague title? Whitespace-only or cruft-bearing diff? (content signals only)
DuplicationDo added function/class names already exist elsewhere in the repo?
Value AuditWhat does it do? What goal does it achieve? Is it good? Better architecture or already-exists?
Usefulness AuditDoes it integrate and fit? Will it hold up in real use and actually get used?

Findings are concerns, not blocks — the human reviewer decides what to do with them.

value-audit · 20260803T194758Z

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@drewstone@tangletools
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(supervise): first-class continuity on graph edges — fresh | resume | steer, all ledgered - #725

Merged
drewstone merged 2 commits into
mainfrom
feat/graph-continuity
Aug 3, 2026
Merged

feat(supervise): first-class continuity on graph edges — fresh | resume | steer, all ledgered#725
drewstone merged 2 commits into
mainfrom
feat/graph-continuity

Conversation

@drewstone

Copy link
Copy Markdown
Contributor

Owner directive from #694: fresh respawns, session RESUMES, and live steers must all be expressible as plain data. This ships the axis.

  • Delegates edges declare continuity: 'fresh' | 'resume' (per-spawn override on the tool); every ledger row and journal edge event stamps the effective mode — fresh/resume on spawns, steer on steer legs and analyzes deliveries. Zero ambiguity about how any hop continued.
  • Resume: a new live worker on the same node whose executor receives resume: { ofWorker, sequence } and owns session re-attachment; spend continuous in the one conserved pool; caps count resumes like spawns. Refused loud: no prior settled worker, prior still live (that's steer — the error says so), riding a semantic key, unresumable seams (workerFromBackend fails loud rather than ledger a resume that never happened — post-audit hardening). Resume after a FAILED prior is deliberately allowed (the seam decides salvageability) — tested and stated.
  • examples/graphs/shot-loop-resumed.ts: the VB resumed-shot loop as pure data — shots stamp fresh/resume/resume, lineage chain proven at the seam.
  • Back-compat: continuity-free graphs byte-identical (audit probe chore: agent-runtime 0.5.5 — unify agent-eval / agent-knowledge dep tree #6: all 10 new tests FAIL against old src — they test the feature, not tautologies).

Adversarially audited SHIP: lineage plumbing, dedup-distinctness, stamp integrity, refusals, and spend arithmetic all micro-revert-falsified; racing resumes proven safe (zero async gap).

0.127.0 + CHANGELOG. Suite 2364; typecheck/lint/build/docs/version-gate green.

…sals — fresh | resume | steer as ledgered data
A delegates edge accepts continuity: 'fresh' | 'resume' (edge default;
spawn_agent takes a per-call override). A resume traversal targets a node
whose prior worker has SETTLED: the kernel spawns a NEW live worker bound
to the same node whose spawn context carries resume: { ofWorker, sequence }
(WorkerResumeContext) — the executor seam owns the session re-attachment;
the kernel keeps identity, ordering, ledger truth, and spend continuity in
the one conserved pool. Traversal caps count resumes exactly like fresh
spawns.
Fail-loud refusals at the tool: resume-no-prior (explicit resume with no
settled prior; the DECLARED edge default instead degrades to fresh on the
node's first spawn), resume-while-live (steer is the live-worker channel,
the error says so), resume-with-key (keys are run-once, resume runs again).
Resume lineage is process-local — the same boundary as the analyst-run
marker — and stated where it lives.
EdgeTraversal and the journal 'edge' event gain
continuity: 'fresh' | 'resume' | 'steer' — spawns stamp their effective
mode, every mid-run delivery into a live recipient (driver steer legs,
every analyzes delivery) stamps 'steer'. validateGraph refuses nonsense
values and analyzes edges carrying the field.
Threaded as continuityByProfile through SuperviseOptions →
SupervisorAgentDeps → DriverAgentOptions / serveCoordinationMcp →
CoordinationToolsOptions; runGraph derives it from delegates edges. Kernel
exports ContinuityMode, WorkerResumeContext, TraversalContinuity.
New example examples/graphs/shot-loop-resumed.ts (the VB shot shape as
data: shot 1 fresh, shots 2-3 resume the prior settled session), proven
offline in tests/examples/graph-topologies.test.ts; kernel continuity
suite in tests/kernel/graph.test.ts. Edges without continuity behave
byte-identically to before. Bump 0.127.0.
… pin resume-after-failed-prior policy
A backend seam with no session re-attachment accepting a resume spawn
would ledger continuity:'resume' over a brand-new session — a stamp
asserting something that never happened. Refuse loud; session-resuming
makeWorkerAgent seams are the resume consumers. Failed-prior resume is
deliberately allowed (the seam decides salvageability) — now tested and
stated.

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Auto-approved drewstone PR — d2986340

This PR was opened by the trusted drewstone account.
The full PR reviewer audit still runs separately and will publish findings if it detects issues.

tangletools · auto-approval · reason: drewstone_author · 2026-08-03T19:43:21Z

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Value Audit — sound

Verdictsound
Concerns2 (1 low, 1 weak-concern)
Heuristic0.0s
Duplication0.0s
Interrogation140.3s (2 bridge agents)
Total140.3s

💰 Value — sound

Adds node-level session continuity (fresh|resume|steer) as plain data on graph edges — a clean new axis that the three existing primitives (process-resume, key, steer) genuinely don't cover, built on the existing makeWorkerAgent seam and edge ledger.

  • What it does: A delegates edge (or per-call spawn_agent arg) may declare continuity: 'resume'. On any spawn after the node's first, the kernel resolves the node's most recent SETTLED worker (by profile.name = node id), mints a NEW live worker, and hands its executor seam WorkerSpawnContext.resume = { ofWorker, sequence } — the lineage the seam uses to re-attach the backend session. The kernel keeps identity, or
  • Goals it achieves: Make 'fresh respawn vs session resume vs live steer' expressible as ONE FIELD on a graph edge, so a resumed shot-loop (shot 1 settles failed → shot 2 continues shot 1's session context, spend continuous in one pool) is data, not a hand-rolled driver loop. Secondary: eliminate ledger ambiguity — every hop now states how it continued, so 'did traversal 2 continue traversal 1's session or start fresh
  • Assessment: Sound and in-grain. The change fills a real gap: I checked the three adjacent primitives and none covers 'spawn a NEW worker that continues a SETTLED prior worker's session'. Scope.resume/ResumedWork (types.ts:711) is PROCESS-crash recovery — it re-adopts settled work without spawning; key/SpawnOpts.key (types.ts:503) is idempotency — a completed key returns its cached result WITHOUT re-running; s
  • Better / existing approach: none — this is the right approach. Searched for an existing mechanism to extend: Scope.resume (types.ts:711) is process-level crash recovery, a different concept; SpawnOpts.key (types.ts:503) is run-once idempotency, structurally incompatible (extending key to mean 'run again with lineage' would break its exactly-once guarantee); steer (types.ts:644 Scope.send) targets LIVE workers, not settled on
  • Model: opencode/zai-coding-plan/glm-5.2
  • Bridge attempts: 2
  • Bridge warning: opencode/kimi-for-coding/k2p7: opencode: opencode error

🎯 Usefulness — sound

A coherent, fully-threaded continuity axis (fresh/resume/steer) that extends the edge-ledger and fail-closed spawn patterns in the codebase's grain, with comprehensive refusals and correct back-compat — no equivalent reinvented, no materially better approach.

  • Integration: Fully reachable. continuityByProfile is plumbed through runGraph → supervise → supervisorAgent (both arms) → driverAgent → serveCoordinationMcp → createCoordinationTools (verified at graph.ts:718-721,933; supervise.ts:1587,1668; supervisor-agent.ts:509,592; coordination-driver.ts:367; coordination-mcp.ts:156). The per-call continuity arg is a live MCP tool parameter (coordination.ts:1796-1810),
  • Fit with existing patterns: Excellent. Extends the established edge-ledger observability contract (continuity is a new column on EdgeTraversal/graph.ts:142-167 and the journal edge event/types.ts:939-944) and the established fail-closed spawn-resolution discipline (resolves before assignment/budget, coordination.ts:1862-1872). Does NOT compete with the key idempotency mechanism (explicitly refused resume-with-key) or steer
  • Real-world viability: Holds up. Refusals cover every realistic misuse and are tested (graph.test.ts: resume-no-prior, resume-while-live, resume-with-key, resume-after-failed-prior, nonsense value on edge, continuity-on-analyzes-edge). Racing resumes are safe: resolveContinuity is synchronous, reads the live view + ledger, and hands off to scope.spawn with no await gap (coordination.ts:1114-1167, 1884-1888). latestSettl
  • Model: opencode/zai-coding-plan/glm-5.2
  • Bridge attempts: 1

🔎 Heuristic Signals

🟡 Cruft: console debug addedexamples/graphs/shared.ts

  • console.log(

🎯 Usefulness Audit

🟡 'resume' is overloaded between continuity-resume and durable Scope.resume[ergonomics] ``

The word 'resume' now names two distinct concepts at two layers: continuity 'resume' (WorkerResumeContext / spawnContext.resume — per-node session re-attachment WITHIN one process) and the pre-existing durable Scope.resume (ResumedWork / scope.resume — cross-process restart from a journal). Both are surfaced on adjacent surfaces (a single spawn context could in principle carry both spawnContext.resume AND come from a scope.resume path). They are documented as distinct and operate at different la


What this audit checks

It judges the change on its merits — not whether it was tasked out in an issue. Unticketed, fast-moving work is fine; the question is whether the change is good and whether a better or existing approach should be used instead.

PassWhat it asks
HeuristicVague title? Whitespace-only or cruft-bearing diff? (content signals only)
DuplicationDo added function/class names already exist elsewhere in the repo?
Value AuditWhat does it do? What goal does it achieve? Is it good? Better architecture or already-exists?
Usefulness AuditDoes it integrate and fit? Will it hold up in real use and actually get used?

Findings are concerns, not blocks — the human reviewer decides what to do with them.

value-audit · 20260803T194758Z

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@drewstone@tangletools
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(supervise): first-class continuity on graph edges — fresh | resume | steer, all ledgered - #725

Merged
drewstone merged 2 commits into
mainfrom
feat/graph-continuity
Aug 3, 2026
Merged

feat(supervise): first-class continuity on graph edges — fresh | resume | steer, all ledgered#725
drewstone merged 2 commits into
mainfrom
feat/graph-continuity

Conversation

@drewstone

Copy link
Copy Markdown
Contributor

Owner directive from #694: fresh respawns, session RESUMES, and live steers must all be expressible as plain data. This ships the axis.

  • Delegates edges declare continuity: 'fresh' | 'resume' (per-spawn override on the tool); every ledger row and journal edge event stamps the effective mode — fresh/resume on spawns, steer on steer legs and analyzes deliveries. Zero ambiguity about how any hop continued.
  • Resume: a new live worker on the same node whose executor receives resume: { ofWorker, sequence } and owns session re-attachment; spend continuous in the one conserved pool; caps count resumes like spawns. Refused loud: no prior settled worker, prior still live (that's steer — the error says so), riding a semantic key, unresumable seams (workerFromBackend fails loud rather than ledger a resume that never happened — post-audit hardening). Resume after a FAILED prior is deliberately allowed (the seam decides salvageability) — tested and stated.
  • examples/graphs/shot-loop-resumed.ts: the VB resumed-shot loop as pure data — shots stamp fresh/resume/resume, lineage chain proven at the seam.
  • Back-compat: continuity-free graphs byte-identical (audit probe chore: agent-runtime 0.5.5 — unify agent-eval / agent-knowledge dep tree #6: all 10 new tests FAIL against old src — they test the feature, not tautologies).

Adversarially audited SHIP: lineage plumbing, dedup-distinctness, stamp integrity, refusals, and spend arithmetic all micro-revert-falsified; racing resumes proven safe (zero async gap).

0.127.0 + CHANGELOG. Suite 2364; typecheck/lint/build/docs/version-gate green.

…sals — fresh | resume | steer as ledgered data
A delegates edge accepts continuity: 'fresh' | 'resume' (edge default;
spawn_agent takes a per-call override). A resume traversal targets a node
whose prior worker has SETTLED: the kernel spawns a NEW live worker bound
to the same node whose spawn context carries resume: { ofWorker, sequence }
(WorkerResumeContext) — the executor seam owns the session re-attachment;
the kernel keeps identity, ordering, ledger truth, and spend continuity in
the one conserved pool. Traversal caps count resumes exactly like fresh
spawns.
Fail-loud refusals at the tool: resume-no-prior (explicit resume with no
settled prior; the DECLARED edge default instead degrades to fresh on the
node's first spawn), resume-while-live (steer is the live-worker channel,
the error says so), resume-with-key (keys are run-once, resume runs again).
Resume lineage is process-local — the same boundary as the analyst-run
marker — and stated where it lives.
EdgeTraversal and the journal 'edge' event gain
continuity: 'fresh' | 'resume' | 'steer' — spawns stamp their effective
mode, every mid-run delivery into a live recipient (driver steer legs,
every analyzes delivery) stamps 'steer'. validateGraph refuses nonsense
values and analyzes edges carrying the field.
Threaded as continuityByProfile through SuperviseOptions →
SupervisorAgentDeps → DriverAgentOptions / serveCoordinationMcp →
CoordinationToolsOptions; runGraph derives it from delegates edges. Kernel
exports ContinuityMode, WorkerResumeContext, TraversalContinuity.
New example examples/graphs/shot-loop-resumed.ts (the VB shot shape as
data: shot 1 fresh, shots 2-3 resume the prior settled session), proven
offline in tests/examples/graph-topologies.test.ts; kernel continuity
suite in tests/kernel/graph.test.ts. Edges without continuity behave
byte-identically to before. Bump 0.127.0.
… pin resume-after-failed-prior policy
A backend seam with no session re-attachment accepting a resume spawn
would ledger continuity:'resume' over a brand-new session — a stamp
asserting something that never happened. Refuse loud; session-resuming
makeWorkerAgent seams are the resume consumers. Failed-prior resume is
deliberately allowed (the seam decides salvageability) — now tested and
stated.

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Auto-approved drewstone PR — d2986340

This PR was opened by the trusted drewstone account.
The full PR reviewer audit still runs separately and will publish findings if it detects issues.

tangletools · auto-approval · reason: drewstone_author · 2026-08-03T19:43:21Z

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Value Audit — sound

Verdictsound
Concerns2 (1 low, 1 weak-concern)
Heuristic0.0s
Duplication0.0s
Interrogation140.3s (2 bridge agents)
Total140.3s

💰 Value — sound

Adds node-level session continuity (fresh|resume|steer) as plain data on graph edges — a clean new axis that the three existing primitives (process-resume, key, steer) genuinely don't cover, built on the existing makeWorkerAgent seam and edge ledger.

  • What it does: A delegates edge (or per-call spawn_agent arg) may declare continuity: 'resume'. On any spawn after the node's first, the kernel resolves the node's most recent SETTLED worker (by profile.name = node id), mints a NEW live worker, and hands its executor seam WorkerSpawnContext.resume = { ofWorker, sequence } — the lineage the seam uses to re-attach the backend session. The kernel keeps identity, or
  • Goals it achieves: Make 'fresh respawn vs session resume vs live steer' expressible as ONE FIELD on a graph edge, so a resumed shot-loop (shot 1 settles failed → shot 2 continues shot 1's session context, spend continuous in one pool) is data, not a hand-rolled driver loop. Secondary: eliminate ledger ambiguity — every hop now states how it continued, so 'did traversal 2 continue traversal 1's session or start fresh
  • Assessment: Sound and in-grain. The change fills a real gap: I checked the three adjacent primitives and none covers 'spawn a NEW worker that continues a SETTLED prior worker's session'. Scope.resume/ResumedWork (types.ts:711) is PROCESS-crash recovery — it re-adopts settled work without spawning; key/SpawnOpts.key (types.ts:503) is idempotency — a completed key returns its cached result WITHOUT re-running; s
  • Better / existing approach: none — this is the right approach. Searched for an existing mechanism to extend: Scope.resume (types.ts:711) is process-level crash recovery, a different concept; SpawnOpts.key (types.ts:503) is run-once idempotency, structurally incompatible (extending key to mean 'run again with lineage' would break its exactly-once guarantee); steer (types.ts:644 Scope.send) targets LIVE workers, not settled on
  • Model: opencode/zai-coding-plan/glm-5.2
  • Bridge attempts: 2
  • Bridge warning: opencode/kimi-for-coding/k2p7: opencode: opencode error

🎯 Usefulness — sound

A coherent, fully-threaded continuity axis (fresh/resume/steer) that extends the edge-ledger and fail-closed spawn patterns in the codebase's grain, with comprehensive refusals and correct back-compat — no equivalent reinvented, no materially better approach.

  • Integration: Fully reachable. continuityByProfile is plumbed through runGraph → supervise → supervisorAgent (both arms) → driverAgent → serveCoordinationMcp → createCoordinationTools (verified at graph.ts:718-721,933; supervise.ts:1587,1668; supervisor-agent.ts:509,592; coordination-driver.ts:367; coordination-mcp.ts:156). The per-call continuity arg is a live MCP tool parameter (coordination.ts:1796-1810),
  • Fit with existing patterns: Excellent. Extends the established edge-ledger observability contract (continuity is a new column on EdgeTraversal/graph.ts:142-167 and the journal edge event/types.ts:939-944) and the established fail-closed spawn-resolution discipline (resolves before assignment/budget, coordination.ts:1862-1872). Does NOT compete with the key idempotency mechanism (explicitly refused resume-with-key) or steer
  • Real-world viability: Holds up. Refusals cover every realistic misuse and are tested (graph.test.ts: resume-no-prior, resume-while-live, resume-with-key, resume-after-failed-prior, nonsense value on edge, continuity-on-analyzes-edge). Racing resumes are safe: resolveContinuity is synchronous, reads the live view + ledger, and hands off to scope.spawn with no await gap (coordination.ts:1114-1167, 1884-1888). latestSettl
  • Model: opencode/zai-coding-plan/glm-5.2
  • Bridge attempts: 1

🔎 Heuristic Signals

🟡 Cruft: console debug addedexamples/graphs/shared.ts

  • console.log(

🎯 Usefulness Audit

🟡 'resume' is overloaded between continuity-resume and durable Scope.resume[ergonomics] ``

The word 'resume' now names two distinct concepts at two layers: continuity 'resume' (WorkerResumeContext / spawnContext.resume — per-node session re-attachment WITHIN one process) and the pre-existing durable Scope.resume (ResumedWork / scope.resume — cross-process restart from a journal). Both are surfaced on adjacent surfaces (a single spawn context could in principle carry both spawnContext.resume AND come from a scope.resume path). They are documented as distinct and operate at different la


What this audit checks

It judges the change on its merits — not whether it was tasked out in an issue. Unticketed, fast-moving work is fine; the question is whether the change is good and whether a better or existing approach should be used instead.

PassWhat it asks
HeuristicVague title? Whitespace-only or cruft-bearing diff? (content signals only)
DuplicationDo added function/class names already exist elsewhere in the repo?
Value AuditWhat does it do? What goal does it achieve? Is it good? Better architecture or already-exists?
Usefulness AuditDoes it integrate and fit? Will it hold up in real use and actually get used?

Findings are concerns, not blocks — the human reviewer decides what to do with them.

value-audit · 20260803T194758Z

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@drewstone@tangletools
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(supervise): first-class continuity on graph edges — fresh | resume | steer, all ledgered - #725

Merged
drewstone merged 2 commits into
mainfrom
feat/graph-continuity
Aug 3, 2026
Merged

feat(supervise): first-class continuity on graph edges — fresh | resume | steer, all ledgered#725
drewstone merged 2 commits into
mainfrom
feat/graph-continuity

Conversation

@drewstone

Copy link
Copy Markdown
Contributor

Owner directive from #694: fresh respawns, session RESUMES, and live steers must all be expressible as plain data. This ships the axis.

  • Delegates edges declare continuity: 'fresh' | 'resume' (per-spawn override on the tool); every ledger row and journal edge event stamps the effective mode — fresh/resume on spawns, steer on steer legs and analyzes deliveries. Zero ambiguity about how any hop continued.
  • Resume: a new live worker on the same node whose executor receives resume: { ofWorker, sequence } and owns session re-attachment; spend continuous in the one conserved pool; caps count resumes like spawns. Refused loud: no prior settled worker, prior still live (that's steer — the error says so), riding a semantic key, unresumable seams (workerFromBackend fails loud rather than ledger a resume that never happened — post-audit hardening). Resume after a FAILED prior is deliberately allowed (the seam decides salvageability) — tested and stated.
  • examples/graphs/shot-loop-resumed.ts: the VB resumed-shot loop as pure data — shots stamp fresh/resume/resume, lineage chain proven at the seam.
  • Back-compat: continuity-free graphs byte-identical (audit probe chore: agent-runtime 0.5.5 — unify agent-eval / agent-knowledge dep tree #6: all 10 new tests FAIL against old src — they test the feature, not tautologies).

Adversarially audited SHIP: lineage plumbing, dedup-distinctness, stamp integrity, refusals, and spend arithmetic all micro-revert-falsified; racing resumes proven safe (zero async gap).

0.127.0 + CHANGELOG. Suite 2364; typecheck/lint/build/docs/version-gate green.

…sals — fresh | resume | steer as ledgered data
A delegates edge accepts continuity: 'fresh' | 'resume' (edge default;
spawn_agent takes a per-call override). A resume traversal targets a node
whose prior worker has SETTLED: the kernel spawns a NEW live worker bound
to the same node whose spawn context carries resume: { ofWorker, sequence }
(WorkerResumeContext) — the executor seam owns the session re-attachment;
the kernel keeps identity, ordering, ledger truth, and spend continuity in
the one conserved pool. Traversal caps count resumes exactly like fresh
spawns.
Fail-loud refusals at the tool: resume-no-prior (explicit resume with no
settled prior; the DECLARED edge default instead degrades to fresh on the
node's first spawn), resume-while-live (steer is the live-worker channel,
the error says so), resume-with-key (keys are run-once, resume runs again).
Resume lineage is process-local — the same boundary as the analyst-run
marker — and stated where it lives.
EdgeTraversal and the journal 'edge' event gain
continuity: 'fresh' | 'resume' | 'steer' — spawns stamp their effective
mode, every mid-run delivery into a live recipient (driver steer legs,
every analyzes delivery) stamps 'steer'. validateGraph refuses nonsense
values and analyzes edges carrying the field.
Threaded as continuityByProfile through SuperviseOptions →
SupervisorAgentDeps → DriverAgentOptions / serveCoordinationMcp →
CoordinationToolsOptions; runGraph derives it from delegates edges. Kernel
exports ContinuityMode, WorkerResumeContext, TraversalContinuity.
New example examples/graphs/shot-loop-resumed.ts (the VB shot shape as
data: shot 1 fresh, shots 2-3 resume the prior settled session), proven
offline in tests/examples/graph-topologies.test.ts; kernel continuity
suite in tests/kernel/graph.test.ts. Edges without continuity behave
byte-identically to before. Bump 0.127.0.
… pin resume-after-failed-prior policy
A backend seam with no session re-attachment accepting a resume spawn
would ledger continuity:'resume' over a brand-new session — a stamp
asserting something that never happened. Refuse loud; session-resuming
makeWorkerAgent seams are the resume consumers. Failed-prior resume is
deliberately allowed (the seam decides salvageability) — now tested and
stated.

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Auto-approved drewstone PR — d2986340

This PR was opened by the trusted drewstone account.
The full PR reviewer audit still runs separately and will publish findings if it detects issues.

tangletools · auto-approval · reason: drewstone_author · 2026-08-03T19:43:21Z

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Value Audit — sound

Verdictsound
Concerns2 (1 low, 1 weak-concern)
Heuristic0.0s
Duplication0.0s
Interrogation140.3s (2 bridge agents)
Total140.3s

💰 Value — sound

Adds node-level session continuity (fresh|resume|steer) as plain data on graph edges — a clean new axis that the three existing primitives (process-resume, key, steer) genuinely don't cover, built on the existing makeWorkerAgent seam and edge ledger.

  • What it does: A delegates edge (or per-call spawn_agent arg) may declare continuity: 'resume'. On any spawn after the node's first, the kernel resolves the node's most recent SETTLED worker (by profile.name = node id), mints a NEW live worker, and hands its executor seam WorkerSpawnContext.resume = { ofWorker, sequence } — the lineage the seam uses to re-attach the backend session. The kernel keeps identity, or
  • Goals it achieves: Make 'fresh respawn vs session resume vs live steer' expressible as ONE FIELD on a graph edge, so a resumed shot-loop (shot 1 settles failed → shot 2 continues shot 1's session context, spend continuous in one pool) is data, not a hand-rolled driver loop. Secondary: eliminate ledger ambiguity — every hop now states how it continued, so 'did traversal 2 continue traversal 1's session or start fresh
  • Assessment: Sound and in-grain. The change fills a real gap: I checked the three adjacent primitives and none covers 'spawn a NEW worker that continues a SETTLED prior worker's session'. Scope.resume/ResumedWork (types.ts:711) is PROCESS-crash recovery — it re-adopts settled work without spawning; key/SpawnOpts.key (types.ts:503) is idempotency — a completed key returns its cached result WITHOUT re-running; s
  • Better / existing approach: none — this is the right approach. Searched for an existing mechanism to extend: Scope.resume (types.ts:711) is process-level crash recovery, a different concept; SpawnOpts.key (types.ts:503) is run-once idempotency, structurally incompatible (extending key to mean 'run again with lineage' would break its exactly-once guarantee); steer (types.ts:644 Scope.send) targets LIVE workers, not settled on
  • Model: opencode/zai-coding-plan/glm-5.2
  • Bridge attempts: 2
  • Bridge warning: opencode/kimi-for-coding/k2p7: opencode: opencode error

🎯 Usefulness — sound

A coherent, fully-threaded continuity axis (fresh/resume/steer) that extends the edge-ledger and fail-closed spawn patterns in the codebase's grain, with comprehensive refusals and correct back-compat — no equivalent reinvented, no materially better approach.

  • Integration: Fully reachable. continuityByProfile is plumbed through runGraph → supervise → supervisorAgent (both arms) → driverAgent → serveCoordinationMcp → createCoordinationTools (verified at graph.ts:718-721,933; supervise.ts:1587,1668; supervisor-agent.ts:509,592; coordination-driver.ts:367; coordination-mcp.ts:156). The per-call continuity arg is a live MCP tool parameter (coordination.ts:1796-1810),
  • Fit with existing patterns: Excellent. Extends the established edge-ledger observability contract (continuity is a new column on EdgeTraversal/graph.ts:142-167 and the journal edge event/types.ts:939-944) and the established fail-closed spawn-resolution discipline (resolves before assignment/budget, coordination.ts:1862-1872). Does NOT compete with the key idempotency mechanism (explicitly refused resume-with-key) or steer
  • Real-world viability: Holds up. Refusals cover every realistic misuse and are tested (graph.test.ts: resume-no-prior, resume-while-live, resume-with-key, resume-after-failed-prior, nonsense value on edge, continuity-on-analyzes-edge). Racing resumes are safe: resolveContinuity is synchronous, reads the live view + ledger, and hands off to scope.spawn with no await gap (coordination.ts:1114-1167, 1884-1888). latestSettl
  • Model: opencode/zai-coding-plan/glm-5.2
  • Bridge attempts: 1

🔎 Heuristic Signals

🟡 Cruft: console debug addedexamples/graphs/shared.ts

  • console.log(

🎯 Usefulness Audit

🟡 'resume' is overloaded between continuity-resume and durable Scope.resume[ergonomics] ``

The word 'resume' now names two distinct concepts at two layers: continuity 'resume' (WorkerResumeContext / spawnContext.resume — per-node session re-attachment WITHIN one process) and the pre-existing durable Scope.resume (ResumedWork / scope.resume — cross-process restart from a journal). Both are surfaced on adjacent surfaces (a single spawn context could in principle carry both spawnContext.resume AND come from a scope.resume path). They are documented as distinct and operate at different la


What this audit checks

It judges the change on its merits — not whether it was tasked out in an issue. Unticketed, fast-moving work is fine; the question is whether the change is good and whether a better or existing approach should be used instead.

PassWhat it asks
HeuristicVague title? Whitespace-only or cruft-bearing diff? (content signals only)
DuplicationDo added function/class names already exist elsewhere in the repo?
Value AuditWhat does it do? What goal does it achieve? Is it good? Better architecture or already-exists?
Usefulness AuditDoes it integrate and fit? Will it hold up in real use and actually get used?

Findings are concerns, not blocks — the human reviewer decides what to do with them.

value-audit · 20260803T194758Z

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@drewstone@tangletools
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(supervise): first-class continuity on graph edges — fresh | resume | steer, all ledgered - #725

Merged
drewstone merged 2 commits into
mainfrom
feat/graph-continuity
Aug 3, 2026
Merged

feat(supervise): first-class continuity on graph edges — fresh | resume | steer, all ledgered#725
drewstone merged 2 commits into
mainfrom
feat/graph-continuity

Conversation

@drewstone

Copy link
Copy Markdown
Contributor

Owner directive from #694: fresh respawns, session RESUMES, and live steers must all be expressible as plain data. This ships the axis.

  • Delegates edges declare continuity: 'fresh' | 'resume' (per-spawn override on the tool); every ledger row and journal edge event stamps the effective mode — fresh/resume on spawns, steer on steer legs and analyzes deliveries. Zero ambiguity about how any hop continued.
  • Resume: a new live worker on the same node whose executor receives resume: { ofWorker, sequence } and owns session re-attachment; spend continuous in the one conserved pool; caps count resumes like spawns. Refused loud: no prior settled worker, prior still live (that's steer — the error says so), riding a semantic key, unresumable seams (workerFromBackend fails loud rather than ledger a resume that never happened — post-audit hardening). Resume after a FAILED prior is deliberately allowed (the seam decides salvageability) — tested and stated.
  • examples/graphs/shot-loop-resumed.ts: the VB resumed-shot loop as pure data — shots stamp fresh/resume/resume, lineage chain proven at the seam.
  • Back-compat: continuity-free graphs byte-identical (audit probe chore: agent-runtime 0.5.5 — unify agent-eval / agent-knowledge dep tree #6: all 10 new tests FAIL against old src — they test the feature, not tautologies).

Adversarially audited SHIP: lineage plumbing, dedup-distinctness, stamp integrity, refusals, and spend arithmetic all micro-revert-falsified; racing resumes proven safe (zero async gap).

0.127.0 + CHANGELOG. Suite 2364; typecheck/lint/build/docs/version-gate green.

…sals — fresh | resume | steer as ledgered data
A delegates edge accepts continuity: 'fresh' | 'resume' (edge default;
spawn_agent takes a per-call override). A resume traversal targets a node
whose prior worker has SETTLED: the kernel spawns a NEW live worker bound
to the same node whose spawn context carries resume: { ofWorker, sequence }
(WorkerResumeContext) — the executor seam owns the session re-attachment;
the kernel keeps identity, ordering, ledger truth, and spend continuity in
the one conserved pool. Traversal caps count resumes exactly like fresh
spawns.
Fail-loud refusals at the tool: resume-no-prior (explicit resume with no
settled prior; the DECLARED edge default instead degrades to fresh on the
node's first spawn), resume-while-live (steer is the live-worker channel,
the error says so), resume-with-key (keys are run-once, resume runs again).
Resume lineage is process-local — the same boundary as the analyst-run
marker — and stated where it lives.
EdgeTraversal and the journal 'edge' event gain
continuity: 'fresh' | 'resume' | 'steer' — spawns stamp their effective
mode, every mid-run delivery into a live recipient (driver steer legs,
every analyzes delivery) stamps 'steer'. validateGraph refuses nonsense
values and analyzes edges carrying the field.
Threaded as continuityByProfile through SuperviseOptions →
SupervisorAgentDeps → DriverAgentOptions / serveCoordinationMcp →
CoordinationToolsOptions; runGraph derives it from delegates edges. Kernel
exports ContinuityMode, WorkerResumeContext, TraversalContinuity.
New example examples/graphs/shot-loop-resumed.ts (the VB shot shape as
data: shot 1 fresh, shots 2-3 resume the prior settled session), proven
offline in tests/examples/graph-topologies.test.ts; kernel continuity
suite in tests/kernel/graph.test.ts. Edges without continuity behave
byte-identically to before. Bump 0.127.0.
… pin resume-after-failed-prior policy
A backend seam with no session re-attachment accepting a resume spawn
would ledger continuity:'resume' over a brand-new session — a stamp
asserting something that never happened. Refuse loud; session-resuming
makeWorkerAgent seams are the resume consumers. Failed-prior resume is
deliberately allowed (the seam decides salvageability) — now tested and
stated.

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Auto-approved drewstone PR — d2986340

This PR was opened by the trusted drewstone account.
The full PR reviewer audit still runs separately and will publish findings if it detects issues.

tangletools · auto-approval · reason: drewstone_author · 2026-08-03T19:43:21Z

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Value Audit — sound

Verdictsound
Concerns2 (1 low, 1 weak-concern)
Heuristic0.0s
Duplication0.0s
Interrogation140.3s (2 bridge agents)
Total140.3s

💰 Value — sound

Adds node-level session continuity (fresh|resume|steer) as plain data on graph edges — a clean new axis that the three existing primitives (process-resume, key, steer) genuinely don't cover, built on the existing makeWorkerAgent seam and edge ledger.

  • What it does: A delegates edge (or per-call spawn_agent arg) may declare continuity: 'resume'. On any spawn after the node's first, the kernel resolves the node's most recent SETTLED worker (by profile.name = node id), mints a NEW live worker, and hands its executor seam WorkerSpawnContext.resume = { ofWorker, sequence } — the lineage the seam uses to re-attach the backend session. The kernel keeps identity, or
  • Goals it achieves: Make 'fresh respawn vs session resume vs live steer' expressible as ONE FIELD on a graph edge, so a resumed shot-loop (shot 1 settles failed → shot 2 continues shot 1's session context, spend continuous in one pool) is data, not a hand-rolled driver loop. Secondary: eliminate ledger ambiguity — every hop now states how it continued, so 'did traversal 2 continue traversal 1's session or start fresh
  • Assessment: Sound and in-grain. The change fills a real gap: I checked the three adjacent primitives and none covers 'spawn a NEW worker that continues a SETTLED prior worker's session'. Scope.resume/ResumedWork (types.ts:711) is PROCESS-crash recovery — it re-adopts settled work without spawning; key/SpawnOpts.key (types.ts:503) is idempotency — a completed key returns its cached result WITHOUT re-running; s
  • Better / existing approach: none — this is the right approach. Searched for an existing mechanism to extend: Scope.resume (types.ts:711) is process-level crash recovery, a different concept; SpawnOpts.key (types.ts:503) is run-once idempotency, structurally incompatible (extending key to mean 'run again with lineage' would break its exactly-once guarantee); steer (types.ts:644 Scope.send) targets LIVE workers, not settled on
  • Model: opencode/zai-coding-plan/glm-5.2
  • Bridge attempts: 2
  • Bridge warning: opencode/kimi-for-coding/k2p7: opencode: opencode error

🎯 Usefulness — sound

A coherent, fully-threaded continuity axis (fresh/resume/steer) that extends the edge-ledger and fail-closed spawn patterns in the codebase's grain, with comprehensive refusals and correct back-compat — no equivalent reinvented, no materially better approach.

  • Integration: Fully reachable. continuityByProfile is plumbed through runGraph → supervise → supervisorAgent (both arms) → driverAgent → serveCoordinationMcp → createCoordinationTools (verified at graph.ts:718-721,933; supervise.ts:1587,1668; supervisor-agent.ts:509,592; coordination-driver.ts:367; coordination-mcp.ts:156). The per-call continuity arg is a live MCP tool parameter (coordination.ts:1796-1810),
  • Fit with existing patterns: Excellent. Extends the established edge-ledger observability contract (continuity is a new column on EdgeTraversal/graph.ts:142-167 and the journal edge event/types.ts:939-944) and the established fail-closed spawn-resolution discipline (resolves before assignment/budget, coordination.ts:1862-1872). Does NOT compete with the key idempotency mechanism (explicitly refused resume-with-key) or steer
  • Real-world viability: Holds up. Refusals cover every realistic misuse and are tested (graph.test.ts: resume-no-prior, resume-while-live, resume-with-key, resume-after-failed-prior, nonsense value on edge, continuity-on-analyzes-edge). Racing resumes are safe: resolveContinuity is synchronous, reads the live view + ledger, and hands off to scope.spawn with no await gap (coordination.ts:1114-1167, 1884-1888). latestSettl
  • Model: opencode/zai-coding-plan/glm-5.2
  • Bridge attempts: 1

🔎 Heuristic Signals

🟡 Cruft: console debug addedexamples/graphs/shared.ts

  • console.log(

🎯 Usefulness Audit

🟡 'resume' is overloaded between continuity-resume and durable Scope.resume[ergonomics] ``

The word 'resume' now names two distinct concepts at two layers: continuity 'resume' (WorkerResumeContext / spawnContext.resume — per-node session re-attachment WITHIN one process) and the pre-existing durable Scope.resume (ResumedWork / scope.resume — cross-process restart from a journal). Both are surfaced on adjacent surfaces (a single spawn context could in principle carry both spawnContext.resume AND come from a scope.resume path). They are documented as distinct and operate at different la


What this audit checks

It judges the change on its merits — not whether it was tasked out in an issue. Unticketed, fast-moving work is fine; the question is whether the change is good and whether a better or existing approach should be used instead.

PassWhat it asks
HeuristicVague title? Whitespace-only or cruft-bearing diff? (content signals only)
DuplicationDo added function/class names already exist elsewhere in the repo?
Value AuditWhat does it do? What goal does it achieve? Is it good? Better architecture or already-exists?
Usefulness AuditDoes it integrate and fit? Will it hold up in real use and actually get used?

Findings are concerns, not blocks — the human reviewer decides what to do with them.

value-audit · 20260803T194758Z

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@drewstone@tangletools