28 - the line's retry takes one fallback per pass, so it cannot spin #110

Merged
lilleman merged 5 commits from line-fallback-progress into main 2026-09-20 18:04:47 +02:00
2 changed files with 2 additions and 4 deletions
Showing only changes of commit 057729f830 - Show all commits
+2 -3
View File
@@ -208,7 +208,7 @@ wide `Result<T>`, since half their refusals come from an emit stage that read no
Test for the behaviour wanted first, then implement until green. `node --test`, beside the code. Test for the behaviour wanted first, then implement until green. `node --test`, beside the code.
Node, tsc and npm never run on the host — only via the pinned images (§9). Tests are independent, Node, tsc and npm never run on the host — only via the pinned images (§9). Tests are independent,
coverage does not decline, containers are torn down after a run. containers are torn down after a run.
The gate runs that same suite under Deno and Bun as well as Node, the three images pinned alike, The gate runs that same suite under Deno and Bun as well as Node, the three images pinned alike,
and neither extra leg is Node's proof twice. Deno refuses an extensionless or directory specifier, and neither extra leg is Node's proof twice. Deno refuses an extensionless or directory specifier,
@@ -315,8 +315,7 @@ someone spells it or pins it.
is owed. A walk pushes one at a time. A literal spread (`[...value]`) is not the same thing and is owed. A walk pushes one at a time. A literal spread (`[...value]`) is not the same thing and
is fine (4c). is fine (4c).
- A loop retrying an input until a fallback spells it refuses the pass taking no fallback, so its - A loop retrying an input until a fallback spells it refuses the pass taking no fallback, so its
termination is the loop's own check rather than an argument every give-way site has to honour termination is the loop's own check (28).
(28).
- A reader takes the text and an index — a sticky regex whose `lastIndex` the caller sets on the - A reader takes the text and an index — a sticky regex whose `lastIndex` the caller sets on the
line before it reads, `indexOf` — never a fresh slice per character, and a per-character walk line before it reads, `indexOf` — never a fresh slice per character, and a per-character walk
hoists the scan that does not vary with the character. The pipeline persona feeds documents hoists the scan that does not vary with the character. The pipeline persona feeds documents
-1
View File
@@ -82,7 +82,6 @@ function emitLine(nodes: readonly AdfNode[], container: LineContainer, path: Con
} }
} }
// A pass taking no fallback re-emits the line it just emitted, so refusing loses no spelling.
function takeFallback(fallbacks: LineFallbacks, fallback: NodeRange | 'opening-link', path: ConvertErrorPath): Result<null> { function takeFallback(fallbacks: LineFallbacks, fallback: NodeRange | 'opening-link', path: ConvertErrorPath): Result<null> {
if (fallback === 'opening-link') { if (fallback === 'opening-link') {
if (fallbacks.openingLinkAsDirective) return failure('unsupported-node-shape', 'an opening link spelled as a directive still reads as a link definition, so the line has no spelling left', path) if (fallbacks.openingLinkAsDirective) return failure('unsupported-node-shape', 'an opening link spelled as a directive still reads as a link definition, so the line has no spelling left', path)