@getripple/core 1.0.4

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.
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.rippleApprovalPath = exports.resolveRippleApprovalStatus = exports.recordRippleApproval = exports.approvalGateForHumanGate = void 0;
27
+ const crypto = __importStar(require("crypto"));
28
+ const fs = __importStar(require("fs"));
29
+ const path = __importStar(require("path"));
30
+ const APPROVAL_PROTOCOL = "ripple-approval";
31
+ const APPROVAL_STATUS_PROTOCOL = "ripple-approval-status";
32
+ const APPROVAL_VERSION = 1;
33
+ const APPROVALS_DIR = path.join(".ripple", "approvals");
34
+ function approvalGateForHumanGate(humanGate) {
35
+ if (humanGate === "required-before-edit") {
36
+ return "before-risky-edit";
37
+ }
38
+ if (humanGate === "required-before-merge") {
39
+ return "before-merge";
40
+ }
41
+ return undefined;
42
+ }
43
+ exports.approvalGateForHumanGate = approvalGateForHumanGate;
44
+ function recordRippleApproval(workspaceRoot, intent, options = {}) {
45
+ const gate = options.gate ?? approvalGateForHumanGate(intent.humanGate);
46
+ if (!gate) {
47
+ throw new Error("This intent does not require a human approval gate. Pass --gate to record an explicit approval.");
48
+ }
49
+ const approvedAt = options.approvedAt ?? new Date().toISOString();
50
+ const approvedBy = normalizeApprover(options.approvedBy);
51
+ const intentFingerprint = fingerprintChangeIntent(intent);
52
+ const policyFingerprint = fingerprintJson(intent.policyExplanation);
53
+ const approval = {
54
+ protocol: APPROVAL_PROTOCOL,
55
+ version: APPROVAL_VERSION,
56
+ id: approvalId(intent.id, gate, approvedAt, approvedBy),
57
+ intentId: intent.id,
58
+ gate,
59
+ approvedAt,
60
+ approvedBy,
61
+ targetFile: intent.targetFile,
62
+ task: intent.task,
63
+ controlMode: intent.controlMode,
64
+ humanGate: intent.humanGate,
65
+ boundaryRisk: intent.boundaryRisk,
66
+ intentFingerprint,
67
+ policyFingerprint,
68
+ reason: cleanOptionalText(options.reason),
69
+ };
70
+ const targetPath = rippleApprovalPath(workspaceRoot, intent.id, gate);
71
+ fs.mkdirSync(path.dirname(targetPath), { recursive: true });
72
+ fs.writeFileSync(targetPath, `${JSON.stringify(approval, null, 2)}\n`, "utf8");
73
+ return approval;
74
+ }
75
+ exports.recordRippleApproval = recordRippleApproval;
76
+ function resolveRippleApprovalStatus(workspaceRoot, intent, gateOverride) {
77
+ const gate = gateOverride ?? approvalGateForHumanGate(intent.humanGate);
78
+ if (!gate) {
79
+ return {
80
+ protocol: APPROVAL_STATUS_PROTOCOL,
81
+ version: APPROVAL_VERSION,
82
+ required: false,
83
+ approved: true,
84
+ status: "not-required",
85
+ decision: "continue",
86
+ summary: "No human approval gate is required for this saved intent.",
87
+ why: ["The saved intent has humanGate=none."],
88
+ nextSteps: ["Continue only if the change still matches the saved intent."],
89
+ };
90
+ }
91
+ const approvalPath = rippleApprovalPath(workspaceRoot, intent.id, gate);
92
+ const relativePath = formatWorkspacePath(workspaceRoot, approvalPath);
93
+ if (!fs.existsSync(approvalPath)) {
94
+ return {
95
+ protocol: APPROVAL_STATUS_PROTOCOL,
96
+ version: APPROVAL_VERSION,
97
+ required: true,
98
+ approved: false,
99
+ status: "missing",
100
+ decision: "human-review",
101
+ gate,
102
+ summary: `Human approval missing for gate ${gate}.`,
103
+ approvalPath: relativePath,
104
+ why: [
105
+ `Saved intent requires ${intent.humanGate}.`,
106
+ `No approval record exists at ${relativePath}.`,
107
+ ],
108
+ nextSteps: [
109
+ `Run ripple approve --intent latest --gate ${gate} after the human reviews the plan.`,
110
+ ],
111
+ };
112
+ }
113
+ const approval = readRippleApprovalRecord(approvalPath);
114
+ const expectedIntentFingerprint = fingerprintChangeIntent(intent);
115
+ const expectedPolicyFingerprint = fingerprintJson(intent.policyExplanation);
116
+ const staleReasons = approval
117
+ ? approvalMismatchReasons(approval, intent, gate, expectedIntentFingerprint, expectedPolicyFingerprint)
118
+ : ["Approval record is not valid JSON or does not match the Ripple approval protocol."];
119
+ if (!approval || staleReasons.length > 0) {
120
+ return {
121
+ protocol: APPROVAL_STATUS_PROTOCOL,
122
+ version: APPROVAL_VERSION,
123
+ required: true,
124
+ approved: false,
125
+ status: "stale",
126
+ decision: "human-review",
127
+ gate,
128
+ summary: `Human approval for gate ${gate} is stale or invalid.`,
129
+ approval: approval ?? undefined,
130
+ approvalPath: relativePath,
131
+ why: staleReasons,
132
+ nextSteps: [
133
+ `Ask the human to review the current saved intent, then re-run ripple approve --intent latest --gate ${gate}.`,
134
+ ],
135
+ };
136
+ }
137
+ return {
138
+ protocol: APPROVAL_STATUS_PROTOCOL,
139
+ version: APPROVAL_VERSION,
140
+ required: true,
141
+ approved: true,
142
+ status: "approved",
143
+ decision: "continue",
144
+ gate,
145
+ summary: `Human approval recorded for gate ${gate}.`,
146
+ approval,
147
+ approvalPath: relativePath,
148
+ why: [
149
+ `${approval.approvedBy} approved ${intent.targetFile} for ${gate} at ${approval.approvedAt}.`,
150
+ ],
151
+ nextSteps: ["Continue only if drift, boundary, policy, and contract checks also pass."],
152
+ };
153
+ }
154
+ exports.resolveRippleApprovalStatus = resolveRippleApprovalStatus;
155
+ function rippleApprovalPath(workspaceRoot, intentId, gate) {
156
+ return path.join(workspaceRoot, APPROVALS_DIR, sanitizePathPart(intentId), `${gate}.json`);
157
+ }
158
+ exports.rippleApprovalPath = rippleApprovalPath;
159
+ function readRippleApprovalRecord(filePath) {
160
+ try {
161
+ const parsed = JSON.parse(fs.readFileSync(filePath, "utf8"));
162
+ if (parsed.protocol !== APPROVAL_PROTOCOL ||
163
+ parsed.version !== APPROVAL_VERSION ||
164
+ typeof parsed.id !== "string" ||
165
+ typeof parsed.intentId !== "string" ||
166
+ !isApprovalGate(parsed.gate) ||
167
+ typeof parsed.approvedAt !== "string" ||
168
+ typeof parsed.approvedBy !== "string" ||
169
+ typeof parsed.targetFile !== "string" ||
170
+ typeof parsed.task !== "string" ||
171
+ typeof parsed.controlMode !== "string" ||
172
+ typeof parsed.humanGate !== "string" ||
173
+ typeof parsed.boundaryRisk !== "string" ||
174
+ typeof parsed.intentFingerprint !== "string" ||
175
+ typeof parsed.policyFingerprint !== "string") {
176
+ return undefined;
177
+ }
178
+ return parsed;
179
+ }
180
+ catch {
181
+ return undefined;
182
+ }
183
+ }
184
+ function approvalMismatchReasons(approval, intent, gate, expectedIntentFingerprint, expectedPolicyFingerprint) {
185
+ const reasons = [];
186
+ if (approval.intentId !== intent.id) {
187
+ reasons.push(`Approval intent id ${approval.intentId} does not match current intent ${intent.id}.`);
188
+ }
189
+ if (approval.gate !== gate) {
190
+ reasons.push(`Approval gate ${approval.gate} does not match required gate ${gate}.`);
191
+ }
192
+ if (approval.intentFingerprint !== expectedIntentFingerprint) {
193
+ reasons.push("Saved intent changed after this approval was recorded.");
194
+ }
195
+ if (approval.policyFingerprint !== expectedPolicyFingerprint) {
196
+ reasons.push("Saved policy explanation changed after this approval was recorded.");
197
+ }
198
+ return reasons;
199
+ }
200
+ function fingerprintChangeIntent(intent) {
201
+ return fingerprintJson({
202
+ id: intent.id,
203
+ task: intent.task,
204
+ targetFile: intent.targetFile,
205
+ controlMode: intent.controlMode,
206
+ allowedSymbols: intent.allowedSymbols,
207
+ humanGate: intent.humanGate,
208
+ humanGateReason: intent.humanGateReason,
209
+ boundaryRisk: intent.boundaryRisk,
210
+ policySource: intent.policySource,
211
+ policyMatches: intent.policyMatches,
212
+ policyExplanation: intent.policyExplanation,
213
+ editableFiles: intent.editableFiles,
214
+ contextFiles: intent.contextFiles,
215
+ allowedFiles: intent.allowedFiles,
216
+ expectedFiles: intent.expectedFiles,
217
+ expectedSymbols: intent.expectedSymbols,
218
+ protectedContracts: intent.protectedContracts,
219
+ verificationTargets: intent.verificationTargets,
220
+ });
221
+ }
222
+ function fingerprintJson(value) {
223
+ return crypto.createHash("sha256").update(stableStringify(value)).digest("hex");
224
+ }
225
+ function stableStringify(value) {
226
+ if (value === null || typeof value !== "object") {
227
+ return JSON.stringify(value) ?? "undefined";
228
+ }
229
+ if (Array.isArray(value)) {
230
+ return `[${value.map(stableStringify).join(",")}]`;
231
+ }
232
+ const record = value;
233
+ return `{${Object.keys(record)
234
+ .sort()
235
+ .map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`)
236
+ .join(",")}}`;
237
+ }
238
+ function approvalId(intentId, gate, approvedAt, approvedBy) {
239
+ return crypto
240
+ .createHash("sha256")
241
+ .update(`${intentId}:${gate}:${approvedAt}:${approvedBy}`)
242
+ .digest("hex")
243
+ .slice(0, 16);
244
+ }
245
+ function normalizeApprover(value) {
246
+ const cleaned = cleanOptionalText(value);
247
+ if (cleaned) {
248
+ return cleaned;
249
+ }
250
+ return process.env.GIT_AUTHOR_NAME?.trim() ||
251
+ process.env.USERNAME?.trim() ||
252
+ process.env.USER?.trim() ||
253
+ "human";
254
+ }
255
+ function cleanOptionalText(value) {
256
+ const cleaned = value?.trim();
257
+ return cleaned ? cleaned : undefined;
258
+ }
259
+ function isApprovalGate(value) {
260
+ return value === "before-risky-edit" || value === "before-merge";
261
+ }
262
+ function sanitizePathPart(value) {
263
+ return value.replace(/[^A-Za-z0-9._-]/g, "_");
264
+ }
265
+ function formatWorkspacePath(workspaceRoot, filePath) {
266
+ const relative = path.relative(workspaceRoot, filePath);
267
+ if (relative && !relative.startsWith("..") && !path.isAbsolute(relative)) {
268
+ return relative.split(path.sep).join("/");
269
+ }
270
+ return filePath;
271
+ }
272
+ //# sourceMappingURL=approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval.js","sourceRoot":"","sources":["../src/approval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import type { ChangeIntent, ChangeIntentValidationSummary, ControlMode, IntentDriftRepairPlan, RippleAgentHandoffVerdict, StagedCheckWithIntentSummary } from "./change-intent";
2
+ import type { AgentRuntimeNextPhaseId } from "./agent-workflow";
3
+ import type { RipplePolicyExplanation } from "./policy";
4
+ import { RippleApprovalStatus } from "./approval";
5
+ export type RippleAuditMode = "staged" | "changed";
6
+ export type RippleAuditStatus = "pass" | "repair-required" | "human-review-required";
7
+ export type RippleAuditDecision = "continue" | "repair" | "human-review";
8
+ export type RippleGateStatus = "open" | "closed";
9
+ export type RippleAuditSummary = {
10
+ protocol: "ripple-audit";
11
+ version: 1;
12
+ workspace: string;
13
+ mode: RippleAuditMode;
14
+ baseRef?: string;
15
+ status: RippleAuditStatus;
16
+ decision: RippleAuditDecision;
17
+ canProceed: boolean;
18
+ nextRequiredPhase: AgentRuntimeNextPhaseId;
19
+ nextRequiredAction: string;
20
+ recommendedAction: string;
21
+ intent: {
22
+ id: string;
23
+ task: string;
24
+ targetFile: string;
25
+ controlMode: ControlMode;
26
+ humanGate: ChangeIntent["humanGate"];
27
+ boundaryRisk: ChangeIntent["boundaryRisk"];
28
+ };
29
+ savedPolicyExplanation: RipplePolicyExplanation;
30
+ currentPolicyExplanation?: RipplePolicyExplanation;
31
+ approvalStatus: RippleApprovalStatus;
32
+ stagedCheck: StagedCheckWithIntentSummary;
33
+ repairPlan: IntentDriftRepairPlan;
34
+ blockingReasons: string[];
35
+ nextSteps: string[];
36
+ changedFiles: string[];
37
+ verificationTargets: string[];
38
+ handoff: RippleAgentHandoffVerdict;
39
+ };
40
+ export type RippleGateSummary = {
41
+ protocol: "ripple-gate";
42
+ version: 1;
43
+ workspace: string;
44
+ mode: RippleAuditMode;
45
+ baseRef?: string;
46
+ status: RippleGateStatus;
47
+ decision: RippleAgentHandoffVerdict["decision"];
48
+ canContinue: boolean;
49
+ mustStop: boolean;
50
+ needsHuman: boolean;
51
+ nextRequiredPhase: RippleAgentHandoffVerdict["nextRequiredPhase"];
52
+ nextRequiredAction: string;
53
+ summary: string;
54
+ intent: RippleAuditSummary["intent"];
55
+ auditStatus: RippleAuditStatus;
56
+ auditDecision: RippleAuditDecision;
57
+ approvalStatus: RippleApprovalStatus["status"];
58
+ changedFiles: string[];
59
+ verificationTargets: string[];
60
+ why: string[];
61
+ fixNow: string[];
62
+ askHuman: string[];
63
+ commands: RippleAgentHandoffVerdict["commands"];
64
+ };
65
+ export declare function buildRippleAuditSummary(input: {
66
+ workspaceRoot: string;
67
+ mode: RippleAuditMode;
68
+ baseRef?: string;
69
+ stagedCheck: StagedCheckWithIntentSummary;
70
+ repairPlan: IntentDriftRepairPlan;
71
+ intent: ChangeIntent;
72
+ currentPolicyExplanation: RipplePolicyExplanation;
73
+ approvalStatus?: RippleApprovalStatus;
74
+ }): RippleAuditSummary;
75
+ export declare function buildRippleGateSummary(audit: RippleAuditSummary): RippleGateSummary;
76
+ export declare function rippleAuditStatus(validation: ChangeIntentValidationSummary, repairPlan: IntentDriftRepairPlan, approvalStatus: RippleApprovalStatus): RippleAuditStatus;
77
+ export declare function rippleAuditDecision(status: RippleAuditStatus): RippleAuditDecision;
78
+ export declare function rippleAuditRecommendedAction(validation: ChangeIntentValidationSummary, repairPlan: IntentDriftRepairPlan, status: RippleAuditStatus, approvalStatus: RippleApprovalStatus): string;
79
+ export declare function rippleAuditNextRequiredPhase(validation: ChangeIntentValidationSummary, repairPlan: IntentDriftRepairPlan, status: RippleAuditStatus, approvalStatus: RippleApprovalStatus): AgentRuntimeNextPhaseId;
80
+ export declare function rippleAuditNextRequiredAction(phase: AgentRuntimeNextPhaseId): string;
package/dist/audit.js ADDED
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rippleAuditNextRequiredAction = exports.rippleAuditNextRequiredPhase = exports.rippleAuditRecommendedAction = exports.rippleAuditDecision = exports.rippleAuditStatus = exports.buildRippleGateSummary = exports.buildRippleAuditSummary = void 0;
4
+ const change_intent_1 = require("./change-intent");
5
+ const approval_1 = require("./approval");
6
+ function buildRippleAuditSummary(input) {
7
+ const validation = input.stagedCheck.intentValidation;
8
+ if (!validation) {
9
+ throw new Error("Audit requires a validated saved intent.");
10
+ }
11
+ const approvalStatus = input.approvalStatus ??
12
+ (0, approval_1.resolveRippleApprovalStatus)(input.workspaceRoot, input.intent);
13
+ const status = rippleAuditStatus(validation, input.repairPlan, approvalStatus);
14
+ const decision = rippleAuditDecision(status);
15
+ const nextRequiredPhase = rippleAuditNextRequiredPhase(validation, input.repairPlan, status, approvalStatus);
16
+ const blockingReasons = approvalStatus.required && !approvalStatus.approved
17
+ ? uniqueItems([...validation.blockingReasons, approvalStatus.summary])
18
+ : validation.blockingReasons;
19
+ const nextSteps = uniqueItems([
20
+ ...(approvalStatus.required && !approvalStatus.approved ? approvalStatus.nextSteps : []),
21
+ ...validation.nextSteps,
22
+ ]);
23
+ const canProceed = status === "pass";
24
+ const nextRequiredAction = rippleAuditNextRequiredAction(nextRequiredPhase);
25
+ const recommendedAction = rippleAuditRecommendedAction(validation, input.repairPlan, status, approvalStatus);
26
+ const audit = {
27
+ protocol: "ripple-audit",
28
+ version: 1,
29
+ workspace: input.workspaceRoot,
30
+ mode: input.mode,
31
+ baseRef: input.baseRef,
32
+ status,
33
+ decision,
34
+ canProceed,
35
+ nextRequiredPhase,
36
+ nextRequiredAction,
37
+ recommendedAction,
38
+ intent: {
39
+ id: input.intent.id,
40
+ task: input.intent.task,
41
+ targetFile: input.intent.targetFile,
42
+ controlMode: input.intent.controlMode,
43
+ humanGate: input.intent.humanGate,
44
+ boundaryRisk: input.intent.boundaryRisk,
45
+ },
46
+ savedPolicyExplanation: input.intent.policyExplanation,
47
+ currentPolicyExplanation: input.currentPolicyExplanation,
48
+ approvalStatus,
49
+ stagedCheck: input.stagedCheck,
50
+ repairPlan: input.repairPlan,
51
+ blockingReasons,
52
+ nextSteps,
53
+ changedFiles: input.stagedCheck.files.map((file) => file.file),
54
+ verificationTargets: input.repairPlan.verificationTargets,
55
+ };
56
+ return {
57
+ ...audit,
58
+ handoff: buildAuditHandoff(audit),
59
+ };
60
+ }
61
+ exports.buildRippleAuditSummary = buildRippleAuditSummary;
62
+ function buildRippleGateSummary(audit) {
63
+ const handoff = audit.handoff;
64
+ return {
65
+ protocol: "ripple-gate",
66
+ version: 1,
67
+ workspace: audit.workspace,
68
+ mode: audit.mode,
69
+ baseRef: audit.baseRef,
70
+ status: handoff.canContinue ? "open" : "closed",
71
+ decision: handoff.decision,
72
+ canContinue: handoff.canContinue,
73
+ mustStop: handoff.mustStop,
74
+ needsHuman: handoff.needsHuman,
75
+ nextRequiredPhase: handoff.nextRequiredPhase,
76
+ nextRequiredAction: handoff.nextRequiredAction,
77
+ summary: handoff.summary,
78
+ intent: audit.intent,
79
+ auditStatus: audit.status,
80
+ auditDecision: audit.decision,
81
+ approvalStatus: audit.approvalStatus.status,
82
+ changedFiles: audit.changedFiles,
83
+ verificationTargets: audit.verificationTargets,
84
+ why: handoff.why,
85
+ fixNow: handoff.fixNow,
86
+ askHuman: handoff.askHuman,
87
+ commands: handoff.commands,
88
+ };
89
+ }
90
+ exports.buildRippleGateSummary = buildRippleGateSummary;
91
+ function buildAuditHandoff(audit) {
92
+ const validation = audit.stagedCheck.intentValidation;
93
+ if (!validation) {
94
+ throw new Error("Audit handoff requires a validated saved intent.");
95
+ }
96
+ const needsHuman = audit.status === "human-review-required" ||
97
+ (audit.approvalStatus.required && !audit.approvalStatus.approved);
98
+ return (0, change_intent_1.buildAgentHandoffVerdict)({
99
+ source: "audit",
100
+ canContinue: audit.canProceed,
101
+ needsHuman,
102
+ decision: auditHandoffDecision(audit, needsHuman),
103
+ nextRequiredPhase: audit.nextRequiredPhase,
104
+ nextRequiredAction: audit.nextRequiredAction,
105
+ summary: audit.recommendedAction,
106
+ why: audit.blockingReasons.length > 0
107
+ ? audit.blockingReasons
108
+ : validation.driftVerdict.why,
109
+ fixNow: auditHandoffFixNow(audit),
110
+ askHuman: auditHandoffAskHuman(audit),
111
+ commands: {
112
+ doctor: validation.readinessDrift.status === "weakened"
113
+ ? ["ripple doctor --agent --strict"]
114
+ : [],
115
+ plan: audit.repairPlan.commands.replan,
116
+ check: audit.canProceed ? [] : ["ripple check --staged --agent --intent latest"],
117
+ audit: audit.canProceed ? [] : ["ripple audit --agent --intent latest"],
118
+ repair: audit.canProceed ? [] : ["ripple repair --agent --intent latest"],
119
+ approve: audit.approvalStatus.required && !audit.approvalStatus.approved
120
+ ? [
121
+ "ripple approval --intent latest --agent",
122
+ `ripple approve --intent latest --gate ${approvalGateForAudit(audit.intent.humanGate)}`,
123
+ ]
124
+ : [],
125
+ unstage: audit.repairPlan.commands.unstage,
126
+ verify: audit.verificationTargets,
127
+ },
128
+ });
129
+ }
130
+ function auditHandoffDecision(audit, needsHuman) {
131
+ const validation = audit.stagedCheck.intentValidation;
132
+ if (validation?.readinessDrift.status === "weakened") {
133
+ return "restore-readiness";
134
+ }
135
+ if (audit.canProceed) {
136
+ return "continue";
137
+ }
138
+ if (needsHuman) {
139
+ return "human-review";
140
+ }
141
+ return "repair";
142
+ }
143
+ function auditHandoffFixNow(audit) {
144
+ if (audit.canProceed) {
145
+ return audit.verificationTargets.length > 0
146
+ ? audit.verificationTargets.map((target) => `Verify before handoff: ${target}`)
147
+ : audit.nextSteps;
148
+ }
149
+ return uniqueItems([
150
+ ...audit.repairPlan.handoff.fixNow,
151
+ ...audit.nextSteps,
152
+ ]);
153
+ }
154
+ function auditHandoffAskHuman(audit) {
155
+ const askHuman = [];
156
+ if (audit.approvalStatus.required && !audit.approvalStatus.approved) {
157
+ askHuman.push(audit.approvalStatus.summary);
158
+ }
159
+ if (audit.status === "human-review-required") {
160
+ askHuman.push(audit.recommendedAction);
161
+ }
162
+ const validation = audit.stagedCheck.intentValidation;
163
+ if (validation?.readinessDrift.status === "weakened") {
164
+ askHuman.push("Approve continuing only if weaker Ripple readiness is intentional.");
165
+ }
166
+ return askHuman;
167
+ }
168
+ function approvalGateForAudit(humanGate) {
169
+ if (humanGate === "required-before-merge") {
170
+ return "before-merge";
171
+ }
172
+ return "before-risky-edit";
173
+ }
174
+ function rippleAuditStatus(validation, repairPlan, approvalStatus) {
175
+ if (validation.policyDrift.status === "changed" ||
176
+ validation.readinessDrift.status === "weakened" ||
177
+ validation.boundaryVerdict.status === "danger" ||
178
+ validation.driftVerdict.status === "danger" ||
179
+ repairPlan.status === "human-review-required" ||
180
+ repairPlan.status === "contract-review-required") {
181
+ return "human-review-required";
182
+ }
183
+ if (validation.boundaryVerdict.humanRequired && !approvalStatus.approved) {
184
+ return "human-review-required";
185
+ }
186
+ if (validation.driftVerdict.status === "pass" &&
187
+ validation.boundaryVerdict.status === "pass" &&
188
+ repairPlan.status === "no-repair-needed" &&
189
+ (!validation.boundaryVerdict.humanRequired || approvalStatus.approved)) {
190
+ return "pass";
191
+ }
192
+ return "repair-required";
193
+ }
194
+ exports.rippleAuditStatus = rippleAuditStatus;
195
+ function rippleAuditDecision(status) {
196
+ if (status === "pass") {
197
+ return "continue";
198
+ }
199
+ if (status === "human-review-required") {
200
+ return "human-review";
201
+ }
202
+ return "repair";
203
+ }
204
+ exports.rippleAuditDecision = rippleAuditDecision;
205
+ function rippleAuditRecommendedAction(validation, repairPlan, status, approvalStatus) {
206
+ if (validation.policyDrift.status === "changed") {
207
+ return "Ask the human to review the current repo policy against the saved intent before continuing.";
208
+ }
209
+ if (validation.readinessDrift.status === "weakened") {
210
+ return "Restore Ripple readiness or ask the human to approve continuing with weaker protection.";
211
+ }
212
+ if (status === "pass") {
213
+ return "Proceed after running the listed verification targets.";
214
+ }
215
+ if (validation.boundaryVerdict.humanRequired && !approvalStatus.approved) {
216
+ return "Record or verify human approval for the saved gate before continuing.";
217
+ }
218
+ return repairPlan.recommendedAction;
219
+ }
220
+ exports.rippleAuditRecommendedAction = rippleAuditRecommendedAction;
221
+ function rippleAuditNextRequiredPhase(validation, repairPlan, status, approvalStatus) {
222
+ if (status === "pass") {
223
+ return "done";
224
+ }
225
+ if (validation.policyDrift.status === "changed" ||
226
+ validation.readinessDrift.status === "weakened" ||
227
+ validation.boundaryVerdict.status === "danger" ||
228
+ validation.driftVerdict.status === "danger" ||
229
+ repairPlan.status === "human-review-required" ||
230
+ repairPlan.status === "contract-review-required") {
231
+ return "repair_or_handoff";
232
+ }
233
+ if (approvalStatus.required && !approvalStatus.approved) {
234
+ return "approval_gate";
235
+ }
236
+ return "repair_or_handoff";
237
+ }
238
+ exports.rippleAuditNextRequiredPhase = rippleAuditNextRequiredPhase;
239
+ function rippleAuditNextRequiredAction(phase) {
240
+ if (phase === "done") {
241
+ return "Run or report the verification targets, then hand off the passed Ripple audit.";
242
+ }
243
+ if (phase === "approval_gate") {
244
+ return "Stop editing and ask the human to record approval with ripple approve before continuing.";
245
+ }
246
+ if (phase === "repair_or_handoff") {
247
+ return "Run ripple repair --agent --intent latest and follow blocker actions, or ask the human to review.";
248
+ }
249
+ if (phase === "audit_after_change") {
250
+ return "Run ripple audit --agent --intent latest before final handoff.";
251
+ }
252
+ if (phase === "plan_before_edit") {
253
+ return "Create a saved Ripple plan before editing.";
254
+ }
255
+ if (phase === "edit_inside_boundary") {
256
+ return "Continue editing only inside the saved Ripple boundary.";
257
+ }
258
+ return "Read ripple_get_agent_workflow or ripple agent --json before continuing.";
259
+ }
260
+ exports.rippleAuditNextRequiredAction = rippleAuditNextRequiredAction;
261
+ function uniqueItems(items) {
262
+ const seen = new Set();
263
+ return items.filter((item) => {
264
+ if (seen.has(item)) {
265
+ return false;
266
+ }
267
+ seen.add(item);
268
+ return true;
269
+ });
270
+ }
271
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}