@hawkeyexl/manni 4.11.0 → 4.12.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 (238) hide show
  1. package/README.md +1 -1
  2. package/dist/{batch-UAULUMGH.js → batch-EFSFG6GC.js} +20 -19
  3. package/dist/build-NIO3UIWJ.js +36 -0
  4. package/dist/calibrate-6VO7URRV.js +41 -0
  5. package/dist/capture-NMBVJO3C.js +38 -0
  6. package/dist/check-SHOYX2B5.js +30 -0
  7. package/dist/check-XMJKH3KV.js +34 -0
  8. package/dist/{check-VELUQAUW.js → check-Y62BJNC4.js} +35 -34
  9. package/dist/{check-VELUQAUW.js.map → check-Y62BJNC4.js.map} +1 -1
  10. package/dist/{check-YEOYBFST.js → check-ZMO3ZLMW.js} +19 -18
  11. package/dist/{chunk-BKVHX6FU.js → chunk-24AJK2RG.js} +5 -10
  12. package/dist/chunk-24AJK2RG.js.map +1 -0
  13. package/dist/{chunk-M42DZCOU.js → chunk-2OZF2VUB.js} +2 -2
  14. package/dist/chunk-2UJZXVHR.js +1868 -0
  15. package/dist/chunk-2UJZXVHR.js.map +1 -0
  16. package/dist/{chunk-HQR2ZBHW.js → chunk-3BRJCQPY.js} +36 -7
  17. package/dist/chunk-3BRJCQPY.js.map +1 -0
  18. package/dist/{chunk-U7CTFN2J.js → chunk-42VFJOAF.js} +7 -7
  19. package/dist/{chunk-LBSCW232.js → chunk-4Q24OYI3.js} +7 -7
  20. package/dist/{chunk-OPXWPJDA.js → chunk-4WJTURRO.js} +14 -14
  21. package/dist/{chunk-GDVZ5VII.js → chunk-5SID2SVL.js} +4 -4
  22. package/dist/{chunk-FUCPZVRY.js → chunk-AANUY4BH.js} +2 -2
  23. package/dist/chunk-ANPIIYRH.js +2272 -0
  24. package/dist/chunk-ANPIIYRH.js.map +1 -0
  25. package/dist/{chunk-WDWXAYVH.js → chunk-AYVKN3PG.js} +4 -4
  26. package/dist/{chunk-FQXWVS6J.js → chunk-CH6IOGXV.js} +9 -9
  27. package/dist/{chunk-4CK6ZSOK.js → chunk-D5Z6B4M7.js} +3 -3
  28. package/dist/{chunk-HA6MQMOY.js → chunk-D6SELXQ2.js} +6 -6
  29. package/dist/{chunk-2DRHT73U.js → chunk-DDILEF5F.js} +890 -1399
  30. package/dist/chunk-DDILEF5F.js.map +1 -0
  31. package/dist/{chunk-PCS4VJBV.js → chunk-DGRLHDM4.js} +9 -9
  32. package/dist/{chunk-2MJ62AYQ.js → chunk-DHGB4JBG.js} +4 -3
  33. package/dist/chunk-DHGB4JBG.js.map +1 -0
  34. package/dist/{chunk-Y6DOMTQD.js → chunk-DLU5FCFT.js} +27 -27
  35. package/dist/chunk-DLU5FCFT.js.map +1 -0
  36. package/dist/chunk-DSWKBZWW.js +16 -0
  37. package/dist/chunk-DSWKBZWW.js.map +1 -0
  38. package/dist/{chunk-KGEQJ5CC.js → chunk-F564FHMQ.js} +8 -8
  39. package/dist/{chunk-J6IDQGJL.js → chunk-FKAZUZQU.js} +469 -85
  40. package/dist/chunk-FKAZUZQU.js.map +1 -0
  41. package/dist/{chunk-IGSHYP74.js → chunk-G3MBUL5M.js} +4 -4
  42. package/dist/{chunk-ADMEPUBT.js → chunk-GQ3KRY3B.js} +3 -3
  43. package/dist/{chunk-T7JAOYE5.js → chunk-HDPN46JP.js} +6 -6
  44. package/dist/{chunk-R4WXQIOZ.js → chunk-IQQAJROD.js} +3 -3
  45. package/dist/{chunk-2IR4T5PO.js → chunk-IZXN3WI6.js} +2 -2
  46. package/dist/{chunk-NCPWXHDO.js → chunk-JEUFYSFQ.js} +4 -4
  47. package/dist/{chunk-LKP7QDFN.js → chunk-JSSM7VVV.js} +4 -4
  48. package/dist/{chunk-2IAZEB45.js → chunk-KFGZPVFA.js} +229 -821
  49. package/dist/chunk-KFGZPVFA.js.map +1 -0
  50. package/dist/{chunk-EIFCP6CZ.js → chunk-KGFSPJLD.js} +2 -2
  51. package/dist/{chunk-RLT5SEML.js → chunk-KMORGMCW.js} +6 -6
  52. package/dist/{chunk-WQWKYAAK.js → chunk-NUQF5F5J.js} +2 -2
  53. package/dist/{chunk-54F74XR3.js → chunk-NZ6KSHFD.js} +19 -19
  54. package/dist/{chunk-4D5IZSXM.js → chunk-OHUDZRLK.js} +3 -3
  55. package/dist/{chunk-FBMZJEB3.js → chunk-OKMTUAWO.js} +4 -4
  56. package/dist/{chunk-QLWC7MKD.js → chunk-OTJOBZJ5.js} +135 -135
  57. package/dist/chunk-OTJOBZJ5.js.map +1 -0
  58. package/dist/{chunk-6HWBRZIN.js → chunk-PS257NIU.js} +252 -193
  59. package/dist/chunk-PS257NIU.js.map +1 -0
  60. package/dist/chunk-QDC7JPFG.js +685 -0
  61. package/dist/chunk-QDC7JPFG.js.map +1 -0
  62. package/dist/{chunk-PCQ7ELJH.js → chunk-QEAGL4V5.js} +109 -5
  63. package/dist/chunk-QEAGL4V5.js.map +1 -0
  64. package/dist/{chunk-BBT6AVUG.js → chunk-QMY57PVW.js} +2 -2
  65. package/dist/{chunk-LPIF5LIE.js → chunk-QNDDPXFR.js} +2 -2
  66. package/dist/{chunk-PWBH7DCQ.js → chunk-QSIXNTRV.js} +4 -4
  67. package/dist/{chunk-VSEBFHAY.js → chunk-RGLFV4KO.js} +11369 -10218
  68. package/dist/chunk-RGLFV4KO.js.map +1 -0
  69. package/dist/{chunk-D4N2V43Z.js → chunk-SGR7ZAVE.js} +13 -7
  70. package/dist/chunk-SGR7ZAVE.js.map +1 -0
  71. package/dist/{chunk-GV56WGL2.js → chunk-SMHAYK6I.js} +1036 -883
  72. package/dist/chunk-SMHAYK6I.js.map +1 -0
  73. package/dist/{chunk-JPQDNYXH.js → chunk-STPGIKPY.js} +8 -2
  74. package/dist/chunk-STPGIKPY.js.map +1 -0
  75. package/dist/{chunk-NSBXVPZL.js → chunk-U22TOL5Y.js} +17 -17
  76. package/dist/{chunk-NGTVREIH.js → chunk-U6IHLEWT.js} +2 -2
  77. package/dist/{chunk-ODRPL3WB.js → chunk-UUCCV3SI.js} +2 -2
  78. package/dist/{chunk-MSRU4D4P.js → chunk-UXMCHBOJ.js} +2 -2
  79. package/dist/{chunk-B7XYNRJQ.js → chunk-VFAKGIDG.js} +2 -2
  80. package/dist/{chunk-QCHVR4ZM.js → chunk-VM7VAFJW.js} +33 -7
  81. package/dist/chunk-VM7VAFJW.js.map +1 -0
  82. package/dist/{chunk-VQK4VHLF.js → chunk-YQV75FIL.js} +2 -2
  83. package/dist/chunk-YUTVAMWW.js +2 -0
  84. package/dist/{cli-4MF37HAQ.js → cli-4CR7QIOK.js} +26 -25
  85. package/dist/{cli-4MF37HAQ.js.map → cli-4CR7QIOK.js.map} +1 -1
  86. package/dist/{cli-6KZTHWGP.js → cli-6R4W3HAH.js} +37 -36
  87. package/dist/{cli-6KZTHWGP.js.map → cli-6R4W3HAH.js.map} +1 -1
  88. package/dist/{cli-I62SRH3R.js → cli-BOMA2FMP.js} +14 -13
  89. package/dist/{cli-DRMZBZLB.js → cli-EDQPQOCE.js} +43 -42
  90. package/dist/{cli-DRMZBZLB.js.map → cli-EDQPQOCE.js.map} +1 -1
  91. package/dist/{cli-VID7PJS3.js → cli-GBF76EXT.js} +23 -22
  92. package/dist/{cli-VID7PJS3.js.map → cli-GBF76EXT.js.map} +1 -1
  93. package/dist/{cli-3BTCK4AB.js → cli-MQYCF3SR.js} +27 -26
  94. package/dist/{cli-3BTCK4AB.js.map → cli-MQYCF3SR.js.map} +1 -1
  95. package/dist/{cli-ONTC5PKT.js → cli-OJKFXQOM.js} +9 -9
  96. package/dist/{cli-VUKMWSSF.js → cli-PHZAO4LZ.js} +4 -4
  97. package/dist/{cli-RORDPAPE.js → cli-PTKFFNOW.js} +59 -38
  98. package/dist/cli-PTKFFNOW.js.map +1 -0
  99. package/dist/{cli-O4ABTN4Z.js → cli-UW2K5Z5J.js} +31 -30
  100. package/dist/{cli-O4ABTN4Z.js.map → cli-UW2K5Z5J.js.map} +1 -1
  101. package/dist/{cli-JJMOVIKS.js → cli-XXTNPPKB.js} +14 -14
  102. package/dist/cli.js +19 -13
  103. package/dist/cli.js.map +1 -1
  104. package/dist/{config-XDA42RJL.js → config-JJW75SBX.js} +5 -5
  105. package/dist/docmeta.js +13 -12
  106. package/dist/docmeta.js.map +1 -1
  107. package/dist/github-6VQKSB67.js +35 -0
  108. package/dist/github-RBSEM7ZK.js +30 -0
  109. package/dist/graph/runtime.d.ts +4 -1
  110. package/dist/graph/runtime.js +20 -9
  111. package/dist/graph/runtime.js.map +1 -1
  112. package/dist/{host-6GURH5HE.js → host-YSTYO5DX.js} +3 -3
  113. package/dist/index.d.ts +192 -26
  114. package/dist/index.js +129 -124
  115. package/dist/index.js.map +1 -1
  116. package/dist/{json-BXY44ED7.js → json-PU2HLHDQ.js} +18 -17
  117. package/dist/labels-SJNSOPBI.js +73 -0
  118. package/dist/labels-SJNSOPBI.js.map +1 -0
  119. package/dist/lint-KIVTHLGU.js +34 -0
  120. package/dist/list-RDEJDDJF.js +32 -0
  121. package/dist/list-SUTDWL2J.js +35 -0
  122. package/dist/{page-EV7OUBAU.js → page-UMAA3NCM.js} +18 -16
  123. package/dist/{prepare-JHJDJB6I.js → prepare-3I3LOXXD.js} +22 -21
  124. package/dist/{prepare-JHJDJB6I.js.map → prepare-3I3LOXXD.js.map} +1 -1
  125. package/dist/{pretty-SCRK66M5.js → pretty-ANLRHU4O.js} +18 -17
  126. package/dist/{pretty-Q5Y2PA64.js → pretty-Q3ZFKOR7.js} +18 -17
  127. package/dist/{provider-527CO4DM.js → provider-LBX4IXGX.js} +3 -3
  128. package/dist/{release-3D5PK6M7.js → release-VV3UTKE5.js} +3 -3
  129. package/dist/{reporters-M6LJ2IYU.js → reporters-26H3N2KW.js} +3 -3
  130. package/dist/{reporters-RBYTASMI.js → reporters-ILT36CIH.js} +7 -7
  131. package/dist/{reporters-A5ADKDYR.js → reporters-PNDLWT6K.js} +16 -15
  132. package/dist/run-QXCK33Z4.js +37 -0
  133. package/dist/{term-CQAGNG3Q.js → term-D2N7UN4P.js} +981 -141
  134. package/dist/term-D2N7UN4P.js.map +1 -0
  135. package/dist/validate-BRUCOT2O.js +19 -0
  136. package/package.json +3 -2
  137. package/plugin/manni/.claude-plugin/plugin.json +1 -1
  138. package/shapes/graph/shapes-1.1.0.ttl +785 -0
  139. package/dist/build-QSPNK5AL.js +0 -35
  140. package/dist/calibrate-KXN4URPM.js +0 -40
  141. package/dist/capture-JHTSUPUC.js +0 -37
  142. package/dist/check-MDGXEUWL.js +0 -20
  143. package/dist/check-WOQRKNZK.js +0 -29
  144. package/dist/chunk-2DRHT73U.js.map +0 -1
  145. package/dist/chunk-2IAZEB45.js.map +0 -1
  146. package/dist/chunk-2MJ62AYQ.js.map +0 -1
  147. package/dist/chunk-4VBSTXN6.js +0 -392
  148. package/dist/chunk-4VBSTXN6.js.map +0 -1
  149. package/dist/chunk-6HWBRZIN.js.map +0 -1
  150. package/dist/chunk-BKVHX6FU.js.map +0 -1
  151. package/dist/chunk-D4N2V43Z.js.map +0 -1
  152. package/dist/chunk-EFW7CAG4.js +0 -387
  153. package/dist/chunk-EFW7CAG4.js.map +0 -1
  154. package/dist/chunk-GV56WGL2.js.map +0 -1
  155. package/dist/chunk-HQR2ZBHW.js.map +0 -1
  156. package/dist/chunk-J6IDQGJL.js.map +0 -1
  157. package/dist/chunk-JPQDNYXH.js.map +0 -1
  158. package/dist/chunk-JROBZ7JA.js +0 -818
  159. package/dist/chunk-JROBZ7JA.js.map +0 -1
  160. package/dist/chunk-PCQ7ELJH.js.map +0 -1
  161. package/dist/chunk-QCHVR4ZM.js.map +0 -1
  162. package/dist/chunk-QLWC7MKD.js.map +0 -1
  163. package/dist/chunk-TU2WUBVZ.js +0 -2
  164. package/dist/chunk-VSEBFHAY.js.map +0 -1
  165. package/dist/chunk-Y6DOMTQD.js.map +0 -1
  166. package/dist/cli-RORDPAPE.js.map +0 -1
  167. package/dist/github-RY3FRA6P.js +0 -29
  168. package/dist/github-YKQSH7FS.js +0 -34
  169. package/dist/lint-YJ2L22BW.js +0 -33
  170. package/dist/list-NSG24VVX.js +0 -31
  171. package/dist/list-V6EGCSHX.js +0 -34
  172. package/dist/run-BUE2DDXN.js +0 -36
  173. package/dist/term-CQAGNG3Q.js.map +0 -1
  174. package/dist/validate-ZBW44RHT.js +0 -18
  175. /package/dist/{batch-UAULUMGH.js.map → batch-EFSFG6GC.js.map} +0 -0
  176. /package/dist/{build-QSPNK5AL.js.map → build-NIO3UIWJ.js.map} +0 -0
  177. /package/dist/{calibrate-KXN4URPM.js.map → calibrate-6VO7URRV.js.map} +0 -0
  178. /package/dist/{capture-JHTSUPUC.js.map → capture-NMBVJO3C.js.map} +0 -0
  179. /package/dist/{check-MDGXEUWL.js.map → check-SHOYX2B5.js.map} +0 -0
  180. /package/dist/{check-WOQRKNZK.js.map → check-XMJKH3KV.js.map} +0 -0
  181. /package/dist/{check-YEOYBFST.js.map → check-ZMO3ZLMW.js.map} +0 -0
  182. /package/dist/{chunk-M42DZCOU.js.map → chunk-2OZF2VUB.js.map} +0 -0
  183. /package/dist/{chunk-U7CTFN2J.js.map → chunk-42VFJOAF.js.map} +0 -0
  184. /package/dist/{chunk-LBSCW232.js.map → chunk-4Q24OYI3.js.map} +0 -0
  185. /package/dist/{chunk-OPXWPJDA.js.map → chunk-4WJTURRO.js.map} +0 -0
  186. /package/dist/{chunk-GDVZ5VII.js.map → chunk-5SID2SVL.js.map} +0 -0
  187. /package/dist/{chunk-FUCPZVRY.js.map → chunk-AANUY4BH.js.map} +0 -0
  188. /package/dist/{chunk-WDWXAYVH.js.map → chunk-AYVKN3PG.js.map} +0 -0
  189. /package/dist/{chunk-FQXWVS6J.js.map → chunk-CH6IOGXV.js.map} +0 -0
  190. /package/dist/{chunk-4CK6ZSOK.js.map → chunk-D5Z6B4M7.js.map} +0 -0
  191. /package/dist/{chunk-HA6MQMOY.js.map → chunk-D6SELXQ2.js.map} +0 -0
  192. /package/dist/{chunk-PCS4VJBV.js.map → chunk-DGRLHDM4.js.map} +0 -0
  193. /package/dist/{chunk-KGEQJ5CC.js.map → chunk-F564FHMQ.js.map} +0 -0
  194. /package/dist/{chunk-IGSHYP74.js.map → chunk-G3MBUL5M.js.map} +0 -0
  195. /package/dist/{chunk-ADMEPUBT.js.map → chunk-GQ3KRY3B.js.map} +0 -0
  196. /package/dist/{chunk-T7JAOYE5.js.map → chunk-HDPN46JP.js.map} +0 -0
  197. /package/dist/{chunk-R4WXQIOZ.js.map → chunk-IQQAJROD.js.map} +0 -0
  198. /package/dist/{chunk-2IR4T5PO.js.map → chunk-IZXN3WI6.js.map} +0 -0
  199. /package/dist/{chunk-NCPWXHDO.js.map → chunk-JEUFYSFQ.js.map} +0 -0
  200. /package/dist/{chunk-LKP7QDFN.js.map → chunk-JSSM7VVV.js.map} +0 -0
  201. /package/dist/{chunk-EIFCP6CZ.js.map → chunk-KGFSPJLD.js.map} +0 -0
  202. /package/dist/{chunk-RLT5SEML.js.map → chunk-KMORGMCW.js.map} +0 -0
  203. /package/dist/{chunk-WQWKYAAK.js.map → chunk-NUQF5F5J.js.map} +0 -0
  204. /package/dist/{chunk-54F74XR3.js.map → chunk-NZ6KSHFD.js.map} +0 -0
  205. /package/dist/{chunk-4D5IZSXM.js.map → chunk-OHUDZRLK.js.map} +0 -0
  206. /package/dist/{chunk-FBMZJEB3.js.map → chunk-OKMTUAWO.js.map} +0 -0
  207. /package/dist/{chunk-BBT6AVUG.js.map → chunk-QMY57PVW.js.map} +0 -0
  208. /package/dist/{chunk-LPIF5LIE.js.map → chunk-QNDDPXFR.js.map} +0 -0
  209. /package/dist/{chunk-PWBH7DCQ.js.map → chunk-QSIXNTRV.js.map} +0 -0
  210. /package/dist/{chunk-NSBXVPZL.js.map → chunk-U22TOL5Y.js.map} +0 -0
  211. /package/dist/{chunk-NGTVREIH.js.map → chunk-U6IHLEWT.js.map} +0 -0
  212. /package/dist/{chunk-ODRPL3WB.js.map → chunk-UUCCV3SI.js.map} +0 -0
  213. /package/dist/{chunk-MSRU4D4P.js.map → chunk-UXMCHBOJ.js.map} +0 -0
  214. /package/dist/{chunk-B7XYNRJQ.js.map → chunk-VFAKGIDG.js.map} +0 -0
  215. /package/dist/{chunk-VQK4VHLF.js.map → chunk-YQV75FIL.js.map} +0 -0
  216. /package/dist/{chunk-TU2WUBVZ.js.map → chunk-YUTVAMWW.js.map} +0 -0
  217. /package/dist/{cli-I62SRH3R.js.map → cli-BOMA2FMP.js.map} +0 -0
  218. /package/dist/{cli-ONTC5PKT.js.map → cli-OJKFXQOM.js.map} +0 -0
  219. /package/dist/{cli-VUKMWSSF.js.map → cli-PHZAO4LZ.js.map} +0 -0
  220. /package/dist/{cli-JJMOVIKS.js.map → cli-XXTNPPKB.js.map} +0 -0
  221. /package/dist/{config-XDA42RJL.js.map → config-JJW75SBX.js.map} +0 -0
  222. /package/dist/{github-RY3FRA6P.js.map → github-6VQKSB67.js.map} +0 -0
  223. /package/dist/{github-YKQSH7FS.js.map → github-RBSEM7ZK.js.map} +0 -0
  224. /package/dist/{host-6GURH5HE.js.map → host-YSTYO5DX.js.map} +0 -0
  225. /package/dist/{json-BXY44ED7.js.map → json-PU2HLHDQ.js.map} +0 -0
  226. /package/dist/{lint-YJ2L22BW.js.map → lint-KIVTHLGU.js.map} +0 -0
  227. /package/dist/{list-NSG24VVX.js.map → list-RDEJDDJF.js.map} +0 -0
  228. /package/dist/{list-V6EGCSHX.js.map → list-SUTDWL2J.js.map} +0 -0
  229. /package/dist/{page-EV7OUBAU.js.map → page-UMAA3NCM.js.map} +0 -0
  230. /package/dist/{pretty-Q5Y2PA64.js.map → pretty-ANLRHU4O.js.map} +0 -0
  231. /package/dist/{pretty-SCRK66M5.js.map → pretty-Q3ZFKOR7.js.map} +0 -0
  232. /package/dist/{provider-527CO4DM.js.map → provider-LBX4IXGX.js.map} +0 -0
  233. /package/dist/{release-3D5PK6M7.js.map → release-VV3UTKE5.js.map} +0 -0
  234. /package/dist/{reporters-A5ADKDYR.js.map → reporters-26H3N2KW.js.map} +0 -0
  235. /package/dist/{reporters-M6LJ2IYU.js.map → reporters-ILT36CIH.js.map} +0 -0
  236. /package/dist/{reporters-RBYTASMI.js.map → reporters-PNDLWT6K.js.map} +0 -0
  237. /package/dist/{run-BUE2DDXN.js.map → run-QXCK33Z4.js.map} +0 -0
  238. /package/dist/{validate-ZBW44RHT.js.map → validate-BRUCOT2O.js.map} +0 -0
