devcontour-harness 0.1.0-alpha.13 → 0.1.0-alpha.18

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 (73) hide show
  1. package/README.md +48 -2
  2. package/docs/architecture.md +77 -3
  3. package/docs/contracts.md +100 -0
  4. package/docs/quickstart.md +1 -1
  5. package/docs/release-notes/0.1.0-alpha.14.md +69 -0
  6. package/docs/release-notes/0.1.0-alpha.15.md +62 -0
  7. package/docs/release-notes/0.1.0-alpha.16.md +36 -0
  8. package/docs/release-notes/0.1.0-alpha.17.md +86 -0
  9. package/docs/release-notes/0.1.0-alpha.18.md +48 -0
  10. package/docs/review-probes.md +9 -3
  11. package/docs/review-protocol.md +9 -0
  12. package/docs/upgrade.md +16 -14
  13. package/lib/agents/cli-adapter.js +14 -10
  14. package/lib/agents/review-probe.d.ts +9 -0
  15. package/lib/agents/review-probe.js +23 -1
  16. package/lib/agents/schemas.d.ts +206 -0
  17. package/lib/agents/schemas.js +37 -1
  18. package/lib/agents/usage.d.ts +22 -0
  19. package/lib/agents/usage.js +112 -6
  20. package/lib/contracts/checks.d.ts +119 -0
  21. package/lib/contracts/checks.js +64 -1
  22. package/lib/contracts/cli.d.ts +30 -0
  23. package/lib/contracts/diagnosis.d.ts +3 -1
  24. package/lib/contracts/diagnosis.js +2 -0
  25. package/lib/contracts/events.d.ts +12 -0
  26. package/lib/contracts/execution.d.ts +109 -5
  27. package/lib/contracts/execution.js +58 -0
  28. package/lib/contracts/failure.d.ts +17 -3
  29. package/lib/contracts/failure.js +4 -2
  30. package/lib/contracts/published.d.ts +67 -1
  31. package/lib/contracts/repair-policy.d.ts +7 -0
  32. package/lib/contracts/repair-policy.js +17 -0
  33. package/lib/contracts/review.d.ts +12 -0
  34. package/lib/contracts/review.js +19 -0
  35. package/lib/control/harness.d.ts +2 -2
  36. package/lib/control/harness.js +2 -1
  37. package/lib/control/recovery.d.ts +26 -1
  38. package/lib/engine/engine.d.ts +41 -14
  39. package/lib/engine/engine.js +92 -8
  40. package/lib/engine/failure.d.ts +1 -1
  41. package/lib/engine/failure.js +1 -1
  42. package/lib/engine/property-recovery.d.ts +1 -0
  43. package/lib/engine/property-recovery.js +4 -1
  44. package/lib/engine/repair.d.ts +26 -0
  45. package/lib/engine/repair.js +83 -1
  46. package/lib/engine/runner.d.ts +7 -0
  47. package/lib/engine/runner.js +207 -34
  48. package/lib/explain/state.js +4 -2
  49. package/lib/index.d.ts +6 -4
  50. package/lib/index.js +6 -4
  51. package/lib/projections/stop.d.ts +1 -1
  52. package/lib/projections/stop.js +16 -0
  53. package/lib/storage/document.d.ts +48 -8
  54. package/lib/verification/acceptance.js +2 -1
  55. package/lib/verification/already-satisfied.d.ts +44 -0
  56. package/lib/verification/already-satisfied.js +49 -0
  57. package/lib/verification/checks.d.ts +28 -0
  58. package/lib/verification/checks.js +270 -22
  59. package/lib/verification/corpus.d.ts +50 -0
  60. package/lib/verification/gate-scope.d.ts +36 -0
  61. package/lib/verification/gate-scope.js +97 -0
  62. package/lib/verification/gates-at.d.ts +67 -0
  63. package/lib/verification/gates-at.js +173 -0
  64. package/lib/verification/gates.d.ts +5 -0
  65. package/lib/verification/gates.js +20 -5
  66. package/lib/verification/property.d.ts +9 -0
  67. package/lib/verification/property.js +11 -2
  68. package/lib/verification/self-check.js +12 -12
  69. package/package.json +1 -1
  70. package/schemas/contract-document.schema.json +161 -0
  71. package/schemas/execution-document.schema.json +134 -0
  72. package/schemas/run-event.schema.json +4 -0
  73. package/schemas/stop-diagnosis.schema.json +2 -0
