Skip to content

The record line is a table - #199

Merged
dmarx merged 3 commits into
mainfrom
claude/record-line-table-e6evzh
Sep 7, 2026
Merged

The record line is a table#199
dmarx merged 3 commits into
mainfrom
claude/record-line-table-e6evzh

Conversation

@dmarx

@dmarx dmarx commented Sep 7, 2026

Copy link
Copy Markdown
Owner

My complaint was that the frontmatter fields were rendering on a single line, separated only by a center dot. I think a table would probably look nicer.

Agreed, and it reads far better. LIT-140, before and after:

Before

> **Status** Active · **Filed** 2026-09-05 · **Extends** LIT-141 ·
  **Extended by** LIT-151 · LIT-181 · **Compared against** LIT-152 ·
  **Supersedes** LIT-141 · **Cited as `source` by** SOTA-136

After

| | |
|---|---|
| **Status** | Active |
| **Filed** | 2026-09-05 |
| **Extends** | LIT-141 |
| **Extended by** | LIT-151 · LIT-181 |
| **Compared against** | LIT-152 |
| **Supersedes** | LIT-141 |
| **Cited as `source` by** | SOTA-136 |

One line of **Label** value reads acceptably at three facts and not at eleven — it becomes a paragraph of bolded fragments a reader has to parse before they can scan. A table gives every fact the same shape and puts the labels in a column. The center dot keeps its job inside a cell, where it separates peers (two contesting papers, three sources) rather than separating kinds.

Header-less on purpose (| | |) — "Field" and "Value" name nothing a reader did not already know from the rows.

On note-properties — it can't do this job

Maybe this is a quartz setting? Probably this: quartz.config.default.yaml#L225-L241

Two reasons that's not the lever, and the second is the interesting one.

It's a v5 plugin; actions/site pins v4.5.2. The action's own input docs already say why the pin is deliberate: "luria site writes a quartz.config.ts against this version's plugin API, and v5 replaced that file with a YAML one." ~110 lines of generated TypeScript config and layout would need rewriting as YAML.

A properties panel shows the page's own frontmatter — and that's the smaller half of this line. The plugin's README describes it as "a visible properties view on the page, similar to Obsidian's properties panel." What's actually on LIT-140's record line:

bit where it comes from
Status this page's frontmatter, but composedSuperseded — by X; note is three fields read as one reading
Extends, Compared against this page's frontmatter, as resolved links rather than bare codes
Supersedes another document's superseded_by:
Cited as \source` by` a backlink — every page naming this one

A panel over this page's YAML renders the first row as Superseded and the second as the literal string LIT-141, and cannot render the last two at all — it has no reader for other documents. Enabling it would put a raw-YAML block beside the record line, not replace it.

So they aren't alternatives. Upgrading Quartz is worth doing on its own merits — five versions of upstream work, the v5 plugin ecosystem — and I'm happy to take it as its own piece; it just doesn't bear on this complaint, and record_line needed to be a table either way.

The change

record_line and its two helpers built formatted strings (f"**{label}** {value}") and joined them; they now build (label, value) pairs and one _table renders them. That's the whole diff — the mechanical cost of having had formatting and content in the same expression.

Twelve assertions moved from "**Label** value" to "| **Label** | value |", and three stopped assuming the blockquote it no longer is. That count is a fair measure of how load-bearing the shape was, and worth knowing before anyone changes it again.

record_line is called in exactly one place, inside stage, so this only shapes the staged Quartz vault — the record files in the repository are untouched, and nothing about how they read on GitHub changes.

Checks

python -m pytest tests -q924 passed. luria link --fix, luria index, luria lint → clean. Rendered against the anthology's real corpus (346 record lines staged).

Stacked on #195, whose commit is included here until that merges — this branch is ac6d672 plus one commit.

🤖 Generated with Claude Code

https://claude.ai/code/session_01YP4P3m8rzVFb8idnTE4FfT


Generated by Claude Code

Reported from the outside — "frontmatter renders funny on the quartz site
luria builds" — and it was two duplications, each an addition meeting an
assumption that had been true when it was written.

`record_line` has always rendered the status through `statuses.display`.
#181 made `status:` an ordinary declared vocabulary, so the generic
vocabulary loop began rendering it too, and since #181 requires the
declaration this fired on every document of every scheme in every record.
The dedicated path wins: it is the only one that composes
`Superseded — by X; note` out of the fields around the word. The vocabulary
loop's version linked the word to its value page, which is a real gain and
is filed separately rather than smuggled into a fix.

`_edge_bits` renders inbound edges for, in its own words, "the one direction
the site otherwise loses, since frontmatter renders as nothing". A declared
converse stores the fact on both documents, so nothing is lost and the
backlink became a second printing under a label built from the raw field
name — LIT-140 named LIT-141 three times on one line. Suppressed by what the
page actually holds rather than by the declaration alone, so a record with a
one-sided relation still shows the edge it has while the lint reports it.

Neither was visible to a test: the existing assertion is
`"**Status** Active" in line`, and a substring test is satisfied by two of
them. The new ones count.

Fired on the real corpus rather than a fixture. Staging the anthology's 353
record lines with both builds: 692 status bits become 346, exactly halved,
and 86 backlinks become 74. The twelve that go are every relation with a
declared converse; the 74 that stay declare none and have no other way to be
seen.

Also corrects two citations left in a concretized code's old spelling. The
lint's remedy text says `luria link --fix` upgrades them, and for these two
it cannot: one is in a Python docstring, the other inside a fenced
illustration the fixer correctly masks.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YP4P3m8rzVFb8idnTE4FfT
…ackfill-e6evzh

# Conflicts:
#	docs/devlog/2026-09.md
#	docs/devlog/README.md
Eleven facts on one line separated by center dots read as a paragraph of
bolded fragments, not as metadata. LIT-140 was the worst of it. A table gives
every fact the same shape and puts the labels in a column, which is what makes
it scannable; the center dot keeps its job inside a cell, where it separates
peers rather than kinds.

Header-less, because "Field" and "Value" name nothing the rows do not.

`record_line` and its two helpers built formatted strings and joined them;
they now build (label, value) pairs and one renderer formats them. That is the
whole diff, and the cost of having had formatting and content in the same
expression: twelve assertions moved from `**Label** value` to
`| **Label** | value |`, and three stopped assuming a blockquote.

Not Quartz's `note-properties` plugin, which was the other candidate. It is a
v5 plugin against a site action deliberately pinned to v4.5.2, and more to the
point a properties panel shows the page's own frontmatter — it cannot render
`Supersedes`, read from another document's field, or the backlinks, and it
would show `Superseded` where the record line composes `Superseded — by X`.
Enabling it would add a block beside this one rather than replace it. The
Quartz upgrade is worth doing on its own merits and is unrelated to this.

The line is composed only when staging the site, so nothing about how the
record reads in the repository changes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YP4P3m8rzVFb8idnTE4FfT
@dmarx
dmarx merged commit b69cb7a into main Sep 7, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants