Relations pipeline — extract, triage, apply

Relations pipeline — extract, triage, apply A workflow diagram generated by Archify. 01 / Automated 02 / Human triage Extract Queue Triage Apply Close the loop extract_relations --apply · Automated › Extract · walk · prose → edges · noise-gated extract_relations --apply walk · prose → edges · noise-gated graph_edges · Automated › Triage · UNIQUE dedupe · symmetric=1 graph_edges UNIQUE dedupe · symmetric=1 follow-up chain · Automated › Close the loop · re-extract → roster sync → rebuild follow-up chain re-extract → roster sync → rebuild _pending_relations.txt · Human triage › Queue · prose misses · suggestions split _pending_relations.txt prose misses · suggestions split make triage-relations · Human triage › Triage · dedupe · split · bucket make triage-relations dedupe · split · bucket decide per row · Human triage › Triage · discard · alias · stub · skip · accept decide per row discard · alias · stub · skip · accept --apply-decisions · Human triage › Apply · aliases → json · accepts → edges --apply-decisions aliases → json · accepts → edges accept:s edges annotated jsonl bucketed decisions when stubs/aliases applied known targets re-extract resolves stubs non-noise misses prose rows Legend Agent logic Context / trace External system

Evidence origin/main e37eb7db

  • • extract: helpers/graph/extract_relations.py:100 noise gate · :110 sidecar
  • • triage: helpers/graph/triage_pending_relations.py:234 bucket · :487 accept
  • • G3 persist: triage_pending_relations.py:599 · suggestions: :618

Sidecar contract + G3 noise gate

  • • dry-run writes only the sidecar, zero edges; queue is append-on-miss, deduped
  • • noise never enters: countries/generic/fragment filtered at extract write time
  • • G3: discards persist to relation_noise.json — extract consults it, rows do not return
  • • triage splits link-prediction rows → _pending_suggestions.txt (never auto-applied)

Decision buckets (v2)

  • • discard | skip | stub | alias:<Entity> | accept:<edge_type>[:Target]
  • • word-overlap alias candidates carry a _confirm?_ marker (false-positive family)
  • • accept writes (source, target, edge_type) with source_ref='triage:accept'

Loop closure

  • • symmetric=1 stored rows: jv_with · same_group · competes_with · co_mentioned_in · semantic_peer
  • • aliases persist to relation_aliases.json (runtime-loaded — no code edits)
  • • after stubs/aliases: re-run extract → roster sync if stubs → graph-rebuild → snapshot