@@ -24,7 +24,7 @@ export declare const workStatusSchema: z.ZodEnum<{
24
24
  done: "done";
25
25
  }>;
26
26
  export type WorkStatus = (typeof workStatuses)[number];
27
- export declare const failureKinds: readonly ["provider-auth", "environment", "timeout", "stale-base", "empty-result", "scope-violation", "gate", "review", "review-protocol", "merge", "cancelled", "budget", "unknown"];
27
+ export declare const failureKinds: readonly ["provider-auth", "environment", "timeout", "stale-base", "empty-result", "unfinished", "scope-violation", "gate", "review", "review-protocol", "merge", "cancelled", "budget", "needs-lead", "unknown"];
28
28
  export declare const failureKindSchema: z.ZodEnum<{
29
29
  gate: "gate";
30
30
  unknown: "unknown";
@@ -35,10 +35,12 @@ export declare const failureKindSchema: z.ZodEnum<{
35
35
  "provider-auth": "provider-auth";
36
36
  "stale-base": "stale-base";
37
37
  "empty-result": "empty-result";
38
+ unfinished: "unfinished";
38
39
  "scope-violation": "scope-violation";
39
40
  "review-protocol": "review-protocol";
40
41
  merge: "merge";
41
42
  budget: "budget";
43
+ "needs-lead": "needs-lead";
42
44
  }>;
43
45
  export type FailureKind = (typeof failureKinds)[number];
44
46
  /** Техническое согласование, привязанное к digest проверенного предложения. */
@@ -230,11 +232,11 @@ export declare const reviewInspectionSchema: z.ZodObject<{
230
232
  runId: z.ZodString;
231
233
  status: z.ZodNullable<z.ZodString>;
232
234
  reason: z.ZodEnum<{
235
+ unfinished: "unfinished";
233
236
  "not-started": "not-started";
234
237
  "legacy-unconfirmed": "legacy-unconfirmed";
235
238
  "foreign-scope": "foreign-scope";
236
239
  "unknown-status": "unknown-status";
237
- unfinished: "unfinished";
238
240
  abandoned: "abandoned";
239
241
  }>;
240
242
  }, z.core.$strict>>>;
@@ -327,11 +329,11 @@ export declare const evidenceRecordSchema: z.ZodObject<{
327
329
  runId: z.ZodString;
328
330
  status: z.ZodNullable<z.ZodString>;
329
331
  reason: z.ZodEnum<{
332
+ unfinished: "unfinished";
330
333
  "not-started": "not-started";
331
334
  "legacy-unconfirmed": "legacy-unconfirmed";
332
335
  "foreign-scope": "foreign-scope";
333
336
  "unknown-status": "unknown-status";
334
- unfinished: "unfinished";
335
337
  abandoned: "abandoned";
336
338
  }>;
337
339
  }, z.core.$strict>>>;
@@ -464,6 +466,19 @@ export declare const evidenceRecordSchema: z.ZodObject<{
464
466
  coverage: z.ZodOptional<z.ZodArray<z.ZodString>>;
465
467
  }, z.core.$strict>>;
466
468
  checks: z.ZodOptional<z.ZodString>;
469
+ alreadySatisfied: z.ZodOptional<z.ZodObject<{
470
+ gates: z.ZodArray<z.ZodString>;
471
+ evidence: z.ZodString;
472
+ basis: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
473
+ kind: z.ZodLiteral<"contract">;
474
+ gates: z.ZodArray<z.ZodString>;
475
+ }, z.core.$strict>, z.ZodObject<{
476
+ kind: z.ZodLiteral<"dependency">;
477
+ workId: z.ZodString;
478
+ sha: z.ZodString;
479
+ paths: z.ZodArray<z.ZodString>;
480
+ }, z.core.$strict>], "kind">>;
481
+ }, z.core.$strict>>;
467
482
  }, z.core.$strict>;
