Skip to main content
Next (unreleased) · docs c218d875 · core f63c1e69 · built 2026-10-26 22:39 UTC

Work management

How work is planned, started, verified and released in metel-core, before it reaches the release chain. Source: metel-core/AGENTS.md, metel-core/ROADMAP.md, the slash commands.

PROC-WORK-001 — Work is an issue, a branch and a pull request, and nothing else​

GitHub issues are the task source of truth. A second concern found during the work gets its own issue and is not folded into the pull request. An issue with an unmet dependency is not started: a closed dependency whose code does not provide the contract the issue assumes counts as unmet. Work starts narrowly: read the issue, the governing spec or RFC sections, reproduce the bug or establish the missing behaviour, state the intended change and the regression test, and stop and report when there is no causal hypothesis after fifteen minutes.

FieldValue
statusimplemented
ownerengineering
triggerany change to a repository
producesone issue, one branch <type>/<issue>-<slug> from current develop, one pull request
implemented bymetel-core/AGENTS.md (Task workflow, GitHub and branch workflow), .claude/commands/start-issue.md, ship-issue.md
verified bynone automated for the shape; the commit-msg hook checks the message, CI checks the content (PROC-CI-001)
relatedPROC-CI-007, PROC-WORK-002

PROC-WORK-002 — A change is verified at the cheapest tier that can falsify it, and once at the strictest before merge​

Tier 1, after each meaningful edit: cargo check for the crate touched and the one new test. Tier 2, at handoff: the workspace tests and format check. Tier 3, once on the final tree: the release-mode workspace tests, clippy with warnings denied and the pedantic lints, and the format check. A defect found at Tier 3 is fixed by rerunning the focused regression first, then only the failed gate, then one complete Tier 3. A suppressed lint carries a // clippy-allow: reason; a bare or module-level allow is rejected by the ratchet.

FieldValue
statusimplemented
ownerengineering
triggeredits while the work is in progress; handoff for review; the final tree before merge
producesa regression fixture that fails without the change, and a final pass at Tier 3
implemented bymetel-core/AGENTS.md (Verification tiers); CI (test / clippy / fmt)
verified byCI runs the release-level gate on every pull request (PROC-CI-001); the tiers themselves are followed by the author
relatedPROC-CI-001, PROC-CI-006, PROC-WORK-003

PROC-WORK-003 — A language-visible change is paired with its documentation and changelog​

The specification holds current rules, not rationale or issue history; rationale lives in RFCs and ADRs. The changelog is written when the change lands, not at the end of the release. Because the changelog is a commit in another repository, a feature commit cannot contain its own entry, which is why the check is a report and not a gate.

FieldValue
statuspartial
ownerengineering
triggera change that alters syntax, type checking, move checking or runtime behaviour
producesthe spec and changelog entries in metel-docs, landed with the change
implemented bymetel-core/AGENTS.md (Documentation and RFC workflow); tools/changelog-status.sh reports unlogged commits
verified bynone enforced: the script reports and a person reads it at the release gate (PROC-RELEASE-008)
relatedPROC-RELEASE-008, PROC-DOCS-001

PROC-WORK-004 — Work is planned in themes, and at most one patch and the next minor release carry version numbers​

The numbered milestone with the lowest version (vX.Y.Z) is the release in progress: it is what the next tag will contain. While it is a patch, one further numbered milestone may exist for the next minor release (vX.(Y+1).0), so that the minor is planned, analysed and prepared before the patch ships. There are never two patch milestones or two minor milestones, and never a numbered milestone further out than the next minor. Every other milestone is a theme with no version number. A numbered milestone is made by renaming a theme once the version is chosen by the versioning rule; renaming keeps its issues. Issues, RFC target fields, spec notes, blog and release notes say planned or name the theme, and never name a version that has not been cut.

The minor milestone does not merge ahead of the patch. A patch never changes the language (PROC-RELEASE-001) and is tagged from develop, so while a patch milestone is open nothing language-visible from the minor milestone merges to develop, and no metel-docs change that only the minor needs reaches the docs commit metel-core pins. Allowed meanwhile: /gap-analysis on the minor, rewriting its issues, RFC lifecycle changes, and branches and pull requests kept open (draft) against it. When the patch tag is pushed the minor becomes the release in progress and its held pull requests merge. A bug goes to the patch milestone only if fixing it changes no accepted program (ROADMAP.md, Release type); otherwise it goes to the minor.

