@primmel/primmel 1.3.2 → 1.4.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 (423) hide show
  1. package/dist/index.d.ts +40 -4
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +112 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/check-allowlist.d.ts +56 -0
  6. package/dist/src/check-allowlist.d.ts.map +1 -0
  7. package/dist/src/check-allowlist.js +307 -0
  8. package/dist/src/check-allowlist.js.map +1 -0
  9. package/dist/src/check-rules.d.ts +17 -0
  10. package/dist/src/check-rules.d.ts.map +1 -0
  11. package/dist/src/check-rules.js +351 -0
  12. package/dist/src/check-rules.js.map +1 -0
  13. package/dist/src/check.d.ts +115 -0
  14. package/dist/src/check.d.ts.map +1 -0
  15. package/dist/src/check.js +4164 -0
  16. package/dist/src/check.js.map +1 -0
  17. package/dist/src/export/rdf-competency-questions.d.ts +11 -0
  18. package/dist/src/export/rdf-competency-questions.d.ts.map +1 -0
  19. package/dist/src/export/rdf-competency-questions.js +99 -0
  20. package/dist/src/export/rdf-competency-questions.js.map +1 -0
  21. package/dist/src/export/rdf-shapes.d.ts +3 -0
  22. package/dist/src/export/rdf-shapes.d.ts.map +1 -0
  23. package/dist/src/export/rdf-shapes.js +225 -0
  24. package/dist/src/export/rdf-shapes.js.map +1 -0
  25. package/dist/src/export/rdf-vocabulary.d.ts +125 -0
  26. package/dist/src/export/rdf-vocabulary.d.ts.map +1 -0
  27. package/dist/src/export/rdf-vocabulary.js +230 -0
  28. package/dist/src/export/rdf-vocabulary.js.map +1 -0
  29. package/dist/src/export/rdf.d.ts +92 -0
  30. package/dist/src/export/rdf.d.ts.map +1 -0
  31. package/dist/src/export/rdf.js +707 -0
  32. package/dist/src/export/rdf.js.map +1 -0
  33. package/dist/src/export/reqif.d.ts +81 -0
  34. package/dist/src/export/reqif.d.ts.map +1 -0
  35. package/dist/src/export/reqif.js +703 -0
  36. package/dist/src/export/reqif.js.map +1 -0
  37. package/dist/src/instance-resolution.d.ts +68 -0
  38. package/dist/src/instance-resolution.d.ts.map +1 -0
  39. package/dist/src/instance-resolution.js +239 -0
  40. package/dist/src/instance-resolution.js.map +1 -0
  41. package/dist/src/mapping-coverage.d.ts +220 -0
  42. package/dist/src/mapping-coverage.d.ts.map +1 -0
  43. package/dist/src/mapping-coverage.js +528 -0
  44. package/dist/src/mapping-coverage.js.map +1 -0
  45. package/dist/src/model-diff.d.ts +198 -0
  46. package/dist/src/model-diff.d.ts.map +1 -0
  47. package/dist/src/model-diff.js +914 -0
  48. package/dist/src/model-diff.js.map +1 -0
  49. package/dist/src/operational-state.d.ts +112 -0
  50. package/dist/src/operational-state.d.ts.map +1 -0
  51. package/dist/src/operational-state.js +162 -0
  52. package/dist/src/operational-state.js.map +1 -0
  53. package/dist/src/package-diff.d.ts +36 -0
  54. package/dist/src/package-diff.d.ts.map +1 -0
  55. package/dist/src/package-diff.js +104 -0
  56. package/dist/src/package-diff.js.map +1 -0
  57. package/dist/src/ser-des/config/acceptance.d.ts +10 -0
  58. package/dist/src/ser-des/config/acceptance.d.ts.map +1 -0
  59. package/dist/src/ser-des/config/acceptance.js +163 -0
  60. package/dist/src/ser-des/config/acceptance.js.map +1 -0
  61. package/dist/src/ser-des/config/activityArchetype.d.ts +5 -0
  62. package/dist/src/ser-des/config/activityArchetype.d.ts.map +1 -0
  63. package/dist/src/ser-des/config/activityArchetype.js +78 -0
  64. package/dist/src/ser-des/config/activityArchetype.js.map +1 -0
  65. package/dist/src/ser-des/config/artifact.d.ts +16 -0
  66. package/dist/src/ser-des/config/artifact.d.ts.map +1 -0
  67. package/dist/src/ser-des/config/artifact.js +392 -0
  68. package/dist/src/ser-des/config/artifact.js.map +1 -0
  69. package/dist/src/ser-des/config/calculation.d.ts.map +1 -1
  70. package/dist/src/ser-des/config/calculation.js +214 -12
  71. package/dist/src/ser-des/config/calculation.js.map +1 -1
  72. package/dist/src/ser-des/config/comment.d.ts +34 -0
  73. package/dist/src/ser-des/config/comment.d.ts.map +1 -0
  74. package/dist/src/ser-des/config/comment.js +121 -0
  75. package/dist/src/ser-des/config/comment.js.map +1 -0
  76. package/dist/src/ser-des/config/competenceKind.d.ts +8 -0
  77. package/dist/src/ser-des/config/competenceKind.d.ts.map +1 -0
  78. package/dist/src/ser-des/config/competenceKind.js +266 -0
  79. package/dist/src/ser-des/config/competenceKind.js.map +1 -0
  80. package/dist/src/ser-des/config/composition.d.ts +6 -0
  81. package/dist/src/ser-des/config/composition.d.ts.map +1 -0
  82. package/dist/src/ser-des/config/composition.js +165 -0
  83. package/dist/src/ser-des/config/composition.js.map +1 -0
  84. package/dist/src/ser-des/config/conformanceClass.d.ts +9 -0
  85. package/dist/src/ser-des/config/conformanceClass.d.ts.map +1 -0
  86. package/dist/src/ser-des/config/conformanceClass.js +128 -0
  87. package/dist/src/ser-des/config/conformanceClass.js.map +1 -0
  88. package/dist/src/ser-des/config/conformanceTest.d.ts +6 -0
  89. package/dist/src/ser-des/config/conformanceTest.d.ts.map +1 -0
  90. package/dist/src/ser-des/config/conformanceTest.js +929 -0
  91. package/dist/src/ser-des/config/conformanceTest.js.map +1 -0
  92. package/dist/src/ser-des/config/constraint.d.ts +5 -0
  93. package/dist/src/ser-des/config/constraint.d.ts.map +1 -0
  94. package/dist/src/ser-des/config/constraint.js +108 -0
  95. package/dist/src/ser-des/config/constraint.js.map +1 -0
  96. package/dist/src/ser-des/config/data.d.ts.map +1 -1
  97. package/dist/src/ser-des/config/data.js +105 -12
  98. package/dist/src/ser-des/config/data.js.map +1 -1
  99. package/dist/src/ser-des/config/design.d.ts +9 -0
  100. package/dist/src/ser-des/config/design.d.ts.map +1 -0
  101. package/dist/src/ser-des/config/design.js +847 -0
  102. package/dist/src/ser-des/config/design.js.map +1 -0
  103. package/dist/src/ser-des/config/discrepancyRecord.d.ts +5 -0
  104. package/dist/src/ser-des/config/discrepancyRecord.d.ts.map +1 -0
  105. package/dist/src/ser-des/config/discrepancyRecord.js +109 -0
  106. package/dist/src/ser-des/config/discrepancyRecord.js.map +1 -0
  107. package/dist/src/ser-des/config/dual.d.ts +9 -0
  108. package/dist/src/ser-des/config/dual.d.ts.map +1 -0
  109. package/dist/src/ser-des/config/dual.js +84 -0
  110. package/dist/src/ser-des/config/dual.js.map +1 -0
  111. package/dist/src/ser-des/config/field-parser.d.ts +92 -7
  112. package/dist/src/ser-des/config/field-parser.d.ts.map +1 -1
  113. package/dist/src/ser-des/config/field-parser.js +832 -29
  114. package/dist/src/ser-des/config/field-parser.js.map +1 -1
  115. package/dist/src/ser-des/config/form.d.ts.map +1 -1
  116. package/dist/src/ser-des/config/form.js +355 -134
  117. package/dist/src/ser-des/config/form.js.map +1 -1
  118. package/dist/src/ser-des/config/formulasUsed.d.ts +9 -0
  119. package/dist/src/ser-des/config/formulasUsed.d.ts.map +1 -0
  120. package/dist/src/ser-des/config/formulasUsed.js +126 -0
  121. package/dist/src/ser-des/config/formulasUsed.js.map +1 -0
  122. package/dist/src/ser-des/config/index.d.ts.map +1 -1
  123. package/dist/src/ser-des/config/index.js +180 -1
  124. package/dist/src/ser-des/config/index.js.map +1 -1
  125. package/dist/src/ser-des/config/instance.d.ts +22 -0
  126. package/dist/src/ser-des/config/instance.d.ts.map +1 -0
  127. package/dist/src/ser-des/config/instance.js +266 -0
  128. package/dist/src/ser-des/config/instance.js.map +1 -0
  129. package/dist/src/ser-des/config/invariant.d.ts +9 -0
  130. package/dist/src/ser-des/config/invariant.d.ts.map +1 -0
  131. package/dist/src/ser-des/config/invariant.js +143 -0
  132. package/dist/src/ser-des/config/invariant.js.map +1 -0
  133. package/dist/src/ser-des/config/mapProfile.d.ts.map +1 -1
  134. package/dist/src/ser-des/config/mapProfile.js +199 -14
  135. package/dist/src/ser-des/config/mapProfile.js.map +1 -1
  136. package/dist/src/ser-des/config/metadata.js +6 -6
  137. package/dist/src/ser-des/config/metadata.js.map +1 -1
  138. package/dist/src/ser-des/config/monitor.d.ts +9 -0
  139. package/dist/src/ser-des/config/monitor.d.ts.map +1 -0
  140. package/dist/src/ser-des/config/monitor.js +322 -0
  141. package/dist/src/ser-des/config/monitor.js.map +1 -0
  142. package/dist/src/ser-des/config/note.d.ts.map +1 -1
  143. package/dist/src/ser-des/config/note.js +16 -1
  144. package/dist/src/ser-des/config/note.js.map +1 -1
  145. package/dist/src/ser-des/config/packageManifest.d.ts +5 -0
  146. package/dist/src/ser-des/config/packageManifest.d.ts.map +1 -0
  147. package/dist/src/ser-des/config/packageManifest.js +349 -0
  148. package/dist/src/ser-des/config/packageManifest.js.map +1 -0
  149. package/dist/src/ser-des/config/passport.d.ts +9 -0
  150. package/dist/src/ser-des/config/passport.d.ts.map +1 -0
  151. package/dist/src/ser-des/config/passport.js +191 -0
  152. package/dist/src/ser-des/config/passport.js.map +1 -0
  153. package/dist/src/ser-des/config/process.d.ts +5 -3
  154. package/dist/src/ser-des/config/process.d.ts.map +1 -1
  155. package/dist/src/ser-des/config/process.js +915 -8
  156. package/dist/src/ser-des/config/process.js.map +1 -1
  157. package/dist/src/ser-des/config/quantity.d.ts +21 -0
  158. package/dist/src/ser-des/config/quantity.d.ts.map +1 -0
  159. package/dist/src/ser-des/config/quantity.js +114 -0
  160. package/dist/src/ser-des/config/quantity.js.map +1 -0
  161. package/dist/src/ser-des/config/quantityRegister.d.ts +9 -0
  162. package/dist/src/ser-des/config/quantityRegister.d.ts.map +1 -0
  163. package/dist/src/ser-des/config/quantityRegister.js +202 -0
  164. package/dist/src/ser-des/config/quantityRegister.js.map +1 -0
  165. package/dist/src/ser-des/config/reference.d.ts.map +1 -1
  166. package/dist/src/ser-des/config/reference.js +6 -0
  167. package/dist/src/ser-des/config/reference.js.map +1 -1
  168. package/dist/src/ser-des/config/referenceMaterial.d.ts +5 -0
  169. package/dist/src/ser-des/config/referenceMaterial.d.ts.map +1 -0
  170. package/dist/src/ser-des/config/referenceMaterial.js +296 -0
  171. package/dist/src/ser-des/config/referenceMaterial.js.map +1 -0
  172. package/dist/src/ser-des/config/requirement.d.ts +16 -0
  173. package/dist/src/ser-des/config/requirement.d.ts.map +1 -0
  174. package/dist/src/ser-des/config/requirement.js +579 -0
  175. package/dist/src/ser-des/config/requirement.js.map +1 -0
  176. package/dist/src/ser-des/config/role.d.ts.map +1 -1
  177. package/dist/src/ser-des/config/role.js +12 -0
  178. package/dist/src/ser-des/config/role.js.map +1 -1
  179. package/dist/src/ser-des/config/series.d.ts +9 -0
  180. package/dist/src/ser-des/config/series.d.ts.map +1 -0
  181. package/dist/src/ser-des/config/series.js +121 -0
  182. package/dist/src/ser-des/config/series.js.map +1 -0
  183. package/dist/src/ser-des/config/sourceDiscrepancy.d.ts +11 -0
  184. package/dist/src/ser-des/config/sourceDiscrepancy.d.ts.map +1 -0
  185. package/dist/src/ser-des/config/sourceDiscrepancy.js +83 -0
  186. package/dist/src/ser-des/config/sourceDiscrepancy.js.map +1 -0
  187. package/dist/src/ser-des/config/stateMachine.d.ts.map +1 -1
  188. package/dist/src/ser-des/config/stateMachine.js +189 -38
  189. package/dist/src/ser-des/config/stateMachine.js.map +1 -1
  190. package/dist/src/ser-des/config/subform.d.ts.map +1 -1
  191. package/dist/src/ser-des/config/subform.js +25 -33
  192. package/dist/src/ser-des/config/subform.js.map +1 -1
  193. package/dist/src/ser-des/config/subject.d.ts +58 -0
  194. package/dist/src/ser-des/config/subject.d.ts.map +1 -0
  195. package/dist/src/ser-des/config/subject.js +2093 -0
  196. package/dist/src/ser-des/config/subject.js.map +1 -0
  197. package/dist/src/ser-des/config/symbol.d.ts.map +1 -1
  198. package/dist/src/ser-des/config/symbol.js +130 -6
  199. package/dist/src/ser-des/config/symbol.js.map +1 -1
  200. package/dist/src/ser-des/config/table.d.ts.map +1 -1
  201. package/dist/src/ser-des/config/table.js +373 -7
  202. package/dist/src/ser-des/config/table.js.map +1 -1
  203. package/dist/src/ser-des/config/term.d.ts.map +1 -1
  204. package/dist/src/ser-des/config/term.js +107 -0
  205. package/dist/src/ser-des/config/term.js.map +1 -1
  206. package/dist/src/ser-des/config/testPointSet.d.ts +5 -0
  207. package/dist/src/ser-des/config/testPointSet.d.ts.map +1 -0
  208. package/dist/src/ser-des/config/testPointSet.js +199 -0
  209. package/dist/src/ser-des/config/testPointSet.js.map +1 -0
  210. package/dist/src/ser-des/config/testSequence.d.ts +9 -0
  211. package/dist/src/ser-des/config/testSequence.d.ts.map +1 -0
  212. package/dist/src/ser-des/config/testSequence.js +206 -0
  213. package/dist/src/ser-des/config/testSequence.js.map +1 -0
  214. package/dist/src/ser-des/config/text.d.ts +5 -0
  215. package/dist/src/ser-des/config/text.d.ts.map +1 -0
  216. package/dist/src/ser-des/config/text.js +106 -0
  217. package/dist/src/ser-des/config/text.js.map +1 -0
  218. package/dist/src/ser-des/config/twin.d.ts +31 -0
  219. package/dist/src/ser-des/config/twin.d.ts.map +1 -0
  220. package/dist/src/ser-des/config/twin.js +362 -0
  221. package/dist/src/ser-des/config/twin.js.map +1 -0
  222. package/dist/src/ser-des/config/verdict.d.ts +5 -0
  223. package/dist/src/ser-des/config/verdict.d.ts.map +1 -0
  224. package/dist/src/ser-des/config/verdict.js +159 -0
  225. package/dist/src/ser-des/config/verdict.js.map +1 -0
  226. package/dist/src/ser-des/config/viewProfile.d.ts.map +1 -1
  227. package/dist/src/ser-des/config/viewProfile.js +7 -0
  228. package/dist/src/ser-des/config/viewProfile.js.map +1 -1
  229. package/dist/src/ser-des/includes.d.ts.map +1 -1
  230. package/dist/src/ser-des/includes.js +5 -2
  231. package/dist/src/ser-des/includes.js.map +1 -1
  232. package/dist/src/ser-des/index.d.ts +12 -0
  233. package/dist/src/ser-des/index.d.ts.map +1 -1
  234. package/dist/src/ser-des/index.js +42 -0
  235. package/dist/src/ser-des/index.js.map +1 -1
  236. package/dist/src/ser-des/package.d.ts +53 -0
  237. package/dist/src/ser-des/package.d.ts.map +1 -0
  238. package/dist/src/ser-des/package.js +404 -0
  239. package/dist/src/ser-des/package.js.map +1 -0
  240. package/dist/src/ser-des/parse-block.d.ts.map +1 -1
  241. package/dist/src/ser-des/parse-block.js +7 -1
  242. package/dist/src/ser-des/parse-block.js.map +1 -1
  243. package/dist/src/ser-des/parse.d.ts.map +1 -1
  244. package/dist/src/ser-des/parse.js +45 -0
  245. package/dist/src/ser-des/parse.js.map +1 -1
  246. package/dist/src/ser-des/prm.d.ts +53 -0
  247. package/dist/src/ser-des/prm.d.ts.map +1 -0
  248. package/dist/src/ser-des/prm.js +257 -0
  249. package/dist/src/ser-des/prm.js.map +1 -0
  250. package/dist/src/ser-des/resolve.d.ts.map +1 -1
  251. package/dist/src/ser-des/resolve.js +1 -0
  252. package/dist/src/ser-des/resolve.js.map +1 -1
  253. package/dist/src/ser-des/tokenize.d.ts +11 -0
  254. package/dist/src/ser-des/tokenize.d.ts.map +1 -1
  255. package/dist/src/ser-des/tokenize.js +28 -1
  256. package/dist/src/ser-des/tokenize.js.map +1 -1
  257. package/dist/src/ser-des/types.d.ts +56 -1
  258. package/dist/src/ser-des/types.d.ts.map +1 -1
  259. package/dist/src/spelling.d.ts +35 -0
  260. package/dist/src/spelling.d.ts.map +1 -0
  261. package/dist/src/spelling.js +140 -0
  262. package/dist/src/spelling.js.map +1 -0
  263. package/dist/src/text-coverage.d.ts +164 -0
  264. package/dist/src/text-coverage.d.ts.map +1 -0
  265. package/dist/src/text-coverage.js +679 -0
  266. package/dist/src/text-coverage.js.map +1 -0
  267. package/dist/src/time.d.ts +55 -0
  268. package/dist/src/time.d.ts.map +1 -0
  269. package/dist/src/time.js +223 -0
  270. package/dist/src/time.js.map +1 -0
  271. package/dist/src/type-expr.d.ts +31 -0
  272. package/dist/src/type-expr.d.ts.map +1 -0
  273. package/dist/src/type-expr.js +110 -0
  274. package/dist/src/type-expr.js.map +1 -0
  275. package/dist/src/types/Acceptance.d.ts +31 -0
  276. package/dist/src/types/Acceptance.d.ts.map +1 -0
  277. package/dist/src/types/Acceptance.js +12 -0
  278. package/dist/src/types/Acceptance.js.map +1 -0
  279. package/dist/src/types/ActivityArchetype.d.ts +14 -0
  280. package/dist/src/types/ActivityArchetype.d.ts.map +1 -0
  281. package/dist/src/types/ActivityArchetype.js +17 -0
  282. package/dist/src/types/ActivityArchetype.js.map +1 -0
  283. package/dist/src/types/Artifact.d.ts +117 -0
  284. package/dist/src/types/Artifact.d.ts.map +1 -0
  285. package/dist/src/types/Artifact.js +35 -0
  286. package/dist/src/types/Artifact.js.map +1 -0
  287. package/dist/src/types/Calculation.d.ts +49 -0
  288. package/dist/src/types/Calculation.d.ts.map +1 -1
  289. package/dist/src/types/Comment.d.ts +23 -0
  290. package/dist/src/types/Comment.d.ts.map +1 -0
  291. package/dist/src/types/Comment.js +3 -0
  292. package/dist/src/types/Comment.js.map +1 -0
  293. package/dist/src/types/CompetenceKind.d.ts +70 -0
  294. package/dist/src/types/CompetenceKind.d.ts.map +1 -0
  295. package/dist/src/types/CompetenceKind.js +3 -0
  296. package/dist/src/types/CompetenceKind.js.map +1 -0
  297. package/dist/src/types/Composition.d.ts +80 -0
  298. package/dist/src/types/Composition.d.ts.map +1 -0
  299. package/dist/src/types/Composition.js +44 -0
  300. package/dist/src/types/Composition.js.map +1 -0
  301. package/dist/src/types/ConformanceClass.d.ts +22 -0
  302. package/dist/src/types/ConformanceClass.d.ts.map +1 -0
  303. package/dist/src/types/ConformanceClass.js +7 -0
  304. package/dist/src/types/ConformanceClass.js.map +1 -0
  305. package/dist/src/types/ConformanceTest.d.ts +206 -0
  306. package/dist/src/types/ConformanceTest.d.ts.map +1 -0
  307. package/dist/src/types/ConformanceTest.js +3 -0
  308. package/dist/src/types/ConformanceTest.js.map +1 -0
  309. package/dist/src/types/Constraint.d.ts +34 -0
  310. package/dist/src/types/Constraint.d.ts.map +1 -0
  311. package/dist/src/types/Constraint.js +3 -0
  312. package/dist/src/types/Constraint.js.map +1 -0
  313. package/dist/src/types/Design.d.ts +147 -0
  314. package/dist/src/types/Design.d.ts.map +1 -0
  315. package/dist/src/types/Design.js +10 -0
  316. package/dist/src/types/Design.js.map +1 -0
  317. package/dist/src/types/DiscrepancyRecord.d.ts +42 -0
  318. package/dist/src/types/DiscrepancyRecord.d.ts.map +1 -0
  319. package/dist/src/types/DiscrepancyRecord.js +3 -0
  320. package/dist/src/types/DiscrepancyRecord.js.map +1 -0
  321. package/dist/src/types/Form.d.ts +127 -1
  322. package/dist/src/types/Form.d.ts.map +1 -1
  323. package/dist/src/types/FormulasUsed.d.ts +95 -0
  324. package/dist/src/types/FormulasUsed.d.ts.map +1 -0
  325. package/dist/src/types/FormulasUsed.js +64 -0
  326. package/dist/src/types/FormulasUsed.js.map +1 -0
  327. package/dist/src/types/Instance.d.ts +105 -0
  328. package/dist/src/types/Instance.d.ts.map +1 -0
  329. package/dist/src/types/Instance.js +40 -0
  330. package/dist/src/types/Instance.js.map +1 -0
  331. package/dist/src/types/Invariant.d.ts +82 -0
  332. package/dist/src/types/Invariant.d.ts.map +1 -0
  333. package/dist/src/types/Invariant.js +50 -0
  334. package/dist/src/types/Invariant.js.map +1 -0
  335. package/dist/src/types/MapProfile.d.ts +36 -1
  336. package/dist/src/types/MapProfile.d.ts.map +1 -1
  337. package/dist/src/types/Monitor.d.ts +144 -0
  338. package/dist/src/types/Monitor.d.ts.map +1 -0
  339. package/dist/src/types/Monitor.js +74 -0
  340. package/dist/src/types/Monitor.js.map +1 -0
  341. package/dist/src/types/Note.d.ts +4 -1
  342. package/dist/src/types/Note.d.ts.map +1 -1
  343. package/dist/src/types/Package.d.ts +161 -0
  344. package/dist/src/types/Package.d.ts.map +1 -0
  345. package/dist/src/types/Package.js +3 -0
  346. package/dist/src/types/Package.js.map +1 -0
  347. package/dist/src/types/Passport.d.ts +125 -0
  348. package/dist/src/types/Passport.d.ts.map +1 -0
  349. package/dist/src/types/Passport.js +84 -0
  350. package/dist/src/types/Passport.js.map +1 -0
  351. package/dist/src/types/Quantity.d.ts +99 -0
  352. package/dist/src/types/Quantity.d.ts.map +1 -0
  353. package/dist/src/types/Quantity.js +24 -0
  354. package/dist/src/types/Quantity.js.map +1 -0
  355. package/dist/src/types/Reference.d.ts +2 -0
  356. package/dist/src/types/Reference.d.ts.map +1 -1
  357. package/dist/src/types/ReferenceMaterial.d.ts +53 -0
  358. package/dist/src/types/ReferenceMaterial.d.ts.map +1 -0
  359. package/dist/src/types/ReferenceMaterial.js +14 -0
  360. package/dist/src/types/ReferenceMaterial.js.map +1 -0
  361. package/dist/src/types/Requirement.d.ts +111 -0
  362. package/dist/src/types/Requirement.d.ts.map +1 -0
  363. package/dist/src/types/Requirement.js +10 -0
  364. package/dist/src/types/Requirement.js.map +1 -0
  365. package/dist/src/types/Role.d.ts +4 -0
  366. package/dist/src/types/Role.d.ts.map +1 -1
  367. package/dist/src/types/Series.d.ts +31 -0
  368. package/dist/src/types/Series.d.ts.map +1 -0
  369. package/dist/src/types/Series.js +14 -0
  370. package/dist/src/types/Series.js.map +1 -0
  371. package/dist/src/types/SourceDiscrepancy.d.ts +21 -0
  372. package/dist/src/types/SourceDiscrepancy.d.ts.map +1 -0
  373. package/dist/src/types/SourceDiscrepancy.js +13 -0
  374. package/dist/src/types/SourceDiscrepancy.js.map +1 -0
  375. package/dist/src/types/Standard.d.ts +68 -0
  376. package/dist/src/types/Standard.d.ts.map +1 -1
  377. package/dist/src/types/StateMachine.d.ts +43 -0
  378. package/dist/src/types/StateMachine.d.ts.map +1 -1
  379. package/dist/src/types/StateMachine.js +7 -0
  380. package/dist/src/types/StateMachine.js.map +1 -1
  381. package/dist/src/types/Subject.d.ts +432 -0
  382. package/dist/src/types/Subject.d.ts.map +1 -0
  383. package/dist/src/types/Subject.js +13 -0
  384. package/dist/src/types/Subject.js.map +1 -0
  385. package/dist/src/types/Symbol.d.ts +31 -1
  386. package/dist/src/types/Symbol.d.ts.map +1 -1
  387. package/dist/src/types/Table.d.ts +43 -0
  388. package/dist/src/types/Table.d.ts.map +1 -1
  389. package/dist/src/types/Term.d.ts +29 -0
  390. package/dist/src/types/Term.d.ts.map +1 -1
  391. package/dist/src/types/TestPointSet.d.ts +33 -0
  392. package/dist/src/types/TestPointSet.d.ts.map +1 -0
  393. package/dist/src/types/TestPointSet.js +11 -0
  394. package/dist/src/types/TestPointSet.js.map +1 -0
  395. package/dist/src/types/TestSequence.d.ts +105 -0
  396. package/dist/src/types/TestSequence.d.ts.map +1 -0
  397. package/dist/src/types/TestSequence.js +65 -0
  398. package/dist/src/types/TestSequence.js.map +1 -0
  399. package/dist/src/types/Text.d.ts +21 -0
  400. package/dist/src/types/Text.d.ts.map +1 -0
  401. package/dist/src/types/Text.js +38 -0
  402. package/dist/src/types/Text.js.map +1 -0
  403. package/dist/src/types/Time.d.ts +43 -0
  404. package/dist/src/types/Time.d.ts.map +1 -0
  405. package/dist/src/types/Time.js +14 -0
  406. package/dist/src/types/Time.js.map +1 -0
  407. package/dist/src/types/Twin.d.ts +155 -0
  408. package/dist/src/types/Twin.d.ts.map +1 -0
  409. package/dist/src/types/Twin.js +102 -0
  410. package/dist/src/types/Twin.js.map +1 -0
  411. package/dist/src/types/Verdict.d.ts +40 -0
  412. package/dist/src/types/Verdict.d.ts.map +1 -0
  413. package/dist/src/types/Verdict.js +14 -0
  414. package/dist/src/types/Verdict.js.map +1 -0
  415. package/dist/src/types/ViewProfile.d.ts +6 -0
  416. package/dist/src/types/ViewProfile.d.ts.map +1 -1
  417. package/dist/src/types/data.d.ts +27 -0
  418. package/dist/src/types/data.d.ts.map +1 -1
  419. package/dist/src/types/process.d.ts +231 -0
  420. package/dist/src/types/process.d.ts.map +1 -1
  421. package/dist-browser/index.mjs +6695 -662
  422. package/dist-cli/primmel.mjs +21453 -0
  423. package/package.json +61 -5
