Repository navigation
Norms and practices
Status: Draft — may change (2026-10-19)
How does the series separate decisions from living specifications, and which outside norms does it follow?
The terms follow Specs-workspace-adapters. The examples describe that design proposal, not a claim that every adapter or plugin already ships.
| Term | Meaning | Examples in the proposal |
|---|---|---|
| adapter | One of several interchangeable implementations of something the core needs; pick one. | Workspace: headless (built in), herdr, tmux. Registry storage: files, a database, Redis, an online service. |
| plugin | An optional add-on that brings a new capability; none, one or many. | A knowledge base or a future chat connector. |
| profile | How TeamCLI drives one CLI. |
claude-code, codex, grok, cursor, antigravity, jules, muse, gemini. |
| The RFC (this repository, private) | The spec (floor/teamcli, public) | |
|---|---|---|
| Holds | the problem, the decision, the commitments, the security boundary, alternatives, drawbacks, open questions | formats, fields, exit codes, JSON schemas, event kinds, file layouts, default values |
| Changes | rarely, through a round | with the code, in a release |
| Checked by | reviewers | CI, against the code |
| Rule of thumb | it changes only when the design changes | it could change in a patch release |
-
An RFC MUST link to the spec and leave the specification there. Each commitment names the spec section that implements it and the conformance or acceptance test that proves it, where one exists; where none exists the commitment says so.
-
Commitments MUST use BCP 14 keywords (RFC 2119 as clarified by RFC 8174): MUST, MUST NOT, SHOULD, SHOULD NOT and MAY, in capitals only where they are normative; a lower-case "must" is ordinary prose. A commitment's promise is the keyword; its Today line is a fact and carries none.
-
Today MUST be read at a tag or a sha, named once at the head of the Today section, and every Today line of the text is read at it; a line read at another ref says which.
-
An accepted text MUST remain frozen. A change is a new amendment that names what it supersedes, with a status line on the old text (the review process, rules 1 and 4). An editorial correction (a typo, a broken link, a wrong cross-reference) is allowed with a dated line in the text's revision log saying what changed and that no commitment did, confirmed by the board in a batch (the Charter's editorial confirmations are the precedent); it is never silent.
-
Enumerations MUST live in registries in the spec: event kinds, exit codes, policy names, tested CLI version ranges, delivery legs, prompt kinds. A new entry needs a spec change and its check, not an RFC round, unless it breaks a commitment.
Alongside the eight registries assembled in this refactor, one key registry is shared by
team config,team settingsandteam seat, targeting 0.5.3: config-keys in the config spec draft, under an owner decision. The port manifest keeps a row for each of the eight. -
The spec MUST NOT link to this private repository. It is public.
-
An RFC MUST keep the Charter's six parts (Part 3: the question; what we propose, as commitments; why; what it costs and what it does not cover; what would change our mind; what is true today) and adds the sections this series uses, in this order after them: the security boundary; where it sits and what it leaves to others; open questions; the review record; and, from this page on, prior art and alternatives where the text argues a choice, and the links to the spec. The Rust template is the model for the additions, not a replacement for the six parts.
Spec: none (these seven rules are governance rules; no spec section implements them). Proof: none (they are reviewed, not tested).
-
contract/cli.json: every command and option, checked bycontract:check. -
contract/exit-codes.json, withdocs/reference/exit-codes.mdbeside it, checked byexit-codes:check. -
schema/*.json: forty-one--jsondocuments, JSON Schema 2020-12, checked byschema:check. -
contract/capture-coverage.json, checked bycoverage:check;docs/reference/output.mdandcli.md;docs/team-file.md, the team file format. -
bun run conformance: the conformance tests against the built binary.
What is missing is registries for event kinds, policy names, delivery legs and prompt kinds. They are listed today inside RFC drafts (002-Communication commitment 25, with the table in Specs-events §3; the policy catalogue; the Runtime's chapter E) and move to the spec at the split of §5.
Status: followed (we do it today), adopt (start now), later (planned).
- BCP 14 (RFC 2119, RFC 8174): normative keywords. Adopt, in new texts from this page on.
- MADR: the common decision-record template (context, options, decision, consequences, status). The owner decisions log already carries that content under its own fields (§6, question 3). Followed in substance; not adopted as a template.
- The Rust RFC template: the model for §3.7's additions. Adopt.
-
JSON Schema 2020-12 for every
--jsonoutput. Followed. -
CloudEvents 1.0: the event envelope (
specversion,id,source,type;time,subject,datacontentype,dataschema;data). The 0.5.1 bus has its own envelope; whether it can align is a 0.5.2 check. Later. - The POSIX utility syntax guidelines for options. Followed in the main.
- Semantic Versioning 2.0.0. Followed.
- Keep a Changelog 1.1.0: the Unreleased section and the Added, Changed, Fixed and Removed headings; TeamCLI's CHANGELOG.md says so in its header. Followed in the main.
- Conventional Commits 1.0.0. Followed.
-
SLSA provenance:
npm publish --provenancefrom a workflow that holdsid-token: writeand stores no token (release.yml at v0.5.0). Followed on every publish.
- Diátaxis: four kinds of page (tutorials, how-to guides, reference, explanation), kept apart. Adopt: name it in the docs guide.
- ISO/IEC 29147 and 30111, coordinated vulnerability disclosure and handling: a private report path, which SECURITY.md implements through the repository's security advisories. Followed.
- OpenSSF Scorecard: an automated check of repository hygiene, for floor/teamcli, floor/material and floor/vlist. Later: one run each, then decide.
- WCAG 2.2 and the WAI-ARIA Authoring Practices Guide. Adopt: name them in each library's REVIEW.md.
- Material Design 3 (material). Followed.
- This page's round: at least three non-Claude reviews (the minimum in Review terms §1), then the board; at acceptance original §3 (the series rule above, in §2) folds into the review process and this page keeps original §§2 and 4.
- New texts follow the series rule (original §3, above in §2) from this page on, whatever their state: a draft in flight adopts the keywords and the tag at its next revision.
- After 0.5.1 ships: split the two accepted amendments (the folded Runtime amendment 01 and 002 amendment 01). Their technical sections move into the teamcli repository's specs and registries, and the RFCs keep the commitments and link to the specs.
- The quick adoptions: BCP 14 keywords; Diátaxis named in the docs guide; WCAG 2.2 and the ARIA practices named in material's and vlist's REVIEW.md.
- For 0.5.2: the CloudEvents check for the event bus, and one OpenSSF Scorecard run on the three public repositories.
Our RFCs mix two things that age differently: the decision (what we commit to, and why) and the specification (formats, fields, codes, defaults). The folded Runtime amendment 01 shows the cost: it lists environment variables, lock-file formats and keychain flags; two of its three review rounds went on those details rather than on the design; and those details change with a patch release while the RFC is meant to stay. Mature projects keep the two apart. This page says how we do it, and which outside norms we follow.
The source identifies review time spent on details that change with patch releases (original §1). It changes no Kernel rule or Charter part. Where it disagrees with the review process, the review process stands until acceptance and the fold.
Adopted, followed and later are distinct statuses; the CloudEvents alignment and Scorecard runs remain planned. The series rule is a proposal pending its round.
No separate reversal criterion is argued in the source. Its unresolved registry-keeper question remains in §10; its rollout requires review and board acceptance.
Today is v0.5.0 (52db9b75). The implementation inventory remains in original §3 above, with its checks; the status of each outside norm remains in original §4. These are source claims retained for the page’s round, not new adoptions.
The spec is public and never links to this private repository (original §3.6). This page changes no Kernel rule. The disclosure and handling standard status stays as original §4 states it.
This governance page sits beside the tiers. Acceptance folds original §3 into the review process; the page then keeps original §§2 and 4. The board and review terms govern its round.
| Project | Its decision document | Its living truth |
|---|---|---|
| Rust | an RFC on a fixed template (motivation, guide-level and reference-level explanation, drawbacks, rationale and alternatives, prior art, unresolved questions); once merged it is "active", kept roughly in sync with the feature by follow-up pull requests, and it is not the specification | the Reference and the standard library docs |
| Python | a PEP (PEP 1); once Final it is historical, and later edits are limited to links and typos | the language reference and the docs |
| Kubernetes | a KEP: motivation, design, a test plan, graduation criteria (alpha, beta, GA), a production readiness review | the API conventions and the OpenAPI spec generated from the code |
| TC39 (JavaScript) | a proposal through stages 0 to 4; at stage 4 it is merged into the specification and the proposal repository is archived | ECMA-262, one living spec |
| ADRs | a short record: title, status, context, decision, consequences; never edited, superseded by a new record (Nygard's form; MADR, Markdown Any Decision Records, is the common template) | the specs and API docs |
| IETF | RFCs with BCP 14 keywords; a published RFC is never edited: corrections are errata, and a later RFC updates or obsoletes it | IANA registries for long lists, each with its own registration policy (many extended by expert review or first-come, without a new RFC; some only by a new RFC) |
The shared principles:
- A decision document is frozen, or nearly so, once accepted. It changes by a new document that supersedes or amends it, and the old text stays readable as history.
- The spec is living. It is versioned with the code and, wherever possible, generated from it or checked against it.
- Long lists live in registries, with a stated policy for adding an entry.
- Normative words are marked. The IETF's MUST, SHOULD and MAY are the common vocabulary; the others use "must" and "should" without the convention.
Three were asked in the first draft; this text settles them as far as the architect can, and leaves the owner's word to the round.
-
The registries' home: settled as a proposal. Machine-readable files beside the contract
(
contract/events.json,contract/policies.json, and the like), each with a:checkscript and the reference page generated from it, the patterncontract/cli.jsonandcontract/exit-codes.jsonset at v0.5.0. A hand-kept page underdocs/reference/would be a second copy of what the code knows. - Frozen texts and small corrections: settled as a proposal. Original §3.4: an editorial correction is allowed, dated in the revision log, confirmed by the board in a batch, never silent. The IETF's errata and Python's link-and-typo rule are the models; Rust's follow-up pull requests are not, because they let an accepted text drift.
- The owner decisions log and MADR: settled as a proposal. The log stays as it is: append-only, revoked by status, never deleted, with When, Decision, Meaning, Decided by, Status and Links, which carry MADR's context, decision, consequences and status under other names. Nothing is retrofitted, and new records keep the log's format.
- Open: who keeps the registries. The TeamCLI team's documentarist, under the orchestrator, is the natural keeper; whether a registry entry that names a new kind needs the architect's read before it lands, or only the check, is the round's to say.
The registries' keeper remains the open question above; assigning the work does not settle the review requirement.
The code inventories and registry names remain at original §3 above. No spec draft is lifted from this governance page; its rule-and-source form is retained.