@jasonbelmonti/markdown-engine 2.0.0 → 3.1.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.
Files changed (196) hide show
  1. package/CHANGELOG.md +45 -1
  2. package/README.md +132 -57
  3. package/dist/api/contracts.d.ts +2 -1
  4. package/dist/api/contracts.d.ts.map +1 -1
  5. package/dist/api/contracts.js +1 -0
  6. package/dist/api/contracts.js.map +1 -1
  7. package/dist/api/declarative-validation.d.ts +2 -2
  8. package/dist/api/declarative-validation.d.ts.map +1 -1
  9. package/dist/api/declarative-validation.js +53 -31
  10. package/dist/api/declarative-validation.js.map +1 -1
  11. package/dist/api/document-set-validation-types.d.ts +32 -0
  12. package/dist/api/document-set-validation-types.d.ts.map +1 -0
  13. package/dist/api/document-set-validation-types.js +2 -0
  14. package/dist/api/document-set-validation-types.js.map +1 -0
  15. package/dist/api/document-set-validation.d.ts +4 -0
  16. package/dist/api/document-set-validation.d.ts.map +1 -0
  17. package/dist/api/document-set-validation.js +60 -0
  18. package/dist/api/document-set-validation.js.map +1 -0
  19. package/dist/api/serialize.d.ts +2 -1
  20. package/dist/api/serialize.d.ts.map +1 -1
  21. package/dist/api/serialize.js.map +1 -1
  22. package/dist/cli/declarative-validation.d.ts.map +1 -1
  23. package/dist/cli/declarative-validation.js +7 -12
  24. package/dist/cli/declarative-validation.js.map +1 -1
  25. package/dist/declarative-validation/applicability/classifier.d.ts +18 -0
  26. package/dist/declarative-validation/applicability/classifier.d.ts.map +1 -0
  27. package/dist/declarative-validation/applicability/classifier.js +37 -0
  28. package/dist/declarative-validation/applicability/classifier.js.map +1 -0
  29. package/dist/declarative-validation/applicability/index.d.ts +2 -0
  30. package/dist/declarative-validation/applicability/index.d.ts.map +1 -0
  31. package/dist/declarative-validation/applicability/index.js +2 -0
  32. package/dist/declarative-validation/applicability/index.js.map +1 -0
  33. package/dist/declarative-validation/assertions/context.d.ts +2 -2
  34. package/dist/declarative-validation/assertions/context.d.ts.map +1 -1
  35. package/dist/declarative-validation/assertions/diagnostics.d.ts +7 -4
  36. package/dist/declarative-validation/assertions/diagnostics.d.ts.map +1 -1
  37. package/dist/declarative-validation/assertions/diagnostics.js +26 -1
  38. package/dist/declarative-validation/assertions/diagnostics.js.map +1 -1
  39. package/dist/declarative-validation/assertions/evaluator.d.ts +2 -2
  40. package/dist/declarative-validation/assertions/evaluator.d.ts.map +1 -1
  41. package/dist/declarative-validation/assertions/evaluator.js +9 -0
  42. package/dist/declarative-validation/assertions/evaluator.js.map +1 -1
  43. package/dist/declarative-validation/assertions/frontmatter-shape.d.ts +9 -0
  44. package/dist/declarative-validation/assertions/frontmatter-shape.d.ts.map +1 -0
  45. package/dist/declarative-validation/assertions/frontmatter-shape.js +105 -0
  46. package/dist/declarative-validation/assertions/frontmatter-shape.js.map +1 -0
  47. package/dist/declarative-validation/assertions/group-evaluator.d.ts +6 -0
  48. package/dist/declarative-validation/assertions/group-evaluator.d.ts.map +1 -0
  49. package/dist/declarative-validation/assertions/group-evaluator.js +57 -0
  50. package/dist/declarative-validation/assertions/group-evaluator.js.map +1 -0
  51. package/dist/declarative-validation/assertions/id-targets.d.ts +15 -0
  52. package/dist/declarative-validation/assertions/id-targets.d.ts.map +1 -1
  53. package/dist/declarative-validation/assertions/id-targets.js +18 -55
  54. package/dist/declarative-validation/assertions/id-targets.js.map +1 -1
  55. package/dist/declarative-validation/assertions/ids.d.ts.map +1 -1
  56. package/dist/declarative-validation/assertions/ids.js +100 -14
  57. package/dist/declarative-validation/assertions/ids.js.map +1 -1
  58. package/dist/declarative-validation/assertions/index.d.ts +1 -0
  59. package/dist/declarative-validation/assertions/index.d.ts.map +1 -1
  60. package/dist/declarative-validation/assertions/index.js +1 -0
  61. package/dist/declarative-validation/assertions/index.js.map +1 -1
  62. package/dist/declarative-validation/assertions/table-column-coverage.d.ts +9 -0
  63. package/dist/declarative-validation/assertions/table-column-coverage.d.ts.map +1 -0
  64. package/dist/declarative-validation/assertions/table-column-coverage.js +108 -0
  65. package/dist/declarative-validation/assertions/table-column-coverage.js.map +1 -0
  66. package/dist/declarative-validation/assertions/text-format.d.ts +9 -0
  67. package/dist/declarative-validation/assertions/text-format.d.ts.map +1 -0
  68. package/dist/declarative-validation/assertions/text-format.js +75 -0
  69. package/dist/declarative-validation/assertions/text-format.js.map +1 -0
  70. package/dist/declarative-validation/compiler/applicability-plan.d.ts +5 -0
  71. package/dist/declarative-validation/compiler/applicability-plan.d.ts.map +1 -0
  72. package/dist/declarative-validation/compiler/applicability-plan.js +22 -0
  73. package/dist/declarative-validation/compiler/applicability-plan.js.map +1 -0
  74. package/dist/declarative-validation/compiler/assertion-builders.d.ts +2 -1
  75. package/dist/declarative-validation/compiler/assertion-builders.d.ts.map +1 -1
  76. package/dist/declarative-validation/compiler/assertion-builders.js +88 -13
  77. package/dist/declarative-validation/compiler/assertion-builders.js.map +1 -1
  78. package/dist/declarative-validation/compiler/assertion-shapes.d.ts +5 -1
  79. package/dist/declarative-validation/compiler/assertion-shapes.d.ts.map +1 -1
  80. package/dist/declarative-validation/compiler/assertion-shapes.js +120 -0
  81. package/dist/declarative-validation/compiler/assertion-shapes.js.map +1 -1
  82. package/dist/declarative-validation/compiler/assertions.d.ts +2 -1
  83. package/dist/declarative-validation/compiler/assertions.d.ts.map +1 -1
  84. package/dist/declarative-validation/compiler/assertions.js +16 -4
  85. package/dist/declarative-validation/compiler/assertions.js.map +1 -1
  86. package/dist/declarative-validation/compiler/compatibility.d.ts.map +1 -1
  87. package/dist/declarative-validation/compiler/compatibility.js +3 -0
  88. package/dist/declarative-validation/compiler/compatibility.js.map +1 -1
  89. package/dist/declarative-validation/compiler/group-plans.d.ts +6 -0
  90. package/dist/declarative-validation/compiler/group-plans.d.ts.map +1 -0
  91. package/dist/declarative-validation/compiler/group-plans.js +67 -0
  92. package/dist/declarative-validation/compiler/group-plans.js.map +1 -0
  93. package/dist/declarative-validation/compiler/index.d.ts +1 -1
  94. package/dist/declarative-validation/compiler/index.d.ts.map +1 -1
  95. package/dist/declarative-validation/compiler/index.js +70 -35
  96. package/dist/declarative-validation/compiler/index.js.map +1 -1
  97. package/dist/declarative-validation/compiler/plan.d.ts +80 -5
  98. package/dist/declarative-validation/compiler/plan.d.ts.map +1 -1
  99. package/dist/declarative-validation/compiler/rule-fields.d.ts +6 -0
  100. package/dist/declarative-validation/compiler/rule-fields.d.ts.map +1 -0
  101. package/dist/declarative-validation/compiler/rule-fields.js +40 -0
  102. package/dist/declarative-validation/compiler/rule-fields.js.map +1 -0
  103. package/dist/declarative-validation/diagnostics/profile-config-diagnostics.d.ts +0 -1
  104. package/dist/declarative-validation/diagnostics/profile-config-diagnostics.d.ts.map +1 -1
  105. package/dist/declarative-validation/diagnostics/profile-config-diagnostics.js +8 -2
  106. package/dist/declarative-validation/diagnostics/profile-config-diagnostics.js.map +1 -1
  107. package/dist/declarative-validation/evidence/index.d.ts +3 -3
  108. package/dist/declarative-validation/evidence/index.d.ts.map +1 -1
  109. package/dist/declarative-validation/evidence/index.js +6 -6
  110. package/dist/declarative-validation/evidence/index.js.map +1 -1
  111. package/dist/declarative-validation/profile/applicability-schema.d.ts +4 -0
  112. package/dist/declarative-validation/profile/applicability-schema.d.ts.map +1 -0
  113. package/dist/declarative-validation/profile/applicability-schema.js +24 -0
  114. package/dist/declarative-validation/profile/applicability-schema.js.map +1 -0
  115. package/dist/declarative-validation/profile/assertion-schema.d.ts +2 -1
  116. package/dist/declarative-validation/profile/assertion-schema.d.ts.map +1 -1
  117. package/dist/declarative-validation/profile/assertion-schema.js +194 -14
  118. package/dist/declarative-validation/profile/assertion-schema.js.map +1 -1
  119. package/dist/declarative-validation/profile/direct-profile-diagnostics.d.ts +3 -1
  120. package/dist/declarative-validation/profile/direct-profile-diagnostics.d.ts.map +1 -1
  121. package/dist/declarative-validation/profile/direct-profile-diagnostics.js +10 -2
  122. package/dist/declarative-validation/profile/direct-profile-diagnostics.js.map +1 -1
  123. package/dist/declarative-validation/profile/frontmatter-shape-schema.d.ts +8 -0
  124. package/dist/declarative-validation/profile/frontmatter-shape-schema.d.ts.map +1 -0
  125. package/dist/declarative-validation/profile/frontmatter-shape-schema.js +178 -0
  126. package/dist/declarative-validation/profile/frontmatter-shape-schema.js.map +1 -0
  127. package/dist/declarative-validation/profile/group-schema.d.ts +5 -0
  128. package/dist/declarative-validation/profile/group-schema.d.ts.map +1 -0
  129. package/dist/declarative-validation/profile/group-schema.js +55 -0
  130. package/dist/declarative-validation/profile/group-schema.js.map +1 -0
  131. package/dist/declarative-validation/profile/ids-assertion-contract.d.ts +12 -0
  132. package/dist/declarative-validation/profile/ids-assertion-contract.d.ts.map +1 -0
  133. package/dist/declarative-validation/profile/ids-assertion-contract.js +32 -0
  134. package/dist/declarative-validation/profile/ids-assertion-contract.js.map +1 -0
  135. package/dist/declarative-validation/profile/index.d.ts +63 -2
  136. package/dist/declarative-validation/profile/index.d.ts.map +1 -1
  137. package/dist/declarative-validation/profile/index.js.map +1 -1
  138. package/dist/declarative-validation/profile/materialization.d.ts.map +1 -1
  139. package/dist/declarative-validation/profile/materialization.js +13 -10
  140. package/dist/declarative-validation/profile/materialization.js.map +1 -1
  141. package/dist/declarative-validation/profile/schema.d.ts.map +1 -1
  142. package/dist/declarative-validation/profile/schema.js +73 -12
  143. package/dist/declarative-validation/profile/schema.js.map +1 -1
  144. package/dist/declarative-validation/profile/syntax-version.d.ts +7 -0
  145. package/dist/declarative-validation/profile/syntax-version.d.ts.map +1 -0
  146. package/dist/declarative-validation/profile/syntax-version.js +11 -0
  147. package/dist/declarative-validation/profile/syntax-version.js.map +1 -0
  148. package/dist/declarative-validation/profile/text-format-contract.d.ts +4 -0
  149. package/dist/declarative-validation/profile/text-format-contract.d.ts.map +1 -0
  150. package/dist/declarative-validation/profile/text-format-contract.js +6 -0
  151. package/dist/declarative-validation/profile/text-format-contract.js.map +1 -0
  152. package/dist/declarative-validation/results/clone-rule-result.d.ts +6 -0
  153. package/dist/declarative-validation/results/clone-rule-result.d.ts.map +1 -0
  154. package/dist/declarative-validation/results/clone-rule-result.js +125 -0
  155. package/dist/declarative-validation/results/clone-rule-result.js.map +1 -0
  156. package/dist/declarative-validation/results/create-result.d.ts +15 -0
  157. package/dist/declarative-validation/results/create-result.d.ts.map +1 -0
  158. package/dist/declarative-validation/results/create-result.js +58 -0
  159. package/dist/declarative-validation/results/create-result.js.map +1 -0
  160. package/dist/declarative-validation/results/index.d.ts +3 -25
  161. package/dist/declarative-validation/results/index.d.ts.map +1 -1
  162. package/dist/declarative-validation/results/index.js +2 -1
  163. package/dist/declarative-validation/results/index.js.map +1 -1
  164. package/dist/declarative-validation/results/skipped-rule-result.d.ts +10 -0
  165. package/dist/declarative-validation/results/skipped-rule-result.d.ts.map +1 -0
  166. package/dist/declarative-validation/results/skipped-rule-result.js +18 -0
  167. package/dist/declarative-validation/results/skipped-rule-result.js.map +1 -0
  168. package/dist/declarative-validation/results/types.d.ts +77 -0
  169. package/dist/declarative-validation/results/types.d.ts.map +1 -0
  170. package/dist/declarative-validation/results/types.js +2 -0
  171. package/dist/declarative-validation/results/types.js.map +1 -0
  172. package/dist/declarative-validation/selectors/table-targets.d.ts +23 -0
  173. package/dist/declarative-validation/selectors/table-targets.d.ts.map +1 -1
  174. package/dist/declarative-validation/selectors/table-targets.js +52 -9
  175. package/dist/declarative-validation/selectors/table-targets.js.map +1 -1
  176. package/dist-bundled/markdown-engine-cli.mjs +27373 -0
  177. package/docs/contracts/api.md +79 -15
  178. package/docs/contracts/declarative-validation.md +462 -40
  179. package/fixtures/declarative-validation/examples/okf-v0.1/fail/invalid-log-date/log.md +5 -0
  180. package/fixtures/declarative-validation/examples/okf-v0.1/fail/missing-concept-type/concepts/customer-metric.md +8 -0
  181. package/fixtures/declarative-validation/examples/okf-v0.1/fail/non-root-index-frontmatter/datasets/index.md +7 -0
  182. package/fixtures/declarative-validation/examples/okf-v0.1/pass/datasets/index.md +3 -0
  183. package/fixtures/declarative-validation/examples/okf-v0.1/pass/datasets/sales.md +16 -0
  184. package/fixtures/declarative-validation/examples/okf-v0.1/pass/index.md +8 -0
  185. package/fixtures/declarative-validation/examples/okf-v0.1/pass/log.md +9 -0
  186. package/fixtures/declarative-validation/examples/okf-v0.1/pass/playbooks/incident-response.md +17 -0
  187. package/fixtures/declarative-validation/examples/okf-v0.1/profiles/concept.yaml +14 -0
  188. package/fixtures/declarative-validation/examples/okf-v0.1/profiles/log.yaml +10 -0
  189. package/fixtures/declarative-validation/examples/okf-v0.1/profiles/non-root-index.yaml +9 -0
  190. package/fixtures/declarative-validation/examples/okf-v0.1/profiles/root-index.yaml +12 -0
  191. package/package.json +9 -3
  192. package/scripts/install-markdown-engine-cli.sh +113 -0
  193. package/skills/profile-backed-markdown/SKILL.md +54 -0
  194. package/skills/profile-backed-markdown/assets/profiles/operational-spec.yaml +98 -0
  195. package/skills/profile-backed-markdown/references/repair-brief.md +14 -0
  196. package/skills/profile-backed-markdown/scripts/validate-profile-backed-markdown.mjs +590 -0
