@cat-factory/contracts 0.223.0 → 0.225.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 (81) hide show
  1. package/dist/agent-gating.d.ts.map +1 -1
  2. package/dist/agent-gating.js +14 -0
  3. package/dist/agent-gating.js.map +1 -1
  4. package/dist/binary-modalities.d.ts +61 -0
  5. package/dist/binary-modalities.d.ts.map +1 -1
  6. package/dist/binary-modalities.js +84 -0
  7. package/dist/binary-modalities.js.map +1 -1
  8. package/dist/debug-api.d.ts +9 -0
  9. package/dist/debug-api.d.ts.map +1 -1
  10. package/dist/debug-api.js +6 -0
  11. package/dist/debug-api.js.map +1 -1
  12. package/dist/errors.d.ts +1 -1
  13. package/dist/errors.d.ts.map +1 -1
  14. package/dist/errors.js +5 -0
  15. package/dist/errors.js.map +1 -1
  16. package/dist/execution.d.ts +147 -2
  17. package/dist/execution.d.ts.map +1 -1
  18. package/dist/execution.js +74 -1
  19. package/dist/execution.js.map +1 -1
  20. package/dist/index.d.ts +1 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +1 -0
  23. package/dist/index.js.map +1 -1
  24. package/dist/merge.d.ts +2210 -157
  25. package/dist/merge.d.ts.map +1 -1
  26. package/dist/merge.js +83 -0
  27. package/dist/merge.js.map +1 -1
  28. package/dist/observability.d.ts +71 -0
  29. package/dist/observability.d.ts.map +1 -1
  30. package/dist/observability.js +47 -0
  31. package/dist/observability.js.map +1 -1
  32. package/dist/pr-report.d.ts +351 -1
  33. package/dist/pr-report.d.ts.map +1 -1
  34. package/dist/pr-report.js +164 -1
  35. package/dist/pr-report.js.map +1 -1
  36. package/dist/reproduction.js +1 -1
  37. package/dist/reproduction.js.map +1 -1
  38. package/dist/requests.d.ts +8 -0
  39. package/dist/requests.d.ts.map +1 -1
  40. package/dist/requests.js +9 -0
  41. package/dist/requests.js.map +1 -1
  42. package/dist/routes/agent-runs.d.ts +10 -0
  43. package/dist/routes/agent-runs.d.ts.map +1 -1
  44. package/dist/routes/bug-hunt.d.ts +10 -0
  45. package/dist/routes/bug-hunt.d.ts.map +1 -1
  46. package/dist/routes/debug-api.d.ts +4 -0
  47. package/dist/routes/debug-api.d.ts.map +1 -1
  48. package/dist/routes/execution.d.ts +44 -0
  49. package/dist/routes/execution.d.ts.map +1 -1
  50. package/dist/routes/human-review.d.ts +5 -0
  51. package/dist/routes/human-review.d.ts.map +1 -1
  52. package/dist/routes/human-test.d.ts +25 -0
  53. package/dist/routes/human-test.d.ts.map +1 -1
  54. package/dist/routes/index.d.ts +1 -0
  55. package/dist/routes/index.d.ts.map +1 -1
  56. package/dist/routes/index.js +1 -0
  57. package/dist/routes/index.js.map +1 -1
  58. package/dist/routes/merge.d.ts +3109 -157
  59. package/dist/routes/merge.d.ts.map +1 -1
  60. package/dist/routes/tutorial.d.ts +149 -0
  61. package/dist/routes/tutorial.d.ts.map +1 -0
  62. package/dist/routes/tutorial.js +46 -0
  63. package/dist/routes/tutorial.js.map +1 -0
  64. package/dist/routes/visual-confirm.d.ts +15 -0
  65. package/dist/routes/visual-confirm.d.ts.map +1 -1
  66. package/dist/routes/workspace-members.d.ts +5 -5
  67. package/dist/routes/workspaces.d.ts +1008 -4
  68. package/dist/routes/workspaces.d.ts.map +1 -1
  69. package/dist/snapshot.d.ts +510 -1
  70. package/dist/snapshot.d.ts.map +1 -1
  71. package/dist/snapshot.js +9 -0
  72. package/dist/snapshot.js.map +1 -1
  73. package/dist/tutorial.d.ts +69 -0
  74. package/dist/tutorial.d.ts.map +1 -0
  75. package/dist/tutorial.js +83 -0
  76. package/dist/tutorial.js.map +1 -0
  77. package/dist/workspace-members.d.ts +6 -5
  78. package/dist/workspace-members.d.ts.map +1 -1
  79. package/dist/workspace-members.js +2 -1
  80. package/dist/workspace-members.js.map +1 -1
  81. package/package.json +1 -1
@@ -4,7 +4,18 @@ import * as v from 'valibot';
4
4
  * external consumer must notice. Backwards compatibility is a non-goal (see CLAUDE.md), so
5
5
  * a bump means "re-read the schema", not "a compatibility shim exists".
6
6
  */
7
- export declare const PR_VERIFICATION_REPORT_VERSION = 4;
7
+ export declare const PR_VERIFICATION_REPORT_VERSION = 5;
8
+ /**
9
+ * How much of one captured command log the report carries, per command.
10
+ *
11
+ * Bounded here rather than left to the producer: the harness already trims each tail to what a
12
+ * REPAIR PROMPT needs, and a pull-request body has a far tighter budget than a model's context
13
+ * window — ten checks at the harness's own ceiling would blow {@link
14
+ * hostMarkdown.MAX_SECTION_CHARS} on their own and cost the reader the whole machine-readable
15
+ * block. The cut keeps the END of the log (where a failure is reported) and is recorded in the
16
+ * report's `truncations`, so a shortened log never reads as a whole one.
17
+ */
18
+ export declare const PR_REPORT_MAX_OUTPUT_CHARS = 2000;
8
19
  /**
9
20
  * Whether a section has evidence to show.
10
21
  * - `reported` — the producing step ran and its evidence is below.
@@ -151,6 +162,187 @@ export declare const prReportTestsSchema: v.ObjectSchema<{
151
162
  readonly maxFixerAttempts: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
152
163
  }, undefined>;
153
164
  export type PrReportTests = v.InferOutput<typeof prReportTestsSchema>;
165
+ /** One command's outcome in the run's pre-PR validation attempt. */
166
+ export declare const prReportValidationCommandSchema: v.ObjectSchema<{
167
+ /** The check's configured label (`lint`, `test`, `build`, …). */
168
+ readonly label: v.StringSchema<undefined>;
169
+ /** The command line the harness ran in the checkout. */
170
+ readonly command: v.StringSchema<undefined>;
171
+ /** Exit code (0 = pass); 124 on watchdog timeout, 127 on spawn failure. */
172
+ readonly exitCode: v.NumberSchema<undefined>;
173
+ readonly passed: v.BooleanSchema<undefined>;
174
+ /** Set when the command was killed by the per-command watchdog rather than exiting. */
175
+ readonly timedOut: v.OptionalSchema<v.NullableSchema<v.BooleanSchema<undefined>, undefined>, undefined>;
176
+ readonly durationMs: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
177
+ /**
178
+ * The END of the command's combined stdout+stderr, secret-scrubbed and bounded to {@link
179
+ * PR_REPORT_MAX_OUTPUT_CHARS}.
180
+ *
181
+ * Carried for a FAILING command only, and that is a stated rule rather than a silent one: a
182
+ * green check's log is the one thing in this report a reviewer never acts on, and ten of them
183
+ * would cost the body budget that makes the failing one readable. `null` on a passing row
184
+ * therefore means "not retained", never "the command printed nothing" — the section says so in
185
+ * as many words, because those two readings are exactly the kind of collapse this report exists
186
+ * to remove.
187
+ */
188
+ readonly outputTail: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
189
+ }, undefined>;
190
+ export type PrReportValidationCommand = v.InferOutput<typeof prReportValidationCommandSchema>;
191
+ /**
192
+ * The PRE-PR VALIDATION section: the service's own check commands, run by the executor-harness
193
+ * against the final checkout before the pull request was allowed to open, with their exit codes
194
+ * and the captured output of whatever failed.
195
+ *
196
+ * This is the report's strongest single claim, because it is the one the platform ENFORCED: only
197
+ * a green checkout opens a PR, so a `reported` + `passed` section says the commands in the table
198
+ * below actually ran and actually exited 0 on this tree. It is deliberately distinct from the
199
+ * `ci` section: CI is the host's verdict on the pushed branch (a different machine, later, and
200
+ * for a red run possibly never), while this is the platform's own captured run of the service's
201
+ * commands on the exact tree that was pushed.
202
+ *
203
+ * `absent` splits the causes that need different reactions, per the report's governing rule: a
204
+ * service that configured no checks is a deployment gap, a step that never got that far is a run
205
+ * outcome, and an older runner image that reports nothing is neither.
206
+ */
207
+ export declare const prReportValidationSchema: v.ObjectSchema<{
208
+ readonly status: v.PicklistSchema<["reported", "absent"], undefined>;
209
+ /** Says WHY the section is empty when `status` is `absent` — never a bare blank. */
210
+ readonly note: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
211
+ /** Whether every command in the recorded attempt exited 0 (⇒ the PR was allowed to open). */
212
+ readonly passed: v.OptionalSchema<v.NullableSchema<v.BooleanSchema<undefined>, undefined>, undefined>;
213
+ /** The agent kind of the step that ran the checks, so a reader knows which dispatch this is. */
214
+ readonly stepKind: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
215
+ /** How many agent+check rounds ran, and the budget they ran under. */
216
+ readonly attempts: v.NumberSchema<undefined>;
217
+ readonly maxAttempts: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
218
+ /** Epoch ms the recorded attempt finished. */
219
+ readonly at: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
220
+ /** Per-command outcomes of the recorded attempt (capped like every list; see `truncations`). */
221
+ readonly commands: v.ArraySchema<v.ObjectSchema<{
222
+ /** The check's configured label (`lint`, `test`, `build`, …). */
223
+ readonly label: v.StringSchema<undefined>;
224
+ /** The command line the harness ran in the checkout. */
225
+ readonly command: v.StringSchema<undefined>;
226
+ /** Exit code (0 = pass); 124 on watchdog timeout, 127 on spawn failure. */
227
+ readonly exitCode: v.NumberSchema<undefined>;
228
+ readonly passed: v.BooleanSchema<undefined>;
229
+ /** Set when the command was killed by the per-command watchdog rather than exiting. */
230
+ readonly timedOut: v.OptionalSchema<v.NullableSchema<v.BooleanSchema<undefined>, undefined>, undefined>;
231
+ readonly durationMs: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
232
+ /**
233
+ * The END of the command's combined stdout+stderr, secret-scrubbed and bounded to {@link
234
+ * PR_REPORT_MAX_OUTPUT_CHARS}.
235
+ *
236
+ * Carried for a FAILING command only, and that is a stated rule rather than a silent one: a
237
+ * green check's log is the one thing in this report a reviewer never acts on, and ten of them
238
+ * would cost the body budget that makes the failing one readable. `null` on a passing row
239
+ * therefore means "not retained", never "the command printed nothing" — the section says so in
240
+ * as many words, because those two readings are exactly the kind of collapse this report exists
241
+ * to remove.
242
+ */
243
+ readonly outputTail: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
244
+ }, undefined>, undefined>;
245
+ }, undefined>;
246
+ export type PrReportValidation = v.InferOutput<typeof prReportValidationSchema>;
247
+ /** One tree's run of the declared reproduction command (the pre-fix tree, or the final one). */
248
+ export declare const prReportReproductionPhaseSchema: v.ObjectSchema<{
249
+ readonly exitCode: v.NumberSchema<undefined>;
250
+ readonly passed: v.BooleanSchema<undefined>;
251
+ readonly durationMs: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
252
+ readonly timedOut: v.OptionalSchema<v.NullableSchema<v.BooleanSchema<undefined>, undefined>, undefined>;
253
+ /**
254
+ * Set when this tree's SETUP command failed, so the check never ran meaningfully. Reported
255
+ * rather than folded into a plain failure: a tree that could not be prepared says nothing about
256
+ * the defect, and reading it as "red" is precisely the false `reproduced` the symmetric-worktree
257
+ * design exists to prevent.
258
+ */
259
+ readonly setupFailed: v.OptionalSchema<v.NullableSchema<v.BooleanSchema<undefined>, undefined>, undefined>;
260
+ /** The END of the run's output, secret-scrubbed and bounded (see the validation twin). */
261
+ readonly outputTail: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
262
+ }, undefined>;
263
+ export type PrReportReproductionPhase = v.InferOutput<typeof prReportReproductionPhaseSchema>;
264
+ /**
265
+ * The BUGFIX REPRODUCTION PROOF section: evidence that the declared reproducing check was RED on
266
+ * the pre-fix tree and GREEN on the final one, which is the entire content of the claim "this
267
+ * change fixes the bug" and the last big agent ASSERTION on a bugfix PR still taken on trust.
268
+ *
269
+ * `verdict` is computed by the harness from two exit codes, never self-reported by a model — the
270
+ * `repro-test` kind's own `outcome` field has always been the model's claim, and this section is
271
+ * what checks it. Three shapes reach a reviewer:
272
+ *
273
+ * - `reproduced` — red at base, green at final, with both captured logs below.
274
+ * - `inconclusive` — anything else, stated plainly rather than dressed up. An ABSENT `final` is
275
+ * normal here: a green base already settles the verdict, so the second tree is not run.
276
+ * - `declared_infeasible` — the agent structurally declared reproduction impossible, with its
277
+ * reason and the alternative verification it performed. Nothing ran, so there are no phases.
278
+ *
279
+ * `observation` is the harness's own one-line diagnosis of an inconclusive shape and is rendered
280
+ * VERBATIM. It is not interchangeable with re-deriving a cause from `base.passed`: a green base
281
+ * can mean the test does not capture the defect, or that a resumed run's pre-fix tree already
282
+ * carried this step's own interrupted work, and only the side that ran can tell those apart.
283
+ */
284
+ export declare const prReportReproductionSchema: v.ObjectSchema<{
285
+ readonly status: v.PicklistSchema<["reported", "absent"], undefined>;
286
+ /** Says WHY the section is empty when `status` is `absent` — never a bare blank. */
287
+ readonly note: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
288
+ /** The computed verdict. Null only when `status` is `absent`. */
289
+ readonly verdict: v.OptionalSchema<v.NullableSchema<v.PicklistSchema<["reproduced", "inconclusive", "declared_infeasible"], undefined>, undefined>, undefined>;
290
+ /** The command run identically against both trees (empty for `declared_infeasible`). */
291
+ readonly command: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
292
+ /** The declared test files that constitute the reproduction. */
293
+ readonly testPaths: v.ArraySchema<v.StringSchema<undefined>, undefined>;
294
+ /**
295
+ * How many declared paths were DROPPED before the proof ran (unsafe, over-long, or over the
296
+ * cap). Non-zero means the pre-fix tree was rebuilt from an incomplete reproduction, which can
297
+ * green it and read as "the test does not capture the defect" — so it is stated rather than
298
+ * implied.
299
+ */
300
+ readonly omittedTestPaths: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
301
+ /** The pre-fix tree's run. Absent for `declared_infeasible`. */
302
+ readonly base: v.OptionalSchema<v.NullableSchema<v.ObjectSchema<{
303
+ readonly exitCode: v.NumberSchema<undefined>;
304
+ readonly passed: v.BooleanSchema<undefined>;
305
+ readonly durationMs: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
306
+ readonly timedOut: v.OptionalSchema<v.NullableSchema<v.BooleanSchema<undefined>, undefined>, undefined>;
307
+ /**
308
+ * Set when this tree's SETUP command failed, so the check never ran meaningfully. Reported
309
+ * rather than folded into a plain failure: a tree that could not be prepared says nothing about
310
+ * the defect, and reading it as "red" is precisely the false `reproduced` the symmetric-worktree
311
+ * design exists to prevent.
312
+ */
313
+ readonly setupFailed: v.OptionalSchema<v.NullableSchema<v.BooleanSchema<undefined>, undefined>, undefined>;
314
+ /** The END of the run's output, secret-scrubbed and bounded (see the validation twin). */
315
+ readonly outputTail: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
316
+ }, undefined>, undefined>, undefined>;
317
+ /** The final tree's run. Absent for `declared_infeasible`, or when the base run settled it. */
318
+ readonly final: v.OptionalSchema<v.NullableSchema<v.ObjectSchema<{
319
+ readonly exitCode: v.NumberSchema<undefined>;
320
+ readonly passed: v.BooleanSchema<undefined>;
321
+ readonly durationMs: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
322
+ readonly timedOut: v.OptionalSchema<v.NullableSchema<v.BooleanSchema<undefined>, undefined>, undefined>;
323
+ /**
324
+ * Set when this tree's SETUP command failed, so the check never ran meaningfully. Reported
325
+ * rather than folded into a plain failure: a tree that could not be prepared says nothing about
326
+ * the defect, and reading it as "red" is precisely the false `reproduced` the symmetric-worktree
327
+ * design exists to prevent.
328
+ */
329
+ readonly setupFailed: v.OptionalSchema<v.NullableSchema<v.BooleanSchema<undefined>, undefined>, undefined>;
330
+ /** The END of the run's output, secret-scrubbed and bounded (see the validation twin). */
331
+ readonly outputTail: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
332
+ }, undefined>, undefined>, undefined>;
333
+ /** How many agent+verify rounds ran, and the budget they ran under. */
334
+ readonly attempts: v.NumberSchema<undefined>;
335
+ readonly maxAttempts: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
336
+ /** For `declared_infeasible`: WHY the bug could not be reproduced, verbatim from the agent. */
337
+ readonly reason: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
338
+ /** For `declared_infeasible`: what the agent verified INSTEAD, verbatim. */
339
+ readonly alternativeVerification: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
340
+ /** The producer's own one-line diagnosis of the observed shape. Rendered verbatim. */
341
+ readonly observation: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
342
+ /** Epoch ms the proof settled. */
343
+ readonly at: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
344
+ }, undefined>;
345
+ export type PrReportReproduction = v.InferOutput<typeof prReportReproductionSchema>;
154
346
  /** One ephemeral environment the `deployer` step stood up (per service frame). */
