Skip to content

Release v0.302.69 - #1800

Merged
justrach merged 24 commits into
mainfrom
release/v0.302.69
Nov 2, 2026
Merged

justrach merged 24 commits into
mainfrom
release/v0.302.69

Conversation

@justrach

@justrach justrach commented Nov 2, 2026 •

Copy link
Copy Markdown
Owner

v0.302.69

Peer mail stops rewriting history that was already sent, Kimi international accounts sign in on kimi.ai, workers can use gateway models, and graff harness-tree shows the harness as one value.

Includes all changes from v0.302.68.

cursoragent and others added 24 commits October 21, 2026 10:05
Put ttl 12h on the existing explicit prefix breakpoint and keep the
request default at 30m. Chat Completions, Codex, and older models stay
byte-identical. GRAFF_OPENAI_CACHE_TTL selects 12h (default), 30m, or
off. Usage parses cached_tokens and the 12h/30m write split.

The retention probe builds those bodies through Agent.buildBody and
records later cached_tokens in bench/openai-cache-retention.json.

Co-authored-by: Rach <justrach@users.noreply.github.com>
review-checkpoint-preserves-unfinished-scope repeated one identical
read_file twenty times to stand in for a long review; the identical-call
guard (#1706) now ends such a turn at eight. Reading a different seeded
note per call keeps the review long without looping, as the sibling
review-mode and ACP checkpoint tests already do. The case passes with
and without the guard.

Co-Authored-By: Codegraff <blackfloofie@codegraff.com>
Kimi runs two sign-in servers: auth.kimi.ai for international accounts and
auth.kimi.com for mainland China. graff only used kimi.com, so international
users were sent to a page their account does not use. `graff login kimi` now
picks the site from the env override, the server a saved login recorded, or
a mainland clock/locale (else kimi.ai); `graff login kimi.ai` / `kimi.com`
choose it outright. The login records `oauth_host` and refresh returns there;
logins without it keep refreshing on kimi.com.

The device poll now honours expires_in, adds 5s per slow_down, reports an
unreachable server and a declined sign-in, and lives in oauth_kimi.zig.

Every `graff login` copies its sign-in link when stdout is a terminal
(pbcopy/clip/wl-copy/xclip; OSC 52 over SSH) and skips opening a browser
over SSH or with GRAFF_NO_BROWSER. Piped output is unchanged apart from the
Kimi wording, and no new line starts with a check mark.

Co-Authored-By: Codegraff <blackfloofie@codegraff.com>
graff harness-tree show|digest|check|apply|diff. The instruction file,
skills, subagents, helper scripts and hooks graff loads are read as one
tree, written exactly into another checkout, content-addressed, and
checked with feedback a proposer can act on: off-surface paths, skill
frontmatter, hook shape, dangling script references, and grading
language a proposal adds.

Co-Authored-By: Codegraff <blackfloofie@codegraff.com>
--subagent-model rejected a model the codegraff gateway serves but the
baked catalog does not list ("unknown subagent model"), although the
same name worked as --model codegraff/<model>. With an explicit
--subagent-provider, the worker now takes the exact model name under
the rule the root model already uses (acceptsExplicitModel). Consent to
cross providers is still required, and a bare name with no provider
must still be a catalogued model.

Co-Authored-By: Codegraff <blackfloofie@codegraff.com>
A persona pinned with model: <provider>/<model> (for example a read-only
scout on the codegraff gateway under a subscription root) was resolved
against the child's own provider and silently kept the session default.
A qualified pin now seats the worker on the named provider when the
session started with --allow-cross-provider-subagents and that provider
has a login; otherwise the trace says why it was ignored. Naming the
child's own provider just drops the prefix.

Co-Authored-By: Codegraff <blackfloofie@codegraff.com>
A worker seated on another provider (--subagent-provider, or a persona
pinned as <provider>/<model> under --allow-cross-provider-subagents)
used a model whose catalog row was never loaded, so its calls were
reported as unknown cost. Startup now also loads the catalog of the
explicit worker provider and, once the session consents to
cross-provider workers, of every provider with a login. Cached
catalogs activate without waiting; uncached ones share the existing
startup budget.

Co-Authored-By: Codegraff <blackfloofie@codegraff.com>
Co-Authored-By: Codegraff <blackfloofie@codegraff.com>
A persona pinned to another provider without cross-provider consent or a
login ran on the session default, and the reason went only to the trace.
The worker's report now leads with it, so the parent model and the user
both see it.

Co-Authored-By: Codegraff <blackfloofie@codegraff.com>
notifyCancelled sends notifications/cancelled on a new connection (the
hung request still holds its own) and gave up on any error. When every
ephemeral port was briefly in TIME_WAIT, the connect failed with
AddressUnavailable and the notice was dropped silently: the server kept
working on a request nobody wanted, and test-mcp-client-spec.py's HTTP
cancel case failed now and then under the parallel suite.

That one error is now retried every 100 ms, at most 20 times; any other
failure still gives up at once, as before. The notice moves to its own
module (mcp_http.zig was near its 600-line limit), with the retry loop
as a pure function under a unit test.

Under CPU load with four copies of the cancel case in parallel, 2 of ~54
cancels lost their notice before; 0 of 79 after.

Co-Authored-By: Codegraff <blackfloofie@codegraff.com>
At each step boundary with an empty inbox, placeWaitingBeforeHuman removed
every peer wake line from the whole history, including the one the
current turn started from, which the model had already been sent. That
rewrote history the provider had cached: on Claude Agent it started a
fresh claude process ("restart: earlier history changed") on every
woken turn, and on other providers it broke the cached prefix.

It now removes only wakes after the last non-user message, the ones the
model was never sent. A leftover wake placed before a human prompt is
still dropped once the inbox is clear.
…ease/v0.302.69

# Conflicts:
#	docs/adr/README.md
Changelog, release notes, and --version what's-new for v0.302.69, and ratchet the tier-1 test count baseline to 3601.
# Conflicts:
#	src/cli.zig
#	src/commands_model.zig
#	src/main.zig
#	src/startup.zig
…R 0312)

Renumber the ADR to 0312 (0298 is taken on main). The default stays 30m, ADR 0009's bytes, until a live probe records that OpenAI accepts prompt_cache_breakpoint.ttl "12h" and keeps the entry: no write was ever sent, and an unsupported value is a 400 on every request. GRAFF_OPENAI_CACHE_TTL=12h opts in.
@justrach
justrach merged commit 95dacc0 into main Nov 2, 2026
15 checks passed
@justrach
justrach deleted the release/v0.302.69 branch November 2, 2026 03:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants