gentle-pi 2.1.2 → 2.2.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 (171) hide show
  1. package/README.md +70 -12
  2. package/assets/agents/gentle-ai-worker.md +7 -3
  3. package/assets/agents/jd-fix-agent.md +1 -1
  4. package/assets/agents/jd-judge-a.md +3 -1
  5. package/assets/agents/jd-judge-b.md +3 -1
  6. package/assets/agents/review-readability.md +4 -1
  7. package/assets/agents/review-reliability.md +4 -1
  8. package/assets/agents/review-resilience.md +4 -1
  9. package/assets/agents/review-risk.md +4 -1
  10. package/assets/agents/sdd-apply.md +6 -1
  11. package/assets/agents/sdd-archive.md +6 -1
  12. package/assets/agents/sdd-design.md +6 -1
  13. package/assets/agents/sdd-explore.md +6 -2
  14. package/assets/agents/sdd-init.md +10 -2
  15. package/assets/agents/sdd-onboard.md +6 -1
  16. package/assets/agents/sdd-proposal.md +6 -1
  17. package/assets/agents/sdd-spec.md +6 -1
  18. package/assets/agents/sdd-status.md +6 -1
  19. package/assets/agents/sdd-sync.md +6 -1
  20. package/assets/agents/sdd-tasks.md +6 -1
  21. package/assets/agents/sdd-verify.md +6 -1
  22. package/assets/chains/4r-review.chain.md +2 -0
  23. package/assets/chains/sdd-full.chain.md +1 -1
  24. package/assets/chains/sdd-plan.chain.md +1 -1
  25. package/assets/chains/sdd-verify.chain.md +1 -1
  26. package/assets/orchestrator-delegation.md +246 -67
  27. package/assets/orchestrator.md +7 -14
  28. package/assets/sdd-orchestrator-workflow.md +154 -9
  29. package/assets/support/sdd-status-contract.md +19 -1
  30. package/contracts/review-integration/v1/fixtures/consent.fixture.json +3 -3
  31. package/contracts/review-integration/v1/fixtures/start-v2.fixture.json +19 -28
  32. package/contracts/review-integration/v1/fixtures/start.fixture.json +1 -10
  33. package/contracts/review-integration/v1/fixtures/status-v2.fixture.json +12 -21
  34. package/contracts/review-integration/v1/schemas/correction-plan-request.schema.json +49 -0
  35. package/contracts/review-integration/v1/schemas/operation.schema.json +76 -0
  36. package/contracts/review-integration/v1/schemas/repair.schema.json +39 -0
  37. package/contracts/review-integration/v1/schemas/status-v2.schema.json +4 -2
  38. package/contracts/review-integration/v1/schemas/status.schema.json +4 -2
  39. package/contracts/review-integration/v2/fixtures/consent.fixture.json +1 -1
  40. package/contracts/review-integration/v2/fixtures/start.fixture.json +1 -10
  41. package/contracts/review-integration/v2/fixtures/status.fixture.json +1 -10
  42. package/contracts/review-integration/v2/schemas/failure.schema.json +5 -1
  43. package/contracts/review-integration/v2/schemas/operation.schema.json +6 -1
  44. package/contracts/review-integration/v2/schemas/repair.schema.json +4 -2
  45. package/contracts/review-integration/v2/schemas/start.schema.json +5 -2
  46. package/contracts/review-integration/v2/schemas/status.schema.json +4 -2
  47. package/contracts/review-provider-contract-mirror/provider-contract.lock.json +30 -0
  48. package/contracts/review-provider-contract-mirror/v1.1.0/bundle/README.md +12 -0
  49. package/contracts/review-provider-contract-mirror/v1.1.0/bundle/manifest.json +65 -0
  50. package/contracts/review-provider-contract-mirror/v1.1.0/bundle/schemas/lens.schema.json +16 -0
  51. package/contracts/review-provider-contract-mirror/v1.1.0/bundle/schemas/refuter.schema.json +1 -0
  52. package/contracts/review-provider-contract-mirror/v1.1.0/bundle/schemas/targeted-validator.schema.json +1 -0
  53. package/contracts/review-provider-contract-mirror/v1.1.0/bundle/vectors/lens.json +1 -0
  54. package/contracts/review-provider-contract-mirror/v1.1.0/bundle/vectors/refuter.json +1 -0
  55. package/contracts/review-provider-contract-mirror/v1.1.0/bundle/vectors/targeted-validator.json +1 -0
  56. package/contracts/review-provider-contract-mirror/v1.1.0/generated/provider-capabilities.baseline.json +15 -0
  57. package/contracts/review-provider-contract-mirror/v1.1.0/generated/provider-roles.baseline.json +42 -0
  58. package/docs/native-authority-architecture.md +5 -5
  59. package/docs/review-integration.md +22 -2
  60. package/extensions/gentle-ai.ts +1595 -201
  61. package/extensions/sdd-init.ts +19 -6
  62. package/extensions/skill-registry.ts +10 -2
  63. package/extensions/startup-banner.ts +10 -4
  64. package/lib/gentle-ai-binary.ts +173 -2
  65. package/lib/git-commit-transaction.ts +77 -17
  66. package/lib/native-review-cli.ts +528 -65
  67. package/lib/provider-contract-bundle.ts +704 -0
  68. package/lib/review-candidate-view.ts +527 -18
  69. package/lib/review-compact-contract.ts +59 -248
  70. package/lib/review-host-relay.ts +436 -0
  71. package/lib/review-integration-v2.ts +537 -36
  72. package/lib/review-relay-contract.ts +16 -0
  73. package/lib/sdd-preflight.ts +53 -1
  74. package/package.json +5 -2
  75. package/runtime/gentle-ai-binary.mjs +173 -2
  76. package/runtime/git-commit-transaction.mjs +75 -15
  77. package/runtime/native-review-cli.mjs +524 -61
  78. package/runtime/review-integration-v2.mjs +536 -35
  79. package/runtime/review-relay-contract.mjs +17 -0
  80. package/scripts/build-git-commit-transaction-runner.mjs +1 -0
  81. package/scripts/check-provider-contract.mjs +138 -0
  82. package/scripts/gentle-ai-installer.mjs +23 -13
  83. package/scripts/maintainer/provider-relay-matrix.mjs +219 -0
  84. package/scripts/mirror-provider-contract.mjs +143 -0
  85. package/scripts/test-packed-runner.mjs +16 -2
  86. package/scripts/verify-package-files.mjs +110 -33
  87. package/skills/_shared/review-ledger-contract.md +4 -6
  88. package/skills/gentle-ai/SKILL.md +4 -4
  89. package/skills/issue-creation/SKILL.md +94 -168
  90. package/skills/judgment-day/SKILL.md +7 -1
  91. package/skills/judgment-day/references/prompts-and-formats.md +2 -0
  92. package/skills/rdd-defect-workflow/SKILL.md +54 -0
  93. package/tests/background-subagents.test.ts +771 -0
  94. package/tests/crosslane/cross-lane.mjs +1169 -0
  95. package/tests/delegated-key-learnings-contract.test.ts +238 -0
  96. package/tests/fixtures/devbinary/capabilities-v2.1.derived.json +331 -0
  97. package/tests/fixtures/devbinary/capabilities-v2.2.captured.json +340 -0
  98. package/tests/fixtures/devbinary/consent-v3.captured.json +37 -0
  99. package/tests/fixtures/devbinary/failure-v2-capture-evidence.captured.json +16 -0
  100. package/tests/fixtures/devbinary/result-artifact-v2-path.captured.json +12 -0
  101. package/tests/fixtures/devbinary/result-artifact-v2.captured.json +12 -0
  102. package/tests/fixtures/devbinary/start-v3-consent-declined.captured.json +19 -0
  103. package/tests/fixtures/devbinary/start-v3-consent-granted.captured.json +109 -0
  104. package/tests/fixtures/devbinary/status-v5-capture-result-submission.captured.json +184 -0
  105. package/tests/fixtures/devbinary/status-v5-repository-context.captured.json +138 -0
  106. package/tests/fixtures/devbinary/status-v5.captured.json +88 -0
  107. package/tests/fixtures/provider-contract-bundle/v1.1.0/README.md +12 -0
  108. package/tests/fixtures/provider-contract-bundle/v1.1.0/manifest.json +65 -0
  109. package/tests/fixtures/provider-contract-bundle/v1.1.0/schemas/lens.schema.json +16 -0
  110. package/tests/fixtures/provider-contract-bundle/v1.1.0/schemas/refuter.schema.json +1 -0
  111. package/tests/fixtures/provider-contract-bundle/v1.1.0/schemas/targeted-validator.schema.json +1 -0
  112. package/tests/fixtures/provider-contract-bundle/v1.1.0/vectors/lens.json +1 -0
  113. package/tests/fixtures/provider-contract-bundle/v1.1.0/vectors/refuter.json +1 -0
  114. package/tests/fixtures/provider-contract-bundle/v1.1.0/vectors/targeted-validator.json +1 -0
  115. package/tests/gentle-ai-binary.test.ts +1 -1
  116. package/tests/gentle-ai-dev-binary-surfacing.test.ts +195 -0
  117. package/tests/gentle-ai-dev-binary.test.ts +336 -0
  118. package/tests/gentle-ai-installer.test.ts +46 -46
  119. package/tests/git-commit-transaction.test.ts +229 -1
  120. package/tests/maintainer/provider-relay.maintest.ts +265 -0
  121. package/tests/native-review-capability-contract.test.ts +48 -2
  122. package/tests/native-review-cli.test.ts +56 -0
  123. package/tests/native-review-consent.test.ts +164 -3
  124. package/tests/native-review-parity-runtime.test.ts +37 -0
  125. package/tests/native-review-parity.test.ts +218 -15
  126. package/tests/native-sdd-attempt-authority.test.ts +235 -0
  127. package/tests/orchestrator-budget.test.ts +30 -5
  128. package/tests/package-manifest.test.ts +98 -72
  129. package/tests/provider-contract-bundle.test.ts +385 -0
  130. package/tests/provider-contract-mirror.test.ts +206 -0
  131. package/tests/provider-defect-handoff.test.ts +355 -0
  132. package/tests/review-actor-tool-deny.test.ts +12 -13
  133. package/tests/review-candidate-view.test.ts +489 -9
  134. package/tests/review-compact-contract.test.ts +52 -119
  135. package/tests/review-controller-native-recovery.test.ts +643 -47
  136. package/tests/review-controller-native-routing.test.ts +1667 -222
  137. package/tests/review-controller-workspace-root.test.ts +17 -2
  138. package/tests/review-corrected-finalize-binding.test.ts +175 -0
  139. package/tests/review-dispatch-hydration-gap.test.ts +197 -0
  140. package/tests/review-host-relay-routing.test.ts +317 -0
  141. package/tests/review-host-relay.test.ts +520 -0
  142. package/tests/review-integration-v2-forward.test.ts +631 -0
  143. package/tests/review-integration-v2.test.ts +114 -0
  144. package/tests/review-ledger-contract.test.ts +12 -28
  145. package/tests/review-recovered-lineage-routing.test.ts +246 -0
  146. package/tests/review-relay-transport-agent.test.ts +249 -0
  147. package/tests/runtime-harness.mjs +242 -14
  148. package/tests/sdd-agent-tools.test.ts +18 -33
  149. package/tests/skill-collision-prefixes.test.ts +1 -0
  150. package/tests/skill-registry.test.ts +50 -1
  151. package/tests/verify-package-files.test.ts +62 -0
  152. package/assets/agents/review-refuter.md +0 -40
  153. package/assets/agents/review-validator.md +0 -23
  154. package/lib/native-review-remediation.ts +0 -49
  155. package/lib/review-compact.ts +0 -947
  156. package/lib/review-refuter-adapter.ts +0 -129
  157. package/lib/review-runtime-contract.ts +0 -68
  158. package/prompts/gcl.md +0 -54
  159. package/prompts/gis.md +0 -25
  160. package/prompts/gpr.md +0 -41
  161. package/prompts/gwr.md +0 -31
  162. package/tests/fixtures/native-review-cli/v2.1.2/bind-sdd.json +0 -25
  163. package/tests/fixtures/native-review-cli/v2.1.2/finalize.json +0 -8
  164. package/tests/fixtures/native-review-cli/v2.1.2/sdd-status-engram.json +0 -139
  165. package/tests/fixtures/native-review-cli/v2.1.2/sdd-status.json +0 -200
  166. package/tests/fixtures/native-review-cli/v2.1.2/start.json +0 -12
  167. package/tests/fixtures/native-review-cli/v2.1.2/validate-allow.json +0 -24
  168. package/tests/fixtures/native-review-cli/v2.1.2/validate-deny-empty-context.json +0 -20
  169. package/tests/fixtures/native-review-cli/v2.1.2/validate-deny.json +0 -28
  170. package/tests/review-compact.test.ts +0 -243
  171. package/tests/review-refuter-adapter.test.ts +0 -89
