P4 (Wave 3, docs) — REQ-186, 191, 192, 193, 194, 195, 204, 210, 211, 212, 213 New docs: - docs/METRICS.md — canonical KPI catalog (grounded/derived/deferred) - docs/metrics/*.md — 13 per-KPI definition-of-success docs (D-127) - docs/METRICS_DEFERRED_ROADMAP.md — 8 deferred metrics + hot-path plan + re-eval triggers (REQ-210) - docs/NO_HUMANS_THESIS.md — thesis defensibility brief (REQ-213) New tools: - core/metrics/trust_snapshot.py — 5 trust metrics + chain-integrity verdict + snapshot hash (REQ-211) - scripts/check_north_star_diff.sh — CI check for NORTH_STAR strategic section changes (REQ-204) Modified: - .ciagent/config.json — strategic_direction_file: .ciagent/NORTH_STAR.md (REQ-186) ---ci--- project: acdl phase: 4 milestone: v1.17 status: execute ---/ci---
Nova Metrics Directory
v1.17 — Strategic Direction, Leadership Metrics & Unified Story (D-128)
This directory holds Nova's telemetry/observability artifacts. The metrics layer is Nova-native (D-120): JSONL event log + SQLite cold store + hash-chained Decision Ledger. No Kafka, Prometheus, ClickHouse, or QLDB.
Artifact inventory
| Artifact | Type | Regenerable? | Description |
|---|---|---|---|
events.jsonl |
Append-only event log | No (append-only state) | CloudEvents 1.0 envelopes from all emitters (REQ-187) |
decision_ledger.db |
SQLite append-only hash-chain | No (append-only state) | Decision Ledger: ai.decision.made + attestation.recorded events (REQ-188, D-121) |
nova_metrics.db |
SQLite cold store | Yes (regenerate via collector) | Normalized fact/dimension tables (REQ-189, P2) |
runs/<run_id>.json |
Per-run manifest | Yes (regenerate from events) | Run lifecycle: stages, durations, exit, confidence, HITL (REQ-187) |
runs/<run_id>/ |
Durable run artifacts | Yes (regenerate from $WORK) | Persisted copies of pcr.json, signal.json, event.json, etc. (REQ-187) |
lifecycle/<module>-<env>.json |
Lifecycle report | Yes (regenerate from lifecycle runs) | Per-module apply/modify/destroy results (REQ-205) |
test-results.xml |
JUnit XML | Yes (regenerate via pytest) | Test results (REQ-187, P1 addopts) |
test-report.json |
JSON test report | Yes (regenerate via pytest) | Test results in JSON (REQ-187, P1 addopts) |
coverage.json |
Coverage report | Yes (regenerate via pytest) | Code coverage (REQ-206, P1 addopts) |
powerbi/ |
PowerBI export | Yes (regenerate via powerbi_export) | CSV/JSON views for PowerBI ingestion (REQ-190, P3) |
TRUST_SNAPSHOT.md |
Trust snapshot report | Yes (regenerate via trust_snapshot) | 5 trust metrics + chain-integrity verdict (REQ-211, P4) |
Backup + restore
Append-only state (events.jsonl, decision_ledger.db): these are
the source of truth. They should be committed to git (events.jsonl) or
snapshotted (decision_ledger.db). If lost, they CANNOT be regenerated —
the events they captured are gone.
Regenerable artifacts (nova_metrics.db, runs/, lifecycle/,
test-results.xml, coverage.json, powerbi/): these are derived from
the append-only state + the source signals (REGRESSION_REPORT.json,
$WORK/*.json, junit XML). If lost, re-run the collector
(core/metrics/collector.py, P2) to rebuild nova_metrics.db, then
re-run the PowerBI export (core/metrics/powerbi_export.py, P3) to
rebuild powerbi/.
Restore procedure:
- Recover
events.jsonl+decision_ledger.dbfrom git/snapshot. python3 core/metrics/collector.py→ rebuildsnova_metrics.db.python3 core/metrics/powerbi_export.py→ rebuildspowerbi/.python3 core/metrics/trust_snapshot.py→ rebuildsTRUST_SNAPSHOT.md.
Concurrency model
Single-writer per run: the run manifest writer is the only writer per
run. SQLite WAL mode + BEGIN IMMEDIATE prevents concurrent-write
corruption on the Decision Ledger (P1 risk mitigation).