@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,293 @@
1
+ {
2
+ "$id": "kind:route",
3
+ "type": "object",
4
+ "additionalProperties": false,
5
+ "required": [
6
+ "project",
7
+ "role",
8
+ "portableRouteRef",
9
+ "hydratedRouteRef",
10
+ "routeFingerprint",
11
+ "identityFingerprint",
12
+ "sourceHead",
13
+ "checkout",
14
+ "gitPolicy",
15
+ "mutationReadiness",
16
+ "writeRoots",
17
+ "authorityRoots",
18
+ "runtime",
19
+ "provenanceHeadRef"
20
+ ],
21
+ "properties": {
22
+ "project": {
23
+ "$ref": "#/$defs/slug"
24
+ },
25
+ "role": {
26
+ "$ref": "#/$defs/slug"
27
+ },
28
+ "portableRouteRef": {
29
+ "type": "string",
30
+ "minLength": 1
31
+ },
32
+ "hydratedRouteRef": {
33
+ "type": "string",
34
+ "minLength": 1
35
+ },
36
+ "routeFingerprint": {
37
+ "$ref": "#/$defs/fingerprint"
38
+ },
39
+ "identityFingerprint": {
40
+ "$ref": "#/$defs/fingerprint"
41
+ },
42
+ "sourceHead": {
43
+ "$ref": "#/$defs/gitHead"
44
+ },
45
+ "checkout": {
46
+ "type": "object",
47
+ "additionalProperties": false,
48
+ "required": [
49
+ "diskPath",
50
+ "gitRoot",
51
+ "gitRepository",
52
+ "branch",
53
+ "repositoryKind",
54
+ "directory",
55
+ "sourceHead"
56
+ ],
57
+ "properties": {
58
+ "diskPath": {
59
+ "type": "string",
60
+ "minLength": 1
61
+ },
62
+ "gitRoot": {
63
+ "type": "string",
64
+ "minLength": 1
65
+ },
66
+ "gitRepository": {
67
+ "type": "string",
68
+ "minLength": 1
69
+ },
70
+ "branch": {
71
+ "type": "string",
72
+ "minLength": 1
73
+ },
74
+ "repositoryKind": {
75
+ "enum": [
76
+ "source",
77
+ "sibling"
78
+ ]
79
+ },
80
+ "directory": {
81
+ "oneOf": [
82
+ {
83
+ "type": "string",
84
+ "minLength": 1
85
+ },
86
+ {
87
+ "type": "null"
88
+ }
89
+ ]
90
+ },
91
+ "sourceHead": {
92
+ "$ref": "#/$defs/gitHead"
93
+ }
94
+ }
95
+ },
96
+ "gitPolicy": {
97
+ "type": "object",
98
+ "additionalProperties": false,
99
+ "required": [
100
+ "worktreeBranches",
101
+ "mutationBranch"
102
+ ],
103
+ "properties": {
104
+ "worktreeBranches": {
105
+ "enum": [
106
+ "forbidden",
107
+ "session-only"
108
+ ]
109
+ },
110
+ "mutationBranch": {
111
+ "type": "string",
112
+ "minLength": 1
113
+ }
114
+ }
115
+ },
116
+ "mutationReadiness": {
117
+ "enum": [
118
+ "ready",
119
+ "read-only"
120
+ ]
121
+ },
122
+ "writeRoots": {
123
+ "type": "array",
124
+ "minItems": 0,
125
+ "maxItems": 256,
126
+ "items": {
127
+ "type": "string",
128
+ "minLength": 1
129
+ },
130
+ "description": "The write roots the request declared; empty for a read-only binding (declaredWriteRoots defaults to empty)."
131
+ },
132
+ "authorityRoots": {
133
+ "type": "object",
134
+ "additionalProperties": false,
135
+ "required": [
136
+ "businesses"
137
+ ],
138
+ "properties": {
139
+ "businesses": {
140
+ "oneOf": [
141
+ {
142
+ "type": "string",
143
+ "pattern": "\\.worktrees/businesses$"
144
+ },
145
+ {
146
+ "type": "null"
147
+ }
148
+ ]
149
+ }
150
+ }
151
+ },
152
+ "runtime": {
153
+ "oneOf": [
154
+ {
155
+ "$ref": "#/$defs/runtimeConsumption"
156
+ },
157
+ {
158
+ "type": "null"
159
+ }
160
+ ]
161
+ },
162
+ "provenanceHeadRef": {
163
+ "oneOf": [
164
+ {
165
+ "type": "string",
166
+ "minLength": 1
167
+ },
168
+ {
169
+ "type": "null"
170
+ }
171
+ ]
172
+ }
173
+ },
174
+ "$defs": {
175
+ "fingerprint": {
176
+ "type": "string",
177
+ "pattern": "^sha256:[0-9a-f]{64}$"
178
+ },
179
+ "gitHead": {
180
+ "type": "string",
181
+ "pattern": "^[0-9a-f]{40}$"
182
+ },
183
+ "slug": {
184
+ "type": "string",
185
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
186
+ },
187
+ "serviceKey": {
188
+ "type": "string",
189
+ "pattern": "^[A-Za-z][A-Za-z0-9]*$"
190
+ },
191
+ "runtimeConsumption": {
192
+ "type": "object",
193
+ "additionalProperties": false,
194
+ "required": [
195
+ "ownerTaskId",
196
+ "generation",
197
+ "status",
198
+ "consumerRole",
199
+ "endpointBinding",
200
+ "endpoints"
201
+ ],
202
+ "properties": {
203
+ "ownerTaskId": {
204
+ "type": "string",
205
+ "minLength": 1
206
+ },
207
+ "generation": {
208
+ "type": "integer",
209
+ "minimum": 1
210
+ },
211
+ "status": {
212
+ "enum": [
213
+ "starting",
214
+ "ready",
215
+ "degraded",
216
+ "stopped"
217
+ ]
218
+ },
219
+ "consumerRole": {
220
+ "const": "consumer"
221
+ },
222
+ "endpointBinding": {
223
+ "type": "object",
224
+ "additionalProperties": false,
225
+ "required": [
226
+ "authority",
227
+ "project",
228
+ "application",
229
+ "services",
230
+ "authorityFingerprint"
231
+ ],
232
+ "properties": {
233
+ "authority": {
234
+ "const": "workspace-route-port-projection"
235
+ },
236
+ "project": {
237
+ "$ref": "#/$defs/slug"
238
+ },
239
+ "application": {
240
+ "$ref": "#/$defs/slug"
241
+ },
242
+ "services": {
243
+ "type": "object",
244
+ "additionalProperties": false,
245
+ "required": [
246
+ "frontend",
247
+ "api",
248
+ "identity"
249
+ ],
250
+ "properties": {
251
+ "frontend": {
252
+ "$ref": "#/$defs/serviceKey"
253
+ },
254
+ "api": {
255
+ "$ref": "#/$defs/serviceKey"
256
+ },
257
+ "identity": {
258
+ "$ref": "#/$defs/serviceKey"
259
+ }
260
+ }
261
+ },
262
+ "authorityFingerprint": {
263
+ "$ref": "#/$defs/fingerprint"
264
+ }
265
+ }
266
+ },
267
+ "endpoints": {
268
+ "type": "object",
269
+ "additionalProperties": false,
270
+ "required": [
271
+ "frontend",
272
+ "api",
273
+ "identity"
274
+ ],
275
+ "properties": {
276
+ "frontend": {
277
+ "type": "string",
278
+ "minLength": 1
279
+ },
280
+ "api": {
281
+ "type": "string",
282
+ "minLength": 1
283
+ },
284
+ "identity": {
285
+ "type": "string",
286
+ "minLength": 1
287
+ }
288
+ }
289
+ }
290
+ }
291
+ }
292
+ }
293
+ }
@@ -0,0 +1,90 @@
1
+ {
2
+ "$id": "kind:stack-model",
3
+ "type": "object",
4
+ "additionalProperties": false,
5
+ "required": ["decisionId", "selectedAlternativeId", "alternatives", "boundaries", "stores", "components"],
6
+ "$defs": {
7
+ "id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
8
+ "verdict": {
9
+ "type": "object",
10
+ "additionalProperties": false,
11
+ "required": ["axis", "verified", "evidence"],
12
+ "properties": {
13
+ "axis": { "enum": ["runtime-version", "deployable-unit", "communication-failure", "datastore-ownership", "backup-restore"] },
14
+ "verified": { "type": "boolean" },
15
+ "evidence": { "type": "string" }
16
+ }
17
+ }
18
+ },
19
+ "properties": {
20
+ "decisionId": { "$ref": "#/$defs/id" },
21
+ "selectedAlternativeId": { "$ref": "#/$defs/id" },
22
+ "alternatives": {
23
+ "type": "array",
24
+ "minItems": 1,
25
+ "maxItems": 4,
26
+ "items": {
27
+ "type": "object",
28
+ "additionalProperties": false,
29
+ "required": ["alternativeId", "status", "scores", "rejectedBecause"],
30
+ "properties": {
31
+ "alternativeId": { "$ref": "#/$defs/id" },
32
+ "status": { "enum": ["selected", "rejected"] },
33
+ "scores": { "type": "object", "additionalProperties": { "type": "number", "minimum": 0, "maximum": 5 } },
34
+ "rejectedBecause": { "type": ["string", "null"] }
35
+ }
36
+ }
37
+ },
38
+ "boundaries": {
39
+ "type": "array",
40
+ "minItems": 1,
41
+ "items": {
42
+ "type": "object",
43
+ "additionalProperties": false,
44
+ "required": ["boundaryId", "responsibility", "owner", "interfaces", "ownsData"],
45
+ "properties": {
46
+ "boundaryId": { "$ref": "#/$defs/id" },
47
+ "responsibility": { "type": "string", "minLength": 1 },
48
+ "owner": { "type": "string", "minLength": 1 },
49
+ "interfaces": { "type": "array", "items": { "type": "string", "minLength": 1 } },
50
+ "ownsData": { "type": "boolean" }
51
+ }
52
+ }
53
+ },
54
+ "stores": {
55
+ "type": "array",
56
+ "items": {
57
+ "type": "object",
58
+ "additionalProperties": false,
59
+ "required": ["storeId", "owningBoundaryId", "writers", "readers", "migrators", "transactionScope", "backup", "restore", "sharedWriteJustification"],
60
+ "properties": {
61
+ "storeId": { "$ref": "#/$defs/id" },
62
+ "owningBoundaryId": { "$ref": "#/$defs/id" },
63
+ "writers": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/id" }, "uniqueItems": true },
64
+ "readers": { "type": "array", "items": { "$ref": "#/$defs/id" }, "uniqueItems": true },
65
+ "migrators": { "type": "array", "items": { "$ref": "#/$defs/id" }, "uniqueItems": true },
66
+ "transactionScope": { "type": "string", "minLength": 1 },
67
+ "backup": { "type": "string", "minLength": 1 },
68
+ "restore": { "type": "string", "minLength": 1 },
69
+ "sharedWriteJustification": { "type": ["string", "null"] }
70
+ }
71
+ }
72
+ },
73
+ "components": {
74
+ "type": "array",
75
+ "minItems": 1,
76
+ "items": {
77
+ "type": "object",
78
+ "additionalProperties": false,
79
+ "required": ["componentId", "status", "justification", "evidence", "compatibility"],
80
+ "properties": {
81
+ "componentId": { "$ref": "#/$defs/id" },
82
+ "status": { "enum": ["existing", "added", "replaced", "removed", "replaced-candidate"] },
83
+ "justification": { "enum": ["measured-constraint", "observed-evidence", "requirement-fit", null] },
84
+ "evidence": { "type": ["string", "null"] },
85
+ "compatibility": { "type": "array", "maxItems": 5, "items": { "$ref": "#/$defs/verdict" } }
86
+ }
87
+ }
88
+ }
89
+ }
90
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "$id": "kind:uat-capture",
3
+ "type": "object",
4
+ "additionalProperties": false,
5
+ "required": ["caseId", "runId", "order", "executedAt", "screenshotRef", "loginFieldMasked", "outcome", "assertions"],
6
+ "properties": {
7
+ "caseId": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
8
+ "runId": { "type": "string", "pattern": "^[A-Za-z0-9._-]+$" },
9
+ "order": { "type": "integer", "minimum": 1 },
10
+ "executedAt": { "type": "string", "format": "date-time" },
11
+ "screenshotRef": { "type": "string", "pattern": "^response/artifacts/[A-Za-z0-9_.-]+\\.png$" },
12
+ "loginFieldMasked": {
13
+ "description": "The login field is masked in every screenshot this capture points at. A capture that cannot say so is EVIDENCE_UNAVAILABLE, never an unmasked picture.",
14
+ "const": true
15
+ },
16
+ "outcome": { "enum": ["pass", "fail"] },
17
+ "assertions": {
18
+ "type": "array",
19
+ "minItems": 1,
20
+ "maxItems": 32,
21
+ "items": {
22
+ "type": "object",
23
+ "additionalProperties": false,
24
+ "required": ["assertionId", "lane", "observed", "evidenceRef", "outcome"],
25
+ "properties": {
26
+ "assertionId": { "type": "string", "minLength": 1 },
27
+ "lane": { "enum": ["behavior", "ux", "ui"] },
28
+ "observed": { "type": "string", "minLength": 1 },
29
+ "evidenceRef": { "type": "string", "minLength": 1 },
30
+ "outcome": { "enum": ["pass", "fail"] }
31
+ }
32
+ }
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "kind": "uat-flow-verification",
3
+ "title": "^# uat-flow-verification — [a-z0-9][a-z0-9-]*/[a-z0-9][a-z0-9-]*$",
4
+ "sections": [
5
+ { "heading": "^## Admission$", "table": "| Kind | Ref | Commit |", "exactRows": 2, "rows": ["frontend-surface-audit", "quality-verification"], "cell": { "Kind": "^`(frontend-surface-audit|quality-verification)`$", "Ref": "\\S", "Commit": "^`[0-9a-f]{40}`$" } },
6
+ { "heading": "^## Snapshot$", "table": "| Field | Value |", "rows": ["Run", "Requested by", "Feature", "Flow", "Commit", "Snapshot", "Namespace", "Credential", "Run record", "Latest"], "cell": { "Value": "\\S" } },
7
+ { "heading": "^## Cases$", "table": "| Case | Order | Assertions | Capture | Screenshot | Outcome |", "minRows": 1, "cell": { "Order": "^[1-9][0-9]*$", "Assertions": "\\S", "Capture": "^`response/data/captures/[A-Za-z0-9_.-]+\\.json`$", "Screenshot": "^`response/artifacts/[A-Za-z0-9_.-]+\\.png`$", "Outcome": "^(pass|fail)$" } },
8
+ { "heading": "^## Lanes$", "table": "| Lane | Verdict | Evidence |", "exactRows": 3, "cell": { "Lane": "^`(behavior|ux|ui)`$", "Verdict": "^(pass|fail)$", "Evidence": "\\S" } },
9
+ { "heading": "^## Fallbacks taken$", "table": "| Code | Action |" }
10
+ ]
11
+ }
@@ -0,0 +1,47 @@
1
+ # uat-flow-verification — enrollment/paid-enrollment
2
+
3
+ One paragraph: who asked for this run, which flow it verified at which commit, and what the three
4
+ lanes independently concluded. Written by `uat.verify` as `response/response.md`. The shared UAT
5
+ password never appears here, in a capture, in a run record or in a log: the credential is named, and
6
+ the login field is masked in every screenshot.
7
+
8
+ ## Admission
9
+
10
+ | Kind | Ref | Commit |
11
+ | --- | --- | --- |
12
+ | `frontend-surface-audit` | `step-1/parallel-1/response/response.md` | `1111111111111111111111111111111111111111` |
13
+ | `quality-verification` | `step-2/parallel-1/response/response.md` | `1111111111111111111111111111111111111111` |
14
+
15
+ ## Snapshot
16
+
17
+ | Field | Value |
18
+ | --- | --- |
19
+ | Run | `run-2026-01-10-1` |
20
+ | Requested by | the product owner, in the session that opened this run |
21
+ | Feature | `enrollment` |
22
+ | Flow | `paid-enrollment` |
23
+ | Commit | `1111111111111111111111111111111111111111` |
24
+ | Snapshot | `.worktrees/uat/enrollment/paid-enrollment/snapshot.json` |
25
+ | Namespace | `uat-run-2026-01-10-1` |
26
+ | Credential | `.stacks/local/secrets/uat.enc`, resolved by name at login only |
27
+ | Run record | `.worktrees/uat/enrollment/paid-enrollment/runs/run-2026-01-10-1/result.json` |
28
+ | Latest | `run-2026-01-10-1` |
29
+
30
+ ## Cases
31
+
32
+ | Case | Order | Assertions | Capture | Screenshot | Outcome |
33
+ | --- | --- | --- | --- | --- | --- |
34
+ | `pay-and-enrol` | 1 | entry, commitment, terminal | `response/data/captures/pay-and-enrol.json` | `response/artifacts/pay-and-enrol.png` | pass |
35
+
36
+ ## Lanes
37
+
38
+ | Lane | Verdict | Evidence |
39
+ | --- | --- | --- |
40
+ | `behavior` | pass | `response/data/captures/pay-and-enrol.json` |
41
+ | `ux` | pass | `response/data/captures/pay-and-enrol.json` |
42
+ | `ui` | pass | `response/artifacts/sheet.png` |
43
+
44
+ ## Fallbacks taken
45
+
46
+ | Code | Action |
47
+ | --- | --- |
@@ -0,0 +1,96 @@
1
+ {
2
+ "$id": "kind:uat-snapshot",
3
+ "type": "object",
4
+ "additionalProperties": false,
5
+ "required": [
6
+ "runId", "requestedBy", "feature", "flow", "commit", "frozenAt", "flowRoot", "snapshotRef",
7
+ "snapshotFingerprint", "lease", "admission", "account", "fixtureNamespace", "seed", "cases"
8
+ ],
9
+ "properties": {
10
+ "runId": { "$ref": "#/$defs/runId" },
11
+ "requestedBy": { "type": "string", "minLength": 1 },
12
+ "feature": { "$ref": "#/$defs/slug" },
13
+ "flow": { "$ref": "#/$defs/slug" },
14
+ "commit": { "type": "string", "pattern": "^[0-9a-f]{40}$" },
15
+ "frozenAt": { "type": "string", "format": "date-time" },
16
+ "flowRoot": { "type": "string", "minLength": 1 },
17
+ "snapshotRef": { "type": "string", "pattern": "^\\.worktrees/uat/[a-z0-9][a-z0-9-]*/[a-z0-9][a-z0-9-]*/snapshot\\.json$" },
18
+ "snapshotFingerprint": { "$ref": "#/$defs/fingerprint" },
19
+ "lease": {
20
+ "description": "The exclusive lease on the flow directory. One run writes it at a time; the lease is granted by the orchestrator and is never asked of a person.",
21
+ "type": "object",
22
+ "additionalProperties": false,
23
+ "required": ["leaseRef", "exclusive", "expiresAt"],
24
+ "properties": {
25
+ "leaseRef": { "type": "string", "pattern": "^uat-lease://[A-Za-z0-9._~/-]+$" },
26
+ "exclusive": { "const": true },
27
+ "expiresAt": { "type": "string", "format": "date-time" }
28
+ }
29
+ },
30
+ "admission": {
31
+ "description": "The two receipts that admit product UAT, each pinned at the commit this run verifies.",
32
+ "type": "array",
33
+ "minItems": 2,
34
+ "maxItems": 2,
35
+ "items": {
36
+ "type": "object",
37
+ "additionalProperties": false,
38
+ "required": ["kind", "ref", "commit"],
39
+ "properties": {
40
+ "kind": { "enum": ["frontend-surface-audit", "quality-verification"] },
41
+ "ref": { "type": "string", "minLength": 1 },
42
+ "commit": { "type": "string", "pattern": "^[0-9a-f]{40}$" }
43
+ }
44
+ }
45
+ },
46
+ "account": {
47
+ "description": "A dedicated UAT username per flow and one shared password, sealed under the master identity. Every field is a name or a reference, so a password has nowhere to live even by accident.",
48
+ "type": "object",
49
+ "additionalProperties": false,
50
+ "required": ["username", "role", "credentialName", "credentialRef", "custody", "isUat", "plaintextRecorded"],
51
+ "properties": {
52
+ "username": { "type": "string", "pattern": "^uat-[A-Za-z0-9._-]+$" },
53
+ "role": { "type": "string", "minLength": 1 },
54
+ "credentialName": { "type": "string", "pattern": "^[a-z][a-z0-9-]*$" },
55
+ "credentialRef": { "type": "string", "pattern": "^\\.stacks/[a-z0-9][a-z0-9-]*/secrets/uat\\.enc$" },
56
+ "custody": { "const": "sealed-shared-master-identity" },
57
+ "isUat": { "const": true },
58
+ "plaintextRecorded": { "const": false }
59
+ }
60
+ },
61
+ "fixtureNamespace": { "$ref": "#/$defs/namespace" },
62
+ "seed": {
63
+ "type": "object",
64
+ "additionalProperties": false,
65
+ "required": ["recordsRef", "expectedRef", "fingerprint", "namespace", "isUat"],
66
+ "properties": {
67
+ "recordsRef": { "type": "string", "pattern": "^\\.worktrees/uat/[a-z0-9][a-z0-9-]*/[a-z0-9][a-z0-9-]*/seed/records\\.json$" },
68
+ "expectedRef": { "type": "string", "pattern": "^\\.worktrees/uat/[a-z0-9][a-z0-9-]*/[a-z0-9][a-z0-9-]*/seed/expected\\.json$" },
69
+ "fingerprint": { "$ref": "#/$defs/fingerprint" },
70
+ "namespace": { "$ref": "#/$defs/namespace" },
71
+ "isUat": { "const": true }
72
+ }
73
+ },
74
+ "cases": {
75
+ "type": "array",
76
+ "minItems": 1,
77
+ "maxItems": 64,
78
+ "items": {
79
+ "type": "object",
80
+ "additionalProperties": false,
81
+ "required": ["caseId", "order", "assertions"],
82
+ "properties": {
83
+ "caseId": { "$ref": "#/$defs/slug" },
84
+ "order": { "type": "integer", "minimum": 1 },
85
+ "assertions": { "type": "array", "minItems": 1, "maxItems": 32, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } }
86
+ }
87
+ }
88
+ }
89
+ },
90
+ "$defs": {
91
+ "fingerprint": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
92
+ "slug": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
93
+ "runId": { "type": "string", "pattern": "^[A-Za-z0-9._-]+$" },
94
+ "namespace": { "type": "string", "pattern": "^uat-[A-Za-z0-9._-]+$" }
95
+ }
96
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "$id": "kind:uat-verdicts",
3
+ "type": "object",
4
+ "additionalProperties": false,
5
+ "required": ["runId", "commit", "resultRef", "latestRef", "lanes", "cleanup"],
6
+ "properties": {
7
+ "runId": { "type": "string", "pattern": "^[A-Za-z0-9._-]+$" },
8
+ "commit": { "type": "string", "pattern": "^[0-9a-f]{40}$" },
9
+ "resultRef": { "type": "string", "pattern": "^\\.worktrees/uat/[a-z0-9][a-z0-9-]*/[a-z0-9][a-z0-9-]*/runs/[A-Za-z0-9._-]+/result\\.json$" },
10
+ "latestRef": { "type": "string", "pattern": "^\\.worktrees/uat/[a-z0-9][a-z0-9-]*/[a-z0-9][a-z0-9-]*/latest$" },
11
+ "lanes": {
12
+ "description": "Three independent lanes, judged apart on their own evidence. There is no fourth lane and no lane may be omitted.",
13
+ "type": "array",
14
+ "minItems": 3,
15
+ "maxItems": 3,
16
+ "items": {
17
+ "type": "object",
18
+ "additionalProperties": false,
19
+ "required": ["lane", "verdict", "evidenceRefs", "statement"],
20
+ "properties": {
21
+ "lane": { "enum": ["behavior", "ux", "ui"] },
22
+ "verdict": { "enum": ["pass", "fail"] },
23
+ "evidenceRefs": { "type": "array", "minItems": 1, "maxItems": 64, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
24
+ "statement": { "type": "string", "minLength": 1 }
25
+ }
26
+ }
27
+ },
28
+ "cleanup": {
29
+ "description": "Cleanup deletes the run namespace and nothing else; a run record is history and is never deleted.",
30
+ "type": "object",
31
+ "additionalProperties": false,
32
+ "required": ["performed", "isUat", "namespace", "runRecordsDeleted"],
33
+ "properties": {
34
+ "performed": { "type": "boolean" },
35
+ "isUat": { "const": true },
36
+ "namespace": { "type": "string", "pattern": "^uat-[A-Za-z0-9._-]+$" },
37
+ "runRecordsDeleted": { "const": false }
38
+ }
39
+ }
40
+ }
41
+ }