patchwork-os 1.2.0-beta.2.canary.713 → 1.2.0-beta.2.canary.720
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/butler/memoryCard.d.ts +2 -1
- package/dist/butler/memoryCard.js +2 -28
- package/dist/butler/memoryCard.js.map +1 -1
- package/dist/butler/outcomeIngester.js +31 -1
- package/dist/butler/outcomeIngester.js.map +1 -1
- package/dist/butler/outcomeShadowLog.d.ts +23 -0
- package/dist/butler/outcomeShadowLog.js +30 -1
- package/dist/butler/outcomeShadowLog.js.map +1 -1
- package/dist/index.js +36 -3
- package/dist/index.js.map +1 -1
- package/dist/privacy/boundaryReceipts.d.ts +78 -0
- package/dist/privacy/boundaryReceipts.js +203 -0
- package/dist/privacy/boundaryReceipts.js.map +1 -0
- package/dist/promptSafety.d.ts +29 -0
- package/dist/promptSafety.js +55 -0
- package/dist/promptSafety.js.map +1 -0
- package/dist/recipeRoutes.js +28 -0
- package/dist/recipeRoutes.js.map +1 -1
- package/dist/tools/recentTracesDigest.js +10 -3
- package/dist/tools/recentTracesDigest.js.map +1 -1
- package/package.json +1 -1
|
@@ -18,12 +18,13 @@
|
|
|
18
18
|
* notice staleness on their own (arXiv 2605.06527) — the model can only
|
|
19
19
|
* weigh what it can see.
|
|
20
20
|
*/
|
|
21
|
+
import { sanitizeForPrompt } from "../promptSafety.js";
|
|
21
22
|
import type { ButlerFact } from "./types.js";
|
|
23
|
+
export { sanitizeForPrompt };
|
|
22
24
|
/** Matches recentTracesDigest's budget — the two share one prompt. */
|
|
23
25
|
export declare const MAX_CARD_BYTES = 2048;
|
|
24
26
|
export declare const MAX_FACT_CHARS = 80;
|
|
25
27
|
export declare const DEFAULT_MAX_FACTS = 12;
|
|
26
|
-
export declare function sanitizeForPrompt(s: string): string;
|
|
27
28
|
export interface MemoryCardOpts {
|
|
28
29
|
now: number;
|
|
29
30
|
maxFacts?: number;
|
|
@@ -18,7 +18,9 @@
|
|
|
18
18
|
* notice staleness on their own (arXiv 2605.06527) — the model can only
|
|
19
19
|
* weigh what it can see.
|
|
20
20
|
*/
|
|
21
|
+
import { sanitizeForPrompt } from "../promptSafety.js";
|
|
21
22
|
import { ORIGINATE_THRESHOLD } from "./types.js";
|
|
23
|
+
export { sanitizeForPrompt };
|
|
22
24
|
/** Matches recentTracesDigest's budget — the two share one prompt. */
|
|
23
25
|
export const MAX_CARD_BYTES = 2_048;
|
|
24
26
|
export const MAX_FACT_CHARS = 80;
|
|
@@ -38,34 +40,6 @@ function age(recordedAt, now) {
|
|
|
38
40
|
return `${mo}mo ago`;
|
|
39
41
|
return `${Math.floor(d / 365)}y ago`;
|
|
40
42
|
}
|
|
41
|
-
/**
|
|
42
|
-
* Collapse anything that could forge structure in the instructions block.
|
|
43
|
-
*
|
|
44
|
-
* This card renders fact text straight into a SYSTEM PROMPT. The store
|
|
45
|
-
* deliberately accepts any UTF-8 except NUL (a belief is arbitrary text), so
|
|
46
|
-
* the safety boundary has to be here, at the point of rendering — and it has
|
|
47
|
-
* to be here rather than at write time, because rows written before this
|
|
48
|
-
* existed are already on disk.
|
|
49
|
-
*
|
|
50
|
-
* Stripped:
|
|
51
|
-
* - C0/C1 controls including \n and \r — a newline lets a value emit a
|
|
52
|
-
* second line and impersonate a real instruction heading; a lone \r
|
|
53
|
-
* rewrites the line in a terminal render.
|
|
54
|
-
* - U+2028/U+2029 — Unicode line/paragraph separators, newlines by another
|
|
55
|
-
* name in most renderers.
|
|
56
|
-
* - U+202A–U+202E, U+2066–U+2069 — bidi overrides, which reorder displayed
|
|
57
|
-
* text without changing the bytes, so a value can appear to say something
|
|
58
|
-
* other than what is stored.
|
|
59
|
-
*
|
|
60
|
-
* Replaced with a space, not removed: deleting them would silently join words
|
|
61
|
-
* that were separate, which changes the meaning of the belief.
|
|
62
|
-
*/
|
|
63
|
-
// biome-ignore lint/suspicious/noControlCharactersInRegex: stripping control
|
|
64
|
-
// characters is the entire purpose of this expression.
|
|
65
|
-
const UNSAFE_IN_PROMPT = /[\u0000-\u001F\u007F-\u009F\u2028\u2029\u202A-\u202E\u2066-\u2069]/g;
|
|
66
|
-
export function sanitizeForPrompt(s) {
|
|
67
|
-
return s.replace(UNSAFE_IN_PROMPT, " ").replace(/\s+/g, " ").trim();
|
|
68
|
-
}
|
|
69
43
|
function truncate(s, max) {
|
|
70
44
|
return s.length <= max ? s : `${s.slice(0, max - 1)}…`;
|
|
71
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memoryCard.js","sourceRoot":"","sources":["../../src/butler/memoryCard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"memoryCard.js","sourceRoot":"","sources":["../../src/butler/memoryCard.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
* rows the grader has not earned the right to be evidence.
|
|
40
40
|
*/
|
|
41
41
|
import { gradeErrandOutcome, } from "./errandOutcomeGrader.js";
|
|
42
|
-
import { appendShadowOutcome, firstSeenByRef, summariseShadowLog, } from "./outcomeShadowLog.js";
|
|
42
|
+
import { appendShadowOutcome, firstSeenByRef, SHADOW_REASONS, summariseShadowLog, UNOBSERVED_REASONS, } from "./outcomeShadowLog.js";
|
|
43
43
|
/**
|
|
44
44
|
* Grade every observation and append a shadow row per accepted one.
|
|
45
45
|
*
|
|
@@ -109,14 +109,44 @@ export function formatShadowSummary(s) {
|
|
|
109
109
|
].join("\n");
|
|
110
110
|
}
|
|
111
111
|
const pct = (n) => `${((n / s.total) * 100).toFixed(1)}%`;
|
|
112
|
+
// Split the `unknown` bucket by what it actually means. "Still in flight" and
|
|
113
|
+
// "could not be observed" are both withheld by the fold, and they call for
|
|
114
|
+
// opposite responses — wait, versus go and fix the observation path. Reporting
|
|
115
|
+
// one number for both leaves an operator unable to tell a healthy young ledger
|
|
116
|
+
// from a channel that is seeing nothing.
|
|
117
|
+
const unobserved = UNOBSERVED_REASONS.reduce((n, r) => n + (s.byReason[r] ?? 0), 0);
|
|
118
|
+
const inFlight = s.unknown - unobserved;
|
|
119
|
+
const reasonLines = SHADOW_REASONS.filter((r) => (s.byReason[r] ?? 0) > 0)
|
|
120
|
+
.sort((a, b) => (s.byReason[b] ?? 0) - (s.byReason[a] ?? 0))
|
|
121
|
+
.map((r) => ` ${r.padEnd(18)}${s.byReason[r]} (${pct(s.byReason[r])})`);
|
|
122
|
+
const unattributed = s.total - SHADOW_REASONS.reduce((n, r) => n + (s.byReason[r] ?? 0), 0);
|
|
112
123
|
return [
|
|
113
124
|
`[butler-shadow] ${s.total} graded row(s):`,
|
|
114
125
|
` confirmed ${s.confirmed} (${pct(s.confirmed)})`,
|
|
115
126
|
` junk ${s.junk} (${pct(s.junk)})`,
|
|
116
127
|
` unknown ${s.unknown} (${pct(s.unknown)}) — withheld by the fold`,
|
|
128
|
+
...(s.unknown > 0
|
|
129
|
+
? [
|
|
130
|
+
` of which ${inFlight} still in flight, ${unobserved} could not be observed`,
|
|
131
|
+
]
|
|
132
|
+
: []),
|
|
133
|
+
"",
|
|
134
|
+
" by reason",
|
|
135
|
+
...(reasonLines.length > 0 ? reasonLines : [" (none recorded)"]),
|
|
136
|
+
...(unattributed > 0
|
|
137
|
+
? [` (${unattributed} row(s) carry an unrecognised reason)`]
|
|
138
|
+
: []),
|
|
117
139
|
"",
|
|
118
140
|
` ${s.wouldCount} row(s) (${pct(s.wouldCount)}) would have become evidence.`,
|
|
119
141
|
"",
|
|
142
|
+
...(unobserved > 0
|
|
143
|
+
? [
|
|
144
|
+
` ${unobserved} row(s) were never observed at all. That is a broken or`,
|
|
145
|
+
" unauthorised observation path, not a verdict about the errand — fix it",
|
|
146
|
+
" before reading anything into the proportions above.",
|
|
147
|
+
"",
|
|
148
|
+
]
|
|
149
|
+
: []),
|
|
120
150
|
" These rows moved nothing. Before promoting, check a sample against the",
|
|
121
151
|
" real errands they describe — a disposition that reads plausibly in",
|
|
122
152
|
" aggregate can still be wrong on every individual row.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outcomeIngester.js","sourceRoot":"","sources":["../../src/butler/outcomeIngester.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAEL,kBAAkB,GAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,mBAAmB,EACnB,cAAc,EAEd,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAgC/B;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAClC,YAA0C,EAC1C,IAAmB;IAEnB,wEAAwE;IACxE,0EAA0E;IAC1E,yEAAyE;IACzE,0DAA0D;IAC1D,MAAM,SAAS,GAAG,cAAc,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACpD,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;YACxC,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;YAC/C,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEd,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAChD;YACE,GAAG,GAAG;YACN,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG;SACjE,EACD,IAAI,CACL,CAAC;QACF,mBAAmB,CACjB;YACE,GAAG;YACH,WAAW;YACX,MAAM;YACN,QAAQ,EAAE,IAAI,CAAC,GAAG;YAClB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,EACD,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAClB,CAAC;QACF,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACrB,MAAM,EAAE,CAAC;IACX,CAAC;IAED,OAAO;QACL,MAAM;QACN,OAAO;QACP,KAAK;QACL,MAAM,EAAE,kBAAkB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAAgB;IAClD,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO;YACL,qCAAqC;YACrC,EAAE;YACF,kEAAkE;YAClE,oDAAoD;SACrD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"outcomeIngester.js","sourceRoot":"","sources":["../../src/butler/outcomeIngester.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAEL,kBAAkB,GAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,cAAc,EAEd,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAgC/B;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAClC,YAA0C,EAC1C,IAAmB;IAEnB,wEAAwE;IACxE,0EAA0E;IAC1E,yEAAyE;IACzE,0DAA0D;IAC1D,MAAM,SAAS,GAAG,cAAc,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACpD,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;YACxC,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;YAC/C,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEd,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAChD;YACE,GAAG,GAAG;YACN,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG;SACjE,EACD,IAAI,CACL,CAAC;QACF,mBAAmB,CACjB;YACE,GAAG;YACH,WAAW;YACX,MAAM;YACN,QAAQ,EAAE,IAAI,CAAC,GAAG;YAClB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,EACD,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAClB,CAAC;QACF,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACrB,MAAM,EAAE,CAAC;IACX,CAAC;IAED,OAAO;QACL,MAAM;QACN,OAAO;QACP,KAAK;QACL,MAAM,EAAE,kBAAkB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAAgB;IAClD,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO;YACL,qCAAqC;YACrC,EAAE;YACF,kEAAkE;YAClE,oDAAoD;SACrD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAElE,8EAA8E;IAC9E,2EAA2E;IAC3E,+EAA+E;IAC/E,+EAA+E;IAC/E,yCAAyC;IACzC,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAClC,CAAC,CACF,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,GAAG,UAAU,CAAC;IAExC,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;SACvE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;SAC3D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAE7E,MAAM,YAAY,GAChB,CAAC,CAAC,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEzE,OAAO;QACL,mBAAmB,CAAC,CAAC,KAAK,iBAAiB;QAC3C,gBAAgB,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG;QACnD,gBAAgB,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG;QACzC,gBAAgB,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,0BAA0B;QACtE,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC;YACf,CAAC,CAAC;gBACE,gBAAgB,QAAQ,qBAAqB,UAAU,wBAAwB;aAChF;YACH,CAAC,CAAC,EAAE,CAAC;QACP,EAAE;QACF,aAAa;QACb,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;QACnE,GAAG,CAAC,YAAY,GAAG,CAAC;YAClB,CAAC,CAAC,CAAC,QAAQ,YAAY,uCAAuC,CAAC;YAC/D,CAAC,CAAC,EAAE,CAAC;QACP,EAAE;QACF,KAAK,CAAC,CAAC,UAAU,YAAY,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,+BAA+B;QAC7E,EAAE;QACF,GAAG,CAAC,UAAU,GAAG,CAAC;YAChB,CAAC,CAAC;gBACE,KAAK,UAAU,yDAAyD;gBACxE,0EAA0E;gBAC1E,uDAAuD;gBACvD,EAAE;aACH;YACH,CAAC,CAAC,EAAE,CAAC;QACP,0EAA0E;QAC1E,sEAAsE;QACtE,yDAAyD;KAC1D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -89,7 +89,30 @@ export interface ShadowSummary {
|
|
|
89
89
|
unknown: number;
|
|
90
90
|
/** Rows that would have become evidence had the grader been live. */
|
|
91
91
|
wouldCount: number;
|
|
92
|
+
/**
|
|
93
|
+
* Rows per grading reason.
|
|
94
|
+
*
|
|
95
|
+
* The disposition counts alone cannot answer the only question an operator
|
|
96
|
+
* has when `unknown` dominates: is this channel WORKING on errands that are
|
|
97
|
+
* simply still in flight, or is it seeing nothing at all? Those are
|
|
98
|
+
* `open-recent` and `not-observed`, and they collapse into the same
|
|
99
|
+
* `unknown` bucket while calling for opposite responses — wait, versus go
|
|
100
|
+
* and fix the observation path.
|
|
101
|
+
*
|
|
102
|
+
* The rows have always carried `reason`; only the summary discarded it. Same
|
|
103
|
+
* defect as #1469, where the shadow report named a defaulted-classification
|
|
104
|
+
* count and gave no way to find WHICH recipes to go and label.
|
|
105
|
+
*/
|
|
106
|
+
byReason: Record<GradedOutcome["reason"], number>;
|
|
92
107
|
}
|
|
108
|
+
/** Every reason, so a summary always reports the full space rather than only what it saw. */
|
|
109
|
+
export declare const SHADOW_REASONS: ReadonlyArray<GradedOutcome["reason"]>;
|
|
110
|
+
/**
|
|
111
|
+
* Reasons that mean "the observation channel could not answer", as opposed to
|
|
112
|
+
* "it answered, and the errand is not finished yet". Exported so the formatter
|
|
113
|
+
* and its tests cannot drift on which is which.
|
|
114
|
+
*/
|
|
115
|
+
export declare const UNOBSERVED_REASONS: ReadonlyArray<GradedOutcome["reason"]>;
|
|
93
116
|
/**
|
|
94
117
|
* Summarise the shadow ledger — the number this phase exists to produce.
|
|
95
118
|
*
|
|
@@ -104,6 +104,22 @@ export function firstSeenByRef(opts = {}) {
|
|
|
104
104
|
}
|
|
105
105
|
return out;
|
|
106
106
|
}
|
|
107
|
+
/** Every reason, so a summary always reports the full space rather than only what it saw. */
|
|
108
|
+
export const SHADOW_REASONS = [
|
|
109
|
+
"completed",
|
|
110
|
+
"deleted",
|
|
111
|
+
"stale-unactioned",
|
|
112
|
+
"open-recent",
|
|
113
|
+
"not-observed",
|
|
114
|
+
];
|
|
115
|
+
/**
|
|
116
|
+
* Reasons that mean "the observation channel could not answer", as opposed to
|
|
117
|
+
* "it answered, and the errand is not finished yet". Exported so the formatter
|
|
118
|
+
* and its tests cannot drift on which is which.
|
|
119
|
+
*/
|
|
120
|
+
export const UNOBSERVED_REASONS = [
|
|
121
|
+
"not-observed",
|
|
122
|
+
];
|
|
107
123
|
/**
|
|
108
124
|
* Summarise the shadow ledger — the number this phase exists to produce.
|
|
109
125
|
*
|
|
@@ -112,12 +128,14 @@ export function firstSeenByRef(opts = {}) {
|
|
|
112
128
|
* count someone is about to make a decision on.
|
|
113
129
|
*/
|
|
114
130
|
export function summariseShadowLog(opts = {}) {
|
|
131
|
+
const emptyByReason = () => Object.fromEntries(SHADOW_REASONS.map((r) => [r, 0]));
|
|
115
132
|
const empty = {
|
|
116
133
|
total: 0,
|
|
117
134
|
confirmed: 0,
|
|
118
135
|
junk: 0,
|
|
119
136
|
unknown: 0,
|
|
120
137
|
wouldCount: 0,
|
|
138
|
+
byReason: emptyByReason(),
|
|
121
139
|
};
|
|
122
140
|
const p = shadowLogPath(opts.dir);
|
|
123
141
|
if (!existsSync(p))
|
|
@@ -129,12 +147,23 @@ export function summariseShadowLog(opts = {}) {
|
|
|
129
147
|
catch {
|
|
130
148
|
return empty;
|
|
131
149
|
}
|
|
132
|
-
|
|
150
|
+
// Fresh `byReason` rather than sharing `empty`'s. NOT a live bug — `empty` is
|
|
151
|
+
// built per call, so the spread aliasing its object harms nothing today. It is
|
|
152
|
+
// here so that hoisting `empty` to module scope, an obvious tidy-up, cannot
|
|
153
|
+
// silently make every summary cumulative. Deliberately NOT covered by a test:
|
|
154
|
+
// no test can distinguish the two while `empty` stays local, and a test that
|
|
155
|
+
// passes either way would be worse than none.
|
|
156
|
+
const out = { ...empty, byReason: emptyByReason() };
|
|
133
157
|
for (const row of parseShadowRows(text)) {
|
|
134
158
|
out.total++;
|
|
135
159
|
out[row.disposition]++;
|
|
136
160
|
if (row.wouldCountAsEvidence)
|
|
137
161
|
out.wouldCount++;
|
|
162
|
+
// A row whose reason is outside the known space is counted in `total` but
|
|
163
|
+
// not attributed. Silently coercing it into a known bucket would put a
|
|
164
|
+
// number a person acts on behind a guess.
|
|
165
|
+
if (row.reason in out.byReason)
|
|
166
|
+
out.byReason[row.reason]++;
|
|
138
167
|
}
|
|
139
168
|
return out;
|
|
140
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outcomeShadowLog.js","sourceRoot":"","sources":["../../src/butler/outcomeShadowLog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,6BAA6B,CAAC;AAEjE,MAAM,UAAU,aAAa,CAAC,QAAiB;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,aAAa,EAAE,EAAE,mBAAmB,CAAC,CAAC;AACrE,CAAC;AAwBD,qEAAqE;AACrE,MAAM,UAAU,oBAAoB,CAAC,CAAqB;IACxD,OAAO,CAAC,KAAK,SAAS,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAmD,EACnD,OAAyB,EAAE;IAE3B,MAAM,IAAI,GAAqB;QAC7B,GAAG,GAAG;QACN,oBAAoB,EAAE,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC;KAC5D,CAAC;IACF,IAAI,CAAC;QACH,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,+BAA+B;IACjC,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAyB,EAAE;IAE3B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IAC/B,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,IAAI,GAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAqB,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACpE,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI;YAC3C,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;
|
|
1
|
+
{"version":3,"file":"outcomeShadowLog.js","sourceRoot":"","sources":["../../src/butler/outcomeShadowLog.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -297,17 +297,30 @@ if (process.argv[2] === "--help" ||
|
|
|
297
297
|
`Operate\n` +
|
|
298
298
|
` start [--port N] [--workspace <dir>] Start a single bridge (no tmux)\n` +
|
|
299
299
|
` status One-line bridge status (port, uptime)\n` +
|
|
300
|
+
` dashboard Launch the local dashboard\n` +
|
|
301
|
+
` members [list|set-password <id>] Workspace roster + per-member credentials\n` +
|
|
300
302
|
` tools [list|search <q>] [--slim] [--json] List tools the bridge would register\n` +
|
|
301
303
|
` analytics <show|configure|clear|test> Manage opt-in telemetry config\n` +
|
|
302
304
|
` launchd <install|uninstall|status> Manage the macOS auto-start LaunchAgent\n\n` +
|
|
303
305
|
`Diagnose\n` +
|
|
304
306
|
` halts [--window 1h|24h|overnight|7d] Morning summary of recent recipe halts\n` +
|
|
305
307
|
` judgments [--window ...] [--recipe N] Recent judge-step verdicts across runs\n` +
|
|
308
|
+
` privacy receipts [--since-days N] What the LIVE information boundary actually decided\n` +
|
|
306
309
|
` privacy shadow [--since-days N] What a candidate privacy policy would have stopped\n` +
|
|
307
310
|
` suggest [--since-days N] Recipe + unused-tool suggestions\n` +
|
|
308
311
|
` token-efficiency benchmark Measure token cost across tool sets\n` +
|
|
309
312
|
` traces export Bundle approval / recipe / decision traces\n` +
|
|
310
|
-
` print-token [--port N] Print the active bridge auth token\n
|
|
313
|
+
` print-token [--port N] Print the active bridge auth token\n` +
|
|
314
|
+
` runstore <backfill|compare> [--json] Durable run-store maintenance + drift check\n` +
|
|
315
|
+
` shadow-scan [--since <d>] [--json] Reclassification scan over the run log\n\n` +
|
|
316
|
+
`Review\n` +
|
|
317
|
+
` approvals [--window 1h|24h|7d] [--json] Recent approval decisions\n` +
|
|
318
|
+
` approve <callId> / reject <callId> Decide one queued approval\n\n` +
|
|
319
|
+
`Butler\n` +
|
|
320
|
+
` butler shadow [--json] Summarise the graded shadow ledger\n` +
|
|
321
|
+
` butler observe [--stale-after-days N] Discover errands, look up live state, grade\n` +
|
|
322
|
+
` butler ingest [--file <path>|-] Grade a JSON array of observations\n` +
|
|
323
|
+
` butler promote [--dry-run] Fold grades into the trust ledger (flagged)\n\n` +
|
|
311
324
|
`Safety\n` +
|
|
312
325
|
` kill-switch <engage|release|status> Block / resume write-tier tools across bridges\n` +
|
|
313
326
|
` panic [--reason "..."] Shorthand for kill-switch engage\n\n` +
|
|
@@ -319,7 +332,7 @@ if (process.argv[2] === "--help" ||
|
|
|
319
332
|
` --version, -v Print package version\n` +
|
|
320
333
|
` shim stdio↔WebSocket shim (used by MCP clients)\n` +
|
|
321
334
|
` notify <event> Notify a running bridge of a CC hook event\n\n` +
|
|
322
|
-
`Bridge-daemon flags: run \`${binName} --workspace . --help
|
|
335
|
+
`Bridge-daemon flags: run \`${binName} --workspace . --help\` for the full list,\n` +
|
|
323
336
|
`or see https://github.com/Oolab-labs/patchwork-os#readme.\n`);
|
|
324
337
|
process.exit(0);
|
|
325
338
|
}
|
|
@@ -4574,8 +4587,28 @@ if (process.argv[2] === "privacy") {
|
|
|
4574
4587
|
}
|
|
4575
4588
|
process.exit(0);
|
|
4576
4589
|
}
|
|
4590
|
+
if (args[0] === "receipts") {
|
|
4591
|
+
// The ENFORCING ledger's reader. `shadow` answers "what would a candidate
|
|
4592
|
+
// policy have stopped"; this answers "what did the live policy actually
|
|
4593
|
+
// do" — the question the boundary was built to make answerable, and the
|
|
4594
|
+
// one nothing in this repo could answer until now (ADR-0019:88-92).
|
|
4595
|
+
const { summariseBoundaryReceipts, formatBoundaryReceipts } = await import("./privacy/boundaryReceipts.js");
|
|
4596
|
+
const i = args.indexOf("--since-days");
|
|
4597
|
+
const n = i !== -1 ? Number(args[i + 1]) : undefined;
|
|
4598
|
+
const summary = summariseBoundaryReceipts(n !== undefined && Number.isFinite(n) && n > 0
|
|
4599
|
+
? { since: Date.now() - n * 86_400_000 }
|
|
4600
|
+
: {});
|
|
4601
|
+
if (args.includes("--json")) {
|
|
4602
|
+
process.stdout.write(`${JSON.stringify(summary, null, 2)}\n`);
|
|
4603
|
+
}
|
|
4604
|
+
else {
|
|
4605
|
+
process.stdout.write(`${formatBoundaryReceipts(summary)}\n`);
|
|
4606
|
+
}
|
|
4607
|
+
process.exit(0);
|
|
4608
|
+
}
|
|
4577
4609
|
if (args[0] !== "shadow") {
|
|
4578
|
-
process.stderr.write("Usage: patchwork privacy
|
|
4610
|
+
process.stderr.write("Usage: patchwork privacy receipts [--since-days N] [--json]\n" +
|
|
4611
|
+
" patchwork privacy shadow [--since-days N] [--json]\n" +
|
|
4579
4612
|
" patchwork privacy suggest [--json]\n" +
|
|
4580
4613
|
"\n" +
|
|
4581
4614
|
" Observes boundary decisions WITHOUT enforcing them. Configure a\n" +
|