<feed xmlns='http://www.w3.org/2005/Atom'>
<title>panto-subagents.git/panto-subagents-0.1.0-1.rockspec, branch v0.1.0</title>
<subtitle>Subagents and dynamic workflows extension for panto
</subtitle>
<id>https://code.tjp.lol/panto-subagents.git/atom?h=v0.1.0</id>
<link rel='self' href='https://code.tjp.lol/panto-subagents.git/atom?h=v0.1.0'/>
<link rel='alternate' type='text/html' href='https://code.tjp.lol/panto-subagents.git/'/>
<updated>2026-08-20T19:39:46Z</updated>
<entry>
<title>Replace lyaml with api7-lua-tinyyaml and prepare the 0.1.0 release</title>
<updated>2026-08-20T19:39:46Z</updated>
<author>
<name>t</name>
<email>t@tjp.lol</email>
</author>
<published>2026-08-20T18:49:36Z</published>
<link rel='alternate' type='text/html' href='https://code.tjp.lol/panto-subagents.git/commit/?id=a08d854d52cf5492a7763bccc1ce475dcc057cba'/>
<id>urn:sha1:a08d854d52cf5492a7763bccc1ce475dcc057cba</id>
<content type='text'>
lyaml binds the system libyaml, which luarocks does not vendor, so
installing the rock failed wherever that library was absent, taking the
whole extension down on a stock macOS machine. api7-lua-tinyyaml is pure
Lua and matches lyaml on every quoting, escaping and block-scalar form
profiles use.

What the subset costs: anchors and aliases are not resolved, and plain
multi-line scalars raise. The raise surfaces through the existing parse
warning, but an unresolved alias came back as the literal "*alias"
string and would have become a profile name, so frontmatter.parse now
detects those keys, drops them, and warns.

Point source.url at code.tjp.lol with a v0.1.0 tag, replacing a GitHub
URL that never existed. Add a LICENSE file and mise release tasks, and
fix the README dependency-install command, which called a luarocks.cmd
function that does not exist.
</content>
</entry>
<entry>
<title>Add background Lua workflows, inline child prompts, and layered config</title>
<updated>2026-08-20T01:03:52Z</updated>
<author>
<name>t</name>
<email>t@tjp.lol</email>
</author>
<published>2026-08-20T01:02:30Z</published>
<link rel='alternate' type='text/html' href='https://code.tjp.lol/panto-subagents.git/commit/?id=d1306506aa7f504b0e91c9c6ed7314afbf99978e'/>
<id>urn:sha1:d1306506aa7f504b0e91c9c6ed7314afbf99978e</id>
<content type='text'>
subagents.lua now starts a workflow on its own coroutine and returns a
session-scoped id immediately, so fan-out continues while the primary keeps
working; completion wakes the primary, and later calls read immutable records
from subagents.workflows. Every ctx:agent takes a workflow-unique name so those
records are addressable. A session_start guidance message tells the primary when
to reach for run vs lua.

Children no longer inherit the primary's system context: a child starts from the
fixed child-role instruction plus its profile, and subagents.run/ctx:agent
accept an inline system_prompt instead of a profile. The now-redundant `agent`
form of subagents.models is gone.

Concurrency defaults to five and is configurable through [subagents]
max_concurrent in any layered config.toml; turn boundaries reap only settled
jobs so background workflows survive, while interrupt and session end cancel.

Config roots come from panto.ext.dirs.layers rather than a hand-rolled XDG
lookup, which picks up the base and git-ignored local layers for both agents/
and workflows/.

TOML workflows tighten up: the subagents.workflow tool takes a discovered name
only (inline `steps` duplicated subagents.lua at less power), an optional
top-level `output` array chooses the reported steps and their order instead of
the terminal set, a step with no workflow input gets no empty input heading, and
a workflow naming an undiscovered agent is rejected at discovery rather than
part-way through a run.
</content>
</entry>
<entry>
<title>Validation-pass fixes; DESIGN.md describes the shipped seam</title>
<updated>2026-08-18T06:40:46Z</updated>
<author>
<name>t</name>
<email>t@tjp.lol</email>
</author>
<published>2026-08-18T05:35:36Z</published>
<link rel='alternate' type='text/html' href='https://code.tjp.lol/panto-subagents.git/commit/?id=372ef8ff40991644ec2654c61328f31779f4ad21'/>
<id>urn:sha1:372ef8ff40991644ec2654c61328f31779f4ad21</id>
<content type='text'>
jobs: a child whose wake pipe cannot be armed is refused up front instead of
started into a state nothing can wake (the luv-less drain loop survives only
for hosts without a loop); a closing child keeps its concurrency slot and
its id's exclusivity until the pump actually exits, so teardown can no
longer over-admit new children or let two turns share one session file.
Resume-metadata reads honor the plain-error contract on a malformed store.

workflow: the built-in schema subset validator is the only validator — the
jsonschema probe made behavior depend on an undeclared rock (see rockspec:
that dependency is deliberately rejected); dead exports and the unreachable
half of the structured-output guard are gone, keeping the empty-arguments
provider case.

DESIGN.md's seam sections now describe the shipped division: binding-level
async jobs and tool control, host-level resolve_model/ExtHost/turn events/
component handles, rock-level policy; protocol bodies run to completion on
the loop thread and cannot yield, cancellation is scoped to the stream that
opened it, and a child's compaction leaves protocol sessions alone.
</content>
</entry>
<entry>
<title>subagents extension on the generic host surfaces</title>
<updated>2026-08-18T02:31:29Z</updated>
<author>
<name>t</name>
<email>t@tjp.lol</email>
</author>
<published>2026-08-17T02:42:43Z</published>
<link rel='alternate' type='text/html' href='https://code.tjp.lol/panto-subagents.git/commit/?id=4f0a91ef55fe96835172bdad34feec1e2a0a0977'/>
<id>urn:sha1:4f0a91ef55fe96835172bdad34feec1e2a0a0977</id>
<content type='text'>
The rock now owns all subagent policy on top of libpanto-lua's generic APIs:
children are ordinary panto.agent instances over rock-constructed stores,
started with agent:run_async and awaited by arming uv.new_poll on each job's
wake_fd from the tool handler's coroutine.

subagents/jobs.lua carries the session policy the host used to own: the
concurrency gate (4 running, FIFO queue, cancel-while-queued never starts),
the await contract (results in input order; "first" returns settled plus
remaining by identity), and settle-time shaping. subagents/spawn.lua seeds
new children (primary system context, child role, profile body with manifest
metadata), resolves model/reasoning through panto.ext.resolve_model, filters
subagents.* out of the inherited tool set via agent:set_tools, and reads
resume defaults back from stored message metadata. One-shot structured
workers are a null_store agent with a declaration-only output tool,
tool_choice forced, dispatch_tools=false. subagents/progress.lua renders
per-tool-entry cards through the component handle's invalidate seam;
turn_interrupt cancels live children, turn_end closes them.

Spec suite rewritten against fakes of the new surfaces (98 cases), including
gate/queue/cancel bounds, resume-default extraction, one-shot capture via
unresolved tool calls, tool filtering, and manifest seeding.
</content>
</entry>
</feed>
