Skip to content

Commit 4bb42ee

Browse files
committed
Merge origin/main
2 parents 18ca874 + 1800fc2 commit 4bb42ee

311 files changed

Lines changed: 6379 additions & 5224 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.prettierignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,4 @@ vendor/
44
scratch/
55
node_modules/
66
CHANGELOG.md
7-
# Intentionally invalid source: the broken-toolchain eval fixture.
8-
tests/fixtures/broken-toolchain/
97

CHANGELOG.md

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,86 @@ parallel copies under `docs/` or `scripts/notes/`. At cut time: rename
1313

1414
## [Unreleased]
1515

16+
## [0.2.106] - 2026-08-23
17+
1618
### Agent
1719

1820
- **xAI short HTTP 429s are rate limits, not quota exhaustion.** Bare 429s from
1921
known xAI/Grok providers remapped to retryable so moderate Retry-After no
2022
longer aborts as a long-window quota. Clear usage/quota body markers still
2123
abort. Transcript shows "Rate limited — retrying…" instead of "Quota exhausted".
2224

25+
- **Resuming a session no longer shows a blank error when the saved history
26+
has one corrupted line.** A malformed or schema-invalid line anywhere in the
27+
saved transcript used to abort the entire resume load. The TUI's resume view
28+
now skips just the bad line (logging it) and still shows the rest of the
29+
history; a corrupt file still surfaces as an error during live conversation
30+
loading, where correctness matters more than availability.
31+
32+
- **Every stop and nudge is now logged, and so is what each dispatch produced.**
33+
`interventions.jsonl` in the worker's trace dir records each intervention with
34+
its measured value beside the threshold it crossed, the model family it fired
35+
on, and the run state at that moment — plus refused parent re-dispatches and,
36+
now, one outcome record per completed dispatch (the salvage kind or a
37+
clean-complete marker, plus the dispatch count). `bun run
38+
scripts/intervention-forensics.ts` aggregates them: counts by family, value
39+
distribution against threshold, two context columns (stops on runs that had
40+
already edited files, stops before half the turn budget — not a measured
41+
false-positive rate), and outcome counts by kind. Threshold changes can now
42+
cite data instead of judgment.
43+
44+
- **Shell file work counts as evidence.** A worker that edited with `sed -i`, a
45+
heredoc, or `>` redirection had `editedPaths` empty and salvaged as
46+
`never-edited` — a sticky hard block that then refused the parent an identical
47+
re-dispatch; one that read with `cat`/`head` salvaged as `incomplete-report`.
48+
Both are real work classified as no work. `run_shell` commands are now scanned
49+
for file reads and writes using the same subject expansion the auto-shell
50+
policy uses, so `bash -c` and `env -S` payloads are inspected rather than
51+
trusted.
52+
53+
- **Re-read pressure no longer stops a worker.** The `reReadLimit` thrash hard
54+
stop and its soft `re-read-nudge` are removed: reading one file four times
55+
while editing another, paging a large file, or re-running a grep to verify an
56+
edit could all end a healthy worker with a sticky hard block that refused
57+
re-dispatch. Fingerprint period detection already catches a genuinely
58+
repeating read cycle, on the evidence that it repeats. `src/subagent/thrash.ts`
59+
now only tracks read/edit evidence for the `intent=implement` and critique
60+
completeness checks, plus the near-budget wrap-up nudge.
61+
62+
## [0.2.105] - 2026-08-23
63+
64+
### Permissions
65+
66+
- **Every approval ask and how it settles is now logged.** `approvals.jsonl`
67+
in the session dir records each consequential decision — auto-mode
68+
allow/deny, or an operator prompt's allow-once / allow-with-scope / deny /
69+
timeout / abort — with the classifier rule that triggered it, queued /
70+
displayed / settled timestamps, and shell chain segment count. No command
71+
text, path, or credential is ever recorded; writes are fire-and-forget and
72+
never fail a run. `scripts/approval-forensics.ts` aggregates across local
73+
sessions.
74+
75+
### Agent
76+
77+
- **Context estimate syncs incrementally on append.** `syncFromTurns` keys
78+
prefix turns by object identity and estimates only the new suffix. A rewrite,
79+
shrink, or middle-turn identity break still fully recomputes so image-aging
80+
cannot leave a stale total.
81+
- **Thinking-only replay no longer collapses into an identical request.** Assistant turns with no text or tool_call (empty content, leftover thinking/citation) are replaced with a stable `[thinking-only turn omitted]` marker so the turn is kept, roles still alternate, and the next `buildRequest` body differs from the previous one.
82+
2383
- **Compaction keeps scored work, not retry loops.** Errored tool results are no
2484
longer auto-pinned; identical errors collapse to one representative. Anchors
2585
are scored (writes, successful task completions, plan updates) and pair
2686
closures count against `maxAnchorTurns`. The LLM summary is workflow-aware
2787
and skips degenerate assistant text.
2888

89+
- **Prefix-stable summaries and growth hysteresis.** Existing compacted user
90+
turns stay byte-identical across later passes; new folds become later summary
91+
turns with an assistant spacer so the prompt prefix can stay in the KV cache.
92+
After a compact that remains over the high watermark, the governor waits for
93+
usage to grow by 10% of the window before re-arming. Overflow recovery still
94+
compacts immediately.
95+
2996
### Plugins
3097

3198
- **`run_shell` no longer defaults to a 15s timeout.** Omitted timeout arms no
@@ -40,6 +107,21 @@ parallel copies under `docs/` or `scripts/notes/`. At cut time: rename
40107
unset; values must still be integers ≥1. `task(maxTurns)`, profile
41108
`maxTurns`, and `settings.subagentMaxTurns` may exceed 100 for long jobs.
42109

110+
### Internal
111+
112+
- **`inference.error` partials keep the provider error.** `partial.jsonl`
113+
records for `inference-error` now include `error` (`category`, `message`,
114+
`statusCode` when present) even when the cycle streamed no text.
115+
- **Exec `turnsUsed` follows the run-sink.** Mid-run and terminal `run.json`
116+
snapshots use `getTurnCount()` the same way the TUI does, instead of
117+
writing the initial zero until send finishes.
118+
119+
### Docs
120+
121+
- **`latest` is a symlink, not a session.** Naive globs of a project
122+
sessions directory double-count unless they skip `latest` (`listSessions`
123+
already does).
124+
43125
## [0.2.104] - 2026-08-23
44126

45127
### TUI

0 commit comments

Comments
 (0)