2026-06-23 — GLM-5.2 dogfood campaign (Wave 1 + Wave 2 + integration)
Cross-bot campaign record. Per-bot detail lives in each docs/bot-runs/<bot>.md (Wave-1 entries dated 2026-06-22) and in the commit messages on main.
What it was
Battle-test the catalog bots on iterion itself to improve iterion / claw / the bots, on a z.ai/GLM-5.2 + Anthropic-forfait stack (operator's request to use z.ai to save Anthropic credits + compare). Stable studio on :4891 (no watchexec), static binary, both providers exercised.
Provider stack + the failover event (central finding)
.envflipped to forfait + z.ai/glm-5.2 for allclaude_codenodes; gpt-5.5 stays OpenAI/ChatGPT forfait. glm-5.2 validated end-to-end (id confirmed newest, 2026-06-13, 1M context — not 200K).- The z.ai 5h rate-limit cap tripped mid-campaign → manual failover to Anthropic/opus (resume from checkpoint, zero work lost). This proved in production the need for automatic per-provider+model failover.
Bots run (10 runs)
Wave 1: Nexie ✅ (roadmap + 5 tickets, incl. the failover + registry tickets), Adry ✅ (13 ADRs 029-041), Evoly ⏸ (parked: gpt-5.5 forfait context-overflow in review fan-out), Seki ⏹ (deepsec 37 findings; triage stalled on gpt-5.5).
Wave 2 (both providers à fond): Featurly ×2 ✅ (provider+model failover feature 9493f96a2; dynamic model-spec registry 970687f58), Fini ✅ (GLM caps 9f46f4d7e; iterion models CLI 4250d8c1c), Renovacy ❌→fixed, Doki (oscillated→fixed), Seki re-run (triage-on-glm validated the stall fix).
iterion/claw improvements produced + INTEGRATED on main (31 ahead of origin, local)
Features (built BY the dogfood bots, from findings the dogfood surfaced):
- Per-element provider+model failover chain
provider: "zai:glm-5.2,anthropic:claude-opus-4-8"(Featurly) — ADR-004 + docs. - Dynamic model-spec registry (Featurly) — fetch models.dev + cache (~/.iterion, TTL) + curated fallback (glm-5.2=1M); ADR-042.
iterion modelsCLI to inspect (Fini).
Engine / security / reliability fixes:
- worktree:auto BY DEFAULT (
6569460d5) — compile default + git-repo guard; root-cause fix for non-worktree bots dirtying the live checkout. lint+test+e2e green. - #2 SSRF clone-host guard (
2303f2644) + #3 shard-id collision (dacd3076f) — from Seki/deepsec findings. - glm-5.2 context = 1M (
a3c4acf2f); missing-field structured-output retry in the engine (part of Seki fixab6c0ab7e).
Bot fixes (all iterion validate + unit-validated by isolated subagents):
- Seki
ab6c0ab7e— triage/voters use the failover chain (glm-5.2 1M → opus fallback) + tolerate transient missing-field. (Elegant loop: the failover feature the cap proved necessary now hardens Seki.) - Renovacy
8a86e8bb3— keep toolchain caches (GOPATH/GOMODCACHE/CARGO_HOME…) out of the worktree + crash-proof commit-prep (256MB buffers + cache-excluding pathspecs). - Doki
3b6531038— enforce asymptote: symmetric streak gate +cumulative_dismissed_pairs/cumulative_pushback(do-not-relitigate).
Plus: 13 ADRs (Adry c9402ac12), Wave-1 bilans (1f0e4b2cd), recovered prior docs-refresh link fixes (847bc57c5).
Findings (the dogfood's diagnostic value)
- Auto provider+model failover needed → BUILT (the campaign's centerpiece).
- glm-5.2 structured-output reliability < opus on complex review schemas (Fini's reviewer hit
missing required fieldrepeatedly on glm-5.2, even with the new missing-field retry; completed on opus). → motivates generalizing the failover chain to the vibe bots' reviewers (feature-dev/feature-gap-fill/ branch-improve-loop/whole-improve-loop) — recommended follow-up, not yet done. - gpt-5.5 forfait context-overflow in review fan-outs + sec triage (Evoly, Seki).
- Non-worktree bots dirtied the live checkout (a prior docs-refresh left uncommitted edits; the "mystery main edits") → fixed by worktree:auto default.
- Inconsistent rate-limit handling (graceful
acknowledge_recoverypause vs hardfail_resumable) across node types. - glm-5.2 survey verbosity (Adry ~900 tool-calls), deepsec line-drift false-positives, gitleaks flags gitignored
.env*backups,ITERION_SEC_AUDIT_BACKEND=claude_codeleaks gpt-voters onto claude_code (needs MODEL+MODEL_CLAUDE both set).
State
All work on local main (4250d8c1c, 31 ahead of origin, unpushed), built + go vet + unit + e2e green. The operator's 14 unpushed bot-invocations commits are preserved underneath. Nothing pushed; fully reversible.
