Development record
Three more private fence toggles diverge from mdrecord, the tree's CommonMark fence rule, and each gives a wrong result on a probe. site parseCLIReference (check.go) flips on any line starting with three backticks, so a flag in a tilde fence or in a four-backtick fence quoting a three-backtick line is never credited and the reference check reports drift that is not there. surface markerLines (appendix.go) flips on either a backtick or a tilde line, so a backtick line inside a tilde fence leaves the toggle on and a live appendix marker after the fence is refused as ErrMarkerInFence. memory fenceMask (coverage.go) closes a fence on a run indented four or more columns, which CommonMark reads as content, so a blockquote example inside the fence becomes a quoted span and the live quote after it is masked when the real closer reopens the toggle. Found by the TestNoSecondFenceRule detector ported onto mdrecord.
Three more private fence toggles diverge from mdrecord, the tree's CommonMark fence rule, and each gives a wrong result on a probe. site parseCLIReference (check.go) flips on any line starting with three backticks, so a flag in a tilde fence or in a four-backtick fence quoting a three-backtick line is never credited and the reference check reports drift that is not there. surface markerLines (appendix.go) flips on either a backtick or a tilde line, so a backtick line inside a tilde fence leaves the toggle on and a live appendix marker after the fence is refused as ErrMarkerInFence. memory fenceMask (coverage.go) closes a fence on a run indented four or more columns, which CommonMark reads as content, so a blockquote example inside the fence becomes a quoted span and the live quote after it is masked when the real closer reopens the toggle. Found by the TestNoSecondFenceRule detector ported onto mdrecord.
Grounds
- pursued: each probe from the capture now gives the CommonMark answer (TestParseCLIReferenceReadsFencesByTheCommonMarkRule, TestMarkerLinesReadFencesByTheCommonMarkRule, TestExtractQuotedSpansReadsFencesByTheCommonMarkRule) and the detector, which names eight files at 6034ae70, names none; a new toggle the detector does not name, or a probe answering the old way, would show it wrong
Frontmatter
| id | iss-2609251044055902 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | minor |
.abcd/work/issues/resolved/iss-2609251044055902-three-more-private-fence-toggles-diverge.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.