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.