@descent-vtt/spec-graph 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Document extraction: Markdown in, graph fragments out.\n *\n * This module is where domain-agnosticism is won or lost. It never requires a\n * repository to adopt a syntax. It reads what teams already write - front\n * matter, a `## Status` section, a checklist under `## Open Questions`, a link\n * that says \"deferred to ADR-0011\" - and turns each into a typed relation with a\n * source position.\n *\n * The one rule it holds to everywhere: **an inference that cannot be justified\n * is not made.** An unrecognised status becomes `unknown`, not a guess. A link\n * with no governing verb becomes a neutral `references`, not a dependency. Bare\n * identifiers found in prose are opportunistic and are dropped silently when\n * they do not resolve, because the alternative is reporting `SHA-256` as a\n * broken reference to specification 256.\n */\n\nimport { attr, attrList, directiveFor, parseDirectives, type Directive } from './directives.js';\nimport {\n identify,\n isDocumentTarget,\n isExternal,\n looksLikePath,\n normaliseRef,\n parsePrefixedRef,\n withinOneEdit,\n type DocumentIdentity,\n ID_KEYS,\n} from './identity.js';\nimport { isStatusHeading, phaseFromPath, phaseOf, STATUS_KEYS, supersessionTargetsIn } from './lifecycle.js';\nimport { scanMarkdown, slugify, type Link, type ListItem, type ScannedDocument } from './markdown.js';\nimport { findSpecificationRegions, regionAt, type SpecificationRegion } from './sections.js';\nimport { resolveItemState } from './state.js';\nimport { refOf, type LineIndex } from './source.js';\nimport type {\n DocumentNode,\n EdgeKind,\n EdgeOrigin,\n ItemNode,\n MisreadKey,\n ParseProblem,\n Phase,\n SourceRef,\n} from './types.js';\nimport { parseFrontMatter, toRecord, valuesOf, type YamlEntry } from './yaml.js';\n\n/* -------------------------------------------------------------------------- */\n/* Output */\n/* -------------------------------------------------------------------------- */\n\n/**\n * A relation that has been read but not yet resolved to a target node.\n *\n * Resolution needs the whole corpus, so extraction stops at the raw target text.\n */\nexport interface ReferenceCandidate {\n readonly kind: EdgeKind;\n /** Id of the node the relation was written on. */\n readonly from: string;\n /** The target exactly as written: a path, an identifier, or a URL. */\n readonly target: string;\n readonly origin: EdgeOrigin;\n readonly declaredAt: SourceRef;\n readonly raw: string;\n /**\n * When true the relation runs `target -> from`.\n *\n * `superseded-by: ADR-0009` written in ADR-0003 declares that *ADR-0009*\n * supersedes ADR-0003. The edge belongs to ADR-0009; the line a human must go\n * and fix is in ADR-0003, which is why `declaredAt` is tracked separately.\n */\n readonly inverted: boolean;\n /**\n * Opportunistic references are dropped in silence when they do not resolve.\n * Only deliberate ones - links, front matter, directives - are reported.\n */\n readonly opportunistic: boolean;\n}\n\nexport interface ExtractedDocument {\n readonly document: DocumentNode;\n readonly items: readonly ItemNode[];\n readonly references: readonly ReferenceCandidate[];\n readonly problems: readonly ParseProblem[];\n /**\n * Front-matter keys that read as relations and declared none.\n *\n * Kept apart from `problems` because a problem is about the text and this is\n * about the graph: the edge the author wrote down is not in it.\n */\n readonly misreadKeys: readonly MisreadKey[];\n /** Heading slugs, for resolving `#anchor` references into this document. */\n readonly anchors: ReadonlySet<string>;\n readonly identity: DocumentIdentity;\n readonly scanned: ScannedDocument;\n /**\n * Specifications declared inside this file, each a document in its own right.\n *\n * Empty for the ordinary one-file-per-decision layout, which is why nothing\n * downstream had to change to support registers.\n */\n readonly subSpecifications: readonly ExtractedDocument[];\n /**\n * The file-level specification this one is a region of, if any.\n *\n * Recorded so the register's structure is a relation in the graph rather than\n * an accident of which offsets fall inside which: \"what decisions does this\n * register hold\" is a question worth being able to ask.\n */\n readonly containerId: string | null;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Vocabulary */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Front-matter keys that declare a relation, and what they mean.\n *\n * Every directional kind is spelled in **both** directions. A register that\n * records `depends-on` but not `depended-on-by` is not a smaller vocabulary, it\n * is a trap: the author writes the inverse, the key means nothing, and the edge\n * they declared is missing from a graph that reports itself as consistent. Which\n * half of a pair a repository writes is a filing convention, and a filing\n * convention is not something a linter gets to have an opinion about.\n *\n * `relates-to` is the exception, and it is not one: the relation is symmetric,\n * so it has no other direction to spell. `contains` is structural and never\n * written by hand. `tests/parsing.test.ts` holds both facts to the fire.\n */\nexport const RELATION_KEYS: Readonly<Record<string, { kind: EdgeKind; inverted: boolean }>> = {\n supersedes: { kind: 'supersedes', inverted: false },\n supercedes: { kind: 'supersedes', inverted: false },\n replaces: { kind: 'supersedes', inverted: false },\n obsoletes: { kind: 'supersedes', inverted: false },\n deprecates: { kind: 'supersedes', inverted: false },\n 'superseded-by': { kind: 'supersedes', inverted: true },\n 'superceded-by': { kind: 'supersedes', inverted: true },\n 'replaced-by': { kind: 'supersedes', inverted: true },\n 'obsoleted-by': { kind: 'supersedes', inverted: true },\n 'deprecated-by': { kind: 'supersedes', inverted: true },\n 'rolled-into': { kind: 'supersedes', inverted: true },\n amends: { kind: 'amends', inverted: false },\n extends: { kind: 'amends', inverted: false },\n refines: { kind: 'amends', inverted: false },\n clarifies: { kind: 'amends', inverted: false },\n revises: { kind: 'amends', inverted: false },\n 'amended-by': { kind: 'amends', inverted: true },\n 'extended-by': { kind: 'amends', inverted: true },\n 'refined-by': { kind: 'amends', inverted: true },\n 'clarified-by': { kind: 'amends', inverted: true },\n 'revised-by': { kind: 'amends', inverted: true },\n 'depends-on': { kind: 'depends-on', inverted: false },\n 'dependent-on': { kind: 'depends-on', inverted: false },\n dependencies: { kind: 'depends-on', inverted: false },\n requires: { kind: 'depends-on', inverted: false },\n 'builds-on': { kind: 'depends-on', inverted: false },\n 'relies-on': { kind: 'depends-on', inverted: false },\n 'depended-on-by': { kind: 'depends-on', inverted: true },\n 'required-by': { kind: 'depends-on', inverted: true },\n dependents: { kind: 'depends-on', inverted: true },\n assumes: { kind: 'assumes', inverted: false },\n 'assumed-by': { kind: 'assumes', inverted: true },\n 'blocked-by': { kind: 'blocked-by', inverted: false },\n 'blocked-on': { kind: 'blocked-by', inverted: false },\n 'waiting-on': { kind: 'blocked-by', inverted: false },\n 'waiting-for': { kind: 'blocked-by', inverted: false },\n 'gated-on': { kind: 'blocked-by', inverted: false },\n 'gated-by': { kind: 'blocked-by', inverted: false },\n blocks: { kind: 'blocked-by', inverted: true },\n 'delegates-to': { kind: 'delegates-to', inverted: false },\n 'delegated-to': { kind: 'delegates-to', inverted: false },\n 'deferred-to': { kind: 'delegates-to', inverted: false },\n 'tracked-in': { kind: 'delegates-to', inverted: false },\n 'tracked-by': { kind: 'delegates-to', inverted: false },\n 'continued-in': { kind: 'delegates-to', inverted: false },\n 'delegated-from': { kind: 'delegates-to', inverted: true },\n related: { kind: 'relates-to', inverted: false },\n 'relates-to': { kind: 'relates-to', inverted: false },\n 'related-to': { kind: 'relates-to', inverted: false },\n 'see-also': { kind: 'relates-to', inverted: false },\n references: { kind: 'references', inverted: false },\n reference: { kind: 'references', inverted: false },\n refs: { kind: 'references', inverted: false },\n 'referenced-by': { kind: 'references', inverted: true },\n};\n\n/**\n * True when a front-matter value is shaped like a citation.\n *\n * The second half of the gate on {@link misreadRelationKeys}, and the half that\n * does the work. `sidebar_position: 4` and `ref: main` are a hair away from a\n * relation key by spelling alone; neither carries anything that could name a\n * document, and reporting them would make the rule an irritation rather than a\n * catch (ADR-0006).\n */\nfunction looksLikeCitation(value: string): boolean {\n const trimmed = value.trim();\n if (trimmed.length === 0) return false;\n if (parsePrefixedRef(trimmed) !== null) return true;\n return looksLikePath(trimmed) && isDocumentTarget(trimmed) && !isExternal(trimmed);\n}\n\n/**\n * Front-matter keys that read as relations and declare none.\n *\n * Front matter is an open vocabulary and most of what lives there is nobody\n * else's business, so the bar is deliberately high: the key has to be one edit\n * from a relation key *and* carry something that could name a document. Both\n * conditions together are what separates `dependson: ADR-0001`, which is an edge\n * the author believes exists, from `description: ...`, which is a title.\n */\nfunction misreadRelationKeys(\n byKey: ReadonlyMap<string, YamlEntry>,\n from: string,\n at: (start: number, end: number) => SourceRef,\n): MisreadKey[] {\n const out: MisreadKey[] = [];\n for (const [key, entry] of byKey) {\n const folded = foldRelationKey(key);\n if (folded.length === 0 || RELATION_INDEX.has(folded)) continue;\n if (!valuesOf(entry).some(looksLikeCitation)) continue;\n const near = [...RELATION_INDEX.values()]\n .filter((relation) => withinOneEdit(folded, foldRelationKey(relation.canonical)))\n .map((relation) => relation.canonical);\n if (near.length === 0) continue;\n out.push({ key, suggestion: near.join(', '), from, at: at(entry.start, entry.end) });\n }\n return out;\n}\n\n/**\n * Folds a front-matter key to its lookup form.\n *\n * `depends-on`, `depends_on`, `dependsOn` and `Depends On` are one key written\n * four ways, and which one a repository uses is decided by whatever wrote the\n * front matter first. Dropping every separator collapses them - the YAML reader\n * has already lower-cased the key, which is what makes camel case fold too.\n *\n * Which case this folds to is arbitrary and no test pins it: both sides of every\n * comparison come through here, so upper would work exactly as well. Asserting\n * on it would be asserting on the implementation.\n */\nexport function foldRelationKey(key: string): string {\n return key.replace(/[^a-z0-9]/gi, '').toLowerCase();\n}\n\n/** The vocabulary above, indexed by folded key. */\nconst RELATION_INDEX: ReadonlyMap<string, { kind: EdgeKind; inverted: boolean; canonical: string }> = new Map(\n Object.entries(RELATION_KEYS).map(([canonical, relation]) => [\n foldRelationKey(canonical),\n { ...relation, canonical },\n ]),\n);\n\n/**\n * Phrases that give a link its meaning, longest-matching-nearest wins.\n *\n * Only phrases that genuinely commit the citing document are here. Vague ones\n * (\"see\", \"covered by\") stay out: a `references` edge is harmless, whereas a\n * wrongly inferred `assumes` edge produces a confident stale-premise finding\n * about a document that never depended on anything.\n */\nconst VERB_RULES: readonly { kind: EdgeKind; inverted: boolean; phrases: readonly string[] }[] = [\n {\n kind: 'supersedes',\n inverted: true,\n phrases: ['superseded by', 'superceded by', 'replaced by', 'obsoleted by', 'deprecated by', 'rolled into'],\n },\n { kind: 'supersedes', inverted: false, phrases: ['supersedes', 'supercedes', 'replaces', 'obsoletes', 'deprecates'] },\n { kind: 'amends', inverted: true, phrases: ['amended by', 'refined by', 'clarified by', 'revised by'] },\n { kind: 'amends', inverted: false, phrases: ['amends', 'refines', 'clarifies', 'revises'] },\n {\n kind: 'delegates-to',\n inverted: false,\n phrases: [\n 'delegated to',\n 'delegate to',\n 'deferred to',\n 'defer to',\n 'moved to',\n 'move to',\n 'tracked in',\n 'tracked by',\n 'handed off to',\n 'handed to',\n 'hand off to',\n 'follow up in',\n 'follow-up in',\n 'followup in',\n 'continued in',\n 'continues in',\n 'punted to',\n 'left to',\n 'belongs in',\n 'owned by',\n 'will be decided in',\n 'will be resolved in',\n 'will be handled in',\n 'will be handled by',\n 'will be answered in',\n 'to be decided in',\n 'to be resolved in',\n 'to be handled in',\n 'to be answered in',\n ],\n },\n {\n kind: 'blocked-by',\n inverted: false,\n phrases: ['blocked by', 'blocked on', 'waiting on', 'waiting for', 'gated on', 'gated by', 'unblocked by'],\n },\n { kind: 'blocked-by', inverted: true, phrases: ['blocks', 'blocking'] },\n {\n kind: 'depends-on',\n inverted: false,\n phrases: ['depends on', 'depend on', 'dependent on', 'requires', 'builds on', 'built on', 'relies on'],\n },\n { kind: 'depends-on', inverted: true, phrases: ['depended on by'] },\n {\n kind: 'assumes',\n inverted: false,\n phrases: [\n 'assumes',\n 'assuming',\n 'on the assumption of',\n 'as decided in',\n 'as established in',\n 'as established by',\n 'as stated in',\n 'as specified in',\n 'as required by',\n 'as mandated by',\n 'in accordance with',\n 'constrained by',\n 'mandated by',\n 'governed by',\n 'predicated on',\n 'rests on',\n 'follows from',\n 'justified by',\n // A constraint the citing document designs around. \"the row limit imposed\n // by ADR-0002\" is the archetypal stale premise: when ADR-0002 is retired,\n // this document is still working around a cap that no longer exists.\n 'imposed by',\n 'required by',\n 'dictated by',\n 'determined by',\n 'limited by',\n 'capped by',\n 'bounded by',\n 'defined by',\n 'defined in',\n 'specified by',\n 'set by',\n 'per',\n 'because',\n 'since',\n ],\n },\n];\n\n/**\n * Words that cancel a governing phrase standing before them.\n *\n * The window allows a short noun phrase between a verb and the reference it\n * governs - \"deferred to the sharding decision in [ADR-7]\" is one statement.\n * It cannot allow a negation. A table entry reading \"Owned by nobody today and\n * disclaimed by [138]\" was being read as a delegation *to* 138, which is the\n * opposite of what the sentence says, and an inference that inverts its source\n * is worse than no inference at all.\n */\nconst NEGATION = /(?:^|\\s)(?:no|not|nobody|none|never|neither|nor|nothing|without)(?:\\s|$)/;\n\n/** How close a governing phrase must sit to the reference it governs. */\nconst VERB_WINDOW = 40;\n\n/**\n * Every governing phrase compiled into one alternation, plus a lookup table.\n *\n * Classification runs on every reference in the corpus, and testing a hundred\n * phrases one at a time made it the most expensive thing extraction did. The\n * alternation is sorted longest-first so that at any given position the regex\n * prefers `partially resolved` over `resolved`, matching the precedence the\n * per-phrase search had. Lookarounds rather than `\\b`, because phrases contain\n * hyphens and `\\b` does the wrong thing around them.\n */\nconst VERB_LOOKUP: ReadonlyMap<string, Classification> = new Map(\n VERB_RULES.flatMap((rule) =>\n rule.phrases.map((phrase) => [phrase, { kind: rule.kind, inverted: rule.inverted }] as const),\n ),\n);\n\nconst VERB_PATTERN = new RegExp(\n `(?<![\\\\p{L}\\\\p{N}])(?:${[...VERB_LOOKUP.keys()]\n .sort((a, b) => b.length - a.length)\n .map((phrase) => phrase.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('|')})(?![\\\\p{L}\\\\p{N}])`,\n 'gu',\n);\n\n/** Headings under which a link is bookkeeping rather than a commitment. */\nconst WEAK_SECTIONS: ReadonlySet<string> = new Set([\n 'see also',\n 'references',\n 'reference',\n 'related',\n 'related work',\n 'related decisions',\n 'related documents',\n 'links',\n 'further reading',\n 'prior art',\n 'history',\n 'changelog',\n 'change log',\n 'revision history',\n 'bibliography',\n 'sources',\n 'appendix',\n 'more information',\n 'resources',\n 'index',\n]);\n\n/** Headings whose bullets are obligations even without a checkbox. */\nconst OBLIGATION_SECTIONS: ReadonlySet<string> = new Set([\n 'open questions',\n 'open question',\n 'unresolved questions',\n 'unanswered questions',\n 'questions',\n 'open issues',\n 'action items',\n 'actions',\n 'todo',\n 'to do',\n 'to-do',\n 'todos',\n 'next steps',\n 'follow ups',\n 'follow-ups',\n 'followups',\n 'follow up',\n 'follow-up',\n 'unresolved',\n 'outstanding',\n 'outstanding questions',\n 'tasks',\n 'task list',\n 'work items',\n 'remaining work',\n 'decisions needed',\n 'blockers',\n 'parking lot',\n 'future work',\n 'deferred',\n]);\n\n/**\n * Prefixes that look like specification identifiers but never are.\n *\n * The corpus filter in `resolve.ts` is the real defence; this list only keeps\n * the obvious noise out of the candidate set.\n */\nconst NOT_A_FAMILY: ReadonlySet<string> = new Set([\n 'v',\n 'ver',\n 'version',\n 'p',\n 'pp',\n 'fig',\n 'figure',\n 'table',\n 'tbl',\n 'section',\n 'sect',\n 'sec',\n 'step',\n 'item',\n 'no',\n 'num',\n 'line',\n 'ln',\n 'col',\n 'port',\n 'pr',\n 'issue',\n 'gh',\n 'utf',\n 'ascii',\n 'sha',\n 'md',\n 'http',\n 'https',\n 'ipv',\n 'tls',\n 'ssl',\n 'es',\n 'ecma',\n 'x',\n 'h',\n 'p99',\n 'base',\n 'sql',\n 'ipv4',\n 'ipv6',\n 'arm',\n 'x86',\n 'win',\n 'node',\n 'python',\n 'java',\n 'go',\n 'c',\n 'cpp',\n]);\n\nconst BARE_REF = /\\b([A-Za-z][A-Za-z0-9]{0,14})[\\s._-]?(\\d{1,6})\\b/g;\n\n/* -------------------------------------------------------------------------- */\n/* Extraction */\n/* -------------------------------------------------------------------------- */\n\nexport interface ExtractInput {\n /** Repository-relative POSIX path. */\n readonly path: string;\n readonly text: string;\n /**\n * This file is a historical record: a log of what was decided, not a\n * decision. Matched against the caller's history patterns, because deciding\n * which files those are is a repository's business and not a guess this\n * layer could justify making. See ADR-0011.\n */\n readonly record?: boolean | undefined;\n}\n\n/**\n * Reads one file into graph fragments, one entry per specification in it.\n *\n * A file yields at least itself. It yields more when it is a register: a\n * heading that carries an identifier *and* declares a status is a specification\n * in its own right, with its own lifecycle, its own obligations and its own\n * relations. See ADR-0009.\n */\nexport function extractSpecifications(input: ExtractInput): ExtractedDocument[] {\n const first = extractDocument(input);\n return first === null ? [] : [first, ...(first.subSpecifications as ExtractedDocument[])];\n}\n\n/** Reads a file's own specification. Returns `null` when it opts out. */\n/** The one character that makes a text file read as binary to other tools. */\nconst NUL = '\\u0000';\n\nexport function extractDocument(input: ExtractInput): ExtractedDocument | null {\n const scanned = scanMarkdown(input.text);\n const directives = parseDirectives(scanned.comments);\n if (directives.some((d) => d.name === 'spec-ignore')) return null;\n\n const index = scanned.index;\n const file = input.path;\n const problems: ParseProblem[] = [];\n const at = (start: number, end: number): SourceRef => refOf(file, index, start, end);\n\n const nul = input.text.indexOf(NUL);\n if (nul !== -1) {\n // Not a finding. Nothing about the graph is wrong, and the text parsed - a\n // NUL is whitespace to every rule here. It is a problem with the *input*,\n // which is what a ParseProblem is for, and it is worth one line because\n // spec-graph is likely the only tool that got this far: grep, diff and\n // every review interface read the file as binary and show nothing at all.\n //\n // The cause is almost always an encoding, not a keystroke. UTF-16 read as\n // UTF-8 puts a NUL between every character, and the document that produces\n // looks plausible in some editors and is mojibake everywhere else.\n problems.push({\n message: `contains a NUL byte, so grep, diff and review tooling read this file as binary - check whether it was saved as UTF-16`,\n at: at(nul, nul + 1),\n });\n }\n\n for (const directive of directives) {\n for (const unknown of directive.unknownAttributes) {\n problems.push({\n message: `unknown attribute \"${unknown}\" on @${directive.name}`,\n at: at(directive.start, directive.end),\n });\n }\n }\n\n const entries = scanned.frontMatter ? parseFrontMatter(scanned.frontMatter.raw, scanned.frontMatter.start) : [];\n const byKey = new Map<string, YamlEntry>();\n for (const entry of entries) byKey.set(entry.key, entry);\n\n const h1 = scanned.headings.find((h) => h.level === 1) ?? null;\n const frontMatterId = firstValue(byKey, ID_KEYS) ?? null;\n\n const identityOf = (declaredId: string | null, directive: Directive | null): DocumentIdentity =>\n identify({\n path: input.path,\n declaredId,\n declaredAliases: [\n ...(directive ? attrList(directive, 'aliases') : []),\n ...valuesOf(byKey.get('aliases')),\n ...valuesOf(byKey.get('alias')),\n ],\n heading: h1?.text ?? null,\n });\n\n // A `@spec-node` written inside a register's section belongs to that section,\n // not to the file. Finding the file's own therefore needs the regions, and\n // finding the regions needs the file's identity - so the identity is settled\n // provisionally first, then again once the file's own directive is known.\n const provisional = identityOf(frontMatterId, null);\n const provisionalRegions = findSpecificationRegions(scanned, directives, provisional.id);\n const nodeDirective =\n directives.find(\n (directive) =>\n directive.name === 'spec-node' &&\n !provisionalRegions.some(\n (region) =>\n (region.heading !== null || region.row !== null) &&\n directive.start >= region.start &&\n directive.end <= region.end,\n ),\n ) ?? null;\n\n const declaredId = (nodeDirective ? attr(nodeDirective, 'id')?.value : null) ?? frontMatterId;\n const identity = declaredId === frontMatterId && nodeDirective === null\n ? provisional\n : identityOf(declaredId, nodeDirective);\n\n const status = readStatus(scanned, byKey, nodeDirective, index, file);\n const pathPhase = phaseFromPath(input.path);\n // A record is a categorical statement about what the file *is*, made by\n // configuration or by an explicit directive, so it outranks a status word\n // that happened to be written inside it.\n const record = input.record === true || directives.some((directive) => directive.name === 'spec-history');\n const phase: Phase = record ? 'record' : status.phase !== 'unknown' ? status.phase : pathPhase;\n\n const title =\n (nodeDirective ? attr(nodeDirective, 'title')?.value : null) ??\n asString(byKey.get('title')) ??\n h1?.text ??\n identity.id;\n\n const document: DocumentNode = {\n id: identity.id,\n kind: 'document',\n title,\n at: at(0, Math.min(scanned.text.length, index.lineEnd(1))),\n path: input.path,\n aliases: identity.aliases,\n phase,\n rawStatus: status.raw,\n statusAt: status.at,\n frontMatter: toRecord(entries),\n };\n\n // A register's sections are specifications too. The file is always the first\n // region, so a one-decision file behaves exactly as it did before.\n const regions =\n identity.id === provisional.id ? provisionalRegions : findSpecificationRegions(scanned, directives, identity.id);\n // Every region but the first: a heading section, or a row of a register kept\n // as a table.\n const subSpecifications = regions\n .filter((region) => region.heading !== null || region.row !== null)\n .map((region) =>\n buildRegion({\n region,\n containerId: identity.id,\n input,\n scanned,\n directives,\n index,\n file,\n pathPhase,\n record,\n }),\n );\n\n const ownerAt = (offset: number): string => {\n const region = regionAt(regions, offset);\n if (region === null) return identity.id;\n const owner = subSpecifications.find((spec) => spec.region === region);\n return owner?.document.id ?? identity.id;\n };\n\n const allItems = extractItems({ scanned, directives, ownerAt, file, index });\n const documentAt = (offset: number): DocumentNode => {\n const id = ownerAt(offset);\n if (id === identity.id) return document;\n return subSpecifications.find((spec) => spec.document.id === id)?.document ?? document;\n };\n\n const allReferences = extractReferences({\n scanned,\n directives,\n document,\n documentAt,\n items: allItems,\n byKey,\n status,\n claimed: regions.flatMap((region) => [...region.claimed]),\n file,\n index,\n });\n\n // Hand each region the items and references that fall inside it.\n const ownItems = allItems.filter((item) => item.document === identity.id);\n const ownReferences = allReferences.filter((reference) => belongsTo(reference, identity.id, allItems));\n const misreadKeys = misreadRelationKeys(byKey, identity.id, at);\n const anchors = new Set<string>(scanned.headings.map((h) => h.slug));\n\n const filled = subSpecifications.map((spec) => ({\n ...spec.extracted,\n items: allItems.filter((item) => item.document === spec.document.id),\n references: [\n // Column-declared relations first: they are typed by the header rather\n // than guessed from prose.\n ...spec.extracted.references,\n ...allReferences.filter((reference) => belongsTo(reference, spec.document.id, allItems)),\n ],\n }));\n\n return {\n document,\n items: ownItems,\n references: ownReferences,\n problems,\n misreadKeys,\n anchors,\n identity,\n scanned,\n subSpecifications: filled,\n containerId: null,\n };\n}\n\n/** True when a reference was written on a document or on one of its items. */\nfunction belongsTo(reference: ReferenceCandidate, documentId: string, items: readonly ItemNode[]): boolean {\n if (reference.from === documentId) return true;\n const owner = items.find((item) => item.id === reference.from);\n return owner?.document === documentId;\n}\n\ninterface RegionInput {\n readonly region: SpecificationRegion;\n readonly containerId: string;\n readonly input: ExtractInput;\n readonly scanned: ScannedDocument;\n readonly directives: readonly Directive[];\n readonly index: LineIndex;\n readonly file: string;\n readonly pathPhase: Phase;\n /** The whole file is a historical record, so every part of it is one too. */\n readonly record: boolean;\n}\n\ninterface BuiltRegion {\n readonly region: SpecificationRegion;\n readonly document: DocumentNode;\n readonly extracted: ExtractedDocument;\n}\n\n/**\n * Turns one region into a specification.\n *\n * It produces exactly the `DocumentNode` a whole file produces, which is the\n * reason every rule, query and reporter works on registers without knowing they\n * exist. The only deliberate differences: the node is anchored at its heading\n * rather than at line one, it carries no front matter of its own, and it does\n * not claim the file's path as an alias - the file already does, and two nodes\n * answering to one path would make every link to that file ambiguous.\n */\nfunction buildRegion(context: RegionInput): BuiltRegion {\n const { region, input, scanned, index, file, pathPhase, record } = context;\n const at = (start: number, end: number): SourceRef => refOf(file, index, start, end);\n\n const identity = identify({\n path: input.path,\n declaredId: region.declaredId,\n declaredAliases: region.directive ? attrList(region.directive, 'aliases') : [],\n heading: region.title,\n includePathAliases: false,\n });\n\n const declaredStatus = region.directive ? attr(region.directive, 'status') : null;\n const rawStatus = declaredStatus?.value ?? region.status?.text ?? null;\n const statusAt = declaredStatus\n ? at(declaredStatus.start, declaredStatus.end)\n : region.status\n ? at(region.status.start, region.status.end)\n : null;\n const declaredPhase = phaseOf(rawStatus);\n\n const document: DocumentNode = {\n id: identity.id,\n kind: 'document',\n title: (region.directive ? attr(region.directive, 'title')?.value : null) ?? region.title ?? identity.id,\n // Anchored at its heading, or at the row when the register is a table.\n at: at(region.start, Math.min(region.end, region.heading?.end ?? region.row?.end ?? region.end)),\n path: input.path,\n aliases: identity.aliases,\n // A section of a journal is part of the journal, whatever status word it\n // wrote for itself. Being a record is a statement about the file made from\n // outside it, and it does not stop at a heading.\n phase: record ? 'record' : declaredPhase !== 'unknown' ? declaredPhase : pathPhase,\n rawStatus,\n statusAt,\n frontMatter: {},\n };\n\n const anchors = new Set<string>(\n scanned.headings.filter((h) => h.start >= region.start && h.start < region.end).map((h) => h.slug),\n );\n\n // Relations a table declares by column, typed by the header the author wrote.\n const references: ReferenceCandidate[] = region.relations.map((relation) => ({\n kind: relation.kind,\n from: document.id,\n target: relation.target,\n origin: 'front-matter' as const,\n declaredAt: at(relation.start, relation.end),\n raw: `${relation.column}: ${relation.target}`,\n inverted: relation.inverted,\n opportunistic: false,\n }));\n\n return {\n region,\n document,\n extracted: {\n document,\n items: [],\n references,\n problems: [],\n // A region has no front matter of its own to misread.\n misreadKeys: [],\n anchors,\n identity,\n scanned,\n subSpecifications: [],\n containerId: context.containerId,\n },\n };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Status */\n/* -------------------------------------------------------------------------- */\n\ninterface StatusReading {\n readonly raw: string | null;\n readonly at: SourceRef | null;\n readonly phase: Phase;\n}\n\n/**\n * Finds the document status.\n *\n * Looks in the three places teams actually put it, in descending order of how\n * deliberate each is: a directive, a front-matter field, then the body of a\n * `## Status` section. A repository using none of them still gets a phase from\n * its directory layout, which is handled by the caller.\n */\nfunction readStatus(\n scanned: ScannedDocument,\n byKey: ReadonlyMap<string, YamlEntry>,\n nodeDirective: Directive | null,\n index: LineIndex,\n file: string,\n): StatusReading {\n if (nodeDirective) {\n const declared = attr(nodeDirective, 'status');\n if (declared) {\n return {\n raw: declared.value,\n at: refOf(file, index, declared.start, declared.end),\n phase: phaseOf(declared.value),\n };\n }\n }\n\n for (const key of STATUS_KEYS) {\n const entry = byKey.get(key);\n if (!entry) continue;\n const raw = typeof entry.value === 'string' ? entry.value : entry.value.join(', ');\n if (raw.trim().length === 0) continue;\n return {\n raw,\n at: refOf(file, index, entry.valueStart, entry.end),\n phase: phaseOf(raw),\n };\n }\n\n const heading = scanned.headings.find((h) => isStatusHeading(h.text));\n if (heading) {\n const body = statusSectionBody(scanned, heading.line);\n if (body) {\n return {\n raw: body.text,\n at: refOf(file, index, body.start, body.end),\n phase: phaseOf(body.text),\n };\n }\n }\n\n return { raw: null, at: null, phase: 'unknown' };\n}\n\n/** The first non-blank line under a `## Status` heading. */\nfunction statusSectionBody(\n scanned: ScannedDocument,\n headingLine: number,\n): { text: string; start: number; end: number } | null {\n for (const line of scanned.lines) {\n if (line.line <= headingLine) continue;\n if (line.blank) continue;\n if (line.code) return null;\n const trimmed = line.content.trim();\n // A heading immediately after means the section is empty.\n if (trimmed.startsWith('#')) return null;\n const offset = line.contentStart + line.content.indexOf(trimmed);\n // Bullet lists under Status are a status history; take the first entry.\n const cleaned = trimmed.replace(/^[-*+]\\s+/, '');\n const start = offset + (trimmed.length - cleaned.length);\n return { text: cleaned, start, end: start + cleaned.length };\n }\n return null;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Items */\n/* -------------------------------------------------------------------------- */\n\ninterface ItemContext {\n readonly scanned: ScannedDocument;\n readonly directives: readonly Directive[];\n /** The specification that owns an offset, which in a register is a section. */\n readonly ownerAt: (offset: number) => string;\n readonly file: string;\n readonly index: LineIndex;\n}\n\nfunction extractItems(context: ItemContext): ItemNode[] {\n const { scanned, directives, ownerAt, file, index } = context;\n const out: ItemNode[] = [];\n const ordinals = new Map<string, number>();\n\n for (const item of scanned.listItems) {\n const section = sectionPathAt(scanned, item.start);\n const inObligationSection = section.some((heading) => OBLIGATION_SECTIONS.has(normaliseHeading(heading)));\n const directive = directiveFor(directives, 'spec-item', { start: item.start, end: item.end }, 200);\n\n if (!isObligation(item, inObligationSection, directive)) continue;\n\n const documentId = ownerAt(item.start);\n const slug = section.length > 0 ? slugify(section[section.length - 1] as string) : 'item';\n // Ordinals count within a specification, so two decisions in one register\n // each get their own `#open-questions.1` rather than sharing a sequence.\n const key = `${documentId}#${slug}`;\n const ordinal = (ordinals.get(key) ?? 0) + 1;\n ordinals.set(key, ordinal);\n\n const declaredId = directive ? attr(directive, 'id')?.value : null;\n const id = `${documentId}#${declaredId ?? `${slug}.${ordinal}`}`;\n\n const state = resolveItemState({\n file,\n index,\n item,\n section,\n directive,\n inObligationSection,\n });\n\n out.push({\n id,\n kind: 'item',\n title: (directive ? attr(directive, 'title')?.value : null) ?? summarise(item.firstLine),\n at: refOf(file, index, item.start, item.end),\n document: documentId,\n section,\n text: summarise(item.firstLine),\n body: item.body,\n disposition: state.disposition,\n openness: state.openness,\n evidence: state.evidence,\n conflicts: state.conflicts,\n });\n }\n\n return out;\n}\n\n/**\n * Decides whether a bullet is an obligation.\n *\n * A checkbox or an explicit directive always makes one. Otherwise only\n * top-level bullets under a heading like \"Open Questions\" count: promoting\n * every bullet in a specification would bury the real obligations under the\n * document's own prose.\n */\nfunction isObligation(item: ListItem, inObligationSection: boolean, directive: Directive | null): boolean {\n if (directive !== null) return true;\n if (item.checkbox !== null) return true;\n return inObligationSection && item.depth === 0;\n}\n\n/** The heading path enclosing an offset, outermost first. */\nfunction sectionPathAt(scanned: ScannedDocument, offset: number): string[] {\n const path: { level: number; text: string }[] = [];\n for (const heading of scanned.headings) {\n if (heading.start > offset) break;\n while (path.length > 0 && (path[path.length - 1] as { level: number }).level >= heading.level) path.pop();\n path.push({ level: heading.level, text: heading.text });\n }\n return path.map((entry) => entry.text);\n}\n\n/**\n * Memoised because it is called for every heading above every reference and\n * every item, and a corpus has only a handful of distinct headings - `Context`,\n * `Decision`, `Open Questions`, `See also` - repeated thousands of times.\n */\nconst headingCache = new Map<string, string>();\n\nfunction normaliseHeading(text: string): string {\n const cached = headingCache.get(text);\n if (cached !== undefined) return cached;\n const normalised = text\n .toLowerCase()\n .replace(/[`*_~]/g, '')\n .replace(/[^\\p{L}\\p{N}\\s-]/gu, '')\n .replace(/\\s+/g, ' ')\n .trim();\n // Bounded so a pathological corpus of unique headings cannot grow it forever.\n if (headingCache.size < 4096) headingCache.set(text, normalised);\n return normalised;\n}\n\n/**\n * One-line form of an item for reports.\n *\n * Link syntax is flattened to its label. A finding that quotes the obligation\n * back at the reader should read like the sentence they wrote, not like the\n * Markdown source of it.\n */\nfunction summarise(text: string): string {\n const flat = text\n .replace(/!?\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n // `[[target|display]]` keeps the display half: that is the text a reader\n // of the rendered document actually sees.\n .replace(/\\[\\[(?:[^\\]|]*\\|)?([^\\]]*)\\]\\]/g, '$1')\n .replace(/\\s+/g, ' ')\n .trim();\n return flat.length <= 120 ? flat : `${flat.slice(0, 117)}...`;\n}\n\n/* -------------------------------------------------------------------------- */\n/* References */\n/* -------------------------------------------------------------------------- */\n\ninterface ReferenceContext {\n readonly scanned: ScannedDocument;\n readonly directives: readonly Directive[];\n readonly document: DocumentNode;\n /** The specification that owns an offset, for a reference outside any item. */\n readonly documentAt: (offset: number) => DocumentNode;\n readonly items: readonly ItemNode[];\n readonly byKey: ReadonlyMap<string, YamlEntry>;\n readonly status: StatusReading;\n /** Cell ranges already typed by a table column header. */\n readonly claimed: readonly { start: number; end: number }[];\n readonly file: string;\n readonly index: LineIndex;\n}\n\n/** True when an offset falls in a cell a column header already accounted for. */\nfunction isClaimed(claimed: readonly { start: number; end: number }[], offset: number): boolean {\n return claimed.some((range) => offset >= range.start && offset < range.end);\n}\n\nfunction extractReferences(context: ReferenceContext): ReferenceCandidate[] {\n const { scanned, directives, document, documentAt, items, byKey, status, claimed, file, index } = context;\n const out: ReferenceCandidate[] = [];\n const at = (start: number, end: number): SourceRef => refOf(file, index, start, end);\n\n // Front matter, walked in the order it was written rather than in the order\n // the vocabulary happens to be listed: a key the table does not know still has\n // to be looked at, and only the document knows which those are.\n for (const [key, entry] of byKey) {\n const relation = RELATION_INDEX.get(foldRelationKey(key));\n if (!relation) continue;\n for (const value of valuesOf(entry)) {\n const target = cleanTarget(value);\n if (target.length === 0) continue;\n out.push({\n kind: relation.kind,\n from: document.id,\n target,\n origin: 'front-matter',\n declaredAt: at(entry.valueStart, entry.end),\n raw: `${key}: ${value}`,\n inverted: relation.inverted,\n opportunistic: false,\n });\n }\n }\n\n // `status: Superseded by ADR-0009` is the most common supersession record of\n // all, and it never appears as a field of its own.\n if (status.raw && status.at) {\n for (const target of supersessionTargetsIn(status.raw)) {\n const cleaned = cleanTarget(target);\n if (cleaned.length === 0) continue;\n out.push({\n kind: 'supersedes',\n from: document.id,\n target: cleaned,\n origin: 'front-matter',\n declaredAt: status.at,\n raw: status.raw,\n inverted: true,\n opportunistic: true,\n });\n }\n }\n\n // Explicit edge directives.\n for (const directive of directives) {\n if (directive.name !== 'spec-edge') continue;\n const kind = attr(directive, 'kind')?.value as EdgeKind | undefined;\n const to = attr(directive, 'to');\n const from = attr(directive, 'from');\n if (!kind) continue;\n const owner = ownerOf(items, directive.start) ?? documentAt(directive.start).id;\n if (to) {\n out.push({\n kind,\n from: owner,\n target: to.value,\n origin: 'directive',\n declaredAt: at(to.start, to.end),\n raw: `@spec-edge kind=\"${kind}\" to=\"${to.value}\"`,\n inverted: false,\n opportunistic: false,\n });\n }\n if (from) {\n out.push({\n kind,\n from: owner,\n target: from.value,\n origin: 'directive',\n declaredAt: at(from.start, from.end),\n raw: `@spec-edge kind=\"${kind}\" from=\"${from.value}\"`,\n inverted: true,\n opportunistic: false,\n });\n }\n }\n\n // Prose links. A cell whose meaning a column header already gave is skipped,\n // so `| ADR-0002 | ... | [ADR-0001](0001.md) |` yields one typed edge rather\n // than a typed edge and a neutral citation beside it.\n const linked = new Set<string>();\n for (const link of scanned.links) {\n if (link.form === 'definition') continue;\n if (isClaimed(claimed, link.start)) continue;\n const target = cleanTarget(link.target);\n if (target.length === 0) continue;\n if (isExternal(target)) continue;\n\n const owner = ownerOf(items, link.start) ?? documentAt(link.start).id;\n const section = sectionPathAt(scanned, link.start);\n const classified = classifyReference(scanned.masked, link.start, link.end, section);\n\n linked.add(normaliseRef(stripAnchor(target)));\n out.push({\n kind: classified.kind,\n from: owner,\n target,\n origin: 'link',\n declaredAt: at(link.targetStart, link.targetStart + link.target.length),\n raw: renderLink(link),\n inverted: classified.inverted,\n opportunistic: false,\n });\n }\n\n // Bare identifiers in prose. Everything already covered by a link is skipped\n // so a citation written as `[ADR-7](0007.md)` is not counted twice.\n for (const bare of findBareReferences(scanned)) {\n const key = normaliseRef(bare.text);\n if (linked.has(key)) continue;\n if (isClaimed(claimed, bare.start)) continue;\n const owner = ownerOf(items, bare.start) ?? documentAt(bare.start).id;\n const section = sectionPathAt(scanned, bare.start);\n const classified = classifyReference(scanned.masked, bare.start, bare.end, section);\n out.push({\n kind: classified.kind,\n from: owner,\n target: bare.text,\n origin: 'text',\n declaredAt: at(bare.start, bare.end),\n raw: bare.text,\n inverted: classified.inverted,\n opportunistic: true,\n });\n }\n\n return withoutOverlaps(out);\n}\n\n/**\n * Collapses candidates that describe the same written citation.\n *\n * `Superseded by ADR-0009` in a status section is read twice: the status\n * reader reports the whole line, and prose scanning reports the identifier\n * inside it. One written citation is one reference - so when the target\n * resolves it must not become two edges, and when it does not it must not\n * become two findings on one line a reader can only fix once.\n *\n * The narrower span wins, because it points at the text that has to change.\n *\n * Only overlapping spans collapse. Two sentences citing the same missing\n * document are two citations, and silently reporting one of them would leave\n * the other to be discovered on the next run.\n */\nfunction withoutOverlaps(candidates: readonly ReferenceCandidate[]): ReferenceCandidate[] {\n const out: ReferenceCandidate[] = [];\n for (const candidate of candidates) {\n const index = out.findIndex(\n (other) =>\n other.kind === candidate.kind &&\n other.from === candidate.from &&\n other.inverted === candidate.inverted &&\n normaliseRef(other.target) === normaliseRef(candidate.target) &&\n overlapping(other.declaredAt, candidate.declaredAt),\n );\n if (index === -1) {\n out.push(candidate);\n continue;\n }\n const held = out[index] as ReferenceCandidate;\n // The status reader runs before prose scanning, so today the wider span is\n // always the one already held and this comparison always replaces it. It is\n // written as a comparison rather than an unconditional swap because which\n // reader runs first is not a property worth depending on, and a mutant that\n // makes it unconditional is equivalent only by that accident.\n if (width(candidate.declaredAt) < width(held.declaredAt)) out[index] = candidate;\n }\n return out;\n}\n\nconst width = (ref: SourceRef): number => ref.span.end.offset - ref.span.start.offset;\n\n/**\n * Whether two spans cover any of the same text.\n *\n * Offsets alone, with no file comparison: every candidate here was built from\n * one scan of one file, so there is no second file for them to be offsets into.\n */\nfunction overlapping(a: SourceRef, b: SourceRef): boolean {\n return a.span.start.offset < b.span.end.offset && b.span.start.offset < a.span.end.offset;\n}\n\n/** The item whose block contains an offset, if any. */\nfunction ownerOf(items: readonly ItemNode[], offset: number): string | null {\n let best: ItemNode | null = null;\n for (const item of items) {\n const span = item.at.span;\n if (offset < span.start.offset || offset >= span.end.offset) continue;\n // Innermost wins when items nest.\n if (best === null || span.start.offset > best.at.span.start.offset) best = item;\n }\n return best?.id ?? null;\n}\n\nexport interface Classification {\n readonly kind: EdgeKind;\n readonly inverted: boolean;\n}\n\n/**\n * Decides what a reference means from the words around it.\n *\n * The nearest governing phrase within {@link VERB_WINDOW} characters wins, and\n * the search never crosses a sentence boundary. With nothing to go on, a\n * reference under a \"See also\" heading is bookkeeping and everything else is a\n * neutral citation.\n */\nexport function classifyReference(\n text: string,\n start: number,\n end: number,\n section: readonly string[],\n): Classification {\n const before = sentenceBefore(text, start);\n\n // Left to right, so the last match within the window is the nearest one - and\n // the nearest governing phrase is the one that governs.\n let best: Classification | null = null;\n VERB_PATTERN.lastIndex = 0;\n for (let m = VERB_PATTERN.exec(before); m !== null; m = VERB_PATTERN.exec(before)) {\n const phrase = m[0] as string;\n const end = (m.index ?? 0) + phrase.length;\n const distance = before.length - end;\n if (distance > VERB_WINDOW) continue;\n // What sits between the phrase and the reference has to be connective. A\n // negation in there reverses the claim the phrase would otherwise make.\n if (NEGATION.test(before.slice(end))) continue;\n const rule = VERB_LOOKUP.get(phrase);\n if (rule) best = rule;\n }\n\n if (best) return best;\n\n // \"[ADR-0009] supersedes this decision\": the reference is the subject, so the\n // relation runs the other way.\n const after = sentenceAfter(text, end);\n for (const rule of VERB_RULES) {\n if (rule.inverted) continue;\n for (const phrase of rule.phrases) {\n if (!after.startsWith(phrase)) continue;\n if (rule.kind === 'assumes' || rule.kind === 'depends-on') continue;\n return { kind: rule.kind, inverted: true };\n }\n }\n\n const innermost = section.length > 0 ? normaliseHeading(section[section.length - 1] as string) : '';\n if (WEAK_SECTIONS.has(innermost)) return { kind: 'relates-to', inverted: false };\n for (const heading of section) {\n if (WEAK_SECTIONS.has(normaliseHeading(heading))) return { kind: 'relates-to', inverted: false };\n }\n\n return { kind: 'references', inverted: false };\n}\n\n/** A sentence end, a blank line, or the start of a new block-level item. */\n/**\n * A table cell edge ends a statement too.\n *\n * The pipe matters more than it looks. A table row is a list of independent\n * fields, and without it the look-behind window reaches back across the row\n * boundary into the previous row's prose. An index of archived documents whose\n * last column ended \"...before assuming the drift was fixed\" turned every\n * following row's link into an `assumes` edge, and so turned every archived\n * document it listed into a stale premise.\n */\nconst STATEMENT_BREAK = /[.?!;]\\s|\\n\\s*\\n|\\n\\s*[-*+>#]|\\|/g;\n\n/**\n * Lower-cased, whitespace-collapsed text back to the start of the statement.\n *\n * The search stops at the last boundary: a governing phrase in the *previous*\n * sentence does not govern this reference. \"We deferred that to ADR-3. See also\n * [ADR-9].\" must not read as a delegation to ADR-9.\n */\nfunction sentenceBefore(text: string, start: number): string {\n const window = text.slice(Math.max(0, start - 160), start);\n let cut = 0;\n STATEMENT_BREAK.lastIndex = 0;\n for (let m = STATEMENT_BREAK.exec(window); m !== null; m = STATEMENT_BREAK.exec(window)) {\n cut = (m.index ?? 0) + (m[0] as string).length;\n }\n return window\n .slice(cut)\n .toLowerCase()\n .replace(/[`*_~\"'()\\[\\],]/g, ' ')\n .replace(/\\s+/g, ' ');\n}\n\nfunction sentenceAfter(text: string, end: number): string {\n const window = text.slice(end, Math.min(text.length, end + 80));\n const stop = /[.?!;\\n|]/.exec(window);\n const cut = stop ? window.slice(0, stop.index) : window;\n return cut.toLowerCase().replace(/[`*_~\"'()\\[\\],]/g, ' ').replace(/\\s+/g, ' ').trim();\n}\n\ninterface BareReference {\n readonly text: string;\n readonly start: number;\n readonly end: number;\n}\n\n/**\n * Finds identifiers written as plain prose, such as \"as decided in ADR-0007\".\n *\n * Link constructs are blanked first. Without that, `[ADR-7](https://x/adr-7)`\n * would yield three references to the same thing - one real and two harvested\n * out of a URL - which is precisely the mis-match that makes hand-rolled regex\n * checks untrustworthy.\n */\nfunction findBareReferences(scanned: ScannedDocument): BareReference[] {\n // Slice-based for the same reason as the scanner's masking: this runs over\n // every document, and a per-character array is the wrong shape for the job.\n const source = scanned.masked;\n let text = '';\n let cursor = 0;\n for (const link of scanned.links) {\n const start = Math.max(link.start, cursor);\n const end = Math.min(link.end, source.length);\n if (end <= start) continue;\n text += source.slice(cursor, start);\n text += source.slice(start, end).replace(/[^\\n\\r]/g, ' ');\n cursor = end;\n }\n text += source.slice(cursor);\n\n const out: BareReference[] = [];\n BARE_REF.lastIndex = 0;\n for (let m = BARE_REF.exec(text); m !== null; m = BARE_REF.exec(text)) {\n const prefix = (m[1] as string).toLowerCase();\n if (NOT_A_FAMILY.has(prefix)) continue;\n if (prefix.length < 2) continue;\n const start = m.index ?? 0;\n // A token glued to a path separator or an extension is not a citation.\n const before = text[start - 1] ?? ' ';\n const after = text[start + (m[0] as string).length] ?? ' ';\n if (before === '/' || before === '.' || after === '/') continue;\n out.push({ text: m[0] as string, start, end: start + (m[0] as string).length });\n }\n return out;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------------- */\n\nfunction firstValue(byKey: ReadonlyMap<string, YamlEntry>, keys: readonly string[]): string | null {\n for (const key of keys) {\n const entry = byKey.get(key);\n if (!entry) continue;\n const value = asString(entry);\n if (value !== null && value.length > 0) return value;\n }\n return null;\n}\n\nfunction asString(entry: YamlEntry | undefined): string | null {\n if (!entry) return null;\n if (typeof entry.value === 'string') return entry.value.trim().length > 0 ? entry.value.trim() : null;\n return entry.value.length > 0 ? (entry.value[0] as string) : null;\n}\n\n/** Strips Markdown decoration a target may still be wearing. */\nfunction cleanTarget(value: string): string {\n return value\n .trim()\n .replace(/^[`'\"<(\\[]+/, '')\n .replace(/[`'\">)\\]]+$/, '')\n .replace(/[.,;]+$/, '')\n .trim();\n}\n\nfunction stripAnchor(target: string): string {\n const hash = target.indexOf('#');\n return hash <= 0 ? target : target.slice(0, hash);\n}\n\nfunction renderLink(link: Link): string {\n switch (link.form) {\n case 'wiki':\n return `[[${link.target}]]`;\n case 'autolink':\n return `<${link.target}>`;\n case 'reference':\n case 'shortcut':\n return `[${link.text}][${link.label ?? ''}]`;\n default:\n return `[${link.text}](${link.target})`;\n }\n}\n\n/** Exposed for tests and for callers that classify their own sections. */\nexport { OBLIGATION_SECTIONS, sectionPathAt, WEAK_SECTIONS };\n"]}
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Document extraction: Markdown in, graph fragments out.\n *\n * This module is where domain-agnosticism is won or lost. It never requires a\n * repository to adopt a syntax. It reads what teams already write - front\n * matter, a `## Status` section, a checklist under `## Open Questions`, a link\n * that says \"deferred to ADR-0011\" - and turns each into a typed relation with a\n * source position.\n *\n * The one rule it holds to everywhere: **an inference that cannot be justified\n * is not made.** An unrecognised status becomes `unknown`, not a guess. A link\n * with no governing verb becomes a neutral `references`, not a dependency. Bare\n * identifiers found in prose are opportunistic and are dropped silently when\n * they do not resolve, because the alternative is reporting `SHA-256` as a\n * broken reference to specification 256.\n */\n\nimport { attr, attrList, bindItemDirectives, parseDirectives, type Directive } from './directives.js';\nimport {\n identify,\n isDocumentTarget,\n isExternal,\n looksLikePath,\n normaliseRef,\n parsePrefixedRef,\n withinOneEdit,\n type DocumentIdentity,\n ID_KEYS,\n} from './identity.js';\nimport { isStatusHeading, phaseFromPath, phaseOf, STATUS_KEYS, supersessionTargetsIn } from './lifecycle.js';\nimport { scanMarkdown, slugify, type Link, type ListItem, type ScannedDocument } from './markdown.js';\nimport { findSpecificationRegions, regionAt, type SpecificationRegion } from './sections.js';\nimport { resolveItemState } from './state.js';\nimport { refOf, type LineIndex } from './source.js';\nimport type {\n DocumentNode,\n EdgeKind,\n EdgeOrigin,\n ItemNode,\n MisreadKey,\n ParseProblem,\n Phase,\n SourceRef,\n} from './types.js';\nimport { parseFrontMatter, toRecord, valuesOf, type YamlEntry } from './yaml.js';\n\n/* -------------------------------------------------------------------------- */\n/* Output */\n/* -------------------------------------------------------------------------- */\n\n/**\n * A relation that has been read but not yet resolved to a target node.\n *\n * Resolution needs the whole corpus, so extraction stops at the raw target text.\n */\nexport interface ReferenceCandidate {\n readonly kind: EdgeKind;\n /** Id of the node the relation was written on. */\n readonly from: string;\n /** The target exactly as written: a path, an identifier, or a URL. */\n readonly target: string;\n readonly origin: EdgeOrigin;\n readonly declaredAt: SourceRef;\n readonly raw: string;\n /**\n * When true the relation runs `target -> from`.\n *\n * `superseded-by: ADR-0009` written in ADR-0003 declares that *ADR-0009*\n * supersedes ADR-0003. The edge belongs to ADR-0009; the line a human must go\n * and fix is in ADR-0003, which is why `declaredAt` is tracked separately.\n */\n readonly inverted: boolean;\n /**\n * Opportunistic references are dropped in silence when they do not resolve.\n * Only deliberate ones - links, front matter, directives - are reported.\n */\n readonly opportunistic: boolean;\n}\n\nexport interface ExtractedDocument {\n readonly document: DocumentNode;\n readonly items: readonly ItemNode[];\n readonly references: readonly ReferenceCandidate[];\n readonly problems: readonly ParseProblem[];\n /**\n * Front-matter keys that read as relations and declared none.\n *\n * Kept apart from `problems` because a problem is about the text and this is\n * about the graph: the edge the author wrote down is not in it.\n */\n readonly misreadKeys: readonly MisreadKey[];\n /** Heading slugs, for resolving `#anchor` references into this document. */\n readonly anchors: ReadonlySet<string>;\n readonly identity: DocumentIdentity;\n readonly scanned: ScannedDocument;\n /**\n * Specifications declared inside this file, each a document in its own right.\n *\n * Empty for the ordinary one-file-per-decision layout, which is why nothing\n * downstream had to change to support registers.\n */\n readonly subSpecifications: readonly ExtractedDocument[];\n /**\n * The file-level specification this one is a region of, if any.\n *\n * Recorded so the register's structure is a relation in the graph rather than\n * an accident of which offsets fall inside which: \"what decisions does this\n * register hold\" is a question worth being able to ask.\n */\n readonly containerId: string | null;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Vocabulary */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Front-matter keys that declare a relation, and what they mean.\n *\n * Every directional kind is spelled in **both** directions. A register that\n * records `depends-on` but not `depended-on-by` is not a smaller vocabulary, it\n * is a trap: the author writes the inverse, the key means nothing, and the edge\n * they declared is missing from a graph that reports itself as consistent. Which\n * half of a pair a repository writes is a filing convention, and a filing\n * convention is not something a linter gets to have an opinion about.\n *\n * `relates-to` is the exception, and it is not one: the relation is symmetric,\n * so it has no other direction to spell. `contains` is structural and never\n * written by hand. `tests/parsing.test.ts` holds both facts to the fire.\n */\nexport const RELATION_KEYS: Readonly<Record<string, { kind: EdgeKind; inverted: boolean }>> = {\n supersedes: { kind: 'supersedes', inverted: false },\n supercedes: { kind: 'supersedes', inverted: false },\n replaces: { kind: 'supersedes', inverted: false },\n obsoletes: { kind: 'supersedes', inverted: false },\n deprecates: { kind: 'supersedes', inverted: false },\n 'superseded-by': { kind: 'supersedes', inverted: true },\n 'superceded-by': { kind: 'supersedes', inverted: true },\n 'replaced-by': { kind: 'supersedes', inverted: true },\n 'obsoleted-by': { kind: 'supersedes', inverted: true },\n 'deprecated-by': { kind: 'supersedes', inverted: true },\n 'rolled-into': { kind: 'supersedes', inverted: true },\n amends: { kind: 'amends', inverted: false },\n extends: { kind: 'amends', inverted: false },\n refines: { kind: 'amends', inverted: false },\n clarifies: { kind: 'amends', inverted: false },\n revises: { kind: 'amends', inverted: false },\n 'amended-by': { kind: 'amends', inverted: true },\n 'extended-by': { kind: 'amends', inverted: true },\n 'refined-by': { kind: 'amends', inverted: true },\n 'clarified-by': { kind: 'amends', inverted: true },\n 'revised-by': { kind: 'amends', inverted: true },\n 'depends-on': { kind: 'depends-on', inverted: false },\n 'dependent-on': { kind: 'depends-on', inverted: false },\n dependencies: { kind: 'depends-on', inverted: false },\n requires: { kind: 'depends-on', inverted: false },\n 'builds-on': { kind: 'depends-on', inverted: false },\n 'relies-on': { kind: 'depends-on', inverted: false },\n 'depended-on-by': { kind: 'depends-on', inverted: true },\n 'required-by': { kind: 'depends-on', inverted: true },\n dependents: { kind: 'depends-on', inverted: true },\n assumes: { kind: 'assumes', inverted: false },\n 'assumed-by': { kind: 'assumes', inverted: true },\n 'blocked-by': { kind: 'blocked-by', inverted: false },\n 'blocked-on': { kind: 'blocked-by', inverted: false },\n 'waiting-on': { kind: 'blocked-by', inverted: false },\n 'waiting-for': { kind: 'blocked-by', inverted: false },\n 'gated-on': { kind: 'blocked-by', inverted: false },\n 'gated-by': { kind: 'blocked-by', inverted: false },\n blocks: { kind: 'blocked-by', inverted: true },\n 'delegates-to': { kind: 'delegates-to', inverted: false },\n 'delegated-to': { kind: 'delegates-to', inverted: false },\n 'deferred-to': { kind: 'delegates-to', inverted: false },\n 'tracked-in': { kind: 'delegates-to', inverted: false },\n 'tracked-by': { kind: 'delegates-to', inverted: false },\n 'continued-in': { kind: 'delegates-to', inverted: false },\n 'delegated-from': { kind: 'delegates-to', inverted: true },\n related: { kind: 'relates-to', inverted: false },\n 'relates-to': { kind: 'relates-to', inverted: false },\n 'related-to': { kind: 'relates-to', inverted: false },\n 'see-also': { kind: 'relates-to', inverted: false },\n references: { kind: 'references', inverted: false },\n reference: { kind: 'references', inverted: false },\n refs: { kind: 'references', inverted: false },\n 'referenced-by': { kind: 'references', inverted: true },\n};\n\n/**\n * True when a front-matter value is shaped like a citation.\n *\n * The second half of the gate on {@link misreadRelationKeys}, and the half that\n * does the work. `sidebar_position: 4` and `ref: main` are a hair away from a\n * relation key by spelling alone; neither carries anything that could name a\n * document, and reporting them would make the rule an irritation rather than a\n * catch (ADR-0006).\n */\nfunction looksLikeCitation(value: string): boolean {\n const trimmed = value.trim();\n if (trimmed.length === 0) return false;\n if (parsePrefixedRef(trimmed) !== null) return true;\n return looksLikePath(trimmed) && isDocumentTarget(trimmed) && !isExternal(trimmed);\n}\n\n/**\n * Front-matter keys that read as relations and declare none.\n *\n * Front matter is an open vocabulary and most of what lives there is nobody\n * else's business, so the bar is deliberately high: the key has to be one edit\n * from a relation key *and* carry something that could name a document. Both\n * conditions together are what separates `dependson: ADR-0001`, which is an edge\n * the author believes exists, from `description: ...`, which is a title.\n */\nfunction misreadRelationKeys(\n byKey: ReadonlyMap<string, YamlEntry>,\n from: string,\n at: (start: number, end: number) => SourceRef,\n): MisreadKey[] {\n const out: MisreadKey[] = [];\n for (const [key, entry] of byKey) {\n const folded = foldRelationKey(key);\n if (folded.length === 0 || RELATION_INDEX.has(folded)) continue;\n if (!valuesOf(entry).some(looksLikeCitation)) continue;\n const near = [...RELATION_INDEX.values()]\n .filter((relation) => withinOneEdit(folded, foldRelationKey(relation.canonical)))\n .map((relation) => relation.canonical);\n if (near.length === 0) continue;\n out.push({ key, suggestion: near.join(', '), from, at: at(entry.start, entry.end) });\n }\n return out;\n}\n\n/**\n * Folds a front-matter key to its lookup form.\n *\n * `depends-on`, `depends_on`, `dependsOn` and `Depends On` are one key written\n * four ways, and which one a repository uses is decided by whatever wrote the\n * front matter first. Dropping every separator collapses them - the YAML reader\n * has already lower-cased the key, which is what makes camel case fold too.\n *\n * Which case this folds to is arbitrary and no test pins it: both sides of every\n * comparison come through here, so upper would work exactly as well. Asserting\n * on it would be asserting on the implementation.\n */\nexport function foldRelationKey(key: string): string {\n return key.replace(/[^a-z0-9]/gi, '').toLowerCase();\n}\n\n/** The vocabulary above, indexed by folded key. */\nconst RELATION_INDEX: ReadonlyMap<string, { kind: EdgeKind; inverted: boolean; canonical: string }> = new Map(\n Object.entries(RELATION_KEYS).map(([canonical, relation]) => [\n foldRelationKey(canonical),\n { ...relation, canonical },\n ]),\n);\n\n/**\n * Keys a region must answer for itself, so the file's answer cannot shadow one.\n *\n * Identity and status and title are the three things a register exists to vary\n * row by row. The rest of the file's front matter describes the file, and a\n * decision inside the file is described by it too.\n */\nconst UNINHERITED: ReadonlySet<string> = new Set([...ID_KEYS, ...STATUS_KEYS, 'title', 'alias', 'aliases']);\n\n/**\n * The front matter a region inherits from the file that contains it.\n *\n * [ADR-0009](../docs/adr/0009-a-specification-is-a-region.md) left this open,\n * and [ADR-0016](../docs/adr/0016-a-query-needs-a-sentence.md) made leaving it\n * open a defect. A repository can now write `document[fm.owner!=platform]` as a\n * rule of its own, and on a register every region answered nothing - which\n * `!=` reads as a mismatch, because an absent value is not the value. A file\n * whose front matter said `owner: platform` was reported twice for not being\n * owned by platform, and the message rendered `{0.fm.owner}` as the literal\n * placeholder. Confident, wrong, and unanswerable: the ADR-0006 failure.\n *\n * Two kinds of key stay behind. A relation key is a claim the file made -\n * `supersedes:` at the top of a register supersedes on behalf of the register,\n * not on behalf of each decision in it, and the edges were built from the\n * file's entries before this ran. And a key the region answers itself must not\n * be shadowed, which is {@link UNINHERITED}.\n */\nexport function inheritableFrontMatter(\n entries: readonly YamlEntry[],\n): Readonly<Record<string, string | readonly string[]>> {\n return toRecord(\n entries.filter((entry) => !UNINHERITED.has(entry.key) && !RELATION_INDEX.has(foldRelationKey(entry.key))),\n );\n}\n\n/**\n * Phrases that give a link its meaning, longest-matching-nearest wins.\n *\n * Only phrases that genuinely commit the citing document are here. Vague ones\n * (\"see\", \"covered by\") stay out: a `references` edge is harmless, whereas a\n * wrongly inferred `assumes` edge produces a confident stale-premise finding\n * about a document that never depended on anything.\n */\nconst VERB_RULES: readonly { kind: EdgeKind; inverted: boolean; phrases: readonly string[] }[] = [\n {\n kind: 'supersedes',\n inverted: true,\n phrases: ['superseded by', 'superceded by', 'replaced by', 'obsoleted by', 'deprecated by', 'rolled into'],\n },\n { kind: 'supersedes', inverted: false, phrases: ['supersedes', 'supercedes', 'replaces', 'obsoletes', 'deprecates'] },\n { kind: 'amends', inverted: true, phrases: ['amended by', 'refined by', 'clarified by', 'revised by'] },\n { kind: 'amends', inverted: false, phrases: ['amends', 'refines', 'clarifies', 'revises'] },\n {\n kind: 'delegates-to',\n inverted: false,\n phrases: [\n 'delegated to',\n 'delegate to',\n 'deferred to',\n 'defer to',\n 'moved to',\n 'move to',\n 'tracked in',\n 'tracked by',\n 'handed off to',\n 'handed to',\n 'hand off to',\n 'follow up in',\n 'follow-up in',\n 'followup in',\n 'continued in',\n 'continues in',\n 'punted to',\n 'left to',\n 'belongs in',\n 'owned by',\n 'will be decided in',\n 'will be resolved in',\n 'will be handled in',\n 'will be handled by',\n 'will be answered in',\n 'to be decided in',\n 'to be resolved in',\n 'to be handled in',\n 'to be answered in',\n ],\n },\n {\n kind: 'blocked-by',\n inverted: false,\n phrases: ['blocked by', 'blocked on', 'waiting on', 'waiting for', 'gated on', 'gated by', 'unblocked by'],\n },\n { kind: 'blocked-by', inverted: true, phrases: ['blocks', 'blocking'] },\n {\n kind: 'depends-on',\n inverted: false,\n phrases: ['depends on', 'depend on', 'dependent on', 'requires', 'builds on', 'built on', 'relies on'],\n },\n { kind: 'depends-on', inverted: true, phrases: ['depended on by'] },\n {\n kind: 'assumes',\n inverted: false,\n phrases: [\n 'assumes',\n 'assuming',\n 'on the assumption of',\n 'as decided in',\n 'as established in',\n 'as established by',\n 'as stated in',\n 'as specified in',\n 'as required by',\n 'as mandated by',\n 'in accordance with',\n 'constrained by',\n 'mandated by',\n 'governed by',\n 'predicated on',\n 'rests on',\n 'follows from',\n 'justified by',\n // A constraint the citing document designs around. \"the row limit imposed\n // by ADR-0002\" is the archetypal stale premise: when ADR-0002 is retired,\n // this document is still working around a cap that no longer exists.\n 'imposed by',\n 'required by',\n 'dictated by',\n 'determined by',\n 'limited by',\n 'capped by',\n 'bounded by',\n 'defined by',\n 'defined in',\n 'specified by',\n 'set by',\n 'per',\n 'because',\n 'since',\n ],\n },\n];\n\n/**\n * Words that cancel a governing phrase standing before them.\n *\n * The window allows a short noun phrase between a verb and the reference it\n * governs - \"deferred to the sharding decision in [ADR-7]\" is one statement.\n * It cannot allow a negation. A table entry reading \"Owned by nobody today and\n * disclaimed by [138]\" was being read as a delegation *to* 138, which is the\n * opposite of what the sentence says, and an inference that inverts its source\n * is worse than no inference at all.\n */\nconst NEGATION = /(?:^|\\s)(?:no|not|nobody|none|never|neither|nor|nothing|without)(?:\\s|$)/;\n\n/** How close a governing phrase must sit to the reference it governs. */\nconst VERB_WINDOW = 40;\n\n/**\n * Every governing phrase compiled into one alternation, plus a lookup table.\n *\n * Classification runs on every reference in the corpus, and testing a hundred\n * phrases one at a time made it the most expensive thing extraction did. The\n * alternation is sorted longest-first so that at any given position the regex\n * prefers `partially resolved` over `resolved`, matching the precedence the\n * per-phrase search had. Lookarounds rather than `\\b`, because phrases contain\n * hyphens and `\\b` does the wrong thing around them.\n */\nconst VERB_LOOKUP: ReadonlyMap<string, Classification> = new Map(\n VERB_RULES.flatMap((rule) =>\n rule.phrases.map((phrase) => [phrase, { kind: rule.kind, inverted: rule.inverted }] as const),\n ),\n);\n\nconst VERB_PATTERN = new RegExp(\n `(?<![\\\\p{L}\\\\p{N}])(?:${[...VERB_LOOKUP.keys()]\n .sort((a, b) => b.length - a.length)\n .map((phrase) => phrase.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('|')})(?![\\\\p{L}\\\\p{N}])`,\n 'gu',\n);\n\n/** Headings under which a link is bookkeeping rather than a commitment. */\nconst WEAK_SECTIONS: ReadonlySet<string> = new Set([\n 'see also',\n 'references',\n 'reference',\n 'related',\n 'related work',\n 'related decisions',\n 'related documents',\n 'links',\n 'further reading',\n 'prior art',\n 'history',\n 'changelog',\n 'change log',\n 'revision history',\n 'bibliography',\n 'sources',\n 'appendix',\n 'more information',\n 'resources',\n 'index',\n]);\n\n/** Headings whose bullets are obligations even without a checkbox. */\nconst OBLIGATION_SECTIONS: ReadonlySet<string> = new Set([\n 'open questions',\n 'open question',\n 'unresolved questions',\n 'unanswered questions',\n 'questions',\n 'open issues',\n 'action items',\n 'actions',\n 'todo',\n 'to do',\n 'to-do',\n 'todos',\n 'next steps',\n 'follow ups',\n 'follow-ups',\n 'followups',\n 'follow up',\n 'follow-up',\n 'unresolved',\n 'outstanding',\n 'outstanding questions',\n 'tasks',\n 'task list',\n 'work items',\n 'remaining work',\n 'decisions needed',\n 'blockers',\n 'parking lot',\n 'future work',\n 'deferred',\n]);\n\n/**\n * Prefixes that look like specification identifiers but never are.\n *\n * The corpus filter in `resolve.ts` is the real defence; this list only keeps\n * the obvious noise out of the candidate set.\n */\nconst NOT_A_FAMILY: ReadonlySet<string> = new Set([\n 'v',\n 'ver',\n 'version',\n 'p',\n 'pp',\n 'fig',\n 'figure',\n 'table',\n 'tbl',\n 'section',\n 'sect',\n 'sec',\n 'step',\n 'item',\n 'no',\n 'num',\n 'line',\n 'ln',\n 'col',\n 'port',\n 'pr',\n 'issue',\n 'gh',\n 'utf',\n 'ascii',\n 'sha',\n 'md',\n 'http',\n 'https',\n 'ipv',\n 'tls',\n 'ssl',\n 'es',\n 'ecma',\n 'x',\n 'h',\n 'p99',\n 'base',\n 'sql',\n 'ipv4',\n 'ipv6',\n 'arm',\n 'x86',\n 'win',\n 'node',\n 'python',\n 'java',\n 'go',\n 'c',\n 'cpp',\n]);\n\nconst BARE_REF = /\\b([A-Za-z][A-Za-z0-9]{0,14})[\\s._-]?(\\d{1,6})\\b/g;\n\n/* -------------------------------------------------------------------------- */\n/* Extraction */\n/* -------------------------------------------------------------------------- */\n\nexport interface ExtractInput {\n /** Repository-relative POSIX path. */\n readonly path: string;\n readonly text: string;\n /**\n * This file is a historical record: a log of what was decided, not a\n * decision. Matched against the caller's history patterns, because deciding\n * which files those are is a repository's business and not a guess this\n * layer could justify making. See ADR-0011.\n */\n readonly record?: boolean | undefined;\n}\n\n/**\n * Reads one file into graph fragments, one entry per specification in it.\n *\n * A file yields at least itself. It yields more when it is a register: a\n * heading that carries an identifier *and* declares a status is a specification\n * in its own right, with its own lifecycle, its own obligations and its own\n * relations. See ADR-0009.\n */\nexport function extractSpecifications(input: ExtractInput): ExtractedDocument[] {\n const first = extractDocument(input);\n return first === null ? [] : [first, ...(first.subSpecifications as ExtractedDocument[])];\n}\n\n/** Reads a file's own specification. Returns `null` when it opts out. */\n/** The one character that makes a text file read as binary to other tools. */\nconst NUL = '\\u0000';\n\nexport function extractDocument(input: ExtractInput): ExtractedDocument | null {\n const scanned = scanMarkdown(input.text);\n const directives = parseDirectives(scanned.comments);\n if (directives.some((d) => d.name === 'spec-ignore')) return null;\n\n const index = scanned.index;\n const file = input.path;\n const problems: ParseProblem[] = [];\n const at = (start: number, end: number): SourceRef => refOf(file, index, start, end);\n\n const nul = input.text.indexOf(NUL);\n if (nul !== -1) {\n // Not a finding. Nothing about the graph is wrong, and the text parsed - a\n // NUL is whitespace to every rule here. It is a problem with the *input*,\n // which is what a ParseProblem is for, and it is worth one line because\n // spec-graph is likely the only tool that got this far: grep, diff and\n // every review interface read the file as binary and show nothing at all.\n //\n // The cause is almost always an encoding, not a keystroke. UTF-16 read as\n // UTF-8 puts a NUL between every character, and the document that produces\n // looks plausible in some editors and is mojibake everywhere else.\n problems.push({\n message: `contains a NUL byte, so grep, diff and review tooling read this file as binary - check whether it was saved as UTF-16`,\n at: at(nul, nul + 1),\n });\n }\n\n for (const directive of directives) {\n for (const unknown of directive.unknownAttributes) {\n problems.push({\n message: `unknown attribute \"${unknown}\" on @${directive.name}`,\n at: at(directive.start, directive.end),\n });\n }\n }\n\n const entries = scanned.frontMatter ? parseFrontMatter(scanned.frontMatter.raw, scanned.frontMatter.start) : [];\n const byKey = new Map<string, YamlEntry>();\n for (const entry of entries) byKey.set(entry.key, entry);\n const inherited = inheritableFrontMatter(entries);\n\n const h1 = scanned.headings.find((h) => h.level === 1) ?? null;\n const frontMatterId = firstValue(byKey, ID_KEYS) ?? null;\n\n const identityOf = (declaredId: string | null, directive: Directive | null): DocumentIdentity =>\n identify({\n path: input.path,\n declaredId,\n declaredAliases: [\n ...(directive ? attrList(directive, 'aliases') : []),\n ...valuesOf(byKey.get('aliases')),\n ...valuesOf(byKey.get('alias')),\n ],\n heading: h1?.text ?? null,\n });\n\n // A `@spec-node` written inside a register's section belongs to that section,\n // not to the file. Finding the file's own therefore needs the regions, and\n // finding the regions needs the file's identity - so the identity is settled\n // provisionally first, then again once the file's own directive is known.\n const provisional = identityOf(frontMatterId, null);\n const provisionalRegions = findSpecificationRegions(scanned, directives, provisional.id);\n const nodeDirective =\n directives.find(\n (directive) =>\n directive.name === 'spec-node' &&\n !provisionalRegions.some(\n (region) =>\n (region.heading !== null || region.row !== null) &&\n directive.start >= region.start &&\n directive.end <= region.end,\n ),\n ) ?? null;\n\n const declaredId = (nodeDirective ? attr(nodeDirective, 'id')?.value : null) ?? frontMatterId;\n const identity = declaredId === frontMatterId && nodeDirective === null\n ? provisional\n : identityOf(declaredId, nodeDirective);\n\n const status = readStatus(scanned, byKey, nodeDirective, index, file);\n const pathPhase = phaseFromPath(input.path);\n // A record is a categorical statement about what the file *is*, made by\n // configuration or by an explicit directive, so it outranks a status word\n // that happened to be written inside it.\n const record = input.record === true || directives.some((directive) => directive.name === 'spec-history');\n const phase: Phase = record ? 'record' : status.phase !== 'unknown' ? status.phase : pathPhase;\n\n const title =\n (nodeDirective ? attr(nodeDirective, 'title')?.value : null) ??\n asString(byKey.get('title')) ??\n h1?.text ??\n identity.id;\n\n const document: DocumentNode = {\n id: identity.id,\n kind: 'document',\n title,\n at: at(0, Math.min(scanned.text.length, index.lineEnd(1))),\n path: input.path,\n aliases: identity.aliases,\n phase,\n rawStatus: status.raw,\n statusAt: status.at,\n frontMatter: toRecord(entries),\n };\n\n // A register's sections are specifications too. The file is always the first\n // region, so a one-decision file behaves exactly as it did before.\n const regions =\n identity.id === provisional.id ? provisionalRegions : findSpecificationRegions(scanned, directives, identity.id);\n // Every region but the first: a heading section, or a row of a register kept\n // as a table.\n const subSpecifications = regions\n .filter((region) => region.heading !== null || region.row !== null)\n .map((region) =>\n buildRegion({\n region,\n containerId: identity.id,\n input,\n scanned,\n directives,\n index,\n file,\n pathPhase,\n record,\n inherited,\n }),\n );\n\n const ownerAt = (offset: number): string => {\n const region = regionAt(regions, offset);\n if (region === null) return identity.id;\n const owner = subSpecifications.find((spec) => spec.region === region);\n return owner?.document.id ?? identity.id;\n };\n\n const allItems = extractItems({ scanned, directives, ownerAt, file, index });\n const documentAt = (offset: number): DocumentNode => {\n const id = ownerAt(offset);\n if (id === identity.id) return document;\n return subSpecifications.find((spec) => spec.document.id === id)?.document ?? document;\n };\n\n const allReferences = extractReferences({\n scanned,\n directives,\n document,\n documentAt,\n items: allItems,\n byKey,\n status,\n claimed: regions.flatMap((region) => [...region.claimed]),\n file,\n index,\n });\n\n // Hand each region the items and references that fall inside it.\n const ownItems = allItems.filter((item) => item.document === identity.id);\n const ownReferences = allReferences.filter((reference) => belongsTo(reference, identity.id, allItems));\n const misreadKeys = misreadRelationKeys(byKey, identity.id, at);\n const anchors = new Set<string>(scanned.headings.map((h) => h.slug));\n\n const filled = subSpecifications.map((spec) => ({\n ...spec.extracted,\n items: allItems.filter((item) => item.document === spec.document.id),\n references: [\n // Column-declared relations first: they are typed by the header rather\n // than guessed from prose.\n ...spec.extracted.references,\n ...allReferences.filter((reference) => belongsTo(reference, spec.document.id, allItems)),\n ],\n }));\n\n return {\n document,\n items: ownItems,\n references: ownReferences,\n problems,\n misreadKeys,\n anchors,\n identity,\n scanned,\n subSpecifications: filled,\n containerId: null,\n };\n}\n\n/** True when a reference was written on a document or on one of its items. */\nfunction belongsTo(reference: ReferenceCandidate, documentId: string, items: readonly ItemNode[]): boolean {\n if (reference.from === documentId) return true;\n const owner = items.find((item) => item.id === reference.from);\n return owner?.document === documentId;\n}\n\ninterface RegionInput {\n readonly region: SpecificationRegion;\n readonly containerId: string;\n readonly input: ExtractInput;\n readonly scanned: ScannedDocument;\n readonly directives: readonly Directive[];\n readonly index: LineIndex;\n readonly file: string;\n readonly pathPhase: Phase;\n /** The whole file is a historical record, so every part of it is one too. */\n readonly record: boolean;\n /** The file's front matter, minus the keys a region must answer itself. */\n readonly inherited: Readonly<Record<string, string | readonly string[]>>;\n}\n\ninterface BuiltRegion {\n readonly region: SpecificationRegion;\n readonly document: DocumentNode;\n readonly extracted: ExtractedDocument;\n}\n\n/**\n * Turns one region into a specification.\n *\n * It produces exactly the `DocumentNode` a whole file produces, which is the\n * reason every rule, query and reporter works on registers without knowing they\n * exist. The only deliberate differences: the node is anchored at its heading\n * rather than at line one, it carries the file's front matter rather than front\n * matter of its own, and it does not claim the file's path as an alias - the\n * file already does, and two nodes answering to one path would make every link\n * to that file ambiguous.\n */\nfunction buildRegion(context: RegionInput): BuiltRegion {\n const { region, input, scanned, index, file, pathPhase, record, inherited } = context;\n const at = (start: number, end: number): SourceRef => refOf(file, index, start, end);\n\n const identity = identify({\n path: input.path,\n declaredId: region.declaredId,\n declaredAliases: region.directive ? attrList(region.directive, 'aliases') : [],\n heading: region.title,\n includePathAliases: false,\n });\n\n const declaredStatus = region.directive ? attr(region.directive, 'status') : null;\n const rawStatus = declaredStatus?.value ?? region.status?.text ?? null;\n const statusAt = declaredStatus\n ? at(declaredStatus.start, declaredStatus.end)\n : region.status\n ? at(region.status.start, region.status.end)\n : null;\n const declaredPhase = phaseOf(rawStatus);\n\n const document: DocumentNode = {\n id: identity.id,\n kind: 'document',\n title: (region.directive ? attr(region.directive, 'title')?.value : null) ?? region.title ?? identity.id,\n // Anchored at its heading, or at the row when the register is a table.\n at: at(region.start, Math.min(region.end, region.heading?.end ?? region.row?.end ?? region.end)),\n path: input.path,\n aliases: identity.aliases,\n // A section of a journal is part of the journal, whatever status word it\n // wrote for itself. Being a record is a statement about the file made from\n // outside it, and it does not stop at a heading.\n phase: record ? 'record' : declaredPhase !== 'unknown' ? declaredPhase : pathPhase,\n rawStatus,\n statusAt,\n frontMatter: inherited,\n };\n\n const anchors = new Set<string>(\n scanned.headings.filter((h) => h.start >= region.start && h.start < region.end).map((h) => h.slug),\n );\n\n // Relations a table declares by column, typed by the header the author wrote.\n const references: ReferenceCandidate[] = region.relations.map((relation) => ({\n kind: relation.kind,\n from: document.id,\n target: relation.target,\n origin: 'front-matter' as const,\n declaredAt: at(relation.start, relation.end),\n raw: `${relation.column}: ${relation.target}`,\n inverted: relation.inverted,\n opportunistic: false,\n }));\n\n return {\n region,\n document,\n extracted: {\n document,\n items: [],\n references,\n problems: [],\n // The file has already reported anything misread at the top of it, and\n // there is one file however many regions it holds.\n misreadKeys: [],\n anchors,\n identity,\n scanned,\n subSpecifications: [],\n containerId: context.containerId,\n },\n };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Status */\n/* -------------------------------------------------------------------------- */\n\ninterface StatusReading {\n readonly raw: string | null;\n readonly at: SourceRef | null;\n readonly phase: Phase;\n}\n\n/**\n * Finds the document status.\n *\n * Looks in the three places teams actually put it, in descending order of how\n * deliberate each is: a directive, a front-matter field, then the body of a\n * `## Status` section. A repository using none of them still gets a phase from\n * its directory layout, which is handled by the caller.\n */\nfunction readStatus(\n scanned: ScannedDocument,\n byKey: ReadonlyMap<string, YamlEntry>,\n nodeDirective: Directive | null,\n index: LineIndex,\n file: string,\n): StatusReading {\n if (nodeDirective) {\n const declared = attr(nodeDirective, 'status');\n if (declared) {\n return {\n raw: declared.value,\n at: refOf(file, index, declared.start, declared.end),\n phase: phaseOf(declared.value),\n };\n }\n }\n\n for (const key of STATUS_KEYS) {\n const entry = byKey.get(key);\n if (!entry) continue;\n const raw = typeof entry.value === 'string' ? entry.value : entry.value.join(', ');\n if (raw.trim().length === 0) continue;\n return {\n raw,\n at: refOf(file, index, entry.valueStart, entry.end),\n phase: phaseOf(raw),\n };\n }\n\n const heading = scanned.headings.find((h) => isStatusHeading(h.text));\n if (heading) {\n const body = statusSectionBody(scanned, heading.line);\n if (body) {\n return {\n raw: body.text,\n at: refOf(file, index, body.start, body.end),\n phase: phaseOf(body.text),\n };\n }\n }\n\n return { raw: null, at: null, phase: 'unknown' };\n}\n\n/** The first non-blank line under a `## Status` heading. */\nfunction statusSectionBody(\n scanned: ScannedDocument,\n headingLine: number,\n): { text: string; start: number; end: number } | null {\n for (const line of scanned.lines) {\n if (line.line <= headingLine) continue;\n if (line.blank) continue;\n if (line.code) return null;\n const trimmed = line.content.trim();\n // A heading immediately after means the section is empty.\n if (trimmed.startsWith('#')) return null;\n const offset = line.contentStart + line.content.indexOf(trimmed);\n // Bullet lists under Status are a status history; take the first entry.\n const cleaned = trimmed.replace(/^[-*+]\\s+/, '');\n const start = offset + (trimmed.length - cleaned.length);\n return { text: cleaned, start, end: start + cleaned.length };\n }\n return null;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Items */\n/* -------------------------------------------------------------------------- */\n\ninterface ItemContext {\n readonly scanned: ScannedDocument;\n readonly directives: readonly Directive[];\n /** The specification that owns an offset, which in a register is a section. */\n readonly ownerAt: (offset: number) => string;\n readonly file: string;\n readonly index: LineIndex;\n}\n\nfunction extractItems(context: ItemContext): ItemNode[] {\n const { scanned, directives, ownerAt, file, index } = context;\n const out: ItemNode[] = [];\n const ordinals = new Map<string, number>();\n const bound = bindItemDirectives(scanned, directives);\n\n for (const item of scanned.listItems) {\n const section = sectionPathAt(scanned, item.start);\n const inObligationSection = section.some((heading) => OBLIGATION_SECTIONS.has(normaliseHeading(heading)));\n const directive = bound.get(item) ?? null;\n\n if (!isObligation(item, inObligationSection, directive)) continue;\n\n const documentId = ownerAt(item.start);\n const slug = section.length > 0 ? slugify(section[section.length - 1] as string) : 'item';\n // Ordinals count within a specification, so two decisions in one register\n // each get their own `#open-questions.1` rather than sharing a sequence.\n const key = `${documentId}#${slug}`;\n const ordinal = (ordinals.get(key) ?? 0) + 1;\n ordinals.set(key, ordinal);\n\n const declaredId = directive ? attr(directive, 'id')?.value : null;\n const id = `${documentId}#${declaredId ?? `${slug}.${ordinal}`}`;\n\n const state = resolveItemState({\n file,\n index,\n item,\n section,\n directive,\n inObligationSection,\n });\n\n out.push({\n id,\n kind: 'item',\n title: (directive ? attr(directive, 'title')?.value : null) ?? summarise(item.firstLine),\n at: refOf(file, index, item.start, item.end),\n declared: declaredId !== null && declaredId !== undefined,\n document: documentId,\n section,\n text: summarise(item.firstLine),\n body: item.body,\n disposition: state.disposition,\n openness: state.openness,\n evidence: state.evidence,\n conflicts: state.conflicts,\n });\n }\n\n return out;\n}\n\n/**\n * Decides whether a bullet is an obligation.\n *\n * A checkbox or an explicit directive always makes one. Otherwise only\n * top-level bullets under a heading like \"Open Questions\" count: promoting\n * every bullet in a specification would bury the real obligations under the\n * document's own prose.\n */\nfunction isObligation(item: ListItem, inObligationSection: boolean, directive: Directive | null): boolean {\n if (directive !== null) return true;\n if (item.checkbox !== null) return true;\n return inObligationSection && item.depth === 0;\n}\n\n/** The heading path enclosing an offset, outermost first. */\nfunction sectionPathAt(scanned: ScannedDocument, offset: number): string[] {\n const path: { level: number; text: string }[] = [];\n for (const heading of scanned.headings) {\n if (heading.start > offset) break;\n while (path.length > 0 && (path[path.length - 1] as { level: number }).level >= heading.level) path.pop();\n path.push({ level: heading.level, text: heading.text });\n }\n return path.map((entry) => entry.text);\n}\n\n/**\n * Memoised because it is called for every heading above every reference and\n * every item, and a corpus has only a handful of distinct headings - `Context`,\n * `Decision`, `Open Questions`, `See also` - repeated thousands of times.\n */\nconst headingCache = new Map<string, string>();\n\nfunction normaliseHeading(text: string): string {\n const cached = headingCache.get(text);\n if (cached !== undefined) return cached;\n const normalised = text\n .toLowerCase()\n .replace(/[`*_~]/g, '')\n .replace(/[^\\p{L}\\p{N}\\s-]/gu, '')\n .replace(/\\s+/g, ' ')\n .trim();\n // Bounded so a pathological corpus of unique headings cannot grow it forever.\n if (headingCache.size < 4096) headingCache.set(text, normalised);\n return normalised;\n}\n\n/**\n * One-line form of an item for reports.\n *\n * Link syntax is flattened to its label. A finding that quotes the obligation\n * back at the reader should read like the sentence they wrote, not like the\n * Markdown source of it.\n */\nfunction summarise(text: string): string {\n const flat = text\n .replace(/!?\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n // `[[target|display]]` keeps the display half: that is the text a reader\n // of the rendered document actually sees.\n .replace(/\\[\\[(?:[^\\]|]*\\|)?([^\\]]*)\\]\\]/g, '$1')\n .replace(/\\s+/g, ' ')\n .trim();\n return flat.length <= 120 ? flat : `${flat.slice(0, 117)}...`;\n}\n\n/* -------------------------------------------------------------------------- */\n/* References */\n/* -------------------------------------------------------------------------- */\n\ninterface ReferenceContext {\n readonly scanned: ScannedDocument;\n readonly directives: readonly Directive[];\n readonly document: DocumentNode;\n /** The specification that owns an offset, for a reference outside any item. */\n readonly documentAt: (offset: number) => DocumentNode;\n readonly items: readonly ItemNode[];\n readonly byKey: ReadonlyMap<string, YamlEntry>;\n readonly status: StatusReading;\n /** Cell ranges already typed by a table column header. */\n readonly claimed: readonly { start: number; end: number }[];\n readonly file: string;\n readonly index: LineIndex;\n}\n\n/** True when an offset falls in a cell a column header already accounted for. */\nfunction isClaimed(claimed: readonly { start: number; end: number }[], offset: number): boolean {\n return claimed.some((range) => offset >= range.start && offset < range.end);\n}\n\nfunction extractReferences(context: ReferenceContext): ReferenceCandidate[] {\n const { scanned, directives, document, documentAt, items, byKey, status, claimed, file, index } = context;\n const out: ReferenceCandidate[] = [];\n const at = (start: number, end: number): SourceRef => refOf(file, index, start, end);\n\n // Front matter, walked in the order it was written rather than in the order\n // the vocabulary happens to be listed: a key the table does not know still has\n // to be looked at, and only the document knows which those are.\n for (const [key, entry] of byKey) {\n const relation = RELATION_INDEX.get(foldRelationKey(key));\n if (!relation) continue;\n for (const value of valuesOf(entry)) {\n const target = cleanTarget(value);\n if (target.length === 0) continue;\n out.push({\n kind: relation.kind,\n from: document.id,\n target,\n origin: 'front-matter',\n declaredAt: at(entry.valueStart, entry.end),\n raw: `${key}: ${value}`,\n inverted: relation.inverted,\n opportunistic: false,\n });\n }\n }\n\n // `status: Superseded by ADR-0009` is the most common supersession record of\n // all, and it never appears as a field of its own.\n if (status.raw && status.at) {\n for (const target of supersessionTargetsIn(status.raw)) {\n const cleaned = cleanTarget(target);\n if (cleaned.length === 0) continue;\n out.push({\n kind: 'supersedes',\n from: document.id,\n target: cleaned,\n origin: 'front-matter',\n declaredAt: status.at,\n raw: status.raw,\n inverted: true,\n opportunistic: true,\n });\n }\n }\n\n // Explicit edge directives.\n for (const directive of directives) {\n if (directive.name !== 'spec-edge') continue;\n const kind = attr(directive, 'kind')?.value as EdgeKind | undefined;\n const to = attr(directive, 'to');\n const from = attr(directive, 'from');\n if (!kind) continue;\n const owner = ownerOf(items, directive.start) ?? documentAt(directive.start).id;\n if (to) {\n out.push({\n kind,\n from: owner,\n target: to.value,\n origin: 'directive',\n declaredAt: at(to.start, to.end),\n raw: `@spec-edge kind=\"${kind}\" to=\"${to.value}\"`,\n inverted: false,\n opportunistic: false,\n });\n }\n if (from) {\n out.push({\n kind,\n from: owner,\n target: from.value,\n origin: 'directive',\n declaredAt: at(from.start, from.end),\n raw: `@spec-edge kind=\"${kind}\" from=\"${from.value}\"`,\n inverted: true,\n opportunistic: false,\n });\n }\n }\n\n // Prose links. A cell whose meaning a column header already gave is skipped,\n // so `| ADR-0002 | ... | [ADR-0001](0001.md) |` yields one typed edge rather\n // than a typed edge and a neutral citation beside it.\n const linked = new Set<string>();\n for (const link of scanned.links) {\n if (link.form === 'definition') continue;\n if (isClaimed(claimed, link.start)) continue;\n const target = cleanTarget(link.target);\n if (target.length === 0) continue;\n if (isExternal(target)) continue;\n\n const owner = ownerOf(items, link.start) ?? documentAt(link.start).id;\n const section = sectionPathAt(scanned, link.start);\n const classified = classifyReference(scanned.masked, link.start, link.end, section);\n\n linked.add(normaliseRef(stripAnchor(target)));\n out.push({\n kind: classified.kind,\n from: owner,\n target,\n origin: 'link',\n declaredAt: at(link.targetStart, link.targetStart + link.target.length),\n raw: renderLink(link),\n inverted: classified.inverted,\n opportunistic: false,\n });\n }\n\n // Bare identifiers in prose. Everything already covered by a link is skipped\n // so a citation written as `[ADR-7](0007.md)` is not counted twice.\n for (const bare of findBareReferences(scanned)) {\n const key = normaliseRef(bare.text);\n if (linked.has(key)) continue;\n if (isClaimed(claimed, bare.start)) continue;\n const owner = ownerOf(items, bare.start) ?? documentAt(bare.start).id;\n const section = sectionPathAt(scanned, bare.start);\n const classified = classifyReference(scanned.masked, bare.start, bare.end, section);\n out.push({\n kind: classified.kind,\n from: owner,\n target: bare.text,\n origin: 'text',\n declaredAt: at(bare.start, bare.end),\n raw: bare.text,\n inverted: classified.inverted,\n opportunistic: true,\n });\n }\n\n return withoutOverlaps(out);\n}\n\n/**\n * Collapses candidates that describe the same written citation.\n *\n * `Superseded by ADR-0009` in a status section is read twice: the status\n * reader reports the whole line, and prose scanning reports the identifier\n * inside it. One written citation is one reference - so when the target\n * resolves it must not become two edges, and when it does not it must not\n * become two findings on one line a reader can only fix once.\n *\n * The narrower span wins, because it points at the text that has to change.\n *\n * Only overlapping spans collapse. Two sentences citing the same missing\n * document are two citations, and silently reporting one of them would leave\n * the other to be discovered on the next run.\n */\nfunction withoutOverlaps(candidates: readonly ReferenceCandidate[]): ReferenceCandidate[] {\n const out: ReferenceCandidate[] = [];\n for (const candidate of candidates) {\n const index = out.findIndex(\n (other) =>\n other.kind === candidate.kind &&\n other.from === candidate.from &&\n other.inverted === candidate.inverted &&\n normaliseRef(other.target) === normaliseRef(candidate.target) &&\n overlapping(other.declaredAt, candidate.declaredAt),\n );\n if (index === -1) {\n out.push(candidate);\n continue;\n }\n const held = out[index] as ReferenceCandidate;\n // The status reader runs before prose scanning, so today the wider span is\n // always the one already held and this comparison always replaces it. It is\n // written as a comparison rather than an unconditional swap because which\n // reader runs first is not a property worth depending on, and a mutant that\n // makes it unconditional is equivalent only by that accident.\n if (width(candidate.declaredAt) < width(held.declaredAt)) out[index] = candidate;\n }\n return out;\n}\n\nconst width = (ref: SourceRef): number => ref.span.end.offset - ref.span.start.offset;\n\n/**\n * Whether two spans cover any of the same text.\n *\n * Offsets alone, with no file comparison: every candidate here was built from\n * one scan of one file, so there is no second file for them to be offsets into.\n */\nfunction overlapping(a: SourceRef, b: SourceRef): boolean {\n return a.span.start.offset < b.span.end.offset && b.span.start.offset < a.span.end.offset;\n}\n\n/** The item whose block contains an offset, if any. */\nfunction ownerOf(items: readonly ItemNode[], offset: number): string | null {\n let best: ItemNode | null = null;\n for (const item of items) {\n const span = item.at.span;\n if (offset < span.start.offset || offset >= span.end.offset) continue;\n // Innermost wins when items nest.\n if (best === null || span.start.offset > best.at.span.start.offset) best = item;\n }\n return best?.id ?? null;\n}\n\nexport interface Classification {\n readonly kind: EdgeKind;\n readonly inverted: boolean;\n}\n\n/**\n * Decides what a reference means from the words around it.\n *\n * The nearest governing phrase within {@link VERB_WINDOW} characters wins, and\n * the search never crosses a sentence boundary. With nothing to go on, a\n * reference under a \"See also\" heading is bookkeeping and everything else is a\n * neutral citation.\n */\nexport function classifyReference(\n text: string,\n start: number,\n end: number,\n section: readonly string[],\n): Classification {\n const before = sentenceBefore(text, start);\n\n // Left to right, so the last match within the window is the nearest one - and\n // the nearest governing phrase is the one that governs.\n let best: Classification | null = null;\n VERB_PATTERN.lastIndex = 0;\n for (let m = VERB_PATTERN.exec(before); m !== null; m = VERB_PATTERN.exec(before)) {\n const phrase = m[0] as string;\n const end = (m.index ?? 0) + phrase.length;\n const distance = before.length - end;\n if (distance > VERB_WINDOW) continue;\n // What sits between the phrase and the reference has to be connective. A\n // negation in there reverses the claim the phrase would otherwise make.\n if (NEGATION.test(before.slice(end))) continue;\n const rule = VERB_LOOKUP.get(phrase);\n if (rule) best = rule;\n }\n\n if (best) return best;\n\n // \"[ADR-0009] supersedes this decision\": the reference is the subject, so the\n // relation runs the other way.\n const after = sentenceAfter(text, end);\n for (const rule of VERB_RULES) {\n if (rule.inverted) continue;\n for (const phrase of rule.phrases) {\n if (!after.startsWith(phrase)) continue;\n if (rule.kind === 'assumes' || rule.kind === 'depends-on') continue;\n return { kind: rule.kind, inverted: true };\n }\n }\n\n const innermost = section.length > 0 ? normaliseHeading(section[section.length - 1] as string) : '';\n if (WEAK_SECTIONS.has(innermost)) return { kind: 'relates-to', inverted: false };\n for (const heading of section) {\n if (WEAK_SECTIONS.has(normaliseHeading(heading))) return { kind: 'relates-to', inverted: false };\n }\n\n return { kind: 'references', inverted: false };\n}\n\n/** A sentence end, a blank line, or the start of a new block-level item. */\n/**\n * A table cell edge ends a statement too.\n *\n * The pipe matters more than it looks. A table row is a list of independent\n * fields, and without it the look-behind window reaches back across the row\n * boundary into the previous row's prose. An index of archived documents whose\n * last column ended \"...before assuming the drift was fixed\" turned every\n * following row's link into an `assumes` edge, and so turned every archived\n * document it listed into a stale premise.\n */\nconst STATEMENT_BREAK = /[.?!;]\\s|\\n\\s*\\n|\\n\\s*[-*+>#]|\\|/g;\n\n/**\n * Lower-cased, whitespace-collapsed text back to the start of the statement.\n *\n * The search stops at the last boundary: a governing phrase in the *previous*\n * sentence does not govern this reference. \"We deferred that to ADR-3. See also\n * [ADR-9].\" must not read as a delegation to ADR-9.\n */\nfunction sentenceBefore(text: string, start: number): string {\n const window = text.slice(Math.max(0, start - 160), start);\n let cut = 0;\n STATEMENT_BREAK.lastIndex = 0;\n for (let m = STATEMENT_BREAK.exec(window); m !== null; m = STATEMENT_BREAK.exec(window)) {\n cut = (m.index ?? 0) + (m[0] as string).length;\n }\n return window\n .slice(cut)\n .toLowerCase()\n .replace(/[`*_~\"'()\\[\\],]/g, ' ')\n .replace(/\\s+/g, ' ');\n}\n\nfunction sentenceAfter(text: string, end: number): string {\n const window = text.slice(end, Math.min(text.length, end + 80));\n const stop = /[.?!;\\n|]/.exec(window);\n const cut = stop ? window.slice(0, stop.index) : window;\n return cut.toLowerCase().replace(/[`*_~\"'()\\[\\],]/g, ' ').replace(/\\s+/g, ' ').trim();\n}\n\ninterface BareReference {\n readonly text: string;\n readonly start: number;\n readonly end: number;\n}\n\n/**\n * Finds identifiers written as plain prose, such as \"as decided in ADR-0007\".\n *\n * Link constructs are blanked first. Without that, `[ADR-7](https://x/adr-7)`\n * would yield three references to the same thing - one real and two harvested\n * out of a URL - which is precisely the mis-match that makes hand-rolled regex\n * checks untrustworthy.\n */\nfunction findBareReferences(scanned: ScannedDocument): BareReference[] {\n // Slice-based for the same reason as the scanner's masking: this runs over\n // every document, and a per-character array is the wrong shape for the job.\n const source = scanned.masked;\n let text = '';\n let cursor = 0;\n for (const link of scanned.links) {\n const start = Math.max(link.start, cursor);\n const end = Math.min(link.end, source.length);\n if (end <= start) continue;\n text += source.slice(cursor, start);\n text += source.slice(start, end).replace(/[^\\n\\r]/g, ' ');\n cursor = end;\n }\n text += source.slice(cursor);\n\n const out: BareReference[] = [];\n BARE_REF.lastIndex = 0;\n for (let m = BARE_REF.exec(text); m !== null; m = BARE_REF.exec(text)) {\n const prefix = (m[1] as string).toLowerCase();\n if (NOT_A_FAMILY.has(prefix)) continue;\n if (prefix.length < 2) continue;\n const start = m.index ?? 0;\n // A token glued to a path separator or an extension is not a citation.\n const before = text[start - 1] ?? ' ';\n const after = text[start + (m[0] as string).length] ?? ' ';\n if (before === '/' || before === '.' || after === '/') continue;\n out.push({ text: m[0] as string, start, end: start + (m[0] as string).length });\n }\n return out;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------------- */\n\nfunction firstValue(byKey: ReadonlyMap<string, YamlEntry>, keys: readonly string[]): string | null {\n for (const key of keys) {\n const entry = byKey.get(key);\n if (!entry) continue;\n const value = asString(entry);\n if (value !== null && value.length > 0) return value;\n }\n return null;\n}\n\nfunction asString(entry: YamlEntry | undefined): string | null {\n if (!entry) return null;\n if (typeof entry.value === 'string') return entry.value.trim().length > 0 ? entry.value.trim() : null;\n return entry.value.length > 0 ? (entry.value[0] as string) : null;\n}\n\n/** Strips Markdown decoration a target may still be wearing. */\nfunction cleanTarget(value: string): string {\n return value\n .trim()\n .replace(/^[`'\"<(\\[]+/, '')\n .replace(/[`'\">)\\]]+$/, '')\n .replace(/[.,;]+$/, '')\n .trim();\n}\n\nfunction stripAnchor(target: string): string {\n const hash = target.indexOf('#');\n return hash <= 0 ? target : target.slice(0, hash);\n}\n\nfunction renderLink(link: Link): string {\n switch (link.form) {\n case 'wiki':\n return `[[${link.target}]]`;\n case 'autolink':\n return `<${link.target}>`;\n case 'reference':\n case 'shortcut':\n return `[${link.text}][${link.label ?? ''}]`;\n default:\n return `[${link.text}](${link.target})`;\n }\n}\n\n/** Exposed for tests and for callers that classify their own sections. */\nexport { OBLIGATION_SECTIONS, sectionPathAt, WEAK_SECTIONS };\n"]}
package/dist/glob.d.ts CHANGED
@@ -7,6 +7,7 @@
7
7
  * `!` for negation - and everything is matched against repository-relative
