mirror of
https://github.com/larvit/adf-codec.git
synced 2026-11-14 20:40:25 +01:00
470 lines
29 KiB
Markdown
470 lines
29 KiB
Markdown
# Comprehension history
|
|
|
|
## 2026-10-09T00:41:03Z, PR #19 at 859c952, against 9519606
|
|
|
|
Ruling: better
|
|
|
|
| Seat | Vote |
|
|
|---|---|
|
|
| Mid A | better |
|
|
| Inherited architect | better |
|
|
|
|
Mid A, decided by:
|
|
|
|
- `src/markdown/portable/task-ids.ts:7` `mintTaskIds`: one walk, no carried set filled by the parser as a side effect
|
|
- `src/markdown/parse/markdown-to-adf.ts:26` `Reading`: plain data, `codeBlockNode` no longer mutates `carried`
|
|
- `src/markdown/portable/conventions.ts:8` `flavourClaims`: one table states what each reader claims; branches name the claim they test
|
|
- `src/markdown/parse/markdown-to-adf.ts:161` `quoteNode`: the title is read in the reader's own flavour, no hop through `inlineLeaves`
|
|
- `src/index.ts:5` exports: each call named by its flavour; "plain" no longer means two things
|
|
|
|
Inherited architect, decided by:
|
|
|
|
- `src/markdown/parse/markdown-to-adf.ts:26` `Reading`: the hidden `carried` set and the retrying `mintTaskIds` are gone
|
|
- `src/markdown/parse/markdown-to-adf.ts:161` `quoteNode`: parser and emitter no longer correct only together
|
|
- `src/markdown/parse/markdown-to-adf.ts:113` `readBlock`: branches name the claim (`claims.alerts`, `claims.taskMarkers`)
|
|
- `src/index.ts:5` exports: flavour names say which file to open
|
|
- `src/markdown/portable/conventions.ts:3` `flavourClaims`: cost, all three flavours' rows live under `portable/`
|
|
|
|
## 2026-10-09T00:56:04Z, PR #19 at 5fc877e, against 9519606
|
|
|
|
Ruling: better
|
|
|
|
| Seat | Vote |
|
|
|---|---|
|
|
| Mid A | better |
|
|
| Inherited architect | better |
|
|
|
|
Mid A, decided by:
|
|
|
|
- `src/markdown/portable/conventions.ts:8` `flavourClaims`: one table says what each flavour reads; every gate reads a named field
|
|
- `src/markdown/portable/task-ids.ts:7` `mintTaskIds`: one pass, no carried set crossing modules
|
|
- `src/index.ts:5` exports: each name says which markdown it means
|
|
- `src/markdown/parse/markdown-to-adf.ts:161` `quoteNode`: no reach into the portable writer's reduction
|
|
- `src/markdown/portable/conventions.ts:20` `ReadClaims`: cost, `directiveNode` leans on a type in another file
|
|
|
|
Inherited architect, decided by:
|
|
|
|
- `src/markdown/portable/task-ids.ts:6` `mintTaskIds`: the retry loop and the parser-filled set are gone
|
|
- `src/markdown/parse/markdown-to-adf.ts:26` `Reading`: no hidden state; branches name the feature they gate
|
|
- `src/markdown/portable/conventions.ts:8` `flavourClaims`: cost, the table for all three flavours lives under `portable/`
|
|
- `src/markdown/emit/line-escaping.ts:92` `escapeClaims`: directive escaping under the flag the parser checks
|
|
- `src/markdown/emit/adf-to-markdown.ts:146` `spellPortableBlock`: no hard-coded lossless title
|
|
|
|
## 2026-10-09T01:43:11Z, PR #21 at c45320b, against 9a242c7
|
|
|
|
Ruling: better
|
|
|
|
| Seat | Vote |
|
|
|---|---|
|
|
| Mid A | better |
|
|
| Inherited architect | better |
|
|
|
|
Mid A, decided by:
|
|
|
|
- `src/markdown/parse/markdown-to-adf.ts:23` `MarkerParagraph`: the block kind says a marker's paragraph holds no lone image, where `readMarked` scanned its output afterwards
|
|
- `src/markdown/emit/image.ts:7` `tryImage`: builds what the reader would build and compares, where `imageShape` restated the shape by hand
|
|
- `src/markdown/parse/inline-content.ts:25` `InlineContent`: one rule replaces five image refusal sites over two files
|
|
- `src/markdown/external-image.ts:4` `centeredImage`: one builder for the shape three literals held
|
|
- `src/markdown/parse/inline-content.ts:550` `pieceNodes`: costs more — its image arm relies on `assemble` having linked every top-level image
|
|
|
|
Inherited architect, decided by:
|
|
|
|
- `src/markdown/external-image.ts:4` `centeredImage`: the image's ADF shape is defined once for reader, emitter and portable reducer
|
|
- `src/markdown/parse/markdown-to-adf.ts:23` `MarkerParagraph`: replaces `readMarked`'s after-the-fact search and its caller-computed flag
|
|
- `src/result.ts:1` `ConvertErrorCode`: `unmappable-image` and its refusal paths are gone
|
|
- `src/markdown/parse/inline-content.ts:43` `Image`: costs more — four functions must agree on the image's `link`
|
|
- `src/markdown/parse/inline-content.ts:26` `InlineContent`: costs more — no longer image xor nodes
|
|
|
|
## 2026-10-09T08:38:28Z, PR #21 at 1098b5e, against 9a242c7
|
|
|
|
Ruling: better
|
|
|
|
| Seat | Vote |
|
|
|---|---|
|
|
| Mid A | better |
|
|
| Inherited architect | better |
|
|
|
|
Mid A, decided by:
|
|
|
|
- `src/markdown/external-image.ts:4` `centeredImage`: one builder where three places built the image node by hand
|
|
- `src/markdown/emit/image.ts:7` `tryImage`: compares against what the reader builds, where `imageShape` restated the shape
|
|
- `src/markdown/parse/markdown-to-adf.ts:26` `TaskParagraph`: a named block kind replaces `readMarked`'s after-the-fact index search
|
|
- `src/markdown/parse/inline-content.ts:302` `assemble`: costs more — which of three readings an image takes hangs on a one-line condition and the `inLink` flag
|
|
- `src/markdown/parse/inline-content.ts:26` `InlineContent`: costs more — no longer image xor nodes
|
|
|
|
Inherited architect, decided by:
|
|
|
|
- `src/markdown/external-image.ts:4` `centeredImage`: the image shape is defined once for reader and both writers
|
|
- `src/markdown/emit/image.ts:7` `tryImage`: the emitter cannot drift from the reader
|
|
- `src/markdown/parse/markdown-to-adf.ts:136` `readBlock`: the task paragraph is routed where the block is classified
|
|
- `src/markdown/parse/inline-content.ts:302` `assemble`: costs more — the most expensive line to decode
|
|
- `src/markdown/parse/markdown-to-adf.ts:154` `paragraphsOf`: costs more — the name does not say it splits the marker line
|
|
|
|
## 2026-10-09T08:46:45Z, PR #21 at e7029c1, against 9a242c7
|
|
|
|
Ruling: better
|
|
|
|
| Seat | Vote |
|
|
|---|---|
|
|
| Mid A | better |
|
|
| Inherited architect | better |
|
|
|
|
Mid A, decided by:
|
|
|
|
- `src/markdown/emit/image.ts:7` `tryImage`: builds what the reader would build and compares, where `imageShape` restated the shape
|
|
- `src/markdown/external-image.ts:4` `centeredImage`: the image shape lives in one named file
|
|
- `src/markdown/parse/markdown-to-adf.ts:26` `TaskParagraph`: a typed block kind replaces `readMarked`'s after-the-fact search
|
|
- `src/markdown/parse/inline-content.ts:302` `assemble`: costs more — one dense ternary over `inLink`
|
|
- `src/markdown/parse/inline-content.ts:26` `InlineContent`: costs more — no longer a discriminated union
|
|
|
|
Inherited architect, decided by:
|
|
|
|
- `src/markdown/external-image.ts:4` `centeredImage`: one builder where three had to stay in step
|
|
- `src/markdown/parse/markdown-to-adf.ts:136` `readBlock`: the task paragraph is routed by a named block kind
|
|
- `src/result.ts:1` `ConvertErrorCode`: one rule no longer enforced at five sites
|
|
- `src/markdown/parse/inline-content.ts:26` `InlineContent`: costs more — `contentNode` drops `image` silently
|
|
- `src/markdown/parse/inline-content.ts:302` `assemble`: costs more — three routes from an image piece to text
|
|
|
|
## 2026-10-09T09:00:13Z, PR #22 at fe5c731, against 78655bc
|
|
|
|
Ruling: same
|
|
|
|
| Seat | Vote |
|
|
|---|---|
|
|
| Mid A | same |
|
|
| Inherited architect | same |
|
|
|
|
## 2026-10-09T09:52:41Z, PR #22 at 6f1a16b, against 78655bc
|
|
|
|
Ruling: worse
|
|
|
|
| Seat | Vote |
|
|
|---|---|
|
|
| Mid A | worse |
|
|
| Inherited architect | worse |
|
|
|
|
Mid A, decided by:
|
|
|
|
- `src/markdown/emit/inline-line.ts:106` `takeFallback`: a range may part joined breaks or carry, decided by state an earlier pass built
|
|
- `src/markdown/emit/inline-line.ts:316` `emitMarkedRun`: a carry that signals parting to `takeFallback` two levels up
|
|
- `src/markdown/emit/inline-line.ts:233` `joinsRun`: a lookahead whose shortcut holds only by `inlineRuns`' call order
|
|
- `src/markdown/emit/inline-line.ts:58` `portableLineFallback`: a second retry loop sharing the parting
|
|
- `src/adf/inline-nodes.ts:5` `InlineNodeModel.marks`: reads as "has marks", not "takes marks"
|
|
- `src/markdown/parse/inline-content.ts:328` `linkTo`: the comment hides that the breaks stay after the destination
|
|
|
|
Inherited architect, decided by:
|
|
|
|
- `src/markdown/emit/inline-line.ts:331` `emitMarkedRun`: the newline check returns a carry that is a parting signal, one fact over three functions
|
|
- `src/markdown/emit/inline-line.ts:106` `takeFallback`: two growing sets whose order matters
|
|
- `src/markdown/emit/inline-line.ts:58` `portableLineFallback`: a second retry loop with its own exit rule
|
|
- `src/markdown/emit/inline-line.ts:233` `joinsRun`: lookahead, shortcut and three conditions per break; `inlineRuns` takes the whole context
|
|
- `src/adf/inline-nodes.ts:5` `InlineNodeModel.marks`: the name hides "takes marks"
|
|
- `src/markdown/parse/inline-content.ts:328` `linkTo`: the comment no longer says an empty destination reads as nothing
|
|
|
|
## 2026-10-09T09:57:25Z, PR #22 at 45b5446, against 78655bc
|
|
|
|
Ruling: worse
|
|
|
|
| Seat | Vote |
|
|
|---|---|
|
|
| Mid A | worse |
|
|
| Inherited architect | worse |
|
|
|
|
Mid A, decided by:
|
|
|
|
- `src/markdown/emit/inline-line.ts:100` `takeFallback`: the first fallback is discarded to stop joining, known only from a comment
|
|
- `src/markdown/emit/inline-line.ts:200` `inlineRuns`: an indexed loop moving its own counter by `joinedBreaks`' result
|
|
- `src/markdown/emit/inline-line.ts:226` `joinedBreaks`: six positional parameters and two jobs
|
|
|
|
Inherited architect, decided by:
|
|
|
|
- `src/markdown/emit/inline-line.ts:101` `takeFallback`: a hidden first step that takes no fallback
|
|
- `src/markdown/emit/inline-line.ts:200` `inlineRuns`: runs built by a forward scan the reader steps through by hand
|
|
- `src/markdown/emit/inline-line.ts:56` `portableLineFallback`: checks an unjoined line while the final emit starts joined
|
|
- `src/markdown/emit/inline-line.ts:40` `LineFallbacks.joinsBreaks`: a fallbacks field whose fallback value is false
|
|
|
|
## 2026-10-09T10:02:23Z, PR #22 at f195ebd, against 78655bc
|
|
|
|
Ruling: same
|
|
|
|
| Seat | Vote |
|
|
|---|---|
|
|
| Mid A | same |
|
|
| Inherited architect | same |
|
|
|
|
## 2026-10-09T10:07:15Z, PR #22 at 37629e4, against 78655bc
|
|
|
|
Ruling: same
|
|
|
|
| Seat | Vote |
|
|
|---|---|
|
|
| Mid A | same |
|
|
| Inherited architect | same |
|
|
|
|
## 2026-10-09T10:19:03Z, PR #22 at 239218f, against 78655bc
|
|
|
|
Ruling: same
|
|
|
|
| Seat | Vote |
|
|
|---|---|
|
|
| Mid A | same |
|
|
| Inherited architect | same |
|
|
|
|
## 2026-10-09T12:13:22Z, PR #24 at d109199, against 78655bc
|
|
|
|
Ruling: same
|
|
|
|
| Seat | Navigation | Locality | Shape | Self-sufficiency | Overall |
|
|
|---|---|---|---|---|---|
|
|
| Mid A | better | same | same | better | better |
|
|
| Inherited architect | same | same | same | worse | same |
|
|
| Maintainability senior | same | better | worse | same | same |
|
|
| Junior A | better | better | same | same | better |
|
|
|
|
Mid A, decided by:
|
|
|
|
- Navigation, Self-sufficiency: `src/markdown/portable/task-list.ts:5` `splitTaskList`: the split rule is one named unit both directions import, where it sat in `bulletNode` and `reduceTaskList`/`nestIn`
|
|
- Self-sufficiency, Navigation: `src/adf/inline-nodes.ts:12` `inlineNodes`: "a hard break takes no marks" is the field `takesMarks: false`, read by parser and emitter
|
|
- Shape: `src/markdown/portable/adf-to-portable-markdown.ts:289` `reduceTaskList`: the loop lost its `nested` accumulator and `nestIn`; line 303 packs the split and a merge into one expression
|
|
- Shape, Locality: `src/markdown/portable/task-list.ts:8` `splitTaskList`: a `standing` flag across iterations and `stands` overwritten mid-iteration; `heldTask` says little
|
|
- Locality: `src/markdown/parse/markdown-to-adf.ts:86` `readBlocks`: `bulletNode` returns a schema-breaking task list that its caller splits, and neither says so
|
|
- Self-sufficiency: `src/markdown/parse/inline-content.ts:328` `linkTo`: the comment covers the hard-break case
|
|
|
|
Inherited architect, decided by:
|
|
|
|
- Self-sufficiency: `src/markdown/portable/task-list.ts:5` `splitTaskList`: the comment states the schema constraint, not the rule; the loop must be traced by hand
|
|
- Locality: `src/markdown/parse/markdown-to-adf.ts:201` `bulletNode`: builds a schema-breaking intermediate that only `readBlocks` repairs under an unexplained guard
|
|
- Locality: `src/markdown/portable/adf-to-portable-markdown.ts:311` `reduceTask`: dropping `blankedCode` rests on a guarantee neither unit states
|
|
- Locality: `src/markdown/portable/adf-to-portable-markdown.ts:317` `nestIn`: two hand-mirrored halves of one rule became one function
|
|
- Self-sufficiency, Locality: `src/adf/inline-nodes.ts:12` `inlineNodes`: `takesMarks: false` makes the hard-break rule checkable at its source
|
|
- Self-sufficiency: `src/markdown/portable/adf-to-portable-markdown.ts:288` `reduceTaskList`: the comment no longer prepares the reader for line 303
|
|
- Shape: `src/markdown/portable/task-list.ts:12` `splitTaskList`: `standing`/`stands` reuse a word `reduceStanding` uses for another meaning
|
|
|
|
Maintainability senior, decided by:
|
|
|
|
- Locality: `src/markdown/portable/task-list.ts:5` `splitTaskList`: the stay-or-stand rule lives once, where the reader's `bulletNode` and the writer's `nestIn` mirrored it
|
|
- Locality: `src/markdown/parse/markdown-to-adf.ts:86` `readBlocks`: `bulletNode` returns a shape the caller quietly replaces, behind an unexplained `block.kind` guard
|
|
- Shape: `src/markdown/portable/task-list.ts:9` `splitTaskList`: two cross-iteration accumulators, a negated compound ternary, near-synonym names, and `heldTask` hides the taskItem conversion
|
|
- Shape: `src/markdown/portable/adf-to-portable-markdown.ts:303` `reduceTaskList`: one 180-character line maps the split and re-merges
|
|
- Shape: `AGENTS.md:28` decision index: a title grew into a two-clause sentence
|
|
|
|
Junior A, decided by:
|
|
|
|
- Locality, Navigation: `src/markdown/portable/task-list.ts:5` `splitTaskList`: one function decides for reader and writer, where each had its own rule
|
|
- Locality: `src/markdown/parse/markdown-to-adf.ts:86` `readBlocks`: `bulletNode` returns an unfinished shape only the caller completes
|
|
- Locality: `src/adf/inline-nodes.ts:3` `InlineNodeModel.takesMarks`: the hard break's rule lives in one row both directions read
|
|
- Shape: `src/markdown/portable/task-list.ts:5` `splitTaskList`: a carried `standing` flag, a reassigned `stands`, and `heldTask`'s name hides the conversion
|
|
- Navigation: `src/markdown/parse/markdown-to-adf.ts:22` imports: both converters lead to the same named file
|
|
|
|
## 2026-10-09T12:35:05Z, PR #24 at e487fa4, against 78655bc
|
|
|
|
Ruling: better
|
|
|
|
| Seat | Navigation | Locality | Shape | Self-sufficiency | Overall |
|
|
|---|---|---|---|---|---|
|
|
| Mid A | same | better | same | same | better |
|
|
| Inherited architect | better | better | same | better | better |
|
|
|
|
Mid A, decided by:
|
|
|
|
- Locality, Overall: `src/markdown/portable/adf-to-portable-markdown.ts:289` `reduceTaskList`: a plain collect loop handing the list to `splitTasks`, where the base carried a `nested` accumulator and `nestIn` mutated `tasks`
|
|
- Locality: `src/markdown/portable/task-list.ts:6` `splitTaskList`: reader and writer share one rule, where `bulletNode` and `nestIn` each encoded it
|
|
- Locality, Shape: `src/markdown/parse/markdown-to-adf.ts:84` `readBlocks`: the portable task list is caught before `readBlock`, which depends on that order
|
|
- Shape: `src/markdown/portable/task-list.ts:33` `itemParts`: `paragraphs` and `nested` are indices named like collections, and the demotion to `taskItem` is unnamed
|
|
- Navigation, Shape: `src/adf/block-nodes.ts:92` `isTaskItem`: one findable predicate, against one more hop from a parse symptom
|
|
|
|
Inherited architect, decided by:
|
|
|
|
- Locality, Navigation, Overall: `src/markdown/portable/task-list.ts:6` `splitTaskList`: one unit decides where a task item's blocks go, for reader and writer
|
|
- Locality, Shape: `src/markdown/portable/adf-to-portable-markdown.ts:289` `reduceTaskList`: one pass then one call, no state carried across iterations
|
|
- Self-sufficiency, Locality: `src/adf/inline-nodes.ts:5` `takesMarks`: the hard-break rule is a field both directions read
|
|
- Shape: `src/markdown/portable/task-list.ts:33` `itemParts`: an index over `content` used over `run`, and `nested` running into the siblings
|
|
- Shape, Locality: `src/markdown/parse/markdown-to-adf.ts:84` `readBlocks`: a third special case ahead of the dispatch
|
|
- Shape: `src/adf/block-nodes.ts:92` `isTaskItem`: one predicate replaces two copies
|
|
- Self-sufficiency: `src/markdown/portable/task-list.ts:5` comment: states the schema limit and what follows from it
|
|
|
|
## 2026-10-09T13:03:22Z, PR #25 at 2b211e9, against 875c0e5
|
|
|
|
Ruling: better
|
|
|
|
| Seat | Navigation | Locality | Shape | Self-sufficiency | Overall |
|
|
|---|---|---|---|---|---|
|
|
| Mid A | better | better | better | same | better |
|
|
| Inherited architect | same | better | better | same | better |
|
|
|
|
Mid A, decided by:
|
|
|
|
- Locality, Shape, Overall: `src/markdown/portable/adf-to-portable-markdown.ts:118` `portableSequence`: a plain splice with `index -= 1`, where the base merged neighbours after every splice through `spliced`, `mergedLists`, `joinedLists` and `splitTasks`
|
|
- Locality, Navigation: `src/markdown/parse/markdown-to-adf.ts:98` `listBreakFault`: gone, with the base's look at `blocks[index - 1]` and `blocks[index + 1]` and the separator spelled in four places
|
|
- Navigation, Shape: `src/markdown/parse/blocks.ts:232` `continuesList`: one named predicate on kind and delimiter that `itemStart` and `openedList` share
|
|
- Locality: `src/markdown/emit/adf-to-markdown.ts:73` `joinBlocks`: a toggled `alternated` flag decides each list's text from the one before it, and `isOrdered` counts a task list as a bullet list unsaid
|
|
- Shape: `src/markdown/emit/adf-to-markdown.ts:334` `spelledList`: `tryList` builds both spellings then falls back once, and `tryTaskList` shares the helper
|
|
|
|
Inherited architect, decided by:
|
|
|
|
- Locality, Shape, Overall: `src/markdown/portable/adf-to-portable-markdown.ts:118` `portableSequence`: a filter and a loop ending in `index -= 1`, where the base kept the splice window, the merge rules and the renumbering-as-text rule together
|
|
- Locality, Shape: `src/markdown/parse/markdown-to-adf.ts:79` `readBlocks`: reads one block at a time, where the base judged a separator by its siblings
|
|
- Locality: `src/markdown/emit/adf-to-markdown.ts:73` `joinBlocks`: a toggle carried across iterations sends a third adjacent list back to `-`, seen only by tracing
|
|
- Shape: `src/markdown/emit/adf-to-markdown.ts:334` `spelledList`: the both-or-neither rule is one uncommented expression
|
|
- Self-sufficiency: `src/markdown/emit/adf-to-markdown.ts:369` `tryListItemLines`: `inner.startsWith('*')` depends on the alternate bullet being `*`, and the comment needs the inline escaping worked out
|
|
- Self-sufficiency: `src/markdown/parse/blocks.ts:232` `continuesList`: states the rule the base sent the reader to the spec for
|
|
|
|
## 2026-10-09T13:37:16Z, PR #25 at ca3d703, against 875c0e5
|
|
|
|
Ruling: better
|
|
|
|
| Seat | Navigation | Locality | Shape | Self-sufficiency | Overall |
|
|
|---|---|---|---|---|---|
|
|
| Mid A | better | better | better | better | better |
|
|
| Inherited architect | better | better | better | same | better |
|
|
|
|
Mid A, decided by:
|
|
|
|
- Locality, Shape, Overall: `src/markdown/portable/adf-to-portable-markdown.ts:118` `portableSequence`: a worklist that keeps a block that spells or pushes its items back, where the base spliced, merged neighbours and stepped the index back by hand
|
|
- Navigation, Locality: `src/markdown/parse/markdown-to-adf.ts:70` `readBlocks`: handles each block alone, where the base judged a separator by its neighbours across five places
|
|
- Shape, Self-sufficiency: `src/markdown/parse/blocks.ts:232` `continuesList`: one named predicate on kind and delimiter, its rule stated in place
|
|
- Self-sufficiency, Locality: `src/markdown/emit/adf-to-markdown.ts:27` `SpelledBlock`: its comment states why `alternateText` exists, though `joinBlocks` now carries a toggle across siblings
|
|
- Shape: `src/markdown/emit/adf-to-markdown.ts:334` `spelledList`: line building in small units, the fallback once after the loop, shared by `tryTaskList`
|
|
- Self-sufficiency: `src/markdown/emit/adf-to-markdown.ts:369` `tryListItemLines`: the `*` branch's comment needs a reread
|
|
|
|
Inherited architect, decided by:
|
|
|
|
- Locality, Shape, Overall: `src/markdown/portable/adf-to-portable-markdown.ts:118` `portableSequence`: a work stack replacing six helpers and the base's cursor rewind
|
|
- Locality, Navigation: `src/markdown/parse/markdown-to-adf.ts:70` `readBlocks`: each block reads alone, and two merged lists lead to one emitter and one parser unit
|
|
- Locality, Navigation: `src/markdown/parse/blocks.ts:232` `continuesList`: a list continues exactly where CommonMark says, checkable without the spec
|
|
- Locality: `src/markdown/emit/adf-to-markdown.ts:72` `joinBlocks`: a block's spelling depends on the run before it, where the base's separation was a pure function of a pair
|
|
- Shape: `src/markdown/emit/adf-to-markdown.ts:334` `spelledList`: one exit to the directive form, though bullets pass `() => ''` as the number
|
|
- Self-sufficiency: `src/markdown/emit/adf-to-markdown.ts:369` `tryListItemLines`: the `*` branch needs the spec open, cancelling the spec pointers removed
|
|
|
|
## 2026-10-09T14:50:52Z, PR #27 at 2378782, against a9fedb3
|
|
|
|
Ruling: better
|
|
|
|
| Seat | Navigation | Locality | Shape | Self-sufficiency | Overall |
|
|
|---|---|---|---|---|---|
|
|
| Mid A | better | better | better | better | better |
|
|
| Inherited architect | better | better | better | same | better |
|
|
|
|
Mid A, decided by:
|
|
|
|
- Locality, Self-sufficiency: `src/markdown/inline-tokens.ts:20` `readInlineToken`: the parser and the escaper ask one function what the reader takes at a character, where each held its own copy of the rules
|
|
- Locality, Shape: `src/markdown/emit/line-escaping.ts:102` `escapeClaims`: the order-dependent `afterEscape` and `pairsEquals` flags are gone; runs go whole to `escapeRun` and fixed inputs ride one `EscapeWalk` record
|
|
- Shape, Navigation: `src/markdown/parse/inline-content.ts:110` `scanInline`: a two-level character dispatch and eight helpers became one switch over token kinds
|
|
- Shape: `src/markdown/emit/line-escaping.ts:158` `claimsCharacter`: switches on `token.kind` in place of a chain of character tests
|
|
|
|
Inherited architect, decided by:
|
|
|
|
- Navigation, Shape: `src/markdown/inline-tokens.ts:20` `readInlineToken`: one tokenizer answers what the reader sees at an index, where two parallel implementations had to agree
|
|
- Locality: `src/markdown/emit/line-escaping.ts:112` `escapeClaims`: each step reads on its own, no flag carried from the previous character
|
|
- Shape: `src/markdown/emit/line-escaping.ts:158` `claimsCharacter`: switches on the token kind and takes the shared record; the heading closer is worked out once in `closingHashes`
|
|
- Shape, Navigation: `src/markdown/parse/inline-content.ts:121` `readToken`: one exhaustive switch over `InlineToken['kind']` replaces a two-level dispatch
|
|
- Locality: `src/markdown/emit/line-escaping.ts:173` `claimsCharacter`: `default: return true` claims every kind it does not name, so a new kind is escaped without its author deciding
|
|
|
|
## 2026-10-09T17:14:17Z, PR #27 at 65d2a26, against a9fedb3
|
|
|
|
Ruling: better
|
|
|
|
| Seat | Navigation | Locality | Shape | Self-sufficiency | Overall |
|
|
|---|---|---|---|---|---|
|
|
| Mid A | better | better | better | same | better |
|
|
| Inherited architect | better | better | better | same | better |
|
|
|
|
Mid A, decided by:
|
|
|
|
- Navigation, Locality: `src/markdown/inline-tokens.ts:21` `readInlineToken`: the one place that says what a character opens, which the reader and the escaper both dispatch on, where each held a copy that could drift
|
|
- Locality, Shape: `src/markdown/emit/line-escaping.ts:156` `claimsCharacter`: a flat switch on the token kind over a readonly `EscapeWalk`, where one character's escape hung on flags the previous iteration set
|
|
- Shape: `src/markdown/parse/inline-content.ts:121` `readToken`: one flat switch, recognition in the tokenizer and action here, where a two-level character switch fanned out to eight helpers
|
|
- Locality: `src/markdown/directive-syntax.ts:14` `ClaimedPrefix`: the directive read can no longer answer that no prefix stands there
|
|
- Shape: `src/markdown/emit/line-escaping.ts:147` `claimsRunRest`: re-reading each suffix of a run is a step the name does not say
|
|
|
|
Inherited architect, decided by:
|
|
|
|
- Navigation, Locality: `src/markdown/inline-tokens.ts:21` `readInlineToken`: the 3am symptom of an unescaped character leads to one file both directions ask
|
|
- Locality, Shape: `src/markdown/emit/line-escaping.ts:156` `claimsCharacter`: an exhaustive switch read one case at a time, where the decision needed replaying the loop for `pairsEquals`
|
|
- Shape, Locality: `src/markdown/parse/inline-content.ts:121` `readToken`: one pure tokenizer and one switch that applies tokens
|
|
- Shape: `src/markdown/directive-syntax.ts:14` `ClaimedPrefix`: the directive read needs proof of its prefix, and the misnamed `opensConstruct` is gone
|
|
- Locality: `src/markdown/emit/line-escaping.ts:112` `escapeClaims`: the escaper steps one character at a time while the reader steps by token, which only the `==` comment explains
|
|
|
|
## 2026-10-10T09:16:56Z, PR #30 at 6182ba6, against c11aa91
|
|
|
|
Ruling: worse
|
|
|
|
Fell: Locality. Under the floor of 7.0: Locality 5.63, so the same ruling counts as worse.
|
|
|
|
| Seat | Navigation | Locality | Shape | Self-sufficiency | Overall |
|
|
|---|---|---|---|---|---|
|
|
| Mid A | same | worse | same | same | same |
|
|
| Inherited architect | better | worse | same | same | same |
|
|
|
|
| Seat | Navigation | Locality | Shape | Self-sufficiency | Overall |
|
|
|---|---|---|---|---|---|
|
|
| Junior A | 7 | 5.5 | 6.5 | 5.5 | 6 |
|
|
| Mid A | 7 | 5.5 | 6.5 | 5.5 | 6 |
|
|
| Maintainability senior | 7 | 6 | 6.5 | 6 | 6 |
|
|
| Inherited architect | 6.5 | 5.5 | 6 | 6 | 6 |
|
|
| Mean | 6.88 | 5.63 | 6.38 | 5.75 | 6.00 |
|
|
|
|
Mid A, decided by:
|
|
|
|
- Locality: `src/markdown/parse/blocks.ts:79` `Walk.endedByDefinitions`: written in `closeLeaf` at `:469` and read in `openedList` at `:257`, never cleared, correct only by identity with `blocks.at(-1)`; `closeLeaf` takes on recording where definitions ended a list
|
|
|
|
Inherited architect, decided by:
|
|
|
|
- Locality: `src/markdown/parse/blocks.ts:79` `Walk.endedByDefinitions`: a never-reset field `closeLeaf` writes and `openedList` reads, right only by identity and by `openContainers` closing before it opens; reordering those steps breaks the split silently
|
|
- Locality: `src/markdown/parse/blocks.ts:432` `readLineBlock`: a second path that can find a paragraph emptied by definitions records nothing, which a reader must prove harmless by hand
|
|
- Navigation: `src/markdown/parse/blocks.ts:252` `openedList`: the comment names the exception, so a reader of two lists merged or not lands on the right unit
|
|
- Navigation: `README.md:242` the CommonMark exceptions bullet: each exception is named rather than counted by position
|
|
- Navigation: `CHANGELOG.md:5` `## Unreleased`: breaking entries come first, other changes last
|
|
|
|
## 2026-10-11T10:33:32Z, PR #32 at be23835, against c11aa91
|
|
|
|
Ruling: worse
|
|
|
|
| Seat | Navigation | Locality | Shape | Self-sufficiency | Overall |
|
|
|---|---|---|---|---|---|
|
|
| Mid A | same | worse | same | worse | worse |
|
|
| Inherited architect | same | worse | worse | worse | worse |
|
|
|
|
Mid A, decided by:
|
|
|
|
- Overall, Locality, Self-sufficiency: `src/markdown/parse/markdown-to-adf.ts:229` `splitPath`: builds stand-in nodes and replays `splitTaskList` to place a refused block's path, checkable only by knowing how the split moves blocks
|
|
- Locality, Self-sufficiency: `src/markdown/portable/task-list.ts:23` `splitPlace`: finds the stand-in by object identity, which holds only while `taskOfParagraphs` keeps the original children, and nothing there says so
|
|
- Locality: `src/markdown/parse/blocks.ts:262` `endList`: `closeLeaf` fills `Walk.endedLists` and `openedList` reads it, where `openedList` looked only at the previous block
|
|
|
|
Inherited architect, decided by:
|
|
|
|
- Locality, Self-sufficiency, Overall: `src/markdown/parse/markdown-to-adf.ts:229` `splitPath`: a fake task list replayed through `splitTaskList` and found again by identity; if `taskOfParagraphs` ever copies nodes the old wrong path returns silently
|
|
- Shape, Locality: `src/markdown/parse/markdown-to-adf.ts:203` `bulletBlocks`: one `readBlocks` call became a per-block loop with a hand-built failure, a second depth check and a fan-out through `taskItems`, `splitPath`, `childType` and `splitPlace`; `Refusal` names a context bag
|
|
- Locality: `src/markdown/parse/blocks.ts:78` `Walk.endedLists`: identity-keyed walk state that `closeLeaf` writes and `openedList` reads
|
|
- Shape: `src/markdown/portable/adf-to-portable-markdown.ts:354` `reduceMedia`: the callback's `held` shadows the alt's, and the link goes mark to definition to mark
|
|
|
|
## 2026-10-11T10:33:35Z, PR #32 at be23835
|
|
|
|
| Seat | Navigation | Locality | Shape | Self-sufficiency | Overall |
|
|
|---|---|---|---|---|---|
|
|
| Junior A | 7 | 6 | 6.5 | 6 | 6.5 |
|
|
| Mid A | 7 | 6 | 6.5 | 5.5 | 6 |
|
|
| Maintainability senior | 7 | 5.5 | 6.5 | 5.5 | 6 |
|
|
| Inherited architect | 6.5 | 5.5 | 6 | 6 | 6 |
|
|
| Mean | 6.88 | 5.75 | 6.38 | 5.75 | 6.13 |
|
|
|
|
Junior A, hardest first:
|
|
|
|
- Locality: `src/markdown/parse/markdown-to-adf.ts:229` `splitPath`: replays `splitTaskList`'s internals to name a path
|
|
- Self-sufficiency: `src/markdown/emit/line-escaping.ts:189` `escapeClosedRuns`: the escaping rule lives in `spec/flavour.md`
|
|
|
|
Mid A, hardest first:
|
|
|
|
- Locality: `src/markdown/emit/adf-to-markdown.ts:30` `SpellingMemo`: reference-keyed memo shared by parse and emit
|
|
- Self-sufficiency: `src/markdown/parse/inline-content.ts:62` `Scan`: rules read with `spec/flavour.md` open alongside
|
|
|
|
Maintainability senior, hardest first:
|
|
|
|
- Locality: `src/markdown/parse/markdown-to-adf.ts:257` `directiveNode`: the parser asks the emitter whether input was legal
|
|
- Self-sufficiency: `src/markdown/emit/line-escaping.ts:189` `escapeClosedRuns`: needs `spec/flavour.md` Escaping open
|
|
|
|
Inherited architect, would restructure first:
|
|
|
|
- Navigation: `src/markdown/portable/conventions.ts:23` `flavourClaims`: every flavour's switchboard sits in `portable/`
|
|
- Locality: `src/markdown/emit/adf-to-markdown.ts:117` `readableBlock`: reader acceptance hangs on emitter verdicts
|