evolve) — bot run bilanStrategic / architectural evolution partner. Surveys a mature repo, accumulates a long-horizon vision in per-bot memory across sessions, elicits operator context, and proposes evolutions as dispatch-ready backlog tickets + findings for Nexie. See bots/evolve/README.md. Append newest-first.
aggregate_review (wait_all) failed: 2 branches context_length_exceeded on the gpt-5.5 reviewer.iterion run (CLI). survey + investigate on claw gpt-5.5 forfait; mid-turn ask_user ×2 answered via resume (objective + horizon → campaign stability-first vectors incl. the failover feature). NOT the z.ai cap (the claude branch ran fine on opus) — the openai/gpt-5.5 ChatGPT-forfait context window overflowed on the large review input.context_length_exceeded here; the review input (synthesis + all findings) exceeds the forfait window. Same root cause as Seki’s triage stall (large input to gpt-5.5 forfait). High-value engine/claw fix: route large-context reviewer/triage nodes to a 200K-context model (glm-5.2/opus), or make the compaction actually fire before the wire call.aggregate_review should cap/shard reviewer input or run the reviewer on a big-context model. Re-run candidate post z.ai-reset with the claude reviewer on glm-5.2 (200K).investigate reverted from the ask_brief human-node
workaround back to the original design: mid-turn ask_user on the
agent (interaction: human). Live on claw + openai/gpt-5.5 forfait:
survey → investigate asks the operator via ask_user (“what objective
ask_brief node + its schemas were
removed; the graph is back to 17 nodes.vision_interrogation.md
rather than the prompt’s CONTEXT_BRIEF.md — it persists correctly, just
off the named file; tighten the prompt if strict filename adherence
matters (non-blocking — the auto-index surfaces it either way).worktree-evolve-bot (base
d1fe421c).claw + openai/gpt-5.5 (ChatGPT
forfait); the one cross-family “claude” reviewer claude_code +
claude-opus-4-8 (Claude Code OAuth forfait). Run from the
.claude/worktrees/evolve-bot worktree against the iterion repo itself.
--var scope_notes=.... No --store-dir (workspace default). No
worktree:/sandbox: (read-only bot).human_review_vision pause across two
sessions. Run 2 (019ec1d5): survey → ask_brief (paused, answered via
resume) → investigate (wrote CONTEXT_BRIEF.md) → synthesize (wrote
VISION.md) → failed at review_fanout (workspace-safety: reviewers
missing readonly). Run 3/4 (019ec1dc, after the readonly fix): full
pipeline through both reviewers → aggregate (wait_all) → carry →
human_review pause. review_claude on claude_code: 48s, 7979 tok, $0.34.
Per-node gpt-5.5 nodes ~$0.05–0.09 each.propose_evolutions
wrote 9 deep finding artifacts to findings/ (decompose-ClawExecutor,
capability-context-policy, bot-contract-v1, run-lifecycle-transition-policy,
observability-event-taxonomy, persisted-format-stable-subset,
dogfood-data-contracts, dispatcher-claims-leases, cloud-local-alignment) —
each with proper frontmatter (kind:evolution / source_bot:evolve /
axis+horizon+severity tags) and a grounded Why/Plan/Acceptance body.
emit_backlog then created 9 backlog kanban tickets on the main-repo
board, bot: feature-dev set via set_bot on 8 (the 9th left bot-less,
no confident match), labelled <axis> + horizon:<now|next|later>. So a
human can drag any ticket to ready to launch it, or Nexie can ingest them
— exactly the requested handoff. ~$0.09 propose + $0.09 emit.visibility: bot writes landed at
~/.iterion/projects/-home-jo-lab-ai-iterion/bots/evolve/memory/vision/
(CONTEXT_BRIEF.md + VISION.md), and the legacy project path
…/memory/vision/ was ABSENT — proving the bot-visibility axis, not the
legacy project-shared path.-home-jo-lab-ai-iterion), not
the ephemeral worktree path — i.e. memBase = task.RepoRoot via
findGitRoot. So a future run from the main checkout sees the same
accumulated vision. (This is the G2 worktree-stability concern from the
plan, validated live.)ask_user failed on schema+tools
interaction nodes. The bot’s first design used interaction: human
on the investigate agent to ask mid-turn via the ask_user MCP tool.
On claw+openai it failed: instead of pausing, the run hit openai 400:
No tool output found / tool_call_ids did not have response messages.
ClawExecutor (executor.go) ran schema validation
BEFORE the _needs_interaction short-circuit. The pause Result
({_needs_interaction:true, …}) is a control signal, not schema data,
so ValidateOutput failed → triggered the schema-validation backend
RETRY → the retry replayed the unanswered tool_call into a fresh
generation → orphaned function_call → 400. (My earlier “claw-code-go
intercepts ask_user” hypothesis was wrong — instrumented logging
showed errors.As matched and the pause Result was returned correctly;
a higher layer re-invoked.)pkg/backend/model/executor.go (move the interaction
short-circuit ahead of schema validation) + regression test
TestDelegation_InteractionSignalSkipsSchemaValidation. Verified live:
a schema+tools+interaction node now pauses on ask_user and resumes to a
valid structured output. Commit e93ccc1b (on main).ask_brief graph-level human node shipped as a
workaround and still works; it can now optionally revert to the
original mid-turn ask_user design (set interaction: human on
investigate + restore the ask_user prompt).readonly: true. The two parallel
judge reviewers had mutation-capable tools (bash) without readonly,
so the workspace-safety guard rejected 2 mutating parallel branches.
Added readonly: true to both (they only inspect). Lesson for any
fan-out of tool-equipped judges: mark them readonly.** token — so they reviewed nothing (and
correctly withheld approval). Root cause: in a **prompt body**,
(a whole node output) does NOT resolve — only
does — whereas edge `with` mappings DO
resolve whole-output refs (that's why human_review got the full vision via
`carry_vision.vision`). Fixed: the review prompts now reference the
edge-mapped. *Underlying engine asymmetry worth noting:
whole-output `` resolves in an edge with but silently
no-ops in a prompt body (and structured outputs render as Go map[...],
not JSON, in prompts/forms).propose_evolutions wrote its 9 findings to
projects/<WORKTREE-key>/memory/findings/, while the board tickets and
Nexie’s inbox live at the stable <REPO-ROOT-key>. The per-bot vision
scope (visibility: bot) correctly re-roots to RepoRoot; the findings
scope used the bare legacy form (→ WorkDir), which diverges under a git
worktree. In normal (non-worktree) use they coincide, but fixed by adding
visibility: "project" to the findings block (re-roots to RepoRoot,
matching the board + Nexie). Validated by analogy to the vision scope,
whose RepoRoot keying is proven live.iterion validate is more lenient than iterion run. A literal
`` mention in a prompt body (documentation text) passed
validate but failed run with C004 unknown reference namespace.
Validate should catch C004 too. (Fixed in the bot by de-bracing.)Dogfood side-effect: this validation created 9 real
backlogtickets on the local main-repo board (gitignored.iterion/dispatcher/). They are genuine, useful iterion-evolution proposals, but their finding-file links point at the (ephemeral) worktree key — dispatch or delete them, then re-run Evoly from the main checkout for cleanly-keyed output.
human nodes, not mid-turn ask_user, on any claw+openai bot./board
that a drag-to-ready actually dispatches feature-dev from a ticket whose
body is the spec (the dispatch_vars title+body path), and that the
visibility:project findings now co-locate with the board on a real run., never
(whole-output) in prompt bodies. Consider an engine fix so whole-output
refs resolve (and render as JSON) in prompts, matching edge with.source:evolve to emit’s label set explicitly (this run labelled by
axis + horizon but the source:evolve label didn’t appear — verify the
set_labels call includes it).claude_code, or claw
if an API key is ever acceptable) would only be worth it for the synthesis
node if the operator wants more depth.