The v2 graph's edge vocabulary does not mean what it says β one edge type carries three unrelated relationships, a merge routine repoints edges onto nodes their own name forbids, and nothing validates the (edge_type, source node_type, target node_type) triple at any point in its life.
Order: user-visible wrong edges first, then stale-content surfaces, then structural write/read gaps β and within a cohort by priority (p1 β p2 β p3) then oldest-first. It ignores what blocks what (GitHub carries no dependency edge we populate), how long anything takes, and which commitment an issue serves. The 08-14 ruling applies on top: the upsert deadlock (#3307) does not outrank the rest of the track.
Rounds 1+2 censused 59 live edge types and adjudicated 58 (ORGANIZED/ORGANIZED_BY held back β a design decision, not a defect). Round 2 changed what the track is about: round 1 found wrong edges, round 2 mostly found wrong readers β contracts honoured by one consumer and silently absent from another. Six defects fixed and live: D1 (connection resolver dropped all 109 MATCHES_OPPORTUNITY_CAPABILITY rows β #3104), D5 (reconciliation retyped pinned edges β #3098; forward-only, 41 rows still wrong), D10 (intent-less AMA traversal hit the DB unfiltered β #3097), D13 (completed actions listed as open β #3114), D14 (met needs / resolved problems offered as open β #3120), D21 (skill 2-hop dispatched for three types its SQL can never match β #3246).
Stage 2 (#3160, issue #3140) landed the contract, the consumer half, the attribution vocabulary and the reader census as one release with nine choke-point rows. Its third adversarial panel β run after the fixes β found six more defects plus the same comment-stripper failure in three security gates, all previously failing open.
The AUTHORED split (ADR-143, accepted 08-07) minted MENTIONED_ENTITY for the entity-mention meaning. Stage 5a shipped across #3129 (reader prep), #3210 (remaining readers + intent-map reachability), and #3222 (the flip + reclassification). 5a-live, measured on prod after the deploy: AUTHORED now means authorship in 100% of its rows (was 1.3%); MENTIONED_ENTITY 16,169, AUTHORED 2,303, rollout residue 0; the producer was OBSERVED writing the new spelling (14:40β14:48Z, Regina). A 4-lens panel before merge found silent data loss in the migration: the DELETE lacked the UPDATE's collision guard, so a row committed between the two statements was destroyed and counted as a duplicate. Also fixed: a provenance merge, a guard test that was vacuous by execution, and a MENTIONED_ENTITY label missing from both locales. The 2c nightly gate's runner was structurally dead since 2026-05-13 (87 "success" runs, 0 rows) and was repaired (#3225); 2c's precondition is a row in invariant_runs, not a green workflow run.
D6 ANSWERED direction diverges from ADR-071 (1,957 rows) Β· D7 ATTACHED_TO/CALLED have live producers and zero rows Β· D8 8 dead enum members + a wrong types.py header Β· D9 fetchPersonEdges shares one LIMIT 200 across all 15 edge types Β· D11 personal names typed node_type='company' (β₯3 in ~140 sampled) Β· D12 intent matcher fed the entity name, not the query (1f β the obvious fix activates a banned English lexical matcher, needs an ADR) Β· D15 ATTENDED_BY 7,482 rows, zero consumers Β· D15b use-entity spreads OUTGOING unfiltered β 404 links Β· D16 INVOLVED_IN 309 rows, no consumer Β· D17 MEMBER_OF 731 rows drive access-control, unreachable from any surface Β· D19 MANAGER=REPORT=124 exactly (one few-shot example mints both); PARENT/CHILD drift 33/5 Β· D22 match cards render a 0.70 guess identically to a 1.0 match (1j, unblocked, cheap) Β· D23 pending_attribution silent data loss (surfaced above, unfiled) Β· D24 SHARED_JOB_POSTING 259 rows, zero readers Β· D25 INVOLVES_SKILL has no producer, types.py claims otherwise. Not-started stages: 2c nightly drift gate (use created_at DESC, never ORDER BY id β edges_v2.id is a random v4 UUID), 3 comment + dead-code corrections (trivial), 5b/5c/5e/6 (retyped targets, the six render surfaces β narrower than the plan implies after the flip β the shared 200-row budget, corrected-vocabulary consumers).
The unique index is (tenant_id, source_id, target_id, edge_type) β a unique index with no named constraint. edge_count triggers fire on INSERT and DELETE only, so an edge_type-only UPDATE leaves the counter untouched. No live SQL reads AUTHORED at all (zero function bodies, views, matviews). Measured 08-08 21:00Z in one snapshot: AUTHORED 2,312 rows / 12 tenants (answer 2,048, document 264), MENTIONED_ENTITY 16,231 / 17 (company 7,811, location 4,639, product 3,414, project 367), edges_v2 173,417 / 22. The migration moved 16,169 (16,166 predicted + 3 minted, the ~400/day rate). The contract still holds against the live producer: zero rows of either type outside their declared target set. The six-vocabulary survey undercounted β the stage-2f census found more, and by 08-08 register_attribution_vocabulary is called 10 times with _UNCONVERTED_FORKS at zero.