kibi-cli 2.2.0 → 2.3.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 (183) hide show
  1. package/dist/cli-operation-loader.d.ts.map +1 -1
  2. package/dist/cli-operation-loader.js +3 -0
  3. package/dist/cli-operation-metadata.d.ts +4 -0
  4. package/dist/cli-operation-metadata.d.ts.map +1 -1
  5. package/dist/cli-operation-metadata.js +5 -0
  6. package/dist/cli-register-reporting.d.ts.map +1 -1
  7. package/dist/cli-register-reporting.js +4 -0
  8. package/dist/commands/check-diff.d.ts +5 -0
  9. package/dist/commands/check-diff.d.ts.map +1 -0
  10. package/dist/commands/check-diff.js +62 -0
  11. package/dist/commands/check-generated.d.ts.map +1 -1
  12. package/dist/commands/check-generated.js +41 -18
  13. package/dist/commands/check.d.ts.map +1 -1
  14. package/dist/commands/check.js +210 -73
  15. package/dist/commands/doctor.d.ts.map +1 -1
  16. package/dist/commands/doctor.js +63 -29
  17. package/dist/commands/github-init.d.ts.map +1 -1
  18. package/dist/commands/github-init.js +9 -2
  19. package/dist/commands/sync/manifest.d.ts.map +1 -1
  20. package/dist/commands/sync/manifest.js +3 -1
  21. package/dist/engine.d.ts +15 -1
  22. package/dist/engine.d.ts.map +1 -1
  23. package/dist/engine.js +252 -52
  24. package/dist/extractors/symbols-coordinator.d.ts +7 -0
  25. package/dist/extractors/symbols-coordinator.d.ts.map +1 -1
  26. package/dist/extractors/symbols-coordinator.js +75 -39
  27. package/dist/operations/modeling/predicate-inference-1.js +1 -1
  28. package/dist/operations/mutation/source-authoring.d.ts.map +1 -1
  29. package/dist/operations/mutation/source-authoring.js +175 -53
  30. package/dist/operations/mutation/upsert.d.ts.map +1 -1
  31. package/dist/operations/mutation/upsert.js +5 -7
  32. package/dist/operations/planning/apply-plan.d.ts.map +1 -1
  33. package/dist/operations/planning/apply-plan.js +5 -9
  34. package/dist/operations/proof/ingest-proof.d.ts.map +1 -1
  35. package/dist/operations/proof/ingest-proof.js +1 -0
  36. package/dist/operations/semantic-advisor/analysis-receipt.d.ts.map +1 -1
  37. package/dist/operations/semantic-advisor/analysis-receipt.js +7 -1
  38. package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
  39. package/dist/operations/semantic-advisor/analyze-prose.js +26 -4
  40. package/dist/operations/semantic-advisor/clauses.d.ts +1 -0
  41. package/dist/operations/semantic-advisor/clauses.d.ts.map +1 -1
  42. package/dist/operations/semantic-advisor/clauses.js +7 -1
  43. package/dist/performance-trace.d.ts +17 -0
  44. package/dist/performance-trace.d.ts.map +1 -0
  45. package/dist/performance-trace.js +134 -0
  46. package/dist/plugins/approved-source-analyzers.d.ts +13 -0
  47. package/dist/plugins/approved-source-analyzers.d.ts.map +1 -0
  48. package/dist/plugins/approved-source-analyzers.generated.d.ts +71 -0
  49. package/dist/plugins/approved-source-analyzers.generated.d.ts.map +1 -0
  50. package/dist/plugins/approved-source-analyzers.generated.js +77 -0
  51. package/dist/plugins/approved-source-analyzers.js +3 -0
  52. package/dist/plugins/maintenance-source-analysis.d.ts +14 -0
  53. package/dist/plugins/maintenance-source-analysis.d.ts.map +1 -0
  54. package/dist/plugins/maintenance-source-analysis.js +191 -0
  55. package/dist/plugins/registry.d.ts +2 -1
  56. package/dist/plugins/registry.d.ts.map +1 -1
  57. package/dist/plugins/registry.js +6 -1
  58. package/dist/plugins/source-analysis-service.d.ts +36 -1
  59. package/dist/plugins/source-analysis-service.d.ts.map +1 -1
  60. package/dist/plugins/source-analysis-service.js +184 -27
  61. package/dist/plugins/source-change-analysis.d.ts +15 -0
  62. package/dist/plugins/source-change-analysis.d.ts.map +1 -0
  63. package/dist/plugins/source-change-analysis.js +54 -0
  64. package/dist/plugins/source-classification.d.ts +41 -0
  65. package/dist/plugins/source-classification.d.ts.map +1 -0
  66. package/dist/plugins/source-classification.js +490 -0
  67. package/dist/prolog/swipl-resolver.d.ts +88 -0
  68. package/dist/prolog/swipl-resolver.d.ts.map +1 -0
  69. package/dist/prolog/swipl-resolver.js +446 -0
  70. package/dist/prolog.d.ts +15 -1
  71. package/dist/prolog.d.ts.map +1 -1
  72. package/dist/prolog.js +67 -6
  73. package/dist/public/impact/analyzer.d.ts.map +1 -1
  74. package/dist/public/impact/analyzer.js +56 -5
  75. package/dist/public/impact/diagnostics.d.ts.map +1 -1
  76. package/dist/public/impact/diagnostics.js +3 -1
  77. package/dist/public/impact/manifest.d.ts.map +1 -1
  78. package/dist/public/impact/manifest.js +15 -1
  79. package/dist/public/impact/source-changes.d.ts.map +1 -1
  80. package/dist/public/impact/source-changes.js +35 -27
  81. package/dist/public/impact/types.d.ts +2 -0
  82. package/dist/public/impact/types.d.ts.map +1 -1
  83. package/dist/public/operations/catalog.d.ts +44 -0
  84. package/dist/public/operations/catalog.d.ts.map +1 -1
  85. package/dist/public/operations/catalog.js +2 -0
  86. package/dist/public/operations/contracts.d.ts.map +1 -1
  87. package/dist/public/operations/contracts.js +309 -8
  88. package/dist/public/operations/impact-review-preparation.d.ts +14 -0
  89. package/dist/public/operations/impact-review-preparation.d.ts.map +1 -0
  90. package/dist/public/operations/impact-review-preparation.js +379 -0
  91. package/dist/public/operations/index.d.ts +2 -0
  92. package/dist/public/operations/index.d.ts.map +1 -1
  93. package/dist/public/operations/index.js +2 -0
  94. package/dist/public/operations/node-ports.d.ts.map +1 -1
  95. package/dist/public/operations/node-ports.js +1 -35
  96. package/dist/public/operations/proof-receipt-projection.d.ts +5 -0
  97. package/dist/public/operations/proof-receipt-projection.d.ts.map +1 -0
  98. package/dist/public/operations/proof-receipt-projection.js +36 -0
  99. package/dist/public/operations/specs/impact-review-preparation.d.ts +47 -0
  100. package/dist/public/operations/specs/impact-review-preparation.d.ts.map +1 -0
  101. package/dist/public/operations/specs/impact-review-preparation.js +43 -0
  102. package/dist/public/operations/types.d.ts +1 -1
  103. package/dist/public/operations/types.d.ts.map +1 -1
  104. package/dist/public/skills/kibi-usage/resources/operation-access.md +1 -0
  105. package/dist/traceability/analysis-gate.d.ts +39 -0
  106. package/dist/traceability/analysis-gate.d.ts.map +1 -0
  107. package/dist/traceability/analysis-gate.js +51 -0
  108. package/dist/traceability/git-change-snapshot.d.ts +27 -0
  109. package/dist/traceability/git-change-snapshot.d.ts.map +1 -0
  110. package/dist/traceability/git-change-snapshot.js +411 -0
  111. package/dist/traceability/git-staged.d.ts +5 -1
  112. package/dist/traceability/git-staged.d.ts.map +1 -1
  113. package/dist/traceability/git-staged.js +16 -11
  114. package/dist/traceability/impact-evaluator.d.ts +54 -0
  115. package/dist/traceability/impact-evaluator.d.ts.map +1 -0
  116. package/dist/traceability/impact-evaluator.js +270 -0
  117. package/dist/traceability/impact-git-tree.d.ts +12 -0
  118. package/dist/traceability/impact-git-tree.d.ts.map +1 -0
  119. package/dist/traceability/impact-git-tree.js +46 -0
  120. package/dist/traceability/impact-knowledge.d.ts +16 -0
  121. package/dist/traceability/impact-knowledge.d.ts.map +1 -0
  122. package/dist/traceability/impact-knowledge.js +165 -0
  123. package/dist/traceability/impact-policy.d.ts +15 -0
  124. package/dist/traceability/impact-policy.d.ts.map +1 -0
  125. package/dist/traceability/impact-policy.js +48 -0
  126. package/dist/traceability/impact-policy.v1.schema.json +48 -0
  127. package/dist/traceability/impact-pr-diff.d.ts +5 -0
  128. package/dist/traceability/impact-pr-diff.d.ts.map +1 -0
  129. package/dist/traceability/impact-pr-diff.js +83 -0
  130. package/dist/traceability/impact-record-validation.d.ts +9 -0
  131. package/dist/traceability/impact-record-validation.d.ts.map +1 -0
  132. package/dist/traceability/impact-record-validation.js +113 -0
  133. package/dist/traceability/impact-review.d.ts +148 -0
  134. package/dist/traceability/impact-review.d.ts.map +1 -0
  135. package/dist/traceability/impact-review.js +494 -0
  136. package/dist/traceability/impact-review.schema.json +365 -0
  137. package/dist/traceability/impact-side-evidence.d.ts +13 -0
  138. package/dist/traceability/impact-side-evidence.d.ts.map +1 -0
  139. package/dist/traceability/impact-side-evidence.js +240 -0
  140. package/dist/traceability/reviewed-coordinate-refresh.d.ts +10 -0
  141. package/dist/traceability/reviewed-coordinate-refresh.d.ts.map +1 -0
  142. package/dist/traceability/reviewed-coordinate-refresh.js +49 -0
  143. package/dist/traceability/snapshot-knowledge.d.ts +4 -0
  144. package/dist/traceability/snapshot-knowledge.d.ts.map +1 -0
  145. package/dist/traceability/snapshot-knowledge.js +98 -0
  146. package/dist/traceability/staged-file-coverage.d.ts +23 -0
  147. package/dist/traceability/staged-file-coverage.d.ts.map +1 -1
  148. package/dist/traceability/staged-impact-contract.d.ts.map +1 -1
  149. package/dist/traceability/staged-impact-contract.js +2 -16
  150. package/dist/traceability/staged-symbols-manifest.d.ts +4 -0
  151. package/dist/traceability/staged-symbols-manifest.d.ts.map +1 -1
  152. package/dist/traceability/staged-symbols-manifest.js +17 -6
  153. package/dist/traceability/symbol-extract.d.ts +3 -5
  154. package/dist/traceability/symbol-extract.d.ts.map +1 -1
  155. package/dist/traceability/symbol-extract.js +49 -34
  156. package/dist/traceability/temp-kb.d.ts +1 -1
  157. package/dist/traceability/temp-kb.d.ts.map +1 -1
  158. package/dist/traceability/temp-kb.js +49 -13
  159. package/dist/traceability/trusted-pr-event.d.ts +13 -0
  160. package/dist/traceability/trusted-pr-event.d.ts.map +1 -0
  161. package/dist/traceability/trusted-pr-event.js +105 -0
  162. package/dist/utils/canonical-path.d.ts +3 -0
  163. package/dist/utils/canonical-path.d.ts.map +1 -0
  164. package/dist/utils/canonical-path.js +33 -0
  165. package/package.json +14 -5
  166. package/src/public/impact/analyzer.ts +88 -5
  167. package/src/public/impact/diagnostics.ts +7 -5
  168. package/src/public/impact/manifest.ts +14 -1
  169. package/src/public/impact/source-changes.ts +39 -34
  170. package/src/public/impact/types.ts +5 -0
  171. package/src/public/operations/catalog.ts +2 -0
  172. package/src/public/operations/contracts.ts +385 -9
  173. package/src/public/operations/impact-review-preparation.ts +548 -0
  174. package/src/public/operations/index.ts +2 -0
  175. package/src/public/operations/node-ports.ts +1 -39
  176. package/src/public/operations/proof-receipt-projection.ts +39 -0
  177. package/src/public/operations/specs/impact-review-preparation.ts +46 -0
  178. package/src/public/operations/types.ts +1 -0
  179. package/src/public/skills/kibi-usage/resources/operation-access.md +1 -0
  180. package/src/traceability/impact-policy.v1.schema.json +48 -0
  181. package/src/traceability/impact-review.schema.json +365 -0
  182. package/templates/github/kibi-badge.yml +0 -4
  183. package/templates/github/kibi-report.yml +0 -4
