Repository navigation
docs: adopt the change policy for the API, CLI and config (PR 7e of REORG-PLAN) - #506
Conversation
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>
ingpaolodettori-dev
left a comment
There was a problem hiding this comment.
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 | |
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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 | |
There was a problem hiding this comment.
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.
Summary
PR 7e of
docs/REORG-PLAN.md: the change policy for the API, CLI and configuration, adopted 2026-10-13. Docs only. Based onmainafter #505.docs/reference/change-policy.mdrecords 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 theCODEOWNERSowner. 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)
/turnand/runsas supported aliases of/v1(move them to the client surface)GET /v1/runs/status, keep/runs/statusas an aliasBUNDLE_FORMAT_VERSIONis 1 and sits in the local lockfile, but the stored bundle drops the lockfile and nothing reads it)info.versionmeans and add a changelogconfigRefto a harness that cannot apply itNotes
Verification
scripts/check-doc-links.pyreports 0 broken links; Prettier run on changed files.make lintnot run locally; CI will.Assisted-By: Claude (Anthropic AI) noreply@anthropic.com