patchwork-os 1.2.0-beta.3.canary.897 → 1.2.0-beta.3.canary.899
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/dist/commands/policyExplain.d.ts +2 -0
- package/dist/commands/policyExplain.js +9 -1
- package/dist/commands/policyExplain.js.map +1 -1
- package/dist/commands/recipe.d.ts +8 -3
- package/dist/commands/recipe.js +28 -5
- package/dist/commands/recipe.js.map +1 -1
- package/dist/commands/recipeInstall.js +16 -2
- package/dist/commands/recipeInstall.js.map +1 -1
- package/dist/index.js +13 -4
- package/dist/index.js.map +1 -1
- package/dist/recipeRoutes.js +8 -2
- package/dist/recipeRoutes.js.map +1 -1
- package/dist/recipes/haltCategory.d.ts +9 -0
- package/dist/recipes/haltCategory.js +25 -0
- package/dist/recipes/haltCategory.js.map +1 -1
- package/dist/recipes/installProvenance.d.ts +101 -0
- package/dist/recipes/installProvenance.js +205 -0
- package/dist/recipes/installProvenance.js.map +1 -0
- package/dist/recipes/installer.d.ts +11 -0
- package/dist/recipes/installer.js +20 -1
- package/dist/recipes/installer.js.map +1 -1
- package/dist/recipes/schemaGenerator.js +33 -8
- package/dist/recipes/schemaGenerator.js.map +1 -1
- package/dist/recipes/simulation/policyProjection.d.ts +26 -0
- package/dist/recipes/simulation/policyProjection.js +62 -0
- package/dist/recipes/simulation/policyProjection.js.map +1 -0
- package/dist/recipes/simulation/simulate.d.ts +12 -5
- package/dist/recipes/simulation/simulate.js +75 -19
- package/dist/recipes/simulation/simulate.js.map +1 -1
- package/dist/recipes/simulation/types.d.ts +63 -12
- package/dist/recipes/simulation/types.js +13 -4
- package/dist/recipes/simulation/types.js.map +1 -1
- package/dist/recipesHttp.d.ts +8 -0
- package/dist/recipesHttp.js +10 -1
- package/dist/recipesHttp.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What-If Preview — effective-policy projection.
|
|
3
|
+
*
|
|
4
|
+
* Answers "would the runtime hold this step for a human?" for every step of a
|
|
5
|
+
* simulated recipe, by running the SAME calculation the runners consult per
|
|
6
|
+
* step: `explainRecipePolicy` (the body of `patchwork policy explain`) builds
|
|
7
|
+
* each step's `EffectivePolicyInput` and calls `computeEffectivePolicy`. This
|
|
8
|
+
* module only maps those verdicts onto the dry-run plan's step ids — it holds
|
|
9
|
+
* no rule of its own, because a preview with its own rule drifts from
|
|
10
|
+
* enforcement and the drift is silent.
|
|
11
|
+
*/
|
|
12
|
+
/** The stage that decided the final verdict, for a one-line reason. */
|
|
13
|
+
function decidingReason(result) {
|
|
14
|
+
const find = (pred) => result.stages.find(pred)?.reason;
|
|
15
|
+
if (result.final === "REFUSED") {
|
|
16
|
+
return find((s) => s.verdict === "REFUSE") ?? "refused";
|
|
17
|
+
}
|
|
18
|
+
if (!result.consultsApproval) {
|
|
19
|
+
return find((s) => s.stage === "trigger") ?? "approval gate not consulted";
|
|
20
|
+
}
|
|
21
|
+
if (result.final === "HUMAN_APPROVAL_REQUIRED") {
|
|
22
|
+
return (find((s) => (s.stage === "worker_authority" || s.stage === "tool_tier") &&
|
|
23
|
+
s.verdict === "APPROVAL") ?? "approval required");
|
|
24
|
+
}
|
|
25
|
+
return find((s) => s.stage === "tool_tier") ?? "allowed";
|
|
26
|
+
}
|
|
27
|
+
export async function projectRecipePolicy(recipeFile, plan, opts = {}) {
|
|
28
|
+
const { explainRecipePolicy } = await import("../../commands/policyExplain.js");
|
|
29
|
+
const explained = await explainRecipePolicy(recipeFile, {
|
|
30
|
+
...(opts.config && { config: opts.config }),
|
|
31
|
+
...(opts.workersDir && { workersDir: opts.workersDir }),
|
|
32
|
+
...(opts.patchworkDir && { patchworkDir: opts.patchworkDir }),
|
|
33
|
+
});
|
|
34
|
+
const steps = new Map();
|
|
35
|
+
const chained = plan.triggerType === "chained";
|
|
36
|
+
for (const [i, planStep] of plan.steps.entries()) {
|
|
37
|
+
// Chained steps carry a required `id`, which is also explain's step id.
|
|
38
|
+
// Flat plan ids fall back differently (tool id vs `step_N`), so flat
|
|
39
|
+
// steps are matched by their position in `steps:` instead.
|
|
40
|
+
const rawIndex = opts.selectedIndex ?? i;
|
|
41
|
+
const match = chained
|
|
42
|
+
? explained.steps.find((e) => e.stepId === planStep.id)
|
|
43
|
+
: explained.steps.find((e) => e.index === rawIndex);
|
|
44
|
+
if (!match)
|
|
45
|
+
continue;
|
|
46
|
+
steps.set(planStep.id, {
|
|
47
|
+
final: match.result.final,
|
|
48
|
+
consultsApproval: match.result.consultsApproval,
|
|
49
|
+
reason: decidingReason(match.result),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
// The trigger the verdicts were computed for (explain evaluates a top-level
|
|
53
|
+
// chained run as "manual", as the chained runner does).
|
|
54
|
+
const evaluated = explained.steps[0]?.input.trigger;
|
|
55
|
+
return {
|
|
56
|
+
profile: explained.profileMode === "governed" ? "governed" : "compat",
|
|
57
|
+
trigger: String(evaluated ??
|
|
58
|
+
(explained.trigger === "chained" ? "manual" : explained.trigger)),
|
|
59
|
+
steps,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=policyProjection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policyProjection.js","sourceRoot":"","sources":["../../../src/recipes/simulation/policyProjection.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,9 +9,16 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import type { RecipeDryRunPlan } from "../../commands/recipe.js";
|
|
11
11
|
import type { MockedRunResult } from "./simulateMockedRun.js";
|
|
12
|
-
import { type RecipeSimulationReport } from "./types.js";
|
|
13
|
-
/**
|
|
14
|
-
|
|
12
|
+
import { type RecipeSimulationReport, type SimulationPolicy } from "./types.js";
|
|
13
|
+
/**
|
|
14
|
+
* Pure transform: a dry-run plan → a What-If Preview simulation report.
|
|
15
|
+
*
|
|
16
|
+
* `policy` carries the per-step `computeEffectivePolicy` verdicts (built by
|
|
17
|
+
* `projectRecipePolicy`). Without it the approval section is reported as
|
|
18
|
+
* UNAVAILABLE — this function never derives a gating verdict itself, because
|
|
19
|
+
* a second derivation is exactly how a preview drifts from enforcement.
|
|
20
|
+
*/
|
|
21
|
+
export declare function simulateFromPlan(plan: RecipeDryRunPlan, policy?: SimulationPolicy): RecipeSimulationReport;
|
|
15
22
|
/**
|
|
16
23
|
* Extract the step ids a `when:` condition references via `{{ ... }}`
|
|
17
24
|
* placeholders. Covers the common dotted forms the chained runner exposes
|
|
@@ -31,6 +38,6 @@ export declare function extractReferencedStepIds(condition: string): Set<string>
|
|
|
31
38
|
* data), else `"undetermined"`.
|
|
32
39
|
*
|
|
33
40
|
* Risk / side-effect / cost / approvals sections are carried over unchanged
|
|
34
|
-
* from the static report
|
|
41
|
+
* from the static report, including the effective-policy approval verdicts.
|
|
35
42
|
*/
|
|
36
|
-
export declare function simulateMockedFromPlan(plan: RecipeDryRunPlan, mocked: MockedRunResult): RecipeSimulationReport;
|
|
43
|
+
export declare function simulateMockedFromPlan(plan: RecipeDryRunPlan, mocked: MockedRunResult, policy?: SimulationPolicy): RecipeSimulationReport;
|
|
@@ -91,11 +91,47 @@ function buildCost(plan) {
|
|
|
91
91
|
note: "Low-confidence chars/4 token estimate over agent prompts (input only). USD is not projected at static fidelity — the default driver is a subscription/subprocess driver that is not billed; set an API driver + budget for a cost number.",
|
|
92
92
|
};
|
|
93
93
|
}
|
|
94
|
-
/**
|
|
95
|
-
|
|
94
|
+
/**
|
|
95
|
+
* Is any step of this recipe put in front of the approval gate? Read off the
|
|
96
|
+
* effective-policy verdicts — never assumed. `null` when there is no policy
|
|
97
|
+
* input, or when not one step could be evaluated: "we did not look" must not
|
|
98
|
+
* read as "not gated".
|
|
99
|
+
*/
|
|
100
|
+
function computeGated(steps, policy) {
|
|
101
|
+
if (!policy)
|
|
102
|
+
return null;
|
|
103
|
+
const evaluated = steps
|
|
104
|
+
.map((s) => policy.steps.get(s.id))
|
|
105
|
+
.filter((v) => v !== undefined);
|
|
106
|
+
if (evaluated.length === 0)
|
|
107
|
+
return null;
|
|
108
|
+
return evaluated.some((v) => v.consultsApproval);
|
|
109
|
+
}
|
|
110
|
+
/** The one approval caveat, shared by the static and mocked reports. */
|
|
111
|
+
function approvalNote(gated, policy, projected) {
|
|
112
|
+
if (!policy || gated === null) {
|
|
113
|
+
return "Approval projection unavailable: the effective policy could not be evaluated, so this report claims nothing about whether steps would wait for approval.";
|
|
114
|
+
}
|
|
115
|
+
const scope = `the runtime's effective policy (${policy.profile} profile, ${policy.trigger} run)`;
|
|
116
|
+
if (!gated) {
|
|
117
|
+
return `Approval projection comes from ${scope}: the approval gate is not consulted for any step of this recipe, so no step would wait for a human.`;
|
|
118
|
+
}
|
|
119
|
+
const waiting = projected.filter((p) => p.wouldRequireApproval === true);
|
|
120
|
+
const refused = projected.filter((p) => p.verdict === "REFUSED");
|
|
121
|
+
return `Approval projection comes from ${scope}: ${waiting.length} step(s) would wait for a human${refused.length > 0 ? `, ${refused.length} would be refused` : ""}.`;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Pure transform: a dry-run plan → a What-If Preview simulation report.
|
|
125
|
+
*
|
|
126
|
+
* `policy` carries the per-step `computeEffectivePolicy` verdicts (built by
|
|
127
|
+
* `projectRecipePolicy`). Without it the approval section is reported as
|
|
128
|
+
* UNAVAILABLE — this function never derives a gating verdict itself, because
|
|
129
|
+
* a second derivation is exactly how a preview drifts from enforcement.
|
|
130
|
+
*/
|
|
131
|
+
export function simulateFromPlan(plan, policy) {
|
|
96
132
|
const topology = plan.triggerType === "chained" ? "chained" : "flat";
|
|
97
|
-
const gatedOnRecipeSteps = false; // P0/P4 truth: recipe steps are not gated today.
|
|
98
133
|
const steps = buildSteps(plan, topology);
|
|
134
|
+
const gatedOnRecipeSteps = computeGated(steps, policy);
|
|
99
135
|
const sideEffectCounts = emptySideEffectCounts();
|
|
100
136
|
for (const s of steps)
|
|
101
137
|
sideEffectCounts[s.sideEffect] += 1;
|
|
@@ -113,17 +149,33 @@ export function simulateFromPlan(plan) {
|
|
|
113
149
|
sideEffect: s.sideEffect,
|
|
114
150
|
resolved: s.resolved,
|
|
115
151
|
})));
|
|
152
|
+
// Every risky or writing step is listed, plus any step the policy would
|
|
153
|
+
// hold or refuse whatever its tier (e.g. `approvalGate: all`, or an agent
|
|
154
|
+
// step that widened its containment).
|
|
116
155
|
const projected = steps
|
|
117
|
-
.filter((s) =>
|
|
118
|
-
.
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
156
|
+
.filter((s) => {
|
|
157
|
+
const v = policy?.steps.get(s.id);
|
|
158
|
+
return (s.baseRisk !== "low" ||
|
|
159
|
+
s.isWrite ||
|
|
160
|
+
(v !== undefined && v.final !== "ALLOW"));
|
|
161
|
+
})
|
|
162
|
+
.map((s) => {
|
|
163
|
+
const v = policy?.steps.get(s.id);
|
|
164
|
+
return {
|
|
165
|
+
stepId: s.id,
|
|
166
|
+
...(s.tool !== undefined ? { tool: s.tool } : {}),
|
|
167
|
+
tier: s.baseRisk,
|
|
168
|
+
wouldRequireApproval: v ? v.final === "HUMAN_APPROVAL_REQUIRED" : null,
|
|
169
|
+
verdict: v ? v.final : "unknown",
|
|
170
|
+
...(v ? { consultsApproval: v.consultsApproval } : {}),
|
|
171
|
+
reason: v
|
|
172
|
+
? v.reason
|
|
173
|
+
: policy
|
|
174
|
+
? `not evaluated (${s.type === "recipe" ? "nested recipe — governed by its own steps" : "no tool or agent to evaluate"})`
|
|
175
|
+
: "effective policy unavailable",
|
|
176
|
+
};
|
|
177
|
+
});
|
|
178
|
+
const approvalsNote = approvalNote(gatedOnRecipeSteps, policy, projected);
|
|
127
179
|
const branches = steps
|
|
128
180
|
.filter((s) => typeof s.condition === "string" && s.condition.length > 0)
|
|
129
181
|
.map((s) => ({
|
|
@@ -135,7 +187,7 @@ export function simulateFromPlan(plan) {
|
|
|
135
187
|
const cost = buildCost(plan);
|
|
136
188
|
const notes = [
|
|
137
189
|
"Static fidelity: no step is executed. Agent/LLM outputs and data-dependent branches are not resolved.",
|
|
138
|
-
|
|
190
|
+
approvalsNote,
|
|
139
191
|
"Cost is a low-confidence estimate; USD is not projected at this phase.",
|
|
140
192
|
];
|
|
141
193
|
if (topology === "flat") {
|
|
@@ -161,8 +213,12 @@ export function simulateFromPlan(plan) {
|
|
|
161
213
|
risk,
|
|
162
214
|
approvals: {
|
|
163
215
|
gatedOnRecipeSteps,
|
|
216
|
+
basis: policy && gatedOnRecipeSteps !== null
|
|
217
|
+
? "effective-policy"
|
|
218
|
+
: "unavailable",
|
|
219
|
+
...(policy ? { profile: policy.profile, trigger: policy.trigger } : {}),
|
|
164
220
|
projected,
|
|
165
|
-
note:
|
|
221
|
+
note: approvalsNote,
|
|
166
222
|
},
|
|
167
223
|
cost,
|
|
168
224
|
branches,
|
|
@@ -212,10 +268,10 @@ export function extractReferencedStepIds(condition) {
|
|
|
212
268
|
* data), else `"undetermined"`.
|
|
213
269
|
*
|
|
214
270
|
* Risk / side-effect / cost / approvals sections are carried over unchanged
|
|
215
|
-
* from the static report
|
|
271
|
+
* from the static report, including the effective-policy approval verdicts.
|
|
216
272
|
*/
|
|
217
|
-
export function simulateMockedFromPlan(plan, mocked) {
|
|
218
|
-
const base = simulateFromPlan(plan);
|
|
273
|
+
export function simulateMockedFromPlan(plan, mocked, policy) {
|
|
274
|
+
const base = simulateFromPlan(plan, policy);
|
|
219
275
|
const steps = base.steps.map((s) => {
|
|
220
276
|
const state = mocked.stepData.get(s.id);
|
|
221
277
|
const mockedFrom = state?.mockedFrom ??
|
|
@@ -245,7 +301,7 @@ export function simulateMockedFromPlan(plan, mocked) {
|
|
|
245
301
|
const notes = [
|
|
246
302
|
`Mocked fidelity: downstream templates and conditions were resolved by driving the chained runner with ${mocked.sampleRuns} prior run(s) of history. No step executed for real (stubbed deps, no persistence).`,
|
|
247
303
|
"Steps without run history were fed synthesized placeholders; their downstream effects are approximate.",
|
|
248
|
-
|
|
304
|
+
base.approvals.note,
|
|
249
305
|
"Cost remains a static estimate at this phase; USD is not projected (P3).",
|
|
250
306
|
];
|
|
251
307
|
if (base.summary.unresolvedSteps > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simulate.js","sourceRoot":"","sources":["../../../src/recipes/simulation/simulate.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"simulate.js","sourceRoot":"","sources":["../../../src/recipes/simulation/simulate.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,9 +8,11 @@
|
|
|
8
8
|
*
|
|
9
9
|
* Design constraints baked into the shape (from the 2026-06-04 investigation,
|
|
10
10
|
* `docs/counterfactual-sim-engine-investigation.md`):
|
|
11
|
-
* - `gatedOnRecipeSteps` is a first-class
|
|
12
|
-
* imply an approval gate that
|
|
13
|
-
*
|
|
11
|
+
* - `gatedOnRecipeSteps` is a first-class field so a consumer can never
|
|
12
|
+
* imply an approval gate that the runtime would not apply — nor hide one
|
|
13
|
+
* it would. Since v3 it is COMPUTED from the effective policy (the same
|
|
14
|
+
* `computeEffectivePolicy` both runners consult per step), never a
|
|
15
|
+
* constant; `null` when the policy could not be evaluated.
|
|
14
16
|
* - cost carries an explicit `basis` and is never a precise dollar figure or
|
|
15
17
|
* `$0` — at static fidelity USD is genuinely not projectable.
|
|
16
18
|
* - conditional branches resolve to `"undetermined"`, never a faked
|
|
@@ -25,8 +27,15 @@
|
|
|
25
27
|
* and the `taken`/`skipped` branch outcomes (alongside the existing
|
|
26
28
|
* `undetermined`). All additions are additive/back-compatible — a static report
|
|
27
29
|
* is still a valid v2 report.
|
|
30
|
+
*
|
|
31
|
+
* v3: the approval projection is the RUNTIME's verdict, not a tier guess.
|
|
32
|
+
* `gatedOnRecipeSteps` becomes `boolean | null` and is computed;
|
|
33
|
+
* `ApprovalProjection` gains `verdict` / `consultsApproval` and its
|
|
34
|
+
* `wouldRequireApproval` now means "the runner would hold this step for a
|
|
35
|
+
* human" (`null` when unknown); `approvals` gains `basis`, `profile` and
|
|
36
|
+
* `trigger`. A meaning change, hence the bump.
|
|
28
37
|
*/
|
|
29
|
-
export declare const SIMULATION_SCHEMA_VERSION =
|
|
38
|
+
export declare const SIMULATION_SCHEMA_VERSION = 3;
|
|
30
39
|
export type RiskTier = "low" | "medium" | "high";
|
|
31
40
|
/**
|
|
32
41
|
* Side-effect class for a single step, derived from registry metadata
|
|
@@ -64,15 +73,45 @@ export interface SimulationStep {
|
|
|
64
73
|
*/
|
|
65
74
|
mockedFrom?: "history" | "synthesized";
|
|
66
75
|
}
|
|
67
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* The effective-policy verdict for one step, as `computeEffectivePolicy`
|
|
78
|
+
* returns it, or `"unknown"` when it was not evaluated (a nested-recipe or
|
|
79
|
+
* compound step, or a report built with no policy input).
|
|
80
|
+
*/
|
|
81
|
+
export type StepPolicyVerdict = "ALLOW" | "HUMAN_APPROVAL_REQUIRED" | "REFUSED" | "unknown";
|
|
82
|
+
/** Per-step approval projection — what the runtime WOULD do with this step. */
|
|
68
83
|
export interface ApprovalProjection {
|
|
69
84
|
stepId: string;
|
|
70
85
|
tool?: string;
|
|
71
86
|
tier: RiskTier;
|
|
72
|
-
/**
|
|
73
|
-
|
|
87
|
+
/**
|
|
88
|
+
* True when the runner would hold this step for a human
|
|
89
|
+
* (`verdict === "HUMAN_APPROVAL_REQUIRED"`); false when it would not;
|
|
90
|
+
* `null` when the verdict is unknown.
|
|
91
|
+
*/
|
|
92
|
+
wouldRequireApproval: boolean | null;
|
|
93
|
+
/** The effective-policy verdict for this step. */
|
|
94
|
+
verdict: StepPolicyVerdict;
|
|
95
|
+
/** True when the runner consults the approval gate for this step at all. */
|
|
96
|
+
consultsApproval?: boolean;
|
|
74
97
|
reason: string;
|
|
75
98
|
}
|
|
99
|
+
/**
|
|
100
|
+
* Per-step effective-policy facts handed to the pure transform. Built by
|
|
101
|
+
* `projectRecipePolicy` from `computeEffectivePolicy` — the transform never
|
|
102
|
+
* derives a verdict itself.
|
|
103
|
+
*/
|
|
104
|
+
export interface SimulationPolicy {
|
|
105
|
+
profile: "governed" | "compat";
|
|
106
|
+
/** The trigger the runtime evaluates (a top-level chained run is "manual"). */
|
|
107
|
+
trigger: string;
|
|
108
|
+
/** Keyed by plan step id. A step absent here was not evaluated. */
|
|
109
|
+
steps: Map<string, {
|
|
110
|
+
final: Exclude<StepPolicyVerdict, "unknown">;
|
|
111
|
+
consultsApproval: boolean;
|
|
112
|
+
reason: string;
|
|
113
|
+
}>;
|
|
114
|
+
}
|
|
76
115
|
/** A conditional branch surfaced by the engine. */
|
|
77
116
|
export interface BranchProjection {
|
|
78
117
|
stepId: string;
|
|
@@ -173,16 +212,28 @@ export interface RecipeSimulationReport {
|
|
|
173
212
|
/** "chained" recipes have a real DAG; "flat" recipes are a linear list. */
|
|
174
213
|
topology: "chained" | "flat";
|
|
175
214
|
/**
|
|
176
|
-
* CRITICAL honesty field.
|
|
177
|
-
*
|
|
178
|
-
*
|
|
215
|
+
* CRITICAL honesty field. True when the runtime consults the approval gate
|
|
216
|
+
* for at least one of this recipe's steps under the current profile,
|
|
217
|
+
* approval-gate setting and trigger; false when it consults it for none;
|
|
218
|
+
* `null` when the effective policy could not be evaluated. Computed from
|
|
219
|
+
* `computeEffectivePolicy`, never a constant.
|
|
179
220
|
*/
|
|
180
|
-
gatedOnRecipeSteps: boolean;
|
|
221
|
+
gatedOnRecipeSteps: boolean | null;
|
|
181
222
|
steps: SimulationStep[];
|
|
182
223
|
summary: SimulationSummary;
|
|
183
224
|
risk: RunRiskSummary;
|
|
184
225
|
approvals: {
|
|
185
|
-
gatedOnRecipeSteps: boolean;
|
|
226
|
+
gatedOnRecipeSteps: boolean | null;
|
|
227
|
+
/**
|
|
228
|
+
* `"effective-policy"`: verdicts come from `computeEffectivePolicy`.
|
|
229
|
+
* `"unavailable"`: the policy could not be evaluated; verdicts are
|
|
230
|
+
* `"unknown"` and nothing is claimed either way.
|
|
231
|
+
*/
|
|
232
|
+
basis: "effective-policy" | "unavailable";
|
|
233
|
+
/** Governance profile the verdicts were computed under. */
|
|
234
|
+
profile?: "governed" | "compat";
|
|
235
|
+
/** Trigger the verdicts were computed for. */
|
|
236
|
+
trigger?: string;
|
|
186
237
|
projected: ApprovalProjection[];
|
|
187
238
|
note: string;
|
|
188
239
|
};
|
|
@@ -8,9 +8,11 @@
|
|
|
8
8
|
*
|
|
9
9
|
* Design constraints baked into the shape (from the 2026-06-04 investigation,
|
|
10
10
|
* `docs/counterfactual-sim-engine-investigation.md`):
|
|
11
|
-
* - `gatedOnRecipeSteps` is a first-class
|
|
12
|
-
* imply an approval gate that
|
|
13
|
-
*
|
|
11
|
+
* - `gatedOnRecipeSteps` is a first-class field so a consumer can never
|
|
12
|
+
* imply an approval gate that the runtime would not apply — nor hide one
|
|
13
|
+
* it would. Since v3 it is COMPUTED from the effective policy (the same
|
|
14
|
+
* `computeEffectivePolicy` both runners consult per step), never a
|
|
15
|
+
* constant; `null` when the policy could not be evaluated.
|
|
14
16
|
* - cost carries an explicit `basis` and is never a precise dollar figure or
|
|
15
17
|
* `$0` — at static fidelity USD is genuinely not projectable.
|
|
16
18
|
* - conditional branches resolve to `"undetermined"`, never a faked
|
|
@@ -25,6 +27,13 @@
|
|
|
25
27
|
* and the `taken`/`skipped` branch outcomes (alongside the existing
|
|
26
28
|
* `undetermined`). All additions are additive/back-compatible — a static report
|
|
27
29
|
* is still a valid v2 report.
|
|
30
|
+
*
|
|
31
|
+
* v3: the approval projection is the RUNTIME's verdict, not a tier guess.
|
|
32
|
+
* `gatedOnRecipeSteps` becomes `boolean | null` and is computed;
|
|
33
|
+
* `ApprovalProjection` gains `verdict` / `consultsApproval` and its
|
|
34
|
+
* `wouldRequireApproval` now means "the runner would hold this step for a
|
|
35
|
+
* human" (`null` when unknown); `approvals` gains `basis`, `profile` and
|
|
36
|
+
* `trigger`. A meaning change, hence the bump.
|
|
28
37
|
*/
|
|
29
|
-
export const SIMULATION_SCHEMA_VERSION =
|
|
38
|
+
export const SIMULATION_SCHEMA_VERSION = 3;
|
|
30
39
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/recipes/simulation/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/recipes/simulation/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC"}
|
package/dist/recipesHttp.d.ts
CHANGED
|
@@ -210,6 +210,14 @@ export interface RecipeSummary {
|
|
|
210
210
|
path: string;
|
|
211
211
|
installedAt: number;
|
|
212
212
|
source: "user" | "project" | "unknown";
|
|
213
|
+
/**
|
|
214
|
+
* The install source recorded at install time, exactly as given: an
|
|
215
|
+
* install dir's `.install.json` (`recipe install`), or a top-level file's
|
|
216
|
+
* `.install/<file>.json` sidecar (`POST /recipes/install`), the latter only
|
|
217
|
+
* while the file still has the bytes it was installed with. Absent when no
|
|
218
|
+
* valid record exists — never inferred.
|
|
219
|
+
*/
|
|
220
|
+
installedFrom?: string;
|
|
213
221
|
enabled: boolean;
|
|
214
222
|
trustLevel?: TrustLevel;
|
|
215
223
|
vars?: Array<{
|
package/dist/recipesHttp.js
CHANGED
|
@@ -5,6 +5,7 @@ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
|
5
5
|
import { loadConfig, saveConfig as savePatchworkConfig, } from "./patchworkConfig.js";
|
|
6
6
|
import { patchworkPath } from "./patchworkHome.js";
|
|
7
7
|
import { disabledMarkerPath, getConfigDisabledNames, isInstallDirDisabled, } from "./recipes/disabledMarkers.js";
|
|
8
|
+
import { moveTopLevelProvenance, readInstallProvenance, readTopLevelProvenance, removeTopLevelProvenance, } from "./recipes/installProvenance.js";
|
|
8
9
|
import { RECIPE_NAME_RE } from "./recipes/names.js";
|
|
9
10
|
import { validateRecipeDefinition, } from "./recipes/validation.js";
|
|
10
11
|
import { enrichIssuesWithPositions } from "./recipes/yamlPositions.js";
|
|
@@ -618,6 +619,8 @@ export function deleteRecipeContent(recipesDir, name) {
|
|
|
618
619
|
}
|
|
619
620
|
try {
|
|
620
621
|
rmSync(resolved, { force: true });
|
|
622
|
+
// Install provenance: a later file with this name must not inherit it.
|
|
623
|
+
removeTopLevelProvenance(resolved);
|
|
621
624
|
const sidecar = `${resolved}.permissions.json`;
|
|
622
625
|
if (existsSync(sidecar)) {
|
|
623
626
|
try {
|
|
@@ -672,6 +675,8 @@ export function archiveRecipe(recipesDir, name) {
|
|
|
672
675
|
dest = path.join(archiveDir, `${stem}.${stamp}${ext}`);
|
|
673
676
|
}
|
|
674
677
|
renameSync(resolved, dest);
|
|
678
|
+
// Install provenance moves with the file, out of the live recipes dir.
|
|
679
|
+
moveTopLevelProvenance(resolved, dest);
|
|
675
680
|
const sidecar = `${resolved}.permissions.json`;
|
|
676
681
|
if (existsSync(sidecar)) {
|
|
677
682
|
try {
|
|
@@ -1025,6 +1030,8 @@ export function listInstalledRecipes(recipesDir, opts = {}) {
|
|
|
1025
1030
|
// Cron/schedule expression for the trigger column. Surfaces `0 9 * * *`
|
|
1026
1031
|
// in the UI without forcing a YAML fetch.
|
|
1027
1032
|
const schedule = scheduleExpressionOf(parsed.trigger);
|
|
1033
|
+
// Sidecar under `.install/`, bound to these exact bytes (sha256).
|
|
1034
|
+
const provenance = readTopLevelProvenance(fullPath, raw);
|
|
1028
1035
|
recipes.push({
|
|
1029
1036
|
name: parsedName,
|
|
1030
1037
|
description: parsed.description,
|
|
@@ -1035,6 +1042,7 @@ export function listInstalledRecipes(recipesDir, opts = {}) {
|
|
|
1035
1042
|
path: fullPath,
|
|
1036
1043
|
installedAt: stat.mtimeMs,
|
|
1037
1044
|
source,
|
|
1045
|
+
...(provenance ? { installedFrom: provenance.source } : {}),
|
|
1038
1046
|
// Top-level legacy recipes don't have install dirs to put a marker
|
|
1039
1047
|
// in, so the `enabled` field still comes from the legacy config list.
|
|
1040
1048
|
enabled: !disabledSet.has(parsedName),
|
|
@@ -1091,6 +1099,7 @@ export function listInstalledRecipes(recipesDir, opts = {}) {
|
|
|
1091
1099
|
// Cron/schedule expression for the trigger column. Surfaces `0 9 * * *`
|
|
1092
1100
|
// in the UI without forcing a YAML fetch.
|
|
1093
1101
|
const schedule = scheduleExpressionOf(parsed.trigger);
|
|
1102
|
+
const provenance = readInstallProvenance(installDir);
|
|
1094
1103
|
recipes.push({
|
|
1095
1104
|
name: parsedName,
|
|
1096
1105
|
description: parsed.description,
|
|
@@ -1101,6 +1110,7 @@ export function listInstalledRecipes(recipesDir, opts = {}) {
|
|
|
1101
1110
|
path: entrypointPath,
|
|
1102
1111
|
installedAt: stat.mtimeMs,
|
|
1103
1112
|
source: "user",
|
|
1113
|
+
...(provenance ? { installedFrom: provenance.source } : {}),
|
|
1104
1114
|
// Disabled if EITHER the install marker is set OR the legacy config
|
|
1105
1115
|
// names this recipe — defence-in-depth so a stale config entry can't
|
|
1106
1116
|
// accidentally re-enable a recipe the user explicitly disabled, and
|
|
@@ -1118,7 +1128,6 @@ export function listInstalledRecipes(recipesDir, opts = {}) {
|
|
|
1118
1128
|
...(firstError ? { firstError } : {}),
|
|
1119
1129
|
},
|
|
1120
1130
|
});
|
|
1121
|
-
void installDir;
|
|
1122
1131
|
}
|
|
1123
1132
|
catch {
|
|
1124
1133
|
// skip malformed install dir
|