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:

  • many says 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 every docs/notes/tags/*.md page stopped being written. That is LU-#276, fixed in 0.24.0, and this record is the case it was found on.
  • primary_topic follows paper too, not this document’s own derived tags. Derivations do not chain — one hop, reading written frontmatter — so a primary derived from a derived list resolves to nothing on every note.
  • NOTE.paper declares no invariant. 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:

relationjoinsunbound on tags
NOTE.papera reading → the paper read4 / 158 (3%)
SOTA.introduced_bya practice → the paper that first stated it45 / 220 (20%)
THEORY.sourcean explanation → its paper4 / 19 (21%)
SOTA.sourcea practice → its evidence67 / 298 (22%)
SOTA.contested_bya practice → a paper against it4 / 13 (31%)
SOTA.explained_bya practice → why it works7 / 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: tags on NOTE.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 reason published: 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 source and introduced_by too. 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_by alone. 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_topic rather than tags for 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-stability added beside analysis-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-techniques made primary, model-architecture kept 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-pipeline added beside vision-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-optimization made primary, attention-techniques kept 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.