@principles/pd-cli 1.152.12 → 1.152.14
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/commands/candidate.d.ts.map +1 -1
- package/dist/commands/candidate.js +34 -7
- package/dist/commands/candidate.js.map +1 -1
- package/dist/commands/diagnose.d.ts.map +1 -1
- package/dist/commands/diagnose.js +23 -7
- package/dist/commands/diagnose.js.map +1 -1
- package/dist/commands/pain-retry.d.ts.map +1 -1
- package/dist/commands/pain-retry.js +21 -7
- package/dist/commands/pain-retry.js.map +1 -1
- package/package.json +13 -7
- package/CHANGELOG.md +0 -23
- package/dist/commands/__tests__/intent-flag-wiring.test.d.ts +0 -9
- package/dist/commands/__tests__/intent-flag-wiring.test.d.ts.map +0 -1
- package/dist/commands/__tests__/intent-flag-wiring.test.js +0 -237
- package/dist/commands/__tests__/intent-flag-wiring.test.js.map +0 -1
- package/dist/commands/__tests__/legacy-cleanup.test.d.ts +0 -18
- package/dist/commands/__tests__/legacy-cleanup.test.d.ts.map +0 -1
- package/dist/commands/__tests__/legacy-cleanup.test.js +0 -467
- package/dist/commands/__tests__/legacy-cleanup.test.js.map +0 -1
- package/dist/commands/__tests__/mvp-smoke.test.d.ts +0 -15
- package/dist/commands/__tests__/mvp-smoke.test.d.ts.map +0 -1
- package/dist/commands/__tests__/mvp-smoke.test.js +0 -262
- package/dist/commands/__tests__/mvp-smoke.test.js.map +0 -1
- package/dist/commands/__tests__/pain-retry-maxTokens-flag.test.d.ts +0 -2
- package/dist/commands/__tests__/pain-retry-maxTokens-flag.test.d.ts.map +0 -1
- package/dist/commands/__tests__/pain-retry-maxTokens-flag.test.js +0 -60
- package/dist/commands/__tests__/pain-retry-maxTokens-flag.test.js.map +0 -1
- package/dist/commands/__tests__/rulecode-flag-wiring.test.d.ts +0 -21
- package/dist/commands/__tests__/rulecode-flag-wiring.test.d.ts.map +0 -1
- package/dist/commands/__tests__/rulecode-flag-wiring.test.js +0 -186
- package/dist/commands/__tests__/rulecode-flag-wiring.test.js.map +0 -1
- package/dist/commands/__tests__/rulecode-handler.test.d.ts +0 -16
- package/dist/commands/__tests__/rulecode-handler.test.d.ts.map +0 -1
- package/dist/commands/__tests__/rulecode-handler.test.js +0 -285
- package/dist/commands/__tests__/rulecode-handler.test.js.map +0 -1
- package/dist/commands/__tests__/run-rulehost-flag-wiring.test.d.ts +0 -24
- package/dist/commands/__tests__/run-rulehost-flag-wiring.test.d.ts.map +0 -1
- package/dist/commands/__tests__/run-rulehost-flag-wiring.test.js +0 -232
- package/dist/commands/__tests__/run-rulehost-flag-wiring.test.js.map +0 -1
- package/dist/commands/__tests__/runtime-activation-nextaction.test.d.ts +0 -15
- package/dist/commands/__tests__/runtime-activation-nextaction.test.d.ts.map +0 -1
- package/dist/commands/__tests__/runtime-activation-nextaction.test.js +0 -73
- package/dist/commands/__tests__/runtime-activation-nextaction.test.js.map +0 -1
- package/dist/commands/__tests__/runtime-probe-config.test.d.ts +0 -20
- package/dist/commands/__tests__/runtime-probe-config.test.d.ts.map +0 -1
- package/dist/commands/__tests__/runtime-probe-config.test.js +0 -389
- package/dist/commands/__tests__/runtime-probe-config.test.js.map +0 -1
- package/dist/commands/__tests__/telemetry-flag-wiring.test.d.ts +0 -9
- package/dist/commands/__tests__/telemetry-flag-wiring.test.d.ts.map +0 -1
- package/dist/commands/__tests__/telemetry-flag-wiring.test.js +0 -76
- package/dist/commands/__tests__/telemetry-flag-wiring.test.js.map +0 -1
- package/dist/commands/__tests__/version.test.d.ts +0 -2
- package/dist/commands/__tests__/version.test.d.ts.map +0 -1
- package/dist/commands/__tests__/version.test.js +0 -238
- package/dist/commands/__tests__/version.test.js.map +0 -1
- package/dist/commands/runtime-uat.guard.test.d.ts +0 -2
- package/dist/commands/runtime-uat.guard.test.d.ts.map +0 -1
- package/dist/commands/runtime-uat.guard.test.js +0 -153
- package/dist/commands/runtime-uat.guard.test.js.map +0 -1
- package/dist/services/__tests__/cli-output.test.d.ts +0 -18
- package/dist/services/__tests__/cli-output.test.d.ts.map +0 -1
- package/dist/services/__tests__/cli-output.test.js +0 -103
- package/dist/services/__tests__/cli-output.test.js.map +0 -1
- package/dist/services/__tests__/evaluator-runner-deps.test.d.ts +0 -2
- package/dist/services/__tests__/evaluator-runner-deps.test.d.ts.map +0 -1
- package/dist/services/__tests__/evaluator-runner-deps.test.js +0 -343
- package/dist/services/__tests__/evaluator-runner-deps.test.js.map +0 -1
- package/dist/services/__tests__/rulehost-readiness.test.d.ts +0 -2
- package/dist/services/__tests__/rulehost-readiness.test.d.ts.map +0 -1
- package/dist/services/__tests__/rulehost-readiness.test.js +0 -311
- package/dist/services/__tests__/rulehost-readiness.test.js.map +0 -1
- package/dist/services/__tests__/runtime-adapter-resolver.test.d.ts +0 -18
- package/dist/services/__tests__/runtime-adapter-resolver.test.d.ts.map +0 -1
- package/dist/services/__tests__/runtime-adapter-resolver.test.js +0 -673
- package/dist/services/__tests__/runtime-adapter-resolver.test.js.map +0 -1
- package/dist/utils/production-workspace-guard.test.d.ts +0 -2
- package/dist/utils/production-workspace-guard.test.d.ts.map +0 -1
- package/dist/utils/production-workspace-guard.test.js +0 -137
- package/dist/utils/production-workspace-guard.test.js.map +0 -1
- package/scripts/llm-dogfood.ts +0 -456
- package/scripts/migrate-illegal-expected-decision.ts +0 -252
- package/src/commands/__tests__/intent-flag-wiring.test.ts +0 -282
- package/src/commands/__tests__/legacy-cleanup.test.ts +0 -602
- package/src/commands/__tests__/mvp-smoke.test.ts +0 -300
- package/src/commands/__tests__/pain-retry-maxTokens-flag.test.ts +0 -73
- package/src/commands/__tests__/rulecode-flag-wiring.test.ts +0 -237
- package/src/commands/__tests__/rulecode-handler.test.ts +0 -369
- package/src/commands/__tests__/run-rulehost-flag-wiring.test.ts +0 -292
- package/src/commands/__tests__/runtime-activation-nextaction.test.ts +0 -81
- package/src/commands/__tests__/runtime-probe-config.test.ts +0 -432
- package/src/commands/__tests__/telemetry-flag-wiring.test.ts +0 -84
- package/src/commands/__tests__/version.test.ts +0 -251
- package/src/commands/admission-gate.ts +0 -30
- package/src/commands/artifact.ts +0 -82
- package/src/commands/build-trajectory-evidence.ts +0 -298
- package/src/commands/candidate.ts +0 -1250
- package/src/commands/codex-ingest-catchup.ts +0 -114
- package/src/commands/codex-ingest-quarantine.ts +0 -127
- package/src/commands/codex-reconcile.ts +0 -84
- package/src/commands/codex-setup.ts +0 -476
- package/src/commands/codex-worker.ts +0 -185
- package/src/commands/command-helpers.ts +0 -24
- package/src/commands/config-doctor.ts +0 -193
- package/src/commands/console.ts +0 -797
- package/src/commands/context.ts +0 -72
- package/src/commands/demo-story-a.ts +0 -241
- package/src/commands/diagnose.ts +0 -756
- package/src/commands/errors-list.ts +0 -441
- package/src/commands/evolution-tasks-list.ts +0 -48
- package/src/commands/evolution-tasks-show.ts +0 -62
- package/src/commands/flow.ts +0 -60
- package/src/commands/health-codex.ts +0 -576
- package/src/commands/health.ts +0 -315
- package/src/commands/history.ts +0 -63
- package/src/commands/intent.ts +0 -457
- package/src/commands/legacy-cleanup.ts +0 -531
- package/src/commands/legacy-import.ts +0 -104
- package/src/commands/mvp-smoke.ts +0 -160
- package/src/commands/pain-evidence.ts +0 -226
- package/src/commands/pain-list.ts +0 -239
- package/src/commands/pain-record.ts +0 -612
- package/src/commands/pain-retry.ts +0 -916
- package/src/commands/principles-stats.ts +0 -700
- package/src/commands/proven-channel-baseline.ts +0 -115
- package/src/commands/quality-scorecard.ts +0 -272
- package/src/commands/remediation-output.ts +0 -66
- package/src/commands/rulecode.ts +0 -465
- package/src/commands/run.ts +0 -89
- package/src/commands/runtime-activation.ts +0 -1629
- package/src/commands/runtime-artifact-repair.ts +0 -524
- package/src/commands/runtime-canary.ts +0 -395
- package/src/commands/runtime-compatibility-scan.ts +0 -105
- package/src/commands/runtime-diagnostics-export.ts +0 -229
- package/src/commands/runtime-features.ts +0 -153
- package/src/commands/runtime-gfi-snapshot.ts +0 -135
- package/src/commands/runtime-health-snapshot.ts +0 -108
- package/src/commands/runtime-init.ts +0 -429
- package/src/commands/runtime-internalization-enqueue-successors.ts +0 -530
- package/src/commands/runtime-internalization-integrity-repair.ts +0 -79
- package/src/commands/runtime-internalization-integrity.ts +0 -107
- package/src/commands/runtime-internalization-queue.ts +0 -135
- package/src/commands/runtime-internalization-retry.ts +0 -191
- package/src/commands/runtime-internalization-run-once.ts +0 -791
- package/src/commands/runtime-internalization-run-rulehost.ts +0 -749
- package/src/commands/runtime-internalization-wake-once.ts +0 -87
- package/src/commands/runtime-pain-flood-simulation.ts +0 -121
- package/src/commands/runtime-pruning.ts +0 -438
- package/src/commands/runtime-recovery-failed-tasks.ts +0 -258
- package/src/commands/runtime-recovery.ts +0 -109
- package/src/commands/runtime-synthetic-baseline.ts +0 -70
- package/src/commands/runtime-uat.guard.test.ts +0 -175
- package/src/commands/runtime-uat.ts +0 -380
- package/src/commands/runtime.ts +0 -473
- package/src/commands/samples-list.ts +0 -39
- package/src/commands/samples-review.ts +0 -36
- package/src/commands/task.ts +0 -271
- package/src/commands/telemetry.ts +0 -349
- package/src/commands/trace.ts +0 -174
- package/src/commands/trajectory-db-unavailable.ts +0 -19
- package/src/commands/trajectory.ts +0 -64
- package/src/commands/version.ts +0 -49
- package/src/config-reader.ts +0 -122
- package/src/index.ts +0 -1276
- package/src/legacy/legacy-import.ts +0 -179
- package/src/legacy/session-history-import.ts +0 -203
- package/src/resolve-workspace.ts +0 -106
- package/src/services/__tests__/cli-output.test.ts +0 -130
- package/src/services/__tests__/evaluator-runner-deps.test.ts +0 -382
- package/src/services/__tests__/rulehost-readiness.test.ts +0 -363
- package/src/services/__tests__/runtime-adapter-resolver.test.ts +0 -793
- package/src/services/cli-output.ts +0 -95
- package/src/services/config-doctor.ts +0 -697
- package/src/services/console-launcher.ts +0 -537
- package/src/services/demo-rule-compiler.ts +0 -40
- package/src/services/demo-story-a-runner.ts +0 -471
- package/src/services/mainline-snapshot-assembler.ts +0 -579
- package/src/services/pain-flood-simulation-runner.ts +0 -462
- package/src/services/pd-config-loader.ts +0 -433
- package/src/services/proven-channel-baseline-runner.ts +0 -157
- package/src/services/quality-scorecard/data-extractor.ts +0 -150
- package/src/services/quality-scorecard/local-evaluator.ts +0 -142
- package/src/services/quality-scorecard/strong-model-gate.ts +0 -202
- package/src/services/resolve-runtime-from-pd-config.ts +0 -230
- package/src/services/rulehost-pipeline-runner.ts +0 -1214
- package/src/services/rulehost-readiness.ts +0 -326
- package/src/services/runtime-adapter-resolver.ts +0 -364
- package/src/services/synthetic-baseline-runner.ts +0 -400
- package/src/services/version-report.ts +0 -253
- package/src/services/workspace-tool-semantics.ts +0 -26
- package/src/utils/path-security.ts +0 -96
- package/src/utils/production-workspace-guard.test.ts +0 -157
- package/src/utils/production-workspace-guard.ts +0 -210
- package/tests/bdd/cli-contract.steps.ts +0 -346
- package/tests/bdd/principles-stats.steps.ts +0 -211
- package/tests/bdd/support/gherkin-loader.ts +0 -147
- package/tests/bdd/support/repo-root.ts +0 -62
- package/tests/bdd/support/vitest-bdd.ts +0 -179
- package/tests/commands/admission-gate-coverage.test.ts +0 -79
- package/tests/commands/build-trajectory-evidence.test.ts +0 -508
- package/tests/commands/candidate-audit-repair.test.ts +0 -421
- package/tests/commands/candidate-intake.test.ts +0 -732
- package/tests/commands/candidate-internalization-backfill.test.ts +0 -548
- package/tests/commands/candidate-internalize-lineage.test.ts +0 -628
- package/tests/commands/candidate-internalize.test.ts +0 -299
- package/tests/commands/candidate-route.test.ts +0 -329
- package/tests/commands/candidate-show.test.ts +0 -95
- package/tests/commands/cli-command-tree.test.ts +0 -144
- package/tests/commands/cli-help-snapshot.test.ts +0 -155
- package/tests/commands/cli-skill-contract.test.ts +0 -121
- package/tests/commands/codex-consent-reversibility.steps.test.ts +0 -299
- package/tests/commands/codex-ingest-quarantine.test.ts +0 -136
- package/tests/commands/codex-setup.test.ts +0 -297
- package/tests/commands/codex-worker-daemon.test.ts +0 -95
- package/tests/commands/codex-worker-registration.test.ts +0 -207
- package/tests/commands/config-doctor.test.ts +0 -336
- package/tests/commands/console-launcher-edge-cases.test.ts +0 -388
- package/tests/commands/console-open.test.ts +0 -1381
- package/tests/commands/context.test.ts +0 -114
- package/tests/commands/demo-story-a.test.ts +0 -318
- package/tests/commands/diagnose.test.ts +0 -1803
- package/tests/commands/errors-list.test.ts +0 -679
- package/tests/commands/evolution-tasks-list.test.ts +0 -41
- package/tests/commands/evolution-tasks-show.test.ts +0 -46
- package/tests/commands/health-codex.test.ts +0 -349
- package/tests/commands/health-host-wiring.test.ts +0 -76
- package/tests/commands/health-reliability.test.ts +0 -99
- package/tests/commands/health.test.ts +0 -413
- package/tests/commands/intent.test.ts +0 -321
- package/tests/commands/legacy-cleanup.test.ts +0 -148
- package/tests/commands/pain-evidence.test.ts +0 -518
- package/tests/commands/pain-list.test.ts +0 -219
- package/tests/commands/pain-record-async.test.ts +0 -335
- package/tests/commands/pain-record-session-parser.test.ts +0 -228
- package/tests/commands/pain-record.test.ts +0 -851
- package/tests/commands/pain-retry.test.ts +0 -1121
- package/tests/commands/plugin-config-resolution-cutover.test.ts +0 -229
- package/tests/commands/pri-393-runtime-config-unification.test.ts +0 -443
- package/tests/commands/principles-stats-wiring.test.ts +0 -135
- package/tests/commands/principles-stats.test.ts +0 -274
- package/tests/commands/product-path-regression.test.ts +0 -86
- package/tests/commands/proven-channel-baseline.test.ts +0 -441
- package/tests/commands/rulecode.test.ts +0 -177
- package/tests/commands/run-rulehost-handler.test.ts +0 -908
- package/tests/commands/runtime-activation-approve-flag-wiring.test.ts +0 -227
- package/tests/commands/runtime-activation-deactivate-flag-wiring.test.ts +0 -167
- package/tests/commands/runtime-activation-dispatch-flag-wiring.test.ts +0 -262
- package/tests/commands/runtime-activation-governance-audit.test.ts +0 -95
- package/tests/commands/runtime-activation-list-flag-wiring.test.ts +0 -193
- package/tests/commands/runtime-activation-promote-flag-wiring.test.ts +0 -248
- package/tests/commands/runtime-activation-shadow-telemetry.test.ts +0 -130
- package/tests/commands/runtime-activation.test.ts +0 -2052
- package/tests/commands/runtime-artifact-repair-registration.test.ts +0 -74
- package/tests/commands/runtime-artifact-repair.test.ts +0 -404
- package/tests/commands/runtime-canary.test.ts +0 -430
- package/tests/commands/runtime-compatibility-scan.test.ts +0 -146
- package/tests/commands/runtime-diagnostics-export.test.ts +0 -175
- package/tests/commands/runtime-features.test.ts +0 -249
- package/tests/commands/runtime-health-snapshot.test.ts +0 -358
- package/tests/commands/runtime-init-empty-workspace.test.ts +0 -252
- package/tests/commands/runtime-init.test.ts +0 -420
- package/tests/commands/runtime-internalization-enqueue-successors.test.ts +0 -782
- package/tests/commands/runtime-internalization-integrity-repair.test.ts +0 -239
- package/tests/commands/runtime-internalization-integrity.test.ts +0 -140
- package/tests/commands/runtime-internalization-queue.test.ts +0 -380
- package/tests/commands/runtime-internalization-retry-owner-authority.test.ts +0 -431
- package/tests/commands/runtime-internalization-run-once-evaluator-parity.test.ts +0 -269
- package/tests/commands/runtime-internalization-run-once-language.test.ts +0 -303
- package/tests/commands/runtime-internalization-run-once-real-config.test.ts +0 -237
- package/tests/commands/runtime-internalization-run-once-rollout-parity.test.ts +0 -706
- package/tests/commands/runtime-internalization-run-once.test.ts +0 -1791
- package/tests/commands/runtime-internalization-wake-once.test.ts +0 -171
- package/tests/commands/runtime-internalization.test.ts +0 -53
- package/tests/commands/runtime-pain-flood-simulation.test.ts +0 -418
- package/tests/commands/runtime-pruning.test.ts +0 -694
- package/tests/commands/runtime-recovery-failed-tasks.test.ts +0 -328
- package/tests/commands/runtime-recovery.test.ts +0 -120
- package/tests/commands/runtime-synthetic-baseline.test.ts +0 -249
- package/tests/commands/runtime-uat.test.ts +0 -397
- package/tests/commands/runtime.test.ts +0 -392
- package/tests/commands/samples-list.test.ts +0 -43
- package/tests/commands/samples-review.test.ts +0 -41
- package/tests/commands/task.test.ts +0 -153
- package/tests/commands/telemetry.test.ts +0 -190
- package/tests/commands/trace.test.ts +0 -316
- package/tests/config-reader.test.ts +0 -143
- package/tests/e2e/candidate-intake-e2e.test.ts +0 -338
- package/tests/e2e/cli-full-flow.test.ts +0 -233
- package/tests/e2e/cross-package-acceptance.test.ts +0 -635
- package/tests/helpers/pd-cli-path.ts +0 -5
- package/tests/pd-cli-smoke.test.ts +0 -13
- package/tests/resolve-workspace.test.ts +0 -196
- package/tests/services/config-doctor-signal-health.test.ts +0 -109
- package/tests/services/console-launcher.test.ts +0 -114
- package/tests/services/demo-rule-compiler.test.ts +0 -242
- package/tests/services/mainline-snapshot-assembler.test.ts +0 -572
- package/tests/services/pd-config-loader.test.ts +0 -505
- package/tests/services/proven-channel-baseline-runner.test.ts +0 -30
- package/tests/services/quality-scorecard/strong-model-gate.test.ts +0 -133
- package/tests/services/resolve-runtime-from-pd-config.test.ts +0 -485
- package/tests/services/rulehost-pipeline-e2e.test.ts +0 -538
- package/tests/services/rulehost-pipeline-runner.test.ts +0 -1242
- package/tests/services/workspace-tool-semantics.test.ts +0 -76
- package/tests/utils/path-security.test.ts +0 -180
- package/tsconfig.json +0 -26
- package/vitest.config.ts +0 -10
|
@@ -1,382 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PRI-510 (DEFECT-004): EvaluatorRunner repair-loop CLI wiring (EP-02).
|
|
3
|
-
*
|
|
4
|
-
* Tests that the CLI production path constructs `EvaluatorRunner` with the
|
|
5
|
-
* repair-loop deps (`isRepairLoopEnabled` + `seedArtificerRepairTask`) so the
|
|
6
|
-
* PRI-509 core logic is actually invoked at runtime. Without this wiring, the
|
|
7
|
-
* repair loop is dead code in production — `evaluator needs_revision` seeds
|
|
8
|
-
* nothing (EP-02: component exists with isolated tests but real path never
|
|
9
|
-
* calls it).
|
|
10
|
-
*
|
|
11
|
-
* Trust boundary (rc-1, rc-2): the seeder writes `repairPayload` (sourced from
|
|
12
|
-
* evaluator LLM output) into `diagnosticJson` via the validated
|
|
13
|
-
* `createPITaskDiagnosticJson` serializer — no `as` bypass.
|
|
14
|
-
*
|
|
15
|
-
* Loop state freshness (rc-7, EP-05): the seeder does NOT infer
|
|
16
|
-
* `repairIteration` from any cached value; it uses the `repairPayload`
|
|
17
|
-
* constructed by the evaluator runner (which reads it from the dependency
|
|
18
|
-
* artificer task's metadata, written at task creation time).
|
|
19
|
-
*
|
|
20
|
-
* Fail loud (rc-9, EP-03): when `isRepairLoopEnabled` returns false, the
|
|
21
|
-
* `EvaluatorRunner` follows the legacy path (no seeder call). This is
|
|
22
|
-
* observable backward-compatible behavior, not a silent fallback.
|
|
23
|
-
*
|
|
24
|
-
* ERR refs:
|
|
25
|
-
* - EP-02 / ERR-011 / ERR-024: production path wiring — fix the wiring,
|
|
26
|
-
* not just the leaf helper.
|
|
27
|
-
* - EP-04 / cli-7-test-wiring: tests exercise the real helper used by both
|
|
28
|
-
* CLI construction sites (`runtime-internalization-run-once.ts`,
|
|
29
|
-
* `rulehost-pipeline-runner.ts`).
|
|
30
|
-
*/
|
|
31
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
32
|
-
import * as fs from 'node:fs';
|
|
33
|
-
import * as path from 'node:path';
|
|
34
|
-
import * as os from 'node:os';
|
|
35
|
-
import { createEvaluatorRunnerDeps } from '../rulehost-pipeline-runner.js';
|
|
36
|
-
import type { SeedArtificerRepairParams } from '@principles/core/runtime-v2';
|
|
37
|
-
import type { RuntimeStateManager, TaskRecord } from '@principles/core/runtime-v2';
|
|
38
|
-
|
|
39
|
-
// ─── Test workspace helpers ────────────────────────────────────────────────
|
|
40
|
-
|
|
41
|
-
function createTempWorkspace(featureFlagEnabled: boolean | null): string {
|
|
42
|
-
// CodeQL: use mkdtempSync for atomic, unpredictable temp dir creation
|
|
43
|
-
// (avoids path-prediction risk from Date.now() + Math.random()).
|
|
44
|
-
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-pri-510-'));
|
|
45
|
-
const pdDir = path.join(tmpDir, '.pd');
|
|
46
|
-
fs.mkdirSync(pdDir, { recursive: true });
|
|
47
|
-
// When featureFlagEnabled is null, write a config WITHOUT the
|
|
48
|
-
// evaluator_artificer_repair_loop entry (defaults apply → false).
|
|
49
|
-
// Otherwise include the 3 core features + the repair-loop flag.
|
|
50
|
-
const repairFlagEntry =
|
|
51
|
-
featureFlagEnabled === null
|
|
52
|
-
? ''
|
|
53
|
-
: ` evaluator_artificer_repair_loop: { category: quiet, enabled: ${featureFlagEnabled}, since: '2026-07-04' }\n`;
|
|
54
|
-
const yaml = `
|
|
55
|
-
version: 1
|
|
56
|
-
features:
|
|
57
|
-
prompt: { category: core, enabled: true }
|
|
58
|
-
code_tool_hook: { category: core, enabled: true }
|
|
59
|
-
defer_archive: { category: core, enabled: true }
|
|
60
|
-
${repairFlagEntry}workspace:
|
|
61
|
-
default: ${tmpDir.replace(/\\/g, '/')}
|
|
62
|
-
internalAgents:
|
|
63
|
-
defaultRuntime: pi-ai.lmstudio
|
|
64
|
-
agents:
|
|
65
|
-
diagnostician:
|
|
66
|
-
enabled: true
|
|
67
|
-
dreamer:
|
|
68
|
-
enabled: true
|
|
69
|
-
philosopher:
|
|
70
|
-
enabled: true
|
|
71
|
-
scribe:
|
|
72
|
-
enabled: true
|
|
73
|
-
artificer:
|
|
74
|
-
enabled: true
|
|
75
|
-
runtimeProfiles:
|
|
76
|
-
pi-ai.lmstudio:
|
|
77
|
-
type: pi-ai
|
|
78
|
-
provider: lmstudio
|
|
79
|
-
model: qwen3.6-27b-mtp
|
|
80
|
-
apiKeyEnv: LMSTUDIO_API_KEY
|
|
81
|
-
baseUrl: http://localhost:1234/v1
|
|
82
|
-
`;
|
|
83
|
-
fs.writeFileSync(path.join(pdDir, 'config.yaml'), yaml, 'utf-8');
|
|
84
|
-
return tmpDir;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function cleanupWorkspace(dir: string): void {
|
|
88
|
-
try {
|
|
89
|
-
fs.rmSync(dir, { recursive: true, force: true });
|
|
90
|
-
} catch {
|
|
91
|
-
// best effort
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// ─── Mock stateManager ─────────────────────────────────────────────────────
|
|
96
|
-
|
|
97
|
-
function createMockStateManager(): {
|
|
98
|
-
stateManager: RuntimeStateManager;
|
|
99
|
-
createdTasks: TaskRecord[];
|
|
100
|
-
} {
|
|
101
|
-
const createdTasks: TaskRecord[] = [];
|
|
102
|
-
const stateManager = {
|
|
103
|
-
getTask: vi.fn(async (taskId: string) =>
|
|
104
|
-
createdTasks.find((t) => t.taskId === taskId) ?? null),
|
|
105
|
-
createTask: vi.fn(async (record: Omit<TaskRecord, 'createdAt' | 'updatedAt'>) => {
|
|
106
|
-
const now = new Date().toISOString();
|
|
107
|
-
const task: TaskRecord = { ...record, createdAt: now, updatedAt: now };
|
|
108
|
-
createdTasks.push(task);
|
|
109
|
-
return task;
|
|
110
|
-
}),
|
|
111
|
-
} as unknown as RuntimeStateManager;
|
|
112
|
-
return { stateManager, createdTasks };
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// ─── Fixtures ───────────────────────────────────────────────────────────────
|
|
116
|
-
|
|
117
|
-
function makeValidSeedParams(): SeedArtificerRepairParams {
|
|
118
|
-
return {
|
|
119
|
-
repairPayload: {
|
|
120
|
-
requiredChanges: ['fix path validation', 'add error handling'],
|
|
121
|
-
concerns: ['code quality is poor'],
|
|
122
|
-
previousScore: 0.55,
|
|
123
|
-
repairIteration: 1,
|
|
124
|
-
sourceArtificerArtifactId: 'pi-art-artificer-original',
|
|
125
|
-
sourceEvaluatorTaskId: 'evaluator-r0',
|
|
126
|
-
},
|
|
127
|
-
inheritedDependencyTaskIds: ['scribe-task-001'],
|
|
128
|
-
inheritedChannel: 'prompt',
|
|
129
|
-
inheritedTimeoutMs: 300_000,
|
|
130
|
-
inheritedInputArtifactRefs: [
|
|
131
|
-
{ artifactType: 'principle', ref: 'pi-art-scribe-001' },
|
|
132
|
-
],
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// ─── Tests ──────────────────────────────────────────────────────────────────
|
|
137
|
-
|
|
138
|
-
describe('PRI-510 (DEFECT-004): createEvaluatorRunnerDeps wires repair loop into CLI (EP-02)', () => {
|
|
139
|
-
let tmpWorkspaces: string[] = [];
|
|
140
|
-
|
|
141
|
-
beforeEach(() => {
|
|
142
|
-
tmpWorkspaces = [];
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
afterEach(() => {
|
|
146
|
-
for (const dir of tmpWorkspaces) cleanupWorkspace(dir);
|
|
147
|
-
tmpWorkspaces = [];
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
it('flag enabled → isRepairLoopEnabled() returns true (EP-02: production wiring works)', () => {
|
|
151
|
-
const workspaceDir = createTempWorkspace(true);
|
|
152
|
-
tmpWorkspaces.push(workspaceDir);
|
|
153
|
-
const { stateManager } = createMockStateManager();
|
|
154
|
-
|
|
155
|
-
const deps = createEvaluatorRunnerDeps({
|
|
156
|
-
stateManager,
|
|
157
|
-
runtimeAdapter: {} as never,
|
|
158
|
-
eventEmitter: {} as never,
|
|
159
|
-
validator: {} as never,
|
|
160
|
-
artifactStore: {} as never,
|
|
161
|
-
workspaceDir,
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
expect(deps.isRepairLoopEnabled).toBeDefined();
|
|
165
|
-
expect(typeof deps.isRepairLoopEnabled).toBe('function');
|
|
166
|
-
// Guard before call — rc-2: no `!` non-null assertion (lint rule).
|
|
167
|
-
if (typeof deps.isRepairLoopEnabled !== 'function') throw new Error('isRepairLoopEnabled missing');
|
|
168
|
-
expect(deps.isRepairLoopEnabled()).toBe(true);
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
it('flag disabled → isRepairLoopEnabled() returns false (backward compatible)', () => {
|
|
172
|
-
const workspaceDir = createTempWorkspace(false);
|
|
173
|
-
tmpWorkspaces.push(workspaceDir);
|
|
174
|
-
const { stateManager } = createMockStateManager();
|
|
175
|
-
|
|
176
|
-
const deps = createEvaluatorRunnerDeps({
|
|
177
|
-
stateManager,
|
|
178
|
-
runtimeAdapter: {} as never,
|
|
179
|
-
eventEmitter: {} as never,
|
|
180
|
-
validator: {} as never,
|
|
181
|
-
artifactStore: {} as never,
|
|
182
|
-
workspaceDir,
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
expect(typeof deps.isRepairLoopEnabled).toBe('function');
|
|
186
|
-
if (typeof deps.isRepairLoopEnabled !== 'function') throw new Error('isRepairLoopEnabled missing');
|
|
187
|
-
expect(deps.isRepairLoopEnabled()).toBe(false);
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
it('flag absent in config → isRepairLoopEnabled() returns true (P0-D: default-on since core-loop closure)', () => {
|
|
191
|
-
const workspaceDir = createTempWorkspace(null);
|
|
192
|
-
tmpWorkspaces.push(workspaceDir);
|
|
193
|
-
const { stateManager } = createMockStateManager();
|
|
194
|
-
|
|
195
|
-
const deps = createEvaluatorRunnerDeps({
|
|
196
|
-
stateManager,
|
|
197
|
-
runtimeAdapter: {} as never,
|
|
198
|
-
eventEmitter: {} as never,
|
|
199
|
-
validator: {} as never,
|
|
200
|
-
artifactStore: {} as never,
|
|
201
|
-
workspaceDir,
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
expect(typeof deps.isRepairLoopEnabled).toBe('function');
|
|
205
|
-
if (typeof deps.isRepairLoopEnabled !== 'function') throw new Error('isRepairLoopEnabled missing');
|
|
206
|
-
// 契约变更 (2026-08-18, INV-02): registry 默认 ON;flag 缺省 = 默认生效
|
|
207
|
-
expect(deps.isRepairLoopEnabled()).toBe(true);
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
it('malformed config → isRepairLoopEnabled() falls back to registry defaults (default-on), never throws', () => {
|
|
211
|
-
// CodeQL: use mkdtempSync for atomic, unpredictable temp dir creation.
|
|
212
|
-
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-pri-510-malformed-'));
|
|
213
|
-
tmpWorkspaces.push(tmpDir);
|
|
214
|
-
const pdDir = path.join(tmpDir, '.pd');
|
|
215
|
-
fs.mkdirSync(pdDir, { recursive: true });
|
|
216
|
-
fs.writeFileSync(path.join(pdDir, 'config.yaml'), 'this: is: not: valid: yaml: [', 'utf-8');
|
|
217
|
-
|
|
218
|
-
const { stateManager } = createMockStateManager();
|
|
219
|
-
|
|
220
|
-
const deps = createEvaluatorRunnerDeps({
|
|
221
|
-
stateManager,
|
|
222
|
-
runtimeAdapter: {} as never,
|
|
223
|
-
eventEmitter: {} as never,
|
|
224
|
-
validator: {} as never,
|
|
225
|
-
artifactStore: {} as never,
|
|
226
|
-
workspaceDir: tmpDir,
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
// Malformed config must NOT throw — falls back to registry defaults
|
|
230
|
-
// (P0-D: evaluator_artificer_repair_loop default-on since core-loop closure).
|
|
231
|
-
expect(typeof deps.isRepairLoopEnabled).toBe('function');
|
|
232
|
-
if (typeof deps.isRepairLoopEnabled !== 'function') throw new Error('isRepairLoopEnabled missing');
|
|
233
|
-
expect(deps.isRepairLoopEnabled()).toBe(true);
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
it('seedArtificerRepairTask → creates artificer task with repairPayload in diagnosticJson (rc-1, rc-6)', async () => {
|
|
237
|
-
const workspaceDir = createTempWorkspace(true);
|
|
238
|
-
tmpWorkspaces.push(workspaceDir);
|
|
239
|
-
const { stateManager, createdTasks } = createMockStateManager();
|
|
240
|
-
const params = makeValidSeedParams();
|
|
241
|
-
|
|
242
|
-
const deps = createEvaluatorRunnerDeps({
|
|
243
|
-
stateManager,
|
|
244
|
-
runtimeAdapter: {} as never,
|
|
245
|
-
eventEmitter: {} as never,
|
|
246
|
-
validator: {} as never,
|
|
247
|
-
artifactStore: {} as never,
|
|
248
|
-
workspaceDir,
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
expect(deps.seedArtificerRepairTask).toBeDefined();
|
|
252
|
-
expect(typeof deps.seedArtificerRepairTask).toBe('function');
|
|
253
|
-
if (typeof deps.seedArtificerRepairTask !== 'function') throw new Error('seedArtificerRepairTask missing');
|
|
254
|
-
const repairTaskId = await deps.seedArtificerRepairTask(params);
|
|
255
|
-
|
|
256
|
-
// Returns a non-empty task ID
|
|
257
|
-
expect(typeof repairTaskId).toBe('string');
|
|
258
|
-
expect(repairTaskId.length).toBeGreaterThan(0);
|
|
259
|
-
|
|
260
|
-
// Exactly one task created
|
|
261
|
-
expect(createdTasks).toHaveLength(1);
|
|
262
|
-
const [task] = createdTasks;
|
|
263
|
-
if (!task) throw new Error('task not created');
|
|
264
|
-
|
|
265
|
-
// D1 (PRI-509): task kind is 'artificer' (reuses artificer-runner, not a
|
|
266
|
-
// new runner type)
|
|
267
|
-
expect(task.taskKind).toBe('artificer');
|
|
268
|
-
|
|
269
|
-
// Task starts pending so the orchestrator can pick it up
|
|
270
|
-
expect(task.status).toBe('pending');
|
|
271
|
-
|
|
272
|
-
// Task ID matches what the seeder returns
|
|
273
|
-
expect(task.taskId).toBe(repairTaskId);
|
|
274
|
-
|
|
275
|
-
// diagnosticJson must contain the repairPayload — round-trip via the
|
|
276
|
-
// parser to verify the validated shape (rc-1: treat parsed JSON as
|
|
277
|
-
// unknown; rc-2: no `as` bypass; rc-6: lineage fields consistent).
|
|
278
|
-
expect(task.diagnosticJson).toBeDefined();
|
|
279
|
-
expect(typeof task.diagnosticJson).toBe('string');
|
|
280
|
-
if (typeof task.diagnosticJson !== 'string') throw new Error('diagnosticJson not a string');
|
|
281
|
-
const parsed = JSON.parse(task.diagnosticJson);
|
|
282
|
-
const meta = parsed.pi_metadata;
|
|
283
|
-
expect(meta).toBeDefined();
|
|
284
|
-
expect(meta.repairPayload).toEqual(params.repairPayload);
|
|
285
|
-
|
|
286
|
-
// Inherited lineage must be preserved (PRI-508 context + PRI-509 deps)
|
|
287
|
-
expect(meta.dependencyTaskIds).toEqual(params.inheritedDependencyTaskIds);
|
|
288
|
-
expect(meta.channel).toBe(params.inheritedChannel);
|
|
289
|
-
expect(meta.timeoutMs).toBe(params.inheritedTimeoutMs);
|
|
290
|
-
expect(meta.inputArtifactRefs).toEqual(params.inheritedInputArtifactRefs);
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
it('seedArtificerRepairTask → deterministic id + replay reuse (P0-4); 不同 iteration 不同 id (rc-7)', async () => {
|
|
294
|
-
const workspaceDir = createTempWorkspace(true);
|
|
295
|
-
tmpWorkspaces.push(workspaceDir);
|
|
296
|
-
const { stateManager } = createMockStateManager();
|
|
297
|
-
const params = makeValidSeedParams();
|
|
298
|
-
|
|
299
|
-
const deps = createEvaluatorRunnerDeps({
|
|
300
|
-
stateManager,
|
|
301
|
-
runtimeAdapter: {} as never,
|
|
302
|
-
eventEmitter: {} as never,
|
|
303
|
-
validator: {} as never,
|
|
304
|
-
artifactStore: {} as never,
|
|
305
|
-
workspaceDir,
|
|
306
|
-
});
|
|
307
|
-
|
|
308
|
-
if (typeof deps.seedArtificerRepairTask !== 'function') throw new Error('seedArtificerRepairTask missing');
|
|
309
|
-
const id1 = await deps.seedArtificerRepairTask(params);
|
|
310
|
-
// P0-4: 同一 evaluator+iteration 的重放 (consumer 重复周期 / crash 恢复)
|
|
311
|
-
// reuse 同一确定性 id,不重复创建
|
|
312
|
-
expect(id1).toBe(`artificer-repair-${params.repairPayload.sourceEvaluatorTaskId}-r${params.repairPayload.repairIteration}`);
|
|
313
|
-
const id2 = await deps.seedArtificerRepairTask(params);
|
|
314
|
-
expect(id2).toBe(id1);
|
|
315
|
-
// 不同 iteration (下一逻辑修复轮) → 不同 id
|
|
316
|
-
const id3 = await deps.seedArtificerRepairTask({
|
|
317
|
-
...params,
|
|
318
|
-
repairPayload: { ...params.repairPayload, repairIteration: params.repairPayload.repairIteration + 1 },
|
|
319
|
-
});
|
|
320
|
-
expect(id3).not.toBe(id1);
|
|
321
|
-
});
|
|
322
|
-
|
|
323
|
-
it('seedArtificerRepairTask → terminal (succeeded/failed/NHR) round refuses reuse (PRI-718 revise ≠ resume)', async () => {
|
|
324
|
-
const workspaceDir = createTempWorkspace(true);
|
|
325
|
-
tmpWorkspaces.push(workspaceDir);
|
|
326
|
-
const { stateManager, createdTasks } = createMockStateManager();
|
|
327
|
-
const params = makeValidSeedParams();
|
|
328
|
-
|
|
329
|
-
const deps = createEvaluatorRunnerDeps({
|
|
330
|
-
stateManager,
|
|
331
|
-
runtimeAdapter: {} as never,
|
|
332
|
-
eventEmitter: {} as never,
|
|
333
|
-
validator: {} as never,
|
|
334
|
-
artifactStore: {} as never,
|
|
335
|
-
workspaceDir,
|
|
336
|
-
});
|
|
337
|
-
if (typeof deps.seedArtificerRepairTask !== 'function') throw new Error('seedArtificerRepairTask missing');
|
|
338
|
-
|
|
339
|
-
// Stage a pre-existing TERMINAL repair round under the deterministic id
|
|
340
|
-
// (EP002-R2: the seed found the finished r2 and "reused" it, so the
|
|
341
|
-
// evaluator re-evaluated the same artifact forever).
|
|
342
|
-
const repairTaskId = `artificer-repair-${params.repairPayload.sourceEvaluatorTaskId}-r${params.repairPayload.repairIteration}`;
|
|
343
|
-
const now = new Date().toISOString();
|
|
344
|
-
const base = { taskId: repairTaskId, taskKind: 'artificer', attemptCount: 1, maxAttempts: 3, createdAt: now, updatedAt: now, diagnosticJson: '{}' };
|
|
345
|
-
for (const terminalStatus of ['succeeded', 'failed', 'needs_human_review'] as const) {
|
|
346
|
-
createdTasks.length = 0;
|
|
347
|
-
createdTasks.push({ ...base, status: terminalStatus } as TaskRecord);
|
|
348
|
-
await expect(deps.seedArtificerRepairTask(params)).rejects.toThrow(new RegExp(`terminal status ${terminalStatus}`));
|
|
349
|
-
}
|
|
350
|
-
});
|
|
351
|
-
|
|
352
|
-
it('deps spread contains all required base PeerRunnerDeps fields (EP-02: real path gets full deps)', () => {
|
|
353
|
-
const workspaceDir = createTempWorkspace(true);
|
|
354
|
-
tmpWorkspaces.push(workspaceDir);
|
|
355
|
-
const { stateManager } = createMockStateManager();
|
|
356
|
-
const fakeRuntimeAdapter = { kind: () => 'pi-ai' } as never;
|
|
357
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
358
|
-
const fakeEventEmitter = { emit: () => {} } as never;
|
|
359
|
-
const fakeValidator = { validate: () => ({ ok: true, value: {} }) } as never;
|
|
360
|
-
const fakeArtifactStore = { get: () => null } as never;
|
|
361
|
-
|
|
362
|
-
const deps = createEvaluatorRunnerDeps({
|
|
363
|
-
stateManager,
|
|
364
|
-
runtimeAdapter: fakeRuntimeAdapter,
|
|
365
|
-
eventEmitter: fakeEventEmitter,
|
|
366
|
-
validator: fakeValidator,
|
|
367
|
-
artifactStore: fakeArtifactStore,
|
|
368
|
-
workspaceDir,
|
|
369
|
-
});
|
|
370
|
-
|
|
371
|
-
// Base PeerRunnerDeps preserved
|
|
372
|
-
expect(deps.stateManager).toBe(stateManager);
|
|
373
|
-
expect(deps.runtimeAdapter).toBe(fakeRuntimeAdapter);
|
|
374
|
-
expect(deps.eventEmitter).toBe(fakeEventEmitter);
|
|
375
|
-
expect(deps.validator).toBe(fakeValidator);
|
|
376
|
-
expect(deps.artifactStore).toBe(fakeArtifactStore);
|
|
377
|
-
|
|
378
|
-
// Repair-loop deps present
|
|
379
|
-
expect(deps.isRepairLoopEnabled).toBeTypeOf('function');
|
|
380
|
-
expect(deps.seedArtificerRepairTask).toBeTypeOf('function');
|
|
381
|
-
});
|
|
382
|
-
});
|