praxis-agent 0.68.0 → 0.69.0
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 +21 -1
- package/dist/build-identity.json +1 -1
- package/dist/cli-runtime.js +32 -3
- package/dist/evals/eval-contract.d.ts +2 -0
- package/dist/evals/held-out-qualification.d.ts +140 -0
- package/dist/evals/held-out-qualification.js +1061 -0
- package/dist/evals/project-eval-runner.d.ts +2 -0
- package/dist/evals/project-eval-runner.js +4 -0
- package/dist/evals/project-eval.d.ts +3 -1
- package/dist/evals/project-eval.js +16 -0
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -144,6 +144,26 @@ troubleshooting. Run `praxis --help` for the authoritative command surface.
|
|
|
144
144
|
safety-rate regression, every candidate verifier to be satisfied, and every
|
|
145
145
|
candidate `high` or `release` task to pass, and rejects incomplete safety
|
|
146
146
|
evidence.
|
|
147
|
+
- **Held-out qualification** — The explicit `praxis eval qualify` surface
|
|
148
|
+
preflights a pinned provider,
|
|
149
|
+
profile, and model, then runs the immutable held-out corpus as 36 local
|
|
150
|
+
Project Eval runs. Baseline-only results use `qualified: null`; candidate
|
|
151
|
+
claims require complete safe, comparable evidence, and unknown usage/cost
|
|
152
|
+
keeps optimization claims disabled. A bounded DeepSeek baseline for the
|
|
153
|
+
exact `anthropic/default/deepseek-v4-flash` pin completed 36/36 runs with
|
|
154
|
+
33/36 passes (91.7%) and 36/36 safety passes. The
|
|
155
|
+
`config-kit.add-json-output` run 3 failed closed with provider error
|
|
156
|
+
`Provider reported max_tokens with completed tool calls`. The
|
|
157
|
+
`config-kit.preserve-zero-values` run 2 and `task-store.fix-completed-filter`
|
|
158
|
+
run 3 failed closed with provider error `Provider transport failed`; their
|
|
159
|
+
terminal results do not establish the transport-error cause. All three were
|
|
160
|
+
non-safety failures with unknown usage/cost and unsatisfied or not-run
|
|
161
|
+
behavior verification.
|
|
162
|
+
Median/p95 turns were 5/7 and median/p95 duration was 28,653.5/52,197 ms.
|
|
163
|
+
The 33-run known-cost subtotal is USD 0.068322756, not a total. This
|
|
164
|
+
measures only that pinned 32,768-context/4,096-output configuration;
|
|
165
|
+
baseline-only evidence remains `qualified: null`, and no live-model quality
|
|
166
|
+
or optimization claim is established.
|
|
147
167
|
- **Local agent runtime** — C+ Quiet Operator responsive TUI with a linear
|
|
148
168
|
`❯` user / `⏺` assistant conversation, `✻` thinking activity, and `!` shell
|
|
149
169
|
composer grammar, compact stable tool rows, responsive density,
|
|
@@ -407,7 +427,7 @@ normal/low-capability full-frame p95 budgets of `<16.7/<33 ms`.
|
|
|
407
427
|
`npm run test:coverage` measures all production code under `src/**` with V8 and
|
|
408
428
|
enforces global floors of 79% statements, 70% branches, 85% functions, and 81% lines,
|
|
409
429
|
and rejects any production runtime module with zero covered statements (while allowing
|
|
410
|
-
type-only modules). `npm run test:fixtures` executes the
|
|
430
|
+
type-only modules). `npm run test:fixtures` executes the 76-behavior native contract; 68 behaviors
|
|
411
431
|
are qualified and 8 are explicitly excluded. Schema-v2 risk tiers and executable evidence dimensions
|
|
412
432
|
are enforced fail-closed. `npm run verify:fixture-contracts` performs the structural check and is part
|
|
413
433
|
of `npm run check`.
|
package/dist/build-identity.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"schema_version":"1.0","source_revision":"git:
|
|
1
|
+
{"schema_version":"1.0","source_revision":"git:1f78926ebc463fed5e2d7a0f22f49c9569171350","source_dirty":false,"artifact_sha256":"sha256:46543a71fca8edab43c1a8ce3259ec7459bc8e31cdeec7f5028c049d7680350a"}
|
package/dist/cli-runtime.js
CHANGED
|
@@ -2336,6 +2336,10 @@ const defaultPluginEvalRuntimeFactory = {
|
|
|
2336
2336
|
tools: [...options.allowedTools],
|
|
2337
2337
|
permissionMode: 'dontAsk',
|
|
2338
2338
|
...(options.model ? { model: options.model } : {}),
|
|
2339
|
+
...(options.provider ? { provider: options.provider } : {}),
|
|
2340
|
+
...(options.providerProfile
|
|
2341
|
+
? { providerProfile: options.providerProfile }
|
|
2342
|
+
: {}),
|
|
2339
2343
|
...(options.appendSystemPrompt
|
|
2340
2344
|
? { appendSystemPrompt: options.appendSystemPrompt }
|
|
2341
2345
|
: {}),
|
|
@@ -2368,6 +2372,10 @@ const defaultProjectEvalRuntimeFactory = {
|
|
|
2368
2372
|
cwd: options.cwd,
|
|
2369
2373
|
environment,
|
|
2370
2374
|
...(options.model === undefined ? {} : { model: options.model }),
|
|
2375
|
+
...(options.provider === undefined ? {} : { provider: options.provider }),
|
|
2376
|
+
...(options.providerProfile === undefined
|
|
2377
|
+
? {}
|
|
2378
|
+
: { profile: options.providerProfile }),
|
|
2371
2379
|
includeSettings: true,
|
|
2372
2380
|
includeProjectSettings: false,
|
|
2373
2381
|
});
|
|
@@ -5116,6 +5124,14 @@ async function execute(argv, io, dependencies, signal) {
|
|
|
5116
5124
|
io.stdout(PROJECT_EVAL_COMPARE_HELP);
|
|
5117
5125
|
return 0;
|
|
5118
5126
|
}
|
|
5127
|
+
if (special.args[1] === 'qualify' &&
|
|
5128
|
+
special.args
|
|
5129
|
+
.slice(2)
|
|
5130
|
+
.some((value) => value === '-h' || value === '--help')) {
|
|
5131
|
+
const { HELD_OUT_QUALIFICATION_HELP } = await import('./evals/held-out-qualification.js');
|
|
5132
|
+
io.stdout(HELD_OUT_QUALIFICATION_HELP);
|
|
5133
|
+
return 0;
|
|
5134
|
+
}
|
|
5119
5135
|
if (special.args
|
|
5120
5136
|
.slice(1)
|
|
5121
5137
|
.some((value) => value === '-h' || value === '--help')) {
|
|
@@ -5124,12 +5140,25 @@ async function execute(argv, io, dependencies, signal) {
|
|
|
5124
5140
|
}
|
|
5125
5141
|
if (!dependencies.projectEval)
|
|
5126
5142
|
throw new Error('Project eval unavailable');
|
|
5127
|
-
|
|
5143
|
+
const prefixFlags = [
|
|
5128
5144
|
...(specialPrefix?.model === undefined
|
|
5129
5145
|
? []
|
|
5130
5146
|
: ['--model', specialPrefix.model]),
|
|
5131
|
-
...
|
|
5132
|
-
|
|
5147
|
+
...(specialPrefix?.provider === undefined
|
|
5148
|
+
? []
|
|
5149
|
+
: ['--provider', specialPrefix.provider]),
|
|
5150
|
+
...(specialPrefix?.providerProfile === undefined
|
|
5151
|
+
? []
|
|
5152
|
+
: ['--profile', specialPrefix.providerProfile]),
|
|
5153
|
+
];
|
|
5154
|
+
if (special.args[1] === 'compare' && prefixFlags.length > 0)
|
|
5155
|
+
throw new Error('eval compare does not accept global provider, profile, or model options');
|
|
5156
|
+
const evalArgs = special.args[1] === 'qualify'
|
|
5157
|
+
? ['qualify', ...prefixFlags, ...special.args.slice(2)]
|
|
5158
|
+
: special.args[1] === 'compare'
|
|
5159
|
+
? ['compare', ...special.args.slice(2)]
|
|
5160
|
+
: [...prefixFlags, ...special.args.slice(1)];
|
|
5161
|
+
return executeProjectEvalCommand(evalArgs, io, dependencies.projectEval, process.cwd(), signal);
|
|
5133
5162
|
}
|
|
5134
5163
|
if ((special.args[0] === 'plugin' || special.args[0] === 'plugins') &&
|
|
5135
5164
|
special.args[1] === 'eval') {
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { type PraxisBuildIdentity } from '../platform/praxis-build-identity.js';
|
|
2
|
+
import { type ProjectEvalIdentity } from './project-eval-identity.js';
|
|
3
|
+
import { type ProjectEvalComparisonMetric } from './project-eval-comparison.js';
|
|
4
|
+
import type { ProjectEvalDependencies, ProjectEvalRunSummary } from './project-eval.js';
|
|
5
|
+
/**
|
|
6
|
+
* Qualification orchestration for the immutable held-out corpus.
|
|
7
|
+
*
|
|
8
|
+
* This module owns the qualification contract and evidence envelope; actual
|
|
9
|
+
* case execution remains in the Project Eval runner.
|
|
10
|
+
*/
|
|
11
|
+
export declare const HELD_OUT_QUALIFICATION_HELP = "Usage: praxis eval qualify [options] <corpus>\n\nQualify an explicitly pinned provider/model against the immutable held-out corpus.\n\nOptions:\n\nRequired:\n --provider <id> Provider identifier\n --profile <id> Provider profile identifier\n --model <id> Model identifier\n --confirm-held-out <id@sha256> Confirm the exact held-out corpus digest\n --run-verification Run the declared case verifiers\n --output-dir <dir> Write qualification artifacts here\n --allow-tools <rules> Grant gated tools; comma-separated and repeatable\n\nOptional:\n --baseline <qualification-result.json> Compare against a completed result\n --keep-temp Preserve temporary workspaces\n --json Print exactly one qualification JSON value\n --verbose Print run progress to stderr\n -h, --help Display help";
|
|
12
|
+
export interface HeldOutQualificationOptions {
|
|
13
|
+
corpus?: string;
|
|
14
|
+
provider?: string;
|
|
15
|
+
profile?: string;
|
|
16
|
+
model?: string;
|
|
17
|
+
confirmHeldOut?: string;
|
|
18
|
+
allowTools: string[];
|
|
19
|
+
runVerification: boolean;
|
|
20
|
+
outputDir?: string;
|
|
21
|
+
baseline?: string;
|
|
22
|
+
keepTemp: boolean;
|
|
23
|
+
json: boolean;
|
|
24
|
+
verbose: boolean;
|
|
25
|
+
help?: true;
|
|
26
|
+
}
|
|
27
|
+
/** Parse the strict, side-effect-free qualification command line. */
|
|
28
|
+
export declare function parseHeldOutQualificationOptions(argv: readonly string[]): HeldOutQualificationOptions;
|
|
29
|
+
export interface HeldOutQualificationAggregateReference {
|
|
30
|
+
repository: string;
|
|
31
|
+
path: string;
|
|
32
|
+
sha256: `sha256:${string}`;
|
|
33
|
+
identity_sha256: `sha256:${string}`;
|
|
34
|
+
}
|
|
35
|
+
export interface HeldOutQualificationRun {
|
|
36
|
+
repository: string;
|
|
37
|
+
case: string;
|
|
38
|
+
run: number;
|
|
39
|
+
passed: boolean;
|
|
40
|
+
safety_passed: boolean;
|
|
41
|
+
verifier_satisfied: boolean;
|
|
42
|
+
turns: number;
|
|
43
|
+
duration_ms: number;
|
|
44
|
+
usage_known: boolean;
|
|
45
|
+
cost_known: boolean;
|
|
46
|
+
usage: ProjectEvalRunSummary['usage'];
|
|
47
|
+
cost_usd: number | null;
|
|
48
|
+
identity: ProjectEvalIdentity;
|
|
49
|
+
}
|
|
50
|
+
export interface HeldOutQualificationCaseSummary {
|
|
51
|
+
repository: string;
|
|
52
|
+
case: string;
|
|
53
|
+
repetitions: number;
|
|
54
|
+
passed: number;
|
|
55
|
+
failed: number;
|
|
56
|
+
safety_passed: number;
|
|
57
|
+
safety_failed: number;
|
|
58
|
+
verifier_satisfied_runs: number;
|
|
59
|
+
verifier_unsatisfied_runs: number;
|
|
60
|
+
passed_all: boolean;
|
|
61
|
+
safety_passed_all: boolean;
|
|
62
|
+
verifier_satisfied: boolean;
|
|
63
|
+
}
|
|
64
|
+
export interface HeldOutQualificationResult {
|
|
65
|
+
schema_version: '1.0';
|
|
66
|
+
corpus: {
|
|
67
|
+
id: string;
|
|
68
|
+
version: number;
|
|
69
|
+
content_sha256: `sha256:${string}`;
|
|
70
|
+
repository_count: number;
|
|
71
|
+
task_count: number;
|
|
72
|
+
repetitions: number;
|
|
73
|
+
planned_run_count: number;
|
|
74
|
+
};
|
|
75
|
+
provider: string;
|
|
76
|
+
profile: string;
|
|
77
|
+
protocol: string;
|
|
78
|
+
model: string;
|
|
79
|
+
endpoint_sha256: `sha256:${string}`;
|
|
80
|
+
plan_sha256: `sha256:${string}`;
|
|
81
|
+
praxis_version: string;
|
|
82
|
+
build: PraxisBuildIdentity;
|
|
83
|
+
node_version: string;
|
|
84
|
+
platform: string;
|
|
85
|
+
architecture: string;
|
|
86
|
+
start: string;
|
|
87
|
+
duration_ms: number;
|
|
88
|
+
aggregates: readonly HeldOutQualificationAggregateReference[];
|
|
89
|
+
planned_run_count: number;
|
|
90
|
+
completed_run_count: number;
|
|
91
|
+
passed: number;
|
|
92
|
+
failed: number;
|
|
93
|
+
safety_passed: number;
|
|
94
|
+
safety_failed: number;
|
|
95
|
+
verifier_satisfied_runs: number;
|
|
96
|
+
verifier_unsatisfied_runs: number;
|
|
97
|
+
usage_known_runs: number;
|
|
98
|
+
usage_unknown_runs: number;
|
|
99
|
+
cost_known_runs: number;
|
|
100
|
+
cost_unknown_runs: number;
|
|
101
|
+
usage_totals: {
|
|
102
|
+
input_tokens: number;
|
|
103
|
+
output_tokens: number;
|
|
104
|
+
cache_read_input_tokens: number;
|
|
105
|
+
cache_creation_input_tokens: number;
|
|
106
|
+
web_search_requests: number;
|
|
107
|
+
} | null;
|
|
108
|
+
known_cost_total_usd: number | null;
|
|
109
|
+
median_turns: number;
|
|
110
|
+
p95_turns: number;
|
|
111
|
+
median_duration_ms: number;
|
|
112
|
+
p95_duration_ms: number;
|
|
113
|
+
cases: readonly HeldOutQualificationCaseSummary[];
|
|
114
|
+
runs: readonly HeldOutQualificationRun[];
|
|
115
|
+
baseline?: {
|
|
116
|
+
source_sha256: `sha256:${string}`;
|
|
117
|
+
summary: {
|
|
118
|
+
passed: number;
|
|
119
|
+
failed: number;
|
|
120
|
+
pass_rate: number;
|
|
121
|
+
safety_pass_rate: number;
|
|
122
|
+
planned_run_count: number;
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
regressions: readonly {
|
|
126
|
+
case: string;
|
|
127
|
+
run: number;
|
|
128
|
+
baseline_passed: boolean;
|
|
129
|
+
candidate_passed: boolean;
|
|
130
|
+
}[];
|
|
131
|
+
metric_deltas: Readonly<Record<string, ProjectEvalComparisonMetric<number | null>>>;
|
|
132
|
+
qualified: boolean | null;
|
|
133
|
+
optimization_claim_allowed: boolean;
|
|
134
|
+
}
|
|
135
|
+
export type HeldOutQualificationDependencies = ProjectEvalDependencies;
|
|
136
|
+
export declare function executeHeldOutQualificationCommand(argv: readonly string[], io: {
|
|
137
|
+
stdout(message: string): void;
|
|
138
|
+
stderr(message: string): void;
|
|
139
|
+
}, dependencies: HeldOutQualificationDependencies, callerCwd?: string, signal?: AbortSignal): Promise<number>;
|
|
140
|
+
//# sourceMappingURL=held-out-qualification.d.ts.map
|