@@ -89,6 +89,9 @@
89
89
  "$comment": "Present only when the authority is escalated. Carries the accounting sentence with spent, remaining and total correction lines, so a caller learns the numbers without a second call.",
90
90
  "type": "string",
91
91
  "minLength": 1
92
+ },
93
+ "advisory_findings": {
94
+ "$ref": "#/$defs/advisory_findings"
92
95
  }
93
96
  },
94
97
  "allOf": [
@@ -105,9 +108,82 @@
105
108
  }
106
109
  }
107
110
  }
111
+ },
112
+ {
113
+ "if": {
114
+ "required": [
115
+ "advisory_findings"
116
+ ]
117
+ },
118
+ "then": {
119
+ "properties": {
120
+ "state": {
121
+ "const": "approved"
122
+ }
123
+ }
124
+ }
108
125
  }
109
126
  ]
110
127
  },
128
+ "advisory_findings": {
129
+ "$comment": "Additive and optional. Present only on an approved lineage that froze at least one non-blocking finding, it names the disposition that lineage's routing already decided (outcome plus absence from the correction ledger) instead of leaving a consumer to infer it from a bare severity string. It changes nothing about which findings block: a corrected blocker is excluded rather than relabelled, and the statement says the approval stands and that no correction transition is offered.",
130
+ "type": "object",
131
+ "additionalProperties": false,
132
+ "required": [
133
+ "statement",
134
+ "findings"
135
+ ],
136
+ "properties": {
137
+ "statement": {
138
+ "type": "string",
139
+ "minLength": 1
140
+ },
141
+ "findings": {
142
+ "type": "array",
143
+ "minItems": 1,
144
+ "items": {
145
+ "type": "object",
146
+ "additionalProperties": false,
147
+ "required": [
148
+ "id",
149
+ "severity",
150
+ "disposition"
151
+ ],
152
+ "properties": {
153
+ "id": {
154
+ "type": "string",
155
+ "minLength": 1
156
+ },
157
+ "lens": {
158
+ "type": "string",
159
+ "minLength": 1
160
+ },
161
+ "location": {
162
+ "type": "string",
163
+ "minLength": 1
164
+ },
165
+ "severity": {
166
+ "type": "string",
167
+ "enum": [
168
+ "BLOCKER",
169
+ "CRITICAL",
170
+ "WARNING",
171
+ "SUGGESTION"
172
+ ]
173
+ },
174
+ "disposition": {
175
+ "$comment": "informational: a non-severe finding that never entered classification and requires no action. follow_up: a severe finding proved to originate outside the frozen candidate, recorded for separate later work. refuted: a severe inferential finding the refuter knocked down.",
176
+ "enum": [
177
+ "informational",
178
+ "follow_up",
179
+ "refuted"
180
+ ]
181
+ }
182
+ }
183
+ }
184
+ }
185
+ }
186
+ },
111
187
  "validate": {
112
188
  "type": "object",
113
189
  "additionalProperties": false,
@@ -48,6 +48,10 @@
48
48
  },
