Ticket graphs

Every ticket as the root of its provenance graph — goal, patch, approval, runs and (as the ticket-class build lands) mandate, manifestations, guarantees, journey, artifacts and children. Rendered through the <<<TicketGraphList>>> tag.

← all ticket-graphs

DONE#159 congruency

Tag asset self-check harness: every tag's disk/db dependencies, verified on an ongoing basis

goal

Build checkouts/current/congruency/tools/tag_selfcheck.py — the self-check system for tag asset dependencies. WHY (the pattern, twice now): tags reference content on disk that no test exercises — OmniExplorer/ForgeView/ShadowForge/MemGraph pointed at a retired forge home and silently errored; RepoDocs renders 'No repo documentation ingested yet' because its backing table is empty. Required behavior (tester proves each): (1) Enumerate every tag under checkouts/current/congruency/invocators/tags/dev/*.php and extract its dependencies: external sqlite paths (the getenv('X') ?: default pattern — parse BOTH the env name and the default path), CONGRUENCY_SQLITE tables it SELECTs from (parse FROM/JOIN table names out of its SQL strings), and db-stored disk paths (repos.forge_remote values for TreeView). (2) VERIFY each dependency: external db path exists AND opens as sqlite read-only (use immutable=1 — WAL dbs create sidecars under plain mode=ro, see playbook); referenced tables exist in the relevant db; tables that being EMPTY makes the tag render its empty-state (repo_docs, repos, code_blobs) are reported as WARN with the tag named; every repos.forge_remote path exists on disk. (3) Render every tag standalone over HTTP (?page=tags&tag=NAME on 127.0.0.1:8899) and FAIL any whose output contains a PHP Fatal/Warning/Parse error. (4) Output a labeled report (tag, dependency, status OK/WARN/FAIL, detail); exit 0 all-OK, 1 any FAIL, 0 with warnings listed for WARN-only. (5) --file-tickets mode: POST one de-duped bug ticket per FAIL via rest.php ticket.create (X-Api-Key from ../.secrets/ats.env relative to repo root, like pair_loop), skipping tickets whose title already exists among open tickets. (6) Pure python stdlib, one file, registry walk-up per note-for-claude, read-only against every db it checks. Prove: run it against the live tree — it must report the currently-empty repo_docs as WARN naming RepoDocs, all forge dbs as OK at the canonical config home, and all tags rendering clean.

patch

none

approval

unapproved

runs

no runs recorded

mandate (clauses)

not yet recorded — lands with the ticket-class build

manifestations

not yet recorded — lands with the ticket-class build

guarantees

not yet recorded — lands with the ticket-class build

journey (blunders & successes)

not yet recorded — lands with the ticket-class build

artifacts (forge)

not yet recorded — lands with the ticket-class build

source (forge tree)

browse congruency source (forge-parked tree)

children

#161 Ingest repo docs: repo_docs is empty (RepoDocs + SemanticSearch render empty-states) (spawned · DONE)