@miller-tech/uap 2.1.7 → 2.11.1
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/README.md +7 -6
- package/config/capacity-policy.json +32 -0
- package/config/classify-thresholds.json +9 -0
- package/config/supervise-policy.json +13 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/bin/cli.js +87 -2
- package/dist/bin/cli.js.map +1 -1
- package/dist/capacity/policy.d.ts +67 -0
- package/dist/capacity/policy.d.ts.map +1 -0
- package/dist/capacity/policy.js +133 -0
- package/dist/capacity/policy.js.map +1 -0
- package/dist/capacity/probe.d.ts +23 -0
- package/dist/capacity/probe.d.ts.map +1 -0
- package/dist/capacity/probe.js +93 -0
- package/dist/capacity/probe.js.map +1 -0
- package/dist/classify/baseline.d.ts +24 -0
- package/dist/classify/baseline.d.ts.map +1 -0
- package/dist/classify/baseline.js +140 -0
- package/dist/classify/baseline.js.map +1 -0
- package/dist/classify/index.d.ts +30 -0
- package/dist/classify/index.d.ts.map +1 -0
- package/dist/classify/index.js +84 -0
- package/dist/classify/index.js.map +1 -0
- package/dist/classify/shadow.d.ts +34 -0
- package/dist/classify/shadow.d.ts.map +1 -0
- package/dist/classify/shadow.js +33 -0
- package/dist/classify/shadow.js.map +1 -0
- package/dist/classify/types.d.ts +64 -0
- package/dist/classify/types.d.ts.map +1 -0
- package/dist/classify/types.js +37 -0
- package/dist/classify/types.js.map +1 -0
- package/dist/cli/classify.d.ts +24 -0
- package/dist/cli/classify.d.ts.map +1 -0
- package/dist/cli/classify.js +94 -0
- package/dist/cli/classify.js.map +1 -0
- package/dist/cli/deliver.d.ts.map +1 -1
- package/dist/cli/deliver.js +26 -0
- package/dist/cli/deliver.js.map +1 -1
- package/dist/cli/doctor.d.ts +9 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +49 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/review.d.ts +12 -0
- package/dist/cli/review.d.ts.map +1 -0
- package/dist/cli/review.js +118 -0
- package/dist/cli/review.js.map +1 -0
- package/dist/cli/supervise.d.ts +8 -0
- package/dist/cli/supervise.d.ts.map +1 -0
- package/dist/cli/supervise.js +76 -0
- package/dist/cli/supervise.js.map +1 -0
- package/dist/delivery/convergence-loop.d.ts +8 -0
- package/dist/delivery/convergence-loop.d.ts.map +1 -1
- package/dist/delivery/convergence-loop.js +1 -0
- package/dist/delivery/convergence-loop.js.map +1 -1
- package/dist/delivery/delivery-result.d.ts.map +1 -1
- package/dist/delivery/delivery-result.js +5 -0
- package/dist/delivery/delivery-result.js.map +1 -1
- package/dist/delivery/gate-evidence.d.ts +143 -0
- package/dist/delivery/gate-evidence.d.ts.map +1 -0
- package/dist/delivery/gate-evidence.js +239 -0
- package/dist/delivery/gate-evidence.js.map +1 -0
- package/dist/delivery/index.d.ts +1 -0
- package/dist/delivery/index.d.ts.map +1 -1
- package/dist/delivery/index.js +1 -0
- package/dist/delivery/index.js.map +1 -1
- package/dist/evals/routing-corpus.d.ts +35 -0
- package/dist/evals/routing-corpus.d.ts.map +1 -0
- package/dist/evals/routing-corpus.js +142 -0
- package/dist/evals/routing-corpus.js.map +1 -0
- package/dist/evals/routing-eval.d.ts +104 -0
- package/dist/evals/routing-eval.d.ts.map +1 -0
- package/dist/evals/routing-eval.js +231 -0
- package/dist/evals/routing-eval.js.map +1 -0
- package/dist/evals/tfidf.d.ts +35 -0
- package/dist/evals/tfidf.d.ts.map +1 -0
- package/dist/evals/tfidf.js +132 -0
- package/dist/evals/tfidf.js.map +1 -0
- package/dist/review/prepass.d.ts +88 -0
- package/dist/review/prepass.d.ts.map +1 -0
- package/dist/review/prepass.js +428 -0
- package/dist/review/prepass.js.map +1 -0
- package/dist/review/visual-captures.d.ts +60 -0
- package/dist/review/visual-captures.d.ts.map +1 -0
- package/dist/review/visual-captures.js +222 -0
- package/dist/review/visual-captures.js.map +1 -0
- package/dist/supervise/assess.d.ts +73 -0
- package/dist/supervise/assess.d.ts.map +1 -0
- package/dist/supervise/assess.js +215 -0
- package/dist/supervise/assess.js.map +1 -0
- package/dist/supervise/config.d.ts +13 -0
- package/dist/supervise/config.d.ts.map +1 -0
- package/dist/supervise/config.js +81 -0
- package/dist/supervise/config.js.map +1 -0
- package/dist/supervise/loop.d.ts +78 -0
- package/dist/supervise/loop.d.ts.map +1 -0
- package/dist/supervise/loop.js +311 -0
- package/dist/supervise/loop.js.map +1 -0
- package/dist/supervise/observe.d.ts +31 -0
- package/dist/supervise/observe.d.ts.map +1 -0
- package/dist/supervise/observe.js +172 -0
- package/dist/supervise/observe.js.map +1 -0
- package/dist/supervise/policy.d.ts +16 -0
- package/dist/supervise/policy.d.ts.map +1 -0
- package/dist/supervise/policy.js +147 -0
- package/dist/supervise/policy.js.map +1 -0
- package/dist/supervise/types.d.ts +109 -0
- package/dist/supervise/types.d.ts.map +1 -0
- package/dist/supervise/types.js +11 -0
- package/dist/supervise/types.js.map +1 -0
- package/docs/INDEX.md +15 -4
- package/docs/architecture/adr/0001-automode-risk-floor.md +75 -0
- package/docs/architecture/adr/0002-evidence-bound-ship.md +81 -0
- package/docs/guides/CAPACITY_POLICY.md +99 -0
- package/docs/performance/automode-risk-calibration.md +72 -0
- package/docs/performance/reliability-ladder.md +78 -0
- package/docs/plans/system1-uplift-2026-09-18.md +190 -0
- package/docs/reference/automode-risk.md +134 -0
- package/docs/reference/evidence-bound-ship.md +146 -0
- package/docs/reference/review-prepass.md +77 -0
- package/docs/reference/routing-evals.md +71 -0
- package/docs/reference/semantic-supervisor.md +140 -0
- package/docs/reference/system1-classifier.md +103 -0
- package/docs/reference/visual-captures.md +113 -0
- package/package.json +5 -3
- package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
- package/src/policies/enforcers/__pycache__/expert_review_required.cpython-312.pyc +0 -0
- package/src/policies/enforcers/__pycache__/quality_metrics_gate.cpython-312.pyc +0 -0
- package/src/policies/enforcers/enforcement_self_protect.py +25 -2
- package/src/policies/enforcers/evidence_bound_ship.py +257 -0
- package/src/policies/enforcers/expert_review_required.py +120 -0
- package/src/policies/schemas/policies/evidence-bound-ship.md +106 -0
- package/src/policies/schemas/policies/visual-verification.md +8 -0
- 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 +782 -19
- package/tools/agents/scripts/project_telemetry.py +52 -0
- package/tools/agents/scripts/tool_risk.py +789 -0
- package/tools/agents/scripts/tool_risk_calibrate.py +255 -0
- package/tools/agents/tests/fixtures/tool_risk_cases.json +124 -0
- package/tools/agents/tests/test_enforcer_escape_hatches.py +13 -0
- package/tools/agents/tests/test_gate_evidence.py +56 -0
- package/tools/agents/tests/test_tool_risk.py +521 -0
- package/tools/agents/tests/test_verbatim_compact.py +629 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shadow-mode logging (uplift §6 risk mitigation): the classifier assesses,
|
|
3
|
+
* heuristics decide, divergence is logged. Promotion to active only after
|
|
4
|
+
* measured agreement.
|
|
5
|
+
*
|
|
6
|
+
* Privacy: the raw state text is NEVER persisted — only a content hash, the
|
|
7
|
+
* word count, and the assessment (no raw-text surface; note the hash is
|
|
8
|
+
* equality-revealing for low-entropy boilerplate states — acceptable for a
|
|
9
|
+
* local-only join key). Calibration replays join outcome labels by hash;
|
|
10
|
+
* the text itself stays in the session where it was produced. The log is
|
|
11
|
+
* local-only (.uap/, git-ignored, mode 0600).
|
|
12
|
+
*/
|
|
13
|
+
import { appendFileSync, mkdirSync } from 'fs';
|
|
14
|
+
import { createHash } from 'crypto';
|
|
15
|
+
import { dirname, join } from 'path';
|
|
16
|
+
export function shadowLogPath(projectDir) {
|
|
17
|
+
return join(projectDir, '.uap', 'classify-shadow.jsonl');
|
|
18
|
+
}
|
|
19
|
+
export function recordShadow(projectDir, state, questions, result, opts = {}) {
|
|
20
|
+
const logPath = opts.logPath ?? shadowLogPath(projectDir);
|
|
21
|
+
const rec = {
|
|
22
|
+
v: 1,
|
|
23
|
+
ts: new Date().toISOString(),
|
|
24
|
+
stateHash: createHash('sha256').update(state).digest('hex'),
|
|
25
|
+
wordCount: state.split(/\s+/).filter(Boolean).length,
|
|
26
|
+
questions: questions.map((q) => q.name),
|
|
27
|
+
result,
|
|
28
|
+
...(opts.heuristicDecision !== undefined ? { heuristicDecision: opts.heuristicDecision } : {}),
|
|
29
|
+
};
|
|
30
|
+
mkdirSync(dirname(logPath), { recursive: true });
|
|
31
|
+
appendFileSync(logPath, JSON.stringify(rec) + '\n', { encoding: 'utf-8', mode: 0o600 });
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=shadow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadow.js","sourceRoot":"","sources":["../../src/classify/shadow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAmBrC,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,OAAO,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,uBAAuB,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,UAAkB,EAClB,KAAa,EACb,SAAqB,EACrB,MAAoB,EACpB,OAA0E,EAAE;IAE5E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAiB;QACxB,CAAC,EAAE,CAAC;QACJ,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3D,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM;QACpD,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACvC,MAAM;QACN,GAAG,CAAC,IAAI,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/F,CAAC;IACF,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1F,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System-1 classifier types (uplift §6).
|
|
3
|
+
*
|
|
4
|
+
* One interface for every Wave 1 consumer (semantic supervisor 1.1,
|
|
5
|
+
* compaction 1.2, AutoMode 1.3): assess a state against named questions,
|
|
6
|
+
* get back calibrated-looking values with probability + confidence. The
|
|
7
|
+
* backend is pluggable (baseline TF-IDF today; embedding + trained head
|
|
8
|
+
* later) so policy code never changes when the model does.
|
|
9
|
+
*
|
|
10
|
+
* Question shapes mirror the noul/score/choice families so Jev-compatible
|
|
11
|
+
* fixtures work unchanged.
|
|
12
|
+
*/
|
|
13
|
+
export type QuestionKind = 'noul' | 'score' | 'choice';
|
|
14
|
+
export interface Question {
|
|
15
|
+
/** Stable identifier, e.g. "escalation-risk". */
|
|
16
|
+
name: string;
|
|
17
|
+
kind: QuestionKind;
|
|
18
|
+
/** Natural-language description of what is being assessed. */
|
|
19
|
+
prompt: string;
|
|
20
|
+
/** kind=choice: the allowed values. */
|
|
21
|
+
options?: string[];
|
|
22
|
+
}
|
|
23
|
+
/** noul → boolean; score → 1..5 integer; choice → one of options. */
|
|
24
|
+
export type AssessmentValue = boolean | number | string;
|
|
25
|
+
export interface Assessment {
|
|
26
|
+
value: AssessmentValue;
|
|
27
|
+
/** The backend's belief in the returned value, 0..1. Semantics per kind:
|
|
28
|
+
* noul = probability the answer is true; score = 1 − normalized rounding
|
|
29
|
+
* distance; choice = winning score's share of the total. A calibrated
|
|
30
|
+
* head replaces these approximations with true calibrated probabilities;
|
|
31
|
+
* consumers must only rely on 0..1 ordering. */
|
|
32
|
+
probability: number;
|
|
33
|
+
/** Confidence in the assessment itself, 0..1 (low → defer to heuristics). */
|
|
34
|
+
confidence: number;
|
|
35
|
+
/** Which backend produced this. */
|
|
36
|
+
backend: string;
|
|
37
|
+
}
|
|
38
|
+
export type AssessResult = Record<string, Assessment>;
|
|
39
|
+
export interface ClassifierBackend {
|
|
40
|
+
readonly name: string;
|
|
41
|
+
assess(state: string, questions: Question[]): AssessResult;
|
|
42
|
+
}
|
|
43
|
+
/** Thresholds ship as reviewed policy config, never as model output
|
|
44
|
+
* (uplift §6). A noul question is decided true iff probability >= tau and
|
|
45
|
+
* confidence >= confidenceFloor; below the floor the caller must fall back
|
|
46
|
+
* to its heuristic. `tau` applies to noul questions only — score/choice
|
|
47
|
+
* values are returned directly and gated by confidenceFloor alone. */
|
|
48
|
+
export interface QuestionThresholds {
|
|
49
|
+
/** noul only; defaults to 0.5. */
|
|
50
|
+
tau?: number;
|
|
51
|
+
confidenceFloor: number;
|
|
52
|
+
}
|
|
53
|
+
export interface ThresholdConfig {
|
|
54
|
+
version: 1;
|
|
55
|
+
questions: Record<string, QuestionThresholds>;
|
|
56
|
+
}
|
|
57
|
+
export declare const DEFAULT_THRESHOLDS: Required<QuestionThresholds>;
|
|
58
|
+
/** Built-in v1 question registry — one dimension end-to-end per the plan's
|
|
59
|
+
* scope discipline: escalation risk, the question the 1.1 supervisor asks
|
|
60
|
+
* first. Consumers may define their own; these are the shipped defaults. */
|
|
61
|
+
export declare const BUILTIN_QUESTIONS: Question[];
|
|
62
|
+
export declare class ClassifyError extends Error {
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/classify/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEvD,MAAM,WAAW,QAAQ;IACvB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;IACnB,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qEAAqE;AACrE,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,eAAe,CAAC;IACvB;;;;oDAIgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC;CAC5D;AAED;;;;sEAIsE;AACtE,MAAM,WAAW,kBAAkB;IACjC,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC/C;AAED,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB,CAAsC,CAAC;AAEnG;;4EAE4E;AAC5E,eAAO,MAAM,iBAAiB,EAAE,QAAQ,EAiBvC,CAAC;AAEF,qBAAa,aAAc,SAAQ,KAAK;CAAG"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System-1 classifier types (uplift §6).
|
|
3
|
+
*
|
|
4
|
+
* One interface for every Wave 1 consumer (semantic supervisor 1.1,
|
|
5
|
+
* compaction 1.2, AutoMode 1.3): assess a state against named questions,
|
|
6
|
+
* get back calibrated-looking values with probability + confidence. The
|
|
7
|
+
* backend is pluggable (baseline TF-IDF today; embedding + trained head
|
|
8
|
+
* later) so policy code never changes when the model does.
|
|
9
|
+
*
|
|
10
|
+
* Question shapes mirror the noul/score/choice families so Jev-compatible
|
|
11
|
+
* fixtures work unchanged.
|
|
12
|
+
*/
|
|
13
|
+
export const DEFAULT_THRESHOLDS = { tau: 0.5, confidenceFloor: 0.3 };
|
|
14
|
+
/** Built-in v1 question registry — one dimension end-to-end per the plan's
|
|
15
|
+
* scope discipline: escalation risk, the question the 1.1 supervisor asks
|
|
16
|
+
* first. Consumers may define their own; these are the shipped defaults. */
|
|
17
|
+
export const BUILTIN_QUESTIONS = [
|
|
18
|
+
{
|
|
19
|
+
name: 'escalation-risk',
|
|
20
|
+
kind: 'noul',
|
|
21
|
+
prompt: 'Does this state need escalation to a stronger technique or human review?',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'task-risk',
|
|
25
|
+
kind: 'score',
|
|
26
|
+
prompt: 'How risky is this operation (1 = trivially safe, 5 = irreversible/destructive)?',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'action-class',
|
|
30
|
+
kind: 'choice',
|
|
31
|
+
prompt: 'What kind of action does this state call for?',
|
|
32
|
+
options: ['proceed', 'verify-first', 'escalate', 'stop'],
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
export class ClassifyError extends Error {
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/classify/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAsDH,MAAM,CAAC,MAAM,kBAAkB,GAAiC,EAAE,GAAG,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC;AAEnG;;4EAE4E;AAC5E,MAAM,CAAC,MAAM,iBAAiB,GAAe;IAC3C;QACE,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,0EAA0E;KACnF;IACD;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,iFAAiF;KAC1F;IACD;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,+CAA+C;QACvD,OAAO,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,CAAC;KACzD;CACF,CAAC;AAEF,MAAM,OAAO,aAAc,SAAQ,KAAK;CAAG"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `uap classify` — the System-1 classifier surface (uplift §6).
|
|
3
|
+
*
|
|
4
|
+
* uap classify "<state text>" # all built-in questions
|
|
5
|
+
* uap classify "<state>" --question escalation-risk
|
|
6
|
+
* uap classify "<state>" --shadow # also append to the shadow log
|
|
7
|
+
* uap classify --bench [n] # latency check (p95 budget: 50ms)
|
|
8
|
+
* uap classify "<state>" --json
|
|
9
|
+
*
|
|
10
|
+
* Shadow mode is the promotion path: classifier assesses, heuristics decide,
|
|
11
|
+
* divergence logged; a trained head is promoted only after measured agreement
|
|
12
|
+
* on the shadow data. Advisory — always exit 0 unless usage is wrong.
|
|
13
|
+
*/
|
|
14
|
+
export interface ClassifyOptions {
|
|
15
|
+
projectDir: string;
|
|
16
|
+
state?: string;
|
|
17
|
+
question?: string;
|
|
18
|
+
json?: boolean;
|
|
19
|
+
shadow?: boolean;
|
|
20
|
+
bench?: number;
|
|
21
|
+
thresholds?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function classifyCommand(options: ClassifyOptions): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/cli/classify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAgBH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAYD,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC7E"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `uap classify` — the System-1 classifier surface (uplift §6).
|
|
3
|
+
*
|
|
4
|
+
* uap classify "<state text>" # all built-in questions
|
|
5
|
+
* uap classify "<state>" --question escalation-risk
|
|
6
|
+
* uap classify "<state>" --shadow # also append to the shadow log
|
|
7
|
+
* uap classify --bench [n] # latency check (p95 budget: 50ms)
|
|
8
|
+
* uap classify "<state>" --json
|
|
9
|
+
*
|
|
10
|
+
* Shadow mode is the promotion path: classifier assesses, heuristics decide,
|
|
11
|
+
* divergence logged; a trained head is promoted only after measured agreement
|
|
12
|
+
* on the shadow data. Advisory — always exit 0 unless usage is wrong.
|
|
13
|
+
*/
|
|
14
|
+
import chalk from 'chalk';
|
|
15
|
+
import { performance } from 'perf_hooks';
|
|
16
|
+
import { assessWithThresholds, defaultBackend, loadThresholds, recordShadow, BUILTIN_QUESTIONS, ClassifyError, } from '../classify/index.js';
|
|
17
|
+
const P95_BUDGET_MS = 50;
|
|
18
|
+
function pickQuestions(name) {
|
|
19
|
+
if (!name)
|
|
20
|
+
return BUILTIN_QUESTIONS;
|
|
21
|
+
const q = BUILTIN_QUESTIONS.find((x) => x.name === name);
|
|
22
|
+
if (!q) {
|
|
23
|
+
const known = BUILTIN_QUESTIONS.map((x) => x.name).join(', ');
|
|
24
|
+
throw new ClassifyError(`unknown question "${name}" — built-ins: ${known}`);
|
|
25
|
+
}
|
|
26
|
+
return [q];
|
|
27
|
+
}
|
|
28
|
+
export async function classifyCommand(options) {
|
|
29
|
+
if (options.bench !== undefined) {
|
|
30
|
+
// Latency self-check needs no threshold config — don't fail on one.
|
|
31
|
+
const n = Number.isFinite(options.bench) && options.bench > 0 ? Math.min(options.bench, 100_000) : 200;
|
|
32
|
+
runBench(n, options.json);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const thresholds = loadThresholds(options.projectDir, options.thresholds);
|
|
36
|
+
if (!options.state) {
|
|
37
|
+
throw new ClassifyError('state text is required (or use --bench)');
|
|
38
|
+
}
|
|
39
|
+
const questions = pickQuestions(options.question);
|
|
40
|
+
const backend = defaultBackend();
|
|
41
|
+
const t0 = performance.now();
|
|
42
|
+
const decided = assessWithThresholds(options.state, questions, thresholds, backend);
|
|
43
|
+
const ms = performance.now() - t0;
|
|
44
|
+
if (options.shadow) {
|
|
45
|
+
// Shadow logs the raw backend result (pre-threshold) — calibration needs
|
|
46
|
+
// probabilities, not decisions.
|
|
47
|
+
recordShadow(options.projectDir, options.state, questions, backend.assess(options.state, questions));
|
|
48
|
+
}
|
|
49
|
+
if (options.json) {
|
|
50
|
+
console.log(JSON.stringify({ reportVersion: 1, backend: backend.name, ms: round(ms), assessments: decided }, null, 2));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
console.log(chalk.bold(`classify (${backend.name}, ${round(ms)}ms)`));
|
|
54
|
+
for (const d of decided) {
|
|
55
|
+
const defer = d.defer ? chalk.yellow(' [defer: below confidence floor — heuristic decides]') : '';
|
|
56
|
+
console.log(` ${d.name}: ${chalk.cyan(String(d.value))} p=${d.probability.toFixed(3)} conf=${d.confidence.toFixed(3)}${defer}`);
|
|
57
|
+
}
|
|
58
|
+
if (options.shadow) {
|
|
59
|
+
console.log(chalk.dim(' shadow-logged to .uap/classify-shadow.jsonl'));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function round(n) {
|
|
63
|
+
return Math.round(n * 100) / 100;
|
|
64
|
+
}
|
|
65
|
+
/** Latency self-check: the §6 budget is <50ms p95 per assessment batch. */
|
|
66
|
+
function runBench(iterations, json) {
|
|
67
|
+
const backend = defaultBackend();
|
|
68
|
+
const sample = 'The deliver mission failed with SIGABRT after the KV cache exceeded the VBR ' +
|
|
69
|
+
'budget; the service is stuck restarting and the gate is blocked on missing evidence.';
|
|
70
|
+
const lat = [];
|
|
71
|
+
for (let i = 0; i < iterations; i++) {
|
|
72
|
+
const t0 = performance.now();
|
|
73
|
+
backend.assess(sample, BUILTIN_QUESTIONS);
|
|
74
|
+
lat.push(performance.now() - t0);
|
|
75
|
+
}
|
|
76
|
+
lat.sort((a, b) => a - b);
|
|
77
|
+
const p50 = lat[Math.floor(lat.length * 0.5)];
|
|
78
|
+
const p95 = lat[Math.floor(lat.length * 0.95)];
|
|
79
|
+
const p99 = lat[Math.min(lat.length - 1, Math.floor(lat.length * 0.99))];
|
|
80
|
+
const ok = p95 < P95_BUDGET_MS;
|
|
81
|
+
if (json) {
|
|
82
|
+
console.log(JSON.stringify({
|
|
83
|
+
reportVersion: 1,
|
|
84
|
+
bench: { n: iterations, p50: round(p50), p95: round(p95), p99: round(p99), budgetMs: P95_BUDGET_MS, pass: ok },
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
console.log(`classify bench n=${iterations}: p50=${round(p50)}ms p95=${round(p95)}ms p99=${round(p99)}ms ` +
|
|
89
|
+
`(budget p95<${P95_BUDGET_MS}ms) — ${ok ? 'PASS' : 'FAIL'}`);
|
|
90
|
+
}
|
|
91
|
+
if (!ok)
|
|
92
|
+
process.exitCode = 1;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/cli/classify.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deliver.d.ts","sourceRoot":"","sources":["../../src/cli/deliver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA6BH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAuBzD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG;IAAE,iBAAiB,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAQhF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAEV;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,OAAO,CAAC;CAC5B,GAAG,OAAO,CAMV;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAMV;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,MAAM,GAAG,IAAI,CAIhB;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAChD,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,wBAAwB,EAAE,OAAO,CAAC;CACnC,GAAG,OAAO,CAMV;AAED;;;;;;GAMG;AACH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,OAAO,GAAG,SAAS,EACzB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAIT;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,EACnD,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GACvB,MAAM,GAAG,IAAI,CAIf;AAID,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AA8C7E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,GAAE,MAAM,MAAM,GAAG,SAA2B,GACnD,MAAM,CAMR;AAyBD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"deliver.d.ts","sourceRoot":"","sources":["../../src/cli/deliver.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/deliver.js
CHANGED
|
@@ -277,6 +277,7 @@ import { readCuratedIdeas } from './ideate.js';
|
|
|
277
277
|
import { createEscalationController, defaultEscalationLadder, DEFAULT_STAGNATION_TURNS } from '../delivery/escalation.js';
|
|
278
278
|
import { FilePracticeStore, defaultPracticePath, extractKeywords, retrievePracticesSemantic, } from '../delivery/practice.js';
|
|
279
279
|
import { detectRungs, mergeRedetectedRungs, runLadder, runTieredLadder, tierOf, TIER_ORDER, demoteBaselineFailures, baselineRegressions } from '../delivery/verifier-ladder.js';
|
|
280
|
+
import { recordGateEvidence, gateOutcomesFromResult } from '../delivery/gate-evidence.js';
|
|
280
281
|
import { runDeployDevLadder } from '../delivery/deploy-dev-gate.js';
|
|
281
282
|
import { commitPushAndWatch } from '../delivery/ci-watcher.js';
|
|
282
283
|
import { snapshotTree, restoreTreeScoped, disposeSnapshot } from '../delivery/snapshot.js';
|
|
@@ -3873,6 +3874,31 @@ async function runDeliver(instruction, options) {
|
|
|
3873
3874
|
saveRunState(runState);
|
|
3874
3875
|
completeDeliveryTask(missionTask, result);
|
|
3875
3876
|
await recordDeliveryOutcome(instruction, projectRoot, result, model.id);
|
|
3877
|
+
// Gate evidence (uplift 1.4, evidence-bound-ship): bind this mission's green
|
|
3878
|
+
// gates to the HEAD they prove, so a later ship action must present evidence
|
|
3879
|
+
// for THIS candidate commit. This is the single seam every runner kind
|
|
3880
|
+
// (single / phased / orchestrated / ci-reconverge) converges on with a final
|
|
3881
|
+
// `result`; gateOutcomesFromResult picks the LAST passing iteration (or the
|
|
3882
|
+
// baseline ladder run when the tree was already green). Fail-SOFT: evidence
|
|
3883
|
+
// emission must never break a mission — a warning is the whole failure mode.
|
|
3884
|
+
//
|
|
3885
|
+
// Accepted race: the last gate run and the `git rev-parse HEAD` inside
|
|
3886
|
+
// recordGateEvidence are not atomic — a concurrent commit landing between
|
|
3887
|
+
// them would bind evidence to a HEAD the gates did not see. The window is
|
|
3888
|
+
// milliseconds, in-process, and the dirty-tree check closes the common case
|
|
3889
|
+
// (the mission's own uncommitted writes); a deliberate cross-process commit
|
|
3890
|
+
// in that window is out of threat model for a local-only gate.
|
|
3891
|
+
if (result.success) {
|
|
3892
|
+
try {
|
|
3893
|
+
const gates = gateOutcomesFromResult(result, rungs);
|
|
3894
|
+
const evidencePath = recordGateEvidence(projectRoot, gates, { runId });
|
|
3895
|
+
if (!options.json)
|
|
3896
|
+
console.log(chalk.dim(` gate evidence: ${evidencePath}`));
|
|
3897
|
+
}
|
|
3898
|
+
catch (e) {
|
|
3899
|
+
console.warn(chalk.yellow(` ⚠ gate evidence not recorded: ${e.message}`));
|
|
3900
|
+
}
|
|
3901
|
+
}
|
|
3876
3902
|
// Close the HALO observe→learn loop: mine the trace tail for recurring
|
|
3877
3903
|
// failure patterns after every run — no operator step required.
|
|
3878
3904
|
if (isHaloTracingEnabled()) {
|