Skip to content

docs: adopt the change policy for the API, CLI and config (PR 7e of REORG-PLAN) - #506

Merged
pdettori merged 2 commits into
rossoctl:mainfrom
pdettori:docs/change-policy-pr7e
Oct 13, 2026
Merged

pdettori merged 2 commits into
rossoctl:mainfrom
pdettori:docs/change-policy-pr7e

Conversation

@pdettori

@pdettori pdettori commented Oct 13, 2026 •

Copy link
Copy Markdown
Member

Summary

PR 7e of docs/REORG-PLAN.md: the change policy for the API, CLI and configuration, adopted 2026-10-13. Docs only. Based on main after #505.

docs/reference/change-policy.md records what the repository does today for each surface, defines what counts as a breaking change, and sets the rules: additive-only within a release series, deprecate-then-remove (the longer of one minor release and 90 days for the HTTP API and the sandbox wire contract, 30 days for the CLI, configuration and anything else), runtime warnings, upgrade notes in every release, stored data readable by the previous release, and a breaking change to a Stable surface needing an ADR and sign-off from the CODEOWNERS owner. The eight decisions are tabled with their follow-up issues.

The maturity page marks Stable criterion 5 met; the docs index links the policy.

Follow-up issues (code changes the policy requires)

Notes

Verification

scripts/check-doc-links.py reports 0 broken links; Prettier run on changed files. make lint not run locally; CI will.

Assisted-By: Claude (Anthropic AI) noreply@anthropic.com

Propose what counts as a breaking change, a deprecation procedure and
per-surface rules, based on what the repository does today (route table
surfaces, deprecated aliases, the additive sandbox/v1 contract). Marked
Proposed; the open choices are listed for the maintainer. Linked from the
maturity page and the docs index.

Assisted-By: Claude (Anthropic AI) <noreply@anthropic.com>
Signed-off-by: Paolo Dettori <dettori@us.ibm.com>
Remove the Proposed status, record the eight decisions (notice unit,
deprecation periods, aliases, /v1/runs/status, OpenAPI version, stored
data, bundle format, approver) with their follow-up issues, note that the
bundle format version exists in the lockfile but is not stored or read, and
mark Stable criterion 5 met.

Assisted-By: Claude (Anthropic AI) <noreply@anthropic.com>
Signed-off-by: Paolo Dettori <dettori@us.ibm.com>
@pdettori pdettori changed the title docs: draft change policy for the API, CLI and config (PR 7e of REORG-PLAN) docs: adopt the change policy for the API, CLI and config (PR 7e of REORG-PLAN) Oct 13, 2026

@ingpaolodettori-dev ingpaolodettori-dev left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

The page is accurate about today's repository: I checked each "What is the contract today" claim against main a02b9db (the route table and the aliases, the once-per-process /run-leaf warning in server.ts:993-1005, both info.version: 1.0.0, mocactl's edge-<sha>/tag/dev version, workspace_key on Exec, the v1. sealed credential, and BUNDLE_FORMAT_VERSION being written to lockfile.json and then stripped by store.ts:51). Issues #507-#512 exist and are open. The comments below cover one decision that contradicts how the aliases are served, one claim that holds for only one of the two OpenAPI files, and a stale criterion in the maturity row this PR edits. None blocks the merge.

Author: pdettori (MEMBER — maintainer)
Areas reviewed: Docs (checked against code on main)
Agent/IDE config (.claude/.vscode): none
Commits: 2 commits, all signed-off: yes
CI status: passing (14/14)

| Surface | Additive (allowed in a patch) | Breaking |
| ------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| HTTP API, `/v1` | New optional fields, routes, error codes | Removing or retyping anything; a new required field. Introduce `/v2` for a real break, or deprecate and remove per rule 2 |
| Unprefixed aliases (`/turn`, `/runs`) | None: frozen, supported, no removal date. New features appear on `/v1` only | Removing one needs the same notice as any route |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: "frozen … New features appear on /v1 only" can't hold with today's code, and #507 doesn't change that. /turn and /v1/turn go through the same branch (server.ts:1141, handleTurn), and so do /runs and /v1/runs (server.ts:1071). So every addition to /v1 reaches the alias too. That has already happened: detachable turns (#471) work on POST /turn, and #494's workload context works on POST /runs. Either describe the aliases as identical to /v1, including additive changes (that matches how they're served and the word "alias"), or note that freezing them means splitting the handlers. Decision 3 at line 101 needs the same wording.

## What is the contract today

- **HTTP routes.** The route table in `packages/knative-server/src/routes.ts` marks each route's `surface` as
`client` or `internal`, and a contract test keeps the OpenAPI document and that table in step. Only `client` routes

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: this holds for the data plane only. packages/control-plane/src/routes.ts has no surface field, and its contract test requires every implemented route to be documented (openapi-contract.test.ts, "documents every implemented route"). So docs/api/openapi.yaml describes /internal/credentials (line 728) too. Suggest: "…the data-plane route table marks each route's surface…; the control plane's OpenAPI documents every route, including /internal/credentials."

| `mocactl` and the `/v1` HTTP API | Preview | The API is versioned, but it has no written change policy yet. It can reach Stable independently of any deployment path |
| Path | Label | Against the criteria |
| -------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **P6 on Kubernetes** | Preview | **First target for Stable.** (1) No release names it yet. (2) A `k8s-e2e` job runs on `main`, but it is not a required check until it has passed ten consecutive runs. (3) Not yet: no upgrade or Redis backup guide. (4) Idle workspace reclaim is silent (#338), and async/cron have no P6 equivalent. (5) Met by [Change policy](change-policy.md), though several of its decisions still need code changes |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: this row now marks (5) met, but (3) still says "Not yet: no upgrade or Redis backup guide". #501 shipped docs/operations/upgrades.md and docs/operations/redis-backup-recovery.md for exactly this path. Update (3) as well, for example to "Documented in Operations (upgrades, Redis backup and recovery)", or say what's still missing (the upgrades page states that no rollback procedure is documented). Otherwise the row understates where P6 stands.

@pdettori
pdettori merged commit 9c97f59 into rossoctl:main Oct 13, 2026
19 of 20 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants