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.
- package/README.md +70 -12
- package/assets/agents/gentle-ai-worker.md +7 -3
- package/assets/agents/jd-fix-agent.md +1 -1
- package/assets/agents/jd-judge-a.md +3 -1
- package/assets/agents/jd-judge-b.md +3 -1
- package/assets/agents/review-readability.md +4 -1
- package/assets/agents/review-reliability.md +4 -1
- package/assets/agents/review-resilience.md +4 -1
- package/assets/agents/review-risk.md +4 -1
- package/assets/agents/sdd-apply.md +6 -1
- package/assets/agents/sdd-archive.md +6 -1
- package/assets/agents/sdd-design.md +6 -1
- package/assets/agents/sdd-explore.md +6 -2
- package/assets/agents/sdd-init.md +10 -2
- package/assets/agents/sdd-onboard.md +6 -1
- package/assets/agents/sdd-proposal.md +6 -1
- package/assets/agents/sdd-spec.md +6 -1
- package/assets/agents/sdd-status.md +6 -1
- package/assets/agents/sdd-sync.md +6 -1
- package/assets/agents/sdd-tasks.md +6 -1
- package/assets/agents/sdd-verify.md +6 -1
- package/assets/chains/4r-review.chain.md +2 -0
- package/assets/chains/sdd-full.chain.md +1 -1
- package/assets/chains/sdd-plan.chain.md +1 -1
- package/assets/chains/sdd-verify.chain.md +1 -1
- package/assets/orchestrator-delegation.md +246 -67
- package/assets/orchestrator.md +7 -14
- package/assets/sdd-orchestrator-workflow.md +154 -9
- package/assets/support/sdd-status-contract.md +19 -1
- package/contracts/review-integration/v1/fixtures/consent.fixture.json +3 -3
- package/contracts/review-integration/v1/fixtures/start-v2.fixture.json +19 -28
- package/contracts/review-integration/v1/fixtures/start.fixture.json +1 -10
- package/contracts/review-integration/v1/fixtures/status-v2.fixture.json +12 -21
- package/contracts/review-integration/v1/schemas/correction-plan-request.schema.json +49 -0
- package/contracts/review-integration/v1/schemas/operation.schema.json +76 -0
- package/contracts/review-integration/v1/schemas/repair.schema.json +39 -0
- package/contracts/review-integration/v1/schemas/status-v2.schema.json +4 -2
- package/contracts/review-integration/v1/schemas/status.schema.json +4 -2
- package/contracts/review-integration/v2/fixtures/consent.fixture.json +1 -1
- package/contracts/review-integration/v2/fixtures/start.fixture.json +1 -10
- package/contracts/review-integration/v2/fixtures/status.fixture.json +1 -10
- package/contracts/review-integration/v2/schemas/failure.schema.json +5 -1
- package/contracts/review-integration/v2/schemas/operation.schema.json +6 -1
- package/contracts/review-integration/v2/schemas/repair.schema.json +4 -2
- package/contracts/review-integration/v2/schemas/start.schema.json +5 -2
- package/contracts/review-integration/v2/schemas/status.schema.json +4 -2
- package/contracts/review-provider-contract-mirror/provider-contract.lock.json +30 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/bundle/README.md +12 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/bundle/manifest.json +65 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/bundle/schemas/lens.schema.json +16 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/bundle/schemas/refuter.schema.json +1 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/bundle/schemas/targeted-validator.schema.json +1 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/bundle/vectors/lens.json +1 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/bundle/vectors/refuter.json +1 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/bundle/vectors/targeted-validator.json +1 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/generated/provider-capabilities.baseline.json +15 -0
- package/contracts/review-provider-contract-mirror/v1.1.0/generated/provider-roles.baseline.json +42 -0
- package/docs/native-authority-architecture.md +5 -5
- package/docs/review-integration.md +22 -2
- package/extensions/gentle-ai.ts +1595 -201
- package/extensions/sdd-init.ts +19 -6
- package/extensions/skill-registry.ts +10 -2
- package/extensions/startup-banner.ts +10 -4
- package/lib/gentle-ai-binary.ts +173 -2
- package/lib/git-commit-transaction.ts +77 -17
- package/lib/native-review-cli.ts +528 -65
- package/lib/provider-contract-bundle.ts +704 -0
- package/lib/review-candidate-view.ts +527 -18
- package/lib/review-compact-contract.ts +59 -248
- package/lib/review-host-relay.ts +436 -0
- package/lib/review-integration-v2.ts +537 -36
- package/lib/review-relay-contract.ts +16 -0
- package/lib/sdd-preflight.ts +53 -1
- package/package.json +5 -2
- package/runtime/gentle-ai-binary.mjs +173 -2
- package/runtime/git-commit-transaction.mjs +75 -15
- package/runtime/native-review-cli.mjs +524 -61
- package/runtime/review-integration-v2.mjs +536 -35
- package/runtime/review-relay-contract.mjs +17 -0
- package/scripts/build-git-commit-transaction-runner.mjs +1 -0
- package/scripts/check-provider-contract.mjs +138 -0
- package/scripts/gentle-ai-installer.mjs +23 -13
- package/scripts/maintainer/provider-relay-matrix.mjs +219 -0
- package/scripts/mirror-provider-contract.mjs +143 -0
- package/scripts/test-packed-runner.mjs +16 -2
- package/scripts/verify-package-files.mjs +110 -33
- package/skills/_shared/review-ledger-contract.md +4 -6
- package/skills/gentle-ai/SKILL.md +4 -4
- package/skills/issue-creation/SKILL.md +94 -168
- package/skills/judgment-day/SKILL.md +7 -1
- package/skills/judgment-day/references/prompts-and-formats.md +2 -0
- package/skills/rdd-defect-workflow/SKILL.md +54 -0
- package/tests/background-subagents.test.ts +771 -0
- package/tests/crosslane/cross-lane.mjs +1169 -0
- package/tests/delegated-key-learnings-contract.test.ts +238 -0
- package/tests/fixtures/devbinary/capabilities-v2.1.derived.json +331 -0
- package/tests/fixtures/devbinary/capabilities-v2.2.captured.json +340 -0
- package/tests/fixtures/devbinary/consent-v3.captured.json +37 -0
- package/tests/fixtures/devbinary/failure-v2-capture-evidence.captured.json +16 -0
- package/tests/fixtures/devbinary/result-artifact-v2-path.captured.json +12 -0
- package/tests/fixtures/devbinary/result-artifact-v2.captured.json +12 -0
- package/tests/fixtures/devbinary/start-v3-consent-declined.captured.json +19 -0
- package/tests/fixtures/devbinary/start-v3-consent-granted.captured.json +109 -0
- package/tests/fixtures/devbinary/status-v5-capture-result-submission.captured.json +184 -0
- package/tests/fixtures/devbinary/status-v5-repository-context.captured.json +138 -0
- package/tests/fixtures/devbinary/status-v5.captured.json +88 -0
- package/tests/fixtures/provider-contract-bundle/v1.1.0/README.md +12 -0
- package/tests/fixtures/provider-contract-bundle/v1.1.0/manifest.json +65 -0
- package/tests/fixtures/provider-contract-bundle/v1.1.0/schemas/lens.schema.json +16 -0
- package/tests/fixtures/provider-contract-bundle/v1.1.0/schemas/refuter.schema.json +1 -0
- package/tests/fixtures/provider-contract-bundle/v1.1.0/schemas/targeted-validator.schema.json +1 -0
- package/tests/fixtures/provider-contract-bundle/v1.1.0/vectors/lens.json +1 -0
- package/tests/fixtures/provider-contract-bundle/v1.1.0/vectors/refuter.json +1 -0
- package/tests/fixtures/provider-contract-bundle/v1.1.0/vectors/targeted-validator.json +1 -0
- package/tests/gentle-ai-binary.test.ts +1 -1
- package/tests/gentle-ai-dev-binary-surfacing.test.ts +195 -0
- package/tests/gentle-ai-dev-binary.test.ts +336 -0
- package/tests/gentle-ai-installer.test.ts +46 -46
- package/tests/git-commit-transaction.test.ts +229 -1
- package/tests/maintainer/provider-relay.maintest.ts +265 -0
- package/tests/native-review-capability-contract.test.ts +48 -2
- package/tests/native-review-cli.test.ts +56 -0
- package/tests/native-review-consent.test.ts +164 -3
- package/tests/native-review-parity-runtime.test.ts +37 -0
- package/tests/native-review-parity.test.ts +218 -15
- package/tests/native-sdd-attempt-authority.test.ts +235 -0
- package/tests/orchestrator-budget.test.ts +30 -5
- package/tests/package-manifest.test.ts +98 -72
- package/tests/provider-contract-bundle.test.ts +385 -0
- package/tests/provider-contract-mirror.test.ts +206 -0
- package/tests/provider-defect-handoff.test.ts +355 -0
- package/tests/review-actor-tool-deny.test.ts +12 -13
- package/tests/review-candidate-view.test.ts +489 -9
- package/tests/review-compact-contract.test.ts +52 -119
- package/tests/review-controller-native-recovery.test.ts +643 -47
- package/tests/review-controller-native-routing.test.ts +1667 -222
- package/tests/review-controller-workspace-root.test.ts +17 -2
- package/tests/review-corrected-finalize-binding.test.ts +175 -0
- package/tests/review-dispatch-hydration-gap.test.ts +197 -0
- package/tests/review-host-relay-routing.test.ts +317 -0
- package/tests/review-host-relay.test.ts +520 -0
- package/tests/review-integration-v2-forward.test.ts +631 -0
- package/tests/review-integration-v2.test.ts +114 -0
- package/tests/review-ledger-contract.test.ts +12 -28
- package/tests/review-recovered-lineage-routing.test.ts +246 -0
- package/tests/review-relay-transport-agent.test.ts +249 -0
- package/tests/runtime-harness.mjs +242 -14
- package/tests/sdd-agent-tools.test.ts +18 -33
- package/tests/skill-collision-prefixes.test.ts +1 -0
- package/tests/skill-registry.test.ts +50 -1
- package/tests/verify-package-files.test.ts +62 -0
- package/assets/agents/review-refuter.md +0 -40
- package/assets/agents/review-validator.md +0 -23
- package/lib/native-review-remediation.ts +0 -49
- package/lib/review-compact.ts +0 -947
- package/lib/review-refuter-adapter.ts +0 -129
- package/lib/review-runtime-contract.ts +0 -68
- package/prompts/gcl.md +0 -54
- package/prompts/gis.md +0 -25
- package/prompts/gpr.md +0 -41
- package/prompts/gwr.md +0 -31
- package/tests/fixtures/native-review-cli/v2.1.2/bind-sdd.json +0 -25
- package/tests/fixtures/native-review-cli/v2.1.2/finalize.json +0 -8
- package/tests/fixtures/native-review-cli/v2.1.2/sdd-status-engram.json +0 -139
- package/tests/fixtures/native-review-cli/v2.1.2/sdd-status.json +0 -200
- package/tests/fixtures/native-review-cli/v2.1.2/start.json +0 -12
- package/tests/fixtures/native-review-cli/v2.1.2/validate-allow.json +0 -24
- package/tests/fixtures/native-review-cli/v2.1.2/validate-deny-empty-context.json +0 -20
- package/tests/fixtures/native-review-cli/v2.1.2/validate-deny.json +0 -28
- package/tests/review-compact.test.ts +0 -243
- package/tests/review-refuter-adapter.test.ts +0 -89
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
import { execFileSync } from "node:child_process";
|
|
4
|
+
import { createHash } from "node:crypto";
|
|
4
5
|
import { existsSync, mkdtempSync, mkdirSync, readFileSync, readdirSync, realpathSync, rmSync, writeFileSync } from "node:fs";
|
|
5
6
|
import { tmpdir } from "node:os";
|
|
6
7
|
import { basename, dirname, join } from "node:path";
|
|
7
|
-
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
8
9
|
|
|
9
10
|
const root = fileURLToPath(new URL("..", import.meta.url));
|
|
10
11
|
const temporary = mkdtempSync(join(tmpdir(), "gentle-pi-packed-runner-"));
|
|
@@ -58,7 +59,20 @@ try {
|
|
|
58
59
|
if (versions.length !== 1) throw new Error("packed install did not contain exactly one package-local Gentle AI version");
|
|
59
60
|
const executable = join(packageRoot, ".gentle-ai", versions[0].name, process.platform === "win32" ? "gentle-ai.exe" : "gentle-ai");
|
|
60
61
|
const capabilities = JSON.parse(execFileSync(executable, ["review", "capabilities", "--contract", "gentle-ai.review-integration/v2"], { cwd: installDirectory, encoding: "utf8" }));
|
|
61
|
-
|
|
62
|
+
// Decode with the PACKED consumer's own decoder rather than comparing the
|
|
63
|
+
// schema string against a list hand-copied into this script. The copy was a
|
|
64
|
+
// second, silent pin: it accepted only `capabilities/v2`, so the moment the
|
|
65
|
+
// pinned provider advertised an additive minor this E2E rejected a pairing
|
|
66
|
+
// that gentle-pi reads correctly, and it would have done so again on the
|
|
67
|
+
// next minor. Using the shipped decoder makes the assertion what it always
|
|
68
|
+
// meant to be — the packed consumer can read the packed provider — and it
|
|
69
|
+
// checks the whole envelope (protocol major/minor, required operations,
|
|
70
|
+
// gates, projections, advertised schemas, mandatory features, and the
|
|
71
|
+
// self-reported executable digest) instead of one string.
|
|
72
|
+
const { decodeReviewCapabilitiesV2 } = await import(pathToFileURL(join(packageRoot, "runtime", "review-integration-v2.mjs")).href);
|
|
73
|
+
const executableDigest = `sha256:${createHash("sha256").update(readFileSync(executable)).digest("hex")}`;
|
|
74
|
+
const decoded = decodeReviewCapabilitiesV2(capabilities, executableDigest);
|
|
75
|
+
if (decoded.contract !== "gentle-ai.review-integration/v2" || decoded.packageVersion !== versions[0].name.slice(1)) throw new Error("package-local Gentle AI returned incompatible capabilities");
|
|
62
76
|
const packageManifest = JSON.parse(readFileSync(join(packageRoot, "package.json"), "utf8"));
|
|
63
77
|
process.stdout.write(`packed runner E2E passed (gentle-pi ${packageManifest.version ?? "unknown"}; Gentle AI ${capabilities.package?.version ?? "unknown"}; ${result.states.length} states)\n`);
|
|
64
78
|
} finally {
|
|
@@ -12,6 +12,17 @@ const requiredPaths = [
|
|
|
12
12
|
"assets/orchestrator-delegation.md",
|
|
13
13
|
"assets/orchestrator-memory.md",
|
|
14
14
|
"assets/orchestrator-skills.md",
|
|
15
|
+
"assets/sdd-orchestrator-workflow.md",
|
|
16
|
+
"assets/agents/gentle-ai-explore.md",
|
|
17
|
+
"assets/agents/gentle-ai-verify.md",
|
|
18
|
+
"assets/agents/gentle-ai-worker.md",
|
|
19
|
+
"assets/agents/jd-fix-agent.md",
|
|
20
|
+
"assets/agents/jd-judge-a.md",
|
|
21
|
+
"assets/agents/jd-judge-b.md",
|
|
22
|
+
"assets/agents/review-readability.md",
|
|
23
|
+
"assets/agents/review-reliability.md",
|
|
24
|
+
"assets/agents/review-resilience.md",
|
|
25
|
+
"assets/agents/review-risk.md",
|
|
15
26
|
"assets/agents/sdd-apply.md",
|
|
16
27
|
"assets/agents/sdd-archive.md",
|
|
17
28
|
"assets/agents/sdd-design.md",
|
|
@@ -24,8 +35,7 @@ const requiredPaths = [
|
|
|
24
35
|
"assets/agents/sdd-sync.md",
|
|
25
36
|
"assets/agents/sdd-tasks.md",
|
|
26
37
|
"assets/agents/sdd-verify.md",
|
|
27
|
-
"assets/
|
|
28
|
-
"assets/agents/review-validator.md",
|
|
38
|
+
"assets/chains/4r-review.chain.md",
|
|
29
39
|
"assets/chains/sdd-full.chain.md",
|
|
30
40
|
"assets/chains/sdd-plan.chain.md",
|
|
31
41
|
"assets/chains/sdd-verify.chain.md",
|
|
@@ -35,6 +45,7 @@ const requiredPaths = [
|
|
|
35
45
|
"assets/support/sdd-status-contract.md",
|
|
36
46
|
"assets/support/strict-tdd.md",
|
|
37
47
|
"assets/support/strict-tdd-verify.md",
|
|
48
|
+
"docs/native-authority-architecture.md",
|
|
38
49
|
"docs/skill-style-guide.md",
|
|
39
50
|
"docs/review-integration.md",
|
|
40
51
|
"extensions/gentle-ai.ts",
|
|
@@ -43,22 +54,46 @@ const requiredPaths = [
|
|
|
43
54
|
"lib/gentle-ai-binary.ts",
|
|
44
55
|
"lib/git-commit-transaction.ts",
|
|
45
56
|
"lib/native-review-cli.ts",
|
|
57
|
+
"lib/provider-contract-bundle.ts",
|
|
58
|
+
"lib/review-host-relay.ts",
|
|
46
59
|
"lib/review-integration-v2.ts",
|
|
60
|
+
"lib/review-relay-contract.ts",
|
|
47
61
|
"lib/sdd-preflight.ts",
|
|
48
62
|
"runtime/gentle-ai-binary.mjs",
|
|
49
63
|
"runtime/git-commit-transaction.mjs",
|
|
50
64
|
"runtime/native-review-cli.mjs",
|
|
51
65
|
"runtime/review-integration-v2.mjs",
|
|
66
|
+
"runtime/review-relay-contract.mjs",
|
|
52
67
|
"scripts/build-git-commit-transaction-runner.mjs",
|
|
68
|
+
"scripts/check-provider-contract.mjs",
|
|
53
69
|
"scripts/gentle-ai-installer.mjs",
|
|
54
70
|
"scripts/install-gentle-ai.mjs",
|
|
71
|
+
"scripts/mirror-provider-contract.mjs",
|
|
55
72
|
"scripts/run-git-commit-transaction.mjs",
|
|
56
73
|
"scripts/test-packed-runner.mjs",
|
|
57
74
|
"tests/fixtures/native-review-cli/v2.1.3/start.json",
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
75
|
+
"tests/fixtures/provider-contract-bundle/v1.1.0/README.md",
|
|
76
|
+
"tests/fixtures/provider-contract-bundle/v1.1.0/manifest.json",
|
|
77
|
+
"tests/fixtures/provider-contract-bundle/v1.1.0/schemas/lens.schema.json",
|
|
78
|
+
"tests/fixtures/provider-contract-bundle/v1.1.0/schemas/refuter.schema.json",
|
|
79
|
+
"tests/fixtures/provider-contract-bundle/v1.1.0/schemas/targeted-validator.schema.json",
|
|
80
|
+
"tests/fixtures/provider-contract-bundle/v1.1.0/vectors/lens.json",
|
|
81
|
+
"tests/fixtures/provider-contract-bundle/v1.1.0/vectors/refuter.json",
|
|
82
|
+
"tests/fixtures/provider-contract-bundle/v1.1.0/vectors/targeted-validator.json",
|
|
83
|
+
// Provider contract mirror (gentle-pi#311 P1/P2). Presence is enforced here;
|
|
84
|
+
// exact bytes are pinned by the lock-driven scripts/check-provider-contract.mjs
|
|
85
|
+
// drift check, which runs in the same pnpm test flow.
|
|
86
|
+
"contracts/review-provider-contract-mirror/provider-contract.lock.json",
|
|
87
|
+
"contracts/review-provider-contract-mirror/v1.1.0/bundle/README.md",
|
|
88
|
+
"contracts/review-provider-contract-mirror/v1.1.0/bundle/manifest.json",
|
|
89
|
+
"contracts/review-provider-contract-mirror/v1.1.0/bundle/schemas/lens.schema.json",
|
|
90
|
+
"contracts/review-provider-contract-mirror/v1.1.0/bundle/schemas/refuter.schema.json",
|
|
91
|
+
"contracts/review-provider-contract-mirror/v1.1.0/bundle/schemas/targeted-validator.schema.json",
|
|
92
|
+
"contracts/review-provider-contract-mirror/v1.1.0/bundle/vectors/lens.json",
|
|
93
|
+
"contracts/review-provider-contract-mirror/v1.1.0/bundle/vectors/refuter.json",
|
|
94
|
+
"contracts/review-provider-contract-mirror/v1.1.0/bundle/vectors/targeted-validator.json",
|
|
95
|
+
"contracts/review-provider-contract-mirror/v1.1.0/generated/provider-capabilities.baseline.json",
|
|
96
|
+
"contracts/review-provider-contract-mirror/v1.1.0/generated/provider-roles.baseline.json",
|
|
62
97
|
"prompts/skill-creation.md",
|
|
63
98
|
"skills/_shared/review-ledger-contract.md",
|
|
64
99
|
"skills/branch-pr/SKILL.md",
|
|
@@ -68,6 +103,7 @@ const requiredPaths = [
|
|
|
68
103
|
"skills/gentle-ai/SKILL.md",
|
|
69
104
|
"skills/issue-creation/SKILL.md",
|
|
70
105
|
"skills/judgment-day/SKILL.md",
|
|
106
|
+
"skills/rdd-defect-workflow/SKILL.md",
|
|
71
107
|
"skills/release/SKILL.md",
|
|
72
108
|
"skills/skill-creator/SKILL.md",
|
|
73
109
|
"skills/skill-improver/SKILL.md",
|
|
@@ -83,13 +119,13 @@ const contractHashes = {
|
|
|
83
119
|
"contracts/review-integration/v1/fixtures/capabilities-v1.4.fixture.json": "84e0db457b76b97b35c2be772dfc647f9eab66810ea98f64fed85645c3c266ba",
|
|
84
120
|
"contracts/review-integration/v1/fixtures/capabilities-v1.5.fixture.json": "0cc952af3767c393bde9e4785e4071615a529fd672bc94da4fcc204780524a27",
|
|
85
121
|
"contracts/review-integration/v1/fixtures/capabilities.fixture.json": "b3ca822189a236f2d891628c665ca23e308bf5185a1701e1f07231bd970461bb",
|
|
86
|
-
"contracts/review-integration/v1/fixtures/consent.fixture.json": "
|
|
122
|
+
"contracts/review-integration/v1/fixtures/consent.fixture.json": "28c7c86b55f8c9dbae3a1baa8fe298c4f3a14664aba21cd4051c7f579a61a4e9",
|
|
87
123
|
"contracts/review-integration/v1/fixtures/failure.fixture.json": "e72b6ab5e3c529abac47bd324444f84ca90f67ef0a67189f5fd8d24d199a2759",
|
|
88
124
|
"contracts/review-integration/v1/fixtures/final-verification-incident.fixture.json": "f8bc06549e62b0bee5cf2ecde625e18da178dd18c9d3023b7d7e8fd0ebbba646",
|
|
89
125
|
"contracts/review-integration/v1/fixtures/operation.fixture.json": "3547748a4df57382178064abbdb1cf12f1d58a75c0e9d6452fdd9beb3aaeac3a",
|
|
90
126
|
"contracts/review-integration/v1/fixtures/repair-preflight.fixture.json": "7168cb53ad470066d0b3edc3b7911d1aebff91abd41ecc3d822f8ffa5cea6cb1",
|
|
91
|
-
"contracts/review-integration/v1/fixtures/start-v2.fixture.json": "
|
|
92
|
-
"contracts/review-integration/v1/fixtures/start.fixture.json": "
|
|
127
|
+
"contracts/review-integration/v1/fixtures/start-v2.fixture.json": "2699660832c0d944184d5d314f08774ab9a02f5b8a7a4c2a07983440e0e346ad",
|
|
128
|
+
"contracts/review-integration/v1/fixtures/start.fixture.json": "3b963b221cd1560eb8872cbabbb5407096f593ced2f13eb9cb06eb61e4cca4d1",
|
|
93
129
|
"contracts/review-integration/v1/fixtures/status-ambiguous.fixture.json": "ee695fd58ba72adfb3b51dfd16432a177498173a45bfcb594d6bdc53bfa32e6e",
|
|
94
130
|
"contracts/review-integration/v1/fixtures/status-corrupted.fixture.json": "4cfc0048c28a39cec8a32fecfaad66e56e5c1248263ceb4ce66b6717981880b2",
|
|
95
131
|
"contracts/review-integration/v1/fixtures/status-recover.fixture.json": "714f762f72380ce93d567626cafbaa536ab3aae02af73d3d40ca123f1f30d8b0",
|
|
@@ -100,7 +136,7 @@ const contractHashes = {
|
|
|
100
136
|
"contracts/review-integration/v1/fixtures/status-v2-recover.fixture.json": "178331fc7177d2316fd4f56610ac295f7da2780be96b233b72935d5f476610f2",
|
|
101
137
|
"contracts/review-integration/v1/fixtures/status-v2-repair.fixture.json": "89083cad752fca38da09e919825d0b80641a8a029364ba1869e5b58ef2e59a1d",
|
|
102
138
|
"contracts/review-integration/v1/fixtures/status-v2-unrelated.fixture.json": "c178b338dcd5d30888acef37a9d752bd0932d6dedfffb61b0596a9cceabeb692",
|
|
103
|
-
"contracts/review-integration/v1/fixtures/status-v2.fixture.json": "
|
|
139
|
+
"contracts/review-integration/v1/fixtures/status-v2.fixture.json": "33c5032dcd5d916b4bff73781495640da83893b2f2b334465cbb40c18e1b85f4",
|
|
104
140
|
"contracts/review-integration/v1/fixtures/status.fixture.json": "555054d8046a896162995dcb117752f9cd1ef903fb9ebaad29af1b7e7f319bb3",
|
|
105
141
|
"contracts/review-integration/v1/fixtures/verification-evidence.fixture.json": "b30e3863548845b90e256d92193435d02da458bf8f15a4c33d023cd1f6894a5f",
|
|
106
142
|
"contracts/review-integration/v1/schemas/admitted-result.schema.json": "7796e8dbba331434594108c902dfab7ec46f691fa447a9259a78f2448111b0de",
|
|
@@ -113,33 +149,34 @@ const contractHashes = {
|
|
|
113
149
|
"contracts/review-integration/v1/schemas/capabilities-v1.5.schema.json": "abc783821524dcc33339495284805a85f79b3352efb7358c95016ed164bd7f24",
|
|
114
150
|
"contracts/review-integration/v1/schemas/capabilities.schema.json": "ad333177494a251beac153f74bd751fa77126a9968aad69e64fc2abf15cff0f7",
|
|
115
151
|
"contracts/review-integration/v1/schemas/consent.schema.json": "f8f2edec17568124488482c2aee399909111fe0cce2cba426fb29efd2c7c1cd0",
|
|
152
|
+
"contracts/review-integration/v1/schemas/correction-plan-request.schema.json": "77bf357afc9bee288d64ce64e87b4e13347b1d0ed5e824a9cea6dc0621b40ed1",
|
|
116
153
|
"contracts/review-integration/v1/schemas/failure.schema.json": "0ce29f61408fc21d72640fffdb215a608a820c29f3e5ff62d9cc295ed0451937",
|
|
117
154
|
"contracts/review-integration/v1/schemas/final-verification-incident.schema.json": "39b1ec178b1d3bc8da9a3d92dadd8092385000f2a6930b5bfcb4a84dbc6493ca",
|
|
118
|
-
"contracts/review-integration/v1/schemas/operation.schema.json": "
|
|
155
|
+
"contracts/review-integration/v1/schemas/operation.schema.json": "495d66c6cdb6b2b634bc580b80125073d802226186db9f000456e111315ac0da",
|
|
119
156
|
"contracts/review-integration/v1/schemas/projection.schema.json": "7168a3eba929dde2b8f0b7723ee51d5a5421102bdeefe892578c263debd08db2",
|
|
120
|
-
"contracts/review-integration/v1/schemas/repair.schema.json": "
|
|
157
|
+
"contracts/review-integration/v1/schemas/repair.schema.json": "2939a9f6e68e5b6964db541d7b1a75054113c75a6f836a158ce0f37e1c4ebe32",
|
|
121
158
|
"contracts/review-integration/v1/schemas/result-artifact-v2.schema.json": "38895aae2f6ca4980b1a8e157fee8503920820d5f6be3c757c0fa04e8430cd6b",
|
|
122
159
|
"contracts/review-integration/v1/schemas/result-artifact.schema.json": "91296bd2c261fd2fe03bffd63efe58badd4927e0d0d8480cd4213f651ecacdf6",
|
|
123
160
|
"contracts/review-integration/v1/schemas/start-v2.schema.json": "ec8550cd93bbe84af1ce87dfd7abfa9e24692f42b20f8f0bf9cac1d4b88ea46c",
|
|
124
161
|
"contracts/review-integration/v1/schemas/start.schema.json": "4296aebbd4128ce51945a2f6d3228aa77ac7215c802978d559bff5279ec56229",
|
|
125
|
-
"contracts/review-integration/v1/schemas/status-v2.schema.json": "
|
|
126
|
-
"contracts/review-integration/v1/schemas/status.schema.json": "
|
|
162
|
+
"contracts/review-integration/v1/schemas/status-v2.schema.json": "dd9914b647a1d9edc4ecdcbed4f0c800b39ec290912d5c2a4cc6ba3098d5f21e",
|
|
163
|
+
"contracts/review-integration/v1/schemas/status.schema.json": "250d2c646b8822b38eaefafd2bfdefa1134cc23a00e553a7201f33257573149a",
|
|
127
164
|
"contracts/review-integration/v1/schemas/targeted-validation-request.schema.json": "52b91154693b4dd66983fc91ecf7197503555f2c9e85cac626cffd3035c53d65",
|
|
128
165
|
"contracts/review-integration/v1/schemas/verification-evidence.schema.json": "fd15890bf2ef1db95d771ee7f468e9e64014351d7940f65604eb24f41e68a22f",
|
|
129
166
|
"contracts/review-integration/v2/fixtures/capabilities.fixture.json": "17c150d851c15b3f0c20d18c2e2741eb2232ffa24f35aa71d6d30e90a85e42b7",
|
|
130
|
-
"contracts/review-integration/v2/fixtures/consent.fixture.json": "
|
|
131
|
-
"contracts/review-integration/v2/fixtures/start.fixture.json": "
|
|
132
|
-
"contracts/review-integration/v2/fixtures/status.fixture.json": "
|
|
167
|
+
"contracts/review-integration/v2/fixtures/consent.fixture.json": "203cc96d5c29ba0f27b5c4db04c2e88566e0a923d3a0cdb317f78d9065349075",
|
|
168
|
+
"contracts/review-integration/v2/fixtures/start.fixture.json": "bd82bfb386c01809d8f1c5cb3a4b3b540f7cb23a55209505680daeb43b4e8642",
|
|
169
|
+
"contracts/review-integration/v2/fixtures/status.fixture.json": "4cd77906bacdca35d8f99773de147211d2b05fe34dd1b999011ead09e84be7a5",
|
|
133
170
|
"contracts/review-integration/v2/schemas/admitted-result.schema.json": "c6a9c880191d65c46d9cfc8a0812af16b636573a8f6e57ea34aa16d6f6bb9735",
|
|
134
171
|
"contracts/review-integration/v2/schemas/artifact-subject.schema.json": "3e71a81340ea6149b03afa71530d10ce654c415fa21d4e07f0c9c25b3d2d70a3",
|
|
135
172
|
"contracts/review-integration/v2/schemas/capabilities.schema.json": "7ab061ed27bd3b929d6033cc20f56097e851f4454ca14a815255748b50191248",
|
|
136
173
|
"contracts/review-integration/v2/schemas/consent.schema.json": "b2b4465338497f11927de91cb2e5da12b6cb4a1039afe05aebe1abbf53b21858",
|
|
137
|
-
"contracts/review-integration/v2/schemas/failure.schema.json": "
|
|
138
|
-
"contracts/review-integration/v2/schemas/operation.schema.json": "
|
|
139
|
-
"contracts/review-integration/v2/schemas/repair.schema.json": "
|
|
140
|
-
"contracts/review-integration/v2/schemas/start.schema.json": "
|
|
141
|
-
"contracts/review-integration/v2/schemas/status.schema.json": "
|
|
142
|
-
"docs/review-integration.md": "
|
|
174
|
+
"contracts/review-integration/v2/schemas/failure.schema.json": "a56a2f715c3138d6f2cee37257cd6e758a15d4e0b1215745951d85831d148967",
|
|
175
|
+
"contracts/review-integration/v2/schemas/operation.schema.json": "1c0128a0576064d4338ee0a1945e9d0d0569c1a7a2140217b2539af5d1a9ed1e",
|
|
176
|
+
"contracts/review-integration/v2/schemas/repair.schema.json": "98a85fd45a8ae7f6211ffeeb3f9c478fa1dd1c17f385751f15f2111e6c3ab167",
|
|
177
|
+
"contracts/review-integration/v2/schemas/start.schema.json": "2991e3fcca672d9257d61b6a336fb34e58b15a8e03f8a09a7adf892cae6a8085",
|
|
178
|
+
"contracts/review-integration/v2/schemas/status.schema.json": "c4dcc736cfc6300560a3c4262d2d982368529d5c49d58d499552a3b0beef9212",
|
|
179
|
+
"docs/review-integration.md": "189f9b128cafaf225d2b6be53111f893ca46eb687fb9e5e051a84727b6a34bbc",
|
|
143
180
|
};
|
|
144
181
|
|
|
145
182
|
requiredPaths.push(...Object.keys(contractHashes));
|
|
@@ -157,12 +194,19 @@ function listFilesRecursively(directory) {
|
|
|
157
194
|
// byte-pinned contract artifact but lives outside this walk root). Reports
|
|
158
195
|
// the two drift directions separately so a new unlisted file and a stale
|
|
159
196
|
// hash-map entry are both visible.
|
|
197
|
+
//
|
|
198
|
+
// `contracts/review-provider-contract-mirror/**` is deliberately excluded:
|
|
199
|
+
// that subtree has exactly one byte authority — the mirror's own lock record,
|
|
200
|
+
// enforced by scripts/check-provider-contract.mjs in the same pnpm test flow —
|
|
201
|
+
// so listing it here would create a second, drift-prone pin for the same bytes.
|
|
202
|
+
const PROVIDER_CONTRACT_MIRROR_PREFIX = "contracts/review-provider-contract-mirror/";
|
|
203
|
+
|
|
160
204
|
export function reconcileContractsOnDisk(packageRoot, hashes) {
|
|
161
205
|
const contractsRoot = join(packageRoot, "contracts");
|
|
162
206
|
const walked = existsSync(contractsRoot)
|
|
163
|
-
? listFilesRecursively(contractsRoot)
|
|
164
|
-
relative(packageRoot, absolutePath).split(sep).join("/")
|
|
165
|
-
|
|
207
|
+
? listFilesRecursively(contractsRoot)
|
|
208
|
+
.map((absolutePath) => relative(packageRoot, absolutePath).split(sep).join("/"))
|
|
209
|
+
.filter((relativePath) => !relativePath.startsWith(PROVIDER_CONTRACT_MIRROR_PREFIX))
|
|
166
210
|
: [];
|
|
167
211
|
const listed = Object.keys(hashes).filter((relativePath) => relativePath.startsWith("contracts/"));
|
|
168
212
|
const walkedSet = new Set(walked);
|
|
@@ -174,6 +218,31 @@ export function reconcileContractsOnDisk(packageRoot, hashes) {
|
|
|
174
218
|
};
|
|
175
219
|
}
|
|
176
220
|
|
|
221
|
+
// Compares every location that pins the Gentle AI version against the one
|
|
222
|
+
// authoritative constant (scripts/gentle-ai-installer.mjs INSTALLER_VERSION),
|
|
223
|
+
// returning a mismatch message per drifted location instead of a boolean.
|
|
224
|
+
// This replaces a textual `.includes(...)` grep that could not have caught
|
|
225
|
+
// the documented incident (scripts/install-gentle-ai.mjs header comment):
|
|
226
|
+
// two hardcoded version copies drifted apart, and the installer reported
|
|
227
|
+
// installing one version while writing another to disk. A textual grep only
|
|
228
|
+
// verifies a string appears in a file; it cannot verify that two values
|
|
229
|
+
// agree, which is exactly what this function checks instead.
|
|
230
|
+
export function gentleAiVersionPinMismatches({ installerVersion, releaseBaseUrl, windowsSourceTag, libGentleAiVersion }) {
|
|
231
|
+
const mismatches = [];
|
|
232
|
+
if (libGentleAiVersion !== installerVersion) {
|
|
233
|
+
mismatches.push(
|
|
234
|
+
`lib/gentle-ai-binary.ts GENTLE_AI_VERSION ("${libGentleAiVersion}") does not match the authoritative scripts/gentle-ai-installer.mjs INSTALLER_VERSION ("${installerVersion}")`,
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
if (!releaseBaseUrl.includes(`/v${installerVersion}/`)) {
|
|
238
|
+
mismatches.push(`RELEASE_BASE_URL ("${releaseBaseUrl}") does not pin the authoritative v${installerVersion}`);
|
|
239
|
+
}
|
|
240
|
+
if (windowsSourceTag !== `v${installerVersion}`) {
|
|
241
|
+
mismatches.push(`GENTLE_AI_WINDOWS_SOURCE_TAG ("${windowsSourceTag}") does not match the authoritative v${installerVersion}`);
|
|
242
|
+
}
|
|
243
|
+
return mismatches;
|
|
244
|
+
}
|
|
245
|
+
|
|
177
246
|
// Reads the generator's `sources` array by regex rather than importing it,
|
|
178
247
|
// so this script never needs the generator to export anything it doesn't
|
|
179
248
|
// already export for its own `--write`/`--check` CLI use.
|
|
@@ -265,14 +334,16 @@ async function main() {
|
|
|
265
334
|
});
|
|
266
335
|
|
|
267
336
|
if (driftedContracts.length > 0) {
|
|
268
|
-
console.error("gentle-pi packaged review-integration/v1 and review-integration/v2 contract bytes drifted from the byte-identical Gentle AI v2.
|
|
337
|
+
console.error("gentle-pi packaged review-integration/v1 and review-integration/v2 contract bytes drifted from the byte-identical Gentle AI v2.4.0 contract:");
|
|
269
338
|
for (const drift of driftedContracts) console.error(`- ${drift.relativePath}: expected ${drift.expected}, got ${drift.actual}`);
|
|
270
339
|
process.exit(1);
|
|
271
340
|
}
|
|
272
341
|
|
|
273
342
|
// Release guard: refuse to pack/publish while any installer digest is not a real
|
|
274
343
|
// pinned SHA-256 (for example the pre-release pending sentinel).
|
|
275
|
-
const { GENTLE_AI_RELEASE_ASSETS } = await import(
|
|
344
|
+
const { GENTLE_AI_RELEASE_ASSETS, INSTALLER_VERSION, RELEASE_BASE_URL, GENTLE_AI_WINDOWS_SOURCE_TAG } = await import(
|
|
345
|
+
new URL("./gentle-ai-installer.mjs", import.meta.url)
|
|
346
|
+
);
|
|
276
347
|
const unpinnedDigests = Object.entries(GENTLE_AI_RELEASE_ASSETS).flatMap(([target, asset]) =>
|
|
277
348
|
[["sha256", asset.sha256], ["binarySha256", asset.binarySha256]]
|
|
278
349
|
.filter(([, digest]) => !/^[0-9a-f]{64}$/.test(digest))
|
|
@@ -295,14 +366,20 @@ async function main() {
|
|
|
295
366
|
process.exit(1);
|
|
296
367
|
}
|
|
297
368
|
|
|
298
|
-
const
|
|
299
|
-
const
|
|
300
|
-
|
|
301
|
-
|
|
369
|
+
const { GENTLE_AI_VERSION } = await import(new URL("../lib/gentle-ai-binary.ts", import.meta.url));
|
|
370
|
+
const versionMismatches = gentleAiVersionPinMismatches({
|
|
371
|
+
installerVersion: INSTALLER_VERSION,
|
|
372
|
+
releaseBaseUrl: RELEASE_BASE_URL,
|
|
373
|
+
windowsSourceTag: GENTLE_AI_WINDOWS_SOURCE_TAG,
|
|
374
|
+
libGentleAiVersion: GENTLE_AI_VERSION,
|
|
375
|
+
});
|
|
376
|
+
if (versionMismatches.length > 0) {
|
|
377
|
+
console.error("gentle-pi Gentle AI version pins have drifted from the authoritative INSTALLER_VERSION:");
|
|
378
|
+
for (const mismatch of versionMismatches) console.error(`- ${mismatch}`);
|
|
302
379
|
process.exit(1);
|
|
303
380
|
}
|
|
304
381
|
|
|
305
|
-
console.log(`gentle-pi package resource check passed (${requiredPaths.length} files; ${Object.keys(contractHashes).length} exact byte-identical v2.
|
|
382
|
+
console.log(`gentle-pi package resource check passed (${requiredPaths.length} files; ${Object.keys(contractHashes).length} exact byte-identical v2.4.0 contract artifacts).`);
|
|
306
383
|
}
|
|
307
384
|
|
|
308
385
|
const isMainModule = process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href;
|
|
@@ -22,7 +22,7 @@ Generated files matching `testdata/golden/**` remain in snapshot identity but do
|
|
|
22
22
|
|
|
23
23
|
Before status/START, consult effective review mode. `off` creates no authority or authorization and yields organic `disabled/unmanaged`, never approval. Ordinary START declares `--consent relay`; low risk stays silent. A medium/high `consent/v2` result always returns the complete raw provider envelope plus an opaque in-memory candidate binding to the parent, then stops without UI or provider follow-up. The parent localizes and presents it losslessly while preserving tokens, commands, target IDs, and invocations. One explicit `answer-consent` call accepts only that binding and `granted|declined`, consumes it before provider mutation, and rechecks repository/target/projection/lineage/answer binding. Ambiguity reconciles through STATUS, never replay. Grant is exact-candidate-only. Decline creates no lineage, authority, actor/candidate binding, latch, or pending authorization; the next candidate asks again. Old Pi clone latch files are inert.
|
|
24
24
|
|
|
25
|
-
`finalize`
|
|
25
|
+
Reviewer, refuter, and validator verdicts are admitted natively, never Pi-authored. `finalize` follows the provider's negotiated `next_transition` and supplies only the negotiated collection answers: a lens `review.capture-result` collect input rendered with `--agent=pi --materialize=true` is satisfied by the gentle-pi host relay, which prints the exact Go-materialized opaque prompt, launches a fresh locked-down print-mode `pi` subprocess in an empty scratch directory with every discovery surface disabled, and submits the untouched raw output bytes through the provider-owned submission form. The adversarial roles do not go through that relay: `review.capture-refuter` and `review.capture-validation` collect inputs render as self-contained authority-advancing vectors (binding tokens plus `--agent=pi --execute=true`, no submission descriptor); executing the exact rendered invocation makes Go materialize the role prompt, spawn its own locked-down `pi` process, and admit the raw verdict. Native Go owns validation, canonicalization, missing lens/finding ID assignment, persistence, and hashing, and performs only the legal transition from the current compact state. The five states are `reviewing`, `correction_required`, `validating`, `approved`, and `escalated`.
|
|
26
26
|
|
|
27
27
|
`validate` loads the terminal receipt and authority, derives the named live Git gate, and runs with zero actors. It never mutates compact authority.
|
|
28
28
|
|
|
@@ -37,9 +37,7 @@ Every finding supplies `evidence_class`, `causal_disposition`, and concrete proo
|
|
|
37
37
|
| `causal_disposition` | `introduced` \| `behavior-activated` \| `worsened` \| `pre-existing` \| `base-only` \| `unknown` |
|
|
38
38
|
| `proof_refs` | Prefixed concrete proof references |
|
|
39
39
|
|
|
40
|
-
Only severe `introduced`, `behavior-activated`, or `worsened` findings with valid proof can enter `correction_ids`. Deterministic candidate-caused blockers need no refuter. All inferential candidate-caused blockers
|
|
41
|
-
|
|
42
|
-
If native IDs are assigned to inferential findings, FINALIZE first returns canonical rows plus a content-derived request hash without mutation; completion requires identical lens input, that hash, and one complete refuter batch.
|
|
40
|
+
Only severe `introduced`, `behavior-activated`, or `worsened` findings with valid proof can enter `correction_ids`. Deterministic candidate-caused blockers need no refuter. All inferential candidate-caused blockers share exactly one complete read-only refuter batch, executed through the provider-rendered self-contained `review.capture-refuter` vector: Go materializes the refuter prompt, runs its own locked-down `pi` process, and admits the raw verdict. Pi never authors, edits, batches, or re-scores a refuter row.
|
|
43
41
|
|
|
44
42
|
Refuter rows may cite independent concrete proof and do not need to repeat reviewer `proof_refs`. `pre-existing` and `base-only` findings become non-blocking follow-ups. `unknown`, insufficient evidence, malformed severe claims, empty/malformed proof, missing/duplicate/extra refuter rows, and inconclusive severe outcomes escalate. `WARNING` and `SUGGESTION` remain informational.
|
|
45
43
|
|
|
@@ -53,7 +51,7 @@ Before editing, `finalize` requires a positive correction-line forecast. A forec
|
|
|
53
51
|
|
|
54
52
|
Initial lenses never rerun. The correction preserves frozen findings and genesis scope: the original candidate tree, paths, untracked set, and correction IDs. It cannot add scope.
|
|
55
53
|
|
|
56
|
-
The targeted validator checks only the original criteria and one correction regression for the exact correction IDs. It cannot add findings, request another correction, launch actors, persist authority, or request another attempt. Failure escalates. Later observations are inert follow-ups.
|
|
54
|
+
The targeted validator runs through the provider-rendered self-contained `review.capture-validation` vector — Go materializes its prompt, runs its own locked-down `pi` process, and admits the raw verdict — and checks only the original criteria and one correction regression for the exact correction IDs. It cannot add findings, request another correction, launch actors, persist authority, or request another attempt. Failure escalates. Later observations are inert follow-ups.
|
|
57
55
|
|
|
58
56
|
Final verification evidence is supplied and hashed only during finalization. Failure escalates and never reopens review.
|
|
59
57
|
|
|
@@ -67,7 +65,7 @@ Permanent Pi-owned consumer infrastructure is limited to canonical identity prim
|
|
|
67
65
|
|
|
68
66
|
## Lifecycle gates
|
|
69
67
|
|
|
70
|
-
Pre-commit, pre-push, pre-PR, and release validate an approved receipt against one exact typed command target with zero actors. Native validation uses `gentle-ai.review-integration/
|
|
68
|
+
Pre-commit, pre-push, pre-PR, and release validate an approved receipt against one exact typed command target with zero actors. Native validation uses `gentle-ai.review-integration/v2`, loads authority and receipt, derives live target/publication evidence, then immediately reloads authority and re-derives target/publication evidence before allow. Authorized direct commit uses the durable hook/native-validation transaction and unresolved recovery blocks publication. The Pi-owned `review-publication-gate` module isolates command projection and publication revalidation from graph-v1 authority storage without changing these guarantees.
|
|
71
69
|
|
|
72
70
|
PR #1216 introduced the v2.1.1 `<remote>/<branch>` selector contract that v2.1.2 inherits unchanged.
|
|
73
71
|
|
|
@@ -73,11 +73,11 @@ For a standard change, choose exactly one dominant-risk lens using the fixed pre
|
|
|
73
73
|
|
|
74
74
|
## Bounded Review Transaction Contract
|
|
75
75
|
|
|
76
|
-
Call `gentle_review` INSPECT before START. The package-local Gentle AI v2.
|
|
76
|
+
Call `gentle_review` INSPECT before START. The package-local Gentle AI v2.4.0 executable negotiates `gentle-ai.review-integration/v2`; INSPECT is target-scoped status, not a Pi-built authority inventory. New ordinary review uses native compact-v2 `start -> finalize -> validate`. START receives a JSON-serialized ordinary input; an optional repository-local `policyPath` and an explicit `baseRef` paired with `committedOnly: true` are the only selectors. Native code derives Git scope, untracked paths, lineage, risk tier/reasons, lenses, authored lines, and correction budget. `judgment-day` remains explicit and separate.
|
|
77
77
|
|
|
78
78
|
If INSPECT or START reports `blocked-legacy` or `blocked-mixed`, explain that legacy authority cannot be migrated and request explicit user authorization for the exact destructive-reset challenge. RESET and RECOVER each require fresh operation-bound confirmation through the interactive Pi UI and fail closed headlessly. The UI cannot cryptographically attest the human's identity; its residual trust is the operator controlling that Pi session, while exact challenge binding remains runtime-enforced. Only after authorization, the controller routes RESET and RECOVER_LOCK to the audited native `gentle-ai review reclaim` operation and RECOVER to native `gentle-ai review recover`; supply the exact native inputs (`lineage`/`actor`/`reason`, or the predecessor lineage, expected predecessor revision, successor lineage, disposition, actor, and reason bindings). A `native-input-required` envelope is a request for those exact values — never invent them. After a committed native recovery record, INSPECT before any fresh ordinary START. For `reset-in-progress`, INSPECT still surfaces the durable original `reset_request` for the authorized RECOVER challenge.
|
|
79
79
|
|
|
80
|
-
Published v2.1.11 maintenance is explicit only: `abandon` requires the exact
|
|
80
|
+
Published v2.1.11 maintenance is explicit only: `abandon` requires the exact nine-line v2 discarded-work binding (lineage, revision, snapshot identity, reason, captured lens results, findings/evidence presence, actor), `quarantine-legacy` accepts only the malformed freeze-findings diagnostic/disposition with its eight-line binding, and dual reconciliation appends exactly `anomalies=unchanged_target,malformed_recovery_authorization`. `repair-legacy-alias` accepts only lineage, actor, and reason; Pi re-derives its repository, exact revision, diagnostic, and disposition from fresh native inventory before displaying its eight-line binding for fresh UI approval. `review dispose-result` remains unsupported pending design. A `recover` route uses only negotiated `action_disposition`; it never substitutes one.
|
|
81
81
|
|
|
82
82
|
Preserve the negotiated native failure envelope exactly. Before authority access, `mutation_outcome: not_started` means no lineage was created. For `unknown` or lost mutating output, the controller immediately calls target-scoped status and returns its exact action; it never emits a generic replay instruction. Replay the exact START or FINALIZE only when that provider result declares `exact_replay_safe` for the same canonical request and required lineage. `mutation_outcome: committed` is never weakened, and Pi never chooses a lineage merely because output was lost.
|
|
83
83
|
|
|
@@ -119,7 +119,7 @@ Existing graph-v1 and legacy-v1 ordinary lineages remain compatibility-readable
|
|
|
119
119
|
|
|
120
120
|
PR #1216 introduced the v2.1.1 `<remote>/<branch>` selector contract that v2.1.2 inherits unchanged.
|
|
121
121
|
|
|
122
|
-
Native gates are read-only and always pass `--contract gentle-ai.review-integration/
|
|
122
|
+
Native gates are read-only and always pass `--contract gentle-ai.review-integration/v2`. Pi registers one exact one-shot command authorization and rederives before and after bash-time native validation. Authorized direct `git commit` is rewritten through the package-owned durable transaction: run the effective pre-commit hook once, derive the post-hook index tree, validate that exact tree natively, preserve remaining hooks through proxies, commit without rerunning pre-commit, then prove `HEAD^{tree}`. An unresolved transaction blocks push, PR, and release; recovery never resets Git content automatically. Native pre-PR binds GitHub CLI repository precedence plus the exact advertised remote head equal to reviewed local `HEAD`. Publication probes remain shell-free, bounded, cancellation-aware, and fail closed on unsupported topology.
|
|
123
123
|
Release from protected `main` may bypass receipt validation only when the tag targets the current immutable `origin/main` SHA, required CI for that exact SHA is successful, the remote head is rechecked before tag push, and no fresh risk evidence exists; otherwise release fails closed through native receipt validation.
|
|
124
124
|
Major and post-incident releases require explicit extraordinary review even when fast-path checks pass.
|
|
125
125
|
|
|
@@ -129,4 +129,4 @@ SDD completion adds no review or Judgment Day pass.
|
|
|
129
129
|
|
|
130
130
|
Review operations, validation, and SDD perform no push, PR creation, release, or publication. Only the separate durable commit runner may create one local commit after exact native authorization and HEAD proof.
|
|
131
131
|
|
|
132
|
-
The package ensures SDD agents and chains are available as global Pi runtime assets.
|
|
132
|
+
The package ensures SDD agents and chains are available as global Pi runtime assets. Adversarial review roles (refuter, targeted validator) are never Pi-authored: the provider renders self-contained capture vectors and Go runs its own locked-down `pi` process on them. Project/user agent definitions are overrides and may shadow package assets; never rewrite or claim their effective permissions. Use `/gentle:install-sdd --force` only for recovery or intentional global refresh.
|