Evoly (evolve) — bot run bilan
Strategic / 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.
2026-06-22 — PARKED: gpt-5.5 forfait context-overflow in review fan-out (run 019ef05e-90ff)
- Status: partial / parked — survey + investigate (operator elicitation) completed;
aggregate_review(wait_all) failed: 2 branchescontext_length_exceededon the gpt-5.5 reviewer. - Versions: bot evolve · iterion v0.16.0 (110ea1c33)
- Method:
iterion run(CLI). survey + investigate onclawgpt-5.5 forfait; mid-turnask_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. - Findings: gpt-5.5 forfait context-overflow in review fan-outs — the reactive compact-and-retry (generation.go, c5f57c14) did not prevent
context_length_exceededhere; 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. - Lessons: Evoly's
aggregate_reviewshould 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).
2026-06-13 — mid-turn ask_user restored + validated (run 019ec2f6)
- Status: validated. After the engine fix (commit e93ccc1b — see finding #1),
investigatereverted from theask_briefhuman-node workaround back to the original design: mid-turnask_useron the agent (interaction: human). Live on claw + openai/gpt-5.5 forfait: survey → investigate asks the operator via ask_user ("what objective- horizon?") → pauses cleanly → resume injects the answer → investigate persists to memory + asks a follow-up ask_user ("which backend combos must be conformance-tested?") → pauses again. Genuinely iterative mid-investigation elicitation, multiple ask_user round-trips on a schema+tools node, zero 400s. The
ask_briefnode + its schemas were removed; the graph is back to 17 nodes.
- horizon?") → pauses cleanly → resume injects the answer → investigate persists to memory + asks a follow-up ask_user ("which backend combos must be conformance-tested?") → pauses again. Genuinely iterative mid-investigation elicitation, multiple ask_user round-trips on a schema+tools node, zero 400s. The
- Misc: the agent persisted the first answer to
vision_interrogation.mdrather than the prompt'sCONTEXT_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).
2026-06-13 — first dogfood: per-bot memory + full pipeline (runs 019ec1d5, 019ec1dc)
- Status: validated — the full pipeline ran live end-to-end: survey → ask_brief → investigate → synthesize → cross-family review → human_review (approved) → propose_evolutions (9 findings) → emit_backlog (9 dispatch-ready backlog tickets) → home base.
- Versions: bot 0.1.0 · iterion worktree
worktree-evolve-bot(based1fe421c). - Method: all memory-bearing nodes
claw+openai/gpt-5.5(ChatGPT forfait); the one cross-family "claude" reviewerclaude_code+claude-opus-4-8(Claude Code OAuth forfait). Run from the.claude/worktrees/evolve-botworktree against the iterion repo itself.--var scope_notes=.... No--store-dir(workspace default). No worktree:/sandbox: (read-only bot). - Result: converged to the
human_review_visionpause 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 missingreadonly). 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 + emit (resumed 019ec1dc with approval):
propose_evolutionswrote 9 deep finding artifacts tofindings/(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_backlogthen created 9backlogkanban tickets on the main-repo board,bot: feature-devset viaset_boton 8 (the 9th left bot-less, no confident match), labelled<axis>+horizon:<now|next|later>. So a human can drag any ticket toreadyto launch it, or Nexie can ingest them — exactly the requested handoff. ~$0.09 propose + $0.09 emit. - Value: genuinely useful strategic output — a 10-axis vision "Iterion as a Trustworthy Local Team Engine" (backend-pipeline decomposition, one RunLifecycle contract, an auditable CapabilityContext, dispatcher invariants, observability taxonomy, .bot/persisted-format v1 subsets…), each axis with direction / key_moves / target_state, plus 11 guardrails and a rationale. Grounded in real files (ClawExecutor overload, Engine option sprawl, checkpoint-vs-event authority). This is exactly the "architect a vision" deliverable.
Headline feature PROVEN live: per-bot cross-session memory
visibility: botwrites 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.- Stable across worktrees: the run launched from the worktree, but the memory keyed off the main repo root (
-home-jo-lab-ai-iterion), not the ephemeral worktree path — i.e.memBase = task.RepoRootviafindGitRoot. 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.) - Cross-session continuity proven: run 3's survey autoloaded run 2's VISION.md/CONTEXT_BRIEF.md and produced materially deeper axes — the accumulated context made the second pass smarter, exactly the intent.
Findings / engine hardening
- (ENGINE BUG, HIGH — FIXED) mid-turn
ask_userfailed on schema+tools interaction nodes. The bot's first design usedinteraction: humanon the investigate agent to ask mid-turn via theask_userMCP tool. On claw+openai it failed: instead of pausing, the run hitopenai 400: No tool output found/tool_call_ids did not have response messages.- Root cause (iterion, NOT claw-code-go). Reproduced minimally: ask_user pauses fine on a node WITHOUT an output schema, but FAILS on one WITH a schema.
ClawExecutor(executor.go) ran schema validation BEFORE the_needs_interactionshort-circuit. The pause Result ({_needs_interaction:true, …}) is a control signal, not schema data, soValidateOutputfailed → 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 showederrors.Asmatched and the pause Result was returned correctly; a higher layer re-invoked.) - Fixed in
pkg/backend/model/executor.go(move the interaction short-circuit ahead of schema validation) + regression testTestDelegation_InteractionSignalSkipsSchemaValidation. Verified live: a schema+tools+interaction node now pauses on ask_user and resumes to a valid structured output. Commit e93ccc1b (on main). - Evoly impact: the
ask_briefgraph-level human node shipped as a workaround and still works; it can now optionally revert to the original mid-turnask_userdesign (setinteraction: humanoninvestigate+ restore the ask_user prompt).
- Root cause (iterion, NOT claw-code-go). Reproduced minimally: ask_user pauses fine on a node WITHOUT an output schema, but FAILS on one WITH a schema.
- (BOT BUG, fixed) reviewers needed
readonly: true. The two parallel judge reviewers had mutation-capable tools (bash) withoutreadonly, so the workspace-safety guard rejected 2 mutating parallel branches. Addedreadonly: trueto both (they only inspect). Lesson for any fan-out of tool-equipped judges: mark themreadonly. - (BOT BUG, fixed) review prompts referenced a whole-node output. The reviewers' verdicts revealed they received the literal unsubstituted
{{outputs.synthesize_vision}}token — so they reviewed nothing (and correctly withheld approval). Root cause: in a prompt body,{{outputs.<node>}}(a whole node output) does NOT resolve — only{{outputs.<node>.<field>}}does — whereas edgewithmappings DO resolve whole-output refs (that's why human_review got the full vision viacarry_vision.vision). Fixed: the review prompts now reference the edge-mapped{{input.vision}}. Underlying engine asymmetry worth noting: whole-output{{outputs.<node>}}resolves in an edgewithbut silently no-ops in a prompt body (and structured outputs render as Gomap[...], not JSON, in prompts/forms). - (BOT BUG, fixed) findings scope keyed off WorkDir, not RepoRoot.
propose_evolutionswrote its 9 findings toprojects/<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 toRepoRoot; 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 addingvisibility: "project"to the findings block (re-roots toRepoRoot, matching the board + Nexie). Validated by analogy to the vision scope, whoseRepoRootkeying is proven live. - (NIT)
iterion validateis more lenient thaniterion run. A literal{{issue.title}}mention in a prompt body (documentation text) passedvalidatebut failedrunwithC004 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.
Lessons for next run
- The mid-turn ask_user limitation is real for forfait users — until the claw+openai fix lands, author operator interaction as graph-level
humannodes, not mid-turnask_user, on any claw+openai bot. - Full cycle (incl. propose + emit) now proven. Next: confirm on
/boardthat a drag-to-readyactually dispatchesfeature-devfrom 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. - The reviewers should reference
{{input.X}}, never{{outputs.<node>}}(whole-output) in prompt bodies. Consider an engine fix so whole-output refs resolve (and render as JSON) in prompts, matching edgewith. - Add
source:evolveto emit's label set explicitly (this run labelled by axis + horizon but thesource:evolvelabel didn't appear — verify the set_labels call includes it). - The vision quality on gpt-5.5 was high; opus (via
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.
