needs:direction — chatter linkification has no automated mechanism; displayText is inert nf-t93v ← Beads

open priority 3 task unassigned needs:direction

Split out of nf-abda / PR #1211, which delivered the PR-description half of "beads URLs everywhere" and proved the chatter half cannot be done at the display layer today.

The finding. MessageDisplay's displayText is inert in Claude Code 2.1.238. Measured in a real TUI (scratch project, tmux, capture-pane -e): the hook fires and returns well-formed JSON on every flush, and the harness renders the original text regardless — bare-URL form, markdown-link form, and with the field duplicated at top level; 4, 1 and 5 flushes respectively. tools/beads/linkify.py is written, tested and deliberately NOT registered in .claude/settings.json, because wiring it would cost ~68ms per flush of every assistant message for no effect.

The question for @aedanpope. Chatter linkification now has no automated mechanism. The only remaining lever is getting the model to WRITE [nf-758.9](https://nfold.dev/nf-758.9) itself, which is a text instruction — the thing he explicitly asked to minimise:

> "we should avoid / minimise relying on .md descriptions / text > instructions to agents, instead preferring to script / automate where > possible"

Three options, none implemented pending his steer:

1. Wait for the harness. The PR-body half already covers where bd links matter most, and the schema is clearly headed somewhere. Costs nothing. *(recommended default — and it is a no-op, so it is what is in effect.)* 2. One line injected by session_start.py's existing additionalContext — automatic per session, zero CLAUDE.md cost, no new machinery. Still subject to model compliance. 3. A CLAUDE.md line — cheapest to write, paid on every context load by every session forever.

When the harness version changes, re-run the table in tools/beads/linkify.py's docstring; if displayText starts working, wiring it is a one-line settings change and this question dissolves.

Dependencies

None.

Comments

jcantsp-bot · 2026-08-21T11:23:59Z

Option 1 ("wait") is now a real mechanism rather than a wish.

@aedanpope pushed back on it — "what do u mean by wait" — and he was right: as written it meant nobody checks, so the realistic outcome was that the hook rots as dead code a future session re-derives from scratch.

presubmit.py --doctor now carries a claude displayText tripwire, same shape as the bd pin and gh floor beside it: it compares the installed claude --version against tools/beads/linkify.py's MEASURED_INERT_AT (2.1.238, the build the inert result was measured on) and prints an optional when it moves, naming the table to re-run and telling the reader to wire the hook and bump the constant in the same PR. Optional, never — a newer harness is not a fault. Silent when there is no claude on PATH.

So this issue no longer needs anyone to remember it: the box raises its hand. What still needs @aedanpope's steer is only whether to do options 2 or 3 in the meantime, or accept the gap until the harness closes it.

Stacked PR on top of #1211.

Add a comment