@starci/skills 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/INDEX.md +74 -0
  2. package/INDEX.vi.md +75 -0
  3. package/README.md +44 -0
  4. package/README.vi.md +43 -0
  5. package/SKILL.md +135 -0
  6. package/SKILL.vi.md +128 -0
  7. package/alias/INDEX.md +104 -0
  8. package/alias/INDEX.vi.md +104 -0
  9. package/alias/alias.json +297 -0
  10. package/bin/starci-skills.mjs +219 -0
  11. package/knowledge/INDEX.md +22 -0
  12. package/knowledge/INDEX.vi.md +22 -0
  13. package/knowledge/grammars/starci/DNA.md +146 -0
  14. package/knowledge/grammars/starci/DNA.vi.md +146 -0
  15. package/knowledge/grammars/starci/INDEX.md +25 -0
  16. package/knowledge/grammars/starci/INDEX.vi.md +25 -0
  17. package/knowledge/grammars/starci/family.md +50 -0
  18. package/knowledge/grammars/starci/family.vi.md +50 -0
  19. package/knowledge/grammars/starci/idioms.md +120 -0
  20. package/knowledge/grammars/starci/idioms.vi.md +121 -0
  21. package/knowledge/grammars/starci/playbook.md +36 -0
  22. package/knowledge/grammars/starci/playbook.vi.md +35 -0
  23. package/knowledge/patterns/be/INDEX.md +29 -0
  24. package/knowledge/patterns/be/INDEX.vi.md +29 -0
  25. package/knowledge/patterns/be/comment.md +80 -0
  26. package/knowledge/patterns/be/comment.vi.md +80 -0
  27. package/knowledge/patterns/be/error.md +86 -0
  28. package/knowledge/patterns/be/error.vi.md +86 -0
  29. package/knowledge/patterns/be/folder.md +87 -0
  30. package/knowledge/patterns/be/folder.vi.md +86 -0
  31. package/knowledge/patterns/be/function.md +80 -0
  32. package/knowledge/patterns/be/function.vi.md +80 -0
  33. package/knowledge/patterns/be/imports.md +79 -0
  34. package/knowledge/patterns/be/imports.vi.md +79 -0
  35. package/knowledge/patterns/be/naming.md +87 -0
  36. package/knowledge/patterns/be/naming.vi.md +87 -0
  37. package/knowledge/patterns/be/test.md +79 -0
  38. package/knowledge/patterns/be/test.vi.md +79 -0
  39. package/knowledge/patterns/be/typing.md +73 -0
  40. package/knowledge/patterns/be/typing.vi.md +73 -0
  41. package/knowledge/patterns/fe/INDEX.md +29 -0
  42. package/knowledge/patterns/fe/INDEX.vi.md +29 -0
  43. package/knowledge/patterns/fe/comment.md +70 -0
  44. package/knowledge/patterns/fe/comment.vi.md +70 -0
  45. package/knowledge/patterns/fe/error.md +61 -0
  46. package/knowledge/patterns/fe/error.vi.md +61 -0
  47. package/knowledge/patterns/fe/folder.md +98 -0
  48. package/knowledge/patterns/fe/folder.vi.md +95 -0
  49. package/knowledge/patterns/fe/function.md +70 -0
  50. package/knowledge/patterns/fe/function.vi.md +70 -0
  51. package/knowledge/patterns/fe/imports.md +87 -0
  52. package/knowledge/patterns/fe/imports.vi.md +87 -0
  53. package/knowledge/patterns/fe/naming.md +77 -0
  54. package/knowledge/patterns/fe/naming.vi.md +77 -0
  55. package/knowledge/patterns/fe/test.md +73 -0
  56. package/knowledge/patterns/fe/test.vi.md +73 -0
  57. package/knowledge/patterns/fe/typing.md +67 -0
  58. package/knowledge/patterns/fe/typing.vi.md +67 -0
  59. package/knowledge/ui/INDEX.md +101 -0
  60. package/knowledge/ui/INDEX.vi.md +101 -0
  61. package/knowledge/ui/composition/INDEX.md +60 -0
  62. package/knowledge/ui/composition/INDEX.vi.md +63 -0
  63. package/knowledge/ui/composition/accent.md +73 -0
  64. package/knowledge/ui/composition/accent.vi.md +74 -0
  65. package/knowledge/ui/composition/action.md +55 -0
  66. package/knowledge/ui/composition/action.vi.md +56 -0
  67. package/knowledge/ui/composition/coverage.md +37 -0
  68. package/knowledge/ui/composition/coverage.vi.md +37 -0
  69. package/knowledge/ui/composition/cta.md +79 -0
  70. package/knowledge/ui/composition/cta.vi.md +79 -0
  71. package/knowledge/ui/composition/feedback.md +55 -0
  72. package/knowledge/ui/composition/feedback.vi.md +56 -0
  73. package/knowledge/ui/composition/hierarchy.md +83 -0
  74. package/knowledge/ui/composition/hierarchy.vi.md +82 -0
  75. package/knowledge/ui/composition/layout.md +91 -0
  76. package/knowledge/ui/composition/layout.vi.md +93 -0
  77. package/knowledge/ui/composition/responsive.md +67 -0
  78. package/knowledge/ui/composition/responsive.vi.md +67 -0
  79. package/knowledge/ui/composition/state.md +105 -0
  80. package/knowledge/ui/composition/state.vi.md +106 -0
  81. package/knowledge/ui/presentation/INDEX.md +94 -0
  82. package/knowledge/ui/presentation/INDEX.vi.md +69 -0
  83. package/knowledge/ui/presentation/boundary.md +170 -0
  84. package/knowledge/ui/presentation/boundary.vi.md +169 -0
  85. package/knowledge/ui/presentation/font.md +155 -0
  86. package/knowledge/ui/presentation/font.vi.md +156 -0
  87. package/knowledge/ui/presentation/gap.md +181 -0
  88. package/knowledge/ui/presentation/gap.vi.md +181 -0
  89. package/knowledge/ui/presentation/margin.md +168 -0
  90. package/knowledge/ui/presentation/margin.vi.md +171 -0
  91. package/knowledge/ui/presentation/measure.md +174 -0
  92. package/knowledge/ui/presentation/measure.vi.md +178 -0
  93. package/knowledge/ui/presentation/overflow.md +142 -0
  94. package/knowledge/ui/presentation/overflow.vi.md +142 -0
  95. package/knowledge/ui/presentation/padding.md +293 -0
  96. package/knowledge/ui/presentation/padding.vi.md +292 -0
  97. package/knowledge/ui/presentation/surface.md +166 -0
  98. package/knowledge/ui/presentation/surface.vi.md +166 -0
  99. package/knowledge/ui/presentation/text-flow.md +123 -0
  100. package/knowledge/ui/presentation/text-flow.vi.md +123 -0
  101. package/knowledge/ui/presentation/tone.md +114 -0
  102. package/knowledge/ui/presentation/tone.vi.md +113 -0
  103. package/knowledge/ui/proof/INDEX.md +55 -0
  104. package/knowledge/ui/proof/INDEX.vi.md +55 -0
  105. package/knowledge/ui/proof/accessibility.md +67 -0
  106. package/knowledge/ui/proof/accessibility.vi.md +68 -0
  107. package/knowledge/ui/proof/contrast.md +58 -0
  108. package/knowledge/ui/proof/contrast.vi.md +57 -0
  109. package/knowledge/ui/proof/focus.md +76 -0
  110. package/knowledge/ui/proof/focus.vi.md +76 -0
  111. package/knowledge/ui/proof/motion.md +63 -0
  112. package/knowledge/ui/proof/motion.vi.md +64 -0
  113. package/knowledge/ui/proof/render-truth.md +63 -0
  114. package/knowledge/ui/proof/render-truth.vi.md +63 -0
  115. package/operators/INDEX.md +199 -0
  116. package/operators/INDEX.vi.md +199 -0
  117. package/operators/architecture-decide/errors.json +115 -0
  118. package/operators/architecture-decide/operator.json +20 -0
  119. package/operators/architecture-decide/operator.md +133 -0
  120. package/operators/architecture-decide/operator.vi.md +130 -0
  121. package/operators/architecture-decide/self-test.mjs +221 -0
  122. package/operators/architecture-decide/validate.mjs +112 -0
  123. package/operators/backend-source-apply/errors.json +66 -0
  124. package/operators/backend-source-apply/operator.json +20 -0
  125. package/operators/backend-source-apply/operator.md +189 -0
  126. package/operators/backend-source-apply/operator.vi.md +185 -0
  127. package/operators/backend-source-apply/self-test.mjs +257 -0
  128. package/operators/backend-source-apply/validate.mjs +240 -0
  129. package/operators/business-decide/errors.json +78 -0
  130. package/operators/business-decide/operator.json +20 -0
  131. package/operators/business-decide/operator.md +176 -0
  132. package/operators/business-decide/operator.vi.md +174 -0
  133. package/operators/business-decide/self-test.mjs +225 -0
  134. package/operators/business-decide/validate.mjs +277 -0
  135. package/operators/content-generate/errors.json +106 -0
  136. package/operators/content-generate/operator.json +21 -0
  137. package/operators/content-generate/operator.md +155 -0
  138. package/operators/content-generate/operator.vi.md +155 -0
  139. package/operators/content-generate/self-test.mjs +288 -0
  140. package/operators/content-generate/validate.mjs +196 -0
  141. package/operators/errors.json +178 -0
  142. package/operators/frontend-direction-decide/errors.json +135 -0
  143. package/operators/frontend-direction-decide/operator.json +21 -0
  144. package/operators/frontend-direction-decide/operator.md +167 -0
  145. package/operators/frontend-direction-decide/operator.vi.md +167 -0
  146. package/operators/frontend-direction-decide/self-test.mjs +226 -0
  147. package/operators/frontend-direction-decide/validate.mjs +146 -0
  148. package/operators/frontend-presentation-resolve/errors.json +42 -0
  149. package/operators/frontend-presentation-resolve/operator.json +19 -0
  150. package/operators/frontend-presentation-resolve/operator.md +142 -0
  151. package/operators/frontend-presentation-resolve/operator.vi.md +140 -0
  152. package/operators/frontend-presentation-resolve/self-test.mjs +163 -0
  153. package/operators/frontend-presentation-resolve/validate.mjs +143 -0
  154. package/operators/frontend-source-apply/errors.json +30 -0
  155. package/operators/frontend-source-apply/operator.json +20 -0
  156. package/operators/frontend-source-apply/operator.md +127 -0
  157. package/operators/frontend-source-apply/operator.vi.md +126 -0
  158. package/operators/frontend-source-apply/self-test.mjs +214 -0
  159. package/operators/frontend-source-apply/validate.mjs +133 -0
  160. package/operators/frontend-surface-audit/errors.json +5 -0
  161. package/operators/frontend-surface-audit/operator.json +22 -0
  162. package/operators/frontend-surface-audit/operator.md +121 -0
  163. package/operators/frontend-surface-audit/operator.vi.md +121 -0
  164. package/operators/frontend-surface-audit/self-test.mjs +185 -0
  165. package/operators/frontend-surface-audit/validate.mjs +127 -0
  166. package/operators/git-publish/errors.json +54 -0
  167. package/operators/git-publish/operator.json +20 -0
  168. package/operators/git-publish/operator.md +180 -0
  169. package/operators/git-publish/operator.vi.md +178 -0
  170. package/operators/git-publish/self-test.mjs +177 -0
  171. package/operators/git-publish/validate.mjs +106 -0
  172. package/operators/platform-operate/errors.json +90 -0
  173. package/operators/platform-operate/operator.json +22 -0
  174. package/operators/platform-operate/operator.md +162 -0
  175. package/operators/platform-operate/operator.vi.md +160 -0
  176. package/operators/platform-operate/self-test.mjs +202 -0
  177. package/operators/platform-operate/validate.mjs +193 -0
  178. package/operators/quality-verify/errors.json +54 -0
  179. package/operators/quality-verify/operator.json +20 -0
  180. package/operators/quality-verify/operator.md +185 -0
  181. package/operators/quality-verify/operator.vi.md +177 -0
  182. package/operators/quality-verify/self-test.mjs +210 -0
  183. package/operators/quality-verify/validate.mjs +197 -0
  184. package/operators/release-deploy/errors.json +158 -0
  185. package/operators/release-deploy/operator.json +23 -0
  186. package/operators/release-deploy/operator.md +183 -0
  187. package/operators/release-deploy/operator.vi.md +181 -0
  188. package/operators/release-deploy/self-test.mjs +235 -0
  189. package/operators/release-deploy/validate.mjs +129 -0
  190. package/operators/uat-verify/errors.json +78 -0
  191. package/operators/uat-verify/operator.json +25 -0
  192. package/operators/uat-verify/operator.md +162 -0
  193. package/operators/uat-verify/operator.vi.md +161 -0
  194. package/operators/uat-verify/self-test.mjs +270 -0
  195. package/operators/uat-verify/validate.mjs +202 -0
  196. package/operators/workspace-bind/errors.json +90 -0
  197. package/operators/workspace-bind/operator.json +21 -0
  198. package/operators/workspace-bind/operator.md +148 -0
  199. package/operators/workspace-bind/operator.vi.md +148 -0
  200. package/operators/workspace-bind/self-test.mjs +205 -0
  201. package/operators/workspace-bind/validate.mjs +152 -0
  202. package/package.json +50 -0
  203. package/readiness/initialization/workspaces/commit-policy.json +91 -0
  204. package/readiness/initialization/workspaces/config.schema.json +35 -0
  205. package/readiness/initialization/workspaces/device-state.schema.json +54 -0
  206. package/readiness/initialization/workspaces/local-route.schema.json +206 -0
  207. package/readiness/initialization/workspaces/portable-route.schema.json +200 -0
  208. package/resources/INDEX.md +96 -0
  209. package/resources/INDEX.vi.md +99 -0
  210. package/resources/agents/profiles/claude.json +131 -0
  211. package/resources/agents/profiles/openai.json +131 -0
  212. package/resources/orchestrator.json +71 -0
  213. package/resources/tools.json +85 -0
  214. package/routing.json +272 -0
  215. package/scripts/alias-registry.mjs +31 -0
  216. package/scripts/device-state.mjs +497 -0
  217. package/scripts/device-state.spec.mjs +18 -0
  218. package/scripts/errors-registry.mjs +68 -0
  219. package/scripts/generate-alias-doc.mjs +66 -0
  220. package/scripts/generate-grammar-dna.mjs +387 -0
  221. package/scripts/generate-operators-index.mjs +95 -0
  222. package/scripts/generate-presentation-owned.mjs +681 -0
  223. package/scripts/install-cli.spec.mjs +74 -0
  224. package/scripts/json-schema.mjs +94 -0
  225. package/scripts/operator-md.mjs +96 -0
  226. package/scripts/run-operator-self-tests.mjs +36 -0
  227. package/scripts/validate-alias.mjs +165 -0
  228. package/scripts/validate-defaults.mjs +72 -0
  229. package/scripts/validate-knowledge-citations.mjs +90 -0
  230. package/scripts/validate-operator.mjs +125 -0
  231. package/scripts/validate-request.mjs +80 -0
  232. package/scripts/validate-resources.mjs +117 -0
  233. package/scripts/validate-response.mjs +141 -0
  234. package/scripts/validate-routing.mjs +91 -0
  235. package/scripts/validate-step.mjs +50 -0
  236. package/scripts/validate-templates.mjs +226 -0
  237. package/scripts/validate-templates.spec.mjs +144 -0
  238. package/scripts/validate-workflows.mjs +106 -0
  239. package/scripts/workspace-portable.mjs +389 -0
  240. package/scripts/workspace-portable.spec.mjs +246 -0
  241. package/templates/README.md +47 -0
  242. package/templates/README.vi.md +45 -0
  243. package/templates/changes.example.md +27 -0
  244. package/templates/grammars.template.md +34 -0
  245. package/templates/kinds/architecture-decision.contract.json +14 -0
  246. package/templates/kinds/architecture-decision.skeleton.md +52 -0
  247. package/templates/kinds/backend-source-application.contract.json +10 -0
  248. package/templates/kinds/backend-source-application.skeleton.md +34 -0
  249. package/templates/kinds/business-promise-authority.contract.json +13 -0
  250. package/templates/kinds/business-promise-authority.skeleton.md +67 -0
  251. package/templates/kinds/capture.schema.json +33 -0
  252. package/templates/kinds/changes.contract.json +10 -0
  253. package/templates/kinds/changes.skeleton.md +26 -0
  254. package/templates/kinds/checks.schema.json +44 -0
  255. package/templates/kinds/claims.schema.json +165 -0
  256. package/templates/kinds/conformance.schema.json +15 -0
  257. package/templates/kinds/content-brief.contract.json +12 -0
  258. package/templates/kinds/content-brief.skeleton.md +45 -0
  259. package/templates/kinds/content-generation-receipt.contract.json +11 -0
  260. package/templates/kinds/content-generation-receipt.skeleton.md +40 -0
  261. package/templates/kinds/content-review.contract.json +11 -0
  262. package/templates/kinds/content-review.skeleton.md +45 -0
  263. package/templates/kinds/contract.schema.json +28 -0
  264. package/templates/kinds/coverage-matrix.schema.json +86 -0
  265. package/templates/kinds/coverage.schema.json +62 -0
  266. package/templates/kinds/current-state.schema.json +40 -0
  267. package/templates/kinds/delta.schema.json +95 -0
  268. package/templates/kinds/e2e.schema.json +63 -0
  269. package/templates/kinds/frontend-direction-decision.contract.json +93 -0
  270. package/templates/kinds/frontend-direction-decision.skeleton.md +68 -0
  271. package/templates/kinds/frontend-presentation-resolution.contract.json +11 -0
  272. package/templates/kinds/frontend-presentation-resolution.skeleton.md +32 -0
  273. package/templates/kinds/frontend-source-application.contract.json +10 -0
  274. package/templates/kinds/frontend-source-application.skeleton.md +30 -0
  275. package/templates/kinds/frontend-surface-audit.contract.json +52 -0
  276. package/templates/kinds/frontend-surface-audit.skeleton.md +32 -0
  277. package/templates/kinds/gate-result.schema.json +64 -0
  278. package/templates/kinds/git-publication.contract.json +82 -0
  279. package/templates/kinds/git-publication.skeleton.md +61 -0
  280. package/templates/kinds/independent-critique.contract.json +9 -0
  281. package/templates/kinds/independent-critique.skeleton.md +28 -0
  282. package/templates/kinds/inventory.schema.json +35 -0
  283. package/templates/kinds/model.schema.json +99 -0
  284. package/templates/kinds/mutations.schema.json +65 -0
  285. package/templates/kinds/platform-operation-receipt.contract.json +76 -0
  286. package/templates/kinds/platform-operation-receipt.skeleton.md +54 -0
  287. package/templates/kinds/probes.schema.json +130 -0
  288. package/templates/kinds/proof.schema.json +17 -0
  289. package/templates/kinds/quality-verification.contract.json +87 -0
  290. package/templates/kinds/quality-verification.skeleton.md +58 -0
  291. package/templates/kinds/release-deployment.contract.json +85 -0
  292. package/templates/kinds/release-deployment.skeleton.md +67 -0
  293. package/templates/kinds/route.schema.json +293 -0
  294. package/templates/kinds/stack-model.schema.json +90 -0
  295. package/templates/kinds/uat-capture.schema.json +35 -0
  296. package/templates/kinds/uat-flow-verification.contract.json +11 -0
  297. package/templates/kinds/uat-flow-verification.skeleton.md +47 -0
  298. package/templates/kinds/uat-snapshot.schema.json +96 -0
  299. package/templates/kinds/uat-verdicts.schema.json +41 -0
  300. package/templates/kinds/ui-coverage.schema.json +77 -0
  301. package/templates/kinds/verdicts.schema.json +39 -0
  302. package/templates/kinds/workspace-route-binding.contract.json +12 -0
  303. package/templates/kinds/workspace-route-binding.skeleton.md +60 -0
  304. package/templates/kinds/writes.schema.json +37 -0
  305. package/templates/operator.template.md +73 -0
  306. package/templates/patterns.template.md +31 -0
  307. package/templates/step/request.schema.json +42 -0
  308. package/templates/step/response.schema.json +144 -0
  309. package/templates/ui-composition.template.md +36 -0
  310. package/templates/ui-presentation.template.md +57 -0
  311. package/templates/ui-proof.template.md +34 -0
  312. package/workflows/README.md +37 -0
  313. package/workflows/README.vi.md +37 -0
  314. package/workflows/backend-feature.json +59 -0
  315. package/workflows/content-unit.json +19 -0
  316. package/workflows/frontend-new-surface.json +81 -0
  317. package/workflows/frontend-reconstruct.json +67 -0
  318. package/workflows/frontend-refine.json +67 -0
  319. package/workflows/frontend-with-uat.json +78 -0
  320. package/workflows/full-feature.json +104 -0
  321. package/workflows/release.json +29 -0