155
347
  export declare const prReportEnvironmentSchema: v.ObjectSchema<{
156
348
  /** The service frame the environment was provisioned for. */
@@ -236,6 +428,20 @@ export declare const prReportEvidenceArtifactSchema: v.ObjectSchema<{
236
428
  readonly artifactId: v.StringSchema<undefined>;
237
429
  /** Whether a reference design image was paired with it for visual confirmation. */
238
430
  readonly hasReference: v.BooleanSchema<undefined>;
431
+ /**
432
+ * Direct link to the artifact's BYTES, on the deployment's own authenticated blob endpoint —
433
+ * the thing a reviewer (or a downstream tool holding an API key) actually wants from a row that
434
+ * used to carry an opaque id and nothing else.
435
+ *
436
+ * Deliberately the API URL rather than the app deep link beside it on the section: the deep link
437
+ * lands a human in the run's evidence panel, which is the right place to BROWSE, and is useless
438
+ * to anything that is not a browser with a session. Both are emitted because they answer
439
+ * different questions, and neither substitutes for the other.
440
+ *
441
+ * Null when the deployment configured no public backend URL, so the report never emits a link to
442
+ * nowhere; the `artifactId` is still there, which is what an operator greps the store for.
443
+ */
444
+ readonly url: v.NullableSchema<v.StringSchema<undefined>, undefined>;
239
445
  }, undefined>;
240
446
  export type PrReportEvidenceArtifact = v.InferOutput<typeof prReportEvidenceArtifactSchema>;
241
447
  /**
@@ -278,6 +484,20 @@ export declare const prReportEnvironmentEvidenceSchema: v.ObjectSchema<{
278
484
  readonly artifactId: v.StringSchema<undefined>;
279
485
  /** Whether a reference design image was paired with it for visual confirmation. */
280
486
  readonly hasReference: v.BooleanSchema<undefined>;
487
+ /**
488
+ * Direct link to the artifact's BYTES, on the deployment's own authenticated blob endpoint —
489
+ * the thing a reviewer (or a downstream tool holding an API key) actually wants from a row that
490
+ * used to carry an opaque id and nothing else.
491
+ *
492
+ * Deliberately the API URL rather than the app deep link beside it on the section: the deep link
493
+ * lands a human in the run's evidence panel, which is the right place to BROWSE, and is useless
494
+ * to anything that is not a browser with a session. Both are emitted because they answer
495
+ * different questions, and neither substitutes for the other.
496
+ *
497
+ * Null when the deployment configured no public backend URL, so the report never emits a link to
498
+ * nowhere; the `artifactId` is still there, which is what an operator greps the store for.
499
+ */
500
+ readonly url: v.NullableSchema<v.StringSchema<undefined>, undefined>;
281
501
  }, undefined>, undefined>;
