I1952 — Evidence subjects are derived once, in Rust
Derive the subject index of ADR 0087 decision 9 from existing declarations, compute a subject's verdict over its members through the one aggregation, and have majordomus generate write it as site/data/registry/evidence-subjects.json.
DONE wave 1 · p1 · implementation profile · parallel safe
Objective
Derive the subject index of ADR 0087 decision 9 from existing declarations, compute a subject's verdict over its members through the one aggregation, and have majordomus generate write it as site/data/registry/evidence-subjects.json.
Why
Nothing ties a widget to a subject, and the command-to-test join is derived in shell more than once, with different rules for which header line counts.
Current state
No subject index exists. scripts/generate-site-data derives the tests of commands.json, lib/commands.sh reads the first header line, and scripts/ci/command-furnished reads any line.
Desired state
evidence::subject derives claim, rule, feature, command, capability, mcp and use_case subjects; RuleState::as_proof() is the one declared mapping from a rule state; subject findings are a separate, advisory list; majordomus generate writes site/data/registry/evidence-subjects.json, declared in docs/generated/artifacts.json so its merge is derived; and a case holds the shell derivations equal to the index.
Scope
- apps/majordomus-cli/src/evidence/subject.rs
- apps/majordomus-cli/src/evidence/mod.rs
- apps/majordomus-cli/src/rules/mod.rs
- apps/majordomus-cli/src/generate.rs
- apps/majordomus-cli/tests/generated_documents.rs
- share/schemas/generated/site-evidence-subjects.schema.json
- site/data/registry/evidence-subjects.json
- test/cases/507_evidence_subjects_are_derived.sh
- docs/EVIDENCE.md
- docs/CLAIMS.yaml
- docs/claims
- .gitattributes
Out of scope
- site/data/generated, which scripts/generate-site-data owns and replaces wholesale
- An authored list of subjects
- A capability: the index is read by I1953
- Making subject findings refuse, which is I1962's
Dependencies
- I1948DONE Evidence is judged at the presented revision, by one freshness function
- I1947DONE Every feature reaches a test, and every use case has a feature
What waits on this
- I1953BLOCKED Evidence answers by subject, on every surface
- I1958BLOCKED Evidence has one route per subject, and every panel is joined to its subject
- I1962BLOCKED The evidence gates read subject findings and widgets
Acceptance criteria
- The index is written only by majordomus generate, to site/data/registry/evidence-subjects.json, and holds no ledger content and no commit
- A subject's verdict is computed over its members' own verdicts, a rule member contributing through RuleState::as_proof()
- A case holds the tests of commands.json equal to the index's command routes
- Subject findings never enter the claim report's findings
Validation
- bash test/run.sh 507_evidence_subjects_are_derived
- majordomus generate --check
- cargo test --workspace --all-features
Evidence required
- subjects_derived_once
- parity_with_shell_derivations
Evidence
| covers | type | command | result | at commit |
|---|---|---|---|---|
| subjects_derived_once | test | bash test/run.sh 507_evidence_subjects_are_derived | ok at 4090b2b8ae: the index is written by generate site under site/data/registry, carries no ledger key, is byte-identical across two derivations, and a hand edit is refused with exit 10 | 4090b2b |
| parity_with_shell_derivations | test | bash test/run.sh 507_evidence_subjects_are_derived | ok at 4090b2b8ae: the committed command pages, capability pages, doctrine pages and command graph equal the index | 4090b2b |
Timeline
- started
- 2026-10-08T10:53:02Z
- verified
- 2026-10-08T10:53:08Z
- completed
- 2026-10-08T10:53:13Z
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/I1952.yaml. Read it back with majordomus plan show I1952.