@@ -0,0 +1,679 @@
1
+ "use strict";
2
+ // ─────────────────────────────────────────────────────────────────────
3
+ // TODO.roadmap/26 — the normative-text coverage metric (concept doc
4
+ // §11.6, layer 5 of the validation stack):
5
+ //
6
+ // every normative sentence of the source maps to at least one model
7
+ // element (target 100 %), and no two elements are semantic duplicates
8
+ // (target 0).
9
+ //
10
+ // The inputs ship INSIDE the package (JSON — primmel-ts stays YAML-free),
11
+ // generated from the YAML single source of truth by the OIML SMART build
12
+ // (browser/scripts/build-prl-package.ts):
13
+ //
14
+ // sources-prd/<part>.sentences.json — the sentence decomposition of one
15
+ // source document: every prose sentence with its address
16
+ // (<fragment-path>/s<N>), fragment, kind, fragment-level normativity,
17
+ // the modality classifier's verdict (only NORMATIVE sentences gate —
18
+ // shall/should/may/must + negatives, context rules first), and text.
19
+ // Table/figure fragments carry no sentences (tables are data, never
20
+ // text — their coverage is the clause-level congruence gate's).
21
+ // sources-prd/coverage.json — the per-package declarations:
22
+ // allowances (deliberate exclusions, sentence-PINNED so a new
23
+ // normative sentence in an allowed fragment is still a finding — the
24
+ // pair-pinned discipline of the congruence gate's order exceptions)
25
+ // and duplicate_adjudications (the human verdicts on flagged
26
+ // near-duplicate pairs; the metric REPORTS pairs, never auto-fails —
27
+ // acceptance is 0 UNRESOLVED pairs).
28
+ //
29
+ // The rules (check-rules.ts):
30
+ // C71 text-coverage-sentence-uncovered (AUDIT, warning) — a normative
31
+ // sentence bound by no model element and excluded by no allowance;
32
+ // budgeted by the package's text_coverage_budget (the C51/C52
33
+ // pattern — regressions fail the gate);
34
+ // C72 text-coverage-budget (AUDIT) — the budget caps C71 warnings
35
+ // (exceeded: error; slack: warning — the allowance only shrinks);
36
+ // C73 text-coverage-config — malformed/stale declarations: an
37
+ // allowance matching no normative sentence (drifted address, a pin
38
+ // on a sentence that stopped existing or being normative), a
39
+ // mis-sorted or silent adjudication, a STALE adjudication whose
40
+ // pair is no longer flagged. Runs whenever a manifest ships.
41
+ //
42
+ // Duplicate detection (the methodology's "0 semantic-equivalent elements"
43
+ // rule, machine-assisted): over the elements carrying bound text
44
+ // (requirement statements, term definitions) that bind ≥1 fragment of a
45
+ // manifest document, flag pairs whose normalized token-multiset
46
+ // containment similarity reaches DUPLICATE_SIMILARITY_THRESHOLD — two
47
+ // requirements interpreting the same sentence differently is worse than
48
+ // a gap, because both will compute verdicts (§11.6).
49
+ // ─────────────────────────────────────────────────────────────────────
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.DUPLICATE_TEXT_KINDS = exports.DUPLICATE_MIN_TOKENS = exports.DUPLICATE_SIMILARITY_THRESHOLD = void 0;
52
+ exports.loadTextCoverageData = loadTextCoverageData;
53
+ exports.normalizeBinding = normalizeBinding;
54
+ exports.collectProvenanceBindings = collectProvenanceBindings;
55
+ exports.allowanceAddressMatches = allowanceAddressMatches;
56
+ exports.allowanceMatches = allowanceMatches;
57
+ exports.normalizeForSimilarity = normalizeForSimilarity;
58
+ exports.containmentSimilarity = containmentSimilarity;
59
+ exports.flagDuplicatePairs = flagDuplicatePairs;
60
+ exports.computeTextCoverage = computeTextCoverage;
61
+ exports.uncoveredSentenceMessage = uncoveredSentenceMessage;
62
+ exports.packageTextCoverageReport = packageTextCoverageReport;
63
+ exports.formatTextCoverageReport = formatTextCoverageReport;
64
+ const fs_1 = require("fs");
65
+ const path_1 = require("path");
66
+ const SENTENCES_FORMAT = '0.1.0';
67
+ const COVERAGE_FORMAT = '0.1.0';
68
+ /** Load the text-coverage payloads of a package (<dir>/sources-prd/).
69
+ * Absent directory → empty (the metric is silent). Malformed payloads are
70
+ * C73 errors. */
71
+ function loadTextCoverageData(dir) {
72
+ const issues = [];
73
+ const manifests = [];
74
+ let config = null;
75
+ const prdDir = (0, path_1.join)(dir, 'sources-prd');
76
+ if (!(0, fs_1.existsSync)(prdDir)) {
77
+ return { manifests, config, issues };
78
+ }
79
+ for (const f of (0, fs_1.readdirSync)(prdDir).sort()) {
80
+ if (!f.endsWith('.sentences.json')) {
81
+ continue;
82
+ }
83
+ const rel = `sources-prd/${f}`;
84
+ let raw;
85
+ try {
86
+ raw = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(prdDir, f), 'utf8'));
87
+ }
88
+ catch (e) {
89
+ issues.push({
90
+ check: 'C73',
91
+ severity: 'error',
92
+ message: `${rel}: not parseable JSON — ${e.message} (text-coverage-config)`,
93
+ });
94
+ continue;
95
+ }
96
+ if (raw.prd_sentences !== SENTENCES_FORMAT ||
97
+ typeof raw.document?.urn !== 'string' ||
98
+ !Array.isArray(raw.sentences) ||
99
+ raw.sentences.some(s => typeof s?.address !== 'string' ||
100
+ typeof s?.fragment !== 'string' ||
101
+ (s?.modality !== 'normative' && s?.modality !== 'informative') ||
102
+ typeof s?.text !== 'string')) {
103
+ issues.push({
104
+ check: 'C73',
105
+ severity: 'error',
106
+ message: `${rel}: not a prd_sentences ${SENTENCES_FORMAT} manifest (document.urn + sentences[{address, fragment, modality, text}]) — regenerate the package (text-coverage-config)`,
107
+ });
108
+ continue;
109
+ }
110
+ manifests.push(raw);
111
+ }
112
+ const configPath = (0, path_1.join)(prdDir, 'coverage.json');
113
+ if ((0, fs_1.existsSync)(configPath)) {
114
+ try {
115
+ const raw = JSON.parse((0, fs_1.readFileSync)(configPath, 'utf8'));
116
+ if (raw.prd_coverage !== COVERAGE_FORMAT) {
117
+ throw new Error(`prd_coverage must be "${COVERAGE_FORMAT}"`);
118
+ }
119
+ config = raw;
120
+ }
121
+ catch (e) {
122
+ issues.push({
123
+ check: 'C73',
124
+ severity: 'error',
125
+ message: `sources-prd/coverage.json: ${e.message} — regenerate the package (text-coverage-config)`,
126
+ });
127
+ }
128
+ }
129
+ return { manifests, config, issues };
130
+ }
131
+ const URN_ADDRESS = /^(urn:oiml:pub:[a-z0-9:-]+)#([A-Za-z0-9./-]+)$/;
132
+ const FRAGMENT_WORD = /^(clause|table|figure|front)-/;
133
+ /** Normalize one binding to {doc, fragmentPath}: a doc may carry the
134
+ * glued `#fragment` form (doc "urn:…#table-4"), a bare clause number gets
135
+ * the clause- prefix, an existing address word passes through, and the
136
+ * optional sentence sub-address appends `/s<N>` (TODO.roadmap/26). */
137
+ function normalizeBinding(doc, clause, fragment) {
138
+ let d = doc.trim();
139
+ let path = '';
140
+ const hash = d.indexOf('#');
141
+ if (hash >= 0) {
142
+ path = d.slice(hash + 1);
143
+ d = d.slice(0, hash);
144
+ }
145
+ if (path === '') {
146
+ const c = clause.trim();
147
+ if (c === '') {
148
+ return null;
149
+ }
150
+ path = FRAGMENT_WORD.test(c) ? c : `clause-${c}`;
151
+ }
152
+ if (fragment && fragment.trim() !== '') {
153
+ path += `/${fragment.trim()}`;
154
+ }
155
+ return { doc: d, fragmentPath: path };
156
+ }
157
+ function* urnStringBindings(value) {
158
+ for (const token of value.trim().split(/\s+/)) {
159
+ const m = URN_ADDRESS.exec(token);
160
+ if (m) {
161
+ yield { doc: m[1], fragmentPath: m[2] };
162
+ }
163
+ }
164
+ }
165
+ function isSourceRefLike(v) {
166
+ return (typeof v === 'object' &&
167
+ v !== null &&
168
+ (typeof v.doc === 'string' ||
169
+ typeof v.clause === 'string'));
170
+ }
171
+ /** Harvest every provenance binding of the composed package: sourceRefs/
172
+ * sourceRef blocks, `source { doc clause fragment? }` blocks, term-style
173
+ * `source "urn …"` strings, `reference "urn#fragment"` strings and
174
+ * references[].urn lists — on ANY id-bearing element (the generic walk is
175
+ * construct-agnostic; non-URN strings never match the address grammar). */
176
+ function collectProvenanceBindings(standard) {
177
+ const out = [];
178
+ const seen = new Set();
179
+ const push = (element, kind, text, norm) => {
180
+ if (!norm || norm.fragmentPath === '') {
181
+ return;
182
+ }
183
+ const key = `${element}${norm.doc}#${norm.fragmentPath}`;
184
+ if (seen.has(key)) {
185
+ return;
186
+ }
187
+ seen.add(key);
188
+ out.push({
189
+ element,
190
+ kind,
191
+ doc: norm.doc,
192
+ fragmentPath: norm.fragmentPath,
193
+ ...(text !== undefined ? { text } : {}),
194
+ });
195
+ };
196
+ const harvestFields = (node, element, kind, text) => {
197
+ const fromRef = (s) => normalizeBinding(typeof s.doc === 'string' ? s.doc : '', typeof s.clause === 'string' ? s.clause : '', typeof s.fragment === 'string' ? s.fragment : undefined);
198
+ if (Array.isArray(node.sourceRefs)) {
199
+ for (const s of node.sourceRefs) {
200
+ if (isSourceRefLike(s)) {
201
+ push(element, kind, text, fromRef(s));
202
+ }
203
+ }
204
+ }
205
+ // condition sets collect repeated source blocks into `sources` (plural)
206
+ if (Array.isArray(node.sources)) {
207
+ for (const s of node.sources) {
208
+ if (isSourceRefLike(s)) {
209
+ push(element, kind, text, fromRef(s));
210
+ }
211
+ }
212
+ }
213
+ if (isSourceRefLike(node.sourceRef)) {
214
+ push(element, kind, text, fromRef(node.sourceRef));
215
+ }
216
+ if (isSourceRefLike(node.source)) {
217
+ push(element, kind, text, fromRef(node.source));
218
+ }
219
+ else if (typeof node.source === 'string') {
220
+ for (const u of urnStringBindings(node.source)) {
221
+ push(element, kind, text, u);
222
+ }
223
+ }
224
+ if (typeof node.reference === 'string') {
225
+ for (const u of urnStringBindings(node.reference)) {
226
+ push(element, kind, text, u);
227
+ }
228
+ }
229
+ if (Array.isArray(node.references)) {
230
+ for (const r of node.references) {
231
+ const urn = r?.urn;
232
+ if (typeof urn === 'string') {
233
+ for (const u of urnStringBindings(urn)) {
234
+ push(element, kind, text, u);
235
+ }
236
+ }
237
+ }
238
+ }
239
+ // Form reference blocks (RoleReference { urn, role } — form-level
240
+ // formReferences, field-level fieldReferences)
241
+ for (const key of ['formReferences', 'fieldReferences']) {
242
+ if (Array.isArray(node[key])) {
243
+ for (const r of node[key]) {
244
+ const urn = r?.urn;
245
+ if (typeof urn === 'string') {
246
+ for (const u of urnStringBindings(urn)) {
247
+ push(element, kind, text, u);
248
+ }
249
+ }
250
+ }
251
+ }
252
+ }
253
+ };
254
+ const walk = (node, kind, element, text, depth) => {
255
+ if (depth > 12 || typeof node !== 'object' || node === null) {
256
+ return;
257
+ }
258
+ if (Array.isArray(node)) {
259
+ for (const item of node) {
260
+ walk(item, kind, element, text, depth + 1);
261
+ }
262
+ return;
263
+ }
264
+ const rec = node;
265
+ let el = element;
266
+ let tx = text;
267
+ if (typeof rec.id === 'string' && rec.id !== '') {
268
+ el = rec.id;
269
+ tx =
270
+ typeof rec.statement === 'string'
271
+ ? rec.statement
272
+ : typeof rec.definition === 'string'
273
+ ? rec.definition
274
+ : undefined;
275
+ }
276
+ if (el !== null) {
277
+ harvestFields(rec, el, kind, tx);
278
+ }
279
+ for (const v of Object.values(rec)) {
280
+ if (typeof v === 'object' && v !== null) {
281
+ walk(v, kind, el, tx, depth + 1);
282
+ }
283
+ }
284
+ };
285
+ for (const [field, value] of Object.entries(standard)) {
286
+ if (Array.isArray(value)) {
287
+ walk(value, field, null, undefined, 0);
288
+ }
289
+ }
290
+ return out;
291
+ }
292
+ // ── allowance matching (lockstep with the smart repo's prd-coverage.ts) ──
293
+ /** True when sentence address A is covered by allowance address P: exact,
294
+ * or P a boundary prefix of A ('.' descends the clause tree, '/' a
295
+ * sub-address). */
296
+ function allowanceAddressMatches(allowance, sentence) {
297
+ if (sentence === allowance) {
298
+ return true;
299
+ }
300
+ if (!sentence.startsWith(allowance)) {
301
+ return false;
302
+ }
303
+ const next = sentence.charAt(allowance.length);
304
+ return next === '.' || next === '/';
305
+ }
306
+ /** The sentences of one document an allowance discharges (pins first —
307
+ * exactly the pinned sentences of the addressed fragment; otherwise every
308
+ * sentence the address boundary-matches). */
309
+ function allowanceMatches(allowance, sentences, urn) {
310
+ const hash = allowance.address.indexOf('#');
311
+ const fragment = allowance.address.slice(hash + 1);
312
+ if (allowance.sentences) {
313
+ const pins = new Set(allowance.sentences.map(p => `${urn}#${fragment}/${p}`));
314
+ return sentences.filter(s => pins.has(`${urn}#${s.address}`));
315
+ }
316
+ return sentences.filter(s => allowanceAddressMatches(allowance.address, `${urn}#${s.address}`));
317
+ }
318
+ // ── duplicate detection ──────────────────────────────────────────────
319
+ /** The pinned similarity threshold (token-multiset containment:
320
+ * Σ min(cA, cB) / min(|A|, |B|) over normalized tokens). 0.8 flags
321
+ * near-duplicates while per-class specializations differing only in
322
+ * their class values still surface for adjudication; pairs sharing
323
+ * fewer than DUPLICATE_MIN_TOKENS tokens on either side never flag
324
+ * (short texts produce noise, not signal). */
325
+ exports.DUPLICATE_SIMILARITY_THRESHOLD = 0.8;
326
+ exports.DUPLICATE_MIN_TOKENS = 6;
327
+ /** Normalize bound text for similarity: lowercase, punctuation folded to
328
+ * space, whitespace collapsed (the wording axis, not the symbols'). */
329
+ function normalizeForSimilarity(text) {
330
+ return text
331
+ .toLowerCase()
332
+ .replace(/[‘’‚]/g, "'")
333
+ .replace(/[“”„]/g, '"')
334
+ .replace(/[‐‑‒–—]/g, '-')
335
+ .replace(/[^a-z0-9]+/g, ' ')
336
+ .trim()
337
+ .split(' ')
338
+ .filter(t => t !== '');
339
+ }
340
+ /** Multiset containment similarity of two token lists (1 = one side's
341
+ * wording is fully contained in the other's). */
342
+ function containmentSimilarity(a, b) {
343
+ const count = (xs) => {
344
+ const m = new Map();
345
+ for (const x of xs) {
346
+ m.set(x, (m.get(x) ?? 0) + 1);
347
+ }
348
+ return m;
349
+ };
350
+ const ca = count(a);
351
+ const cb = count(b);
352
+ let inter = 0;
353
+ for (const [t, n] of ca) {
354
+ inter += Math.min(n, cb.get(t) ?? 0);
355
+ }
356
+ const denom = Math.min(a.length, b.length);
357
+ return denom === 0 ? 0 : inter / denom;
358
+ }
359
+ /** The element kinds whose text counts as BOUND text for duplicate
360
+ * detection (the methodology's "elements" are the model's provisions):
361
+ * requirement statements, term definitions, and instrument/variant
362
+ * definitions. Attribute/symbol/characteristic definitions are parameter
363
+ * semantics — formulaic by design ("maximum load that can be applied"),
364
+ * not source provisions; the congruence gate watches their provenance. */
365
+ exports.DUPLICATE_TEXT_KINDS = new Set([
366
+ 'requirements',
367
+ 'terms',
368
+ 'instruments',
369
+ ]);
370
+ /** Flag near-duplicate pairs over the bound-text elements (see the module
371
+ * header). Deterministic: pairs sorted by (a, b). */
372
+ function flagDuplicatePairs(bindings, manifestUrns, adjudications) {
373
+ const textByElement = new Map();
374
+ for (const b of bindings) {
375
+ if (b.text === undefined || !manifestUrns.has(b.doc)) {
376
+ continue;
377
+ }
378
+ if (!exports.DUPLICATE_TEXT_KINDS.has(b.kind)) {
379
+ continue;
380
+ }
381
+ if (!textByElement.has(b.element)) {
382
+ textByElement.set(b.element, b.text);
383
+ }
384
+ }
385
+ const elements = [...textByElement.keys()].sort();
386
+ const tokens = new Map(elements.map(e => [e, normalizeForSimilarity(textByElement.get(e))]));
387
+ const adjudicationByPair = new Map(adjudications.map(d => [[...d.elements].sort().join(''), d]));
388
+ const pairs = [];
389
+ for (let i = 0; i < elements.length; i++) {
390
+ for (let j = i + 1; j < elements.length; j++) {
391
+ const ta = tokens.get(elements[i]);
392
+ const tb = tokens.get(elements[j]);
393
+ if (Math.min(ta.length, tb.length) < exports.DUPLICATE_MIN_TOKENS) {
394
+ continue;
395
+ }
396
+ const sim = containmentSimilarity(ta, tb);
397
+ if (sim >= exports.DUPLICATE_SIMILARITY_THRESHOLD) {
398
+ const key = [elements[i], elements[j]].join('');
399
+ const adj = adjudicationByPair.get(key);
400
+ pairs.push({
401
+ a: elements[i],
402
+ b: elements[j],
403
+ similarity: Math.round(sim * 1000) / 1000,
404
+ ...(adj ? { adjudication: adj } : {}),
405
+ });
406
+ }
407
+ }
408
+ }
409
+ return pairs;
410
+ }
411
+ const SENTENCE_ADDRESS = /\/s[1-9][0-9]*$/;
412
+ /** Compute the text-coverage metric over the composed package. */
413
+ function computeTextCoverage(standard, manifests, config) {
414
+ const configIssues = [];
415
+ const bindings = collectProvenanceBindings(standard);
416
+ const manifestUrns = new Set(manifests.map(m => m.document.urn));
417
+ const allowances = config?.allowances ?? [];
418
+ const adjudications = config?.duplicate_adjudications ?? [];
419
+ const boundFragments = new Set();
420
+ const boundSentences = new Set();
421
+ for (const b of bindings) {
422
+ if (!manifestUrns.has(b.doc)) {
423
+ continue;
424
+ }
425
+ const key = `${b.doc}#${b.fragmentPath}`;
426
+ if (SENTENCE_ADDRESS.test(b.fragmentPath)) {
427
+ boundSentences.add(key);
428
+ }
429
+ else {
430
+ boundFragments.add(key);
431
+ }
432
+ }
433
+ const documents = [];
434
+ const matchedAllowanceSentences = new Map();
435
+ for (const manifest of manifests) {
436
+ const urn = manifest.document.urn;
437
+ const sentences = manifest.sentences;
438
+ const sentenceCovered = (s) => boundFragments.has(`${urn}#${s.fragment}`) ||
439
+ boundSentences.has(`${urn}#${s.address}`);
440
+ // First pass: allowance matches (per document).
441
+ const allowanceOf = new Map();
442
+ for (const a of allowances) {
443
+ const hash = a.address.indexOf('#');
444
+ if (a.address.slice(0, hash) !== urn) {
445
+ continue;
446
+ }
447
+ const matched = allowanceMatches(a, sentences, urn);
448
+ const arr = matchedAllowanceSentences.get(a) ?? [];
449
+ arr.push(...matched);
450
+ matchedAllowanceSentences.set(a, arr);
451
+ for (const s of matched) {
452
+ if (s.modality === 'normative' && !sentenceCovered(s)) {
453
+ allowanceOf.set(s.address, a);
454
+ }
455
+ }
456
+ }
457
+ const uncoveredCounted = [];
458
+ const uncoveredAllowed = [];
459
+ let normative = 0;
460
+ let covered = 0;
461
+ let informativeUncovered = 0;
462
+ for (const s of sentences) {
463
+ if (s.modality !== 'normative') {
464
+ if (!sentenceCovered(s)) {
465
+ informativeUncovered++;
466
+ }
467
+ continue;
468
+ }
469
+ normative++;
470
+ if (sentenceCovered(s)) {
471
+ covered++;
472
+ continue;
473
+ }
474
+ const allowance = allowanceOf.get(s.address);
475
+ if (allowance) {
476
+ uncoveredAllowed.push({ sentence: s, allowance });
477
+ }
478
+ else {
479
+ uncoveredCounted.push(s);
480
+ }
481
+ }
482
+ const allowed = uncoveredAllowed.length;
483
+ documents.push({
484
+ urn,
485
+ ...(manifest.document.short !== undefined
486
+ ? { short: manifest.document.short }
487
+ : {}),
488
+ ...(manifest.document.part !== undefined
489
+ ? { part: manifest.document.part }
490
+ : {}),
491
+ total: sentences.length,
492
+ normative,
493
+ covered,
494
+ allowed,
495
+ uncoveredCounted,
496
+ uncoveredAllowed,
497
+ informativeUncovered,
498
+ ratio: normative === 0 ? 1 : covered / normative,
499
+ ratioGated: normative - allowed === 0 ? 1 : covered / (normative - allowed),
500
+ });
501
+ }
502
+ // C73 — declaration hygiene (the KNOWN/STALE spirit): an allowance
503
+ // matching no sentence, or no NORMATIVE sentence, or pinning an
504
+ // informative-classified sentence is stale; silent declarations fail.
505
+ // So is a DEAD allowance — one whose matched normative sentences have
506
+ // all since been bound by model elements: it discharges nothing, so the
507
+ // declaration outlived the condition that justified it.
508
+ for (const a of allowances) {
509
+ const label = `coverage allowance '${a.address}'${a.sentences ? ` pins {${a.sentences.join(' ')}}` : ''}`;
510
+ const urn = a.address.slice(0, a.address.indexOf('#'));
511
+ if (!manifestUrns.has(urn)) {
512
+ configIssues.push({
513
+ check: 'C73',
514
+ severity: 'error',
515
+ message: `${label}: not a document of the shipped manifests (stale or mistyped address) (text-coverage-config)`,
516
+ });
517
+ continue;
518
+ }
519
+ const matched = matchedAllowanceSentences.get(a) ?? [];
520
+ const normative = matched.filter(s => s.modality === 'normative');
521
+ if (matched.length === 0) {
522
+ configIssues.push({
523
+ check: 'C73',
524
+ severity: 'error',
525
+ message: `${label}: matches no sentence of the decomposition (stale — remove the entry or fix the address/pins) (text-coverage-config)`,
526
+ });
527
+ }
528
+ else if (normative.length === 0) {
529
+ configIssues.push({
530
+ check: 'C73',
531
+ severity: 'error',
532
+ message: `${label}: every matched sentence is informative — informative sentences need no allowance (stale — remove the entry) (text-coverage-config)`,
533
+ });
534
+ }
535
+ else if (a.sentences) {
536
+ const informativePins = matched
537
+ .filter(s => s.modality !== 'normative')
538
+ .map(s => s.address);
539
+ if (informativePins.length > 0) {
540
+ configIssues.push({
541
+ check: 'C73',
542
+ severity: 'error',
543
+ message: `${label}: pinned sentence(s) ${informativePins.join(', ')} are informative-classified — the pin is stale (text-coverage-config)`,
544
+ });
545
+ }
546
+ }
547
+ if (normative.length > 0) {
548
+ const bound = (s) => boundFragments.has(`${urn}#${s.fragment}`) ||
549
+ boundSentences.has(`${urn}#${s.address}`);
550
+ if (normative.every(bound)) {
551
+ configIssues.push({
552
+ check: 'C73',
553
+ severity: 'error',
554
+ message: `${label}: every matched normative sentence is now bound by a model element — the allowance discharges nothing (stale — remove the entry; the bindings carry the coverage) (text-coverage-config)`,
555
+ });
556
+ }
557
+ }
558
+ if (!a.reason) {
559
+ configIssues.push({
560
+ check: 'C73',
561
+ severity: 'error',
562
+ message: `${label}: missing reason (allowances are deliberate, never silent) (text-coverage-config)`,
563
+ });
564
+ }
565
+ }
566
+ const flaggedPairs = flagDuplicatePairs(bindings, manifestUrns, adjudications);
567
+ const unresolvedPairs = flaggedPairs.filter(p => !p.adjudication);
568
+ // C73 — adjudication hygiene: sorted distinct ids, a reason, and the
569
+ // pair still flagged (a pair that dropped below the threshold makes
570
+ // its adjudication STALE — the declaration must die with the condition
571
+ // that justified it).
572
+ const flaggedKeys = new Set(flaggedPairs.map(p => [p.a, p.b].sort().join('')));
573
+ for (const d of adjudications) {
574
+ const label = `duplicate adjudication {${(d.elements ?? []).join(', ')}}`;
575
+ if (!Array.isArray(d.elements) || d.elements.length !== 2) {
576
+ configIssues.push({
577
+ check: 'C73',
578
+ severity: 'error',
579
+ message: `${label}: exactly two element ids make a pair (text-coverage-config)`,
580
+ });
581
+ continue;
582
+ }
583
+ if (d.elements[0] === d.elements[1]) {
584
+ configIssues.push({
585
+ check: 'C73',
586
+ severity: 'error',
587
+ message: `${label}: the pair names the same element twice (text-coverage-config)`,
588
+ });
589
+ }
590
+ if (d.elements[0] > d.elements[1]) {
591
+ configIssues.push({
592
+ check: 'C73',
593
+ severity: 'error',
594
+ message: `${label}: element ids must be sorted (the pair key is order-free) (text-coverage-config)`,
595
+ });
596
+ }
597
+ if (!d.reason) {
598
+ configIssues.push({
599
+ check: 'C73',
600
+ severity: 'error',
601
+ message: `${label}: missing reason (adjudications are deliberate, never silent) (text-coverage-config)`,
602
+ });
603
+ }
604
+ if (!flaggedKeys.has([...d.elements].sort().join(''))) {
605
+ configIssues.push({
606
+ check: 'C73',
607
+ severity: 'error',
608
+ message: `${label}: the pair is not currently flagged (similarity below ${exports.DUPLICATE_SIMILARITY_THRESHOLD} or an element unbound/renamed) — the adjudication is STALE (text-coverage-config)`,
609
+ });
610
+ }
611
+ }
612
+ return { documents, flaggedPairs, unresolvedPairs, configIssues };
613
+ }
614
+ /** The C71 finding text of one uncovered counted sentence. */
615
+ function uncoveredSentenceMessage(urn, s) {
616
+ const text = s.text.length > 100 ? `${s.text.slice(0, 97)}…` : s.text;
617
+ return `sentence ${urn}#${s.address} (normative, ${s.kind}): bound by no model element and excluded by no allowance — "${text}" (text-coverage-sentence-uncovered)`;
618
+ }
619
+ /** Load the package at `dir` and compute its text-coverage report (the
620
+ * `primmel check --coverage` path — null when the package ships no
621
+ * sentence manifests). Package-load failures propagate as the loader's
622
+ * diagnostics (checkPackage reports them as issues in the same run). */
623
+ function packageTextCoverageReport(dir, loadPackage) {
624
+ const { manifests, config, issues } = loadTextCoverageData(dir);
625
+ if (manifests.length === 0) {
626
+ return null;
627
+ }
628
+ const { standard } = loadPackage(dir);
629
+ const report = computeTextCoverage(standard, manifests, config);
630
+ report.configIssues.unshift(...issues);
631
+ return report;
632
+ }
633
+ /** The human-readable --coverage report (per-document tables with and
634
+ * without allowances, the uncovered lists, and the duplicate-pair
635
+ * adjudication status). */
636
+ function formatTextCoverageReport(report) {
637
+ const lines = [];
638
+ lines.push('── normative-text coverage (TODO.roadmap/26, concept doc §11.6) ──');
639
+ lines.push('');
640
+ lines.push(` ${'document'.padEnd(26)} ${'sentences'.padStart(9)} ${'normative'.padStart(9)} ${'covered'.padStart(8)} ${'allowed'.padStart(8)} ${'uncovered'.padStart(9)} ${'coverage'.padStart(10)} gated`);
641
+ for (const d of report.documents) {
642
+ const label = (d.short ?? d.urn).padEnd(26);
643
+ const pct = (r) => `${(r * 100).toFixed(1)}%`;
644
+ lines.push(` ${label} ${String(d.total).padStart(9)} ${String(d.normative).padStart(9)} ${String(d.covered).padStart(8)} ${String(d.allowed).padStart(8)} ${String(d.uncoveredCounted.length).padStart(9)} ${pct(d.ratio).padStart(10)} ${pct(d.ratioGated)}`);
645
+ }
646
+ lines.push('');
647
+ lines.push(' coverage = covered / normative (without allowances); gated = covered / (normative − allowed) — the 100 % target.');
648
+ for (const d of report.documents) {
649
+ if (d.uncoveredCounted.length > 0) {
650
+ lines.push('');
651
+ lines.push(` UNCOVERED normative sentences (${d.short ?? d.urn}) — each is a C71 finding:`);
652
+ for (const s of d.uncoveredCounted) {
653
+ lines.push(` ✗ ${d.urn}#${s.address} "${truncate(s.text, 90)}"`);
654
+ }
655
+ }
656
+ if (d.uncoveredAllowed.length > 0) {
657
+ lines.push('');
658
+ lines.push(` Allowed exclusions (${d.short ?? d.urn}) — reported, not gated:`);
659
+ for (const { sentence, allowance } of d.uncoveredAllowed) {
660
+ lines.push(` ◦ ${d.urn}#${sentence.address} "${truncate(sentence.text, 70)}"`);
661
+ lines.push(` allowance: ${allowance.reason ?? '(no reason)'}`);
662
+ }
663
+ }
664
+ lines.push('');
665
+ lines.push(` informative uncovered (${d.short ?? d.urn}): ${d.informativeUncovered} (reported, never gated)`);
666
+ }
667
+ lines.push('');
668
+ const adjudicated = report.flaggedPairs.length - report.unresolvedPairs.length;
669
+ lines.push(` duplicate pairs: ${report.flaggedPairs.length} flagged, ${adjudicated} adjudicated, ${report.unresolvedPairs.length} unresolved (target 0 unresolved — pairs are REPORTED, never auto-failed)`);
670
+ for (const p of report.flaggedPairs) {
671
+ const status = p.adjudication ? `${p.adjudication.verdict}` : 'UNRESOLVED';
672
+ lines.push(` ${p.adjudication ? '◦' : '?'} ${p.a} × ${p.b} — similarity ${p.similarity} [${status}]${p.adjudication ? ` — ${p.adjudication.reason ?? ''}` : ''}`);
673
+ }
674
+ return lines.join('\n');
675
+ }
676
+ function truncate(text, n) {
677
+ return text.length > n ? `${text.slice(0, n - 1)}…` : text;
678
+ }
679
+ //# sourceMappingURL=text-coverage.js.map