Context
code.globs was src/**/*.py and nothing else. The stated purpose of code
scanning is that “a decision number in a code comment is the strongest form
of the claim being checked — it is the stated reason the code is shaped that
way”. By that argument luria.yaml should have been the first file in the
list and was not in it at all.
It is the most decision-dense file in the repository: 87 code citations
across 38 distinct documents, and essentially every one of them is a “this
is why the schema is shaped this way” claim — why tags is closed, why
primary_topic derives from position, why a note holds no topics of its own.
Unscanned, they rotted. Adding the glob surfaced, in that one file:
- 15 citations in a concretized code’s old spelling. The temporary code that became ADR-035 appeared ten times — it was numbered when #140 merged, and all ten had been dead since. Four more decisions were cited by their old spellings too — ADR-025, ADR-029, ADR-031, and ADR-038 twice, written earlier today and stale within the hour.
- Two citations of a luria decision by its temporary code, numbered upstream as LU-ADR-084. A remote’s temporary code goes stale the same way and there is no local merge to fix it.
- Seven documents cited while Superseded or Proposed, which on reading are all deliberate.
Concretization does fire here — LU-ADR-049’s rename runs on push to main, and numbered ADR-038 an hour before this was written. It rewrites the record. Nothing was rewriting the config, and nothing was reporting that it had not been.
Decision
luria.yaml and .github/workflows/*.yml are in code.globs, which is
the pair luria scans for itself.
The workflows carry six citations against the config’s 87, and all six are
remote LU- codes naming the upstream decisions that shape the pipeline, so
adding them surfaced nothing. That is the point of adding them anyway: the
cost of covering a file before it rots is one line, and the sixteen dead
citations below are what covering one afterwards costs.
Every stale citation is corrected in the same contribution: fifteen temp codes
to their concretized numbers, and the luria one to LU-ADR-084. A sixteenth, in record/decisions.d/ADR-038.md, cited luria’s decision on derived fields without
the LU- prefix, so this record read it as a local decision that does not
exist; it is now LU-ADR-089, which is how ADR-022 already spells the same
citation.
The surviving citations are acknowledged once, at the file level, naming
each code. Three are Superseded and the config names them as history — the
vocabulary’s growth is narrated in prose that says “ADR-027 added
analysis-and-evaluation; ADR-026 then added … superseding ADR-020”. The rest
are Proposed, which in this record is the resting state of a decision nobody
has moved rather than a sign the schema rests on something unsettled: sixty
documents are undecided.
Alternatives considered
- Leave it unscanned: a config is data, not prose. This is the reason it was never added, and it does not survive the measurement. 87 citations is not data — it is the densest commentary in the repository, and the check’s own justification is about comments that state a reason, which is exactly what these are.
- A directive per citing site. Nineteen directives each saying the same sentence. The file-level one names every code explicitly, so it still vouches for something specific rather than blanket-silencing the file.
- Add the glob without fixing the findings. Turns on a check and leaves it red, which trains the next reader to ignore it.
- Status quo. The config keeps accumulating dead references at roughly the rate the record makes decisions, and nothing says so.
Consequences
luria lint returns to the same seven pre-existing warnings it had before
this change — all in other files, none introduced here. The workflows add no
findings at all, now or, with luck, later.
A directive is read from its own line, so many codes want many
directives. The first version here named nine codes across two wrapped
lines, suppressed the four on the first and left five warning with no
indication why. Filed upstream as LU-#278 and closed there: supporting a
continuation line is not worth it, and a file-wide acknowledgement is not
position-sensitive, so there is no cost to writing several. The
acknowledgements in luria.yaml and on this document are now two each, split
by why — Superseded and named as history, or Proposed and merely unmoved —
which reads better than one line carrying eight codes and is the grouping the
prose wanted anyway.
That answer comes with a question worth keeping: if acknowledgements start accumulating codes faster than they can be explained, the thing to ask is why so many retired documents are being cited from one place, not how to fit them on a line.
What this change bought and did not say (v3). luria concretize
rewrites every occurrence of a renamed code in doc_files() and in every
file matching code.globs. Adding luria.yaml to that list therefore did two
things, and this decision only claimed one: the lint reads the config, and
concretization now repairs it. Measured on 2026-09-22 — a scratch decision’s
temporary code, written into luria.yaml both bare and inside backticks, came
back as the numbered code on both counts.
That matters because the record subsequently drifted to the opposite belief. A comment written into this very file on 2026-09-22 asserted that a temporary code here “would go stale with no mechanism to fix it”, and cited this document for it. The Context above is accurate history — nothing was rewriting the config, before this decision. The Consequences never recorded that the decision itself ended that, so a later reader (this one) took the Context for the current state.
And the backtick theory is half wrong. The record has been repeating,
since 2026-09-21, that concretization “does not reach inside backticks”. It
does: _rewrite_files is a plain string replace over whole file contents.
What cannot reach inside backticks is luria link --fix, which upgrades a
bare already-concretized code and leaves both `ADR-tmpxxxxx` and a
hand-written [ADR-tmpxxxxx](ADR-tmpxxxxx.md) untouched — also measured. The
two commands were conflated, and the citations that needed hand-fixing on
2026-09-21 and 2026-09-22 were cross-branch codes with no pending rename for
concretization to apply (#211), which is a different defect from the one
the record named.
Left open: a remote’s temporary code has no mechanism at all. Concretization fixes local temp codes where merges serialize, and a citation to another project’s unconcretized code simply dies when that project numbers it. The lint now at least reports it as unresolved, which is how this one was found.