468
483
  export type EvidenceRecord = z.infer<typeof evidenceRecordSchema>;
469
484
  /** Снимок зависимости, против которого шла попытка. */
@@ -553,10 +568,12 @@ export declare const continuationSchema: z.ZodObject<{
553
568
  "provider-auth": "provider-auth";
554
569
  "stale-base": "stale-base";
555
570
  "empty-result": "empty-result";
571
+ unfinished: "unfinished";
556
572
  "scope-violation": "scope-violation";
557
573
  "review-protocol": "review-protocol";
558
574
  merge: "merge";
559
575
  budget: "budget";
576
+ "needs-lead": "needs-lead";
560
577
  }>>;
561
578
  respecified: z.ZodOptional<z.ZodBoolean>;
562
579
  applied: z.ZodBoolean;
@@ -636,10 +653,12 @@ export declare const attemptStateSchema: z.ZodObject<{
636
653
  "provider-auth": "provider-auth";
637
654
  "stale-base": "stale-base";
638
655
  "empty-result": "empty-result";
656
+ unfinished: "unfinished";
639
657
  "scope-violation": "scope-violation";
640
658
  "review-protocol": "review-protocol";
641
659
  merge: "merge";
642
660
  budget: "budget";
661
+ "needs-lead": "needs-lead";
643
662
  }>>;
644
663
  failureFingerprint: z.ZodOptional<z.ZodString>;
645
664
  requiredGates: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -711,6 +730,12 @@ export declare const attemptStateSchema: z.ZodObject<{
711
730
  }, z.core.$strict>>>;
712
731
  properties: z.ZodOptional<z.ZodArray<z.ZodString>>;
713
732
  unboundProperties: z.ZodOptional<z.ZodArray<z.ZodString>>;
733
+ interrupted: z.ZodOptional<z.ZodLiteral<"shutdown">>;
734
+ inputClasses: z.ZodOptional<z.ZodArray<z.ZodString>>;
735
+ classified: z.ZodOptional<z.ZodArray<z.ZodObject<{
736
+ property: z.ZodString;
737
+ inputClass: z.ZodString;
738
+ }, z.core.$strict>>>;
714
739
  episodeBasis: z.ZodOptional<z.ZodString>;
715
740
  implementationBasis: z.ZodOptional<z.ZodString>;
716
741
  reusedFrom: z.ZodOptional<z.ZodObject<{
@@ -740,10 +765,12 @@ export declare const attemptStateSchema: z.ZodObject<{
740
765
  "provider-auth": "provider-auth";
741
766
  "stale-base": "stale-base";
742
767
  "empty-result": "empty-result";
768
+ unfinished: "unfinished";
743
769
  "scope-violation": "scope-violation";
744
770
  "review-protocol": "review-protocol";
745
771
  merge: "merge";
746
772
  budget: "budget";
773
+ "needs-lead": "needs-lead";
747
774
  }>>;
748
775
  respecified: z.ZodOptional<z.ZodBoolean>;
749
776
  applied: z.ZodBoolean;
@@ -863,11 +890,11 @@ export declare const attemptStateSchema: z.ZodObject<{
863
890
  runId: z.ZodString;
864
891
  status: z.ZodNullable<z.ZodString>;
865
892
  reason: z.ZodEnum<{
893
+ unfinished: "unfinished";
866
894
  "not-started": "not-started";
867
895
  "legacy-unconfirmed": "legacy-unconfirmed";
868
896
  "foreign-scope": "foreign-scope";
869
897
  "unknown-status": "unknown-status";
870
- unfinished: "unfinished";
871
898
  abandoned: "abandoned";
872
899
  }>;
873
900
  }, z.core.$strict>>>;
@@ -1000,6 +1027,19 @@ export declare const attemptStateSchema: z.ZodObject<{
1000
1027
  coverage: z.ZodOptional<z.ZodArray<z.ZodString>>;
1001
1028
  }, z.core.$strict>>;
1002
1029
  checks: z.ZodOptional<z.ZodString>;
1030
+ alreadySatisfied: z.ZodOptional<z.ZodObject<{
1031
+ gates: z.ZodArray<z.ZodString>;
1032
+ evidence: z.ZodString;
1033
+ basis: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
1034
+ kind: z.ZodLiteral<"contract">;
1035
+ gates: z.ZodArray<z.ZodString>;
1036
+ }, z.core.$strict>, z.ZodObject<{
1037
+ kind: z.ZodLiteral<"dependency">;
1038
+ workId: z.ZodString;
1039
+ sha: z.ZodString;
1040
+ paths: z.ZodArray<z.ZodString>;
1041
+ }, z.core.$strict>], "kind">>;
1042
+ }, z.core.$strict>>;
1003
1043
  }, z.core.$strict>>;
