patchwork-os 0.2.0-beta.13.canary.282 → 0.2.0-beta.13.canary.283
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,35 @@
|
|
|
1
|
+
import type { TrustLevel } from "./trustLevel.js";
|
|
2
|
+
/**
|
|
3
|
+
* Context-risk — the FAST, situational half of the autonomy decision.
|
|
4
|
+
*
|
|
5
|
+
* Earned trust answers "is this worker generally reliable on this action-class?"
|
|
6
|
+
* (slow, accrued over many runs). Context-risk answers a DIFFERENT, orthogonal
|
|
7
|
+
* question: "is THIS situation safe to act in RIGHT NOW?" — computed per-action
|
|
8
|
+
* from signals the bridge already exposes (open diagnostics in the touched
|
|
9
|
+
* files, test coverage, git hotspot-ness, diff size, CI status). It has no
|
|
10
|
+
* cold-start: it is fully computable on day one, so it can de-rate autonomy from
|
|
11
|
+
* the very first action while the trust posterior is still accruing.
|
|
12
|
+
*
|
|
13
|
+
* It is a DE-RATER only: it can lower the effective autonomy level, never raise
|
|
14
|
+
* it (never-widen). Combined with earned trust + the autonomy ceiling, the gate
|
|
15
|
+
* becomes `min(earned, ceiling, contextCeiling)` — a worker stays at its earned
|
|
16
|
+
* level when the situation is clean and is throttled toward propose-only as live
|
|
17
|
+
* risk climbs. This is the dimension "approve-once / approve-similar" structurally
|
|
18
|
+
* cannot model. See docs/worker-autonomy-policy-gate.md §3a.
|
|
19
|
+
*/
|
|
20
|
+
export interface ContextRisk {
|
|
21
|
+
/** 0 (clean) … 1 (dangerous). Out-of-range / NaN is treated as "unknown". */
|
|
22
|
+
score: number;
|
|
23
|
+
/** Human-readable contributors (e.g. "CI red", "diff 1.2k lines", "hotspot
|
|
24
|
+
* file"), surfaced in the gate reason + audit trail. */
|
|
25
|
+
reasons?: string[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Map a context-risk score to the MAX autonomy rung permitted in this situation.
|
|
29
|
+
* DESCENDING only — higher risk ⇒ lower ceiling. Returns L4 (no de-rate) for a
|
|
30
|
+
* clean OR unknown/unmeasurable score: context-risk adds caution when danger is
|
|
31
|
+
* MEASURED; when it can't be measured the base gate (earned trust + ceiling)
|
|
32
|
+
* still applies its own floor, so an unknown situation must not silently throttle
|
|
33
|
+
* everything to zero.
|
|
34
|
+
*/
|
|
35
|
+
export declare function contextRiskCeiling(score: number): TrustLevel;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Map a context-risk score to the MAX autonomy rung permitted in this situation.
|
|
3
|
+
* DESCENDING only — higher risk ⇒ lower ceiling. Returns L4 (no de-rate) for a
|
|
4
|
+
* clean OR unknown/unmeasurable score: context-risk adds caution when danger is
|
|
5
|
+
* MEASURED; when it can't be measured the base gate (earned trust + ceiling)
|
|
6
|
+
* still applies its own floor, so an unknown situation must not silently throttle
|
|
7
|
+
* everything to zero.
|
|
8
|
+
*/
|
|
9
|
+
export function contextRiskCeiling(score) {
|
|
10
|
+
if (!Number.isFinite(score) || score <= 0)
|
|
11
|
+
return 4; // clean / unknown → no de-rate
|
|
12
|
+
if (score >= 0.8)
|
|
13
|
+
return 0; // dangerous → propose-only: every risky action gated
|
|
14
|
+
if (score >= 0.5)
|
|
15
|
+
return 1; // elevated → reversible only flows freely
|
|
16
|
+
if (score >= 0.3)
|
|
17
|
+
return 2; // moderate → compensable ok, irreversible still gated
|
|
18
|
+
return 4; // mild → no de-rate
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=contextRisk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextRisk.js","sourceRoot":"","sources":["../../src/workers/contextRisk.ts"],"names":[],"mappings":"AA4BA;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,+BAA+B;IACpF,IAAI,KAAK,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC,CAAC,qDAAqD;IACjF,IAAI,KAAK,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC,CAAC,0CAA0C;IACtE,IAAI,KAAK,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC,CAAC,sDAAsD;IAClF,OAAO,CAAC,CAAC,CAAC,oBAAoB;AAChC,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type ActionClass } from "./actionClass.js";
|
|
2
|
+
import { type ContextRisk } from "./contextRisk.js";
|
|
2
3
|
import type { TrustLevel } from "./trustLevel.js";
|
|
3
4
|
import { type WorkerManifest } from "./worker.js";
|
|
4
5
|
import type { WorkerLevelStore } from "./workerLevelStore.js";
|
|
@@ -41,17 +42,29 @@ export interface WorkerGateDecision {
|
|
|
41
42
|
/** Trust actually earned on this class (for logging / the dial). */
|
|
42
43
|
earnedLevel: TrustLevel;
|
|
43
44
|
autonomyCeiling: TrustLevel;
|
|
44
|
-
/** What the gate operates at: min(earned, ceiling), 0 if not
|
|
45
|
+
/** What the gate operates at: min(earned, ceiling, contextCeiling), 0 if not
|
|
46
|
+
* owned. */
|
|
45
47
|
effectiveLevel: TrustLevel;
|
|
48
|
+
/** The descending ceiling imposed by live context-risk (4 = no de-rate).
|
|
49
|
+
* Present only when a contextRisk was supplied. Diagnostic / audit. */
|
|
50
|
+
contextCeiling?: TrustLevel;
|
|
46
51
|
reason: string;
|
|
47
52
|
}
|
|
53
|
+
/** Optional, descending-only signals that fold into the autonomy decision
|
|
54
|
+
* alongside earned trust (the keystone seam — see
|
|
55
|
+
* docs/worker-autonomy-policy-gate.md). All absent ⇒ byte-identical to the
|
|
56
|
+
* earned-trust-only gate. New signals may only LOWER autonomy, never raise it. */
|
|
57
|
+
export interface AutonomyDecisionOpts {
|
|
58
|
+
/** Live situational risk for THIS action (fast, day-1, no cold-start). */
|
|
59
|
+
contextRisk?: ContextRisk;
|
|
60
|
+
}
|
|
48
61
|
/**
|
|
49
62
|
* Undoable → flows un-gated even when unearned. Only reversible actions are
|
|
50
63
|
* exempt from the trust requirement; compensable ones graduate to autonomous
|
|
51
64
|
* at L2+; irreversible ones wait for earned L4.
|
|
52
65
|
*/
|
|
53
66
|
export declare function flowsUngated(ac: ActionClass): boolean;
|
|
54
|
-
export declare function decideWorkerAction(worker: WorkerManifest, toolName: string, params: Record<string, unknown> | undefined, store: WorkerLevelStore): WorkerGateDecision;
|
|
67
|
+
export declare function decideWorkerAction(worker: WorkerManifest, toolName: string, params: Record<string, unknown> | undefined, store: WorkerLevelStore, opts?: AutonomyDecisionOpts): WorkerGateDecision;
|
|
55
68
|
/**
|
|
56
69
|
* Tools a worker's AGENT step must be barred from calling.
|
|
57
70
|
*
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { classifyTool, getRiskTierMap } from "../riskTier.js";
|
|
2
2
|
import { classifyActionClass, knownActionTools, } from "./actionClass.js";
|
|
3
|
+
import { contextRiskCeiling } from "./contextRisk.js";
|
|
3
4
|
import { ownsAction } from "./worker.js";
|
|
4
5
|
/**
|
|
5
6
|
* Compensable actions (git-remote, issue) unlock autonomous execution at L2.
|
|
@@ -25,7 +26,7 @@ const BRIDGE_MCP_TOOL_PREFIX = "mcp__patchwork__";
|
|
|
25
26
|
export function flowsUngated(ac) {
|
|
26
27
|
return ac.reversibility === "reversible";
|
|
27
28
|
}
|
|
28
|
-
export function decideWorkerAction(worker, toolName, params, store) {
|
|
29
|
+
export function decideWorkerAction(worker, toolName, params, store, opts) {
|
|
29
30
|
const ac = classifyActionClass(toolName, params);
|
|
30
31
|
const owned = ownsAction(worker, ac);
|
|
31
32
|
const earnedLevel = (store.getState(worker.id, ac.key)?.level ??
|
|
@@ -33,6 +34,16 @@ export function decideWorkerAction(worker, toolName, params, store) {
|
|
|
33
34
|
let effectiveLevel = owned ? earnedLevel : 0;
|
|
34
35
|
if (effectiveLevel > worker.autonomyCeiling)
|
|
35
36
|
effectiveLevel = worker.autonomyCeiling;
|
|
37
|
+
// Descending context-risk clamp (keystone seam). A live, situational de-rater:
|
|
38
|
+
// it can only LOWER the effective level (never-widen). Absent ⇒ no-op, so the
|
|
39
|
+
// earned-trust-only path is byte-identical. A worker with a clean situation
|
|
40
|
+
// keeps its earned autonomy; a dangerous live context (red CI, huge diff,
|
|
41
|
+
// hotspot file) throttles it toward propose-only regardless of earned level.
|
|
42
|
+
const contextCeiling = opts?.contextRisk
|
|
43
|
+
? contextRiskCeiling(opts.contextRisk.score)
|
|
44
|
+
: undefined;
|
|
45
|
+
if (contextCeiling !== undefined && effectiveLevel > contextCeiling)
|
|
46
|
+
effectiveLevel = contextCeiling;
|
|
36
47
|
const base = {
|
|
37
48
|
classKey: ac.key,
|
|
38
49
|
domain: ac.domain,
|
|
@@ -42,6 +53,7 @@ export function decideWorkerAction(worker, toolName, params, store) {
|
|
|
42
53
|
earnedLevel,
|
|
43
54
|
autonomyCeiling: worker.autonomyCeiling,
|
|
44
55
|
effectiveLevel,
|
|
56
|
+
...(contextCeiling !== undefined && { contextCeiling }),
|
|
45
57
|
};
|
|
46
58
|
// Agent (reasoning) steps are not a durable side-effecting action-class: the
|
|
47
59
|
// claude subprocess produces an output var, and any tool calls it makes are
|
|
@@ -88,7 +100,19 @@ export function decideWorkerAction(worker, toolName, params, store) {
|
|
|
88
100
|
? COMPENSABLE_AUTONOMY_LEVEL
|
|
89
101
|
: AUTONOMOUS_LEVEL;
|
|
90
102
|
let reason;
|
|
91
|
-
|
|
103
|
+
// Context-risk is the BINDING constraint when it dropped the effective level
|
|
104
|
+
// below what earned trust + ceiling alone would have allowed. Attribute it so
|
|
105
|
+
// the audit trail shows the situation throttled the action, not stale trust.
|
|
106
|
+
const earnedCapped = Math.min(owned ? earnedLevel : 0, worker.autonomyCeiling);
|
|
107
|
+
if (contextCeiling !== undefined &&
|
|
108
|
+
contextCeiling < threshold &&
|
|
109
|
+
contextCeiling < earnedCapped) {
|
|
110
|
+
const why = opts?.contextRisk?.reasons?.length
|
|
111
|
+
? ` (${opts.contextRisk.reasons.join(", ")})`
|
|
112
|
+
: "";
|
|
113
|
+
reason = `${ac.reversibility} throttled by live context-risk (ceiling L${contextCeiling} < L${threshold})${why} — gated`;
|
|
114
|
+
}
|
|
115
|
+
else if (!owned) {
|
|
92
116
|
reason = `${ac.reversibility} action outside the worker's owned domain — gated`;
|
|
93
117
|
}
|
|
94
118
|
else if (worker.autonomyCeiling < threshold) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workerGate.js","sourceRoot":"","sources":["../../src/workers/workerGate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAEL,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"workerGate.js","sourceRoot":"","sources":["../../src/workers/workerGate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "patchwork-os",
|
|
3
|
-
"version": "0.2.0-beta.13.canary.
|
|
3
|
+
"version": "0.2.0-beta.13.canary.283",
|
|
4
4
|
"description": "Your personal AI runtime, local-first. Patchwork OS gives any AI model a consistent set of tools, YAML recipes, a delegation policy with approval queue, and a durable trace memory — all on your machine, all under your policy.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|