Repository navigation
Release v0.302.69 - #1800
Merged
Merged
Release v0.302.69#1800
Conversation
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.
… release/v0.302.69
…nct-reads' into release/v0.302.69
… release/v0.302.69
…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.
This was referenced Nov 2, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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-treeshows the harness as one value.graff login kimisigns international accounts in on kimi.ai and mainland China accounts on kimi.com, picking the site from your saved login or your clock and locale;graff login kimi.aiandgraff login kimi.comchoose it outright, and token refresh goes back to the site that issued the login. Earlier logins keep refreshing on kimi.com. (Sign Kimi accounts in on kimi.ai or kimi.com and copy sign-in links #1733)graff loginputs the link on the clipboard (over SSH, on your own terminal's clipboard). Over SSH and withGRAFF_NO_BROWSER, graff no longer opens a browser you can't see. (Sign Kimi accounts in on kimi.ai or kimi.com and copy sign-in links #1733)--subagent-model <model>with--subagent-provider codegraffaccepts a model the gateway serves even when the built-in catalog does not list it, a persona pinned withmodel: <provider>/<model>runs on that provider, and a worker's calls on another provider report their cost. (Workers can use gateway models and name their own provider #1769)graff harness-tree show|digest|check|apply|diffreads the files graff loads to decide how it works (the instruction file, skills, subagents, scripts and hooks) as one tree you can inspect, compare and apply. (graff harness-tree: the harness as one value #1770)GRAFF_OPENAI_CACHE_TTL=12h(oropenai_cache_ttlin settings) keeps the stable prompt prefix cached for 12 hours. The default is unchanged (30 minutes) until a live check confirms OpenAI accepts and keeps it. Usage now separates 12-hour and 30-minute cache writes. (OpenAI Responses GPT-5.6+ cache the stable prefix for 12 hours #1698, ADR 0312)Includes all changes from v0.302.68.