Skip to content

I3124 — A JUnit XML report a repository already produces is imported into the evidence ledger, and nothing in that repository changes

Add an importer (majordomus evidence import --junit <file>) that normalises test cases into ledger executions with suite, case, outcome, duration, commit and tree state. Malformed XML, duplicate imports, missing artifacts and a stale revision are typed refusals. For a foreign repository this is the default Observe mode: discover and import, never instrument.

READY wave 1 · p2 · implementation profile · parallel safe

Part of a-claim-stands-only-on-its-evidence — A claim that something is enforced, tested or delivered stands only on recorded evidence that would have caught it being false.

Ready. Every dependency is done, so majordomus plan start I3124 will be accepted.

Objective

Add an importer (majordomus evidence import --junit <file>) that normalises test cases into ledger executions with suite, case, outcome, duration, commit and tree state. Malformed XML, duplicate imports, missing artifacts and a stale revision are typed refusals. For a foreign repository this is the default Observe mode: discover and import, never instrument.

Why

On 2026-10-13 (c246#0, #3) the owner asked for derived JUnit/Cobertura and for non-invasive integration. A second adopter (TypeScript, Vitest) cannot bring its results today. ADR 0041 rejected JUnit as the store; as an import format it does not contradict that decision (see the ADR proposal). It extends milestone test-evidence. Proposed in ADR 0189 (JUnit and Cobertura are formats evidence is imported from and exported to; the tracked ledger stays the only store) (proposed; it carries no authority until the owner accepts it). Sources: chatgpt-majordomus:c246#0, chatgpt-majordomus:c246#3, chatgpt-majordomus:c246#4, chatgpt-majordomus:c246#7.

Current state

Only this repository's runners reach the ledger (I1954 BLOCKED, I2786 READY). No importer exists.

Desired state

A Vitest or cargo-nextest JUnit file from a fixture repository becomes ledger executions that claims can cite.

Scope

  • apps/majordomus-cli/src/evidence
  • apps/majordomus-cli/src/commands/evidence.rs
  • docs/EVIDENCE.md

Out of scope

  • Cucumber, LCOV and Cobertura (I3125)
  • Running tests

Dependencies

What waits on this

Acceptance criteria

  • A valid report imports deterministically and a second import is a no-op
  • Malformed, stale and duplicate imports are refused with distinct codes
  • A fixture foreign repository is byte-identical after import, outside .ai/local

Validation

  • cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib evidence

Evidence required

  • case_junit_import

Evidence

None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.

Timeline

started
—
verified
—
completed
—

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/I3124.yaml. Read it back with majordomus plan show I3124.

Searches the titles and descriptions of every page this site publishes.