1004
1044
  }, z.core.$strict>;
1005
1045
  export type AttemptState = z.infer<typeof attemptStateSchema>;
@@ -1156,10 +1196,12 @@ export declare const workStateSchema: z.ZodObject<{
1156
1196
  "provider-auth": "provider-auth";
1157
1197
  "stale-base": "stale-base";
1158
1198
  "empty-result": "empty-result";
1199
+ unfinished: "unfinished";
1159
1200
  "scope-violation": "scope-violation";
1160
1201
  "review-protocol": "review-protocol";
1161
1202
  merge: "merge";
1162
1203
  budget: "budget";
1204
+ "needs-lead": "needs-lead";
1163
1205
  }>>;
1164
1206
  failureFingerprint: z.ZodOptional<z.ZodString>;
1165
1207
  approvedAt: z.ZodOptional<z.ZodISODateTime>;
@@ -1309,6 +1351,7 @@ export declare const workStateSchema: z.ZodObject<{
1309
1351
  }, z.core.$strict>>;
1310
1352
  version: z.ZodNumber;
1311
1353
  }, z.core.$strict>>>;
1354
+ neutralFailures: z.ZodOptional<z.ZodNumber>;
1312
1355
  }, z.core.$strict>;
1313
1356
  export type WorkState = z.infer<typeof workStateSchema>;
