I1947 — Every feature reaches a test, and every use case has a feature
Give every active use case an owning feature, and give the cockpit and deployments features a claim naming their own tests, so that a homepage panel routed to a use case reaches a feature and every feature reaches a test through the subject index (ADR 0087 decision 9).
DONE wave 0 · p1 · implementation profile · parallel safe
Objective
Give every active use case an owning feature, and give the cockpit and deployments features a claim naming their own tests, so that a homepage panel routed to a use case reaches a feature and every feature reaches a test through the subject index (ADR 0087 decision 9).
Why
The subject index derives subjects from existing declarations. A use case no feature names is a subject the index cannot place under a feature, and a feature with no claim reaches tests only through its rules. Nothing checks use-case ownership today.
Current state
Some active use cases are named by no feature's use_cases list: `git grep <use-case-id> -- .ai/repo/features` is empty for each of them. .ai/repo/features/cockpit.md and .ai/repo/features/deployments.md carry no claims line.
Desired state
Every active use case is named by at least one feature; the cockpit and deployments features each carry a claim whose test names it back; and a case fails, naming each one, when an active use case has no owning feature.
Scope
- .ai/repo/features/finish-contract.md
- .ai/repo/features/commit.md
- .ai/repo/features/install.md
- .ai/repo/features/continuity.md
- .ai/repo/features/cockpit.md
- .ai/repo/features/deployments.md
- apps/majordomus-cli/tests/cockpit.rs
- test/cases/84_deployment_contract.sh
- test/cases/503_every_use_case_has_a_feature.sh
- docs/CLAIMS.yaml
- docs/claims
Out of scope
- Editing any use case file
- .ai/repo/features/finish-contract.md.tmp
- docs/CLAIMS.yaml beyond the two rows this slice appends
Dependencies
None. This issue is a root of the graph.
What waits on this
Acceptance criteria
- Every use case whose status is active is named by at least one feature, and the case fails naming each one that is not
- The case fails when any list it reads is empty or a command in its pipeline fails
- The cockpit and deployments features carry a claim each, and each claim's test names the claim id
- bin/majordomus-cli product validate and bin/majordomus usecase validate pass
Validation
- bash test/run.sh 503_every_use_case_has_a_feature
- bin/majordomus-cli product validate
- bin/majordomus usecase validate
- scripts/ci/claim-proof-check --strict
Evidence required
- every_use_case_has_a_feature
- every_feature_reaches_a_test
Evidence
| covers | type | command | result | at commit |
|---|---|---|---|---|
| every_use_case_has_a_feature | test | bash test/run.sh 503_every_use_case_has_a_feature | ok at 4090b2b8ae: no active use case of this repository is outside the features' use_cases, and the fixture's unowned one is named; product validate and usecase validate exit 0 | 4090b2b |
| every_feature_reaches_a_test | test | scripts/ci/claim-proof-check --strict | exit 0 at 4090b2b8ae: 0 of 217 guaranteed claims name a test that does not name the claim back, the cockpit and deployments claims among them | 4090b2b |
Timeline
- started
- 2026-10-08T10:49:57Z
- verified
- 2026-10-08T10:50:33Z
- completed
- 2026-10-08T10:50:38Z
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I1947.yaml. Read it back with majordomus plan show I1947.