@@ -0,0 +1,785 @@
1
+ # manni graph graph shapes 1.1.0, the published SHACL contract for graphs emitted
2
+ # by `manni graph build`. Consumed by `manni graph check` (and the `manni graph fill`
3
+ # guardrail).
4
+ #
5
+ # 1.1.0 admits one concept scheme fed by the termbase (proposal 0086 §1). It is
6
+ # MINOR, because a graph that used to fail may now pass, and none that passed
7
+ # fails:
8
+ #
9
+ # - Concept learns skos:hiddenLabel, skos:definition, skos:scopeNote and
10
+ # skos:topConceptOf. A term's concept carries the first three, and every
11
+ # concept with no broader concept is a top concept of the scheme.
12
+ # - ConceptScheme learns skos:hasTopConcept, the other direction.
13
+ # - Concept learns skos:notation and the five mapping properties,
14
+ # skos:exactMatch, closeMatch, broadMatch, narrowMatch and relatedMatch,
15
+ # each an IRI. They come from a term's notation and match keys. A mapping
16
+ # into the scheme itself is a check-core finding, because SHACL Core cannot
17
+ # tell a concept of this scheme from one elsewhere without naming the
18
+ # scheme.
19
+ # - A term in several languages carries one prefLabel per language, so the
20
+ # prefLabel collision is sh:uniqueLang now rather than sh:maxCount 1. Two
21
+ # untagged prefLabels on one concept (one slug, two spellings) are still a
22
+ # warning, with the same message. SHACL Core cannot say "at most one
23
+ # untagged value", so graph's check core reports that one.
24
+ # - The shapes namespace moves with the version: dsh: is now
25
+ # https://hawkeyexl.github.io/manni/graph/shapes/1.1.0#.
26
+ # - Document learns graph:sampleQuestion (proposal 0086 §7), a page's
27
+ # `sample-questions`, each a string or a language-tagged string.
28
+ #
29
+ # 1.0.0 was the first file the three-segment convention in CLAUDE.md bound. It
30
+ # was MAJOR, because a graph that used to validate could fail on the language
31
+ # pattern.
32
+ #
33
+ # 1.0.0 makes language a scope dimension and gives translations a relation
34
+ # (ADR 01037):
35
+ #
36
+ # - dcterms:language gains a BCP-47 sh:pattern. `lang: English` validated
37
+ # under 0.7 and does not here. The value is a partition key — scope
38
+ # filtering, per-language coverage, and the per-locale retrieval artifacts
39
+ # all group on it — so "a string" is not the contract, any more than it was
40
+ # for graph:contentHash. A free-text label silently partitions a corpus into
41
+ # buckets of one.
42
+ # - Document learns schema:translationOfWork and schema:workTranslation, the
43
+ # two directions manni graph materializes from one authored `translation-of` key.
44
+ # Without them the closed shape rejects every translated corpus, which is
45
+ # the mechanism working, not a bug to route around.
46
+ #
47
+ # There is deliberately no negative-language predicate, and so no sh:disjoint
48
+ # pair as there is for variants and subjects (ADR 01014). A document has one
49
+ # language, which sh:maxCount 1 already says; "not in German" is not a claim an
50
+ # author makes.
51
+ #
52
+ # 0.7 required graph:contentHash on every Document: a lowercase sha256 hex
53
+ # digest of the source file's content (ADR 01036). Required rather than
54
+ # optional because the predicate is unconditional — it is intrinsic like
55
+ # graph:path, not gated behind a derive source — so optional would let a
56
+ # regression that stops emitting it pass `check` in silence. A graph built
57
+ # before 0.7 therefore fails it until rebuilt. There is no older file to pin
58
+ # check.shapes to any more: 0.1 through 0.7 were dockg's published history,
59
+ # which nothing read and which went with that identity (proposal 0051 §7).
60
+ #
61
+ # 0.6 changed no constraint. It existed because the graph: namespace moved to a
62
+ # location that resolves — https://hawkeyexl.github.io/manni/graph/ns# — alongside the
63
+ # vocabulary document that defines every term (ADR 01030). Published shapes
64
+ # are immutable, so a namespace change is a new file rather than an edit. The
65
+ # shapes namespace moves with each version: dsh: is now
66
+ # https://hawkeyexl.github.io/manni/graph/shapes/1.0.0#.
67
+ #
68
+ # 0.5 reified fill provenance (ADR 01015): the graph-fill activity now links to one
69
+ # entry node per filled field via graph:filledFieldEntry, and each entry carries
70
+ # graph:filledField + an optional graph:confidence decimal (replacing the bare
71
+ # graph:filledField literal on the activity). 0.4 added negative scope (ADR
72
+ # 01014); 0.3 added section-level iiRDS typing (ADR 01013); 0.2 added iiRDS
73
+ # Core/Software typing on Documents (ADR 01012).
74
+ #
75
+ # This file is immutable once published: evolve by adding a new version file
76
+ # (shapes-1.2.0.ttl), never by editing this one. Every shape has a named IRI — the
77
+ # only anonymous nodes are the sh:ignoredProperties and sh:in lists the SHACL
78
+ # vocabulary requires — so the file diffs cleanly.
79
+ #
80
+ # Severity contract: these three levels map onto the family scale every manni
81
+ # tool speaks (proposal 0051 §2). sh:Violation → error, and errors exit 1;
82
+ # sh:Warning → warning and sh:Info → notice, both reported at exit 0. Each
83
+ # finding also keeps SHACL's own word, as `shaclSeverity`. Cycle detection
84
+ # (skos:broader loops) and broaderTransitive/related disjointness cannot be
85
+ # expressed in core SHACL and are enforced by graph's check core alongside these
86
+ # shapes.
87
+
88
+ @prefix dcterms: <http://purl.org/dc/terms/> .
89
+ @prefix graph: <https://hawkeyexl.github.io/manni/graph/ns#> .
90
+ @prefix dsh: <https://hawkeyexl.github.io/manni/graph/shapes/1.1.0#> .
91
+ @prefix foaf: <http://xmlns.com/foaf/0.1/> .
92
+ @prefix iirds: <http://iirds.tekom.de/iirds#> .
93
+ @prefix iirdsSft: <http://iirds.tekom.de/iirds/domain/software#> .
94
+ @prefix prov: <http://www.w3.org/ns/prov#> .
95
+ @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
96
+ @prefix schema: <https://schema.org/> .
97
+ @prefix sh: <http://www.w3.org/ns/shacl#> .
98
+ @prefix skos: <http://www.w3.org/2004/02/skos/core#> .
99
+ @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
100
+
101
+ # --- Documents ---------------------------------------------------------------
102
+ # Closed over the full derived predicate set: an unexpected predicate from a
103
+ # new derive source fails loudly (same stance as additionalProperties: false).
104
+
105
+ dsh:DocumentShape
106
+ a sh:NodeShape ;
107
+ sh:targetClass graph:Document ;
108
+ sh:closed true ;
109
+ sh:ignoredProperties ( rdf:type ) ;
110
+ sh:property
111
+ dsh:Document-path ,
112
+ dsh:Document-contentHash ,
113
+ dsh:Document-title ,
114
+ dsh:Document-description ,
115
+ dsh:Document-creator ,
116
+ dsh:Document-created ,
117
+ dsh:Document-modified ,
118
+ dsh:Document-language ,
119
+ dsh:Document-primaryTopic ,
120
+ dsh:Document-subject ,
121
+ dsh:Document-hasPart ,
122
+ dsh:Document-references ,
123
+ dsh:Document-brokenLink ,
124
+ dsh:Document-brokenSectionRef ,
125
+ dsh:Document-image ,
126
+ dsh:Document-codeLanguage ,
127
+ dsh:Document-sampleQuestion ,
128
+ dsh:Document-topicType ,
129
+ dsh:Document-appliesToVariant ,
130
+ dsh:Document-softwareLifecyclePhase ,
131
+ dsh:Document-softwareSubject ,
132
+ dsh:Document-notApplicableToVariant ,
133
+ dsh:Document-notSoftwareSubject ,
134
+ dsh:Document-translationOfWork ,
135
+ dsh:Document-workTranslation ,
136
+ dsh:Document-wasAttributedTo ,
137
+ dsh:Document-qualifiedAttribution ,
138
+ dsh:Document-generatedAtTime ,
139
+ dsh:Document-wasDerivedFrom ,
140
+ dsh:Document-wasRevisionOf ,
141
+ dsh:Document-wasGeneratedBy .
142
+
143
+ dsh:Document-path
144
+ a sh:PropertyShape ;
145
+ sh:path graph:path ;
146
+ sh:datatype xsd:string ;
147
+ sh:minCount 1 ;
148
+ sh:maxCount 1 .
149
+
150
+ # Pattern-checked, not merely typed: the value is a join key other systems index
151
+ # on, so "a string" is not the contract — 64 lowercase hex characters is.
152
+ dsh:Document-contentHash
153
+ a sh:PropertyShape ;
154
+ sh:path graph:contentHash ;
155
+ sh:datatype xsd:string ;
156
+ sh:pattern "^[0-9a-f]{64}$" ;
157
+ sh:minCount 1 ;
158
+ sh:maxCount 1 .
159
+
160
+ dsh:Document-title
161
+ a sh:PropertyShape ;
162
+ sh:path dcterms:title ;
163
+ sh:maxCount 1 .
164
+
165
+ dsh:Document-description
166
+ a sh:PropertyShape ;
167
+ sh:path dcterms:description ;
168
+ sh:maxCount 1 .
169
+
170
+ # Literal when the provenance derive source is off, agent IRI when it is on —
171
+ # both are valid output, so no nodeKind constraint.
172
+ dsh:Document-creator
173
+ a sh:PropertyShape ;
174
+ sh:path dcterms:creator .
175
+
176
+ dsh:Document-created
177
+ a sh:PropertyShape ;
178
+ sh:path dcterms:created ;
179
+ sh:maxCount 1 .
180
+
181
+ dsh:Document-modified
182
+ a sh:PropertyShape ;
183
+ sh:path dcterms:modified ;
184
+ sh:maxCount 1 .
185
+
186
+ # Pattern-checked for the same reason graph:contentHash is: the value is a
187
+ # partition key, not prose. The grammar is BCP-47's common shape —
188
+ # language(2-3) + optional script(4) + optional region(2 alpha or 3 digit) +
189
+ # variants — which accepts de, de-DE, zh-Hans, zh-Hans-CN, pt-BR, und, and
190
+ # rejects English and de_DE.
191
+ dsh:Document-language
192
+ a sh:PropertyShape ;
193
+ sh:path dcterms:language ;
194
+ sh:datatype xsd:string ;
195
+ sh:pattern "^[A-Za-z]{2,3}(-[A-Za-z]{4})?(-([A-Za-z]{2}|[0-9]{3}))?(-([A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*$" ;
196
+ sh:maxCount 1 .
197
+
198
+ # The two directions of one authored `translation-of` (ADR 01037). No
199
+ # sh:maxCount: a source document has as many translations as the corpus
200
+ # carries, and a translation may itself be the source of another.
201
+ # schema:translationOfWork accepts any IRI because a target outside the corpus
202
+ # is a URL manni graph resolves but does not analyze; schema:workTranslation is only
203
+ # ever minted at a corpus document, so it carries the class constraint.
204
+ dsh:Document-translationOfWork
205
+ a sh:PropertyShape ;
206
+ sh:path schema:translationOfWork ;
207
+ sh:nodeKind sh:IRI .
208
+
209
+ dsh:Document-workTranslation
210
+ a sh:PropertyShape ;
211
+ sh:path schema:workTranslation ;
212
+ sh:nodeKind sh:IRI ;
213
+ sh:class graph:Document .
214
+
215
+ dsh:Document-primaryTopic
216
+ a sh:PropertyShape ;
217
+ sh:path foaf:primaryTopic ;
218
+ sh:nodeKind sh:IRI ;
219
+ sh:class skos:Concept ;
220
+ sh:maxCount 1 .
221
+
222
+ # Warning, not Violation: a dcterms:subject pointing at an untyped node is a
223
+ # half-built concept — worth surfacing, but merged external data may
224
+ # legitimately use other subject vocabularies.
225
+ dsh:Document-subject
226
+ a sh:PropertyShape ;
227
+ sh:path dcterms:subject ;
228
+ sh:nodeKind sh:IRI ;
229
+ sh:class skos:Concept ;
230
+ sh:severity sh:Warning .
231
+
232
+ dsh:Document-hasPart
233
+ a sh:PropertyShape ;
234
+ sh:path dcterms:hasPart ;
235
+ sh:nodeKind sh:IRI ;
236
+ sh:class graph:Section .
237
+
238
+ dsh:Document-references
239
+ a sh:PropertyShape ;
240
+ sh:path dcterms:references ;
241
+ sh:nodeKind sh:IRI .
242
+
243
+ dsh:Document-brokenLink
244
+ a sh:PropertyShape ;
245
+ sh:path graph:brokenLink ;
246
+ sh:datatype xsd:string .
247
+
248
+ # A graph.sections key that named no heading (surfaced by stats, gated by --check).
249
+ dsh:Document-brokenSectionRef
250
+ a sh:PropertyShape ;
251
+ sh:path graph:brokenSectionRef ;
252
+ sh:datatype xsd:string .
253
+
254
+ dsh:Document-image
255
+ a sh:PropertyShape ;
256
+ sh:path schema:image ;
257
+ sh:nodeKind sh:IRI .
258
+
259
+ dsh:Document-codeLanguage
260
+ a sh:PropertyShape ;
261
+ sh:path graph:codeLanguage ;
262
+ sh:datatype xsd:string .
263
+
264
+ # Tagged with the page's language when it declares one, so either datatype.
265
+ dsh:Document-sampleQuestion
266
+ a sh:PropertyShape ;
267
+ sh:path graph:sampleQuestion ;
268
+ sh:or ( [ sh:datatype xsd:string ] [ sh:datatype rdf:langString ] ) .
269
+
270
+ # iiRDS Core topic type: exactly the six published Generic* instances.
271
+ dsh:Document-topicType
272
+ a sh:PropertyShape ;
273
+ sh:path iirds:has-topic-type ;
274
+ sh:nodeKind sh:IRI ;
275
+ sh:maxCount 1 ;
276
+ sh:in (
277
+ iirds:GenericTask
278
+ iirds:GenericConcept
279
+ iirds:GenericReference
280
+ iirds:GenericLearning
281
+ iirds:GenericTroubleshooting
282
+ iirds:GenericForm
283
+ ) .
284
+
285
+ # iiRDS product/variant applicability: minted iirds:ProductVariant nodes.
286
+ dsh:Document-appliesToVariant
287
+ a sh:PropertyShape ;
288
+ sh:path iirds:relates-to-product-variant ;
289
+ sh:nodeKind sh:IRI ;
290
+ sh:class iirds:ProductVariant .
291
+
292
+ # iiRDS Software domain — product lifecycle phases (the six published instances).
293
+ dsh:Document-softwareLifecyclePhase
294
+ a sh:PropertyShape ;
295
+ sh:path iirds:relates-to-product-lifecycle-phase ;
296
+ sh:nodeKind sh:IRI ;
297
+ sh:in (
298
+ iirdsSft:Administration
299
+ iirdsSft:Customization
300
+ iirdsSft:Update
301
+ iirdsSft:Deployment
302
+ iirdsSft:Integration
303
+ iirdsSft:Deinstallation
304
+ ) .
305
+
306
+ # iiRDS Software domain — information subjects (the three published instances).
307
+ dsh:Document-softwareSubject
308
+ a sh:PropertyShape ;
309
+ sh:path iirds:has-subject ;
310
+ sh:nodeKind sh:IRI ;
311
+ sh:in (
312
+ iirdsSft:Architecture
313
+ iirdsSft:Interface
314
+ iirdsSft:SystemRequirement
315
+ ) .
316
+
317
+ # Negative scope (ADR 01014): disjoint from the positive relation, so a variant
318
+ # or subject asserted as both applicable and not-applicable on one node fails.
319
+ dsh:Document-notApplicableToVariant
320
+ a sh:PropertyShape ;
321
+ sh:path graph:notApplicableToVariant ;
322
+ sh:nodeKind sh:IRI ;
323
+ sh:class iirds:ProductVariant ;
324
+ sh:disjoint iirds:relates-to-product-variant .
325
+
326
+ dsh:Document-notSoftwareSubject
327
+ a sh:PropertyShape ;
328
+ sh:path graph:notSoftwareSubject ;
329
+ sh:nodeKind sh:IRI ;
330
+ sh:disjoint iirds:has-subject ;
331
+ sh:in (
332
+ iirdsSft:Architecture
333
+ iirdsSft:Interface
334
+ iirdsSft:SystemRequirement
335
+ ) .
336
+
337
+ dsh:Document-wasAttributedTo
338
+ a sh:PropertyShape ;
339
+ sh:path prov:wasAttributedTo ;
340
+ sh:nodeKind sh:IRI .
341
+
342
+ dsh:Document-qualifiedAttribution
343
+ a sh:PropertyShape ;
344
+ sh:path prov:qualifiedAttribution ;
345
+ sh:nodeKind sh:IRI ;
346
+ sh:class prov:Attribution .
347
+
348
+ dsh:Document-generatedAtTime
349
+ a sh:PropertyShape ;
350
+ sh:path prov:generatedAtTime ;
351
+ sh:maxCount 1 .
352
+
353
+ dsh:Document-wasDerivedFrom
354
+ a sh:PropertyShape ;
355
+ sh:path prov:wasDerivedFrom ;
356
+ sh:nodeKind sh:IRI .
357
+
358
+ dsh:Document-wasRevisionOf
359
+ a sh:PropertyShape ;
360
+ sh:path prov:wasRevisionOf ;
361
+ sh:nodeKind sh:IRI .
362
+
363
+ dsh:Document-wasGeneratedBy
364
+ a sh:PropertyShape ;
365
+ sh:path prov:wasGeneratedBy ;
366
+ sh:nodeKind sh:IRI ;
367
+ sh:class prov:Activity .
368
+
369
+ # --- Product variants --------------------------------------------------------
370
+ # Minted from graph.applies-to. manni graph references iiRDS ProductVariant as a class
371
+ # but only labels the node — the iiRDS vocabulary itself is never re-emitted.
372
+
373
+ dsh:ProductVariantShape
374
+ a sh:NodeShape ;
375
+ sh:targetClass iirds:ProductVariant ;
376
+ sh:closed true ;
377
+ sh:ignoredProperties ( rdf:type ) ;
378
+ sh:property dsh:ProductVariant-title .
379
+
380
+ dsh:ProductVariant-title
381
+ a sh:PropertyShape ;
382
+ sh:path dcterms:title ;
383
+ sh:minCount 1 ;
384
+ sh:maxCount 1 .
385
+
386
+ # --- Sections ----------------------------------------------------------------
387
+
388
+ dsh:SectionShape
389
+ a sh:NodeShape ;
390
+ sh:targetClass graph:Section ;
391
+ sh:closed true ;
392
+ sh:ignoredProperties ( rdf:type ) ;
393
+ sh:property
394
+ dsh:Section-title ,
395
+ dsh:Section-level ,
396
+ dsh:Section-order ,
397
+ dsh:Section-hasPart ,
398
+ dsh:Section-subject ,
399
+ dsh:Section-topicType ,
400
+ dsh:Section-appliesToVariant ,
401
+ dsh:Section-softwareLifecyclePhase ,
402
+ dsh:Section-softwareSubject ,
403
+ dsh:Section-notApplicableToVariant ,
404
+ dsh:Section-notSoftwareSubject .
405
+
406
+ dsh:Section-title
407
+ a sh:PropertyShape ;
408
+ sh:path dcterms:title ;
409
+ sh:minCount 1 ;
410
+ sh:maxCount 1 .
411
+
412
+ dsh:Section-level
413
+ a sh:PropertyShape ;
414
+ sh:path graph:level ;
415
+ sh:datatype xsd:integer ;
416
+ sh:minCount 1 ;
417
+ sh:maxCount 1 .
418
+
419
+ dsh:Section-order
420
+ a sh:PropertyShape ;
421
+ sh:path graph:order ;
422
+ sh:datatype xsd:integer ;
423
+ sh:minCount 1 ;
424
+ sh:maxCount 1 .
425
+
426
+ dsh:Section-hasPart
427
+ a sh:PropertyShape ;
428
+ sh:path dcterms:hasPart ;
429
+ sh:nodeKind sh:IRI ;
430
+ sh:class graph:Section .
431
+
432
+ # Section-level iiRDS typing (ADR 01013) — the same constraints the Document
433
+ # shape carries for these predicates.
434
+
435
+ # Warning, not Violation, exactly as Document-subject: a subject pointing at an
436
+ # untyped node is a half-built concept, and merged data may use other schemes.
437
+ dsh:Section-subject
438
+ a sh:PropertyShape ;
439
+ sh:path dcterms:subject ;
440
+ sh:nodeKind sh:IRI ;
441
+ sh:class skos:Concept ;
442
+ sh:severity sh:Warning .
443
+
444
+ dsh:Section-topicType
445
+ a sh:PropertyShape ;
446
+ sh:path iirds:has-topic-type ;
447
+ sh:nodeKind sh:IRI ;
448
+ sh:maxCount 1 ;
449
+ sh:in (
450
+ iirds:GenericTask
451
+ iirds:GenericConcept
452
+ iirds:GenericReference
453
+ iirds:GenericLearning
454
+ iirds:GenericTroubleshooting
455
+ iirds:GenericForm
456
+ ) .
457
+
458
+ dsh:Section-appliesToVariant
459
+ a sh:PropertyShape ;
460
+ sh:path iirds:relates-to-product-variant ;
461
+ sh:nodeKind sh:IRI ;
462
+ sh:class iirds:ProductVariant .
463
+
464
+ dsh:Section-softwareLifecyclePhase
465
+ a sh:PropertyShape ;
466
+ sh:path iirds:relates-to-product-lifecycle-phase ;
467
+ sh:nodeKind sh:IRI ;
468
+ sh:in (
469
+ iirdsSft:Administration
470
+ iirdsSft:Customization
471
+ iirdsSft:Update
472
+ iirdsSft:Deployment
473
+ iirdsSft:Integration
474
+ iirdsSft:Deinstallation
475
+ ) .
476
+
477
+ dsh:Section-softwareSubject
478
+ a sh:PropertyShape ;
479
+ sh:path iirds:has-subject ;
480
+ sh:nodeKind sh:IRI ;
481
+ sh:in (
482
+ iirdsSft:Architecture
483
+ iirdsSft:Interface
484
+ iirdsSft:SystemRequirement
485
+ ) .
486
+
487
+ # Section-level negative scope (ADR 01014), disjoint from the positive relation.
488
+ dsh:Section-notApplicableToVariant
489
+ a sh:PropertyShape ;
490
+ sh:path graph:notApplicableToVariant ;
491
+ sh:nodeKind sh:IRI ;
492
+ sh:class iirds:ProductVariant ;
493
+ sh:disjoint iirds:relates-to-product-variant .
494
+
495
+ dsh:Section-notSoftwareSubject
496
+ a sh:PropertyShape ;
497
+ sh:path graph:notSoftwareSubject ;
498
+ sh:nodeKind sh:IRI ;
499
+ sh:disjoint iirds:has-subject ;
500
+ sh:in (
501
+ iirdsSft:Architecture
502
+ iirdsSft:Interface
503
+ iirdsSft:SystemRequirement
504
+ ) .
505
+
506
+ # --- Concepts ----------------------------------------------------------------
507
+
508
+ dsh:ConceptShape
509
+ a sh:NodeShape ;
510
+ sh:targetClass skos:Concept ;
511
+ sh:closed true ;
512
+ sh:ignoredProperties ( rdf:type ) ;
513
+ sh:property
514
+ dsh:Concept-prefLabel ,
515
+ dsh:Concept-prefLabel-collision ,
516
+ dsh:Concept-inScheme ,
517
+ dsh:Concept-altLabel ,
518
+ dsh:Concept-hiddenLabel ,
519
+ dsh:Concept-definition ,
520
+ dsh:Concept-scopeNote ,
521
+ dsh:Concept-topConceptOf ,
522
+ dsh:Concept-broader ,
523
+ dsh:Concept-narrower ,
524
+ dsh:Concept-related ,
525
+ dsh:Concept-notation ,
526
+ dsh:Concept-exactMatch ,
527
+ dsh:Concept-closeMatch ,
528
+ dsh:Concept-broadMatch ,
529
+ dsh:Concept-narrowMatch ,
530
+ dsh:Concept-relatedMatch .
531
+
532
+ dsh:Concept-prefLabel
533
+ a sh:PropertyShape ;
534
+ sh:path skos:prefLabel ;
535
+ sh:minCount 1 .
536
+
537
+ # Warning, not Violation. A term in several languages carries one prefLabel
538
+ # per language, and SKOS wants at most one per language, which sh:uniqueLang
539
+ # says. Concept IRIs also converge on slugified labels, so "Configuration" and
540
+ # "configuration" merge into one concept carrying two untagged spellings.
541
+ # sh:uniqueLang ignores untagged values, so graph's check core reports that
542
+ # case, at the same severity and with the message this shape used to carry.
543
+ dsh:Concept-prefLabel-collision
544
+ a sh:PropertyShape ;
545
+ sh:path skos:prefLabel ;
546
+ sh:uniqueLang true ;
547
+ sh:severity sh:Warning ;
548
+ sh:message "concept carries two prefLabels in one language; settle on one spelling" .
549
+
550
+ dsh:Concept-inScheme
551
+ a sh:PropertyShape ;
552
+ sh:path skos:inScheme ;
553
+ sh:nodeKind sh:IRI ;
554
+ sh:minCount 1 .
555
+
556
+ dsh:Concept-altLabel
557
+ a sh:PropertyShape ;
558
+ sh:path skos:altLabel .
559
+
560
+ dsh:Concept-hiddenLabel
561
+ a sh:PropertyShape ;
562
+ sh:path skos:hiddenLabel .
563
+
564
+ dsh:Concept-definition
565
+ a sh:PropertyShape ;
566
+ sh:path skos:definition .
567
+
568
+ dsh:Concept-scopeNote
569
+ a sh:PropertyShape ;
570
+ sh:path skos:scopeNote .
571
+
572
+ dsh:Concept-topConceptOf
573
+ a sh:PropertyShape ;
574
+ sh:path skos:topConceptOf ;
575
+ sh:nodeKind sh:IRI ;
576
+ sh:class skos:ConceptScheme .
577
+
578
+ dsh:Concept-broader
579
+ a sh:PropertyShape ;
580
+ sh:path skos:broader ;
581
+ sh:nodeKind sh:IRI ;
582
+ sh:class skos:Concept .
583
+
584
+ dsh:Concept-narrower
585
+ a sh:PropertyShape ;
586
+ sh:path skos:narrower ;
587
+ sh:nodeKind sh:IRI ;
588
+ sh:class skos:Concept .
589
+
590
+ # One-hop related/broader disjointness; the transitive form lives in the
591
+ # check core's TypeScript walk.
592
+ dsh:Concept-related
593
+ a sh:PropertyShape ;
594
+ sh:path skos:related ;
595
+ sh:nodeKind sh:IRI ;
596
+ sh:class skos:Concept ;
597
+ sh:disjoint skos:broader .
598
+
599
+ dsh:Concept-notation
600
+ a sh:PropertyShape ;
601
+ sh:path skos:notation ;
602
+ sh:nodeKind sh:Literal .
603
+
604
+ dsh:Concept-exactMatch
605
+ a sh:PropertyShape ;
606
+ sh:path skos:exactMatch ;
607
+ sh:nodeKind sh:IRI .
608
+
609
+ dsh:Concept-closeMatch
610
+ a sh:PropertyShape ;
611
+ sh:path skos:closeMatch ;
612
+ sh:nodeKind sh:IRI .
613
+
614
+ dsh:Concept-broadMatch
615
+ a sh:PropertyShape ;
616
+ sh:path skos:broadMatch ;
617
+ sh:nodeKind sh:IRI .
618
+
619
+ dsh:Concept-narrowMatch
620
+ a sh:PropertyShape ;
621
+ sh:path skos:narrowMatch ;
622
+ sh:nodeKind sh:IRI .
623
+
624
+ dsh:Concept-relatedMatch
625
+ a sh:PropertyShape ;
626
+ sh:path skos:relatedMatch ;
627
+ sh:nodeKind sh:IRI .
628
+
629
+ dsh:SchemeShape
630
+ a sh:NodeShape ;
631
+ sh:targetClass skos:ConceptScheme ;
632
+ sh:closed true ;
633
+ sh:ignoredProperties ( rdf:type ) ;
634
+ sh:property
635
+ dsh:Scheme-title ,
636
+ dsh:Scheme-hasTopConcept .
637
+
638
+ dsh:Scheme-title
639
+ a sh:PropertyShape ;
640
+ sh:path dcterms:title ;
641
+ sh:maxCount 1 .
642
+
643
+ dsh:Scheme-hasTopConcept
644
+ a sh:PropertyShape ;
645
+ sh:path skos:hasTopConcept ;
646
+ sh:nodeKind sh:IRI ;
647
+ sh:class skos:Concept .
648
+
649
+ # --- Provenance --------------------------------------------------------------
650
+
651
+ dsh:PersonShape
652
+ a sh:NodeShape ;
653
+ sh:targetClass prov:Person ;
654
+ sh:closed true ;
655
+ sh:ignoredProperties ( rdf:type ) ;
656
+ sh:property dsh:Agent-name .
657
+
658
+ dsh:OrganizationShape
659
+ a sh:NodeShape ;
660
+ sh:targetClass prov:Organization ;
661
+ sh:closed true ;
662
+ sh:ignoredProperties ( rdf:type ) ;
663
+ sh:property dsh:Agent-name .
664
+
665
+ dsh:SoftwareAgentShape
666
+ a sh:NodeShape ;
667
+ sh:targetClass prov:SoftwareAgent ;
668
+ sh:closed true ;
669
+ sh:ignoredProperties ( rdf:type ) ;
670
+ sh:property
671
+ dsh:Agent-name ,
672
+ dsh:SoftwareAgent-version .
673
+
674
+ dsh:Agent-name
675
+ a sh:PropertyShape ;
676
+ sh:path foaf:name ;
677
+ sh:minCount 1 .
678
+
679
+ dsh:SoftwareAgent-version
680
+ a sh:PropertyShape ;
681
+ sh:path graph:version ;
682
+ sh:datatype xsd:string ;
683
+ sh:maxCount 1 .
684
+
685
+ dsh:ActivityShape
686
+ a sh:NodeShape ;
687
+ sh:targetClass prov:Activity ;
688
+ sh:closed true ;
689
+ sh:ignoredProperties ( rdf:type ) ;
690
+ sh:property
691
+ dsh:Activity-wasAssociatedWith ,
692
+ dsh:Activity-qualifiedAssociation ,
693
+ dsh:Activity-filledFieldEntry ,
694
+ dsh:Activity-generated ,
695
+ dsh:Activity-used ,
696
+ dsh:Activity-endedAtTime .
697
+
698
+ dsh:Activity-wasAssociatedWith
699
+ a sh:PropertyShape ;
700
+ sh:path prov:wasAssociatedWith ;
701
+ sh:nodeKind sh:IRI .
702
+
703
+ dsh:Activity-qualifiedAssociation
704
+ a sh:PropertyShape ;
705
+ sh:path prov:qualifiedAssociation ;
706
+ sh:nodeKind sh:IRI ;
707
+ sh:class prov:Association .
708
+
709
+ # The fill activity links to one entry node per filled field (ADR 01015).
710
+ dsh:Activity-filledFieldEntry
711
+ a sh:PropertyShape ;
712
+ sh:path graph:filledFieldEntry ;
713
+ sh:nodeKind sh:IRI .
714
+
715
+ # Each filled-field entry carries the field name and (when fill recorded one)
716
+ # the model's confidence. Targeted by object position — the entry nodes are not
717
+ # separately typed, keeping the node vocabulary at two classes.
718
+ dsh:FilledFieldEntryShape
719
+ a sh:NodeShape ;
720
+ sh:targetObjectsOf graph:filledFieldEntry ;
721
+ sh:closed true ;
722
+ sh:ignoredProperties ( rdf:type ) ;
723
+ sh:property
724
+ dsh:FilledFieldEntry-name ,
725
+ dsh:FilledFieldEntry-confidence .
726
+
727
+ dsh:FilledFieldEntry-name
728
+ a sh:PropertyShape ;
729
+ sh:path graph:filledField ;
730
+ sh:datatype xsd:string ;
731
+ sh:minCount 1 ;
732
+ sh:maxCount 1 .
733
+
734
+ dsh:FilledFieldEntry-confidence
735
+ a sh:PropertyShape ;
736
+ sh:path graph:confidence ;
737
+ sh:datatype xsd:decimal ;
738
+ sh:maxCount 1 .
739
+
740
+ dsh:Activity-generated
741
+ a sh:PropertyShape ;
742
+ sh:path prov:generated ;
743
+ sh:nodeKind sh:IRI .
744
+
745
+ dsh:Activity-used
746
+ a sh:PropertyShape ;
747
+ sh:path prov:used ;
748
+ sh:nodeKind sh:IRI .
749
+
750
+ dsh:Activity-endedAtTime
751
+ a sh:PropertyShape ;
752
+ sh:path prov:endedAtTime ;
753
+ sh:datatype xsd:dateTime ;
754
+ sh:maxCount 1 .
755
+
756
+ dsh:AttributionShape
757
+ a sh:NodeShape ;
758
+ sh:targetClass prov:Attribution ;
759
+ sh:closed true ;
760
+ sh:ignoredProperties ( rdf:type ) ;
761
+ sh:property
762
+ dsh:Qualification-agent ,
763
+ dsh:Qualification-hadRole .
764
+
765
+ dsh:AssociationShape
766
+ a sh:NodeShape ;
767
+ sh:targetClass prov:Association ;
768
+ sh:closed true ;
769
+ sh:ignoredProperties ( rdf:type ) ;
770
+ sh:property
771
+ dsh:Qualification-agent ,
772
+ dsh:Qualification-hadRole .
773
+
774
+ dsh:Qualification-agent
775
+ a sh:PropertyShape ;
776
+ sh:path prov:agent ;
777
+ sh:nodeKind sh:IRI ;
778
+ sh:minCount 1 ;
779
+ sh:maxCount 1 .
780
+
781
+ dsh:Qualification-hadRole
782
+ a sh:PropertyShape ;
783
+ sh:path prov:hadRole ;
784
+ sh:nodeKind sh:IRI ;
785
+ sh:maxCount 1 .