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.
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