8
8
  * POSIX paths so results do not depend on the host platform.
9
9
  */
10
+ import { type Matcher } from './regex.js';
10
11
  /** Directories skipped unless a pattern explicitly names them. */
11
12
  export declare const DEFAULT_IGNORED_DIRECTORIES: readonly string[];
12
13
  /** Files larger than this are skipped: a specification is not a binary. */
@@ -34,8 +35,36 @@ export declare function isGlob(pattern: string): boolean;
34
35
  * `**` crosses directory separators; `*` and `?` do not. A trailing `/` or a
35
36
  * bare directory name matches everything beneath it, which is what people mean
36
37
  * when they write `--ignore drafts`.
38
+ *
39
+ * Nothing in the pipeline matches with this any more - see {@link compileGlob},
40
+ * which gives the same answers without the backtracking. It stays for callers
41
+ * who want a `RegExp`, and as the oracle the tests hold the automaton to.
37
42
  */
38
43
  export declare function globToRegExp(pattern: string): RegExp;
44
+ export interface GlobOptions {
45
+ /** Fold case. Defaults to the host's convention: on for Windows, off elsewhere. */
46
+ readonly ignoreCase?: boolean | undefined;
47
+ }
48
+ /**
49
+ * Compiles a glob to the automaton every matcher here uses.
50
+ *
51
+ * A glob has no nested quantifiers, and ADR-0017 took that to mean there was no
52
+ * backtracking hazard in handing one to `RegExp`. Nobody had timed it. Each
53
+ * `*` is a `[^/]*`, and against a subject that fails to match, a backtracking
54
+ * engine tries every way of dividing it between them - the subject's length to
55
+ * the power of the stars:
56
+ *
57
+ * ```text
58
+ * RegExp here
59
+ * **\/*-*-*-*.md a 643-character hyphenated file name 2.3s 0.2ms
60
+ * *-*-*-x a 10,000-character reference target 120s 0.9ms
61
+ * ```
62
+ *
63
+ * The first is bounded by the filesystem, which caps a name at 255 bytes. The
64
+ * second is not: `--ignore-ref` patterns are matched against targets read out
65
+ * of documents, and a document is whatever somebody wrote.
66
+ */
67
+ export declare function compileGlob(pattern: string, options?: GlobOptions): Matcher;
39
68
  export interface GlobMatcher {
40
69
  (path: string): boolean;
41
70
  }