49
49
  "execution": {
50
50
  "$ref": "#/$defs/execution"
51
+ },
52
+ "continuation": {
53
+ "type": "string",
54
+ "minLength": 1
51
55
  }
52
56
  },
53
57
  "allOf": [
@@ -154,6 +158,41 @@
154
158
  }
155
159
  }
156
160
  }
161
+ },
162
+ {
163
+ "if": {
164
+ "properties": {
165
+ "mode": {
166
+ "const": "preflight"
167
+ },
168
+ "assessment": {
169
+ "properties": {
170
+ "status": {
171
+ "const": "truncated"
172
+ }
173
+ },
174
+ "required": [
175
+ "status"
176
+ ]
177
+ }
178
+ },
179
+ "required": [
180
+ "mode",
181
+ "assessment"
182
+ ]
183
+ },
184
+ "then": {
185
+ "required": [
186
+ "continuation"
187
+ ]
188
+ },
189
+ "else": {
190
+ "not": {
191
+ "required": [
192
+ "continuation"
193
+ ]
194
+ }
195
+ }
157
196
  }
158
197
  ],
159
198
  "$defs": {
@@ -99,12 +99,14 @@
99
99
  "kind": { "enum": ["execute", "collect", "stop"] },
100
100
  "reason_code": { "type": "string", "pattern": "^[a-z0-9_]+$" },
101
101
  "execute": { "$ref": "#/$defs/transition_execution" },
102
- "collect": { "$ref": "#/$defs/transition_collection" }
102
+ "collect": { "$ref": "#/$defs/transition_collection" },
103
+ "correction_request": { "$ref": "correction-plan-request.schema.json" }
103
104
  },
104
105
  "allOf": [
105
106
  { "if": { "properties": { "kind": { "const": "execute" } }, "required": ["kind"] }, "then": { "required": ["execute"], "not": { "required": ["collect"] } } },
106
107
  { "if": { "properties": { "kind": { "const": "collect" } }, "required": ["kind"] }, "then": { "required": ["collect"], "not": { "required": ["execute"] } } },
107
- { "if": { "properties": { "kind": { "const": "stop" } }, "required": ["kind"] }, "then": { "not": { "anyOf": [{ "required": ["execute"] }, { "required": ["collect"] }] } } }
108
+ { "if": { "properties": { "kind": { "const": "stop" } }, "required": ["kind"] }, "then": { "not": { "anyOf": [{ "required": ["execute"] }, { "required": ["collect"] }] } } },
109
+ { "if": { "properties": { "reason_code": { "enum": ["correction_plan_required", "corrected_candidate_unavailable"] } }, "required": ["reason_code"] }, "then": { "required": ["correction_request"] }, "else": { "not": { "required": ["correction_request"] } } }
108
110
  ]
109
111
  },
110
112
  "transition_argument": {
@@ -82,12 +82,14 @@
82
82
  "kind": { "enum": ["execute", "collect", "stop"] },
83
83
  "reason_code": { "type": "string", "pattern": "^[a-z0-9_]+$" },
84
84
  "execute": { "$ref": "#/$defs/transition_execution" },
85
- "collect": { "$ref": "#/$defs/transition_collection" }
85
+ "collect": { "$ref": "#/$defs/transition_collection" },
86
+ "correction_request": { "$ref": "correction-plan-request.schema.json" }
86
87
  },
87
88
  "allOf": [
88
89
  { "if": { "properties": { "kind": { "const": "execute" } }, "required": ["kind"] }, "then": { "required": ["execute"], "not": { "required": ["collect"] } } },
89
90
  { "if": { "properties": { "kind": { "const": "collect" } }, "required": ["kind"] }, "then": { "required": ["collect"], "not": { "required": ["execute"] } } },
90
- { "if": { "properties": { "kind": { "const": "stop" } }, "required": ["kind"] }, "then": { "not": { "anyOf": [{ "required": ["execute"] }, { "required": ["collect"] }] } } }
91
+ { "if": { "properties": { "kind": { "const": "stop" } }, "required": ["kind"] }, "then": { "not": { "anyOf": [{ "required": ["execute"] }, { "required": ["collect"] }] } } },
92
+ { "if": { "properties": { "reason_code": { "enum": ["correction_plan_required", "corrected_candidate_unavailable"] } }, "required": ["reason_code"] }, "then": { "required": ["correction_request"] }, "else": { "not": { "required": ["correction_request"] } } }
91
93
  ]
92
94
  },
93
95
  "transition_argument": {
@@ -25,7 +25,7 @@
25
25
  {
26
26
  "answer": "declined",
27
27
  "label": "Not now, just this once",
28
- "effect": "Skips the review for this candidate only; nothing is persisted and the next candidate is asked again. This is not the kill switch.",
28
+ "effect": "Skips the review for this exact candidate only; no review lineage or receipt is created, and ordinary delivery is unmanaged by candidate choice. The next candidate is asked again. This is not the kill switch.",
29
29
  "invocation": "gentle-ai review start --contract gentle-ai.review-integration/v2 --cwd /repo --target sha256:136dc6556e3bac8c2e7f7af7cc5ec361f449e383a997638128729059fefa06a5 --projection workspace --lineage review-consent-fixture --consent declined"
30
30
  }
31
31
  ],
@@ -73,16 +73,7 @@
73
73
  }
74
74
  ],
75
75
  "changed_path_manifest": [
76
- {
77
- "path": "scripts/deploy.sh",
78
- "status": "A",
79
- "old_mode": "000000",
80
- "new_mode": "100644",
81
- "deleted": false,
82
- "type_changed": false,
83
- "mode_only": false,
84
- "intended_untracked": true
85
- }
76
+ {"path":"scripts/deploy.sh","status":"A","old_mode":"000000","new_mode":"100644","deleted":false,"type_changed":false,"mode_only":false,"intended_untracked":true}
86
77
  ],
87
78
  "repository_context": {
88
79
  "capability": "review.opaque_repository_context",
@@ -95,16 +95,7 @@
95
95
  "base_tree": "3e21a205dd9b55021aeae87965092623807e455f",
96
96
  "candidate_tree": "1c3325617279b38743f073302ba190fc421b5a09",
97
97
  "changed_path_manifest": [
98
- {
99
- "path": "tracked.txt",
100
- "status": "M",
101
- "old_mode": "100644",
102
- "new_mode": "100644",
103
- "deleted": false,
104
- "type_changed": false,
105
- "mode_only": false,
106
- "intended_untracked": false
107
- }
98
+ {"path":"tracked.txt","status":"M","old_mode":"100644","new_mode":"100644","deleted":false,"type_changed":false,"mode_only":false,"intended_untracked":false}
108
99
  ]
109
100
  }
110
101
  ]
@@ -11,7 +11,11 @@
11
11
  "properties": {
12
12
  "schema": {"const": "gentle-ai.review-integration.failure/v2"},
13
13
  "contract": {"const": "gentle-ai.review-integration/v2"},
14
- "operation": {"$ref": "../../v1/schemas/failure.schema.json#/properties/operation"},
14
+ "operation": {"enum": [
15
+ "review.capabilities", "review.start", "review.status", "review.finalize", "review.repair",
16
+ "review.retry_final_verification", "review.validate", "review.bind_sdd",
17
+ "review.capture-result", "review.capture-evidence", "review.capture-refuter", "review.capture-validation"
18
+ ]},
15
19
  "phase": {"$ref": "../../v1/schemas/failure.schema.json#/properties/phase"},
16
20
  "code": {"$ref": "../../v1/schemas/failure.schema.json#/properties/code"},
17
21
  "message": {"$ref": "../../v1/schemas/failure.schema.json#/properties/message"},
@@ -33,12 +33,17 @@
33
33
  "eligibility": {"$ref": "status.schema.json#/properties/eligibility"},
34
34
  "next_transition": {"$ref": "status.schema.json#/$defs/next_transition"},
35
35
  "validation_request": {"$ref": "../../v1/schemas/targeted-validation-request.schema.json"},
36
- "escalation": {"type": "string", "minLength": 1}
36
+ "escalation": {"type": "string", "minLength": 1},
37
+ "advisory_findings": {"$ref": "../../v1/schemas/operation.schema.json#/$defs/advisory_findings"}
37
38
  },
38
39
  "allOf": [
39
40
  {
40
41
  "if": {"required": ["validation_request"]},
41
42
  "then": {"properties": {"state": {"const": "correction_required"}}}
43
+ },
44
+ {
45
+ "if": {"required": ["advisory_findings"]},
46
+ "then": {"properties": {"state": {"const": "approved"}}}
42
47
  }
43
48
  ]
44
49
  }
@@ -13,10 +13,12 @@
13
13
  "assessment": {"$ref": "../../v1/schemas/repair.schema.json#/properties/assessment"},
14
14
  "provider_inputs": {"$ref": "../../v1/schemas/repair.schema.json#/properties/provider_inputs"},
15
15
  "required_inputs": {"$ref": "../../v1/schemas/repair.schema.json#/properties/required_inputs"},
16
- "execution": {"$ref": "../../v1/schemas/repair.schema.json#/properties/execution"}
16
+ "execution": {"$ref": "../../v1/schemas/repair.schema.json#/properties/execution"},
17
+ "continuation": {"$ref": "../../v1/schemas/repair.schema.json#/properties/continuation"}
17
18
  },
