Commits on Source 13

  • Matt Cockayne's avatar
    docs(specs): repair the wiki links and record 0011 as implemented · 1af7609a
    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.
    1af7609a
  • Matt Cockayne's avatar
    docs(how-to): document the provider conformance suite · c82118bc
    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.
    c82118bc
  • Matt Cockayne's avatar
    docs(explanation): refresh the version-compatibility worked example · 5b6a844b
    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.
    5b6a844b
  • Matt Cockayne's avatar
    docs(history): warn that Config.HistoryPolicy is not applied · 804fd537
    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.
    804fd537
  • Matt Cockayne's avatar
  • Matt Cockayne's avatar
    fix(deps): update go modules · f5b0771a
    Matt Cockayne authored
    f5b0771a
  • Matt Cockayne's avatar
  • Matt Cockayne's avatar
    feat(history): add BoundConversation, the seam a provider applies a policy through · cfa259b0
    Matt Cockayne authored and Matt Cockayne's avatar Matt Cockayne committed
    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
    cfa259b0
  • Matt Cockayne's avatar
    feat(conformance): prove a history policy reaches the wire · ad214b63
    Matt Cockayne authored and Matt Cockayne's avatar Matt Cockayne committed
    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
    ad214b63
  • Matt Cockayne's avatar
    fix(history): warn when a policy is set on claude-local · d0b52f61
    Matt Cockayne authored and Matt Cockayne's avatar Matt Cockayne committed
    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
    d0b52f61
  • Matt Cockayne's avatar
    docs(history): document the provider application path · 0ee1dd53
    Matt Cockayne authored and Matt Cockayne's avatar Matt Cockayne committed
    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
    0ee1dd53
  • Matt Cockayne's avatar
    feat(constants): default Gemini to gemini-3.7-flash · 7e31a118
    Matt Cockayne authored and Matt Cockayne's avatar Matt Cockayne committed
    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
    7e31a118
  • Matt Cockayne's avatar
    chore(main): release v0.11.0 · a14c9bc1
    Matt Cockayne authored
    a14c9bc1
Loading
Loading