Skip to content

Specifications

Every non-trivial change to this module is written down before it is built. A spec captures the problem, the decisions taken, the options rejected and the open questions, so a later reader can see why the code looks the way it does, long after the conversation that produced it is gone.

The specs live in the project wiki. They are point-in-time decision records rather than living documentation, and keeping them in docs/ buries the documentation that is living. This page is the index; it does not carry the bodies.

# Spec Status
0001 Sampling & reasoning effort IMPLEMENTED (v0.3.0)
0002 Prompt caching IMPLEMENTED (v0.5.0)
0003 Provider throttling & retry IMPLEMENTED (v0.4.0)
0004 ResponseSchema shape validation IMPLEMENTED (v0.3.1)
0005 Default model formula IMPLEMENTED (v0.7.0)
0006 Capability vocabulary IMPLEMENTED (v0.6.0)
0007 Degraded construction IMPLEMENTED (v0.6.0)
0008 Typed ResponseSchema IMPLEMENTED (v0.8.0)
0009 claude-local MCP tools DRAFT
0010 Multimodal input IMPLEMENTED (in go-tool-base, before the extraction)
0011 Provider-conformance suite IMPLEMENTED (suite v0.10.1; history bounding proven by conformance from v0.11.0 / adapters v0.10.0)
0012 Version compatibility IMPLEMENTED (v0.9.2 / adapters v0.8.3)
0013 History-policy application IMPLEMENTED (v0.11.0 / adapters v0.10.0)
0014 History compaction IMPLEMENTED (v0.12.0)
0015 One construction path IMPLEMENTED (v0.13.0 / chat-openai v0.10.1 / chat-gemini v0.10.1)
0016 Slash commands IMPLEMENTED (v0.14.0 / adapters v0.11.0)
0017 Vertex AI backend APPROVED

How to read one

Each spec carries a status in its frontmatter, and that status is the single source of truth for where the decision stands:

Status Meaning
DRAFT Under discussion. Do not implement against it yet.
IN REVIEW Open questions all resolved; awaiting approval. Still not safe to implement against.
APPROVED Agreed. Safe to implement.
IN PROGRESS Being built. Part of it may already have shipped; the status line says which.
IMPLEMENTED Shipped. The release it shipped in is named in the status line.
REJECTED Considered and decided against, or superseded. Kept deliberately. The value is the durable record that the question was asked and answered.

Decisions are numbered (D1, D2, …) so reviews, merge requests and later specs can cite one precisely. A withdrawn decision keeps its number rather than being deleted, because "we proposed this and found it unnecessary" is worth as much as the decisions that survived.

Wiki pages are named specs/<NNNN>-<slug>, numbered in the order the decisions were taken. The number is the spec's handle. Cite "0005" rather than a title, which can be edited.

Where the older specs live

This module was extracted from go-tool-base, and the chat specs written before the extraction settled stayed there:

They stay there rather than being copied here. A spec belongs with the decision it records, and duplicating one only creates a second copy to drift. New specs for this module and its provider modules land in this project's wiki.

Provider-module specs live in this wiki too, not in the provider repos: the adapters are too tightly coupled to the core to reason about separately, which is the same reason all provider documentation lives on this site.