@@ -1,10 +1,10 @@
1
1
  # Public API Contract
2
2
 
3
- Status: package 2.0.0, document contract 1.0.0
4
- Last updated: 2026-05-13
3
+ Status: package 3.0.0, document contract 1.0.0
4
+ Last updated: 2026-06-05
5
5
 
6
6
  This document defines the public `@jasonbelmonti/markdown-engine` package
7
- contract for the `2.0.0` package release. The serialized rich IR document
7
+ contract for the `3.0.0` package release. The serialized rich IR document
8
8
  contract remains `documentVersion: "1.0.0"`. The stable public surface is the
9
9
  package export from `@jasonbelmonti/markdown-engine`, not internal adapter
10
10
  modules or raw parser output. The 1.0 rich IR design is tracked in
@@ -22,6 +22,7 @@ The package root exports the API functions, helpers, and types from `src/api/**`
22
22
  - `validateAnnotations(document, annotations)`
23
23
  - `parseValidationProfile(input, options?)`
24
24
  - `validateWithProfile(document, profile, options?)`
25
+ - `validateDocumentSet(entries, options?)`
25
26
 
26
27
  The package root also exports the public result, document, diagnostic, config,
27
28
  and function types declared in `src/api/**`.
@@ -72,7 +73,7 @@ normalize(parsed: ParsedMarkdown, options?: NormalizeOptions): NormalizeResult
72
73
  ```
73
74
 
74
75
  `NormalizeOptions.documentVersion` selects the document contract version.
75
- Package 2.0 defaults omitted `documentVersion` to the rich IR
76
+ Package 3.0 keeps omitted `documentVersion` defaulting to the rich IR
76
77
  `"1.0.0"` contract. The retained `0.1.0`-compatible path is `"0.0.0"` and must
77
78
  be requested explicitly.
78
79
 
@@ -227,7 +228,9 @@ validateWithProfile(
227
228
 
228
229
  `parseValidationProfile` accepts YAML text or JSON-safe profile objects. The
229
230
  top-level profile keys are `syntaxVersion`, `documentVersion`, and `rules`.
230
- `syntaxVersion` must be `"markdown-engine.validation@v1"`.
231
+ `syntaxVersion` must be `"markdown-engine.validation@v1"` or
232
+ `"markdown-engine.validation@v2"`; v2 admission is limited to the existing flat
233
+ rule shape.
231
234
  `documentVersion` is optional; when provided it must be `"0.0.0"` or
232
235
  `"1.0.0"`. The parser preserves omission and does not inject a default into
233
236
  the parsed profile.
@@ -247,6 +250,64 @@ defaults, so an omitted `documentVersion` and an explicit matching
247
250
  `documentVersion` produce the same profile hash for the same document version
248
251
  and rules.
249
252
 
253
+ ## `validateDocumentSet`
254
+
255
+ Signature:
256
+
257
+ ```ts
258
+ validateDocumentSet(
259
+ entries: readonly ValidateDocumentSetEntry[],
260
+ options?: ValidateDocumentSetOptions,
261
+ ): ValidateDocumentSetResult
262
+ ```
263
+
264
+ `validateDocumentSet` is a pure aggregate API for caller-supplied Markdown
265
+ documents and caller-supplied validation profiles. Each entry contains:
266
+
267
+ - `path`: caller-owned document path or stable identifier
268
+ - `markdown`: Markdown text to parse and normalize
269
+ - `profile`: YAML profile text, JSON-safe profile data, or parsed
270
+ `ValidationProfile`
271
+ - `profilePath`: optional caller-owned profile path or stable identifier for
272
+ profile diagnostics
273
+
274
+ The function processes entries in the supplied order and returns `entries` in
275
+ that same order. It does not read directories, expand globs, watch files, write
276
+ persistent state, add CLI behavior, classify OKF paths, or choose profiles for
277
+ callers. Consumers own discovery, routing, and IO.
278
+
279
+ For OKF-style bundles, `validateDocumentSet` stays a generic aggregation API.
280
+ Callers must classify each path before calling the function and provide the
281
+ profile for that caller-classified role. A non-reserved concept document can use
282
+ a concept profile that requires `type` frontmatter, the bundle-root `index.md`
283
+ can use a root-index profile that accepts the `okf_version: "0.1"` exception, a
284
+ non-root `index.md` can use a no-frontmatter profile, and `log.md` can use a
285
+ log profile that checks date headings.
286
+
287
+ The API does not infer those roles from paths.
288
+
289
+ `ValidateDocumentSetOptions` forwards supported document normalization and
290
+ validation options:
291
+
292
+ - `documentVersion`
293
+ - `preserveSourceLocations`
294
+ - `includeEvidence`
295
+
296
+ Each `ValidateDocumentSetEntryResult` contains:
297
+
298
+ - `path` and optional `profilePath`
299
+ - `parseDiagnostics`
300
+ - `normalizationDiagnostics`
301
+ - `profileDiagnostics`
302
+ - `validationDiagnostics`
303
+ - aggregate entry `diagnostics`
304
+ - `validationResult` when profile parsing succeeds without error-severity
305
+ diagnostics
306
+
307
+ Profile-stage failures on one entry do not stop later entries from processing.
308
+ The aggregate `valid` field is `false` when any aggregate diagnostic has
309
+ severity `error`; otherwise it is `true`.
310
+
250
311
  ## `serialize`
251
312
 
252
313
  Signature:
@@ -258,6 +319,7 @@ serialize(
258
319
  | NormalizeResult
259
320
  | ValidationResult
260
321
  | DeclarativeValidationResult
322
+ | ValidateDocumentSetResult
261
323
  | EngineDocument
262
324
  | AnnotationValidationResult,
263
325
  options?: SerializeOptions,
@@ -309,7 +371,7 @@ code nodes with `kind: "fenced"`. Raw parser node objects are not public.
309
371
 
310
372
  ## 1.0 Contract
311
373
 
312
- The final 1.0 document contract is selected by default in package 2.0, remains
374
+ The final 1.0 document contract is selected by default in package 3.0, remains
313
375
  available explicitly as `documentVersion: "1.0.0"`, and is checked with
314
376
  `compatibilityMode: "default"`.
315
377
 
@@ -536,8 +598,8 @@ serialization behavior.
536
598
 
537
599
  ### Compatibility And Migration
538
600
 
539
- The current package version is `2.0.0`. The serialized document contract
540
- version remains `"1.0.0"`. Package 2.0 selects that rich IR contract by
601
+ The current package version is `3.0.0`. The serialized document contract
602
+ version remains `"1.0.0"`. Package 3.0 selects that rich IR contract by
541
603
  default for `normalize(parsed)`; callers may also request it explicitly with
542
604
  `normalize(..., { documentVersion: "1.0.0" })`. Serialization gates check it
543
605
  with `compatibilityMode: "default"`.
@@ -550,7 +612,7 @@ compatibility from the absence of rich IR fields.
550
612
  Migration from the `0.1.0` document shape, or from pre-2.0 API callers that
551
613
  depended on implicit legacy normalization, requires consumers to:
552
614
 
553
- - use package 2.0's default `normalize(parsed)` rich IR output or request
615
+ - use package 3.0's default `normalize(parsed)` rich IR output or request
554
616
  `documentVersion: "1.0.0"` during normalization;
555
617
  - read `target`, `sections`, `textSpans`, `tables`, `lists`, `links`,
556
618
  `linkReferences`, and `source` from the normalized document instead of
@@ -609,10 +671,10 @@ exit with code `2`. Validation success exits with code `0`; validation or
609
671
  normalization error diagnostics exit with code `1`. Validation JSON includes
610
672
  `profile`, `ruleResults`, `diagnostics`, and `evidence`.
611
673
 
612
- Semver classification: package 2.0 makes the rich IR contract the default API
613
- normalization output while retaining the document contract version
614
- `"1.0.0"`. This is breaking for API consumers that call `normalize(parsed)` and
615
- expect the legacy `0.0.0` document shape. Migration is to either consume the
674
+ Semver classification: package 3.0 keeps the rich IR contract as the default
675
+ API normalization output while retaining the document contract version
676
+ `"1.0.0"`. The 2.0 migration remains applicable for API consumers that call
677
+ `normalize(parsed)` and expect the legacy `0.0.0` document shape: consume the
616
678
  rich IR fields or pin `documentVersion: "0.0.0"` until the downstream consumer
617
679
  is ready. CLI consumers can still pin `--document-version 0.0.0` for explicit
618
680
  legacy output.
@@ -651,8 +713,10 @@ The `0.1.0` contract was review-gated by WP-2, MS-2, and MS-3 before first
651
713
  publication. From the published `0.1.0` baseline forward, changes to public API
652
714
  signatures, result fields, diagnostic schema, source-location semantics,
653
715
  validation config semantics, or serialized output shape require
654
- semantic-version classification. The planned 1.0 rich IR contract will update
655
- this API contract before 1.0 release approval.
716
+ semantic-version classification. The 1.0 rich IR document contract is now the
717
+ retained default document contract for package 3.0, and the explicit legacy
718
+ `0.0.0` path remains the compatibility boundary for consumers that still need
719
+ the first package-line output shape.
656
720
 
657
721
  The `@jasonbelmonti/markdown-engine` package boundary remains limited to
658
722
  parsing, normalization, deterministic validation, diagnostics, and