ADR-009 — Stability commitment: what changes (and what doesn't) after v1.0¶
| Status | Accepted |
| Date | 2026-04-26 |
| Phase | v0.11.1 (POLISH2-17, friction matrix Row 13) |
| Supersedes / amends | none |
Context¶
reposix is pre-1.0. Pre-1.0 versions follow Cargo's "0.x is
breaking-allowed" convention, and we have used that latitude freely:
ADR-008 changed the reposix:: URL shape between v0.9.0 and v0.10.0,
and the v0.9.0 architecture pivot rewrote the entire FUSE layer to a
git-remote-helper + partial-clone substrate.
Harness authors integrating reposix into coding agents need to know
what they can pin against. A floating dependency on the reposix-cli
crate or the git-remote-reposix binary is acceptable for prototypes,
but the persona-harness-author audit (friction matrix Row 13) flagged
the absence of any stability commitment as a "block-the-recommend"
risk: harness authors will not commit to a cargo binstall-able
version without knowing which surfaces are stable.
This ADR defines the stable contract that takes effect at the v1.0.0 tag. Before v1.0.0 nothing here is binding; after v1.0.0 every item below is governed by semantic versioning (breaking changes require a major bump).
Decision¶
Stable surfaces (locked at v1.0.0 under semver)¶
reposix initURL shape. The canonical formreposix::<scheme>://<host>/<backend>/projects/<project>(the post-v0.10.0 form ratified by ADR-008) is locked. New backends MAY be added (additive change, minor bump); the URL shape itself MAY NOT change without a major bump.- CLI subcommand surface. The set
reposix init|sim|list|refresh|spaces|log|history|tokens|cost|gc|doctor|--versionis locked. New subcommands MAY be added as additive minor versions. Removing a subcommand name, or removing/renaming an existing argument name, is a breaking change. - Exit codes. The codes documented in
docs/reference/exit-codes.mdare locked. New exit codes MAY be added as additive minor versions; existing codes MAY NOT change meaning. (The helper's exit2for anyhow-chain failures is documented as "best parse stderr"; a future v1.1 may add exit3for blob-limit refusal as a non-breaking addition.) git-remote-reposixprotocol surface. The advertised capabilitiesstateless-connectandexportare locked, as is the refspec namespacerefs/heads/*:refs/reposix/*. Adding new capabilities is additive; removing or renaming either is breaking.- Frontmatter field allowlist. The server-controlled fields
(
id,created_at,version,updated_at) and the rule that client writes cannot override them are locked. Adding a new server-controlled field is a breaking change for clients that write it; we will deprecate-then-remove with at least one minor version of warning before the major bump that removes the override path. BackendConnectortrait. Locked undernon_exhaustivediscipline. New trait methods land via the existingBackendFeatureextension pattern, gated on capability flags so existing implementors compile unchanged. Adding a required method to the base trait is a breaking change.
Surfaces explicitly NOT covered¶
The following are out of scope for the stability commitment and may change at any minor version:
reposix-clilibrary internals. Thepub modre-exports inside the crate are#[doc(hidden)]and may move or vanish without notice. Integrators must consume thereposixbinary or thegit-remote-reposixbinary, never the lib surface.- On-disk cache schema. The layout under
.reposix-cache/<backend>-<project>.git/is reproducible from the backend; we may bump the schema and invalidate caches at a minor version with a one-line release-note callout. The cache is a rebuildable artifact, not a contract. - Simulator HTTP wire format. The simulator at
crates/reposix-sim/is a test seam, not a public REST API. Consumers requiring stability should use one of the real backends (GitHub, Confluence, JIRA) instead. - Capability matrix. The per-backend capability tables in
docs/concepts/may add or remove rows as backends evolve. The capability-flag mechanism itself is locked (point 6 above), but the set of flags and which backend supports which is not.
Consequences¶
Positive¶
- Harness authors can pin
reposix-cli >=1.0, <2.0and trust the URL shape, exit codes, and protocol surface across the entire major series. - New backends ship as additive minor versions, with no risk of invalidating existing harness integrations.
- Internal refactors (e.g. the
confluence/lib.rssplit tracked in the v0.11.1+ catalog) are non-breaking by construction because the lib surface is hidden. - The friction-matrix Row 13 risk for harness adopters is closed: there is now a written commitment they can cite.
Negative¶
- The CLI subcommand and exit-code surfaces are large enough that locking them constrains future redesign. Mitigation: the additive rule covers all foreseeable extensions, and the internal-modules-are-hidden carve-out keeps refactor freedom intact.
- The
BackendConnectortrait sits insidereposix-core, which third-party connector authors depend on. A future v2.0 will impose a real migration cost on those authors. Mitigation: we expect 12-24 months of v1.x before a v2 is worth contemplating, and theBackendFeatureextension pattern absorbs most additive changes without touching the base trait.
Neutral¶
- The simulator wire format being explicitly unstable is a deliberate asymmetry: it lets us evolve the test seam aggressively while the real-backend contract stays frozen. Consumers who built against the simulator wire format directly (rather than the binary surface) are on notice.
References¶
- ADR-008 — Helper URL-scheme backend dispatch: the canonical post-v0.10.0 URL shape locked under point 1 above.
docs/reference/exit-codes.md: the exit-code surface locked under point 3 above.crates/reposix-core/src/backend.rs: theBackendConnectortrait andBackendCapabilitiesstruct (the latter introduced in v0.11.1 via POLISH2-08) referenced under point 6 above.- Friction matrix Row 13 (persona-harness-author audit): the motivating gap this ADR closes.