Loading
Commits on Source 13
-
Matt Cockayne authored
Every link in the spec index pointed at a slug without its number prefix (specs/prompt-caching rather than specs/0002-prompt-caching), so all twelve returned 404. The index page exists to route people to the specs and routed them nowhere; the rest of the docs already used the numbered form. 0011 moves to IMPLEMENTED now go-tool-base has adopted the family, and its status line names the releases rather than the stale "core v0.10.0; adapters in review". 0010 keeps a bare status deliberately: multimodal input shipped in go-tool-base before the extraction, so no release of this module introduced it, and naming one would be false precision.
-
Matt Cockayne authored
Spec 0011 shipped conformance as a public package — Run, Suite, Control, Behaviour and the two optional observer halves — and the docs never mentioned it. Someone following "Register a custom provider" to the end had no way to learn that a shared suite exists to check the provider they just wrote. The page leans on the capability gating and the skip behaviour, because those are the parts that decide whether a green run means anything: a case whose Control cannot observe it skips with a line naming the gap rather than passing vacuously, so the skips are the result worth reading.
-
Matt Cockayne authored
The example named chat-anthropic v0.8.2 requiring chat v0.9.2. The pair is now v0.9.1 requiring v0.10.1, verified against the module proxy. The stale numbers undercut the point the section makes: it argues you should read the adapter's go.mod rather than compare version numbers, using a pair that no longer exists.
-
Matt Cockayne authored
No provider calls HistoryPolicy.Bound or ApplyHistoryEdit. The core half of spec 0011 D7/D8/D9 shipped in v0.10.0 and the provider half never did, so setting TruncateOldest has no effect on any provider in the family. The how-to told a caller to set it and described what would happen, which is the worst position for a doc to be in: the reader follows it, sees no error, and concludes their conversation is bounded. The construction warning about pinned turns eating the truncation budget reinforced that, since it reads as confirmation the policy is running. 0011 goes back to IN PROGRESS to match, and 0013 specifies the missing path.
-
Matt Cockayne authored
-
Matt Cockayne authored
-
Matt Cockayne authored
-
Config.HistoryPolicy shipped in v0.10.0 with no caller. The core defined the interface, implemented TruncateOldest, enforced the invariants in ApplyHistoryEdit and unit tested all of it — and no provider ever called any of it, so setting a policy did nothing at all. The core cannot fix that alone. A provider's transcript is deliberately opaque to it, which is why TurnInfo describes a turn rather than being one, so only the provider can enumerate its turns and rewrite them. What was missing was the call, and a place to put the parts of it that must not vary. BoundConversation is that middle step: it asks the policy, validates the edit through ApplyHistoryEdit, and hands back the indices to keep and the replacements to apply. A provider supplies the ends. Three providers writing these six lines each is how they drift, and one that skips the validation gets no invariant checking at all while appearing to work. A nil policy returns every index unchanged, so a provider calls it unconditionally rather than guarding at each site. Two semantics are settled here rather than left to each provider, per spec 0013 D8 and D3: - The budget counts turns the client has retained. The pending turn is not among them, so a budget of forty means forty turns of history and a request carrying forty-one. That is what History() already reports, and the agreement is the point. - A policy error, or an edit that breaks an invariant, fails the call. Sending unbounded at the moment the guard broke is the failure a caller set the policy to prevent. Refs #13 -
history_observable asserts that History() reports growth. Nothing asserted that a configured policy bounds anything, so every provider agreed by doing nothing and a full release train shipped a feature that did not work. history_policy_applied sets TruncateOldest(2), drives five exchanges, and asserts through Control what the backend actually received. It watches the wire rather than the client's own account of itself, because a client's account is exactly what a diverging provider gets wrong. The tolerance is one turn and no more: the budget counts retained turns, so a provider reporting retained turns sees 2 and one reporting what went on the wire sees 3. Both are conformant. A provider that never applies the policy carries ten, so nothing about this rests on an off-by-one reading of what a turn is. A provider reporting History.Known == false skips, naming the reason. It cannot enumerate turns it does not hold, so it cannot describe them to a policy — claude-local is the case, and spec 0013 D6 puts it out of the path deliberately rather than by omission. Control.Requests already carried a Turns count. The suite was built with the exact hook this needed and no case had used it this way. The suite's own fake provider now applies the policy through BoundConversation, so the case is exercised end to end here rather than only in the provider modules, and the fake doubles as a worked example of the three-step shape a real provider adopts. Refs #13
-
claude-local cannot apply a history policy. Its conversation lives in the claude CLI's own session, resumed by ID, so it can see what it has buffered locally but not what the far side will replay — which is why it reports History.Known == false. It cannot enumerate the turns, so it cannot describe them, so it cannot bound them. Saying so once at construction, and otherwise ignoring the setting, is the same shape as the existing CacheTTL warning. Not an error: a ProviderFallback spanning claude-local and an API provider is a legitimate configuration that should keep working, and the API provider in that pair does apply the policy. Not silence either. Silence about a setting that does nothing is precisely the defect issue #13 records, and repeating it here for the one provider that can never apply a policy would be repeating it deliberately. Refs #13
-
The how-to told callers the feature does not work, which was true and is the warning v0.10.1 shipped. It now says what actually governs whether a policy takes effect: the provider applies it, so the provider module has to have adopted the path, and the conformance case is what makes that claim checkable rather than a promise. It also states the claude-local exception, which is permanent rather than pending. The custom-provider guide gains the three-step sequence a provider author has to implement — describe, bound, rewrite — with the two invariants that are checked for them (pinned turns, tool groups) and the one that is not: calling BoundConversation rather than acting on a policy's edit directly, so that every provider inherits invariants added after it was written. Refs #13
-
Google released gemini-3.7-flash (3.7-flash-08-2026), generally available with no preview marker in either the model id or its display name. It reports the same limits and support flags as gemini-3.6-flash: 1048576 in / 65536 out, effort, explicit caching, top-p, and a maximum temperature of 2. Capability does not separate the two, so D1's latest tie-break selects the newer one. Verified against Google's listing on 2026-08-18. D2 is untouched and its reasoning is unchanged. gemini-3.1-pro-preview is still preview-only and there is still no generally-available Pro-tier Gemini, so the default stays on the Flash tier and stays a genuine step below the Claude and OpenAI defaults. Two of the three predecessors D2 cites as withdrawn are now gone from the listing entirely, which strengthens rather than weakens the argument for not reaching past GA. The capability table that answers for this model ships in chat-gemini, where it is already refreshed. An adapter whose table predates the model degrades to "send it and let the API judge" rather than failing, so the two changes do not have to land together. Refs chat-gemini#1
-
Matt Cockayne authored