282
502
  /**
283
503
  * Deep link into the run's captured evidence in the app. Null when the deployment configured
@@ -367,6 +587,20 @@ export declare const prReportEnvironmentsSchema: v.ObjectSchema<{
367
587
  readonly artifactId: v.StringSchema<undefined>;
368
588
  /** Whether a reference design image was paired with it for visual confirmation. */
369
589
  readonly hasReference: v.BooleanSchema<undefined>;
590
+ /**
591
+ * Direct link to the artifact's BYTES, on the deployment's own authenticated blob endpoint —
592
+ * the thing a reviewer (or a downstream tool holding an API key) actually wants from a row that
593
+ * used to carry an opaque id and nothing else.
594
+ *
595
+ * Deliberately the API URL rather than the app deep link beside it on the section: the deep link
596
+ * lands a human in the run's evidence panel, which is the right place to BROWSE, and is useless
597
+ * to anything that is not a browser with a session. Both are emitted because they answer
598
+ * different questions, and neither substitutes for the other.
599
+ *
600
+ * Null when the deployment configured no public backend URL, so the report never emits a link to
601
+ * nowhere; the `artifactId` is still there, which is what an operator greps the store for.
602
+ */
603
+ readonly url: v.NullableSchema<v.StringSchema<undefined>, undefined>;
370
604
  }, undefined>, undefined>;
