29 KiB
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:7mintTaskIds: one walk, no carried set filled by the parser as a side effectsrc/markdown/parse/markdown-to-adf.ts:26Reading: plain data,codeBlockNodeno longer mutatescarriedsrc/markdown/portable/conventions.ts:8flavourClaims: one table states what each reader claims; branches name the claim they testsrc/markdown/parse/markdown-to-adf.ts:161quoteNode: the title is read in the reader's own flavour, no hop throughinlineLeavessrc/index.ts:5exports: each call named by its flavour; "plain" no longer means two things
Inherited architect, decided by:
src/markdown/parse/markdown-to-adf.ts:26Reading: the hiddencarriedset and the retryingmintTaskIdsare gonesrc/markdown/parse/markdown-to-adf.ts:161quoteNode: parser and emitter no longer correct only togethersrc/markdown/parse/markdown-to-adf.ts:113readBlock: branches name the claim (claims.alerts,claims.taskMarkers)src/index.ts:5exports: flavour names say which file to opensrc/markdown/portable/conventions.ts:3flavourClaims: cost, all three flavours' rows live underportable/
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:8flavourClaims: one table says what each flavour reads; every gate reads a named fieldsrc/markdown/portable/task-ids.ts:7mintTaskIds: one pass, no carried set crossing modulessrc/index.ts:5exports: each name says which markdown it meanssrc/markdown/parse/markdown-to-adf.ts:161quoteNode: no reach into the portable writer's reductionsrc/markdown/portable/conventions.ts:20ReadClaims: cost,directiveNodeleans on a type in another file
Inherited architect, decided by:
src/markdown/portable/task-ids.ts:6mintTaskIds: the retry loop and the parser-filled set are gonesrc/markdown/parse/markdown-to-adf.ts:26Reading: no hidden state; branches name the feature they gatesrc/markdown/portable/conventions.ts:8flavourClaims: cost, the table for all three flavours lives underportable/src/markdown/emit/line-escaping.ts:92escapeClaims: directive escaping under the flag the parser checkssrc/markdown/emit/adf-to-markdown.ts:146spellPortableBlock: 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:23MarkerParagraph: the block kind says a marker's paragraph holds no lone image, wherereadMarkedscanned its output afterwardssrc/markdown/emit/image.ts:7tryImage: builds what the reader would build and compares, whereimageShaperestated the shape by handsrc/markdown/parse/inline-content.ts:25InlineContent: one rule replaces five image refusal sites over two filessrc/markdown/external-image.ts:4centeredImage: one builder for the shape three literals heldsrc/markdown/parse/inline-content.ts:550pieceNodes: costs more — its image arm relies onassemblehaving linked every top-level image
Inherited architect, decided by:
src/markdown/external-image.ts:4centeredImage: the image's ADF shape is defined once for reader, emitter and portable reducersrc/markdown/parse/markdown-to-adf.ts:23MarkerParagraph: replacesreadMarked's after-the-fact search and its caller-computed flagsrc/result.ts:1ConvertErrorCode:unmappable-imageand its refusal paths are gonesrc/markdown/parse/inline-content.ts:43Image: costs more — four functions must agree on the image'slinksrc/markdown/parse/inline-content.ts:26InlineContent: 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:4centeredImage: one builder where three places built the image node by handsrc/markdown/emit/image.ts:7tryImage: compares against what the reader builds, whereimageShaperestated the shapesrc/markdown/parse/markdown-to-adf.ts:26TaskParagraph: a named block kind replacesreadMarked's after-the-fact index searchsrc/markdown/parse/inline-content.ts:302assemble: costs more — which of three readings an image takes hangs on a one-line condition and theinLinkflagsrc/markdown/parse/inline-content.ts:26InlineContent: costs more — no longer image xor nodes
Inherited architect, decided by:
src/markdown/external-image.ts:4centeredImage: the image shape is defined once for reader and both writerssrc/markdown/emit/image.ts:7tryImage: the emitter cannot drift from the readersrc/markdown/parse/markdown-to-adf.ts:136readBlock: the task paragraph is routed where the block is classifiedsrc/markdown/parse/inline-content.ts:302assemble: costs more — the most expensive line to decodesrc/markdown/parse/markdown-to-adf.ts:154paragraphsOf: 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:7tryImage: builds what the reader would build and compares, whereimageShaperestated the shapesrc/markdown/external-image.ts:4centeredImage: the image shape lives in one named filesrc/markdown/parse/markdown-to-adf.ts:26TaskParagraph: a typed block kind replacesreadMarked's after-the-fact searchsrc/markdown/parse/inline-content.ts:302assemble: costs more — one dense ternary overinLinksrc/markdown/parse/inline-content.ts:26InlineContent: costs more — no longer a discriminated union
Inherited architect, decided by:
src/markdown/external-image.ts:4centeredImage: one builder where three had to stay in stepsrc/markdown/parse/markdown-to-adf.ts:136readBlock: the task paragraph is routed by a named block kindsrc/result.ts:1ConvertErrorCode: one rule no longer enforced at five sitessrc/markdown/parse/inline-content.ts:26InlineContent: costs more —contentNodedropsimagesilentlysrc/markdown/parse/inline-content.ts:302assemble: 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:106takeFallback: a range may part joined breaks or carry, decided by state an earlier pass builtsrc/markdown/emit/inline-line.ts:316emitMarkedRun: a carry that signals parting totakeFallbacktwo levels upsrc/markdown/emit/inline-line.ts:233joinsRun: a lookahead whose shortcut holds only byinlineRuns' call ordersrc/markdown/emit/inline-line.ts:58portableLineFallback: a second retry loop sharing the partingsrc/adf/inline-nodes.ts:5InlineNodeModel.marks: reads as "has marks", not "takes marks"src/markdown/parse/inline-content.ts:328linkTo: the comment hides that the breaks stay after the destination
Inherited architect, decided by:
src/markdown/emit/inline-line.ts:331emitMarkedRun: the newline check returns a carry that is a parting signal, one fact over three functionssrc/markdown/emit/inline-line.ts:106takeFallback: two growing sets whose order matterssrc/markdown/emit/inline-line.ts:58portableLineFallback: a second retry loop with its own exit rulesrc/markdown/emit/inline-line.ts:233joinsRun: lookahead, shortcut and three conditions per break;inlineRunstakes the whole contextsrc/adf/inline-nodes.ts:5InlineNodeModel.marks: the name hides "takes marks"src/markdown/parse/inline-content.ts:328linkTo: 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:100takeFallback: the first fallback is discarded to stop joining, known only from a commentsrc/markdown/emit/inline-line.ts:200inlineRuns: an indexed loop moving its own counter byjoinedBreaks' resultsrc/markdown/emit/inline-line.ts:226joinedBreaks: six positional parameters and two jobs
Inherited architect, decided by:
src/markdown/emit/inline-line.ts:101takeFallback: a hidden first step that takes no fallbacksrc/markdown/emit/inline-line.ts:200inlineRuns: runs built by a forward scan the reader steps through by handsrc/markdown/emit/inline-line.ts:56portableLineFallback: checks an unjoined line while the final emit starts joinedsrc/markdown/emit/inline-line.ts:40LineFallbacks.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:5splitTaskList: the split rule is one named unit both directions import, where it sat inbulletNodeandreduceTaskList/nestIn - Self-sufficiency, Navigation:
src/adf/inline-nodes.ts:12inlineNodes: "a hard break takes no marks" is the fieldtakesMarks: false, read by parser and emitter - Shape:
src/markdown/portable/adf-to-portable-markdown.ts:289reduceTaskList: the loop lost itsnestedaccumulator andnestIn; line 303 packs the split and a merge into one expression - Shape, Locality:
src/markdown/portable/task-list.ts:8splitTaskList: astandingflag across iterations andstandsoverwritten mid-iteration;heldTasksays little - Locality:
src/markdown/parse/markdown-to-adf.ts:86readBlocks:bulletNodereturns a schema-breaking task list that its caller splits, and neither says so - Self-sufficiency:
src/markdown/parse/inline-content.ts:328linkTo: the comment covers the hard-break case
Inherited architect, decided by:
- Self-sufficiency:
src/markdown/portable/task-list.ts:5splitTaskList: the comment states the schema constraint, not the rule; the loop must be traced by hand - Locality:
src/markdown/parse/markdown-to-adf.ts:201bulletNode: builds a schema-breaking intermediate that onlyreadBlocksrepairs under an unexplained guard - Locality:
src/markdown/portable/adf-to-portable-markdown.ts:311reduceTask: droppingblankedCoderests on a guarantee neither unit states - Locality:
src/markdown/portable/adf-to-portable-markdown.ts:317nestIn: two hand-mirrored halves of one rule became one function - Self-sufficiency, Locality:
src/adf/inline-nodes.ts:12inlineNodes:takesMarks: falsemakes the hard-break rule checkable at its source - Self-sufficiency:
src/markdown/portable/adf-to-portable-markdown.ts:288reduceTaskList: the comment no longer prepares the reader for line 303 - Shape:
src/markdown/portable/task-list.ts:12splitTaskList:standing/standsreuse a wordreduceStandinguses for another meaning
Maintainability senior, decided by:
- Locality:
src/markdown/portable/task-list.ts:5splitTaskList: the stay-or-stand rule lives once, where the reader'sbulletNodeand the writer'snestInmirrored it - Locality:
src/markdown/parse/markdown-to-adf.ts:86readBlocks:bulletNodereturns a shape the caller quietly replaces, behind an unexplainedblock.kindguard - Shape:
src/markdown/portable/task-list.ts:9splitTaskList: two cross-iteration accumulators, a negated compound ternary, near-synonym names, andheldTaskhides the taskItem conversion - Shape:
src/markdown/portable/adf-to-portable-markdown.ts:303reduceTaskList: one 180-character line maps the split and re-merges - Shape:
AGENTS.md:28decision index: a title grew into a two-clause sentence
Junior A, decided by:
- Locality, Navigation:
src/markdown/portable/task-list.ts:5splitTaskList: one function decides for reader and writer, where each had its own rule - Locality:
src/markdown/parse/markdown-to-adf.ts:86readBlocks:bulletNodereturns an unfinished shape only the caller completes - Locality:
src/adf/inline-nodes.ts:3InlineNodeModel.takesMarks: the hard break's rule lives in one row both directions read - Shape:
src/markdown/portable/task-list.ts:5splitTaskList: a carriedstandingflag, a reassignedstands, andheldTask's name hides the conversion - Navigation:
src/markdown/parse/markdown-to-adf.ts:22imports: 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:289reduceTaskList: a plain collect loop handing the list tosplitTasks, where the base carried anestedaccumulator andnestInmutatedtasks - Locality:
src/markdown/portable/task-list.ts:6splitTaskList: reader and writer share one rule, wherebulletNodeandnestIneach encoded it - Locality, Shape:
src/markdown/parse/markdown-to-adf.ts:84readBlocks: the portable task list is caught beforereadBlock, which depends on that order - Shape:
src/markdown/portable/task-list.ts:33itemParts:paragraphsandnestedare indices named like collections, and the demotion totaskItemis unnamed - Navigation, Shape:
src/adf/block-nodes.ts:92isTaskItem: one findable predicate, against one more hop from a parse symptom
Inherited architect, decided by:
- Locality, Navigation, Overall:
src/markdown/portable/task-list.ts:6splitTaskList: one unit decides where a task item's blocks go, for reader and writer - Locality, Shape:
src/markdown/portable/adf-to-portable-markdown.ts:289reduceTaskList: one pass then one call, no state carried across iterations - Self-sufficiency, Locality:
src/adf/inline-nodes.ts:5takesMarks: the hard-break rule is a field both directions read - Shape:
src/markdown/portable/task-list.ts:33itemParts: an index overcontentused overrun, andnestedrunning into the siblings - Shape, Locality:
src/markdown/parse/markdown-to-adf.ts:84readBlocks: a third special case ahead of the dispatch - Shape:
src/adf/block-nodes.ts:92isTaskItem: one predicate replaces two copies - Self-sufficiency:
src/markdown/portable/task-list.ts:5comment: 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:118portableSequence: a plain splice withindex -= 1, where the base merged neighbours after every splice throughspliced,mergedLists,joinedListsandsplitTasks - Locality, Navigation:
src/markdown/parse/markdown-to-adf.ts:98listBreakFault: gone, with the base's look atblocks[index - 1]andblocks[index + 1]and the separator spelled in four places - Navigation, Shape:
src/markdown/parse/blocks.ts:232continuesList: one named predicate on kind and delimiter thatitemStartandopenedListshare - Locality:
src/markdown/emit/adf-to-markdown.ts:73joinBlocks: a toggledalternatedflag decides each list's text from the one before it, andisOrderedcounts a task list as a bullet list unsaid - Shape:
src/markdown/emit/adf-to-markdown.ts:334spelledList:tryListbuilds both spellings then falls back once, andtryTaskListshares the helper
Inherited architect, decided by:
- Locality, Shape, Overall:
src/markdown/portable/adf-to-portable-markdown.ts:118portableSequence: a filter and a loop ending inindex -= 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:79readBlocks: reads one block at a time, where the base judged a separator by its siblings - Locality:
src/markdown/emit/adf-to-markdown.ts:73joinBlocks: a toggle carried across iterations sends a third adjacent list back to-, seen only by tracing - Shape:
src/markdown/emit/adf-to-markdown.ts:334spelledList: the both-or-neither rule is one uncommented expression - Self-sufficiency:
src/markdown/emit/adf-to-markdown.ts:369tryListItemLines:inner.startsWith('*')depends on the alternate bullet being*, and the comment needs the inline escaping worked out - Self-sufficiency:
src/markdown/parse/blocks.ts:232continuesList: 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:118portableSequence: 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:70readBlocks: handles each block alone, where the base judged a separator by its neighbours across five places - Shape, Self-sufficiency:
src/markdown/parse/blocks.ts:232continuesList: one named predicate on kind and delimiter, its rule stated in place - Self-sufficiency, Locality:
src/markdown/emit/adf-to-markdown.ts:27SpelledBlock: its comment states whyalternateTextexists, thoughjoinBlocksnow carries a toggle across siblings - Shape:
src/markdown/emit/adf-to-markdown.ts:334spelledList: line building in small units, the fallback once after the loop, shared bytryTaskList - Self-sufficiency:
src/markdown/emit/adf-to-markdown.ts:369tryListItemLines: the*branch's comment needs a reread
Inherited architect, decided by:
- Locality, Shape, Overall:
src/markdown/portable/adf-to-portable-markdown.ts:118portableSequence: a work stack replacing six helpers and the base's cursor rewind - Locality, Navigation:
src/markdown/parse/markdown-to-adf.ts:70readBlocks: each block reads alone, and two merged lists lead to one emitter and one parser unit - Locality, Navigation:
src/markdown/parse/blocks.ts:232continuesList: a list continues exactly where CommonMark says, checkable without the spec - Locality:
src/markdown/emit/adf-to-markdown.ts:72joinBlocks: 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:334spelledList: one exit to the directive form, though bullets pass() => ''as the number - Self-sufficiency:
src/markdown/emit/adf-to-markdown.ts:369tryListItemLines: 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:20readInlineToken: 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:102escapeClaims: the order-dependentafterEscapeandpairsEqualsflags are gone; runs go whole toescapeRunand fixed inputs ride oneEscapeWalkrecord - Shape, Navigation:
src/markdown/parse/inline-content.ts:110scanInline: a two-level character dispatch and eight helpers became one switch over token kinds - Shape:
src/markdown/emit/line-escaping.ts:158claimsCharacter: switches ontoken.kindin place of a chain of character tests
Inherited architect, decided by:
- Navigation, Shape:
src/markdown/inline-tokens.ts:20readInlineToken: one tokenizer answers what the reader sees at an index, where two parallel implementations had to agree - Locality:
src/markdown/emit/line-escaping.ts:112escapeClaims: each step reads on its own, no flag carried from the previous character - Shape:
src/markdown/emit/line-escaping.ts:158claimsCharacter: switches on the token kind and takes the shared record; the heading closer is worked out once inclosingHashes - Shape, Navigation:
src/markdown/parse/inline-content.ts:121readToken: one exhaustive switch overInlineToken['kind']replaces a two-level dispatch - Locality:
src/markdown/emit/line-escaping.ts:173claimsCharacter:default: return trueclaims 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:21readInlineToken: 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:156claimsCharacter: a flat switch on the token kind over a readonlyEscapeWalk, where one character's escape hung on flags the previous iteration set - Shape:
src/markdown/parse/inline-content.ts:121readToken: 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:14ClaimedPrefix: the directive read can no longer answer that no prefix stands there - Shape:
src/markdown/emit/line-escaping.ts:147claimsRunRest: 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:21readInlineToken: the 3am symptom of an unescaped character leads to one file both directions ask - Locality, Shape:
src/markdown/emit/line-escaping.ts:156claimsCharacter: an exhaustive switch read one case at a time, where the decision needed replaying the loop forpairsEquals - Shape, Locality:
src/markdown/parse/inline-content.ts:121readToken: one pure tokenizer and one switch that applies tokens - Shape:
src/markdown/directive-syntax.ts:14ClaimedPrefix: the directive read needs proof of its prefix, and the misnamedopensConstructis gone - Locality:
src/markdown/emit/line-escaping.ts:112escapeClaims: 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:79Walk.endedByDefinitions: written incloseLeafat:469and read inopenedListat:257, never cleared, correct only by identity withblocks.at(-1);closeLeaftakes on recording where definitions ended a list
Inherited architect, decided by:
- Locality:
src/markdown/parse/blocks.ts:79Walk.endedByDefinitions: a never-reset fieldcloseLeafwrites andopenedListreads, right only by identity and byopenContainersclosing before it opens; reordering those steps breaks the split silently - Locality:
src/markdown/parse/blocks.ts:432readLineBlock: 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:252openedList: the comment names the exception, so a reader of two lists merged or not lands on the right unit - Navigation:
README.md:242the 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:229splitPath: builds stand-in nodes and replayssplitTaskListto place a refused block's path, checkable only by knowing how the split moves blocks - Locality, Self-sufficiency:
src/markdown/portable/task-list.ts:23splitPlace: finds the stand-in by object identity, which holds only whiletaskOfParagraphskeeps the original children, and nothing there says so - Locality:
src/markdown/parse/blocks.ts:262endList:closeLeaffillsWalk.endedListsandopenedListreads it, whereopenedListlooked only at the previous block
Inherited architect, decided by:
- Locality, Self-sufficiency, Overall:
src/markdown/parse/markdown-to-adf.ts:229splitPath: a fake task list replayed throughsplitTaskListand found again by identity; iftaskOfParagraphsever copies nodes the old wrong path returns silently - Shape, Locality:
src/markdown/parse/markdown-to-adf.ts:203bulletBlocks: onereadBlockscall became a per-block loop with a hand-built failure, a second depth check and a fan-out throughtaskItems,splitPath,childTypeandsplitPlace;Refusalnames a context bag - Locality:
src/markdown/parse/blocks.ts:78Walk.endedLists: identity-keyed walk state thatcloseLeafwrites andopenedListreads - Shape:
src/markdown/portable/adf-to-portable-markdown.ts:354reduceMedia: the callback'sheldshadows 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:229splitPath: replayssplitTaskList's internals to name a path - Self-sufficiency:
src/markdown/emit/line-escaping.ts:189escapeClosedRuns: the escaping rule lives inspec/flavour.md
Mid A, hardest first:
- Locality:
src/markdown/emit/adf-to-markdown.ts:30SpellingMemo: reference-keyed memo shared by parse and emit - Self-sufficiency:
src/markdown/parse/inline-content.ts:62Scan: rules read withspec/flavour.mdopen alongside
Maintainability senior, hardest first:
- Locality:
src/markdown/parse/markdown-to-adf.ts:257directiveNode: the parser asks the emitter whether input was legal - Self-sufficiency:
src/markdown/emit/line-escaping.ts:189escapeClosedRuns: needsspec/flavour.mdEscaping open
Inherited architect, would restructure first:
- Navigation:
src/markdown/portable/conventions.ts:23flavourClaims: every flavour's switchboard sits inportable/ - Locality:
src/markdown/emit/adf-to-markdown.ts:117readableBlock: reader acceptance hangs on emitter verdicts