@@ -20,6 +20,14 @@ const valueArray: OperationJsonSchema = {
20
20
  type: "array",
21
21
  items: anyValue,
22
22
  };
23
+ const stringValue: OperationJsonSchema = { type: "string" };
24
+ const integerValue: OperationJsonSchema = { type: "integer" };
25
+ const numberValue: OperationJsonSchema = { type: "number" };
26
+ const booleanValue: OperationJsonSchema = { type: "boolean" };
27
+ const stringArray: OperationJsonSchema = {
28
+ type: "array",
29
+ items: stringValue,
30
+ };
23
31
 
24
32
  function objectData(
25
33
  properties: Readonly<Record<string, OperationJsonSchema>>,
@@ -33,6 +41,357 @@ function objectData(
33
41
  };
34
42
  }
35
43
 
44
+ const sha256Fingerprint: OperationJsonSchema = {
45
+ type: "string",
46
+ pattern: "^sha256:[0-9a-f]{64}$",
47
+ };
48
+ const gitObjectId: OperationJsonSchema = {
49
+ type: "string",
50
+ pattern: "^(?:[0-9a-f]{40}|[0-9a-f]{64})$",
51
+ };
52
+ const reviewRange = objectData({ start: integerValue, end: integerValue }, [
53
+ "start",
54
+ "end",
55
+ ]);
56
+ const uncoveredReviewRange = objectData(
57
+ {
58
+ startLine: integerValue,
59
+ startColumn: integerValue,
60
+ endLine: integerValue,
61
+ endColumn: integerValue,
62
+ reason: stringValue,
63
+ },
64
+ ["startLine", "startColumn", "endLine", "endColumn", "reason"],
65
+ );
66
+ const reviewAnalysis = objectData(
67
+ {
68
+ contractVersion: { const: "kibi.symbol-extractor.v2" },
69
+ status: { enum: ["ok", "partial", "unsupported", "failed"] },
70
+ language: stringValue,
71
+ sourceFile: stringValue,
72
+ providerId: { type: ["string", "null"] },
73
+ providerStamp: anyValue,
74
+ providerFingerprint: { oneOf: [sha256Fingerprint, { type: "null" }] },
75
+ inputFingerprint: sha256Fingerprint,
76
+ resultFingerprint: sha256Fingerprint,
77
+ diagnosticCodes: stringArray,
78
+ uncoveredRanges: {
79
+ type: "array",
80
+ items: uncoveredReviewRange,
81
+ },
82
+ },
83
+ [
84
+ "contractVersion",
85
+ "status",
86
+ "language",
87
+ "sourceFile",
88
+ "providerId",
89
+ "providerStamp",
90
+ "providerFingerprint",
91
+ "inputFingerprint",
92
+ "resultFingerprint",
93
+ "diagnosticCodes",
94
+ "uncoveredRanges",
95
+ ],
96
+ );
97
+ const reviewSideEvidence = objectData(
98
+ {
99
+ mode: { enum: ["100644", "100755", "120000", "160000"] },
100
+ objectId: { oneOf: [gitObjectId, { type: "null" }] },
101
+ byteFingerprint: sha256Fingerprint,
102
+ kind: { enum: ["regular", "symlink", "gitlink"] },
103
+ contentProjection: { const: "proof_receipts_stripped" },
104
+ analysis: { oneOf: [reviewAnalysis, { type: "null" }] },
105
+ },
106
+ ["mode", "objectId", "byteFingerprint", "kind", "analysis"],
107
+ );
108
+ const reviewFileEvidence = {
109
+ ...objectData(
110
+ {
111
+ path: stringValue,
112
+ status: { enum: ["A", "M", "R", "C", "T", "D"] },
113
+ oldPath: stringValue,
114
+ copyFromPath: stringValue,
115
+ analysisDepth: { enum: ["symbol", "metadata", "file", "none"] },
116
+ disposition: { enum: ["checked", "advisory", "skipped"] },
117
+ skipReason: {
118
+ enum: ["binary", "unsupported_encoding", "symlink", "submodule"],
119
+ },
120
+ gitMode: stringValue,
121
+ previousMode: stringValue,
122
+ oldHunkRanges: { type: "array", items: reviewRange },
123
+ newHunkRanges: { type: "array", items: reviewRange },
124
+ before: { oneOf: [reviewSideEvidence, { type: "null" }] },
125
+ after: { oneOf: [reviewSideEvidence, { type: "null" }] },
126
+ },
127
+ [
128
+ "path",
129
+ "status",
130
+ "analysisDepth",
131
+ "disposition",
132
+ "oldHunkRanges",
133
+ "newHunkRanges",
134
+ "before",
135
+ "after",
136
+ ],
137
+ ),
138
+ anyOf: [
139
+ { properties: { before: reviewSideEvidence } },
140
+ { properties: { after: reviewSideEvidence } },
141
+ ],
142
+ };
143
+ const recordTemplateFile = {
144
+ ...objectData(
145
+ {
146
+ ...(((reviewFileEvidence as OperationJsonSchema).properties as Record<
147
+ string,
148
+ OperationJsonSchema
149
+ >) ?? {}),
150
+ analysisReviews: { type: "null" },
151
+ decision: { type: "null" },
152
+ },
153
+ [
154
+ "path",
155
+ "status",
156
+ "analysisDepth",
157
+ "disposition",
158
+ "oldHunkRanges",
159
+ "newHunkRanges",
160
+ "before",
161
+ "after",
162
+ "analysisReviews",
163
+ "decision",
164
+ ],
165
+ ),
166
+ anyOf: [
167
+ { properties: { before: reviewSideEvidence } },
168
+ { properties: { after: reviewSideEvidence } },
169
+ ],
170
+ };
171
+ const impactRecordHeaders = objectData(
172
+ {
173
+ contractVersion: { const: "kibi.impact-review.v1" },
174
+ policy: objectData(
175
+ {
176
+ id: stringValue,
177
+ version: stringValue,
178
+ fingerprint: sha256Fingerprint,
179
+ },
180
+ ["id", "version", "fingerprint"],
181
+ ),
182
+ evaluator: objectData(
183
+ {
184
+ contractVersion: { const: "kibi.impact-evaluator.v1" },
185
+ fingerprint: sha256Fingerprint,
186
+ },
187
+ ["contractVersion", "fingerprint"],
188
+ ),
189
+ scope: objectData(
190
+ {
191
+ fingerprint: sha256Fingerprint,
192
+ knowledgeFingerprint: sha256Fingerprint,
193
+ providerSetFingerprint: sha256Fingerprint,
194
+ },
195
+ ["fingerprint", "knowledgeFingerprint", "providerSetFingerprint"],
196
+ ),
197
+ },
198
+ ["contractVersion", "policy", "evaluator", "scope"],
199
+ );
200
+ const reviewSnapshotIdentity = objectData(
201
+ {
202
+ kind: { enum: ["staged", "diff"] },
203
+ baseCommit: { oneOf: [gitObjectId, { type: "null" }] },
204
+ baseTree: gitObjectId,
205
+ headCommit: { oneOf: [gitObjectId, { type: "null" }] },
206
+ headTree: gitObjectId,
207
+ headTreeSource: { enum: ["index", "commit"] },
208
+ },
209
+ [
210
+ "kind",
211
+ "baseCommit",
212
+ "baseTree",
213
+ "headCommit",
214
+ "headTree",
215
+ "headTreeSource",
216
+ ],
217
+ );
218
+ const semanticEdge = objectData(
219
+ { type: stringValue, from: stringValue, to: stringValue },
220
+ ["type", "from", "to"],
221
+ );
222
+ const relatedRequirementEntity = objectData(
223
+ {
224
+ id: stringValue,
225
+ type: { oneOf: [stringValue, { type: "null" }] },
226
+ entityFingerprint: { oneOf: [sha256Fingerprint, { type: "null" }] },
227
+ artifactPath: { oneOf: [stringValue, { type: "null" }] },
228
+ sourcePath: { oneOf: [stringValue, { type: "null" }] },
229
+ entity: recordValue,
230
+ },
231
+ ["id", "type", "entityFingerprint", "artifactPath", "sourcePath", "entity"],
232
+ );
233
+ const requirementContext = {
234
+ oneOf: [
235
+ objectData(
236
+ {
237
+ id: stringValue,
238
+ state: { const: "absent" },
239
+ entityFingerprint: { type: "null" },
240
+ artifactPath: { type: "null" },
241
+ sourcePath: { type: "null" },
242
+ relationships: { type: "array", items: semanticEdge },
243
+ relatedEntities: { type: "array", items: relatedRequirementEntity },
244
+ },
245
+ [
246
+ "id",
247
+ "state",
248
+ "entityFingerprint",
249
+ "artifactPath",
250
+ "sourcePath",
251
+ "relationships",
252
+ "relatedEntities",
253
+ ],
254
+ ),
255
+ objectData(
256
+ {
257
+ id: stringValue,
258
+ state: { const: "present" },
259
+ entityFingerprint: sha256Fingerprint,
260
+ artifactPath: stringValue,
261
+ sourcePath: { oneOf: [stringValue, { type: "null" }] },
262
+ entity: recordValue,
263
+ relationships: { type: "array", items: semanticEdge },
264
+ relatedEntities: { type: "array", items: relatedRequirementEntity },
265
+ },
266
+ [
267
+ "id",
268
+ "state",
269
+ "entityFingerprint",
270
+ "artifactPath",
271
+ "sourcePath",
272
+ "entity",
273
+ "relationships",
274
+ "relatedEntities",
275
+ ],
276
+ ),
277
+ ],
278
+ };
279
+ const requirementScope = objectData(
280
+ {
281
+ path: stringValue,
282
+ requirementIds: stringArray,
283
+ before: { type: "array", items: requirementContext },
284
+ after: { type: "array", items: requirementContext },
285
+ },
286
+ ["path", "requirementIds", "before", "after"],
287
+ );
288
+ const residualReviewObligation: OperationJsonSchema = {
289
+ oneOf: [
290
+ objectData(
291
+ {
292
+ path: stringValue,
293
+ side: { enum: ["before", "after"] },
294
+ status: { const: "unsupported" },
295
+ diagnosticCodes: stringArray,
296
+ kind: { const: "unsupported_review" },
297
+ wholeFile: { const: true },
298
+ pending: { const: true },
299
+ },
300
+ [
301
+ "path",
302
+ "side",
303
+ "status",
304
+ "diagnosticCodes",
305
+ "kind",
306
+ "wholeFile",
307
+ "pending",
308
+ ],
309
+ ),
310
+ objectData(
311
+ {
312
+ path: stringValue,
313
+ side: { enum: ["before", "after"] },
314
+ status: { const: "partial" },
315
+ diagnosticCodes: stringArray,
316
+ kind: { const: "partial_review" },
317
+ limitationClass: stringValue,
318
+ ranges: { type: "array", items: uncoveredReviewRange },
319
+ pending: { const: true },
320
+ },
321
+ [
322
+ "path",
323
+ "side",
324
+ "status",
325
+ "diagnosticCodes",
326
+ "kind",
327
+ "limitationClass",
328
+ "ranges",
329
+ "pending",
330
+ ],
331
+ ),
332
+ ],
333
+ };
334
+ const unauthoredRecordTemplate = objectData(
335
+ {
336
+ contractVersion: { const: "kibi.impact-review.v1" },
337
+ policy: (
338
+ impactRecordHeaders.properties as Record<string, OperationJsonSchema>
339
+ ).policy as OperationJsonSchema,
340
+ evaluator: (
341
+ impactRecordHeaders.properties as Record<string, OperationJsonSchema>
342
+ ).evaluator as OperationJsonSchema,
343
+ scope: (
344
+ impactRecordHeaders.properties as Record<string, OperationJsonSchema>
345
+ ).scope as OperationJsonSchema,
346
+ reviewer: objectData(
347
+ { id: { type: "null" }, source: { const: "self-claimed-local" } },
348
+ ["id", "source"],
349
+ ),
350
+ reviewedAt: { type: "null" },
351
+ files: { type: "array", items: recordTemplateFile },
352
+ },
353
+ [
354
+ "contractVersion",
355
+ "policy",
356
+ "evaluator",
357
+ "scope",
358
+ "reviewer",
359
+ "reviewedAt",
360
+ "files",
361
+ ],
362
+ );
363
+ const impactReviewAuthorship = objectData(
364
+ {
365
+ templateVersion: { const: "kibi.impact-review-authoring-template.v1" },
366
+ isValidImpactReviewRecord: { const: false },
367
+ instructions: stringValue,
368
+ authoredFields: stringArray,
369
+ recordSchema: recordValue,
370
+ decisionSchema: recordValue,
371
+ analysisReviewSchema: recordValue,
372
+ templateSchema: recordValue,
373
+ recordTemplate: objectData(
374
+ {
375
+ templateVersion: { const: "kibi.impact-review-authoring-template.v1" },
376
+ isValidImpactReviewRecord: { const: false },
377
+ record: unauthoredRecordTemplate,
378
+ },
379
+ ["templateVersion", "isValidImpactReviewRecord", "record"],
380
+ ),
381
+ },
382
+ [
383
+ "templateVersion",
384
+ "isValidImpactReviewRecord",
385
+ "instructions",
386
+ "authoredFields",
387
+ "recordSchema",
388
+ "decisionSchema",
389
+ "analysisReviewSchema",
390
+ "templateSchema",
391
+ "recordTemplate",
392
+ ],
393
+ );
394
+
36
395
  /**
37
396
  * kibi.job.v1 receipt returned by async-mode operations (kb_check with
38
397
  * `async: true`) instead of the synchronous payload. Agents poll
@@ -52,15 +411,6 @@ const jobReceiptData: OperationJsonSchema = objectData(
52
411
  ["kibiProtocol", "jobVersion", "jobId", "tool", "status", "pollWith"],
53
412
  );
54
413
 
55
- const stringValue: OperationJsonSchema = { type: "string" };
56
- const integerValue: OperationJsonSchema = { type: "integer" };
57
- const numberValue: OperationJsonSchema = { type: "number" };
58
- const booleanValue: OperationJsonSchema = { type: "boolean" };
59
- const stringArray: OperationJsonSchema = {
60
- type: "array",
61
- items: stringValue,
62
- };
63
-
64
414
  /** Preserve JSON Schema's nullable scalar/object representation in every
65
415
  * generated consumer contract. Using a `type` union keeps the catalog
66
416
  * readable and lets the MCP bridge round-trip the same wire schema. */
