Context
A NOTE’s status says how deeply a work was read, and a LIT’s status says whether the work was reached. The two are recorded separately, and nothing checked that they agree. A survey of authors on 2026-11-01 found NOTE-1437 on LIT-536, which is Unfetched, and reported it as an inconsistency. The owner asked for a rule in the luria config to flag that sort of thing.
The note is not an inconsistency. It is Skimmed and covers “the
Introduction alone”, and the note-statuses vocabulary defines Skimmed as
“abstract, figures and selected sections”. Eight notes in the record are
like it: each is a skim of a précis, an introduction or an excerpt of a
work whose full text was not reached. The contradiction the vocabularies
do define is narrower. Read is “the full text, closely enough to state
its assumptions and results exactly”. Unavailable (ADR-041) and
Unfetched (ADR-053) both say the full text was not reached. A Read
note on such a work means one of the two records is wrong. So does a
Read note on a Deferred LIT, which lit-statuses defines as “not yet
read closely enough to place … or reading stopped at the abstract or a
skim”.
Decision
Three patterns are declared with report: true and listed in
lint.fail_on:
read_but_unreached:
match: "(n:NOTE {status: 'Read'})-[:paper]->(l:LIT {status: 'Unavailable'})"
read_but_unfetched:
match: "(n:NOTE {status: 'Read'})-[:paper]->(l:LIT {status: 'Unfetched'})"
read_but_unreviewed:
match: "(n:NOTE {status: 'Read'})-[:paper]->(l:LIT {status: 'Deferred'})"They are three patterns because the pattern grammar matches one literal per property. When one fires, the fix is one of two:
- The work was read in full. The LIT is placed: it returns to reading, as the Unavailable and Unfetched blurbs already say a supplied copy does, and its status note is updated.
- Only part was reached. The note is
Skimmed, and its summary says which part.
A pattern-ok: directive in the note can excuse a match, as for the
ADR-057 checks. It is not expected to be needed.
Verification
The record as of this decision pairs note and LIT statuses as follows:
Read with Active, Proposed, Rejected and Superseded; Skimmed with Active,
Deferred (3), Unavailable (4) and Unfetched (4); Superseded with Active.
No Read note sits on an Unavailable, Unfetched or Deferred LIT, and
pattern_rules.reported() returns no match for any of the three patterns. In a scratch copy with NOTE-1437 and NOTE-832 set
to Read, it returned read_but_unfetched: (NOTE-1437, LIT-536) and
read_but_unreached: (NOTE-832, LIT-1004).
Alternatives considered
- Flag every note on an unreached work. This was the first proposal. It flags eight skims that the vocabularies allow, and each would need a directive to say so.
- A warning rather than a failure. The ADR-057 checks fail CI because they were at zero when adopted, and this is at zero too. A warning would let the first contradiction land.
- Derive the LIT’s status from its notes. A LIT’s status records a search for a copy, and a note doesn’t. Neither can be computed from the other.
Consequences
A filing that reads a work in full, but forgets to move its LIT off
Unavailable, Unfetched or Deferred, now fails docs-check. Skims are
untouched: a Skimmed note may sit on a LIT of any status.