# CQR Query→Gold Causal-Path Audit — Summary v1

**SUPERSEDED by v2 (`path_audit_summary_v2.md`): this run used `cqr_datadir_pristine`, which the census addendum proved is the pre-lift snapshot, not the measured graph, and filtered the causal class on graph-level `edge_type` rather than `metadata.custom_edge_type`, silently missing all 646 `consequence`-tagged edges — see `path_audit_v2.json`.**

Descriptive artifact addendum to F-035 (`consequence-question-retrieval-findings-v0_1.md`, row 24 of `production-readiness-ledger-v0_1.md`). Carries no tier, does not reopen F-035. Full machine-readable output: `path_audit_v1.json`. Apparatus: `git_sha=5f849f9d220199f337421b0289a0f213dc60a6b8`, `datadir_copy_hash` verified unchanged before/after both passes, both passes byte-identical (`double_pass_identical: true`).

## Step 0 verification table

| Mechanic | Verified answer | Source |
|---|---|---|
| Seed set S(q) | `/activate/text/full`'s pre-propagation SDR/LSH-overlap activation (`ActivatedEngram.source in ("seed","both")`, equivalently `hop_distance==0` given the pinned `threshold=0.0`). **Correction:** the prompt's provisional attribution of `lexical_match_count`/`sdr_match_count` to this endpoint was wrong — those fields belong to `/activation/from_query`, a different endpoint `run_probe.py`'s own docstring marks "informational only, per R6." No internal ambiguity within `/activate/text/full` itself (pre-propagation activation>0 and hop_distance==0 are the identical set under the pinned config). | `engram_store.py:4050-4166` (`activate_text`), `activation_map.py:23-36` (`ActivatedEngram`), `run_probe.py` (pinned body + arm docstring) |
| Edge enumeration | Direct `msgpack.unpackb` of `edges.msgpack` (flat list of dicts: `source_id, target_id, weight, edge_type, metadata`) — no server, no `EngramStore` instantiation. No multi-relational sidecar file/flag present for this datadir. | `engram_store.py:6962-6983` (snapshot-write schema, confirmed by direct parse) |
| Edge-class names | **Correction:** no `consequence` `EdgeType` exists anywhere in the codebase or in this datadir's data. Verified `edge_type` values actually present: `semantic` (2771), `concept_relation` (699), `consolidated` (628). `NGRAMDB_CONSEQUENCE_EDGE_ENABLED` is a feature-flag name the prompt's provisional text conflated with an edge-type name. Causal class = `concept_relation` only (namespace C=435/S=264 within it; predicates mix causal-flavored `causes/depends_on/triggers/mitigates/prevents/enables/produced_by` and structural `contains/part_of/located_in/is_a/references`). | `models/__init__.py:95-112` (`EdgeType` enum); direct parse of this datadir's `edges.msgpack` |
| Gold node mapping | Engram ids are **not** in `gold_resolution_final.json` itself (a pointer file: `kept_pairs` list + notes only). 7 of 8 pairs resolve via `gold_resolution_v3.json`'s `gold_engram_ids`/`question_engram_ids`; pair 13 uses `cqr_probe_candidates_v3.json`'s `gold_engram_ids_scoped`/`question_engram_ids_scoped` instead, per `gold_resolution_final.json`'s own explicit instruction (pair 13's mechanical-raw resolution over-captured due to verbatim text duplication elsewhere in the source document). Concept bridge verified moot: `concept_relation` edges are written directly engram-to-engram (`_project_concept_relation_to_engram`); concepts are not nodes in this edge matrix at all. `enters_gold_via` is `direct_engram` whenever a path exists, never `concept_bridge`. | `gold_resolution_final.json`, `gold_resolution_v3.json`, `cqr_probe_candidates_v3.json`; `engram_store.py` `_project_concept_relation_to_engram` (prior-session finding, re-confirmed) |

**Two mutation vectors found and closed, not assumed away.** The first run attempt tripped the mandatory hash check: `export_map=True` (needed for seed extraction) fires `ActivationTelemetryEmitter.emit()`, writing `telemetry/activation.jsonl` into the datadir copy — closed via `NGRAMDB_ACTIVATION_TELEMETRY_ENABLED=false`. `.ready` is unconditionally rewritten with a fresh timestamp on every server startup regardless of query activity (no env gate exists) — excluded from the hash by name, justified by inspection: pristine's own `.ready` reads `engrams=0 edges=0` (frozen mid-ingest, before its own snapshot load completed); a fresh launch against the copy correctly writes `engrams=657 edges=4098` — a startup status marker, not a record of anything this audit's queries did. Every other file, including `edges.msgpack` and `engrams.msgpack`, hashed identical before and after both passes.

**One more finding, not a stop condition:** `cqr_datadir_primary` (the datadir the actual measured CQR result was queried against) has 413 more edges than `cqr_datadir_pristine` (4511 vs 4098, identical 657-engram corpus) — consistent with query-time auto-edge accumulation during the real measured run (`AUTO_EDGES_ENABLED` was left on in `run_probe.py`'s own query-time env). This audit uses `pristine` as the prompt explicitly instructs, which is the methodologically clean choice: it captures the graph as formed, free of edges created by the very queries this audit exists to explain. Path-existence findings here are a lower bound on what the actually-queried graph (`primary`) supports, never an overstatement.

## 8-row summary

| qid | pair | seeds (schema) | strict path? | min hops | strict paths ≤6 hops | via | relaxed min hops |
|---|---|---|---|---|---|---|---|
| 01_cloudflare_outage_2025-11-18.md | 01 | 403 (41) | yes | 0 | 12 | direct_engram | 0 |
| 02_gitlab_db_outage_postmortem_2017-01-31.md | 02 | 393 (42) | yes | 0 | 217 | direct_engram | 0 |
| 03_gitlab_issue_17057.md | 03 | 440 (46) | yes | 1 | 2 | direct_engram | 1 |
| 05_gitlab_issue_18596.md | 05 | 398 (40) | yes | 0 | 0 | direct_engram | 0 |
| 06_gitlab_issue_15999.md | 06 | 419 (43) | yes | 0 | 0 | direct_engram | 0 |
| 07_aws_s3_disruption_2017-02-28.md | 07 | 377 (39) | yes | 0 | 0 | direct_engram | 0 |
| 10_backstage_adr005_catalog_core_entities.md | 10 | 410 (44) | yes | 0 | 0 | direct_engram | 0 |
| 13_twilio_billing_postmortem_2013.md | 13 | 384 (38) | yes | 0 | 3449 | direct_engram | 0 |

**Plain facts, not interpretation:** strict causal paths exist within the 6-hop cap for all 8 probes. Seven of eight resolve at `min_hops=0` — the gold engram is itself a member of the pre-propagation seed set (no edge traversal at all). Seed sets are large relative to the 657-engram corpus (377–440 members, ~57–67%), which is the direct arithmetic reason 0-hop resolution is common. Pair 03 is the one probe where gold is reached only via traversal, not direct seeding: a single `concept_relation` edge (weight 0.5) at 1 hop, 2 total strict paths within the cap. Four probes (05, 06, 07, 10) have zero *non-trivial* strict paths (`path_count_within_cap` counts paths of depth > 0 only) — for these, gold is reached exclusively via being a raw seed, never via any `concept_relation` edge from any seed, within 6 hops. Relaxed (any edge type) never finds a shorter path than strict in this data — min_hops is identical between strict and relaxed for all 8 probes.

The discrimination-vs-linking reading of this table, and any v0.3 manuscript footnote, are the operator's decision, not made here.
