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 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 75-behavior native contract; 67 behaviors
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`.
@@ -1 +1 @@
1
- {"schema_version":"1.0","source_revision":"git:ef170d59a802ce59a82fd5cae23c0adaff912d8a","source_dirty":false,"artifact_sha256":"sha256:60ff6f473f030f3a5cd5c2db430f866898607b9f1c205f55ed68abcc2eff1b0d"}
1
+ {"schema_version":"1.0","source_revision":"git:1f78926ebc463fed5e2d7a0f22f49c9569171350","source_dirty":false,"artifact_sha256":"sha256:46543a71fca8edab43c1a8ce3259ec7459bc8e31cdeec7f5028c049d7680350a"}
@@ -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
- return executeProjectEvalCommand([
5143
+ const prefixFlags = [
5128
5144
  ...(specialPrefix?.model === undefined
5129
5145
  ? []
5130
5146
  : ['--model', specialPrefix.model]),
5131
- ...special.args.slice(1),
5132
- ], io, dependencies.projectEval, process.cwd(), signal);
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') {
@@ -14,6 +14,8 @@ export interface EvalRuntimeFactoryOptions {
14
14
  cwd: string;
15
15
  configRoot: string;
16
16
  home: string;
17
+ provider?: string;
18
+ providerProfile?: string;
17
19
  model?: string;
18
20
  maxTurns: number;
19
21
  pluginDirectories?: readonly string[];
@@ -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