Skip to content

Spike: audit which contract rows and extension interfaces are ready to freeze at 1.0 #319

Closed

Description

@schlessera

Context

Epic #56 defines 1.0.0 as the point where the extension interfaces lose
@experimental and the integration contract stops moving under a minor. Its
breakdown names the first piece of work: an audit that asks, for every contract
entry and every extension interface, whether it is ready to stop moving. The
audit's output becomes the epic's sub-issues. This is that audit.

What binds today, on main @ d350daa8:

  • docs/integration-contract.md:3-14 — additive changes ship in a minor;
    breaking ones also ship in a minor before 1.0, with the breaking label, a
    maintainer ruling and a changeset, and need a major from 1.0. The reasoning is
    docs/decisions/contract-versioning.md.
  • docs/integration-contract.md:573-576 — EmbeddingProvider,
    CompletionProvider, AgentRunner, SkillEmitter and the ui-sdk interfaces
    are @experimental until 1.0, with breaks announced as minor-version events.
  • docs/extending/README.md:60-65 (Stability) and :69-106 (the seams): four
    in @schlessera/brain, four in @schlessera/brain-ui-sdk (AgentBackend,
    SpeechProvider, ToolRenderer, AsrClient), and SiteAdapter in
    @schlessera/brain-scrape (packages/scrape/src/adapter/types.ts:66).
  • .changeset/config.json puts all fourteen packages in one fixed group,
    described in CONTRIBUTING.md:121-122 as a deliberate pre-1.0 tradeoff.

A 2026-09-22 comment on #56 found that the documented interface set is wider
than the @experimental annotations: AsrClient (packages/ui-sdk/src/client/asr.ts:15)
and SiteAdapter carry no individual tag. An audit that only greps for
@experimental misses them. git grep -l '@experimental' -- 'packages/*/src'
currently lists eight files.

Scope

  • Inventory every surface 1.0 would freeze: each row of
    docs/integration-contract.md, each interface named in
    docs/extending/README.md, and each exported symbol tagged @experimental.
    Reconcile the three lists and name every surface that appears in one and not
    the others.
  • For each surface, record: whether it has changed in a breaking way since
    0.33.0 (cite the CONTRACT: commit or changeset), whether a contract test
    exists that a third-party implementation could run, and a verdict: ready,
    needs work (what), or should leave the contract before 1.0.
  • Say whether the fixed lockstep group is defended or reconsidered, with the
    argument, as the epic asks.

Out of scope

  • Changing any interface, contract row, annotation or versioning policy. The
    audit produces a list; the list becomes Epic: 1.0.0 — the stability bar #56's sub-issues.
  • Scheduling 1.0.
  • New seams (ROADMAP binding decision 2).

Acceptance criteria

  • A table posted on Epic: 1.0.0 — the stability bar #56 with one row per surface: where it is defined
    (file:line), where it is documented, its breaking-change history since
    0.33.0, whether a runnable contract test exists, and a verdict.
  • Every mismatch between the three inventories is named.
  • A stated position on the lockstep group, with its reasoning.
  • Every "needs work" verdict is filed as a sub-issue of Epic: 1.0.0 — the stability bar #56, with template
    sections filled, or named in the table as not yet filed with the reason.

Verification

Another reader can re-derive the inventory from the three sources named in
Scope and reach the same row set.

Contract impact

  • Neither box applies; the audit changes nothing.

Activity

  1. added
    type: spikeTime-boxed investigation. The deliverable is a written decision, not code.
    area: docsThe docs/ tree and the README / AGENTS / CONTRIBUTING surfaces.
    agent-readyContext and acceptance criteria are complete enough for an agent to take this unattended.
    on Sep 25, 2026
  2. schlessera commented on Sep 25, 2026

    @schlessera
    OwnerAuthor

    The audit is posted on #56: #56 (comment)

    It has 58 rows: 35 contract rows, 6 shapes the named consumer parses but the contract omits, and 17 extension-interface rows. It also lists nine mismatches between the three inventories and states a position on the lockstep group: defend it through 1.0, provided the contract document, not every export, triggers the major (#343 Q1). Every "needs work" and "decision" verdict was filed and attached to #56 as #340-#347. Row 17 is tracked by #155, which sits under #39.

    The acceptance criteria asked for a table and filed issues, so no pull request goes with this spike. It changes nothing in the tree.

  3. schlessera commented on Sep 25, 2026

    @schlessera
    OwnerAuthor

    Closed 2026-09-25: the spike's deliverable is the audit posted on #56 (#56 (comment)). Its findings are filed as #340-#347 and attached to #56. No code shipped, so no PR closes this.

  4. added this to the 0.38.0 milestone on Oct 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent-readyContext and acceptance criteria are complete enough for an agent to take this unattended.area: docsThe docs/ tree and the README / AGENTS / CONTRIBUTING surfaces.type: spikeTime-boxed investigation. The deliverable is a written decision, not code.

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions