RFCs: proposing a change to the public API
Once the MiMa baseline is set (#1281), a breaking change to a Frozen module needs a deprecation cycle (Compatibility and Deprecation Policy). An RFC is where such a change is proposed, in the open, before it is built: one Markdown file in this directory, reviewed as a pull request. The process is deliberately small. GOVERNANCE.md already says who decides; this page says where the proposal lives and what it covers.
When an RFC is required
- Any change to the public API of a Frozen module (API Stability): a new, changed or removed public type or member, whether or not MiMa would flag it.
- A module’s tier: making a module Frozen, Beta or Experimental, or moving it between tiers.
- A new SPI, something users or other modules implement (
ProviderDescriptorandTracingBackendare the existing ones). - A change to a published wire format: a checkpoint or session format, a persisted schema, a config key that
existing
application.conffiles use.
When it is not
- Bug fixes that keep the documented behaviour, and documentation.
- Internals: anything
private,private[llm4s]or in a non-public package. - Beta and Experimental APIs. Their changes need only a migration note in the CHANGELOG. Write an RFC anyway if the change is large or contested; nothing forbids one.
- A purely additive change that follows a pattern an accepted RFC already settled, for example a new field on a growth-prone data type added as RFC 0002 prescribes. Say which RFC it follows in the pull request.
When in doubt, ask on the issue; a maintainer says whether an RFC is needed.
How it works
- Proposed. Copy 0000-template.md to
NNNN-short-title.mdwith the next free number, fill it in, add a row to the index below, and open a pull request labelledrfc. Link the issue it answers, if any. - Final comment period. When the discussion has settled, a maintainer announces a final comment period of 7 days on the pull request (and on Discord), so that anyone who has not read it yet can still object.
- Accepted or Rejected. After the period, the maintainers decide as GOVERNANCE.md describes (lazy consensus, or a maintainer majority when contested) and the pull request is merged with the status set either way. A rejected RFC is kept, with the reason: it records what was considered.
- Implemented. The implementing pull request links the RFC and sets its status, with the version it shipped in.
An accepted RFC can be amended by a later pull request; a change of direction is a new RFC that supersedes it.
Index
| RFC | Title | Status | Tracking |
|---|---|---|---|
| 0001 | When llm4s-agent gets its MiMa baseline |
Proposed | #1281, #1266 |
| 0002 | Growth-prone data types: final case class X private, companion apply, with* setters, no public copy |
Accepted (recorded retroactively) | #1133 pass 5; policy |
| 0003 | Times in the public API: FiniteDuration for a duration, Instant for a point in time |
Accepted (recorded retroactively) | #1133 passes 6 and 7 |
| 0004 | A frozen module’s public signatures expose no third-party type and no wildcard-importable implicit | Accepted (recorded retroactively) | #1133 pass 8 |
| 0005 | Providers are ProviderDescriptors discovered through META-INF/services; core ships none |
Accepted (recorded retroactively) | #1131, #1132; guide |
| 0006 | Tracing backends are TracingBackends selected by TracingMode.Named; core reads no backend’s keys |
Accepted (recorded retroactively) | #1233, #1133 |
| 0007 | Typed agent runtime: one execution model for the agent harness | Proposed (design document) | #1266; design |
Rows 0002 to 0006 were decided before this process existed. They are listed so that the log is complete from the start; each links to where the decision was made and has no file of its own. Write one only if the decision is revisited.
Design documents
The documents in docs/design/ describe how features were
built (the agent framework phases, the typed agent runtime and its stage slices). They are not RFCs and are not
rewritten as RFCs. A design that changes a Frozen API still needs an RFC for that change, which can be short and link
the design document for the detail.