@@ -0,0 +1,15 @@
1
+ {
2
+ "$id": "kind:conformance",
3
+ "title": "One measured verdict for one declared facet of one operation; the file is named <operationId>.<facet>.json so silence about a facet is a missing file rather than a missing sentence.",
4
+ "type": "object",
5
+ "additionalProperties": false,
6
+ "required": ["operationId", "facet", "verdict", "evidenceRef", "statement", "contractFingerprint"],
7
+ "properties": {
8
+ "operationId": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
9
+ "facet": { "enum": ["transport", "writer", "store", "transaction", "idempotency", "migration", "exception-identity", "authorization", "concurrency"] },
10
+ "verdict": { "enum": ["conforms", "widened", "narrowed"] },
11
+ "evidenceRef": { "type": "string", "minLength": 1, "maxLength": 1024 },
12
+ "statement": { "type": "string", "minLength": 1, "maxLength": 4096 },
13
+ "contractFingerprint": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" }
14
+ }
15
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "kind": "content-brief",
3
+ "title": "^# content-brief — [a-z0-9][a-z0-9-]*$",
4
+ "sections": [
5
+ { "heading": "^## Binding$", "table": "| Field | Value |", "rows": ["Unit", "Objective", "Audience", "Fingerprint"], "cell": { "Value": "\\S" } },
6
+ { "heading": "^## Learner inputs$", "table": "| Input | Statement |", "cell": { "Statement": "\\S" } },
7
+ { "heading": "^## Outcomes$", "table": "| Outcome | Statement |", "minRows": 1, "cell": { "Outcome": "^`[a-z0-9][a-z0-9-]*`$", "Statement": "\\S" } },
8
+ { "heading": "^## Claims$", "table": "| Claim | Statement |", "minRows": 1, "cell": { "Claim": "^`[a-z0-9][a-z0-9-]*`$", "Statement": "\\S" } },
9
+ { "heading": "^## Examples$", "table": "| Example | Statement |", "cell": { "Statement": "\\S" } },
10
+ { "heading": "^## Dispositions$", "table": "| Kind | Target | Statement |", "cell": { "Kind": "^(add|change|remove)$", "Statement": "\\S" } }
11
+ ]
12
+ }
@@ -0,0 +1,45 @@
1
+ # content-brief — unit-id
2
+
3
+ One paragraph: what this unit teaches and to whom. Written by `content.generate` as
4
+ `response/brief.md` in one fresh execution before anything else exists, then fingerprinted. Every
5
+ edition, image, and track after it is measured against this page, and nothing downstream may add an
6
+ outcome or a claim it does not publish.
7
+
8
+ ## Binding
9
+
10
+ | Field | Value |
11
+ | --- | --- |
12
+ | Unit | `unit-id` |
13
+ | Objective | the curriculum objective this unit serves |
14
+ | Audience | the learner the course already guarantees the prerequisites for |
15
+ | Fingerprint | `sha256:0000000000000000000000000000000000000000000000000000000000000000` |
16
+
17
+ ## Learner inputs
18
+
19
+ | Input | Statement |
20
+ | --- | --- |
21
+ | prerequisite | what the learner already knows when the unit starts |
22
+
23
+ ## Outcomes
24
+
25
+ | Outcome | Statement |
26
+ | --- | --- |
27
+ | `outcome-id` | what the learner can observably do afterwards |
28
+
29
+ ## Claims
30
+
31
+ | Claim | Statement |
32
+ | --- | --- |
33
+ | `claim-id` | the statement a visual is allowed to encode |
34
+
35
+ ## Examples
36
+
37
+ | Example | Statement |
38
+ | --- | --- |
39
+ | worked-example | the example the editions may use |
40
+
41
+ ## Dispositions
42
+
43
+ | Kind | Target | Statement |
44
+ | --- | --- | --- |
45
+ | add | — | what this unit adds; a change or remove names what it acts on |
@@ -0,0 +1,11 @@
1
+ {
2
+ "kind": "content-generation-receipt",
3
+ "title": "^# content-generation-receipt — [a-z0-9][a-z0-9-]*$",
4
+ "sections": [
5
+ { "heading": "^## Binding$", "table": "| Field | Value |", "rows": ["Unit", "Brief fingerprint", "Verdict", "Round", "Source head"], "cell": { "Value": "\\S" } },
6
+ { "heading": "^## Editions$", "table": "| Language | Article | Outcomes covered |", "minRows": 1, "cell": { "Language": "^[a-z]{2}(?:-[A-Z]{2})?$", "Article": "\\S", "Outcomes covered": "\\S" } },
7
+ { "heading": "^## Approved artifacts$", "table": "| Artifact | Stage |", "cell": { "Artifact": "\\S", "Stage": "^(brief|write|image|code|e2e|review)$" } },
8
+ { "heading": "^## Findings$", "table": "| Code | Stage | Ref | Statement |", "cell": { "Code": "^`(STAGE_DISABLED|DISPOSITION_APPLIED|REVISION_REQUIRED|PRODUCER_RATIONALE_WITHHELD)`$", "Stage": "^(brief|write|image|code|e2e|review)$", "Statement": "\\S" } },
9
+ { "heading": "^## Fallbacks taken$", "table": "| Code | Action |", "cell": { "Code": "^`[A-Z][A-Z0-9_]*`$", "Action": "\\S" } }
10
+ ]
11
+ }
@@ -0,0 +1,40 @@
1
+ # content-generation-receipt — unit-id
2
+
3
+ One paragraph: which unit was built, against which frozen brief, and what the independent critique
4
+ concluded. Written by `content.generate` as `response/response.md`; the machine record of the
5
+ editions, the image, the tracks, and the executable check lives beside it in
6
+ `response/data/production.json`.
7
+
8
+ ## Binding
9
+
10
+ | Field | Value |
11
+ | --- | --- |
12
+ | Unit | `unit-id` |
13
+ | Brief fingerprint | `sha256:0000000000000000000000000000000000000000000000000000000000000000` |
14
+ | Verdict | approved |
15
+ | Round | 1 |
16
+ | Source head | `0000000000000000000000000000000000000000` |
17
+
18
+ ## Editions
19
+
20
+ | Language | Article | Outcomes covered |
21
+ | --- | --- | --- |
22
+ | vi | `response/artifacts/article.vi.md` | `outcome-id` |
23
+
24
+ ## Approved artifacts
25
+
26
+ | Artifact | Stage |
27
+ | --- | --- |
28
+ | `response/artifacts/article.vi.md` | write |
29
+
30
+ ## Findings
31
+
32
+ | Code | Stage | Ref | Statement |
33
+ | --- | --- | --- | --- |
34
+ | `STAGE_DISABLED` | image | — | the image stage was disabled for this unit |
35
+
36
+ ## Fallbacks taken
37
+
38
+ | Code | Action |
39
+ | --- | --- |
40
+ | `REVIEW_REVISION_REQUIRED` | the artifacts the review named were revised and the review exchange was reopened |
@@ -0,0 +1,11 @@
1
+ {
2
+ "kind": "content-review",
3
+ "title": "^# content-review — [a-z0-9][a-z0-9-]*$",
4
+ "sections": [
5
+ { "heading": "^## Execution$", "table": "| Field | Value |", "rows": ["Reviewer execution", "Inherited turns", "Producer rationale", "Round"], "cell": { "Value": "\\S" } },
6
+ { "heading": "^## Received$", "table": "| Artifact | Kind |", "minRows": 1, "cell": { "Artifact": "\\S", "Kind": "^(brief|article|image|prompt|track|assertions)$" } },
7
+ { "heading": "^## Scores$", "table": "| Dimension | Score |", "exactRows": 7, "cell": { "Dimension": "^(correctness|pedagogy|interview-value|language|visual-fidelity|code-quality|e2e-proof)$", "Score": "^([0-9]{1,2}|100|—)$" } },
8
+ { "heading": "^## Findings$", "table": "| Owning stage | Severity | Statement | Evidence |", "cell": { "Owning stage": "^(brief|write|image|code|e2e|critique)$", "Severity": "^(error|improvement)$", "Evidence": "\\S" } },
9
+ { "heading": "^## Verdict$", "table": "| Field | Value |", "rows": ["Verdict"], "cell": { "Value": "\\S" } }
10
+ ]
11
+ }
@@ -0,0 +1,45 @@
1
+ # content-review — unit-id
2
+
3
+ One paragraph: what the reviewer read and what it concluded. Written by the nested `review`
4
+ exchange of `content.generate` as `review/response/review.md`, by a fresh execution that inherits
5
+ no turns, never produced any of the artifacts, and received them without the producer's rationale.
6
+
7
+ ## Execution
8
+
9
+ | Field | Value |
10
+ | --- | --- |
11
+ | Reviewer execution | `exec://critique-0000` |
12
+ | Inherited turns | none |
13
+ | Producer rationale | withheld |
14
+ | Round | 1 |
15
+
16
+ ## Received
17
+
18
+ | Artifact | Kind |
19
+ | --- | --- |
20
+ | `response/brief.md` | brief |
21
+ | `response/artifacts/article.vi.md` | article |
22
+
23
+ ## Scores
24
+
25
+ | Dimension | Score |
26
+ | --- | --- |
27
+ | correctness | 90 |
28
+ | pedagogy | 88 |
29
+ | interview-value | 86 |
30
+ | language | 92 |
31
+ | visual-fidelity | — |
32
+ | code-quality | — |
33
+ | e2e-proof | — |
34
+
35
+ ## Findings
36
+
37
+ | Owning stage | Severity | Statement | Evidence |
38
+ | --- | --- | --- | --- |
39
+ | write | improvement | what could be better, owned by exactly one stage that ran | `response/artifacts/article.vi.md:40` |
40
+
41
+ ## Verdict
42
+
43
+ | Field | Value |
44
+ | --- | --- |
45
+ | Verdict | approved |
@@ -0,0 +1,28 @@
1
+ {
2
+ "$id": "kinds:contract",
3
+ "type": "object",
4
+ "additionalProperties": false,
5
+ "required": ["kind", "title", "sections"],
6
+ "properties": {
7
+ "kind": { "type": "string", "pattern": "^[a-z][a-z0-9-]*$" },
8
+ "example": { "type": "string", "pattern": "^templates/[A-Za-z0-9_./-]+\\.md$" },
9
+ "title": { "type": "string", "minLength": 1 },
10
+ "sections": {
11
+ "type": "array",
12
+ "minItems": 1,
13
+ "items": {
14
+ "type": "object",
15
+ "additionalProperties": false,
16
+ "required": ["heading"],
17
+ "properties": {
18
+ "heading": { "type": "string", "pattern": "^\\^## " },
19
+ "table": { "type": "string", "pattern": "^\\| .+ \\|$" },
20
+ "minRows": { "type": "integer", "minimum": 0 },
21
+ "exactRows": { "type": "integer", "minimum": 0 },
22
+ "rows": { "type": "array", "items": { "type": "string", "minLength": 1 }, "uniqueItems": true },
23
+ "cell": { "type": "object", "additionalProperties": { "type": "string", "minLength": 1 } }
24
+ }
25
+ }
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,86 @@
1
+ {
2
+ "$id": "kind:coverage-matrix",
3
+ "type": "object",
4
+ "additionalProperties": false,
5
+ "required": ["featureId", "fingerprint", "dimensions", "discoveredConsumers", "discoveredLifecycleBranches", "rows"],
6
+ "properties": {
7
+ "featureId": { "$ref": "#/$defs/identifier" },
8
+ "fingerprint": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
9
+ "dimensions": {
10
+ "type": "array",
11
+ "minItems": 1,
12
+ "maxItems": 64,
13
+ "uniqueItems": true,
14
+ "items": { "$ref": "#/$defs/coverageDimension" }
15
+ },
16
+ "discoveredConsumers": {
17
+ "type": "array",
18
+ "maxItems": 256,
19
+ "items": {
20
+ "type": "object",
21
+ "additionalProperties": false,
22
+ "required": ["consumerId", "dimension", "sourceRef"],
23
+ "properties": {
24
+ "consumerId": { "$ref": "#/$defs/identifier" },
25
+ "dimension": { "$ref": "#/$defs/coverageDimension" },
26
+ "sourceRef": { "type": "string", "minLength": 1 }
27
+ }
28
+ }
29
+ },
30
+ "discoveredLifecycleBranches": {
31
+ "type": "array",
32
+ "maxItems": 32,
33
+ "uniqueItems": true,
34
+ "items": { "$ref": "#/$defs/coverageDimension" }
35
+ },
36
+ "rows": {
37
+ "type": "array",
38
+ "minItems": 1,
39
+ "maxItems": 64,
40
+ "items": { "$ref": "#/$defs/coverageRow" }
41
+ }
42
+ },
43
+ "$defs": {
44
+ "identifier": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
45
+ "nullableRef": {
46
+ "oneOf": [{ "type": "string", "minLength": 1, "maxLength": 1024 }, { "type": "null" }]
47
+ },
48
+ "identifierArray": {
49
+ "type": "array",
50
+ "maxItems": 256,
51
+ "uniqueItems": true,
52
+ "items": { "$ref": "#/$defs/identifier" }
53
+ },
54
+ "coverageDimension": { "$ref": "#/$defs/identifier" },
55
+ "coverageRow": {
56
+ "type": "object",
57
+ "additionalProperties": false,
58
+ "required": [
59
+ "dimension",
60
+ "disposition",
61
+ "statement",
62
+ "enforcementOwner",
63
+ "sourceRef",
64
+ "positiveProofRef",
65
+ "negativeProofRef",
66
+ "deferralRef",
67
+ "consumerIds",
68
+ "claimIds"
69
+ ],
70
+ "properties": {
71
+ "dimension": { "$ref": "#/$defs/coverageDimension" },
72
+ "disposition": { "enum": ["preserve", "replace", "retire", "defer", "not-applicable"] },
73
+ "statement": { "type": "string", "minLength": 1, "maxLength": 4096 },
74
+ "enforcementOwner": {
75
+ "oneOf": [{ "type": "string", "minLength": 1, "maxLength": 256 }, { "type": "null" }]
76
+ },
77
+ "sourceRef": { "$ref": "#/$defs/nullableRef" },
78
+ "positiveProofRef": { "$ref": "#/$defs/nullableRef" },
79
+ "negativeProofRef": { "$ref": "#/$defs/nullableRef" },
80
+ "deferralRef": { "$ref": "#/$defs/nullableRef" },
81
+ "consumerIds": { "$ref": "#/$defs/identifierArray" },
82
+ "claimIds": { "$ref": "#/$defs/identifierArray" }
83
+ }
84
+ }
85
+ }
86
+ }
@@ -0,0 +1,62 @@
1
+ {
2
+ "$id": "kind:coverage",
3
+ "type": "object",
4
+ "additionalProperties": false,
5
+ "required": [
6
+ "statements",
7
+ "lines",
8
+ "functions",
9
+ "branches",
10
+ "thresholds",
11
+ "evidenceRef"
12
+ ],
13
+ "properties": {
14
+ "statements": {
15
+ "$ref": "#/$defs/percentage"
16
+ },
17
+ "lines": {
18
+ "$ref": "#/$defs/percentage"
19
+ },
20
+ "functions": {
21
+ "$ref": "#/$defs/percentage"
22
+ },
23
+ "branches": {
24
+ "$ref": "#/$defs/percentage"
25
+ },
26
+ "thresholds": {
27
+ "type": "object",
28
+ "additionalProperties": false,
29
+ "required": [
30
+ "statements",
31
+ "lines",
32
+ "functions",
33
+ "branches"
34
+ ],
35
+ "properties": {
36
+ "statements": {
37
+ "$ref": "#/$defs/percentage"
38
+ },
39
+ "lines": {
40
+ "$ref": "#/$defs/percentage"
41
+ },
42
+ "functions": {
43
+ "$ref": "#/$defs/percentage"
44
+ },
45
+ "branches": {
46
+ "$ref": "#/$defs/percentage"
47
+ }
48
+ }
49
+ },
50
+ "evidenceRef": {
51
+ "type": "string",
52
+ "minLength": 1
53
+ }
54
+ },
55
+ "$defs": {
56
+ "percentage": {
57
+ "type": "number",
58
+ "minimum": 0,
59
+ "maximum": 100
60
+ }
61
+ }
62
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "$id": "kind:current-state",
3
+ "type": "object",
4
+ "additionalProperties": false,
5
+ "required": ["observedHead", "fingerprint", "components", "boundaries"],
6
+ "properties": {
7
+ "observedHead": { "type": "string", "pattern": "^[0-9a-f]{40}$" },
8
+ "fingerprint": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
9
+ "components": {
10
+ "type": "array",
11
+ "minItems": 1,
12
+ "items": {
13
+ "type": "object",
14
+ "additionalProperties": false,
15
+ "required": ["componentId", "layer", "name", "version", "evidence"],
16
+ "properties": {
17
+ "componentId": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
18
+ "layer": { "enum": ["runtime", "framework", "persistence", "communication", "build", "deployment", "operations"] },
19
+ "name": { "type": "string", "minLength": 1 },
20
+ "version": { "type": "string", "minLength": 1 },
21
+ "evidence": { "type": "string", "pattern": "^[^\\s]+(?::\\d+(?:-\\d+)?)?@[0-9a-f]{40}$" }
22
+ }
23
+ }
24
+ },
25
+ "boundaries": {
26
+ "type": "array",
27
+ "items": {
28
+ "type": "object",
29
+ "additionalProperties": false,
30
+ "required": ["boundaryId", "responsibility", "stores", "evidence"],
31
+ "properties": {
32
+ "boundaryId": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
33
+ "responsibility": { "type": "string", "minLength": 1 },
34
+ "stores": { "type": "array", "items": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" }, "uniqueItems": true },
35
+ "evidence": { "type": "string", "pattern": "^[^\\s]+(?::\\d+(?:-\\d+)?)?@[0-9a-f]{40}$" }
36
+ }
37
+ }
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,95 @@
1
+ {
2
+ "$id": "kind:delta",
3
+ "type": "object",
4
+ "additionalProperties": false,
5
+ "required": [
6
+ "serviceRef", "serviceKind", "ownerRef", "approvalRef", "planSha256",
7
+ "inventoryFingerprint", "generation", "observedAt",
8
+ "inventoriedResources", "observedPortHolders", "portClaims",
9
+ "mutableResourceRefs", "observationOnlyResourceRefs",
10
+ "allowedEffects", "appliedEffects", "capabilities", "convergence", "mutations"
11
+ ],
12
+ "properties": {
13
+ "serviceRef": { "type": "string", "minLength": 1 },
14
+ "serviceKind": { "$ref": "#/$defs/serviceKind" },
15
+ "ownerRef": { "type": "string", "minLength": 1 },
16
+ "approvalRef": { "type": "string", "minLength": 1 },
17
+ "planSha256": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
18
+ "inventoryFingerprint": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
19
+ "generation": { "type": "integer", "minimum": 0 },
20
+ "observedAt": { "type": "string", "format": "date-time" },
21
+ "inventoriedResources": {
22
+ "type": "array",
23
+ "minItems": 1,
24
+ "items": {
25
+ "type": "object",
26
+ "additionalProperties": false,
27
+ "required": ["resourceRef", "kind", "revision", "ownerRef"],
28
+ "properties": {
29
+ "resourceRef": { "type": "string", "minLength": 1 },
30
+ "kind": { "$ref": "#/$defs/serviceKind" },
31
+ "revision": { "type": "string", "minLength": 1 },
32
+ "ownerRef": { "type": "string", "minLength": 1 }
33
+ }
34
+ }
35
+ },
36
+ "observedPortHolders": { "type": "array", "items": { "$ref": "#/$defs/portHolder" } },
37
+ "portClaims": {
38
+ "type": "array",
39
+ "items": {
40
+ "type": "object",
41
+ "additionalProperties": false,
42
+ "required": ["port", "resourceRef"],
43
+ "properties": {
44
+ "port": { "type": "integer", "minimum": 1, "maximum": 65535 },
45
+ "resourceRef": { "type": "string", "minLength": 1 }
46
+ }
47
+ }
48
+ },
49
+ "mutableResourceRefs": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
50
+ "observationOnlyResourceRefs": { "type": "array", "items": { "type": "string", "minLength": 1 } },
51
+ "allowedEffects": { "type": "array", "uniqueItems": true, "items": { "$ref": "#/$defs/effect" } },
52
+ "appliedEffects": { "type": "array", "uniqueItems": true, "items": { "$ref": "#/$defs/effect" } },
53
+ "capabilities": {
54
+ "type": "array",
55
+ "items": {
56
+ "type": "object",
57
+ "additionalProperties": false,
58
+ "required": ["capability", "custodyEvidenceRef"],
59
+ "properties": {
60
+ "capability": { "enum": ["metrics:remote-write", "sonar:project-admin", "tunnel:write", "dns:write"] },
61
+ "custodyEvidenceRef": { "type": "string", "minLength": 1 }
62
+ }
63
+ }
64
+ },
65
+ "convergence": { "enum": ["converged", "already-converged"] },
66
+ "mutations": {
67
+ "type": "array",
68
+ "items": {
69
+ "type": "object",
70
+ "additionalProperties": false,
71
+ "required": ["effect", "resourceRef", "beforeRevision", "afterRevision"],
72
+ "properties": {
73
+ "effect": { "$ref": "#/$defs/effect" },
74
+ "resourceRef": { "type": "string", "minLength": 1 },
75
+ "beforeRevision": { "oneOf": [{ "type": "string", "minLength": 1 }, { "type": "null" }] },
76
+ "afterRevision": { "type": "string", "minLength": 1 }
77
+ }
78
+ }
79
+ }
80
+ },
81
+ "$defs": {
82
+ "serviceKind": { "enum": ["observability", "sonar", "tunnel"] },
83
+ "effect": { "enum": ["update-config", "restart-service", "upsert-dashboard", "update-remote-write", "create-project", "assign-profile", "assign-gate", "enforce-setting", "create-tunnel", "update-tunnel-route", "upsert-proxied-dns"] },
84
+ "portHolder": {
85
+ "type": "object",
86
+ "additionalProperties": false,
87
+ "required": ["port", "holderRef", "evidenceRef"],
88
+ "properties": {
89
+ "port": { "type": "integer", "minimum": 1, "maximum": 65535 },
90
+ "holderRef": { "type": "string", "minLength": 1 },
91
+ "evidenceRef": { "type": "string", "minLength": 1 }
92
+ }
93
+ }
94
+ }
95
+ }
@@ -0,0 +1,63 @@
1
+ {
2
+ "$id": "kind:e2e",
3
+ "title": "What the generated code did when it was actually built and run: one build record per track, one run record per executable check, and the contract fingerprint taken before and after the repair loop.",
4
+ "type": "object",
5
+ "additionalProperties": false,
6
+ "required": ["unitId", "contractFingerprintBefore", "contractFingerprintAfter", "iterations", "maxIterations", "tracks", "runs"],
7
+ "properties": {
8
+ "unitId": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
9
+ "contractFingerprintBefore": { "$ref": "#/$defs/fingerprint" },
10
+ "contractFingerprintAfter": { "$ref": "#/$defs/fingerprint" },
11
+ "iterations": { "type": "integer", "minimum": 1, "maximum": 20 },
12
+ "maxIterations": { "type": "integer", "minimum": 1, "maximum": 20 },
13
+ "tracks": {
14
+ "type": "array",
15
+ "minItems": 1,
16
+ "maxItems": 4,
17
+ "items": {
18
+ "type": "object",
19
+ "additionalProperties": false,
20
+ "required": ["language", "sourceRef", "buildCommand", "exitCode"],
21
+ "properties": {
22
+ "language": { "$ref": "#/$defs/implementationLanguage" },
23
+ "sourceRef": { "type": "string", "minLength": 1, "maxLength": 1024 },
24
+ "buildCommand": { "type": "string", "minLength": 1, "maxLength": 1024 },
25
+ "exitCode": { "type": "integer", "minimum": 0, "maximum": 255 }
26
+ }
27
+ }
28
+ },
29
+ "runs": {
30
+ "type": "array",
31
+ "minItems": 1,
32
+ "maxItems": 4,
33
+ "items": {
34
+ "type": "object",
35
+ "additionalProperties": false,
36
+ "required": ["language", "command", "exitCode", "assertions"],
37
+ "properties": {
38
+ "language": { "$ref": "#/$defs/implementationLanguage" },
39
+ "command": { "type": "string", "minLength": 1, "maxLength": 1024 },
40
+ "exitCode": { "type": "integer", "minimum": 0, "maximum": 255 },
41
+ "assertions": {
42
+ "type": "array",
43
+ "minItems": 1,
44
+ "maxItems": 64,
45
+ "items": {
46
+ "type": "object",
47
+ "additionalProperties": false,
48
+ "required": ["name", "held"],
49
+ "properties": {
50
+ "name": { "type": "string", "minLength": 1, "maxLength": 256 },
51
+ "held": { "type": "boolean" }
52
+ }
53
+ }
54
+ }
55
+ }
56
+ }
57
+ }
58
+ },
59
+ "$defs": {
60
+ "fingerprint": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
61
+ "implementationLanguage": { "type": "string", "pattern": "^[a-z][a-z0-9+#.-]*$" }
62
+ }
63
+ }
@@ -0,0 +1,93 @@
1
+ {
2
+ "kind": "frontend-direction-decision",
3
+ "title": "^# frontend-direction-decision — [a-z0-9][a-z0-9-]*$",
4
+ "sections": [
5
+ {
6
+ "heading": "^## Decision$",
7
+ "table": "| Field | Value |",
8
+ "rows": [
9
+ "Direction id",
10
+ "Target",
11
+ "Intent",
12
+ "Change level",
13
+ "Owner ceiling",
14
+ "Classification",
15
+ "Selection policy",
16
+ "Selected candidate"
17
+ ],
18
+ "cell": {
19
+ "Value": "\\S"
20
+ }
21
+ },
22
+ {
23
+ "heading": "^## Observed$",
24
+ "table": "| Item | Evidence |",
25
+ "minRows": 1,
26
+ "cell": {
27
+ "Evidence": "^`[^`]+@[0-9a-f]{7,40}`$"
28
+ }
29
+ },
30
+ {
31
+ "heading": "^## UI contract$",
32
+ "table": "| Element | Kind | Responsibility |",
33
+ "minRows": 1,
34
+ "cell": {
35
+ "Kind": "^(region|action|state|responsive|content|accessibility)$",
36
+ "Responsibility": "\\S"
37
+ }
38
+ },
39
+ {
40
+ "heading": "^## Coverage$",
41
+ "table": "| Concern | Enumerated |",
42
+ "rows": [
43
+ "Actions",
44
+ "Regions",
45
+ "States",
46
+ "Responsive"
47
+ ],
48
+ "cell": {
49
+ "Enumerated": "\\S"
50
+ }
51
+ },
52
+ {
53
+ "heading": "^## References$",
54
+ "table": "| Source | URL | Limitation |",
55
+ "cell": {
56
+ "URL": "^https?://\\S+$",
57
+ "Limitation": "\\S"
58
+ }
59
+ },
60
+ {
61
+ "heading": "^## Images$",
62
+ "table": "| Slot | Why | Claim | File |",
63
+ "cell": {
64
+ "File": "^(`response/artifacts/images/[A-Za-z0-9_.-]+`|—)$"
65
+ }
66
+ },
67
+ {
68
+ "heading": "^## Falsification$",
69
+ "table": "| Attack | Candidate | Verdict | Evidence |",
70
+ "minRows": 1,
71
+ "cell": {
72
+ "Candidate": "^`[a-z0-9][a-z0-9-]*`$",
73
+ "Verdict": "^(holds|fails)$",
74
+ "Evidence": "\\S"
75
+ }
76
+ },
77
+ {
78
+ "heading": "^## Why not the others$",
79
+ "table": "| Candidate | Rejected because |",
80
+ "cell": {
81
+ "Candidate": "^`[a-z0-9][a-z0-9-]*`$",
82
+ "Rejected because": "\\S"
83
+ }
84
+ },
85
+ {
86
+ "heading": "^## Fallbacks taken$",
87
+ "table": "| Code | Action |",
88
+ "cell": {
89
+ "Code": "^`[A-Z][A-Z0-9_]+`$"
90
+ }
91
+ }
92
+ ]
93
+ }