1314
1357
  export declare const graphStateSchema: z.ZodObject<{
@@ -1429,10 +1472,12 @@ export declare const controlStateSchema: z.ZodObject<{
1429
1472
  "provider-auth": "provider-auth";
1430
1473
  "stale-base": "stale-base";
1431
1474
  "empty-result": "empty-result";
1475
+ unfinished: "unfinished";
1432
1476
  "scope-violation": "scope-violation";
1433
1477
  "review-protocol": "review-protocol";
1434
1478
  merge: "merge";
1435
1479
  budget: "budget";
1480
+ "needs-lead": "needs-lead";
1436
1481
  }>>>;
1437
1482
  waits: z.ZodOptional<z.ZodArray<z.ZodObject<{
1438
1483
  kind: z.ZodEnum<{
@@ -1799,6 +1844,7 @@ export declare const reproductionRecordSchema: z.ZodObject<{
1799
1844
  property: z.ZodNullable<z.ZodString>;
1800
1845
  inputHash: z.ZodString;
1801
1846
  input: z.ZodString;
1847
+ inputClass: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1802
1848
  expected: z.ZodNullable<z.ZodString>;
1803
1849
  actual: z.ZodNullable<z.ZodString>;
1804
1850
  command: z.ZodNullable<z.ZodArray<z.ZodString>>;
@@ -1821,6 +1867,7 @@ export declare const reproductionRegistrySchema: z.ZodObject<{
1821
1867
  property: z.ZodNullable<z.ZodString>;
1822
1868
  inputHash: z.ZodString;
1823
1869
  input: z.ZodString;
1870
+ inputClass: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1824
1871
  expected: z.ZodNullable<z.ZodString>;
1825
1872
  actual: z.ZodNullable<z.ZodString>;
1826
1873
  command: z.ZodNullable<z.ZodArray<z.ZodString>>;
@@ -2289,6 +2336,34 @@ export declare const localSchemas: {
2289
2336
  environment: z.ZodString;
2290
2337
  }, z.core.$strict>>;
2291
2338
  }, z.core.$strict>;
2339
+ gates: z.ZodOptional<z.ZodArray<z.ZodString>>;
2340
+ verification: z.ZodOptional<z.ZodEnum<{
2341
+ property: "property";
2342
+ reference: "reference";
2343
+ }>>;
2344
+ reference: z.ZodOptional<z.ZodObject<{
2345
+ oracle: z.ZodObject<{
2346
+ description: z.ZodString;
2347
+ limits: z.ZodString;
2348
+ }, z.core.$strict>;
2349
+ crossChecks: z.ZodArray<z.ZodObject<{
2350
+ family: z.ZodString;
2351
+ against: z.ZodString;
2352
+ matches: z.ZodNumber;
2353
+ total: z.ZodNumber;
2354
+ artifacts: z.ZodOptional<z.ZodArray<z.ZodString>>;
2355
+ }, z.core.$strict>>;
2356
+ sets: z.ZodArray<z.ZodObject<{
2357
+ gate: z.ZodString;
2358
+ artifacts: z.ZodArray<z.ZodString>;
2359
+ minCases: z.ZodNumber;
2360
+ families: z.ZodDefault<z.ZodArray<z.ZodObject<{
2361
+ id: z.ZodString;
2362
+ minCases: z.ZodNumber;
2363
+ }, z.core.$strict>>>;
2364
+ }, z.core.$strict>>;
2365
+ gaps: z.ZodString;
2366
+ }, z.core.$strict>>;
2292
2367
  hard: z.ZodDefault<z.ZodBoolean>;
2293
2368
  feasibility: z.ZodOptional<z.ZodObject<{
2294
2369
  spike: z.ZodString;
@@ -2353,6 +2428,7 @@ export declare const localSchemas: {
2353
2428
  property: z.ZodNullable<z.ZodString>;
2354
2429
  inputHash: z.ZodString;
2355
2430
  input: z.ZodString;
2431
+ inputClass: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2356
2432
  expected: z.ZodNullable<z.ZodString>;
2357
2433
  actual: z.ZodNullable<z.ZodString>;
2358
2434
  command: z.ZodNullable<z.ZodArray<z.ZodString>>;
@@ -2655,10 +2731,12 @@ export declare const executionDocumentSchema: z.ZodObject<{
2655
2731
  "provider-auth": "provider-auth";
2656
2732
  "stale-base": "stale-base";
2657
2733
  "empty-result": "empty-result";
2734
+ unfinished: "unfinished";
2658
2735
  "scope-violation": "scope-violation";
2659
2736
  "review-protocol": "review-protocol";
2660
2737
  merge: "merge";
2661
2738
  budget: "budget";
2739
+ "needs-lead": "needs-lead";
2662
2740
  }>>;
2663
2741
  failureFingerprint: z.ZodOptional<z.ZodString>;
2664
2742
  approvedAt: z.ZodOptional<z.ZodISODateTime>;
@@ -2808,6 +2886,7 @@ export declare const executionDocumentSchema: z.ZodObject<{
2808
2886
  }, z.core.$strict>>;
2809
2887
  version: z.ZodNumber;
2810
2888
  }, z.core.$strict>>>;
2889
+ neutralFailures: z.ZodOptional<z.ZodNumber>;
2811
2890
  }, z.core.$strict>>;
2812
2891
  attempts: z.ZodArray<z.ZodObject<{
2813
2892
  id: z.ZodString;
@@ -2868,10 +2947,12 @@ export declare const executionDocumentSchema: z.ZodObject<{
2868
2947
  "provider-auth": "provider-auth";
2869
2948
  "stale-base": "stale-base";
2870
2949
  "empty-result": "empty-result";
2950
+ unfinished: "unfinished";
2871
2951
  "scope-violation": "scope-violation";
2872
2952
  "review-protocol": "review-protocol";
2873
2953
  merge: "merge";
2874
2954
  budget: "budget";
2955
+ "needs-lead": "needs-lead";
2875
2956
  }>>;
2876
2957
  failureFingerprint: z.ZodOptional<z.ZodString>;
2877
2958
  requiredGates: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -2943,6 +3024,12 @@ export declare const executionDocumentSchema: z.ZodObject<{
2943
3024
  }, z.core.$strict>>>;
2944
3025
  properties: z.ZodOptional<z.ZodArray<z.ZodString>>;
2945
3026
  unboundProperties: z.ZodOptional<z.ZodArray<z.ZodString>>;
3027
+ interrupted: z.ZodOptional<z.ZodLiteral<"shutdown">>;
3028
+ inputClasses: z.ZodOptional<z.ZodArray<z.ZodString>>;
3029
+ classified: z.ZodOptional<z.ZodArray<z.ZodObject<{
3030
+ property: z.ZodString;
3031
+ inputClass: z.ZodString;
3032
+ }, z.core.$strict>>>;
2946
3033
  episodeBasis: z.ZodOptional<z.ZodString>;
2947
3034
  implementationBasis: z.ZodOptional<z.ZodString>;
2948
3035
  reusedFrom: z.ZodOptional<z.ZodObject<{
@@ -2972,10 +3059,12 @@ export declare const executionDocumentSchema: z.ZodObject<{
2972
3059
  "provider-auth": "provider-auth";
2973
3060
  "stale-base": "stale-base";
2974
3061
  "empty-result": "empty-result";
3062
+ unfinished: "unfinished";
2975
3063
  "scope-violation": "scope-violation";
2976
3064
  "review-protocol": "review-protocol";
2977
3065
  merge: "merge";
2978
3066
  budget: "budget";
3067
+ "needs-lead": "needs-lead";
2979
3068
  }>>;
2980
3069
  respecified: z.ZodOptional<z.ZodBoolean>;
2981
3070
  applied: z.ZodBoolean;
@@ -3095,11 +3184,11 @@ export declare const executionDocumentSchema: z.ZodObject<{
3095
3184
  runId: z.ZodString;
3096
3185
  status: z.ZodNullable<z.ZodString>;
3097
3186
  reason: z.ZodEnum<{
3187
+ unfinished: "unfinished";
3098
3188
  "not-started": "not-started";
3099
3189
  "legacy-unconfirmed": "legacy-unconfirmed";
3100
3190
  "foreign-scope": "foreign-scope";
3101
3191
  "unknown-status": "unknown-status";
3102
- unfinished: "unfinished";
3103
3192
  abandoned: "abandoned";
3104
3193
  }>;
3105
3194
  }, z.core.$strict>>>;
@@ -3232,6 +3321,19 @@ export declare const executionDocumentSchema: z.ZodObject<{
3232
3321
  coverage: z.ZodOptional<z.ZodArray<z.ZodString>>;
3233
3322
  }, z.core.$strict>>;
3234
3323
  checks: z.ZodOptional<z.ZodString>;
3324
+ alreadySatisfied: z.ZodOptional<z.ZodObject<{
3325
+ gates: z.ZodArray<z.ZodString>;
3326
+ evidence: z.ZodString;
3327
+ basis: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
3328
+ kind: z.ZodLiteral<"contract">;
3329
+ gates: z.ZodArray<z.ZodString>;
3330
+ }, z.core.$strict>, z.ZodObject<{
3331
+ kind: z.ZodLiteral<"dependency">;
3332
+ workId: z.ZodString;
3333
+ sha: z.ZodString;
3334
+ paths: z.ZodArray<z.ZodString>;
3335
+ }, z.core.$strict>], "kind">>;
3336
+ }, z.core.$strict>>;
3235
3337
  }, z.core.$strict>>;
3236
3338
  }, z.core.$strict>>;
3237
3339
  verifications: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -3382,10 +3484,12 @@ export declare const executionDocumentSchema: z.ZodObject<{
3382
3484
  "provider-auth": "provider-auth";
3383
3485
  "stale-base": "stale-base";
3384
3486
  "empty-result": "empty-result";
3487
+ unfinished: "unfinished";
3385
3488
  "scope-violation": "scope-violation";
3386
3489
  "review-protocol": "review-protocol";
3387
3490
  merge: "merge";
3388
3491
  budget: "budget";
3492
+ "needs-lead": "needs-lead";
3389
3493
  }>>>;
3390
3494
  waits: z.ZodOptional<z.ZodArray<z.ZodObject<{
3391
3495
  kind: z.ZodEnum<{
@@ -36,6 +36,8 @@ export const failureKinds = [
36
36
  'timeout',
37
37
  'stale-base',
38
38
  'empty-result',
39
+ /** Исполнитель сообщил `completed: false`: работа не доделана, черновик сохранён. */
40
+ 'unfinished',
39
41
  'scope-violation',
40
42
  'gate',
41
43
  'review',
@@ -44,6 +46,11 @@ export const failureKinds = [
44
46
  'merge',
45
47
  'cancelled',
46
48
  'budget',
49
+ /**
50
+ * Исполнитель не изменил ни файла, а основания считать работу уже
51
+ * сделанной механически нет: решение — за ведущим, не повтор.
52
+ */
53
+ 'needs-lead',
47
54
  'unknown',
48
55
  ];
49
56
  export const failureKindSchema = z.enum(failureKinds);
@@ -249,6 +256,32 @@ export const evidenceRecordSchema = z.strictObject({
249
256
  property: propertyEvidenceSchema.optional(),
250
257
  /** Действующая версия проверок, под которой получено evidence. */
251
258
  checks: digestSchema.optional(),
259
+ /**
260
+ * Ревью попытки без изменений подтвердило, что приёмка уже выполнена на
261
+ * базе: gates, на которые сослался reviewer, и его основание.
262
+ */
263
+ alreadySatisfied: z
264
+ .strictObject({
265
+ gates: z.array(z.string().min(1).max(200)).min(1).max(20),
266
+ evidence: z.string().min(1).max(4000),
267
+ /** Механическое основание, найденное controller (`alreadySatisfiedVerdict`). */
268
+ basis: z
269
+ .discriminatedUnion('kind', [
270
+ z.strictObject({
271
+ kind: z.literal('contract'),
272
+ gates: z.array(z.string().min(1).max(200)).min(1).max(30),
273
+ }),
274
+ z.strictObject({
275
+ kind: z.literal('dependency'),
276
+ workId: idSchema,
277
+ /** Кандидат зависимости, изменивший область записи. */
278
+ sha: gitShaSchema,
279
+ paths: z.array(z.string().min(1).max(1000)).min(1).max(50),
280
+ }),
281
+ ])
282
+ .optional(),
283
+ })
284
+ .optional(),
252
285
  });
253
286
  /* ------------------------------------------------------------------ */
254
287
  /* Попытка */
@@ -363,6 +396,23 @@ export const attemptStateSchema = z.strictObject({
363
396
  dependencyFreshness: z.array(freshnessSchema).optional(),
364
397
  properties: z.array(z.string()).optional(),
365
398
  unboundProperties: z.array(z.string()).optional(),
399
+ /**
400
+ * Попытку прервала штатная остановка controller: работа не исполнена до
401
+ * конца, но и не отклонена — поручение вернулось в очередь, следующая
402
+ * попытка продолжает с её кандидата или черновика.
403
+ */
404
+ interrupted: z.literal('shutdown').optional(),
405
+ /** Классы входов, названные отклонившим ревью (`reproduction.inputClass`). */
406
+ inputClasses: z.array(z.string().max(500)).max(20).optional(),
407
+ /**
408
+ * Пары «необъявленное свойство или критерий — класс входов» блокирующих
409
+ * находок отклонившего ревью: по ним `acceptanceGap` узнаёт один и тот же
410
+ * дефект в разных попытках.
411
+ */
412
+ classified: z
413
+ .array(z.strictObject({ property: z.string().max(200), inputClass: z.string().max(500) }))
414
+ .max(20)
415
+ .optional(),
366
416
  episodeBasis: digestSchema.optional(),
367
417
  implementationBasis: digestSchema.optional(),
368
418
  reusedFrom: z
@@ -501,6 +551,12 @@ export const workStateSchema = z.strictObject({
501
551
  checkVersion: checkVersionSchema.optional(),
502
552
  recovery: propertyRecoverySchema.optional(),
503
553
  recoveryHistory: z.array(propertyRecoverySchema).optional(),
554
+ /**
555
+ * Отказы окружения, провайдера и истёкшего владения после начала работы:
556
+ * попытку они не засчитывают, но ограничены своим пределом
557
+ * (`MAX_NEUTRAL_FAILURES`); сброс — вместе со сбросом попыток.
558
+ */
559
+ neutralFailures: z.number().int().min(0).optional(),
504
560
  });
505
561
  export const graphStateSchema = z.strictObject({
506
562
  id: idSchema,
@@ -852,6 +908,8 @@ export const reproductionRecordSchema = z.strictObject({
852
908
  property: z.string().max(200).nullable(),
853
909
  inputHash: digestSchema,
854
910
  input: z.string().min(1).max(8000),
911
+ /** Класс входов, названный reviewer; у записей прежних версий нет. */
912
+ inputClass: z.string().max(500).nullable().optional(),
855
913
  expected: z.string().max(2000).nullable(),
856
914
  actual: z.string().max(2000).nullable(),
857
915
  command: z.array(z.string()).max(64).nullable(),
@@ -9,21 +9,35 @@ export declare class TaskFailure extends Error {
9
9
  /**
10
10
  * Свойства, с которыми связан отказ: `bound` — объявленные задачей
11
11
  * property ID, `unbound` — названные проверкой или ревьюером, но не
12
- * объявленные (только для разбора, счётчик эпизода они не выбирают).
12
+ * объявленные (только для разбора, счётчик эпизода они не выбирают);
13
+ * `classes` — классы входов, названные ревьюером; `pairs` — свойство и
14
+ * класс одной находки.
13
15
  */
14
16
  readonly properties?: {
15
17
  bound: string[];
16
18
  unbound: string[];
19
+ classes?: string[];
20
+ pairs?: {
21
+ property: string;
22
+ inputClass: string;
23
+ }[];
17
24
  } | undefined;
18
25
  constructor(kind: FailureKind, message: string,
19
26
  /**
20
27
  * Свойства, с которыми связан отказ: `bound` — объявленные задачей
21
28
  * property ID, `unbound` — названные проверкой или ревьюером, но не
22
- * объявленные (только для разбора, счётчик эпизода они не выбирают).
29
+ * объявленные (только для разбора, счётчик эпизода они не выбирают);
30
+ * `classes` — классы входов, названные ревьюером; `pairs` — свойство и
31
+ * класс одной находки.
23
32
  */
24
33
  properties?: {
25
34
  bound: string[];
26
35
  unbound: string[];
36
+ classes?: string[];
37
+ pairs?: {
38
+ property: string;
39
+ inputClass: string;
40
+ }[];
27
41
  } | undefined);
28
42
  }
29
43
  /**
@@ -35,4 +49,4 @@ export declare class TaskFailure extends Error {
35
49
  * повторов не сработал бы ни разу.
36
50
  */
37
51
  export declare function failureFingerprint(kind: FailureKind, message: string): string;
38
- export { repairPolicy, type RepairRule } from './repair-policy.ts';
52
+ export { MAX_NEUTRAL_FAILURES, repairPolicy, type RepairRule } from './repair-policy.ts';
@@ -11,7 +11,9 @@ export class TaskFailure extends Error {
11
11
  /**
12
12
  * Свойства, с которыми связан отказ: `bound` — объявленные задачей
13
13
  * property ID, `unbound` — названные проверкой или ревьюером, но не
14
- * объявленные (только для разбора, счётчик эпизода они не выбирают).
14
+ * объявленные (только для разбора, счётчик эпизода они не выбирают);
15
+ * `classes` — классы входов, названные ревьюером; `pairs` — свойство и
16
+ * класс одной находки.
15
17
  */
16
18
  properties) {
17
19
  super(message);
@@ -50,4 +52,4 @@ export function failureFingerprint(kind, message) {
50
52
  .digest('hex')
51
53
  .slice(0, 16);
52
54
  }
53
- export { repairPolicy } from "./repair-policy.js";
55
+ export { MAX_NEUTRAL_FAILURES, repairPolicy } from "./repair-policy.js";