@pikku/skills 0.12.9 → 0.12.11
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.
- package/CHANGELOG.md +768 -0
- package/dist/skills.gen.js +1 -1
- package/package.json +4 -4
- package/skills/pikku-addon/SKILL.md +20 -14
- package/skills/pikku-addon/references/addon-package-manifest.md +2 -2
- package/skills/{pikku-ai-agent → pikku-agent}/SKILL.md +24 -24
- package/skills/pikku-ai-vercel/SKILL.md +18 -18
- package/skills/pikku-ai-voice/SKILL.md +15 -15
- package/skills/pikku-audit/SKILL.md +28 -13
- package/skills/pikku-aws/SKILL.md +2 -2
- package/skills/pikku-better-auth/SKILL.md +97 -17
- package/skills/pikku-build-app/SKILL.md +621 -0
- package/skills/pikku-build-app/references/multi-app.md +117 -0
- package/skills/pikku-build-app/references/ship.md +98 -0
- package/skills/pikku-build-app/references/theming.md +70 -0
- package/skills/pikku-build-platform/SKILL.md +239 -0
- package/skills/pikku-build-quick/SKILL.md +238 -0
- package/skills/pikku-cli/SKILL.md +7 -7
- package/skills/pikku-cli/references/complete-example.md +1 -1
- package/skills/pikku-concepts/SKILL.md +10 -7
- package/skills/pikku-concepts/references/concept-mapping.md +1 -1
- package/skills/pikku-config/SKILL.md +5 -3
- package/skills/pikku-deploy-azure/SKILL.md +5 -4
- package/skills/pikku-deploy-cloudflare/SKILL.md +9 -9
- package/skills/pikku-deploy-uws/SKILL.md +5 -2
- package/skills/pikku-deps/SKILL.md +42 -3
- package/skills/pikku-emails/SKILL.md +5 -5
- package/skills/pikku-fabric/SKILL.md +27 -3
- package/skills/pikku-fabric-debug/SKILL.md +1 -1
- package/skills/pikku-feature/SKILL.md +5 -4
- package/skills/pikku-http/SKILL.md +4 -4
- package/skills/pikku-http/references/http-options.md +13 -13
- package/skills/pikku-i18n/SKILL.md +2 -1
- package/skills/pikku-info/SKILL.md +1 -1
- package/skills/pikku-knowledge/SKILL.md +13 -13
- package/skills/pikku-kysely/SKILL.md +68 -41
- package/skills/pikku-machine-auth/SKILL.md +10 -10
- package/skills/pikku-mcp/SKILL.md +23 -20
- package/skills/pikku-middleware/SKILL.md +19 -12
- package/skills/pikku-middleware/references/middleware-patterns.md +14 -8
- package/skills/pikku-mongodb/SKILL.md +11 -11
- package/skills/pikku-n8n-import/SKILL.md +12 -12
- package/skills/pikku-n8n-import/SPEC.md +3 -0
- package/skills/pikku-n8n-import/references/addon-mapping.md +14 -8
- package/skills/pikku-n8n-import/references/code-translation.md +26 -22
- package/skills/pikku-n8n-import/references/loops-and-control.md +7 -7
- package/skills/pikku-paraglide/SKILL.md +11 -6
- package/skills/pikku-permissions/SKILL.md +19 -15
- package/skills/pikku-product-second-opinion/README.md +3 -3
- package/skills/pikku-product-second-opinion/SKILL.md +83 -73
- package/skills/pikku-product-second-opinion/example/sample-report.md +15 -12
- package/skills/pikku-product-second-opinion/references/report-template.md +10 -7
- package/skills/pikku-queue/SKILL.md +1 -1
- package/skills/pikku-react/SKILL.md +53 -13
- package/skills/pikku-realtime/SKILL.md +51 -19
- package/skills/pikku-rpc/SKILL.md +1 -1
- package/skills/pikku-rtl/SKILL.md +1 -1
- package/skills/pikku-scenario/SKILL.md +164 -44
- package/skills/pikku-schedule/SKILL.md +6 -1
- package/skills/pikku-schema-ajv/SKILL.md +2 -2
- package/skills/pikku-schema-cfworker/SKILL.md +1 -1
- package/skills/pikku-security/SKILL.md +9 -5
- package/skills/pikku-services/SKILL.md +27 -18
- package/skills/pikku-services/references/audit-wire-service.md +14 -8
- package/skills/pikku-software-archaeology/SKILL.md +27 -23
- package/skills/pikku-software-archaeology/references/blueprint.schema.json +580 -102
- package/skills/pikku-software-archaeology/scripts/validate.mjs +146 -69
- package/skills/pikku-tag-middleware/SKILL.md +1 -0
- package/skills/pikku-template-clone/SKILL.md +2 -1
- package/skills/pikku-trigger/SKILL.md +3 -3
- package/skills/pikku-versioning/SKILL.md +87 -3
- package/skills/pikku-websocket/SKILL.md +4 -3
- package/skills/pikku-workflow/SKILL.md +2 -2
- package/skills/pikku-workflow/references/workflow-reference.md +24 -10
- package/skills/pikku-ws/SKILL.md +5 -2
|
@@ -12,7 +12,10 @@
|
|
|
12
12
|
"properties": {
|
|
13
13
|
"file": { "type": "string", "description": "repo-relative path" },
|
|
14
14
|
"lines": { "type": "string", "description": "e.g. '42' or '42-58'" },
|
|
15
|
-
"note": {
|
|
15
|
+
"note": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "what this location shows"
|
|
18
|
+
}
|
|
16
19
|
}
|
|
17
20
|
}
|
|
18
21
|
},
|
|
@@ -30,10 +33,21 @@
|
|
|
30
33
|
"files": {
|
|
31
34
|
"product.json": {
|
|
32
35
|
"type": "object",
|
|
33
|
-
"required": [
|
|
36
|
+
"required": [
|
|
37
|
+
"name",
|
|
38
|
+
"purpose",
|
|
39
|
+
"actors",
|
|
40
|
+
"capabilities",
|
|
41
|
+
"terminology",
|
|
42
|
+
"evidence",
|
|
43
|
+
"confidence"
|
|
44
|
+
],
|
|
34
45
|
"properties": {
|
|
35
46
|
"name": { "type": "string" },
|
|
36
|
-
"purpose": {
|
|
47
|
+
"purpose": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"description": "1-3 sentences: what problem, for whom"
|
|
50
|
+
},
|
|
37
51
|
"targetUsers": { "type": "array", "items": { "type": "string" } },
|
|
38
52
|
"actors": {
|
|
39
53
|
"type": "array",
|
|
@@ -43,18 +57,28 @@
|
|
|
43
57
|
"required": ["name", "kind", "description"],
|
|
44
58
|
"properties": {
|
|
45
59
|
"name": { "type": "string" },
|
|
46
|
-
"kind": {
|
|
60
|
+
"kind": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"enum": ["human", "system", "external"]
|
|
63
|
+
},
|
|
47
64
|
"description": { "type": "string" }
|
|
48
65
|
}
|
|
49
66
|
}
|
|
50
67
|
},
|
|
51
|
-
"capabilities": {
|
|
68
|
+
"capabilities": {
|
|
69
|
+
"type": "array",
|
|
70
|
+
"minItems": 1,
|
|
71
|
+
"items": { "type": "string" }
|
|
72
|
+
},
|
|
52
73
|
"terminology": {
|
|
53
74
|
"type": "array",
|
|
54
75
|
"items": {
|
|
55
76
|
"type": "object",
|
|
56
77
|
"required": ["term", "meaning"],
|
|
57
|
-
"properties": {
|
|
78
|
+
"properties": {
|
|
79
|
+
"term": { "type": "string" },
|
|
80
|
+
"meaning": { "type": "string" }
|
|
81
|
+
}
|
|
58
82
|
}
|
|
59
83
|
},
|
|
60
84
|
"evidence": { "$ref": "#/$defs/evidence" },
|
|
@@ -70,16 +94,45 @@
|
|
|
70
94
|
"minItems": 1,
|
|
71
95
|
"items": {
|
|
72
96
|
"type": "object",
|
|
73
|
-
"required": [
|
|
97
|
+
"required": [
|
|
98
|
+
"name",
|
|
99
|
+
"description",
|
|
100
|
+
"entities",
|
|
101
|
+
"commands",
|
|
102
|
+
"queries",
|
|
103
|
+
"events",
|
|
104
|
+
"evidence",
|
|
105
|
+
"confidence"
|
|
106
|
+
],
|
|
74
107
|
"properties": {
|
|
75
108
|
"name": { "$ref": "#/$defs/conceptName" },
|
|
76
109
|
"description": { "type": "string" },
|
|
77
|
-
"entities": {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
"
|
|
82
|
-
|
|
110
|
+
"entities": {
|
|
111
|
+
"type": "array",
|
|
112
|
+
"items": { "$ref": "#/$defs/conceptName" }
|
|
113
|
+
},
|
|
114
|
+
"commands": {
|
|
115
|
+
"type": "array",
|
|
116
|
+
"items": { "$ref": "#/$defs/conceptName" }
|
|
117
|
+
},
|
|
118
|
+
"queries": {
|
|
119
|
+
"type": "array",
|
|
120
|
+
"items": { "$ref": "#/$defs/conceptName" }
|
|
121
|
+
},
|
|
122
|
+
"events": {
|
|
123
|
+
"type": "array",
|
|
124
|
+
"items": { "$ref": "#/$defs/conceptName" }
|
|
125
|
+
},
|
|
126
|
+
"policies": {
|
|
127
|
+
"type": "array",
|
|
128
|
+
"items": { "$ref": "#/$defs/conceptName" },
|
|
129
|
+
"description": "policy names from policies.json owned by this domain"
|
|
130
|
+
},
|
|
131
|
+
"sourcePaths": {
|
|
132
|
+
"type": "array",
|
|
133
|
+
"items": { "type": "string" },
|
|
134
|
+
"description": "where this domain currently lives (usually scattered)"
|
|
135
|
+
},
|
|
83
136
|
"evidence": { "$ref": "#/$defs/evidence" },
|
|
84
137
|
"confidence": { "$ref": "#/$defs/confidence" }
|
|
85
138
|
}
|
|
@@ -95,7 +148,14 @@
|
|
|
95
148
|
"type": "array",
|
|
96
149
|
"items": {
|
|
97
150
|
"type": "object",
|
|
98
|
-
"required": [
|
|
151
|
+
"required": [
|
|
152
|
+
"name",
|
|
153
|
+
"domain",
|
|
154
|
+
"description",
|
|
155
|
+
"attributes",
|
|
156
|
+
"evidence",
|
|
157
|
+
"confidence"
|
|
158
|
+
],
|
|
99
159
|
"properties": {
|
|
100
160
|
"name": { "$ref": "#/$defs/conceptName" },
|
|
101
161
|
"domain": { "$ref": "#/$defs/conceptName" },
|
|
@@ -119,7 +179,16 @@
|
|
|
119
179
|
"type": "object",
|
|
120
180
|
"required": ["kind", "target"],
|
|
121
181
|
"properties": {
|
|
122
|
-
"kind": {
|
|
182
|
+
"kind": {
|
|
183
|
+
"type": "string",
|
|
184
|
+
"enum": [
|
|
185
|
+
"belongs-to",
|
|
186
|
+
"has-many",
|
|
187
|
+
"has-one",
|
|
188
|
+
"references",
|
|
189
|
+
"many-to-many"
|
|
190
|
+
]
|
|
191
|
+
},
|
|
123
192
|
"target": { "$ref": "#/$defs/conceptName" },
|
|
124
193
|
"description": { "type": "string" }
|
|
125
194
|
}
|
|
@@ -134,11 +203,17 @@
|
|
|
134
203
|
"properties": {
|
|
135
204
|
"from": { "type": "string" },
|
|
136
205
|
"to": { "type": "string" },
|
|
137
|
-
"trigger": {
|
|
206
|
+
"trigger": {
|
|
207
|
+
"type": "string",
|
|
208
|
+
"description": "command or event name that causes it"
|
|
209
|
+
}
|
|
138
210
|
}
|
|
139
211
|
}
|
|
140
212
|
},
|
|
141
|
-
"ownership": {
|
|
213
|
+
"ownership": {
|
|
214
|
+
"type": "string",
|
|
215
|
+
"description": "which actor/tenant owns rows of this entity"
|
|
216
|
+
},
|
|
142
217
|
"constraints": { "type": "array", "items": { "type": "string" } },
|
|
143
218
|
"evidence": { "$ref": "#/$defs/evidence" },
|
|
144
219
|
"confidence": { "$ref": "#/$defs/confidence" }
|
|
@@ -155,12 +230,28 @@
|
|
|
155
230
|
"type": "array",
|
|
156
231
|
"items": {
|
|
157
232
|
"type": "object",
|
|
158
|
-
"required": [
|
|
233
|
+
"required": [
|
|
234
|
+
"name",
|
|
235
|
+
"domain",
|
|
236
|
+
"actor",
|
|
237
|
+
"input",
|
|
238
|
+
"preconditions",
|
|
239
|
+
"effects",
|
|
240
|
+
"eventsProduced",
|
|
241
|
+
"evidence",
|
|
242
|
+
"confidence"
|
|
243
|
+
],
|
|
159
244
|
"properties": {
|
|
160
|
-
"name": {
|
|
245
|
+
"name": {
|
|
246
|
+
"$ref": "#/$defs/conceptName",
|
|
247
|
+
"description": "imperative VerbNoun: ApproveInvoice"
|
|
248
|
+
},
|
|
161
249
|
"domain": { "$ref": "#/$defs/conceptName" },
|
|
162
250
|
"actor": { "type": "string" },
|
|
163
|
-
"trigger": {
|
|
251
|
+
"trigger": {
|
|
252
|
+
"type": "string",
|
|
253
|
+
"description": "how it is invoked today (route, job, webhook, cron)"
|
|
254
|
+
},
|
|
164
255
|
"input": {
|
|
165
256
|
"type": "array",
|
|
166
257
|
"items": {
|
|
@@ -173,11 +264,29 @@
|
|
|
173
264
|
}
|
|
174
265
|
}
|
|
175
266
|
},
|
|
176
|
-
"preconditions": {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
"
|
|
267
|
+
"preconditions": {
|
|
268
|
+
"type": "array",
|
|
269
|
+
"items": { "type": "string" }
|
|
270
|
+
},
|
|
271
|
+
"effects": {
|
|
272
|
+
"type": "array",
|
|
273
|
+
"minItems": 1,
|
|
274
|
+
"items": { "type": "string" }
|
|
275
|
+
},
|
|
276
|
+
"eventsProduced": {
|
|
277
|
+
"type": "array",
|
|
278
|
+
"items": { "$ref": "#/$defs/conceptName" }
|
|
279
|
+
},
|
|
280
|
+
"policies": {
|
|
281
|
+
"type": "array",
|
|
282
|
+
"items": { "type": "string" },
|
|
283
|
+
"description": "policy names from policies.json enforced here"
|
|
284
|
+
},
|
|
285
|
+
"currentImplementation": {
|
|
286
|
+
"type": "array",
|
|
287
|
+
"items": { "type": "string" },
|
|
288
|
+
"description": "file paths implementing it today"
|
|
289
|
+
},
|
|
181
290
|
"evidence": { "$ref": "#/$defs/evidence" },
|
|
182
291
|
"confidence": { "$ref": "#/$defs/confidence" }
|
|
183
292
|
}
|
|
@@ -193,9 +302,20 @@
|
|
|
193
302
|
"type": "array",
|
|
194
303
|
"items": {
|
|
195
304
|
"type": "object",
|
|
196
|
-
"required": [
|
|
305
|
+
"required": [
|
|
306
|
+
"name",
|
|
307
|
+
"domain",
|
|
308
|
+
"actor",
|
|
309
|
+
"description",
|
|
310
|
+
"returns",
|
|
311
|
+
"evidence",
|
|
312
|
+
"confidence"
|
|
313
|
+
],
|
|
197
314
|
"properties": {
|
|
198
|
-
"name": {
|
|
315
|
+
"name": {
|
|
316
|
+
"$ref": "#/$defs/conceptName",
|
|
317
|
+
"description": "GetX / ListX / SearchX"
|
|
318
|
+
},
|
|
199
319
|
"domain": { "$ref": "#/$defs/conceptName" },
|
|
200
320
|
"actor": { "type": "string" },
|
|
201
321
|
"description": { "type": "string" },
|
|
@@ -204,11 +324,18 @@
|
|
|
204
324
|
"items": {
|
|
205
325
|
"type": "object",
|
|
206
326
|
"required": ["name", "type"],
|
|
207
|
-
"properties": {
|
|
327
|
+
"properties": {
|
|
328
|
+
"name": { "type": "string" },
|
|
329
|
+
"type": { "type": "string" },
|
|
330
|
+
"required": { "type": "boolean" }
|
|
331
|
+
}
|
|
208
332
|
}
|
|
209
333
|
},
|
|
210
334
|
"returns": { "type": "string" },
|
|
211
|
-
"scoping": {
|
|
335
|
+
"scoping": {
|
|
336
|
+
"type": "string",
|
|
337
|
+
"description": "tenancy/visibility rule applied (e.g. 'rows owned by caller only')"
|
|
338
|
+
},
|
|
212
339
|
"evidence": { "$ref": "#/$defs/evidence" },
|
|
213
340
|
"confidence": { "$ref": "#/$defs/confidence" }
|
|
214
341
|
}
|
|
@@ -224,15 +351,40 @@
|
|
|
224
351
|
"type": "array",
|
|
225
352
|
"items": {
|
|
226
353
|
"type": "object",
|
|
227
|
-
"required": [
|
|
354
|
+
"required": [
|
|
355
|
+
"name",
|
|
356
|
+
"domain",
|
|
357
|
+
"description",
|
|
358
|
+
"producedBy",
|
|
359
|
+
"evidence",
|
|
360
|
+
"confidence"
|
|
361
|
+
],
|
|
228
362
|
"properties": {
|
|
229
|
-
"name": {
|
|
363
|
+
"name": {
|
|
364
|
+
"$ref": "#/$defs/conceptName",
|
|
365
|
+
"description": "past-tense business fact: InvoicePaid. No technical events (ButtonClicked)."
|
|
366
|
+
},
|
|
230
367
|
"domain": { "$ref": "#/$defs/conceptName" },
|
|
231
368
|
"description": { "type": "string" },
|
|
232
|
-
"producedBy": {
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
369
|
+
"producedBy": {
|
|
370
|
+
"type": "array",
|
|
371
|
+
"minItems": 1,
|
|
372
|
+
"items": { "type": "string" },
|
|
373
|
+
"description": "command/workflow names"
|
|
374
|
+
},
|
|
375
|
+
"consumedBy": {
|
|
376
|
+
"type": "array",
|
|
377
|
+
"items": { "type": "string" },
|
|
378
|
+
"description": "what reacts today (email send, status flip, webhook out)"
|
|
379
|
+
},
|
|
380
|
+
"payloadHints": {
|
|
381
|
+
"type": "array",
|
|
382
|
+
"items": { "type": "string" }
|
|
383
|
+
},
|
|
384
|
+
"explicit": {
|
|
385
|
+
"type": "boolean",
|
|
386
|
+
"description": "true if the code emits a real event; false if reconstructed from inline side-effects"
|
|
387
|
+
},
|
|
236
388
|
"evidence": { "$ref": "#/$defs/evidence" },
|
|
237
389
|
"confidence": { "$ref": "#/$defs/confidence" }
|
|
238
390
|
}
|
|
@@ -248,13 +400,36 @@
|
|
|
248
400
|
"type": "array",
|
|
249
401
|
"items": {
|
|
250
402
|
"type": "object",
|
|
251
|
-
"required": [
|
|
403
|
+
"required": [
|
|
404
|
+
"name",
|
|
405
|
+
"rule",
|
|
406
|
+
"type",
|
|
407
|
+
"domain",
|
|
408
|
+
"evidence",
|
|
409
|
+
"confidence"
|
|
410
|
+
],
|
|
252
411
|
"properties": {
|
|
253
412
|
"name": { "$ref": "#/$defs/conceptName" },
|
|
254
|
-
"rule": {
|
|
255
|
-
|
|
413
|
+
"rule": {
|
|
414
|
+
"type": "string",
|
|
415
|
+
"description": "plain-language statement: 'Only the invoice owner can send it'"
|
|
416
|
+
},
|
|
417
|
+
"type": {
|
|
418
|
+
"type": "string",
|
|
419
|
+
"enum": [
|
|
420
|
+
"authorization",
|
|
421
|
+
"validation",
|
|
422
|
+
"state",
|
|
423
|
+
"business-constraint",
|
|
424
|
+
"rate-limit"
|
|
425
|
+
]
|
|
426
|
+
},
|
|
256
427
|
"domain": { "$ref": "#/$defs/conceptName" },
|
|
257
|
-
"enforcedAt": {
|
|
428
|
+
"enforcedAt": {
|
|
429
|
+
"type": "array",
|
|
430
|
+
"items": { "type": "string" },
|
|
431
|
+
"description": "every code location enforcing it — multiple locations = divergence risk, note in gaps.json"
|
|
432
|
+
},
|
|
258
433
|
"evidence": { "$ref": "#/$defs/evidence" },
|
|
259
434
|
"confidence": { "$ref": "#/$defs/confidence" }
|
|
260
435
|
}
|
|
@@ -270,17 +445,39 @@
|
|
|
270
445
|
"type": "array",
|
|
271
446
|
"items": {
|
|
272
447
|
"type": "object",
|
|
273
|
-
"required": [
|
|
448
|
+
"required": [
|
|
449
|
+
"name",
|
|
450
|
+
"kind",
|
|
451
|
+
"actor",
|
|
452
|
+
"trigger",
|
|
453
|
+
"steps",
|
|
454
|
+
"result",
|
|
455
|
+
"evidence",
|
|
456
|
+
"confidence"
|
|
457
|
+
],
|
|
274
458
|
"properties": {
|
|
275
459
|
"name": { "type": "string" },
|
|
276
460
|
"kind": { "type": "string", "enum": ["user", "admin", "system"] },
|
|
277
461
|
"actor": { "type": "string" },
|
|
278
462
|
"trigger": { "type": "string" },
|
|
279
|
-
"steps": {
|
|
463
|
+
"steps": {
|
|
464
|
+
"type": "array",
|
|
465
|
+
"minItems": 1,
|
|
466
|
+
"items": { "type": "string" }
|
|
467
|
+
},
|
|
280
468
|
"result": { "type": "string" },
|
|
281
|
-
"commandsInvolved": {
|
|
282
|
-
|
|
283
|
-
|
|
469
|
+
"commandsInvolved": {
|
|
470
|
+
"type": "array",
|
|
471
|
+
"items": { "$ref": "#/$defs/conceptName" }
|
|
472
|
+
},
|
|
473
|
+
"eventsInvolved": {
|
|
474
|
+
"type": "array",
|
|
475
|
+
"items": { "$ref": "#/$defs/conceptName" }
|
|
476
|
+
},
|
|
477
|
+
"schedule": {
|
|
478
|
+
"type": "string",
|
|
479
|
+
"description": "cron expression for system workflows, if any"
|
|
480
|
+
},
|
|
284
481
|
"scenarios": {
|
|
285
482
|
"type": "array",
|
|
286
483
|
"description": "concrete use cases, primarily excavated from the test suite (describe/it names, fixtures, assertions). A scenario sourced from a test is high-confidence by definition.",
|
|
@@ -292,7 +489,10 @@
|
|
|
292
489
|
"given": { "type": "string" },
|
|
293
490
|
"when": { "type": "string" },
|
|
294
491
|
"outcome": { "type": "string" },
|
|
295
|
-
"fromTest": {
|
|
492
|
+
"fromTest": {
|
|
493
|
+
"type": "string",
|
|
494
|
+
"description": "test file path + test name, when sourced from a test"
|
|
495
|
+
}
|
|
296
496
|
}
|
|
297
497
|
}
|
|
298
498
|
},
|
|
@@ -313,15 +513,35 @@
|
|
|
313
513
|
"type": "object",
|
|
314
514
|
"required": ["kind", "path", "auth", "mapsTo", "evidence"],
|
|
315
515
|
"properties": {
|
|
316
|
-
"kind": {
|
|
516
|
+
"kind": {
|
|
517
|
+
"type": "string",
|
|
518
|
+
"enum": [
|
|
519
|
+
"rest",
|
|
520
|
+
"graphql",
|
|
521
|
+
"rpc",
|
|
522
|
+
"webhook-in",
|
|
523
|
+
"webhook-out",
|
|
524
|
+
"page",
|
|
525
|
+
"cli",
|
|
526
|
+
"websocket",
|
|
527
|
+
"sse"
|
|
528
|
+
]
|
|
529
|
+
},
|
|
317
530
|
"method": { "type": "string" },
|
|
318
531
|
"path": { "type": "string" },
|
|
319
|
-
"auth": {
|
|
532
|
+
"auth": {
|
|
533
|
+
"type": "string",
|
|
534
|
+
"description": "none | session | jwt | api-key | signature | capability-url | ..."
|
|
535
|
+
},
|
|
320
536
|
"mapsTo": {
|
|
321
537
|
"type": "object",
|
|
322
538
|
"required": ["type", "name"],
|
|
323
539
|
"properties": {
|
|
324
|
-
"type": {
|
|
540
|
+
"type": {
|
|
541
|
+
"type": "string",
|
|
542
|
+
"enum": ["command", "query", "event-ingress"],
|
|
543
|
+
"description": "command/query for normal surfaces. event-ingress ONLY for surfaces that relay an external event without a domain command of their own; its name must be an events.json event. A webhook whose handler changes state maps to a command (usual case)."
|
|
544
|
+
},
|
|
325
545
|
"name": { "$ref": "#/$defs/conceptName" }
|
|
326
546
|
}
|
|
327
547
|
},
|
|
@@ -341,16 +561,44 @@
|
|
|
341
561
|
"type": "array",
|
|
342
562
|
"items": {
|
|
343
563
|
"type": "object",
|
|
344
|
-
"required": [
|
|
564
|
+
"required": [
|
|
565
|
+
"name",
|
|
566
|
+
"category",
|
|
567
|
+
"purpose",
|
|
568
|
+
"direction",
|
|
569
|
+
"importance",
|
|
570
|
+
"replacementDifficulty",
|
|
571
|
+
"evidence",
|
|
572
|
+
"confidence"
|
|
573
|
+
],
|
|
345
574
|
"properties": {
|
|
346
575
|
"name": { "type": "string" },
|
|
347
|
-
"category": {
|
|
576
|
+
"category": {
|
|
577
|
+
"type": "string",
|
|
578
|
+
"description": "payments | email | auth | storage | analytics | llm | sms | ..."
|
|
579
|
+
},
|
|
348
580
|
"purpose": { "type": "string" },
|
|
349
|
-
"dataExchanged": {
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
"
|
|
581
|
+
"dataExchanged": {
|
|
582
|
+
"type": "array",
|
|
583
|
+
"items": { "type": "string" }
|
|
584
|
+
},
|
|
585
|
+
"direction": {
|
|
586
|
+
"type": "string",
|
|
587
|
+
"enum": ["outbound", "inbound", "both"]
|
|
588
|
+
},
|
|
589
|
+
"importance": {
|
|
590
|
+
"type": "string",
|
|
591
|
+
"enum": ["critical", "important", "peripheral"]
|
|
592
|
+
},
|
|
593
|
+
"replacementDifficulty": {
|
|
594
|
+
"type": "string",
|
|
595
|
+
"enum": ["trivial", "moderate", "hard"]
|
|
596
|
+
},
|
|
597
|
+
"configVia": {
|
|
598
|
+
"type": "array",
|
|
599
|
+
"items": { "type": "string" },
|
|
600
|
+
"description": "env vars / secrets used"
|
|
601
|
+
},
|
|
354
602
|
"evidence": { "$ref": "#/$defs/evidence" },
|
|
355
603
|
"confidence": { "$ref": "#/$defs/confidence" }
|
|
356
604
|
}
|
|
@@ -370,10 +618,26 @@
|
|
|
370
618
|
"required": ["name", "kind", "responsibility", "evidence"],
|
|
371
619
|
"properties": {
|
|
372
620
|
"name": { "type": "string" },
|
|
373
|
-
"kind": {
|
|
621
|
+
"kind": {
|
|
622
|
+
"type": "string",
|
|
623
|
+
"enum": [
|
|
624
|
+
"frontend",
|
|
625
|
+
"api",
|
|
626
|
+
"worker",
|
|
627
|
+
"job",
|
|
628
|
+
"webhook-handler",
|
|
629
|
+
"cli",
|
|
630
|
+
"service",
|
|
631
|
+
"proxy",
|
|
632
|
+
"other"
|
|
633
|
+
]
|
|
634
|
+
},
|
|
374
635
|
"responsibility": { "type": "string" },
|
|
375
636
|
"dependsOn": { "type": "array", "items": { "type": "string" } },
|
|
376
|
-
"runtime": {
|
|
637
|
+
"runtime": {
|
|
638
|
+
"type": "string",
|
|
639
|
+
"description": "how it runs today (process, cron, lambda, ...)"
|
|
640
|
+
},
|
|
377
641
|
"confidence": { "$ref": "#/$defs/confidence" },
|
|
378
642
|
"evidence": { "$ref": "#/$defs/evidence" }
|
|
379
643
|
}
|
|
@@ -394,7 +658,11 @@
|
|
|
394
658
|
}
|
|
395
659
|
}
|
|
396
660
|
},
|
|
397
|
-
"notes": {
|
|
661
|
+
"notes": {
|
|
662
|
+
"type": "array",
|
|
663
|
+
"items": { "type": "string" },
|
|
664
|
+
"description": "deployment constraints worth preserving (ports, raw-body routes, ordering)"
|
|
665
|
+
}
|
|
398
666
|
}
|
|
399
667
|
},
|
|
400
668
|
"invariants.json": {
|
|
@@ -405,12 +673,27 @@
|
|
|
405
673
|
"type": "array",
|
|
406
674
|
"items": {
|
|
407
675
|
"type": "object",
|
|
408
|
-
"required": [
|
|
676
|
+
"required": [
|
|
677
|
+
"statement",
|
|
678
|
+
"domain",
|
|
679
|
+
"enforcedBy",
|
|
680
|
+
"evidence",
|
|
681
|
+
"confidence"
|
|
682
|
+
],
|
|
409
683
|
"properties": {
|
|
410
|
-
"statement": {
|
|
684
|
+
"statement": {
|
|
685
|
+
"type": "string",
|
|
686
|
+
"description": "must ALWAYS hold: 'Invoice numbers are sequential per user with no gaps'"
|
|
687
|
+
},
|
|
411
688
|
"domain": { "$ref": "#/$defs/conceptName" },
|
|
412
|
-
"enforcedBy": {
|
|
413
|
-
|
|
689
|
+
"enforcedBy": {
|
|
690
|
+
"type": "string",
|
|
691
|
+
"description": "db-constraint | code-guard | convention | nothing (!)"
|
|
692
|
+
},
|
|
693
|
+
"atRiskBecause": {
|
|
694
|
+
"type": "string",
|
|
695
|
+
"description": "why current enforcement is fragile, if it is"
|
|
696
|
+
},
|
|
414
697
|
"evidence": { "$ref": "#/$defs/evidence" },
|
|
415
698
|
"confidence": { "$ref": "#/$defs/confidence" }
|
|
416
699
|
}
|
|
@@ -426,10 +709,30 @@
|
|
|
426
709
|
"type": "array",
|
|
427
710
|
"items": {
|
|
428
711
|
"type": "object",
|
|
429
|
-
"required": [
|
|
712
|
+
"required": [
|
|
713
|
+
"problem",
|
|
714
|
+
"kind",
|
|
715
|
+
"impact",
|
|
716
|
+
"recommendation",
|
|
717
|
+
"evidence"
|
|
718
|
+
],
|
|
430
719
|
"properties": {
|
|
431
720
|
"problem": { "type": "string" },
|
|
432
|
-
"kind": {
|
|
721
|
+
"kind": {
|
|
722
|
+
"type": "string",
|
|
723
|
+
"enum": [
|
|
724
|
+
"incomplete-feature",
|
|
725
|
+
"todo",
|
|
726
|
+
"duplication",
|
|
727
|
+
"bug",
|
|
728
|
+
"hack",
|
|
729
|
+
"dead-code",
|
|
730
|
+
"unclear-ownership",
|
|
731
|
+
"architecture",
|
|
732
|
+
"security",
|
|
733
|
+
"open-product-decision"
|
|
734
|
+
]
|
|
735
|
+
},
|
|
433
736
|
"impact": { "type": "string" },
|
|
434
737
|
"recommendation": { "type": "string" },
|
|
435
738
|
"evidence": { "$ref": "#/$defs/evidence" }
|
|
@@ -449,13 +752,22 @@
|
|
|
449
752
|
"type": "object",
|
|
450
753
|
"required": ["current", "future", "recommendation"],
|
|
451
754
|
"properties": {
|
|
452
|
-
"current": {
|
|
755
|
+
"current": {
|
|
756
|
+
"type": "array",
|
|
757
|
+
"minItems": 1,
|
|
758
|
+
"items": { "type": "string" },
|
|
759
|
+
"description": "file paths in the existing repo"
|
|
760
|
+
},
|
|
453
761
|
"future": {
|
|
454
762
|
"type": "object",
|
|
455
763
|
"required": ["domain"],
|
|
456
764
|
"properties": {
|
|
457
765
|
"domain": { "$ref": "#/$defs/conceptName" },
|
|
458
|
-
"concepts": {
|
|
766
|
+
"concepts": {
|
|
767
|
+
"type": "array",
|
|
768
|
+
"items": { "type": "string" },
|
|
769
|
+
"description": "commands/queries/events/entities this code becomes"
|
|
770
|
+
}
|
|
459
771
|
}
|
|
460
772
|
},
|
|
461
773
|
"recommendation": { "type": "string" }
|
|
@@ -467,7 +779,13 @@
|
|
|
467
779
|
"items": {
|
|
468
780
|
"type": "object",
|
|
469
781
|
"required": ["path", "reason"],
|
|
470
|
-
"properties": {
|
|
782
|
+
"properties": {
|
|
783
|
+
"path": {
|
|
784
|
+
"type": "string",
|
|
785
|
+
"description": "file path; for sub-file drops use 'path (symbolName)' when part of a file survives"
|
|
786
|
+
},
|
|
787
|
+
"reason": { "type": "string" }
|
|
788
|
+
}
|
|
471
789
|
}
|
|
472
790
|
},
|
|
473
791
|
"decisionsNeeded": {
|
|
@@ -478,7 +796,10 @@
|
|
|
478
796
|
"properties": {
|
|
479
797
|
"question": { "type": "string" },
|
|
480
798
|
"options": { "type": "array", "items": { "type": "string" } },
|
|
481
|
-
"blockedConcepts": {
|
|
799
|
+
"blockedConcepts": {
|
|
800
|
+
"type": "array",
|
|
801
|
+
"items": { "type": "string" }
|
|
802
|
+
}
|
|
482
803
|
}
|
|
483
804
|
}
|
|
484
805
|
}
|
|
@@ -494,16 +815,59 @@
|
|
|
494
815
|
"type": "array",
|
|
495
816
|
"items": {
|
|
496
817
|
"type": "object",
|
|
497
|
-
"required": [
|
|
818
|
+
"required": [
|
|
819
|
+
"name",
|
|
820
|
+
"kind",
|
|
821
|
+
"audience",
|
|
822
|
+
"purpose",
|
|
823
|
+
"evidence",
|
|
824
|
+
"confidence"
|
|
825
|
+
],
|
|
498
826
|
"properties": {
|
|
499
827
|
"name": { "type": "string" },
|
|
500
|
-
"kind": {
|
|
501
|
-
|
|
828
|
+
"kind": {
|
|
829
|
+
"type": "string",
|
|
830
|
+
"enum": [
|
|
831
|
+
"web-ui",
|
|
832
|
+
"cli",
|
|
833
|
+
"mcp",
|
|
834
|
+
"openapi-rest",
|
|
835
|
+
"graphql",
|
|
836
|
+
"sdk",
|
|
837
|
+
"websocket-realtime",
|
|
838
|
+
"webhook-in",
|
|
839
|
+
"webhook-out",
|
|
840
|
+
"email",
|
|
841
|
+
"other"
|
|
842
|
+
]
|
|
843
|
+
},
|
|
844
|
+
"audience": {
|
|
845
|
+
"type": "string",
|
|
846
|
+
"enum": [
|
|
847
|
+
"human",
|
|
848
|
+
"developer",
|
|
849
|
+
"agent",
|
|
850
|
+
"external-system",
|
|
851
|
+
"internal"
|
|
852
|
+
]
|
|
853
|
+
},
|
|
502
854
|
"purpose": { "type": "string" },
|
|
503
|
-
"surfaceCount": {
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
855
|
+
"surfaceCount": {
|
|
856
|
+
"type": "number",
|
|
857
|
+
"description": "how many ops/tools/commands/routes this channel exposes"
|
|
858
|
+
},
|
|
859
|
+
"generated": {
|
|
860
|
+
"type": "boolean",
|
|
861
|
+
"description": "true if generated from another source (OpenAPI from routes, typed SDK, MCP tools from funcs) rather than hand-written"
|
|
862
|
+
},
|
|
863
|
+
"domainsServed": {
|
|
864
|
+
"type": "array",
|
|
865
|
+
"items": { "$ref": "#/$defs/conceptName" }
|
|
866
|
+
},
|
|
867
|
+
"status": {
|
|
868
|
+
"type": "string",
|
|
869
|
+
"enum": ["complete", "partial", "stub", "deprecated"]
|
|
870
|
+
},
|
|
507
871
|
"notes": { "type": "string" },
|
|
508
872
|
"evidence": { "$ref": "#/$defs/evidence" },
|
|
509
873
|
"confidence": { "$ref": "#/$defs/confidence" }
|
|
@@ -516,19 +880,47 @@
|
|
|
516
880
|
"x-optional": true,
|
|
517
881
|
"type": "object",
|
|
518
882
|
"description": "Web-UI app-level shape. Names the framework/router/styling/data/auth so the rebuild can weigh their tradeoffs (e.g. TanStack Start + better-auth + Mantine).",
|
|
519
|
-
"required": [
|
|
883
|
+
"required": [
|
|
884
|
+
"framework",
|
|
885
|
+
"styling",
|
|
886
|
+
"dataLayer",
|
|
887
|
+
"auth",
|
|
888
|
+
"evidence",
|
|
889
|
+
"confidence"
|
|
890
|
+
],
|
|
520
891
|
"properties": {
|
|
521
|
-
"framework": {
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
"
|
|
892
|
+
"framework": {
|
|
893
|
+
"type": "string",
|
|
894
|
+
"description": "e.g. TanStack Start, Next.js, Remix, Vite SPA"
|
|
895
|
+
},
|
|
896
|
+
"rendering": {
|
|
897
|
+
"type": "string",
|
|
898
|
+
"enum": ["spa", "ssr", "ssg", "streaming-ssr", "mixed"]
|
|
899
|
+
},
|
|
900
|
+
"router": {
|
|
901
|
+
"type": "string",
|
|
902
|
+
"description": "e.g. TanStack Router (file-based), React Router"
|
|
903
|
+
},
|
|
904
|
+
"styling": {
|
|
905
|
+
"type": "string",
|
|
906
|
+
"description": "the design system, e.g. Mantine, Tailwind, MUI, CSS modules"
|
|
907
|
+
},
|
|
908
|
+
"designSystemConsistency": {
|
|
909
|
+
"type": "string",
|
|
910
|
+
"enum": ["single-system", "mostly-consistent", "mixed", "ad-hoc"],
|
|
911
|
+
"description": "how uniformly ONE component/theme system is used — the rebuild target is 'everything Mantine', so divergence is porting work"
|
|
912
|
+
},
|
|
526
913
|
"designFindings": {
|
|
527
914
|
"type": "array",
|
|
528
915
|
"description": "Concrete broken/inconsistent design patterns observed across the UI. Each is a specific, cited observation of a consistency defect — not a taste opinion. These become the design recommendations in the second-opinion report.",
|
|
529
916
|
"items": {
|
|
530
917
|
"type": "object",
|
|
531
|
-
"required": [
|
|
918
|
+
"required": [
|
|
919
|
+
"pattern",
|
|
920
|
+
"observation",
|
|
921
|
+
"recommendation",
|
|
922
|
+
"evidence"
|
|
923
|
+
],
|
|
532
924
|
"properties": {
|
|
533
925
|
"pattern": {
|
|
534
926
|
"type": "string",
|
|
@@ -545,20 +937,41 @@
|
|
|
545
937
|
],
|
|
546
938
|
"description": "interaction-inconsistency = same job done different ways (modal here, drawer there; inconsistent confirm dialogs). theming-not-tokenized = hardcoded colors/spacing/fonts instead of theme tokens/variables. cross-page-inconsistency = the same element (button/header/card) styled differently across pages. component-duplication = several near-identical components for one purpose. spacing-typography-scale = ad-hoc magic numbers off any scale. design-system-bypass = raw HTML/CSS where a design-system component exists. accessibility / responsive = a11y or breakpoint defects."
|
|
547
939
|
},
|
|
548
|
-
"observation": {
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
940
|
+
"observation": {
|
|
941
|
+
"type": "string",
|
|
942
|
+
"description": "what is inconsistent, with concrete examples (e.g. 'Add-site uses a Drawer, Edit-site uses a Modal for the same task')"
|
|
943
|
+
},
|
|
944
|
+
"impact": {
|
|
945
|
+
"type": "string",
|
|
946
|
+
"description": "what it does to the user (feels unpolished/confusing) or to maintenance (a color change means hunting every file)"
|
|
947
|
+
},
|
|
948
|
+
"recommendation": {
|
|
949
|
+
"type": "string",
|
|
950
|
+
"description": "the fix — usually standardize on one pattern, move values to theme tokens, or extract one shared component"
|
|
951
|
+
},
|
|
952
|
+
"severity": {
|
|
953
|
+
"type": "string",
|
|
954
|
+
"enum": ["minor", "worth-fixing", "serious"]
|
|
955
|
+
},
|
|
552
956
|
"evidence": { "$ref": "#/$defs/evidence" },
|
|
553
957
|
"confidence": { "$ref": "#/$defs/confidence" }
|
|
554
958
|
}
|
|
555
959
|
}
|
|
556
960
|
},
|
|
557
961
|
"stateManagement": { "type": "string" },
|
|
558
|
-
"dataLayer": {
|
|
559
|
-
|
|
962
|
+
"dataLayer": {
|
|
963
|
+
"type": "string",
|
|
964
|
+
"description": "how the UI talks to the backend: e.g. pikku-react-query, REST fetch helpers, tRPC, GraphQL client"
|
|
965
|
+
},
|
|
966
|
+
"auth": {
|
|
967
|
+
"type": "string",
|
|
968
|
+
"description": "client auth mechanism: e.g. better-auth, next-auth, custom JWT"
|
|
969
|
+
},
|
|
560
970
|
"buildTool": { "type": "string" },
|
|
561
|
-
"i18n": {
|
|
971
|
+
"i18n": {
|
|
972
|
+
"type": "string",
|
|
973
|
+
"description": "internationalization approach, or 'none'"
|
|
974
|
+
},
|
|
562
975
|
"notes": { "type": "array", "items": { "type": "string" } },
|
|
563
976
|
"evidence": { "$ref": "#/$defs/evidence" },
|
|
564
977
|
"confidence": { "$ref": "#/$defs/confidence" }
|
|
@@ -576,13 +989,43 @@
|
|
|
576
989
|
"type": "object",
|
|
577
990
|
"required": ["path", "purpose", "evidence"],
|
|
578
991
|
"properties": {
|
|
579
|
-
"path": {
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
"
|
|
584
|
-
|
|
585
|
-
|
|
992
|
+
"path": {
|
|
993
|
+
"type": "string",
|
|
994
|
+
"description": "URL path, e.g. /app/sites/:id"
|
|
995
|
+
},
|
|
996
|
+
"kind": {
|
|
997
|
+
"type": "string",
|
|
998
|
+
"enum": [
|
|
999
|
+
"page",
|
|
1000
|
+
"layout",
|
|
1001
|
+
"index",
|
|
1002
|
+
"modal-or-drawer",
|
|
1003
|
+
"redirect"
|
|
1004
|
+
]
|
|
1005
|
+
},
|
|
1006
|
+
"purpose": {
|
|
1007
|
+
"type": "string",
|
|
1008
|
+
"description": "what the user does/sees here, in product terms"
|
|
1009
|
+
},
|
|
1010
|
+
"auth": {
|
|
1011
|
+
"type": "string",
|
|
1012
|
+
"description": "none | authenticated | admin | role:xyz"
|
|
1013
|
+
},
|
|
1014
|
+
"dataFrom": {
|
|
1015
|
+
"type": "array",
|
|
1016
|
+
"items": { "type": "string" },
|
|
1017
|
+
"description": "query/command names (from queries.json/commands.json) this route reads/calls"
|
|
1018
|
+
},
|
|
1019
|
+
"usesComponents": {
|
|
1020
|
+
"type": "array",
|
|
1021
|
+
"items": { "type": "string" },
|
|
1022
|
+
"description": "component names from frontend-components.json"
|
|
1023
|
+
},
|
|
1024
|
+
"userFlows": {
|
|
1025
|
+
"type": "array",
|
|
1026
|
+
"items": { "type": "string" },
|
|
1027
|
+
"description": "workflows.json (kind=user) names this route participates in"
|
|
1028
|
+
},
|
|
586
1029
|
"evidence": { "$ref": "#/$defs/evidence" },
|
|
587
1030
|
"confidence": { "$ref": "#/$defs/confidence" }
|
|
588
1031
|
}
|
|
@@ -603,17 +1046,52 @@
|
|
|
603
1046
|
"required": ["name", "role", "rebuild", "evidence", "confidence"],
|
|
604
1047
|
"properties": {
|
|
605
1048
|
"name": { "type": "string" },
|
|
606
|
-
"role": {
|
|
1049
|
+
"role": {
|
|
1050
|
+
"type": "string",
|
|
1051
|
+
"enum": [
|
|
1052
|
+
"layout",
|
|
1053
|
+
"navigation",
|
|
1054
|
+
"presentational",
|
|
1055
|
+
"feature",
|
|
1056
|
+
"form",
|
|
1057
|
+
"data-display",
|
|
1058
|
+
"chart",
|
|
1059
|
+
"table",
|
|
1060
|
+
"overlay",
|
|
1061
|
+
"provider",
|
|
1062
|
+
"other"
|
|
1063
|
+
]
|
|
1064
|
+
},
|
|
607
1065
|
"purpose": { "type": "string" },
|
|
608
|
-
"reuse": {
|
|
1066
|
+
"reuse": {
|
|
1067
|
+
"type": "string",
|
|
1068
|
+
"enum": ["shared", "one-off"],
|
|
1069
|
+
"description": "used across features vs single-use"
|
|
1070
|
+
},
|
|
609
1071
|
"rebuild": {
|
|
610
1072
|
"type": "string",
|
|
611
|
-
"enum": [
|
|
1073
|
+
"enum": [
|
|
1074
|
+
"mantine-standard",
|
|
1075
|
+
"mantine-composition",
|
|
1076
|
+
"custom-style",
|
|
1077
|
+
"custom-logic"
|
|
1078
|
+
],
|
|
612
1079
|
"description": "mantine-standard = maps 1:1 to a Mantine component (trivial); mantine-composition = built from Mantine primitives (straightforward); custom-style = diverges visually from the design system (normalize to Mantine); custom-logic = bespoke behavior (chart/table/canvas/drag/editor) that must be PORTED, not re-skinned"
|
|
613
1080
|
},
|
|
614
|
-
"customLogic": {
|
|
615
|
-
|
|
616
|
-
|
|
1081
|
+
"customLogic": {
|
|
1082
|
+
"type": "string",
|
|
1083
|
+
"description": "REQUIRED when rebuild=custom-logic: what the bespoke behavior is and why a stock component can't replace it"
|
|
1084
|
+
},
|
|
1085
|
+
"dependencies": {
|
|
1086
|
+
"type": "array",
|
|
1087
|
+
"items": { "type": "string" },
|
|
1088
|
+
"description": "notable libs it pulls in (charting/table/editor) — replacement considerations for the port"
|
|
1089
|
+
},
|
|
1090
|
+
"usedBy": {
|
|
1091
|
+
"type": "array",
|
|
1092
|
+
"items": { "type": "string" },
|
|
1093
|
+
"description": "routes/components that use it"
|
|
1094
|
+
},
|
|
617
1095
|
"evidence": { "$ref": "#/$defs/evidence" },
|
|
618
1096
|
"confidence": { "$ref": "#/$defs/confidence" }
|
|
619
1097
|
}
|