Development record
surface ProseShapeClaims (appendix.go) decides whether a sub-verb path is written as an invocation through codeRegions, which pairs backtick runs and so covers a backtick fence but never a tilde fence. A sub-verb path inside a tilde-fenced example, written without an abcd prefix, is not a claim, so a stale sub-verb there passes the brief surface drift check silently. Probe: prose '~~~ / capture list / ~~~' against a tree registering 'abcd capture list' yields no claim. Found in the fence sweep beside TestNoSecondFenceRule, which does not flag it because codeRegions keeps no per-line state.
surface ProseShapeClaims (appendix.go) decides whether a sub-verb path is written as an invocation through codeRegions, which pairs backtick runs and so covers a backtick fence but never a tilde fence. A sub-verb path inside a tilde-fenced example, written without an abcd prefix, is not a claim, so a stale sub-verb there passes the brief surface drift check silently. Probe: prose '~~~ / capture list / ~~~' against a tree registering 'abcd capture list' yields no claim. Found in the fence sweep beside TestNoSecondFenceRule, which does not flag it because codeRegions keeps no per-line state.
Grounds
- pursued: the capture's probe now yields the claim on its line (TestProseShapeClaimsReadATildeFenceAsCode) and the brief appendix tests over the committed chapters still pass; a missing claim for a tilde-fenced path, or a new false drift on a committed chapter, would show it wrong
Frontmatter
| id | iss-2609251045302499 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | minor |
.abcd/work/issues/resolved/iss-2609251045302499-surface-proseshapeclaims-appendix-go.md
open on GitHub ↗ · commit history ↗
mentions1
- dcn-26092500000000012026-09-25 — One fence rule for the tree (the run A orchestrator's technical ruling for the fences lane, recorded by the lane implementer). `internal/core/mdrecord` is the tree's one notion of fences and HTML comments: `Mask` and `Unclosed` follow CommonMark for a top-level fence, and `Read(lines, rule)` is the single pass every reading goes through. It is extended once, by a `Rule`: `TopLevel` is CommonMark's top level, and `ListNested` also opens a fence indented four or more columns, which only a list item can hold, closes it within three columns of its opener, and ends it at a column-0 line (fenced code never continues lazily). A run at one to three columns is read by `ListNested` exactly as `TopLevel` reads it, because whether it sits in a list item turns on the list around it and mdrecord does not parse lists; a committed issue record quotes a frontmatter block in a top-level fence whose indented closer is followed by a column-0 line, and the list-item reading refused it. That reading is kept unexported and consulted by `FencedUnderEveryRule`, which masks a line only where every reading agrees. The site reads `ListNested` (it renders fences in list items) with comments masked and refuses an unclosed fence or comment; the lint rules read `FencedUnderEveryRule` with comments left visible, because a mask that hides prose misses a finding silently. The reading exclusion floor fails closed: its verifier does not share the redactor's site walk, reads a line as code only where every reading agrees, lets no comment hide a heading (comment text travels in the bundle, so an excluded heading inside a comment is refused, not redacted by guess), and refuses a fence either rule leaves unclosed. `TestNoSecondFenceRule` in mdrecord is the armed guard: it names any non-test Go file that writes a fence delimiter and keeps state across lines, its allowlist is empty, and a stale entry fails it. Captures resolved on this ruling: iss-2609250955207041, iss-2609250955051598, iss-2609250955209513, iss-2609251044055902, iss-2609251045302499.