371
605
  /**
372
606
  * Deep link into the run's captured evidence in the app. Null when the deployment configured
@@ -660,6 +894,108 @@ export declare const prVerificationReportSchema: v.ObjectSchema<{
660
894
  readonly fixerAttempts: v.NumberSchema<undefined>;
661
895
  readonly maxFixerAttempts: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
662
896
  }, undefined>;
897
+ /** The platform's OWN run of the service's check commands against the pushed tree. */
898
+ readonly validation: v.ObjectSchema<{
899
+ readonly status: v.PicklistSchema<["reported", "absent"], undefined>;
900
+ /** Says WHY the section is empty when `status` is `absent` — never a bare blank. */
901
+ readonly note: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
902
+ /** Whether every command in the recorded attempt exited 0 (⇒ the PR was allowed to open). */
903
+ readonly passed: v.OptionalSchema<v.NullableSchema<v.BooleanSchema<undefined>, undefined>, undefined>;
904
+ /** The agent kind of the step that ran the checks, so a reader knows which dispatch this is. */
905
+ readonly stepKind: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
906
+ /** How many agent+check rounds ran, and the budget they ran under. */
907
+ readonly attempts: v.NumberSchema<undefined>;
908
+ readonly maxAttempts: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
909
+ /** Epoch ms the recorded attempt finished. */
910
+ readonly at: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
911
+ /** Per-command outcomes of the recorded attempt (capped like every list; see `truncations`). */
912
+ readonly commands: v.ArraySchema<v.ObjectSchema<{
913
+ /** The check's configured label (`lint`, `test`, `build`, …). */
914
+ readonly label: v.StringSchema<undefined>;
915
+ /** The command line the harness ran in the checkout. */
916
+ readonly command: v.StringSchema<undefined>;
917
+ /** Exit code (0 = pass); 124 on watchdog timeout, 127 on spawn failure. */
918
+ readonly exitCode: v.NumberSchema<undefined>;
919
+ readonly passed: v.BooleanSchema<undefined>;
920
+ /** Set when the command was killed by the per-command watchdog rather than exiting. */
921
+ readonly timedOut: v.OptionalSchema<v.NullableSchema<v.BooleanSchema<undefined>, undefined>, undefined>;
922
+ readonly durationMs: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
923
+ /**
924
+ * The END of the command's combined stdout+stderr, secret-scrubbed and bounded to {@link
925
+ * PR_REPORT_MAX_OUTPUT_CHARS}.
926
+ *
927
+ * Carried for a FAILING command only, and that is a stated rule rather than a silent one: a
928
+ * green check's log is the one thing in this report a reviewer never acts on, and ten of them
929
+ * would cost the body budget that makes the failing one readable. `null` on a passing row
930
+ * therefore means "not retained", never "the command printed nothing" — the section says so in
931
+ * as many words, because those two readings are exactly the kind of collapse this report exists
932
+ * to remove.
933
+ */
934
+ readonly outputTail: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
935
+ }, undefined>, undefined>;
936
+ }, undefined>;
937
+ /** Red-on-the-pre-fix-tree, green-on-the-final-tree evidence for a bugfix run. */
938
+ readonly reproduction: v.ObjectSchema<{
939
+ readonly status: v.PicklistSchema<["reported", "absent"], undefined>;
940
+ /** Says WHY the section is empty when `status` is `absent` — never a bare blank. */
941
+ readonly note: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
942
+ /** The computed verdict. Null only when `status` is `absent`. */
943
+ readonly verdict: v.OptionalSchema<v.NullableSchema<v.PicklistSchema<["reproduced", "inconclusive", "declared_infeasible"], undefined>, undefined>, undefined>;
944
+ /** The command run identically against both trees (empty for `declared_infeasible`). */
945
+ readonly command: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
946
+ /** The declared test files that constitute the reproduction. */
947
+ readonly testPaths: v.ArraySchema<v.StringSchema<undefined>, undefined>;
948
+ /**
949
+ * How many declared paths were DROPPED before the proof ran (unsafe, over-long, or over the
950
+ * cap). Non-zero means the pre-fix tree was rebuilt from an incomplete reproduction, which can
951
+ * green it and read as "the test does not capture the defect" — so it is stated rather than
952
+ * implied.
953
+ */
954
+ readonly omittedTestPaths: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
955
+ /** The pre-fix tree's run. Absent for `declared_infeasible`. */
956
+ readonly base: v.OptionalSchema<v.NullableSchema<v.ObjectSchema<{
957
+ readonly exitCode: v.NumberSchema<undefined>;
958
+ readonly passed: v.BooleanSchema<undefined>;
959
+ readonly durationMs: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
960
+ readonly timedOut: v.OptionalSchema<v.NullableSchema<v.BooleanSchema<undefined>, undefined>, undefined>;
961
+ /**
962
+ * Set when this tree's SETUP command failed, so the check never ran meaningfully. Reported
963
+ * rather than folded into a plain failure: a tree that could not be prepared says nothing about
964
+ * the defect, and reading it as "red" is precisely the false `reproduced` the symmetric-worktree
965
+ * design exists to prevent.
966
+ */
967
+ readonly setupFailed: v.OptionalSchema<v.NullableSchema<v.BooleanSchema<undefined>, undefined>, undefined>;
968
+ /** The END of the run's output, secret-scrubbed and bounded (see the validation twin). */
969
+ readonly outputTail: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
970
+ }, undefined>, undefined>, undefined>;
971
+ /** The final tree's run. Absent for `declared_infeasible`, or when the base run settled it. */
972
+ readonly final: v.OptionalSchema<v.NullableSchema<v.ObjectSchema<{
973
+ readonly exitCode: v.NumberSchema<undefined>;
974
+ readonly passed: v.BooleanSchema<undefined>;
975
+ readonly durationMs: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
976
+ readonly timedOut: v.OptionalSchema<v.NullableSchema<v.BooleanSchema<undefined>, undefined>, undefined>;
977
+ /**
978
+ * Set when this tree's SETUP command failed, so the check never ran meaningfully. Reported
979
+ * rather than folded into a plain failure: a tree that could not be prepared says nothing about
980
+ * the defect, and reading it as "red" is precisely the false `reproduced` the symmetric-worktree
981
+ * design exists to prevent.
982
+ */
983
+ readonly setupFailed: v.OptionalSchema<v.NullableSchema<v.BooleanSchema<undefined>, undefined>, undefined>;
984
+ /** The END of the run's output, secret-scrubbed and bounded (see the validation twin). */
985
+ readonly outputTail: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
986
+ }, undefined>, undefined>, undefined>;
987
+ /** How many agent+verify rounds ran, and the budget they ran under. */
988
+ readonly attempts: v.NumberSchema<undefined>;
989
+ readonly maxAttempts: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
990
+ /** For `declared_infeasible`: WHY the bug could not be reproduced, verbatim from the agent. */
991
+ readonly reason: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
992
+ /** For `declared_infeasible`: what the agent verified INSTEAD, verbatim. */
993
+ readonly alternativeVerification: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
994
+ /** The producer's own one-line diagnosis of the observed shape. Rendered verbatim. */
995
+ readonly observation: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
996
+ /** Epoch ms the proof settled. */
997
+ readonly at: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
998
+ }, undefined>;
663
999
  readonly tests: v.ObjectSchema<{
664
1000
  readonly status: v.PicklistSchema<["reported", "absent"], undefined>;
665
1001
  readonly note: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
@@ -802,6 +1138,20 @@ export declare const prVerificationReportSchema: v.ObjectSchema<{
802
1138
  readonly artifactId: v.StringSchema<undefined>;
803
1139
  /** Whether a reference design image was paired with it for visual confirmation. */
804
1140
  readonly hasReference: v.BooleanSchema<undefined>;
1141
+ /**
1142
+ * Direct link to the artifact's BYTES, on the deployment's own authenticated blob endpoint —
1143
+ * the thing a reviewer (or a downstream tool holding an API key) actually wants from a row that
1144
+ * used to carry an opaque id and nothing else.
1145
+ *
1146
+ * Deliberately the API URL rather than the app deep link beside it on the section: the deep link
1147
+ * lands a human in the run's evidence panel, which is the right place to BROWSE, and is useless
1148
+ * to anything that is not a browser with a session. Both are emitted because they answer
1149
+ * different questions, and neither substitutes for the other.
1150
+ *
1151
+ * Null when the deployment configured no public backend URL, so the report never emits a link to
1152
+ * nowhere; the `artifactId` is still there, which is what an operator greps the store for.
1153
+ */
1154
+ readonly url: v.NullableSchema<v.StringSchema<undefined>, undefined>;
805
1155
  }, undefined>, undefined>;
806
1156
  /**
807
1157
  * Deep link into the run's captured evidence in the app. Null when the deployment configured
@@ -1 +1 @@
1
- {"version":3,"file":"pr-report.d.ts","sourceRoot":"","sources":["../src/pr-report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pr-report.d.ts","sourceRoot":"","sources":["../src/pr-report.ts"],"names":[],"mappings":"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"}
package/dist/pr-report.js CHANGED
@@ -2,6 +2,7 @@ import * as v from 'valibot';
2
2
  import { mergeAssessmentSchema } from './merge.js';
3
3
  import { judgeDispositionSchema, judgeFindingSchema } from './judge.js';
4
4
  import { requirementPrioritySchema, requirementStateSchema } from './spec.js';
5
+ import { reproductionStatusSchema } from './reproduction.js';
5
6
  import { requirementVerdictStatusSchema, testEnvironmentSchema } from './testing.js';
6
7
  import { vcsProviderSchema } from './routes/auth.js';
7
8
  // ---------------------------------------------------------------------------
@@ -26,7 +27,18 @@ import { vcsProviderSchema } from './routes/auth.js';
26
27
  * external consumer must notice. Backwards compatibility is a non-goal (see CLAUDE.md), so
27
28
  * a bump means "re-read the schema", not "a compatibility shim exists".
28
29
  */
29
- export const PR_VERIFICATION_REPORT_VERSION = 4;
30
+ export const PR_VERIFICATION_REPORT_VERSION = 5;
31
+ /**
32
+ * How much of one captured command log the report carries, per command.
33
+ *
34
+ * Bounded here rather than left to the producer: the harness already trims each tail to what a
35
+ * REPAIR PROMPT needs, and a pull-request body has a far tighter budget than a model's context
36
+ * window — ten checks at the harness's own ceiling would blow {@link
37
+ * hostMarkdown.MAX_SECTION_CHARS} on their own and cost the reader the whole machine-readable
38
+ * block. The cut keeps the END of the log (where a failure is reported) and is recorded in the
39
+ * report's `truncations`, so a shortened log never reads as a whole one.
40
+ */
41
+ export const PR_REPORT_MAX_OUTPUT_CHARS = 2_000;
30
42
  /**
31
43
  * Whether a section has evidence to show.
32
44
  * - `reported` — the producing step ran and its evidence is below.
@@ -134,6 +146,139 @@ export const prReportTestsSchema = v.object({
134
146
  fixerAttempts: v.number(),
135
147
  maxFixerAttempts: v.optional(v.nullable(v.number())),
136
148
  });
149
+ // ---- Captured command output ----------------------------------------------
150
+ //
151
+ // The two sections below are the report's only CAPTURED-OUTPUT evidence: a command ran, and here
152
+ // is what it printed. Everything else in the report is a structured verdict somebody (a gate, a
153
+ // judge, an agent) produced; these two are the raw thing itself, which is why they are worth the
154
+ // body budget they cost. Both come off the step the harness wrote them onto — `step.validation`
155
+ // and `step.reproduction` — so neither re-runs anything at compose time.
156
+ /** One command's outcome in the run's pre-PR validation attempt. */
157
+ export const prReportValidationCommandSchema = v.object({
158
+ /** The check's configured label (`lint`, `test`, `build`, …). */
159
+ label: v.string(),
160
+ /** The command line the harness ran in the checkout. */
161
+ command: v.string(),
162
+ /** Exit code (0 = pass); 124 on watchdog timeout, 127 on spawn failure. */
163
+ exitCode: v.number(),
164
+ passed: v.boolean(),
165
+ /** Set when the command was killed by the per-command watchdog rather than exiting. */
166
+ timedOut: v.optional(v.nullable(v.boolean())),
167
+ durationMs: v.optional(v.nullable(v.number())),
168
+ /**
169
+ * The END of the command's combined stdout+stderr, secret-scrubbed and bounded to {@link
170
+ * PR_REPORT_MAX_OUTPUT_CHARS}.
171
+ *
172
+ * Carried for a FAILING command only, and that is a stated rule rather than a silent one: a
173
+ * green check's log is the one thing in this report a reviewer never acts on, and ten of them
174
+ * would cost the body budget that makes the failing one readable. `null` on a passing row
175
+ * therefore means "not retained", never "the command printed nothing" — the section says so in
176
+ * as many words, because those two readings are exactly the kind of collapse this report exists
177
+ * to remove.
178
+ */
179
+ outputTail: v.optional(v.nullable(v.string())),
180
+ });
181
+ /**
182
+ * The PRE-PR VALIDATION section: the service's own check commands, run by the executor-harness
183
+ * against the final checkout before the pull request was allowed to open, with their exit codes
184
+ * and the captured output of whatever failed.
185
+ *
186
+ * This is the report's strongest single claim, because it is the one the platform ENFORCED: only
187
+ * a green checkout opens a PR, so a `reported` + `passed` section says the commands in the table
188
+ * below actually ran and actually exited 0 on this tree. It is deliberately distinct from the
189
+ * `ci` section: CI is the host's verdict on the pushed branch (a different machine, later, and
190
+ * for a red run possibly never), while this is the platform's own captured run of the service's
191
+ * commands on the exact tree that was pushed.
192
+ *
193
+ * `absent` splits the causes that need different reactions, per the report's governing rule: a
194
+ * service that configured no checks is a deployment gap, a step that never got that far is a run
195
+ * outcome, and an older runner image that reports nothing is neither.
196
+ */
197
+ export const prReportValidationSchema = v.object({
198
+ status: prReportSectionStatusSchema,
199
+ /** Says WHY the section is empty when `status` is `absent` — never a bare blank. */
200
+ note: v.optional(v.nullable(v.string())),
201
+ /** Whether every command in the recorded attempt exited 0 (⇒ the PR was allowed to open). */
202
+ passed: v.optional(v.nullable(v.boolean())),
203
+ /** The agent kind of the step that ran the checks, so a reader knows which dispatch this is. */
204
+ stepKind: v.optional(v.nullable(v.string())),
205
+ /** How many agent+check rounds ran, and the budget they ran under. */
206
+ attempts: v.number(),
207
+ maxAttempts: v.optional(v.nullable(v.number())),
208
+ /** Epoch ms the recorded attempt finished. */
209
+ at: v.optional(v.nullable(v.number())),
210
+ /** Per-command outcomes of the recorded attempt (capped like every list; see `truncations`). */
211
+ commands: v.array(prReportValidationCommandSchema),
212
+ });
213
+ /** One tree's run of the declared reproduction command (the pre-fix tree, or the final one). */
214
+ export const prReportReproductionPhaseSchema = v.object({
215
+ exitCode: v.number(),
216
+ passed: v.boolean(),
217
+ durationMs: v.optional(v.nullable(v.number())),
218
+ timedOut: v.optional(v.nullable(v.boolean())),
219
+ /**
220
+ * Set when this tree's SETUP command failed, so the check never ran meaningfully. Reported
221
+ * rather than folded into a plain failure: a tree that could not be prepared says nothing about
222
+ * the defect, and reading it as "red" is precisely the false `reproduced` the symmetric-worktree
223
+ * design exists to prevent.
224
+ */
225
+ setupFailed: v.optional(v.nullable(v.boolean())),
226
+ /** The END of the run's output, secret-scrubbed and bounded (see the validation twin). */
227
+ outputTail: v.optional(v.nullable(v.string())),
228
+ });
229
+ /**
230
+ * The BUGFIX REPRODUCTION PROOF section: evidence that the declared reproducing check was RED on
231
+ * the pre-fix tree and GREEN on the final one, which is the entire content of the claim "this
232
+ * change fixes the bug" and the last big agent ASSERTION on a bugfix PR still taken on trust.
233
+ *
234
+ * `verdict` is computed by the harness from two exit codes, never self-reported by a model — the
235
+ * `repro-test` kind's own `outcome` field has always been the model's claim, and this section is
236
+ * what checks it. Three shapes reach a reviewer:
237
+ *
238
+ * - `reproduced` — red at base, green at final, with both captured logs below.
239
+ * - `inconclusive` — anything else, stated plainly rather than dressed up. An ABSENT `final` is
240
+ * normal here: a green base already settles the verdict, so the second tree is not run.
241
+ * - `declared_infeasible` — the agent structurally declared reproduction impossible, with its
242
+ * reason and the alternative verification it performed. Nothing ran, so there are no phases.
243
+ *
244
+ * `observation` is the harness's own one-line diagnosis of an inconclusive shape and is rendered
245
+ * VERBATIM. It is not interchangeable with re-deriving a cause from `base.passed`: a green base
246
+ * can mean the test does not capture the defect, or that a resumed run's pre-fix tree already
247
+ * carried this step's own interrupted work, and only the side that ran can tell those apart.
248
+ */
249
+ export const prReportReproductionSchema = v.object({
250
+ status: prReportSectionStatusSchema,
251
+ /** Says WHY the section is empty when `status` is `absent` — never a bare blank. */
252
+ note: v.optional(v.nullable(v.string())),
253
+ /** The computed verdict. Null only when `status` is `absent`. */
254
+ verdict: v.optional(v.nullable(reproductionStatusSchema)),
255
+ /** The command run identically against both trees (empty for `declared_infeasible`). */
256
+ command: v.optional(v.nullable(v.string())),
257
+ /** The declared test files that constitute the reproduction. */
258
+ testPaths: v.array(v.string()),
259
+ /**
260
+ * How many declared paths were DROPPED before the proof ran (unsafe, over-long, or over the
261
+ * cap). Non-zero means the pre-fix tree was rebuilt from an incomplete reproduction, which can
262
+ * green it and read as "the test does not capture the defect" — so it is stated rather than
263
+ * implied.
264
+ */
265
+ omittedTestPaths: v.optional(v.nullable(v.number())),
266
+ /** The pre-fix tree's run. Absent for `declared_infeasible`. */
267
+ base: v.optional(v.nullable(prReportReproductionPhaseSchema)),
268
+ /** The final tree's run. Absent for `declared_infeasible`, or when the base run settled it. */
269
+ final: v.optional(v.nullable(prReportReproductionPhaseSchema)),
270
+ /** How many agent+verify rounds ran, and the budget they ran under. */
271
+ attempts: v.number(),
272
+ maxAttempts: v.optional(v.nullable(v.number())),
273
+ /** For `declared_infeasible`: WHY the bug could not be reproduced, verbatim from the agent. */
274
+ reason: v.optional(v.nullable(v.string())),
275
+ /** For `declared_infeasible`: what the agent verified INSTEAD, verbatim. */
276
+ alternativeVerification: v.optional(v.nullable(v.string())),
277
+ /** The producer's own one-line diagnosis of the observed shape. Rendered verbatim. */
278
+ observation: v.optional(v.nullable(v.string())),
279
+ /** Epoch ms the proof settled. */
280
+ at: v.optional(v.nullable(v.number())),
281
+ });
137
282
  /** One ephemeral environment the `deployer` step stood up (per service frame). */
138
283
  export const prReportEnvironmentSchema = v.object({
139
284
  /** The service frame the environment was provisioned for. */
@@ -221,6 +366,20 @@ export const prReportEvidenceArtifactSchema = v.object({
221
366
  artifactId: v.string(),
222
367
  /** Whether a reference design image was paired with it for visual confirmation. */
223
368
  hasReference: v.boolean(),
369
+ /**
370
+ * Direct link to the artifact's BYTES, on the deployment's own authenticated blob endpoint —
371
+ * the thing a reviewer (or a downstream tool holding an API key) actually wants from a row that
372
+ * used to carry an opaque id and nothing else.
373
+ *
374
+ * Deliberately the API URL rather than the app deep link beside it on the section: the deep link
375
+ * lands a human in the run's evidence panel, which is the right place to BROWSE, and is useless
376
+ * to anything that is not a browser with a session. Both are emitted because they answer
377
+ * different questions, and neither substitutes for the other.
378
+ *
379
+ * Null when the deployment configured no public backend URL, so the report never emits a link to
380
+ * nowhere; the `artifactId` is still there, which is what an operator greps the store for.
381
+ */
382
+ url: v.nullable(v.string()),
224
383
  });
225
384
  /**
226
385
  * The MIDDLE leg of the lifecycle proof: what was actually observed against the environment
@@ -450,6 +609,10 @@ export const prVerificationReportSchema = v.object({
450
609
  generatedAt: v.number(),
451
610
  run: prReportRunSchema,
452
611
  ci: prReportCiSchema,
612
+ /** The platform's OWN run of the service's check commands against the pushed tree. */
613
+ validation: prReportValidationSchema,
614
+ /** Red-on-the-pre-fix-tree, green-on-the-final-tree evidence for a bugfix run. */
615
+ reproduction: prReportReproductionSchema,
453
616
  tests: prReportTestsSchema,
454
617
  requirements: prReportRequirementsSchema,
455
618
  environments: prReportEnvironmentsSchema,