Commit History
-
Add CI for tests and Ruff (#217)
Unverified signature* Add CI for tests and Ruff Co-authored-by: OpenAI Codex <codex@openai.com> * Enforce Ruff formatting in CI Co-authored-by: OpenAI Codex <codex@openai.com> * Document Ruff pre-commit checks Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>754345f
-
Keep repetition guard internal (#144)
Aksel Joonas ReediUnverified signature* Clarify repetition guard messaging The loop breaker is intentional recovery behavior, but the user-facing 'doom loop' phrasing reads like a crash. Rename the visible log and system hint to a repetition guard while preserving the existing detector behavior and historical SFT tag compatibility. Constraint: Existing trajectories may still contain the old wording, so the tagger must recognize both labels. Rejected: Remove the event entirely | users would lose visibility into why the agent changed strategy. Confidence: high Scope-risk: narrow Directive: Keep user-facing recovery logs operational and non-alarming; reserve internal jargon for code, not UI events. Tested: UV_CACHE_DIR=/tmp/uv-cache uv run --extra dev pytest tests/unit/test_doom_loop_polling.py tests/unit/test_sft_tagger.py * Hide repetition guard from user surfaces The repetition guard is an internal control-flow intervention, not a status event users need to act on. Remove the CLI/frontend tool_log emissions while …e8ed637 -
fix(doom_loop): normalize tool-call args before hashing (#119)
d 🔹 +2: d 🔹, Aksel Joonas ReediUnverified signatureThe doom-loop detector hashed raw `function.arguments` strings, so semantically-identical tool calls hashed differently when the LLM emitted them with different key orderings (`{"a":1,"b":2}` vs `{"b":2,"a":1}`) or whitespace (`{"a":1}` vs `{"a": 1}`). This silently broke `detect_identical_consecutive` and `detect_repeating_sequence`: the agent could be calling the same tool with the same args repeatedly and the detector would see three distinct signatures and stay quiet. Issue #61 P1 explicitly calls this out: > Add semantic-similarity or normalized-task matching for `research`. Fix: parse-and-redump JSON via `json.dumps(..., sort_keys=True, separators=(",", ":"))` before hashing. Falls back to the raw string when the input isn't valid JSON so non-JSON `arguments` strings (rare edge for some providers) keep the legacy behaviour and never raise. Tests: 23 new cases in `tests/unit/test_doom_loop.py` covering `_normalize_args`, `_hash_args`, `extract_recent_tool_signatures`, `detect_i…07c5699
-
Fix CLI rendering corruption and split CLI/frontend model defaults (#121)
Aksel Joonas ReediUnverified signature* Stabilize CLI rendering and make surface defaults explicit The interactive CLI was interleaving live sub-agent redraws with streamed markdown output, which corrupted ANSI rendering and leaked raw control sequences into the terminal. The CLI and web app also shared one default model config even though they need different Anthropic routing defaults. Constraint: CLI default must use direct Anthropic credentials while web sessions must default to Bedrock Anthropic Constraint: Interactive terminal output must remain readable while sub-agent progress is live Rejected: Single shared config file with runtime overrides | keeps ownership of defaults implicit across surfaces Rejected: Keep background redraw ticker | concurrent terminal writers still corrupt streamed output Confidence: high Scope-risk: moderate Reversibility: clean Directive: Keep CLI and frontend default models in separate config files unless both surfaces intentionally converge again Tested: python -m compileall agent backen…3eec386
-
feat: add doom-loop detection for repeated tool call patterns
Detects when the agent is stuck calling the same tools repeatedly (identical consecutive calls or repeating sequences like A→B→A→B) and injects a corrective prompt to break the cycle.d3bb2d2