18
19
  "allOf": [
19
20
  {"$ref": "../../v1/schemas/repair.schema.json#/allOf/0"},
20
- {"$ref": "../../v1/schemas/repair.schema.json#/allOf/1"}
21
+ {"$ref": "../../v1/schemas/repair.schema.json#/allOf/1"},
22
+ {"$ref": "../../v1/schemas/repair.schema.json#/allOf/2"}
21
23
  ]
22
24
  }
@@ -66,8 +66,11 @@
66
66
  "capability": {"const": "review.opaque_repository_context"},
67
67
  "handle": {"type": "string", "pattern": "^rctx1_[0-9a-f]{64}$"},
68
68
  "revision": {"$ref": "#/$defs/sha256"},
69
- "target_identity": {"$ref": "#/$defs/sha256"}
70
- }
69
+ "target_identity": {"$ref": "#/$defs/sha256"},
70
+ "event_id": {"$ref": "#/$defs/sha256"},
71
+ "outcome": {"enum": ["applied", "pending", "blocked_conflict", "durability_limited"]}
72
+ },
73
+ "dependentRequired": {"event_id": ["outcome"], "outcome": ["event_id"]}
71
74
  }
72
75
  },
73
76
  "$defs": {
@@ -38,12 +38,14 @@
38
38
  "kind": {"enum": ["execute", "collect", "stop"]},
39
39
  "reason_code": {"type": "string", "pattern": "^[a-z0-9_]+$"},
40
40
  "execute": {"$ref": "../../v1/schemas/status-v2.schema.json#/$defs/transition_execution"},
41
- "collect": {"$ref": "#/$defs/transition_collection"}
41
+ "collect": {"$ref": "#/$defs/transition_collection"},
42
+ "correction_request": {"$ref": "../../v1/schemas/correction-plan-request.schema.json"}
42
43
  },
43
44
  "allOf": [
44
45
  {"if": {"properties": {"kind": {"const": "execute"}}, "required": ["kind"]}, "then": {"required": ["execute"], "not": {"required": ["collect"]}}},
45
46
  {"if": {"properties": {"kind": {"const": "collect"}}, "required": ["kind"]}, "then": {"required": ["collect"], "not": {"required": ["execute"]}}},
46
- {"if": {"properties": {"kind": {"const": "stop"}}, "required": ["kind"]}, "then": {"not": {"anyOf": [{"required": ["execute"]}, {"required": ["collect"]}]}}}
47
+ {"if": {"properties": {"kind": {"const": "stop"}}, "required": ["kind"]}, "then": {"not": {"anyOf": [{"required": ["execute"]}, {"required": ["collect"]}]}}},
48
+ {"if": {"properties": {"reason_code": {"enum": ["correction_plan_required", "corrected_candidate_unavailable"]}}, "required": ["reason_code"]}, "then": {"required": ["correction_request"]}, "else": {"not": {"required": ["correction_request"]}}}
47
49
  ]
48
50
  },
