@miller-tech/uap 1.178.1 → 1.179.2
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/.tsbuildinfo +1 -1
- package/dist/bin/cli.js +2 -2
- package/dist/bin/cli.js.map +1 -1
- package/dist/cli/plan.d.ts +49 -0
- package/dist/cli/plan.d.ts.map +1 -1
- package/dist/cli/plan.js +206 -4
- package/dist/cli/plan.js.map +1 -1
- package/package.json +2 -2
- package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
- package/src/policies/enforcers/validate_plan_on_change.py +62 -1
- package/src/policies/schemas/policies/validate-plan-on-change.md +14 -2
- package/templates/hooks/__pycache__/deliver_autoroute.cpython-312.pyc +0 -0
- package/tools/agents/scripts/__pycache__/toolcall_path_normalizer.cpython-312.pyc +0 -0
- package/tools/agents/scripts/anthropic_proxy.py +55 -4
- package/tools/agents/tests/test_error_loop_ignores_correctives.py +91 -2
- package/tools/agents/tests/test_validate_plan_inside_project.py +106 -0
package/dist/cli/plan.js
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* A completed review that returns "fail" is the only thing that blocks.
|
|
26
26
|
*/
|
|
27
27
|
import { createHash } from 'crypto';
|
|
28
|
-
import { mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from 'fs';
|
|
28
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, renameSync, statSync, writeFileSync, } from 'fs';
|
|
29
29
|
import { join, relative, resolve, sep } from 'path';
|
|
30
30
|
import { reviewPlanText } from '../delivery/plan-check.js';
|
|
31
31
|
function stateDir(cwd) {
|
|
@@ -76,6 +76,155 @@ export function outstandingPlans(cwd) {
|
|
|
76
76
|
}
|
|
77
77
|
return { pending, drifted: drifted.sort() };
|
|
78
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Why a pending entry can never be cleared by `uap plan validate`, or null when
|
|
81
|
+
* it is perfectly clearable.
|
|
82
|
+
*
|
|
83
|
+
* These two cases are wedges, not gates. `validate` refuses any file outside the
|
|
84
|
+
* project (see `explicitFileProblem`) and cannot review a file that is not
|
|
85
|
+
* there, so an entry in either state blocks every build with a remedy that
|
|
86
|
+
* declines to run. Observed live: a memory note at
|
|
87
|
+
* `~/.claude/projects/<slug>/memory/plan_gate_before_build.md` — matched only
|
|
88
|
+
* because its name contains "plan" — blocked the repo until the state file was
|
|
89
|
+
* edited by hand.
|
|
90
|
+
*/
|
|
91
|
+
export function unclearableReason(cwd, key) {
|
|
92
|
+
if (!isInsideProject(cwd, key)) {
|
|
93
|
+
return 'outside the project directory — `uap plan validate` refuses it';
|
|
94
|
+
}
|
|
95
|
+
const abs = resolve(cwd, key);
|
|
96
|
+
if (!existsSync(abs))
|
|
97
|
+
return 'file no longer exists — nothing left to review';
|
|
98
|
+
// "Exists" is not the same as "reviewable". `validate` reads the file and
|
|
99
|
+
// leaves the entry pending when that throws, so a directory named `*-plan.md`
|
|
100
|
+
// or a file the user cannot read is the same permanent wedge with a different
|
|
101
|
+
// cause — and would otherwise be listed as merely "awaiting validation",
|
|
102
|
+
// sending the operator back into the loop this command exists to break.
|
|
103
|
+
try {
|
|
104
|
+
if (!statSync(abs).isFile())
|
|
105
|
+
return 'not a regular file — validation cannot read it';
|
|
106
|
+
readFileSync(abs, 'utf-8');
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return 'unreadable — validation cannot review it';
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Containment test that resolves symlinks.
|
|
115
|
+
*
|
|
116
|
+
* `path.resolve` is purely lexical, so `docs/plans/x.md -> ~/.ssh/id_rsa` reads
|
|
117
|
+
* as "inside the project" and the reviewer would ship that file's contents to a
|
|
118
|
+
* model endpoint. The enforcer's own check uses `os.path.realpath`; matching it
|
|
119
|
+
* here also keeps the two sides of the contract from disagreeing about the same
|
|
120
|
+
* key. Falls back to the lexical answer for paths that do not exist yet.
|
|
121
|
+
*/
|
|
122
|
+
export function isInsideProject(cwd, key) {
|
|
123
|
+
const root = realpathIfPossible(resolve(cwd));
|
|
124
|
+
const abs = realpathIfPossible(resolve(cwd, key));
|
|
125
|
+
return abs === root || abs.startsWith(root + sep);
|
|
126
|
+
}
|
|
127
|
+
function realpathIfPossible(p) {
|
|
128
|
+
try {
|
|
129
|
+
return realpathSync(p);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return p;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** Pending entries split into ones validation can clear and ones it cannot. */
|
|
136
|
+
export function classifyPending(cwd) {
|
|
137
|
+
const clearable = [];
|
|
138
|
+
const unclearable = [];
|
|
139
|
+
for (const key of outstandingPlans(cwd).pending) {
|
|
140
|
+
const reason = unclearableReason(cwd, key);
|
|
141
|
+
if (reason)
|
|
142
|
+
unclearable.push({ key, reason });
|
|
143
|
+
else
|
|
144
|
+
clearable.push(key);
|
|
145
|
+
}
|
|
146
|
+
return { clearable, unclearable };
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Drop pending entries. With no `file`, drops only the UNCLEARABLE ones — the
|
|
150
|
+
* supported recovery from a wedged gate, and deliberately not a way to skip
|
|
151
|
+
* review of a plan that is sitting right there awaiting it.
|
|
152
|
+
*/
|
|
153
|
+
export function clearPending(cwd, file) {
|
|
154
|
+
// ONE snapshot for both the decision and the write. Reading twice let a plan
|
|
155
|
+
// recorded by the enforcer between the reads be erased by the write-back —
|
|
156
|
+
// a freshly written plan silently ungated, reachable by racing a plan write
|
|
157
|
+
// against this command.
|
|
158
|
+
const st = readState(cwd);
|
|
159
|
+
const pendingKeys = Object.keys(st.pending ?? {});
|
|
160
|
+
const pending = Object.create(null);
|
|
161
|
+
for (const k of pendingKeys)
|
|
162
|
+
pending[k] = (st.pending ?? {})[k];
|
|
163
|
+
const dropped = [];
|
|
164
|
+
const refused = [];
|
|
165
|
+
const reasons = new Map();
|
|
166
|
+
for (const k of pendingKeys) {
|
|
167
|
+
const r = unclearableReason(cwd, k);
|
|
168
|
+
if (r)
|
|
169
|
+
reasons.set(k, r);
|
|
170
|
+
}
|
|
171
|
+
if (file) {
|
|
172
|
+
// Match by RESOLVED PATH, not by key string. The enforcer stores an
|
|
173
|
+
// out-of-project entry as the absolute path it saw, while `planKey` would
|
|
174
|
+
// render the same file as `../../…` — so copy-pasting the key that `status`
|
|
175
|
+
// just printed found nothing and reported "nothing to clear", contradicting
|
|
176
|
+
// the line above it.
|
|
177
|
+
const wanted = resolve(cwd, file);
|
|
178
|
+
const key = pendingKeys.find((k) => resolve(cwd, k) === wanted);
|
|
179
|
+
if (!key)
|
|
180
|
+
return { dropped: [], refused: [] };
|
|
181
|
+
const reason = reasons.get(key);
|
|
182
|
+
if (!reason) {
|
|
183
|
+
// A real, reviewable plan. Dropping it here would turn the recovery hatch
|
|
184
|
+
// into "skip the gate", which is the one thing it must not be.
|
|
185
|
+
refused.push({ key, reason: 'reviewable — run `uap plan validate` instead' });
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
delete pending[key];
|
|
189
|
+
dropped.push(key);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
for (const key of pendingKeys) {
|
|
194
|
+
if (!reasons.has(key))
|
|
195
|
+
continue;
|
|
196
|
+
delete pending[key];
|
|
197
|
+
dropped.push(key);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (dropped.length > 0) {
|
|
201
|
+
mkdirSync(stateDir(cwd), { recursive: true });
|
|
202
|
+
// Audit what was dropped and why. A gate whose blocking set can shrink
|
|
203
|
+
// without a trace is not auditable, and "the plan was moved" is exactly the
|
|
204
|
+
// case a reviewer needs to be able to see after the fact.
|
|
205
|
+
const cleared = [
|
|
206
|
+
...(st.cleared ?? []),
|
|
207
|
+
...dropped.map((key) => ({
|
|
208
|
+
key,
|
|
209
|
+
reason: reasons.get(key) ?? 'unreachable',
|
|
210
|
+
at: Math.floor(Date.now() / 1000),
|
|
211
|
+
})),
|
|
212
|
+
].slice(-50);
|
|
213
|
+
writeStateAtomic(cwd, { ...st, pending: { ...pending }, cleared });
|
|
214
|
+
}
|
|
215
|
+
return { dropped, refused };
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Write via temp file + rename. `writeFileSync` truncates first, so a crash
|
|
219
|
+
* mid-write leaves a partial file — and both readers swallow a parse error into
|
|
220
|
+
* `{}`, which silently disarms the entire gate.
|
|
221
|
+
*/
|
|
222
|
+
function writeStateAtomic(cwd, state) {
|
|
223
|
+
const target = statePath(cwd);
|
|
224
|
+
const tmp = `${target}.tmp-${process.pid}`;
|
|
225
|
+
writeFileSync(tmp, JSON.stringify(state, null, 2));
|
|
226
|
+
renameSync(tmp, target);
|
|
227
|
+
}
|
|
79
228
|
/** Mirror of the enforcer's plan-artifact test (validate_plan_on_change.py). */
|
|
80
229
|
const PLAN_STEM_RE = /(^|[-_. ])plans?([-_. ]|$)/i;
|
|
81
230
|
function isPlanFile(name) {
|
|
@@ -129,6 +278,16 @@ function argvPlanFile(argv) {
|
|
|
129
278
|
}
|
|
130
279
|
return undefined;
|
|
131
280
|
}
|
|
281
|
+
function argvClearFile(argv) {
|
|
282
|
+
const at = argv.indexOf('clear');
|
|
283
|
+
if (at === -1)
|
|
284
|
+
return undefined;
|
|
285
|
+
for (const tok of argv.slice(at + 1)) {
|
|
286
|
+
if (!tok.startsWith('-'))
|
|
287
|
+
return tok;
|
|
288
|
+
}
|
|
289
|
+
return undefined;
|
|
290
|
+
}
|
|
132
291
|
/**
|
|
133
292
|
* An EXPLICIT file must still look like a plan artifact and live under the
|
|
134
293
|
* project: the review ships file content to a model endpoint, so `uap plan
|
|
@@ -137,8 +296,9 @@ function argvPlanFile(argv) {
|
|
|
137
296
|
function explicitFileProblem(file, cwd) {
|
|
138
297
|
if (!file.toLowerCase().endsWith('.md'))
|
|
139
298
|
return 'explicit plan file must be a .md artifact';
|
|
140
|
-
|
|
141
|
-
|
|
299
|
+
// Symlink-resolving: a lexical check let `docs/plans/x.md -> ~/.ssh/id_rsa`
|
|
300
|
+
// pass, and the review ships the file's contents to a model endpoint.
|
|
301
|
+
if (!isInsideProject(cwd, file)) {
|
|
142
302
|
return 'explicit plan file must live under the project directory';
|
|
143
303
|
}
|
|
144
304
|
return null;
|
|
@@ -287,17 +447,46 @@ export async function planCommand(action, options = {}, cwd = process.cwd(), dep
|
|
|
287
447
|
const remaining = [...left.pending, ...left.drifted];
|
|
288
448
|
if (remaining.length) {
|
|
289
449
|
console.log(` Still awaiting validation before a build can run: ${remaining.join(', ')}`);
|
|
450
|
+
// Name the ones validation can never satisfy, and the way out. Without
|
|
451
|
+
// this the operator re-runs `validate` forever against an entry it refuses
|
|
452
|
+
// by design, and the only exit is hand-editing state.
|
|
453
|
+
const stuck = classifyPending(cwd).unclearable;
|
|
454
|
+
if (stuck.length) {
|
|
455
|
+
console.log(' Of those, these can NEVER be cleared by validation:');
|
|
456
|
+
stuck.forEach((s) => console.log(` • ${s.key} — ${s.reason}`));
|
|
457
|
+
console.log(' Drop them: `uap plan clear`');
|
|
458
|
+
}
|
|
290
459
|
}
|
|
291
460
|
else {
|
|
292
461
|
console.log(' All touched plans are validated — builds are unblocked until a plan changes.');
|
|
293
462
|
}
|
|
294
463
|
return;
|
|
295
464
|
}
|
|
465
|
+
if (action === 'clear') {
|
|
466
|
+
const file = options.file ?? (deps.argv ? argvClearFile(deps.argv) : undefined);
|
|
467
|
+
const { dropped, refused } = clearPending(cwd, file);
|
|
468
|
+
if (options.json) {
|
|
469
|
+
console.log(JSON.stringify({ ok: refused.length === 0, dropped, refused }));
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
if (dropped.length === 0 && refused.length === 0) {
|
|
473
|
+
console.log('Nothing to clear: no pending plan entry is unreachable.');
|
|
474
|
+
console.log(' (`clear` drops only entries validation cannot satisfy — a reviewable plan');
|
|
475
|
+
console.log(' still needs `uap plan validate`.)');
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
dropped.forEach((k) => console.log(`✓ dropped unreachable pending entry: ${k}`));
|
|
479
|
+
refused.forEach((r) => console.log(`✗ refused ${r.key} — ${r.reason}`));
|
|
480
|
+
if (refused.length > 0)
|
|
481
|
+
process.exitCode = 1;
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
296
484
|
// status (default)
|
|
297
485
|
const st = readState(cwd);
|
|
298
486
|
const validatedAt = Number(st.validated_at) || 0;
|
|
299
487
|
const ageSec = validatedAt ? Math.floor(Date.now() / 1000) - validatedAt : null;
|
|
300
488
|
const { pending, drifted } = outstandingPlans(cwd);
|
|
489
|
+
const { unclearable } = classifyPending(cwd);
|
|
301
490
|
// What the gate actually keys on now — not the age of the last stamp.
|
|
302
491
|
const blocked = pending.length > 0 || drifted.length > 0;
|
|
303
492
|
if (options.json) {
|
|
@@ -307,6 +496,7 @@ export async function planCommand(action, options = {}, cwd = process.cwd(), dep
|
|
|
307
496
|
blocked,
|
|
308
497
|
pending,
|
|
309
498
|
drifted,
|
|
499
|
+
unclearable,
|
|
310
500
|
review: st.review ?? null,
|
|
311
501
|
}));
|
|
312
502
|
return;
|
|
@@ -321,9 +511,21 @@ export async function planCommand(action, options = {}, cwd = process.cwd(), dep
|
|
|
321
511
|
return;
|
|
322
512
|
}
|
|
323
513
|
console.log('Plan validation: BLOCKING — a build cannot run until these are validated:');
|
|
324
|
-
|
|
514
|
+
const stuckKeys = new Set(unclearable.map((u) => u.key));
|
|
515
|
+
pending
|
|
516
|
+
.filter((p) => !stuckKeys.has(p))
|
|
517
|
+
.forEach((p) => console.log(` • ${p} (created/modified, never validated)`));
|
|
325
518
|
drifted.forEach((p) => console.log(` • ${p} (changed since it was validated)`));
|
|
326
519
|
console.log(' Run the `validate the plan` prompt, then `uap plan validate <file>`.');
|
|
520
|
+
if (unclearable.length) {
|
|
521
|
+
// Separated deliberately. These are not awaiting review — validation refuses
|
|
522
|
+
// them — so listing them alongside real work sends the operator into a loop
|
|
523
|
+
// of re-running a command that declines the file.
|
|
524
|
+
console.log('');
|
|
525
|
+
console.log(' UNREACHABLE — validation can never clear these:');
|
|
526
|
+
unclearable.forEach((u) => console.log(` • ${u.key} — ${u.reason}`));
|
|
527
|
+
console.log(' Drop them: `uap plan clear`');
|
|
528
|
+
}
|
|
327
529
|
}
|
|
328
530
|
export { statePath as planStatePath, windowSec as planWindowSec };
|
|
329
531
|
//# sourceMappingURL=plan.js.map
|
package/dist/cli/plan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/cli/plan.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/cli/plan.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@miller-tech/uap",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.179.2",
|
|
4
4
|
"description": "Autonomous AI agent memory system with CLAUDE.md protocol enforcement",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"start": "node dist/bin/cli.js",
|
|
22
22
|
"test": "vitest",
|
|
23
23
|
"test:ci": "vitest run",
|
|
24
|
-
"test:enforcers": "python3 -m unittest tools.agents.tests.test_enforcement_self_protect tools.agents.tests.test_schema_diff_gate tools.agents.tests.test_stream_telemetry tools.agents.tests.test_project_telemetry_events tools.agents.tests.test_workdir_scope_enforcer tools.agents.tests.test_path_containment tools.agents.tests.test_path_normalizer_hardened tools.agents.tests.test_sandbox_tool_strip tools.agents.tests.test_proxy_env_loader tools.agents.tests.test_stream_required_tool tools.agents.tests.test_tool_call_wrapper_profiles tools.agents.tests.test_tool_convert_cache tools.agents.tests.test_doubling_break tools.agents.tests.test_error_loop_ignores_correctives tools.agents.tests.test_attractor_detection tools.agents.tests.test_client_disconnect tools.agents.tests.test_confidence_escalation tools.agents.tests.test_coordination_ban tools.agents.tests.test_coordination_early_ban tools.agents.tests.test_cycle_break_exploration tools.agents.tests.test_deferral_break tools.agents.tests.test_deliver_autoroute tools.agents.tests.test_delivery_enforcement_all_langs tools.agents.tests.test_delivery_enforcement_exemptions tools.agents.tests.test_delivery_enforcement_filepath tools.agents.tests.test_delivery_enforcement_web_and_bash tools.agents.tests.test_disconnect_watcher tools.agents.tests.test_empty_maxtokens_recovery tools.agents.tests.test_empty_tool_loop_break tools.agents.tests.test_enforcer_escape_hatches tools.agents.tests.test_error_loop_break tools.agents.tests.test_finalize_suppression tools.agents.tests.test_malformed_unclosed_think tools.agents.tests.test_mandate_beats_recon tools.agents.tests.test_mandate_deliver tools.agents.tests.test_overflow_truncate_count_tokens tools.agents.tests.test_passthrough_oauth tools.agents.tests.test_project_telemetry tools.agents.tests.test_proxy_auth_headers tools.agents.tests.test_prune_preserve_force_write tools.agents.tests.test_recon_deliver_gate tools.agents.tests.test_session_admission tools.agents.tests.test_stream_heartbeat tools.agents.tests.test_stuck_break_reattach tools.agents.tests.test_turn_count_breaker_periodic tools.agents.tests.test_upstream_chokepoint tools.agents.tests.test_vision_passthrough tools.agents.tests.test_worktree_required tools.agents.tests.test_enforcer_suite_coverage tools.agents.tests.test_validate_plan_gate",
|
|
24
|
+
"test:enforcers": "python3 -m unittest tools.agents.tests.test_enforcement_self_protect tools.agents.tests.test_schema_diff_gate tools.agents.tests.test_stream_telemetry tools.agents.tests.test_project_telemetry_events tools.agents.tests.test_workdir_scope_enforcer tools.agents.tests.test_path_containment tools.agents.tests.test_path_normalizer_hardened tools.agents.tests.test_sandbox_tool_strip tools.agents.tests.test_proxy_env_loader tools.agents.tests.test_stream_required_tool tools.agents.tests.test_tool_call_wrapper_profiles tools.agents.tests.test_tool_convert_cache tools.agents.tests.test_doubling_break tools.agents.tests.test_error_loop_ignores_correctives tools.agents.tests.test_attractor_detection tools.agents.tests.test_client_disconnect tools.agents.tests.test_confidence_escalation tools.agents.tests.test_coordination_ban tools.agents.tests.test_coordination_early_ban tools.agents.tests.test_cycle_break_exploration tools.agents.tests.test_deferral_break tools.agents.tests.test_deliver_autoroute tools.agents.tests.test_delivery_enforcement_all_langs tools.agents.tests.test_delivery_enforcement_exemptions tools.agents.tests.test_delivery_enforcement_filepath tools.agents.tests.test_delivery_enforcement_web_and_bash tools.agents.tests.test_disconnect_watcher tools.agents.tests.test_empty_maxtokens_recovery tools.agents.tests.test_empty_tool_loop_break tools.agents.tests.test_enforcer_escape_hatches tools.agents.tests.test_error_loop_break tools.agents.tests.test_finalize_suppression tools.agents.tests.test_malformed_unclosed_think tools.agents.tests.test_mandate_beats_recon tools.agents.tests.test_mandate_deliver tools.agents.tests.test_overflow_truncate_count_tokens tools.agents.tests.test_passthrough_oauth tools.agents.tests.test_project_telemetry tools.agents.tests.test_proxy_auth_headers tools.agents.tests.test_prune_preserve_force_write tools.agents.tests.test_recon_deliver_gate tools.agents.tests.test_session_admission tools.agents.tests.test_stream_heartbeat tools.agents.tests.test_stuck_break_reattach tools.agents.tests.test_turn_count_breaker_periodic tools.agents.tests.test_upstream_chokepoint tools.agents.tests.test_vision_passthrough tools.agents.tests.test_worktree_required tools.agents.tests.test_enforcer_suite_coverage tools.agents.tests.test_validate_plan_gate tools.agents.tests.test_validate_plan_inside_project",
|
|
25
25
|
"test:coverage": "vitest --coverage",
|
|
26
26
|
"bench": "vitest --config vitest.bench.config.ts",
|
|
27
27
|
"lint": "eslint src --ext .ts",
|
|
Binary file
|
|
@@ -119,6 +119,49 @@ def _is_plan_file(target: str) -> bool:
|
|
|
119
119
|
return bool(PLAN_STEM_RE.search(name[:-3]))
|
|
120
120
|
|
|
121
121
|
|
|
122
|
+
def _inside_project(target: str) -> bool:
|
|
123
|
+
"""True when `target` resolves to the project root or below it.
|
|
124
|
+
|
|
125
|
+
`uap plan validate` refuses any file outside the project directory, so
|
|
126
|
+
recording one creates a pending entry NOTHING can clear: every build in the
|
|
127
|
+
repo blocks, and the remedy the refusal names declines the file. Observed
|
|
128
|
+
live with a memory note under ~/.claude/, matched only because its filename
|
|
129
|
+
contained "plan".
|
|
130
|
+
|
|
131
|
+
Fails CLOSED on error (treat as inside, i.e. record it). Failing open here
|
|
132
|
+
would let a transient getcwd() error silently un-gate a plan write.
|
|
133
|
+
"""
|
|
134
|
+
try:
|
|
135
|
+
root = os.path.realpath(os.getcwd())
|
|
136
|
+
abs_target = os.path.realpath(os.path.join(root, target))
|
|
137
|
+
return abs_target == root or abs_target.startswith(root + os.sep)
|
|
138
|
+
except Exception: # noqa: BLE001
|
|
139
|
+
return True
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def _prune_unvalidatable(pending: dict) -> tuple[dict, list]:
|
|
143
|
+
"""Split pending into (kept, dropped) — OUTSIDE-PROJECT entries only.
|
|
144
|
+
|
|
145
|
+
Those can never be cleared: `uap plan validate` refuses them by design, so
|
|
146
|
+
they block every build with a remedy that declines the file. This only
|
|
147
|
+
matters for state recorded before the tracking fix above.
|
|
148
|
+
|
|
149
|
+
A MISSING file is deliberately NOT pruned here. `mv PLAN.md PLAN2.md` is not
|
|
150
|
+
an edit op, so no new entry is recorded; auto-forgiving the old key on the
|
|
151
|
+
build path would make a rename a silent, unattended gate bypass with the
|
|
152
|
+
plan content fully intact. A deleted plan is dropped only by an operator
|
|
153
|
+
running `uap plan clear`, which records what it dropped and why.
|
|
154
|
+
"""
|
|
155
|
+
kept: dict = {}
|
|
156
|
+
dropped: list = []
|
|
157
|
+
for key, seen in pending.items():
|
|
158
|
+
if not _inside_project(key):
|
|
159
|
+
dropped.append(key)
|
|
160
|
+
else:
|
|
161
|
+
kept[key] = seen
|
|
162
|
+
return kept, dropped
|
|
163
|
+
|
|
164
|
+
|
|
122
165
|
def _key(target: str) -> str:
|
|
123
166
|
"""Repo-relative, forward-slashed — the shape `uap plan validate` records."""
|
|
124
167
|
posix = target.replace(os.sep, "/")
|
|
@@ -148,6 +191,8 @@ def _refuse(paths: list[str], why: str) -> None:
|
|
|
148
191
|
"risks, and whether it still matches the request.\n"
|
|
149
192
|
f" 2. Record it: `uap plan validate {sorted(paths)[0]}`.\n"
|
|
150
193
|
" 3. Retry this command.\n"
|
|
194
|
+
"(If validation refuses the file — outside the project, or deleted — it can "
|
|
195
|
+
"never clear: `uap plan status` names it and `uap plan clear` drops it.)\n"
|
|
151
196
|
"(Escape hatch, justify in the plan/PR: UAP_PLAN_VALIDATE_OFF=1.)",
|
|
152
197
|
inject_prompt="validate the plan",
|
|
153
198
|
)
|
|
@@ -164,6 +209,9 @@ def main() -> None:
|
|
|
164
209
|
target = _target(args)
|
|
165
210
|
if not _is_plan_file(target):
|
|
166
211
|
emit(True, "not a plan artifact")
|
|
212
|
+
# Only track what `uap plan validate` can actually validate.
|
|
213
|
+
if not _inside_project(target):
|
|
214
|
+
emit(True, "plan artifact outside the project — not tracked")
|
|
167
215
|
state = _load_state()
|
|
168
216
|
pending = state.get("pending") or {}
|
|
169
217
|
pending[_key(target)] = int(time.time())
|
|
@@ -181,7 +229,20 @@ def main() -> None:
|
|
|
181
229
|
emit(True, "not a build/execute/deploy command")
|
|
182
230
|
|
|
183
231
|
state = _load_state()
|
|
184
|
-
|
|
232
|
+
# Drop legacy entries `uap plan validate` can never clear, recording what was
|
|
233
|
+
# dropped so a shrinking blocking set is auditable.
|
|
234
|
+
pending_map = state.get("pending") or {}
|
|
235
|
+
kept, dropped = _prune_unvalidatable(pending_map)
|
|
236
|
+
if dropped:
|
|
237
|
+
state["pending"] = kept
|
|
238
|
+
cleared = list(state.get("cleared") or [])
|
|
239
|
+
cleared.extend(
|
|
240
|
+
{"key": k, "reason": "outside the project directory", "at": int(time.time())}
|
|
241
|
+
for k in dropped
|
|
242
|
+
)
|
|
243
|
+
state["cleared"] = cleared[-50:]
|
|
244
|
+
_save_state(state)
|
|
245
|
+
pending = list(kept.keys())
|
|
185
246
|
if pending:
|
|
186
247
|
_refuse(pending, "these plans were created or modified and never validated")
|
|
187
248
|
|
|
@@ -59,10 +59,14 @@ State in `.uap/plan_state.json` (honours `UAP_STATE_DIR`), shared with
|
|
|
59
59
|
```json
|
|
60
60
|
{
|
|
61
61
|
"pending": { "<repo-relative path>": "<epoch seen>" },
|
|
62
|
-
"validated": { "<repo-relative path>": "<sha256 of the reviewed bytes>" }
|
|
62
|
+
"validated": { "<repo-relative path>": "<sha256 of the reviewed bytes>" },
|
|
63
|
+
"cleared": [ { "key": "<path>", "reason": "<why unreachable>", "at": "<epoch>" } ]
|
|
63
64
|
}
|
|
64
65
|
```
|
|
65
66
|
|
|
67
|
+
`cleared` is the audit trail of pending entries dropped as UNREACHABLE. The
|
|
68
|
+
blocking set only shrinks through validation or through a recorded drop.
|
|
69
|
+
|
|
66
70
|
Gated commands: `uap deliver`, `npm run build`, `npm start`, `yarn`/`pnpm build`,
|
|
67
71
|
`make`, `cargo build|run`, `go build|run`, `mvn package|install`,
|
|
68
72
|
`gradle build`, `docker build`, `docker compose up`, `terraform apply`,
|
|
@@ -75,4 +79,12 @@ Everything not listed is allowed; there is no second allowlist to keep in sync.
|
|
|
75
79
|
Escape hatch, justify in the plan/PR: `UAP_PLAN_VALIDATE_OFF=1`.
|
|
76
80
|
|
|
77
81
|
`uap plan status` reports exactly what the gate is waiting on (pending plans and
|
|
78
|
-
plans that have drifted since validation)
|
|
82
|
+
plans that have drifted since validation), listing separately any entry that is
|
|
83
|
+
UNREACHABLE — one validation can never clear, because the file is outside the
|
|
84
|
+
project, deleted, or unreadable.
|
|
85
|
+
|
|
86
|
+
`uap plan clear` drops those unreachable entries and records them under
|
|
87
|
+
`cleared`. It REFUSES a plan that is present and reviewable, pointing back at
|
|
88
|
+
`uap plan validate`: it is a recovery hatch for a wedged gate, not a way to skip
|
|
89
|
+
review. Without it the only exit from a wedge was editing the state file by
|
|
90
|
+
hand.
|
|
Binary file
|
|
Binary file
|
|
@@ -393,12 +393,55 @@ def _error_signature(text: str) -> str:
|
|
|
393
393
|
return ""
|
|
394
394
|
if _NEGATED_FAILURE_RE.search(line):
|
|
395
395
|
return ""
|
|
396
|
+
return _normalize_error_line(line)
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
def _normalize_error_line(line: str) -> str:
|
|
400
|
+
"""Edit-invariant form of one error line: paths, hex and digits collapsed."""
|
|
396
401
|
line = re.sub(r"(/[^\s:]+)+", "<path>", line) # unix paths
|
|
397
402
|
line = re.sub(r"\b[0-9a-fA-F]{6,}\b", "<hex>", line) # hashes/addresses
|
|
398
403
|
line = re.sub(r"\d+", "#", line) # line numbers, counts
|
|
399
404
|
line = re.sub(r"\s+", " ", line).strip().lower()
|
|
400
405
|
return line[:200]
|
|
401
406
|
|
|
407
|
+
|
|
408
|
+
def _error_signature_for_result(text: str, result_error: bool | None = None) -> str:
|
|
409
|
+
"""Signature for a tool_result, honouring the protocol's own `is_error`.
|
|
410
|
+
|
|
411
|
+
Keyword sniffing cannot tell a program REPORTING a failure from a file that
|
|
412
|
+
merely CONTAINS the word. Observed live (2026-07-31): the model read a Python
|
|
413
|
+
source file, `_ERROR_LINE_RE` matched the line
|
|
414
|
+
|
|
415
|
+
except Exception: # noqa: BLE001 - unreadable state must not break ...
|
|
416
|
+
|
|
417
|
+
and three reads of the same file produced three identical "failures" — so
|
|
418
|
+
ERROR-LOOP fired and told the model to re-read the file it had just read.
|
|
419
|
+
Reading a file is the single most common thing an agent does; any file whose
|
|
420
|
+
text contains `Exception`, `error`, or `not found` could manufacture a streak.
|
|
421
|
+
|
|
422
|
+
The transcript already carries the answer. A tool_result has an `is_error`
|
|
423
|
+
flag, and the DOUBLING-DOWN guard has always preferred it over the keyword
|
|
424
|
+
heuristics; ERROR-LOOP computed its signature from the text and threw the
|
|
425
|
+
flag away. Now:
|
|
426
|
+
|
|
427
|
+
is_error False -> a clean result. No signature, whatever the bytes say.
|
|
428
|
+
is_error True -> a real failure. Signature from the text, and if none of
|
|
429
|
+
the keywords match, from its first meaningful line, so
|
|
430
|
+
an unfamiliar error shape still forms a streak.
|
|
431
|
+
absent -> fall back to the keyword heuristics as before.
|
|
432
|
+
"""
|
|
433
|
+
if result_error is False:
|
|
434
|
+
return ""
|
|
435
|
+
sig = _error_signature(text)
|
|
436
|
+
if sig or result_error is not True:
|
|
437
|
+
return sig
|
|
438
|
+
# Declared an error, but shaped like nothing we recognise. Anchor the streak
|
|
439
|
+
# on the first meaningful line rather than losing the failure entirely.
|
|
440
|
+
for raw in (text or "").splitlines():
|
|
441
|
+
if raw.strip():
|
|
442
|
+
return _normalize_error_line(raw)
|
|
443
|
+
return ""
|
|
444
|
+
|
|
402
445
|
# ---------------------------------------------------------------------------
|
|
403
446
|
# DEFERRAL-BREAK guardrail (Fix A): a model can end a turn with plain prose that
|
|
404
447
|
# DEFERS the work instead of doing it -- "I need more exploration cycles to
|
|
@@ -1786,15 +1829,23 @@ class SessionMonitor:
|
|
|
1786
1829
|
by_tool = self.tool_target_history.setdefault(name, {})
|
|
1787
1830
|
by_tool[target] = by_tool.get(target, 0) + 1
|
|
1788
1831
|
|
|
1789
|
-
def note_tool_result_error(
|
|
1832
|
+
def note_tool_result_error(
|
|
1833
|
+
self, latest_result_text: str, result_error: bool | None = None
|
|
1834
|
+
) -> None:
|
|
1790
1835
|
"""Track a repeated tool_result error signature (ERROR-LOOP guardrail).
|
|
1791
1836
|
|
|
1792
1837
|
Same normalized error as last turn -> increment the streak; a new error
|
|
1793
1838
|
or a clean (error-free) result -> reset. Only a SUSTAINED same-failure
|
|
1794
|
-
streak (despite the model's varied edits) trips the nudge.
|
|
1839
|
+
streak (despite the model's varied edits) trips the nudge.
|
|
1840
|
+
|
|
1841
|
+
result_error is the tool_result `is_error` flag when the client sent one.
|
|
1842
|
+
It beats the keyword heuristics in both directions — see
|
|
1843
|
+
_error_signature_for_result. The caller has always computed this flag;
|
|
1844
|
+
it just was not passed here, so reading a file containing the word
|
|
1845
|
+
`Exception` three times looked exactly like failing three times."""
|
|
1795
1846
|
if not PROXY_ERROR_LOOP:
|
|
1796
1847
|
return
|
|
1797
|
-
sig =
|
|
1848
|
+
sig = _error_signature_for_result(latest_result_text or "", result_error)
|
|
1798
1849
|
if sig and sig == self.last_error_signature:
|
|
1799
1850
|
self.error_signature_streak += 1
|
|
1800
1851
|
elif sig:
|
|
@@ -6773,7 +6824,7 @@ def _record_last_assistant_tool_calls(
|
|
|
6773
6824
|
if _flags:
|
|
6774
6825
|
_latest_err = any(_flags)
|
|
6775
6826
|
break
|
|
6776
|
-
monitor.note_tool_result_error(_latest_tr)
|
|
6827
|
+
monitor.note_tool_result_error(_latest_tr, _latest_err)
|
|
6777
6828
|
tool_fingerprints = []
|
|
6778
6829
|
tool_targets: dict[str, str] = {}
|
|
6779
6830
|
assistant_had_text = False # Fix B: did the last assistant turn emit prose?
|