@@ -298,6 +648,31 @@ export const OPERATION_DATA_SCHEMAS: Readonly<
298
648
  jobReceiptData,
299
649
  ],
300
650
  },
651
+ kb_prepare_impact_review: objectData(
652
+ {
653
+ preparationVersion: { const: "kibi.impact-review-preparation.v1" },
654
+ status: { const: "ready_for_authoring" },
655
+ snapshot: reviewSnapshotIdentity,
656
+ recordHeaders: impactRecordHeaders,
657
+ files: { type: "array", items: reviewFileEvidence },
658
+ requirementScopes: { type: "array", items: requirementScope },
659
+ residualReviewObligations: {
660
+ type: "array",
661
+ items: residualReviewObligation,
662
+ },
663
+ authorship: impactReviewAuthorship,
664
+ },
665
+ [
666
+ "preparationVersion",
667
+ "status",
668
+ "snapshot",
669
+ "recordHeaders",
670
+ "files",
671
+ "requirementScopes",
672
+ "residualReviewObligations",
673
+ "authorship",
674
+ ],
675
+ ),
301
676
  kb_compile_intent: objectData({
302
677
  version: stringValue,
303
678
  planHash: stringValue,
@@ -383,6 +758,7 @@ const EFFECT_OVERRIDES: Readonly<
383
758
  "workspace-write": { destructive: true, retrySafety: "unsafe" },
384
759
  },
385
760
  kb_check: {},
761
+ kb_prepare_impact_review: {},
386
762
  kb_compile_intent: {},
387
763
  kb_apply_plan: {
388
764
  "kb-write": { destructive: true, retrySafety: "unsafe" },