feat(campaign): read-only campaign-cli ledger reporter (v5.7 Fase 2 Block 3b)
Read-only reporter over the durable campaign-ledger core (Block 3a). Mirrors
knowledge-refresh-cli: the deterministic, READ-ONLY half of the campaign motor.
- scanners/campaign-cli.mjs (-cli → not an orchestrated scanner): loadLedger +
validateLedger + rollUp, emits {status, initialized, ledgerPath, schemaVersion,
createdDate, updatedDate, repos, rollUp} JSON. NEVER writes — a missing ledger
is reported gracefully (initialized:false), never created. init + status
transitions belong to the Block 3c command layer (human-approved writes).
- --ledger-file overrides default path (deterministic testing); --output-file
mirrors the sibling. Exit: 0 = initialized & valid, 1 = not initialized
(advisory), 3 = error (parse/corrupt/invalid).
- 8 tests (tests/scanners/campaign-cli.test.mjs). Suite 1119→1127 green hermetic;
scanner count stays 15 (-cli), SC-5 byte-stable.
- CLAUDE.md: §campaign-cli added; Testing badge corrected 1091/62 → 1127/64
(fixes pre-existing Block 3a drift).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>