Stability Contract — what 1.0 freezes
The concrete surface behind the six
1.0 cut criteria: what a
consumer may depend on, what stays experimental, and how a frozen surface is
ever allowed to change. On 0.x nothing below is guaranteed yet — this doc is
the promise we are ratcheting toward, and every ! commit is measured against
it.
Frozen at 1.0 (the public surface)
| Surface | Contract |
|---|---|
cos CLI |
Command names, required args, and exit-code semantics of the documented commands (init, update, doctor, task-*, board, pr *, hub start, graph-reindex). New flags may appear; existing ones keep meaning. |
cos_* MCP tools |
Tool names, argument names/types, and the ok(data) / fail(category, message, retryable) envelope (mcp-error-envelope.md). New optional args and new meta keys are non-breaking. |
$COS_* environment |
COS_STATE_DIR, COS_AGENT_DIR, COS_PANEL_DIR, COS_DB_PATH, COS_PROJECT_ROOT names and meaning. |
| Scaffold shape | cos init output tree (AGENTS.md, Makefile, .coding-os/, docs roots) as pinned by tests/golden/**. |
| Hook contract | Hook event names, registry.yaml schema, exit-code semantics (0 pass / 2 block), and the cos-env.sh sourcing convention. |
| Adapter contract | adapter.yaml schema (hook_capabilities, entrypoint declarations). |
| Graph uid grammar | code:function:<path>::<name> et al. (graph_os types) — memories and docs reference uids, so the grammar never changes shape. |
| Board lifecycle | Task statuses (icebox → in_progress → testing → complete, blocked, archive) and the four axes (swimlane · kind · epic · labels). |
| DB schema direction | Migrations stay append-only (Rule 9); a released migration is never edited. |
Explicitly NOT frozen (may change in any minor)
- Internal module layout (
_mcp_*,doctor_checks_*,_graph_*siblings) — import from the public facades, never from private siblings. - Hub HTTP routes and UI (
src/core/web/**) — the UI is versioned with the server it ships with. - Prompt/rule/skill wording —
cos updatere-renders them by design. - Heuristics: complexity scores, graph edge confidence, retrieval ranking, token estimators.
- Anything under
docs/engineering/describing internals.
Deprecation policy (criterion 6)
Post-1.0, a frozen surface changes only through this ladder, spread over at least two minor releases:
- Deprecate (minor N): the old form keeps working; using it emits a runtime warning naming the replacement; CHANGELOG + the release notes call it out; docs update to the new form.
- Warn (minor N+1): warning becomes prominent (stderr on every use); migration notes ship in the release.
- Remove (major): the old form is deleted — only in a major version.
Accelerated removal is allowed solely for security fixes, and the release
notes must say so. Pre-1.0, breaking changes need only a feat!: /
BREAKING CHANGE: commit marker (release-please then bumps the minor).
Verification hooks
- Scaffold freeze:
tests/golden/**+uv run pytest tests/test_template_scaffold.py. - Envelope freeze:
tests/**asserting against_shared.py(Rule 13) +python src/core/thinking_os/server.py --test. - Signature freeze:
docs/governance/mcp-tool-inventory.mdis regenerated — a diff on a released tool's signature is a review-blocking event.
See also
release-process.md · ci-gates.md · KNOWN_LIMITATIONS.md · GOVERNANCE.md