49
51
  "transition_collection": {
@@ -0,0 +1,30 @@
1
+ {
2
+ "schema": "gentle-pi.review-provider-contract-mirror-lock/v1",
3
+ "acquisition": "field-test-local",
4
+ "contract_semver": "1.1.0",
5
+ "source": {
6
+ "kind": "tree"
7
+ },
8
+ "tree_sha256": "364af8357c56500b417fcd98f4be5ecbe0eca36d92958eed81b89ffe6d49c4db",
9
+ "entries": {
10
+ "README.md": "d14647c8753bd85e18b8a593bef9dfcb4c9d8ea01e32ecd36847dc4304027b1d",
11
+ "manifest.json": "b9ccf9966592d2cdd20438b71d8fb9b84293756de63ec21824435e429d8fdcc0",
12
+ "schemas/lens.schema.json": "ffef79cfb763333282285ff5c795a32b5a88d840b4a8d125ce012188b04cffe1",
13
+ "schemas/refuter.schema.json": "36f8267c6c3f04600b8f1cb77df70d90858611af822cc81922efd6b3502fb646",
14
+ "schemas/targeted-validator.schema.json": "58f5efca0fb8089a51e998d5cf07209528a6b6e3782246b34ee1e825132063a8",
15
+ "vectors/lens.json": "7ef0b08404645eeb5dba92aba5f8e4780667b6ec775f43ed8547ff9f2a7148c8",
16
+ "vectors/refuter.json": "f42d71906e49c4191660b2da7e70f01f1778b23d32089005bd2d7ae9cbb73039",
17
+ "vectors/targeted-validator.json": "7b5a5165e3a913863fb98d2ba5387811860c21333b5c37e6ed3b4e0d121cf2fa"
18
+ },
19
+ "generated": {
20
+ "generated/provider-capabilities.baseline.json": "ab337e42149a7069e7a33bc0d8339620e23ca2ef1e1bbca938cd6da6094e3a9a",
21
+ "generated/provider-roles.baseline.json": "4768774be3404e98ac4177052bc208012bd73a6c46ef8d8ba10afeac202a5a9b"
22
+ },
23
+ "runtimes": [
24
+ "claude-code",
25
+ "codex",
26
+ "opencode",
27
+ "pi"
28
+ ],
29
+ "pi_registered": true
30
+ }
@@ -0,0 +1,12 @@
1
+ # Gentle AI review provider contract
2
+
3
+ This data-only bundle describes the provider result contracts admitted by Gentle AI.
4
+
5
+ ## Activation
6
+
7
+ 1. Verify the signed release checksum manifest before using this archive.
8
+ 2. Verify every listed file hash and the transport capability before activation.
9
+ 3. Confirm your runtime identity appears in the manifest's registered runtimes before trusting the layout.
10
+ 4. Pass the Go-materialized opaque prompt to the provider and return only raw output or an error.
11
+
12
+ Go remains the admission authority for prompts, results, receipts, and delivery gates.
@@ -0,0 +1,65 @@
1
+ {
2
+ "schema": "gentle-ai.review-provider-contract-bundle/v1",
3
+ "contract_semver": "1.1.0",
4
+ "transport_capability": "gentle-ai.provider-transport/v1",
5
+ "runtimes": [
6
+ "claude-code",
7
+ "codex",
8
+ "opencode",
9
+ "pi"
10
+ ],
11
+ "readme": {
12
+ "path": "README.md",
13
+ "sha256": "d14647c8753bd85e18b8a593bef9dfcb4c9d8ea01e32ecd36847dc4304027b1d"
14
+ },
15
+ "roles": [
16
+ {
17
+ "id": "lens",
18
+ "request_schema_id": "gentle-ai.review-lens-context/v1",
19
+ "result_schema_id": "https://gentle-ai.dev/schema/review/reviewer/v1",
20
+ "required_capabilities": [
21
+ "gentle-ai.provider-transport/v1"
22
+ ],
23
+ "schema": {
24
+ "path": "schemas/lens.schema.json",
25
+ "sha256": "ffef79cfb763333282285ff5c795a32b5a88d840b4a8d125ce012188b04cffe1"
26
+ },
27
+ "vector": {
28
+ "path": "vectors/lens.json",
29
+ "sha256": "7ef0b08404645eeb5dba92aba5f8e4780667b6ec775f43ed8547ff9f2a7148c8"
30
+ }
31
+ },
32
+ {
33
+ "id": "refuter",
34
+ "request_schema_id": "gentle-ai.review-provider-refuter-request/v1",
35
+ "result_schema_id": "https://gentle-ai.dev/schema/review/refuter/v1",
36
+ "required_capabilities": [
37
+ "gentle-ai.provider-transport/v1"
38
+ ],
39
+ "schema": {
40
+ "path": "schemas/refuter.schema.json",
41
+ "sha256": "36f8267c6c3f04600b8f1cb77df70d90858611af822cc81922efd6b3502fb646"
42
+ },
43
+ "vector": {
44
+ "path": "vectors/refuter.json",
45
+ "sha256": "f42d71906e49c4191660b2da7e70f01f1778b23d32089005bd2d7ae9cbb73039"
46
+ }
47
+ },
48
+ {
49
+ "id": "targeted-validator",
50
+ "request_schema_id": "gentle-ai.review-targeted-validation-request/v1",
51
+ "result_schema_id": "https://gentle-ai.dev/schema/review/validator/v1",
52
+ "required_capabilities": [
53
+ "gentle-ai.provider-transport/v1"
54
+ ],
55
+ "schema": {
56
+ "path": "schemas/targeted-validator.schema.json",
57
+ "sha256": "58f5efca0fb8089a51e998d5cf07209528a6b6e3782246b34ee1e825132063a8"
58
+ },
59
+ "vector": {
60
+ "path": "vectors/targeted-validator.json",
61
+ "sha256": "7b5a5165e3a913863fb98d2ba5387811860c21333b5c37e6ed3b4e0d121cf2fa"
62
+ }
63
+ }
64
+ ]
65
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://gentle-ai.dev/schema/review/reviewer/v1",
4
+ "title": "Gentle AI reviewer result",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["subject_hash", "inspection", "findings", "evidence"],
8
+ "properties": {
9
+ "subject_hash": {"type": "string", "pattern": "^sha256:[0-9a-f]{64}$"},
10
+ "inspection": {"type": "object", "additionalProperties": false, "required": ["status", "paths"], "properties": {"status": {"const": "completed"}, "paths": {"type": "array", "description": "Complete unique unordered set of every changed_path_manifest.path.", "uniqueItems": true, "items": {"type": "string", "minLength": 1}}}},
11
+ "lens": {"type": "string", "description": "Optional selected lens binding. Omission canonicalizes to the selected subject lens.", "enum": ["risk", "resilience", "readability", "reliability", "review-risk", "review-resilience", "review-readability", "review-reliability"]},
12
+ "findings": {"type": "array", "items": {"type": "object", "additionalProperties": false, "required": ["location", "severity", "claim", "proof_refs"], "allOf": [{"if": {"properties": {"severity": {"enum": ["BLOCKER", "CRITICAL"]}}, "required": ["severity"]}, "then": {"required": ["evidence_class", "causal_disposition"]}}], "properties": {"id": {"type": "string", "pattern": "^R[1-4]-[A-Za-z0-9][A-Za-z0-9._-]*$", "description": "Optional explicit ID; omit it to receive a native-assigned ID. When present it must carry the prefix bound to the selected lens, not the selection order: review-risk=R1-, review-readability=R2-, review-reliability=R3-, review-resilience=R4-."}, "lens": {"type": "string", "enum": ["risk", "resilience", "readability", "reliability", "review-risk", "review-resilience", "review-readability", "review-reliability"]}, "location": {"type": "string", "description": "One canonical repository-relative path:line or inclusive path:start-end span.", "pattern": "^.+:[1-9][0-9]*(?:-[1-9][0-9]*)?$"}, "severity": {"type": "string", "enum": ["BLOCKER", "CRITICAL", "WARNING", "SUGGESTION"]}, "claim": {"type": "string", "minLength": 1}, "proof_refs": {"type": "array", "minItems": 1, "items": {"type": "string", "pattern": "\\S", "not": {"pattern": "^\\s*(?:[nN]/[aA]|[nN][aA]|[nN][oO][nN][eE]|[tT][oO][dD][oO]|[tT][bB][dD]|[pP][aA][sS][sS]|[pP][aA][sS][sS][eE][dD]|[sS][uU][cC][cC][eE][sS][sS]|[pP][lL][aA][cC][eE][hH][oO][lL][dD][eE][rR])\\s*$"}}}, "evidence_class": {"type": "string", "enum": ["deterministic", "inferential", "insufficient"]}, "causal_disposition": {"type": "string", "enum": ["introduced", "behavior-activated", "worsened", "pre-existing", "base-only", "unknown"]}}}},
13
+ "evidence": {"type": "array", "minItems": 1, "items": {"type": "string", "pattern": "\\S", "not": {"pattern": "^\\s*(?:[nN]/[aA]|[nN][aA]|[nN][oO][nN][eE]|[tT][oO][dD][oO]|[tT][bB][dD]|[pP][aA][sS][sS]|[pP][aA][sS][sS][eE][dD]|[sS][uU][cC][cC][eE][sS][sS]|[pP][lL][aA][cC][eE][hH][oO][lL][dD][eE][rR])\\s*$"}}}
14
+ },
15
+ "examples": [{"subject_hash": "sha256:0000000000000000000000000000000000000000000000000000000000000000", "inspection": {"status": "completed", "paths": ["internal/example.go"]}, "findings": [], "evidence": ["reviewed the complete candidate scope"]}]
16
+ }
@@ -0,0 +1 @@
1
+ {"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://gentle-ai.dev/schema/review/refuter/v1","title":"Gentle AI refuter result","type":"object","additionalProperties":false,"required":["refuter_request_hash","results"],"properties":{"refuter_request_hash":{"$ref":"#/$defs/sha256"},"results":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["finding_id","outcome","proof_refs"],"properties":{"finding_id":{"type":"string"},"outcome":{"type":"string","enum":["corroborated","refuted","inconclusive"]},"proof_refs":{"type":"array","minItems":1,"items":{"type":"string","pattern":"\\S"}}}}}},"$defs":{"sha256":{"type":"string","pattern":"^sha256:[0-9a-f]{64}$"}},"examples":[{"refuter_request_hash":"sha256:0000000000000000000000000000000000000000000000000000000000000000","results":[]}]}
@@ -0,0 +1 @@
1
+ {"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://gentle-ai.dev/schema/review/validator/v1","title":"Gentle AI targeted validator result","type":"object","additionalProperties":false,"required":["targeted_validation_request_hash","correction_target_identity","original_criteria","correction_regression","follow_ups"],"properties":{"targeted_validation_request_hash":{"$ref":"#/$defs/sha256"},"correction_target_identity":{"$ref":"#/$defs/sha256"},"original_criteria":{"$ref":"#/$defs/check"},"correction_regression":{"$ref":"#/$defs/check"},"follow_ups":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["observation","proof_refs"],"properties":{"observation":{"type":"string"},"proof_refs":{"type":"array","minItems":1,"items":{"type":"string","pattern":"\\S"}}}}}},"$defs":{"sha256":{"type":"string","pattern":"^sha256:[0-9a-f]{64}$"},"check":{"type":"object","additionalProperties":false,"required":["passed","evidence"],"properties":{"passed":{"type":"boolean"},"evidence":{"type":"array","minItems":1,"items":{"type":"string"}}}}},"examples":[{"targeted_validation_request_hash":"sha256:0000000000000000000000000000000000000000000000000000000000000000","correction_target_identity":"sha256:1111111111111111111111111111111111111111111111111111111111111111","original_criteria":{"passed":true,"evidence":["acceptance test passed"]},"correction_regression":{"passed":true,"evidence":["regression test passed"]},"follow_ups":[]}]}
@@ -0,0 +1 @@
1
+ {"subject_hash":"sha256:0000000000000000000000000000000000000000000000000000000000000000","inspection":{"status":"completed","paths":["internal/example.go"]},"findings":[],"evidence":["reviewed the complete candidate scope"]}
@@ -0,0 +1 @@
1
+ {"refuter_request_hash":"sha256:0000000000000000000000000000000000000000000000000000000000000000","results":[]}
@@ -0,0 +1 @@
1
+ {"targeted_validation_request_hash":"sha256:0000000000000000000000000000000000000000000000000000000000000000","correction_target_identity":"sha256:1111111111111111111111111111111111111111111111111111111111111111","original_criteria":{"passed":true,"evidence":["acceptance test passed"]},"correction_regression":{"passed":true,"evidence":["regression test passed"]},"follow_ups":[]}
@@ -0,0 +1,15 @@
1
+ {
2
+ "schema": "gentle-pi.provider-contract-capabilities-baseline/v1",
3
+ "contract_semver": "1.1.0",
4
+ "transport_capability": "gentle-ai.provider-transport/v1",
5
+ "mandatory_capabilities": [
6
+ "gentle-ai.provider-transport/v1"
7
+ ],
8
+ "runtimes": [
9
+ "claude-code",
10
+ "codex",
11
+ "opencode",
12
+ "pi"
13
+ ],
14
+ "pi_registered": true
15
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "schema": "gentle-pi.provider-contract-roles-baseline/v1",
3
+ "contract_semver": "1.1.0",
4
+ "roles": [
5
+ {
6
+ "id": "lens",
7
+ "request_schema_id": "gentle-ai.review-lens-context/v1",
8
+ "result_schema_id": "https://gentle-ai.dev/schema/review/reviewer/v1",
9
+ "required_capabilities": [
10
+ "gentle-ai.provider-transport/v1"
11
+ ],
12
+ "schema_path": "schemas/lens.schema.json",
13
+ "schema_sha256": "ffef79cfb763333282285ff5c795a32b5a88d840b4a8d125ce012188b04cffe1",
14
+ "vector_path": "vectors/lens.json",
15
+ "vector_sha256": "7ef0b08404645eeb5dba92aba5f8e4780667b6ec775f43ed8547ff9f2a7148c8"
16
+ },
17
+ {
18
+ "id": "refuter",
19
+ "request_schema_id": "gentle-ai.review-provider-refuter-request/v1",
20
+ "result_schema_id": "https://gentle-ai.dev/schema/review/refuter/v1",
21
+ "required_capabilities": [
22
+ "gentle-ai.provider-transport/v1"
23
+ ],
24
+ "schema_path": "schemas/refuter.schema.json",
25
+ "schema_sha256": "36f8267c6c3f04600b8f1cb77df70d90858611af822cc81922efd6b3502fb646",
26
+ "vector_path": "vectors/refuter.json",
27
+ "vector_sha256": "f42d71906e49c4191660b2da7e70f01f1778b23d32089005bd2d7ae9cbb73039"
28
+ },
29
+ {
30
+ "id": "targeted-validator",
31
+ "request_schema_id": "gentle-ai.review-targeted-validation-request/v1",
32
+ "result_schema_id": "https://gentle-ai.dev/schema/review/validator/v1",
33
+ "required_capabilities": [
34
+ "gentle-ai.provider-transport/v1"
35
+ ],
36
+ "schema_path": "schemas/targeted-validator.schema.json",
37
+ "schema_sha256": "58f5efca0fb8089a51e998d5cf07209528a6b6e3782246b34ee1e825132063a8",
38
+ "vector_path": "vectors/targeted-validator.json",
39
+ "vector_sha256": "7b5a5165e3a913863fb98d2ba5387811860c21333b5c37e6ed3b4e0d121cf2fa"
40
+ }
41
+ ]
42
+ }
@@ -8,7 +8,7 @@ U8 closed the U1-U7 slimming work. Issue [#191](https://github.com/Gentleman-Pro
8
8
 
9
9
  | Surface | Owner after #191 |
10
10
  | --- | --- |
11
- | Ordinary START, FINALIZE, target status, validation, SDD binding, recovery, and reconciliation | Package-local Gentle AI v2.2.1 through `gentle-ai.review-integration/v1` (migrating to `/v2`, see below) |
11
+ | Ordinary START, FINALIZE, target status, validation, SDD binding, recovery, and reconciliation | Package-local Gentle AI v2.4.0 through `gentle-ai.review-integration/v2` (migration complete, see below) |
12
12
  | Canonical consumer identities | Permanent Pi module `lib/review-canonical.ts` |
13
13
  | Git common-directory and repository identity | Permanent Pi module `lib/review-repository.ts` |
14
14
  | Immutable reviewer candidate views | Permanent Pi module `lib/review-candidate-view.ts` |
@@ -21,7 +21,7 @@ Pi no longer owns an ordinary compact store, compact gate, compatibility facade,
21
21
 
22
22
  ## Naming note: "compact-v2" is not contract v2
23
23
 
24
- This document and `gentle_review`'s recovery/maintenance commands use "compact-v2" to name Pi's own internal review-authority storage generation (`lib/review-compact.ts`, `lib/review-compact-contract.ts`), predating and unrelated to gentle-ai's negotiated protocol contract `gentle-ai.review-integration/v2`. The two share a digit and nothing else: "compact-v2" is Pi-internal authority-state vocabulary; `review-integration/v2` is gentle-ai's wire contract replacing the Base64 `candidate_diff` transport with immutable `base_tree`/`candidate_tree` and an ordered `changed_path_manifest`. Do not conflate them when reading the maintenance-boundary section below.
24
+ This document and `gentle_review`'s recovery/maintenance commands use "compact-v2" to name Pi's own internal review-authority storage generation (historically `lib/review-compact.ts`, now only the reduced `lib/review-compact-contract.ts` after gentle-pi#311 P5), predating and unrelated to gentle-ai's negotiated protocol contract `gentle-ai.review-integration/v2`. The two share a digit and nothing else: "compact-v2" is Pi-internal authority-state vocabulary; `review-integration/v2` is gentle-ai's wire contract replacing the Base64 `candidate_diff` transport with immutable `base_tree`/`candidate_tree` and an ordered `changed_path_manifest`. Do not conflate them when reading the maintenance-boundary section below.
25
25
 
26
26
  ## Contract migration status: `review-integration/v1` → `/v2` (complete)
27
27
 
@@ -88,15 +88,15 @@ U1-U8 retire nine review modules present on `origin/main`:
88
88
  | U1-U4 | `review-bundle`, `review-checkpoint`, `review-graph-reducer`, `review-mirror`, `review-reset` |
89
89
  | U5-U8 | `review-authority-supersession`, `review-compact-gate`, `review-compact-store`, `review-facade` |
90
90
 
91
- U8 found no additional zero-consumer code module. Remaining graph, ordinary-policy, compact-contract, runtime-contract, snapshot, trigger, risk, and refuter modules retain production, contract, or semantic-replay consumers.
91
+ U8 found no additional zero-consumer code module at the time. gentle-pi#311 P5 later retired the Pi-owned review semantics that had kept several of those modules alive: `review-compact`, `review-refuter-adapter`, and `review-runtime-contract` are deleted (adversarial roles now execute through Go-owned pi processes via provider-rendered self-contained vectors, and FINALIZE follows the provider's negotiated captured-results transition). The reduced `review-compact-contract` keeps only the negotiated collection answers (correction forecast, targeted validation document, final evidence); graph, ordinary-policy, snapshot, trigger, and risk modules retain production, contract, or semantic-replay consumers.
92
92
 
93
93
  The packaged `contracts/review-integration/v1/` schemas and fixtures plus `docs/review-integration.md` are byte-identical provider artifacts for negotiated contract `review-integration/v1`, not dead Pi compatibility documentation; the newer `contracts/review-integration/v2/` schemas and fixtures are a second byte-identical mirror, for contract `review-integration/v2`, whose schemas `$ref` into the `/v1` fragments — which is why the `/v1` directory stays packaged even after Pi migrates its active decoder. Package verification proves both directories' hashes.
94
94
 
95
95
  ## Published Maintenance Boundary
96
96
 
97
- Gentle AI has exposed explicit, audited maintenance commands outside negotiated ordinary review since v2.1.11; the currently pinned v2.2.1 keeps them available under the same legacy version table. Pi invokes `review abandon`, `review quarantine-legacy`, and `review reconcile-authority` only after fresh interactive approval of exact LF-only authorization text; headless execution and absent, malformed, or stale bindings fail closed.
97
+ Gentle AI has exposed explicit, audited maintenance commands outside negotiated ordinary review since v2.1.11; the currently pinned v2.4.0 keeps them available under the same legacy version table. Pi invokes `review abandon`, `review quarantine-legacy`, and `review reconcile-authority` only after fresh interactive approval of exact LF-only authorization text; headless execution and absent, malformed, or stale bindings fail closed.
98
98
 
99
- `abandon` is restricted by native re-derivation to a caller-named pristine compact-v2 reviewing or invalidated lineage. `quarantine-legacy` accepts only the published malformed freeze-findings diagnostic and disposition. Reconciliation accepts the exact dual anomaly suffix `anomalies=unchanged_target,malformed_recovery_authorization` only in that order. `repair-legacy-alias` derives repository, revision, diagnostic, and disposition from freshly read native inventory before its own approval and can only quarantine one qualified historical alias chain. `review dispose-result` remains unexposed pending design. Recovery routes only the provider-selected negotiated `action_disposition`.
99
+ `abandon` is restricted by native re-derivation to a caller-named non-terminal compact-v2 lineage; its `gentle-ai.review-abandon-authorization/v2` binding additionally names the exact discarded work (captured lens results, findings presence, evidence-record presence) that the native gate re-derives before accepting. `quarantine-legacy` accepts only the published malformed freeze-findings diagnostic and disposition. Reconciliation accepts the exact dual anomaly suffix `anomalies=unchanged_target,malformed_recovery_authorization` only in that order. `repair-legacy-alias` derives repository, revision, diagnostic, and disposition from freshly read native inventory before its own approval and can only quarantine one qualified historical alias chain. `review dispose-result` remains unexposed pending design. Recovery routes only the provider-selected negotiated `action_disposition`.
100
100
 
101
101
  ## Windows Evidence
102
102