The record index — the findings register¶
What it is. One row per record file under outputs/, and one row per rule statement in canon. It exists so that a brief can be drafted against what is already held, instead of re-deriving it. Filed 2026-09-16 under CANON-RETRIEVAL-01.
Why it exists, measured. RETRIEVAL-RECON-01 (da451bc536555997) found five re-derivations of already-closed work in a single day: CVIG-URI-MAP-01 re-derived the file-to-URI join that CVIG-CENSUS-01-G1-JOIN-r2.json had closed a week earlier; a window used bare lower() for a week after canon filed the key rule; three false alarms were raised comparing artefacts of different kinds. The cause was never missing records — 6,362 files in 93 folders — but that nothing indexed them. The register is the index.
Where it lives¶
| what | path |
|---|---|
| the register | outputs/_index/findings-register.tsv |
| the instrument | scripts/record-index-02.py, sha256[:16] d8c1349d5c68f3ee, 19,351 B |
record-index-01.py (168ca4af00991156) is the predecessor, kept because closed briefs cite it; superseded 2026-09-17 by RECORD-INDEX-FIX-01.
Regenerated as part of every record commit's close, so it never lags the record by more than one close. It is regenerated after the close's other commits, from a clean tree: the instrument counts tracked files whose bytes differ from HEAD (DIRTY) and a register made at DIRTY>0 is not committed, and the instrument exits non-zero, leaving no file under the committed name, when its acceptance fails, the tree is dirty, or a row has no commit time. It is emitted by the instrument and never hand-edited (DIGEST-IS-MEASURED-OUTPUT-01); a hand-corrected row is a row that disagrees with the file it describes.
The twelve columns¶
| column | what it holds |
|---|---|
path |
repo-relative path — the file for a record row, the canon file for a CANON row |
folder |
the containing folder, . at outputs/ root |
bytes |
the file's byte count, from its bytes — never a character count |
sha256_16 |
first 16 hex characters of the file's sha256 |
committed_utc |
committer time, UTC, %Y-%m-%dT%H:%M:%SZ, of the last commit that touched the path; a fact about the commit, identical in every checkout. Replaced mtime_utc on 2026-09-17: a file-system time differs between checkouts of the same commit and rewrote ~1,500 rows on every window switch. |
class |
BRIEF · VERDICT · RULING · CLOSE · GATE5 · JSON-CLOSED · CANON |
matched_by |
prefix · suffix · json-closed · heading · lead-in |
brief_id |
the brief the file belongs to; ? where none parses, and ? on every CANON row, because a canon line belongs to no brief |
rule_id |
the rule id or ADR number a canon row names; empty, never ?, where it names none |
kind_line |
a record file's Kind:/DESTINED FOR: line; line=<n> on a CANON row |
first_heading |
a record file's first # line; the heading or lead-in text on a CANON row |
closes |
1 where the row closes something, else 0 |
The two populations¶
The record. Every file git tracks under outputs/, excluding by path: outputs/_index/ (the register's own home) and outputs/retrieval-recon-01/ (the parent recon's desk). Files that match no class rule are the remainder, and classified + remainder = the population (MEASUREMENT-NAMES-ITS-POPULATION-01). An uncommitted file is a draft, not the record; it gains its row when it is committed. The same commit therefore gives the same register from any checkout — proved at RECORD-INDEX-FIX-01 Gate 2 against a fresh clone.
Canon. Every ##/### heading and every bold lead-in in five files: standing-rules.md · tga-data-model.md · architecture-decisions.md · store-register.md · glossary.md.
Lead-ins are indexed because that is how canon states its rules — measured, not assumed: 319 headings against 1,990 lead-ins. Headings name where a rule was earned; lead-ins carry what it says. An index of headings alone cannot find the key rule, whose heading is "Built by INGEST-02 — three of these families are now rows".
The class rules, as filed¶
Applied in this order, first match wins:
- Prefix pass — basename starts
BRIEF-→ BRIEF;VERDICT-→ VERDICT;RULING→ RULING;RULE-→ RULING. - Suffix pass — basename carries, as a delimited word, tested in this order:
BRIEF·VERDICT(S)·RULING(S)·GATE-5/GATE5·CLOSE·RULE.
RULE is tested last, after GATE-5 and CLOSE. R-RR-5 rules that a Gate-5 file mentioning close is a Gate 5; by the same principle a Gate-5 file mentioning RULE is a Gate 5. Tested earlier, the token reclassified STANDING-RULE-7-SCOPE-01-GATE-5-CLOSE from GATE5 to RULING — a Gate-5 close demoted because the brief's subject happened to be a rule.
3. JSON pass — a .json whose text carries "closed": true → JSON-CLOSED.
4. Everything else → the remainder.
The rulings this encodes (RETRIEVAL-RECON-01 and CANON-RETRIEVAL-01, 2026-09-16):
- R-RR-1 — the class rules have a prefix form and a suffix form, and
matched_bykeeps the two sets distinguishable. The suffix form is not decoration: it is 1,177 of the classified rows, because the lane-era record puts the class word last (A1-CORPUS-01-GATE1-VERDICT-2026-08-15.md). - R-RR-2 — in a basename, a token matches as a delimited word only, bounded by
-,_,., start or end.BRIEFdoes not matchBRIEFING. - R-RR-3 — a file carrying a class word is a record file even when no id parses.
?is the honest id; no rule is invented to make it parse. - R-RR-4 — the register's own home and the parent recon's desk are excluded by path, so the register never indexes itself.
- R-RR-5 —
GATE5is tested beforeCLOSE: a Gate-5 file that mentions close is a Gate 5. - R-RR-6 — the canon population is headings plus bold lead-ins.
- R-RR-7 — a canon row stores its whole span, never truncated. Truncation had cut five spans, two carrying rule ids, one of them a ruling cited from canon by path — and a truncated span is a silently unsearchable row.
- R-RR-8/12 — a lead-in's text is read across line breaks, to its closing
**. In canon's own key rule the wordsnever lower(code)sit on the line after the one that opens the statement. For querying the register, the word boundary is any non-alphanumeric character — R-RR-2's delimiter set was written for basenames, which carry no spaces or brackets. - R-RR-9 —
rule_idis populated where a canon row names a rule or ADR and empty where it does not, so canon rows are queryable by id where one exists and by text where not. - R-RR-11 —
RULEis a class token in both passes, mapped to RULING. Without it the register could not findRULE-MEASUREMENT-CARD-01, the source of a clause instanding-rules.md.
What the register is for, and what it is not¶
It is a recall instrument, not a precision one (R-RR-12). The acceptance is that the genuine row is in the hit set, with the hit count reported beside it. A query for the key rule that returns the key rule and one sentence of ordinary English containing the word "lower" has succeeded: the drafter reads two rows instead of re-deriving a week of work. A query that returns nothing has failed. The genuine row is named by path and by the opening words of its text, never by line number: a line number moves whenever canon above it is edited.
It indexes, it does not adjudicate. A row says a file exists, what class its name puts it in, and what its first heading says. It does not say the file is current, correct, or still in force. Supersession lives in the documents.
It cannot see what is not written. Canon is indexed for five files only, and a rule stated in prose rather than as a heading or a bold lead-in has no row.
Related¶
RECORD-DIRECTORY-01 (standing-rules.md) — outputs/ is the record, and this index is what makes it findable. Prior art in "What a brief is" — the section that requires a brief to query this register before it is drafted.