FieldValue
statusimplemented
ownerengineering
triggerplanning, and the cut of a release
producesmilestones named for capabilities, carrying a horizon (now, next, later, parallel), an outcome, an exit test and what they come after
implemented bymetel-core/ROADMAP.md; the GitHub milestones
verified bynone automated: rfc.py milestones prints the report ordered by horizon (numbered milestones first, lowest version first), and the order list is in ROADMAP.md
relatedPROC-WORK-005, PROC-RELEASE-001

PROC-WORK-005 — A theme milestone is coherent​

A theme states one outcome in a sentence, an exit test, and what it must come after. An issue that is not a necessary step goes to its nearest theme, to Backlog if it is a bug, or stays without a milestone with needs-design or rfc-tracking until it has a home. Design-settlement issues belong in decision-only themes, not mixed with implementation.

FieldValue
statusimplemented
ownerengineering
triggercreating or editing a theme milestone, and /gap-analysis on entry
producesa theme whose issues are all necessary steps to one outcome
implemented bymetel-core/ROADMAP.md; .claude/commands/gap-analysis.md
verified bynone automated
relatedPROC-WORK-004, PROC-WORK-006

PROC-WORK-006 — Bugs are not scheduled into themes​

A bug is observable behaviour that contradicts the spec or a documented guarantee; a known limitation or a not-yet-built feature is a feature. Severity is soundness (accepts a program that breaks a language guarantee; blocks the next release wherever it is found), incorrect (wrong result, crash, internal error, spurious rejection) or diagnostic (a misleading message only). A regression also carries regression and is fixed ahead of other bugs of its severity. A bug enters the numbered milestone only when the fix is committed for that release; a soundness bug or a regression since the last tag is committed by default. A deferred bug returns to Backlog, never to a theme. Integration findings go to Backlog, except soundness bugs and regressions, which go to the numbered milestone. A fix that changes only diagnostics or internals can ship in a patch; one that changes which programs are accepted is language-visible.

FieldValue
statusimplemented
ownerengineering
triggera defect is found, or an integration finding is filed
producesan issue labelled bug and one severity:* label in the Backlog milestone
implemented bymetel-core/ROADMAP.md (Bugs), .claude/commands/cut-release.md, gap-analysis.md, milestone-integration-test.md
verified by/cut-release lists the open severity:soundness and regression issues; a person reads the list
relatedPROC-RELEASE-008, PROC-WORK-004

PROC-WORK-007 — A milestone is analysed on entry and tested in combination before release​

Every question is batched into one report and answered before any issue is rewritten. The integration session builds the matrix of pairs of features the milestone shipped, fills the high-risk gaps with fixtures that exercise both features in one program, and files one issue per finding. Run order for a release: gap analysis, the issues, the integration session, the release gate.

FieldValue
statusimplemented
ownerengineering
trigger/gap-analysis <milestone> on entry; /milestone-integration-test <version> after the issues are done
producesissues that can be executed without further questions; a committed report release-notes/integration/<version>.md
implemented bymetel-core/.claude/commands/gap-analysis.md, milestone-integration-test.md
verified by/cut-release refuses a tag without a passing report newer than the freeze (PROC-RELEASE-008)
relatedPROC-RELEASE-008

PROC-WORK-008 — Work stops and asks when the ground is unclear​

No destructive git command is used to obtain a clean tree, no shared history is rewritten, no merge commit is created locally, no RFC lifecycle state is changed silently, and no behaviour absent from the spec is implemented. A substantial type-system or architecture change gets an adversarial review whose job is to produce runnable counterexamples, kept separate from the implementation.

FieldValue
statusimplemented
ownerengineering
triggerthe spec is ambiguous in a way that changes behaviour; a required RFC is below integrated; a closed dependency's code does not provide the assumed contract; several architectural choices differ materially; the task needs destructive cleanup or broader authority
producesa question to the maintainer instead of a guess
implemented bymetel-core/AGENTS.md (Stop conditions, Review discipline)
verified bynone automated
relatedPROC-DOCS-008