Context
luria 0.23.0 made it possible to assert a shared field across a scheme
boundary, and this record has six relations that cross one. The first version
of this decision declared invariant: tags on NOTE.paper and left the other
five alone, on the argument that a note and its paper are the same object
while the other five join two things filed on different axes.
The argument was right and the mechanism was wrong. Review:
given that a note and its paper are the same object, rather than specifying an invariant (an “at least one” similarity), I feel like it would be more appropriate to use a derived field.
If the two ends are the same object, the note should not assert a similarity
to its paper. It should not have a subject of its own at all. NOTE.published
has been derived from paper since #119 for exactly this reason, and the
argument does not stop at the date.
Decision
NOTE.tags and NOTE.primary_topic are derived from paper.
tags:
derive: '{tags}'
from: paper
many: true
primary_topic:
derive: '{tags[0]}'
from: paper
A note carries no tags: line; writing one is a lint violation, like
published:. To change what a reading is filed under, retag the paper.
Three details that are load-bearing rather than incidental:
manysays this holds the paper’s whole list, and luria checks it against LIT. Omitting it used to be silent — the value resolved as a list against a contract saying one value, which reads as no values, and everydocs/notes/tags/*.mdpage stopped being written. That is LU-#276, fixed in 0.24.0, and this record is the case it was found on.primary_topicfollowspapertoo, not this document’s own derivedtags. Derivations do not chain — one hop, reading written frontmatter — so a primary derived from a derived list resolves to nothing on every note.NOTE.paperdeclares noinvariant. With the tags derived it could never fire, and a check that cannot fire is worse than none.
No cross-scheme relation in this record asserts an invariant, and the survey is why. Measured over all six before any change:
| relation | joins | unbound on tags |
|---|---|---|
NOTE.paper | a reading → the paper read | 4 / 158 (3%) |
SOTA.introduced_by | a practice → the paper that first stated it | 45 / 220 (20%) |
THEORY.source | an explanation → its paper | 4 / 19 (21%) |
SOTA.source | a practice → its evidence | 67 / 298 (22%) |
SOTA.contested_by | a practice → a paper against it | 4 / 13 (31%) |
SOTA.explained_by | a practice → why it works | 7 / 15 (47%) |
The other five join two things this record files on different axes on
purpose. ADR-026’s rule: a practice takes the topic of the claim it
makes, a paper takes the topic of what it is about. A practice extracted
from a vision paper about a training technique is training-optimization
under a vision-and-graphics source, and that is the rule working.
explained_by settles it at 47%: a THEORY is pulled toward
analysis-and-evaluation by the vocabulary itself — “theory, interpretability
and debugging belong here too” — while the practice it explains is filed by
subject. ADR-036 already named this as the third of its four categories over
the same-scheme chains, and all seven findings are that.
Alternatives considered
- Assert the agreement with
invariant: tagsonNOTE.paper. What this decision replaced. It reports a disagreement that should not have been possible, and it leaves the note’s tags as a second home for a fact with one source — which is LU-ADR-089’s argument upstream and the reasonpublished:is already derived. A report is the right shape for a judgement call; this is not one. - Derive the tags and keep the invariant as belt and braces. It can never fire, so it would say the record checks something it does not.
- Declare an invariant on
sourceandintroduced_bytoo. 20-22% is not an absurd rate, and these are the relations the unbound-lineage report was imagined for. It loses on what the findings are: read individually in LU-#272 they were four kinds — multi-topic model reports, practices resting on analysis papers, the domain-vs-kind filing rule working as designed, and a minority of genuine mis-filings. A check whose majority finding is the record doing what it decided to do trains the reader to skip the report, which costs the minority that were real. - Declare it on
contested_byalone. The best constructional argument of the five — a paper cannot contest a practice without being about the same thing. Thirteen edges cannot distinguish a 31% rate from a 15% one, so the honest answer is not enough evidence. Revisit if it grows. - Use
primary_topicrather thantagsfor the derivation. Both are derived, so this is a question about what a note’s tag list is. The paper’s whole list, because a note’s index entry should sit under everything its paper does — anything narrower would make browsing the readings disagree with browsing the papers, which is the class of disagreement this decision is removing. - Status quo. The note keeps its own tags, four of them contradict their papers, and nothing says so.
Consequences
tags: is dropped from all 158 notes and from record/notes.d/_template.md.
The reading list’s tag pages are now a projection of the papers’, which is
what they always claimed to be.
The four disagreements had to be resolved in this contribution, not after it. Under the invariant they were findings that could wait; under the derivation the note simply adopts the paper’s tag and the evidence disappears — and two of them are the only reason anyone noticed the paper was wrong. Each is fixed by reading the record’s own note, and each keeps the old topic rather than replacing it:
- LIT-014 Visualizing the Loss Landscape —
model-stabilityadded besideanalysis-and-evaluation. NOTE-008 filed it under stability and the paper is both: filter normalization is a measurement method, and what it establishes is why skip connections are needed at depth. THEORY-011 reads it as the stability result. - LIT-024 multi-query attention —
attention-techniquesmade primary,model-architecturekept second. NOTE-016 filed it under attention and ADR-026’s rule agrees: the claim is most about an attention variant. - LIT-096 Segment Anything —
data-pipelineadded besidevision-and-graphics. NOTE-018 says why in its own words: “nothing in the loop is about masks”. The model is the segmentation contribution, the three-stage data engine is the transferable one. - LIT-112 vLLM and PagedAttention —
inference-optimizationmade primary,attention-techniqueskept second. The blurb names serving-time cache layout in as many words, and the title says serving.
Two of the four are reorderings and two are additions, and the rule is the same one for both: ADR-026’s — the topic the claim is most about goes first. Applied honestly to each, it agrees with what the reader of that paper independently chose in exactly the two cases where the paper was wrong read alone, which is the evidence rather than a coincidence.
This is not #101’s move. That bound a pair by giving both documents a
flash-attention tag invented for the purpose, which ADR-036 calls
satisfying the check rather than answering it. Here every added topic is one
of the thirteen, chosen independently by a reader of that paper before any
check existed.
docs/reports/unbound-lineage.md goes back to 22 unbound relations — the
two same-scheme chains’, unchanged — and the NOTE.paper rows are gone
because the disagreement they reported is now unrepresentable.
Left open: a note can no longer say the paper is filed wrong. That was never its job, and it was doing it by accident, but it was the only mechanism the record had for noticing — and four of 158 is a rate worth having had. What replaces it is that retagging a paper now moves its reading automatically, so the cost of fixing one is lower than the cost of noticing one used to be.