@@ -58,6 +87,11 @@ export declare function createGlobMatcher(patterns: readonly string[]): GlobMatc
58
87
  * Matching is case-insensitive on every platform. Path matching inherits the
59
88
  * host filesystem's case rules, which is right for paths and wrong here: a
60
89
  * repository's findings must not depend on which machine ran the check.
90
+ *
91
+ * Both sides are lower-cased, and that is the whole of the case rule. Folding
92
+ * as well used to happen on Windows only, where it made U+00B5 (micro sign)
93
+ * and U+03BC (mu) the same target - one machine's answer, which is what this
94
+ * function exists not to give.
61
95
  */
62
96
  export declare function createReferenceFilter(patterns: readonly string[]): (target: string) => boolean;
63
97
  /** The literal directory prefix of a pattern, used to avoid walking the world. */
package/dist/glob.js CHANGED
@@ -9,6 +9,7 @@
9
9
  */
10
10
  import { readdir, stat } from 'node:fs/promises';
11
11
  import { joinPosix, normalisePosix, toPosix } from './paths.js';
12
+ import { compilePattern } from './regex.js';
12
13
  /** Directories skipped unless a pattern explicitly names them. */
13
14
  export const DEFAULT_IGNORED_DIRECTORIES = Object.freeze([
14
15
  '.git',
@@ -41,8 +42,46 @@ export function isGlob(pattern) {
41
42
  * `**` crosses directory separators; `*` and `?` do not. A trailing `/` or a
42
43
  * bare directory name matches everything beneath it, which is what people mean
43
44
  * when they write `--ignore drafts`.
45
+ *
46
+ * Nothing in the pipeline matches with this any more - see {@link compileGlob},
47
+ * which gives the same answers without the backtracking. It stays for callers
48
+ * who want a `RegExp`, and as the oracle the tests hold the automaton to.
44
49
  */
45
50
  export function globToRegExp(pattern) {
51
+ return new RegExp(`^${globSource(pattern)}$`, process.platform === 'win32' ? 'i' : '');
52
+ }
53
+ /**
54
+ * Compiles a glob to the automaton every matcher here uses.
55
+ *
56
+ * A glob has no nested quantifiers, and ADR-0017 took that to mean there was no
57
+ * backtracking hazard in handing one to `RegExp`. Nobody had timed it. Each
58
+ * `*` is a `[^/]*`, and against a subject that fails to match, a backtracking
59
+ * engine tries every way of dividing it between them - the subject's length to
60
+ * the power of the stars:
61
+ *
62
+ * ```text
63
+ * RegExp here
64
+ * **\/*-*-*-*.md a 643-character hyphenated file name 2.3s 0.2ms
65
+ * *-*-*-x a 10,000-character reference target 120s 0.9ms
66
+ * ```
67
+ *
68
+ * The first is bounded by the filesystem, which caps a name at 255 bytes. The
69
+ * second is not: `--ignore-ref` patterns are matched against targets read out
70
+ * of documents, and a document is whatever somebody wrote.
71
+ */
72
+ export function compileGlob(pattern, options = {}) {
73
+ const source = globSource(pattern);
74
+ try {
75
+ return compilePattern(`^${source}$`, { ignoreCase: options.ignoreCase ?? process.platform === 'win32' });
76
+ }
77
+ catch (error) {
78
+ // The message describes an expression the user never wrote, so it is told
79
+ // against the glob they did.
80
+ throw new Error(`invalid glob "${pattern}": ${error.message}`);
81
+ }
82
+ }
83
+ /** The expression a glob stands for, before anchors and flags. */
84
+ function globSource(pattern) {
46
85
  let source = '';
47
86
  let i = 0;
48
87
  const braces = [];
@@ -99,7 +138,10 @@ export function globToRegExp(pattern) {
99
138
  source += ch.replace(/[.+^${}()|[\]\\]/g, '\\$&');
100
139
  i += 1;
101
140
  }
102
- return new RegExp(`^${source}$`, process.platform === 'win32' ? 'i' : '');
141
+ // Otherwise reported as an unmatched parenthesis, in a glob that has none.
142
+ if (braces.length > 0)
143
+ throw new Error(`invalid glob "${pattern}": unclosed "{"`);
144
+ return source;
103
145
  }
104
146
  function escapeClass(body) {
105
147
  return body.replace(/[\\^\]]/g, '\\$&');
@@ -120,8 +162,8 @@ export function createGlobMatcher(patterns) {
120
162
  return {
121
163
  negated,
122
164
  exact: isGlob(normalised) ? null : normalised.toLowerCase(),
123
- expression: globToRegExp(expanded),
124
- direct: globToRegExp(normalised),
165
+ expression: compileGlob(expanded),
166
+ direct: compileGlob(normalised),
125
167
  };
126
168
  });
127
169
  return (path) => {
@@ -148,13 +190,18 @@ export function createGlobMatcher(patterns) {
148
190
  * Matching is case-insensitive on every platform. Path matching inherits the
149
191
  * host filesystem's case rules, which is right for paths and wrong here: a
150
192
  * repository's findings must not depend on which machine ran the check.
193
+ *
194
+ * Both sides are lower-cased, and that is the whole of the case rule. Folding
195
+ * as well used to happen on Windows only, where it made U+00B5 (micro sign)
196
+ * and U+03BC (mu) the same target - one machine's answer, which is what this
197
+ * function exists not to give.
151
198
  */
152
199
  export function createReferenceFilter(patterns) {
153
200
  if (patterns.length === 0)
154
201
  return () => false;
155
202
  const compiled = patterns
156
203
  .filter((pattern) => pattern.trim().length > 0)
157
- .map((pattern) => globToRegExp(pattern.trim().toLowerCase()));
204
+ .map((pattern) => compileGlob(pattern.trim().toLowerCase(), { ignoreCase: false }));
158
205
  if (compiled.length === 0)
159
206
  return () => false;
160
207
  return (target) => {