diff options
| author | t <t@tjp.lol> | 2026-09-03 07:41:51 -0600 |
|---|---|---|
| committer | t <t@tjp.lol> | 2026-09-03 07:57:03 -0600 |
| commit | 2f429aae8468f249dd40baaf815975d5e02b1030 (patch) | |
| tree | be097a440d02d515fd0059cc127a2a5a660212fb /init.lua | |
| parent | b206f895d9d3e82fcd2dc028d993b66ab0734011 (diff) | |
The expanded progress board capped the executed Lua at 128 lines (and 32KB),
so long workflow sources ended in an ellipsis even after Ctrl-O. Expanded
now renders the whole source; collapsed still shows the first four lines.
Add a "Program, don't transcribe" section to the system guidance so the
primary writes shorter sources: one [[template]] with {name} placeholders
filled by gsub with a table, loops over data instead of per-child copies,
shared system prompts in `agents`, and file references instead of quoted
contents. A single templating mechanism is named on purpose to remove
choice.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ETqhv5FVD8Z14BEBsXeHHC
Diffstat (limited to 'init.lua')
| -rw-r--r-- | init.lua | 19 |
1 files changed, 19 insertions, 0 deletions
@@ -156,6 +156,25 @@ return subagents.workflow(function(ctx) end) ``` +**Program, don't transcribe.** `source` is a program, not a transcript: write each piece of text once and let code produce the variations. Templates are the one mechanism: a `[[long string]]` with `{name}` placeholders, filled by `template:gsub("{([%w_]+)}", vars)` where `vars` is a table. Do not use `string.format`, `..` chains, or any other placeholder style. Near-identical prompts come from a loop over a data table, never copy-pasted per child; a shared system prompt goes in `agents` once, not in every `ctx:agent`. Children share your workspace, so a prompt can name a file to read instead of quoting its contents. If `source` is mostly quoted text, that is the signal to factor it. + +```lua +local brief = [[ +Audit the {area} module under {root} for unchecked errors. Read-only. +Report as a bullet list; end with RESULT={"issues":<count>} +]] +return subagents.workflow(function(ctx) + local workers = {} + for _, area in ipairs({"auth", "billing", "search"}) do + workers[#workers + 1] = ctx:agent{name=area, agent="auditor", + prompt=brief:gsub("{([%w_]+)}", {area=area, root="src/"})} + end + local out = {} + for _, r in ipairs(ctx:await(workers, "all")) do out[#out + 1] = r.output end + return table.concat(out, "\n\n") +end) +``` + **Deterministic code drives; agents advise.** A workflow is code you control wrapped around judgment you cannot. Put every decision that can be nailed down into Lua — loops, counts, ordering, retries, pass/fail gates — and spend agents only on discovery and judgment. When Lua needs a fact an agent found (a list to fan out over, a verdict, a chosen option), tell that agent to end its report with one machine-parseable line, parse it, and let the parsed value shape the rest of the graph. The sandbox has `json.encode(value)` and `json.decode(text)`, which returns the value or `nil, message`. ```lua |
