Workshop: Tool-loop Control
Rewrite workspace for the note currently captured in kb/notes/tool-loop-index.md.
The main framing change is deliberate: start from the normal application architecture where a framework-owned tool loop is a genuinely useful convenience layer, then argue that strong frameworks should keep that loop optional so application code can reclaim control when orchestration becomes part of the product logic.
Source notes
kb/notes/tool-loop-index.md— current note whose opening jumps too quickly to expressivity losskb/notes/bounded-context-orchestration-model.md— the scheduler model underneath the argumentkb/notes/llm-mediated-schedulers-are-a-degraded-variant-of-the-clean-model.md— why hidden progression tends to move bookkeeping back into the conversational mediumkb/notes/session-history-should-not-be-the-default-next-context.md— why framework-owned progression also tends to make history inheritance the defaultkb/notes/apparent-success-is-an-unreliable-health-signal-in-framework-owned.md— one practical consequence once the framework owns progression and fallback policy
Promoted notes
kb/notes/subtasks-that-need-different-tools-force-loop-exposure-in-agent.md— capability-surface changes and recursive decompositionkb/notes/semantic-sub-goals-that-exceed-one-context-window-become-scheduling.md— context-bound semantic subgoals that require partitioning and staged aggregationkb/notes/codified-scheduling-patterns-can-turn-tools-into-hidden-schedulers.md— codified next-step policy as hidden schedulingkb/notes/stateful-tools-recover-control-by-becoming-hidden-schedulers.md— supporting concession note showing what the strongest stateful-tool recovery actually buys
Host-language scheduler trio (promoted 2026-05-29)
kb/notes/llm-frameworks-should-keep-the-tool-loop-optional.md— the design case: keep the framework-owned tool loop (a frozenselect) optional; the top-level argumenttool-loop-indexnow leads withkb/notes/the-practical-scheduler-is-the-host-language.md— the mechanism: demote the loop to a returning, per-call-parameterizedagent(); host-language control flow playsselect/K, reified only on lifetime/capacity limits; one primitive plus one hookkb/notes/orchestration-strategies-and-run-state-have-opposite-persistence.md— the follow-on:Kstays ephemeral, recurringselect-strategies are the promotion target; a test-gated orchestrator cache makes the host-language scheduler self-populating
On promotion the published family was reframed from "expose the loop" to "keep the tool loop optional": the tool-loop-index Resolution now leads with this trio, and stateful-tools, agent-is-a-tool-loop, and subtasks-... were updated to the new vocabulary ("expose the loop" kept as the earlier name).
Retired scaffolding (distilled, deleted 2026-05-29)
Two early drafts were spent — every durable claim now lives in a published note or in the framing draft above, with no library links depending on them, so they were deleted (recoverable via git):
anatomy-of-an-llm-application.md— tool-loop-first decomposition. Distilled into:llm-frameworks-should-keep-the-tool-loop-optional.md(convenience case + programmer's dilemma), the promotedsubtasks-that-need-different-tools...(capability-surface boundary, now more complete), and the promotedcodified-scheduling-patterns...(temporal codification).a-framework-owned-tool-loop-can-simulate-explicit-orchestration-by.md— constructive counterexample (singleton-runtime recovery). Distilled into the promotedstateful-tools-recover-control-by-becoming-hidden-schedulers.md(the concession claim) and the promotedsubtasks-that-need-different-tools...(where the construction strains). The remainingControlRuntimecode was illustrative scratch, not preserved.
New inputs (2026-05-29 session)
Folded into llm-frameworks-should-keep-the-tool-loop-optional.md ahead of promotion:
- Frozen-
selectframing — the framework-owned tool loop is the bounded-contextselecthardcoded to "append result, re-ask with same tools." "Keep the loop optional" = let the application ownselect. This is the one substantive new idea (vs. grounding), grounded in the bounded-context model note. - Lifecycle hooks convergence — the agent-harness survey independently makes lifecycle hooks first-class, corroborating the proposed middle layer.
- iii production evidence — iii ships the loop as one swappable layer on a bus; "slider not a fork" reframes the programmer's dilemma. (Cite the replaceability/layering half only — independent versioning is a deployment property, not a tool-loop property.)
Decision (2026-05-29): develop this workshop independently of, and ahead of, the harness-fundamentals brainstorm. The drafts no longer link out to harness-boundary.md; the frozen-select argument stands on its own, grounded in the bounded-context model note and the agent-harness survey / iii sources. The wider "what is the harness" candidate set — including Candidate D (harness = select), the general case of this workshop's frozen-select argument — stays in kb/work/harness-fundamentals/ and is not a dependency here. Any argument once carried by the cross-workshop link is inlined in the drafts and cited to its underlying source.
Resolved decisions
- Title family — resolved: the family uses "keep the tool loop optional"; "expose the loop" is retained as the earlier name, noted in
tool-loop-indexandstateful-tools. The trio is promoted; the workshop now holds only this README andpromotion-plan.md.