create-principles-disciple 1.112.2 → 1.113.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/console/dist/server/routes/update.js +43 -0
- package/core/dist/runtime-v2/__tests__/activation-compatibility-read-model.test.d.ts +2 -0
- package/core/dist/runtime-v2/__tests__/activation-compatibility-read-model.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/__tests__/activation-compatibility-read-model.test.js +148 -0
- package/core/dist/runtime-v2/__tests__/activation-compatibility-read-model.test.js.map +1 -0
- package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +13 -3
- package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/evaluator-repair-loop.test.js +14 -6
- package/core/dist/runtime-v2/__tests__/evaluator-repair-loop.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js +1 -0
- package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice.test.js +5 -0
- package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/golden-trace.test.js +2 -2
- package/core/dist/runtime-v2/__tests__/golden-trace.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/internalization-contracts.test.js +4 -6
- package/core/dist/runtime-v2/__tests__/internalization-contracts.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/internalization-orchestrator.test.js +4 -1
- package/core/dist/runtime-v2/__tests__/internalization-orchestrator.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/internalization-state-machine.test.js +3 -2
- package/core/dist/runtime-v2/__tests__/internalization-state-machine.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/pain-to-principle-service.test.js +47 -0
- package/core/dist/runtime-v2/__tests__/pain-to-principle-service.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/rollout-reviewer-runner-vslice.test.js +66 -1
- package/core/dist/runtime-v2/__tests__/rollout-reviewer-runner-vslice.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/rollout-reviewer-verdict-paths.test.d.ts +2 -0
- package/core/dist/runtime-v2/__tests__/rollout-reviewer-verdict-paths.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/__tests__/rollout-reviewer-verdict-paths.test.js +234 -0
- package/core/dist/runtime-v2/__tests__/rollout-reviewer-verdict-paths.test.js.map +1 -0
- package/core/dist/runtime-v2/__tests__/rule-host-evaluator.test.js +4 -4
- package/core/dist/runtime-v2/__tests__/rule-host-evaluator.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/story-a-demo.test.js +8 -8
- package/core/dist/runtime-v2/__tests__/story-a-demo.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/__tests__/prompt-activation-reader-contract.test.js +23 -1
- package/core/dist/runtime-v2/activation/__tests__/prompt-activation-reader-contract.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/prompt-activation-reader-contract.d.ts +11 -0
- package/core/dist/runtime-v2/activation/prompt-activation-reader-contract.d.ts.map +1 -1
- package/core/dist/runtime-v2/activation/prompt-activation-reader-contract.js +11 -4
- package/core/dist/runtime-v2/activation/prompt-activation-reader-contract.js.map +1 -1
- package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js +31 -0
- package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js.map +1 -1
- package/core/dist/runtime-v2/activation-compatibility-read-model.d.ts +24 -0
- package/core/dist/runtime-v2/activation-compatibility-read-model.d.ts.map +1 -0
- package/core/dist/runtime-v2/activation-compatibility-read-model.js +132 -0
- package/core/dist/runtime-v2/activation-compatibility-read-model.js.map +1 -0
- package/core/dist/runtime-v2/adapter/output-schema-registry.d.ts.map +1 -1
- package/core/dist/runtime-v2/adapter/output-schema-registry.js +2 -0
- package/core/dist/runtime-v2/adapter/output-schema-registry.js.map +1 -1
- package/core/dist/runtime-v2/config/__tests__/pd-validate-profile-legacy-keys.test.d.ts +13 -0
- package/core/dist/runtime-v2/config/__tests__/pd-validate-profile-legacy-keys.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/config/__tests__/pd-validate-profile-legacy-keys.test.js +73 -0
- package/core/dist/runtime-v2/config/__tests__/pd-validate-profile-legacy-keys.test.js.map +1 -0
- package/core/dist/runtime-v2/config/pd-config-types.d.ts +0 -23
- package/core/dist/runtime-v2/config/pd-config-types.d.ts.map +1 -1
- package/core/dist/runtime-v2/config/pd-config-types.js.map +1 -1
- package/core/dist/runtime-v2/config/pd-profile-constants.d.ts +11 -5
- package/core/dist/runtime-v2/config/pd-profile-constants.d.ts.map +1 -1
- package/core/dist/runtime-v2/config/pd-profile-constants.js +10 -45
- package/core/dist/runtime-v2/config/pd-profile-constants.js.map +1 -1
- package/core/dist/runtime-v2/config/pd-validate-profile.d.ts.map +1 -1
- package/core/dist/runtime-v2/config/pd-validate-profile.js +27 -135
- package/core/dist/runtime-v2/config/pd-validate-profile.js.map +1 -1
- package/core/dist/runtime-v2/core-principles/core-principle-registry.d.ts +4 -4
- package/core/dist/runtime-v2/core-principles/core-principle-registry.d.ts.map +1 -1
- package/core/dist/runtime-v2/core-principles/core-principle-registry.js +2 -2
- package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +7 -2
- package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
- package/core/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
- package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js +9 -5
- package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
- package/core/dist/runtime-v2/golden-trace-replay-validator.d.ts.map +1 -1
- package/core/dist/runtime-v2/golden-trace-replay-validator.js +0 -2
- package/core/dist/runtime-v2/golden-trace-replay-validator.js.map +1 -1
- package/core/dist/runtime-v2/golden-trace.d.ts.map +1 -1
- package/core/dist/runtime-v2/golden-trace.js +0 -3
- package/core/dist/runtime-v2/golden-trace.js.map +1 -1
- package/core/dist/runtime-v2/index.d.ts +16 -10
- package/core/dist/runtime-v2/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/index.js +10 -7
- package/core/dist/runtime-v2/index.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/a-liveness-reconciliation.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/a-liveness-reconciliation.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/a-liveness-reconciliation.test.js +157 -0
- package/core/dist/runtime-v2/internalization/__tests__/a-liveness-reconciliation.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.js +29 -0
- package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/crash-liveness-regressions.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/crash-liveness-regressions.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/crash-liveness-regressions.test.js +311 -0
- package/core/dist/runtime-v2/internalization/__tests__/crash-liveness-regressions.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.js +171 -0
- package/core/dist/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/internalization-task-guards.test.js +11 -2
- package/core/dist/runtime-v2/internalization/__tests__/internalization-task-guards.test.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/internalization-transition-decision.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/internalization-transition-decision.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/internalization-transition-decision.test.js +335 -0
- package/core/dist/runtime-v2/internalization/__tests__/internalization-transition-decision.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/legacy-rule-contract-scanner.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/legacy-rule-contract-scanner.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/legacy-rule-contract-scanner.test.js +101 -0
- package/core/dist/runtime-v2/internalization/__tests__/legacy-rule-contract-scanner.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/mvp-core-loop-journeys.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/mvp-core-loop-journeys.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/mvp-core-loop-journeys.test.js +515 -0
- package/core/dist/runtime-v2/internalization/__tests__/mvp-core-loop-journeys.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/restart-safety.e2e.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/restart-safety.e2e.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/restart-safety.e2e.test.js +167 -0
- package/core/dist/runtime-v2/internalization/__tests__/restart-safety.e2e.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/verdict-drift-regressions.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/verdict-drift-regressions.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/verdict-drift-regressions.test.js +601 -0
- package/core/dist/runtime-v2/internalization/__tests__/verdict-drift-regressions.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/artificer-runner.d.ts +7 -0
- package/core/dist/runtime-v2/internalization/artificer-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/artificer-runner.js +18 -2
- package/core/dist/runtime-v2/internalization/artificer-runner.js.map +1 -1
- package/core/dist/runtime-v2/internalization/evaluator-runner.d.ts +49 -0
- package/core/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/evaluator-runner.js +390 -98
- package/core/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
- package/core/dist/runtime-v2/internalization/index.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/index.js +1 -0
- package/core/dist/runtime-v2/internalization/index.js.map +1 -1
- package/core/dist/runtime-v2/internalization/internalization-orchestrator.d.ts +127 -0
- package/core/dist/runtime-v2/internalization/internalization-orchestrator.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/internalization-orchestrator.js +345 -1
- package/core/dist/runtime-v2/internalization/internalization-orchestrator.js.map +1 -1
- package/core/dist/runtime-v2/internalization/internalization-task-guards.d.ts +9 -2
- package/core/dist/runtime-v2/internalization/internalization-task-guards.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/internalization-task-guards.js +14 -3
- package/core/dist/runtime-v2/internalization/internalization-task-guards.js.map +1 -1
- package/core/dist/runtime-v2/internalization/internalization-transition-decision.d.ts +61 -0
- package/core/dist/runtime-v2/internalization/internalization-transition-decision.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/internalization-transition-decision.js +84 -0
- package/core/dist/runtime-v2/internalization/internalization-transition-decision.js.map +1 -0
- package/core/dist/runtime-v2/internalization/legacy-rule-contract-scanner.d.ts +51 -0
- package/core/dist/runtime-v2/internalization/legacy-rule-contract-scanner.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/legacy-rule-contract-scanner.js +81 -0
- package/core/dist/runtime-v2/internalization/legacy-rule-contract-scanner.js.map +1 -0
- package/core/dist/runtime-v2/internalization/peer-runner-contracts.d.ts +17 -1
- package/core/dist/runtime-v2/internalization/peer-runner-contracts.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/peer-runner-contracts.js.map +1 -1
- package/core/dist/runtime-v2/internalization/pitask-metadata.d.ts +99 -2
- package/core/dist/runtime-v2/internalization/pitask-metadata.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/pitask-metadata.js +148 -0
- package/core/dist/runtime-v2/internalization/pitask-metadata.js.map +1 -1
- package/core/dist/runtime-v2/internalization/refiner-sandbox-wrapper.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/refiner-sandbox-wrapper.js +0 -2
- package/core/dist/runtime-v2/internalization/refiner-sandbox-wrapper.js.map +1 -1
- package/core/dist/runtime-v2/internalization/rollout-reviewer-runner.d.ts +147 -0
- package/core/dist/runtime-v2/internalization/rollout-reviewer-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/rollout-reviewer-runner.js +672 -1
- package/core/dist/runtime-v2/internalization/rollout-reviewer-runner.js.map +1 -1
- package/core/dist/runtime-v2/internalization/rule-host-contracts.d.ts +0 -3
- package/core/dist/runtime-v2/internalization/rule-host-contracts.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/rule-host-helpers.d.ts +4 -2
- package/core/dist/runtime-v2/internalization/rule-host-helpers.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/rule-host-helpers.js +4 -2
- package/core/dist/runtime-v2/internalization/rule-host-helpers.js.map +1 -1
- package/core/dist/runtime-v2/internalization/scribe-runner.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/scribe-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/scribe-runner.js +21 -1
- package/core/dist/runtime-v2/internalization/scribe-runner.js.map +1 -1
- package/core/dist/runtime-v2/pain-signal-observability.js +3 -3
- package/core/dist/runtime-v2/pain-signal-observability.js.map +1 -1
- package/core/dist/runtime-v2/runner/base-peer-runner.d.ts +9 -0
- package/core/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/runner/base-peer-runner.js +22 -0
- package/core/dist/runtime-v2/runner/base-peer-runner.js.map +1 -1
- package/core/dist/runtime-v2/signal-collector/__tests__/llm-payload-contract.test.d.ts +2 -0
- package/core/dist/runtime-v2/signal-collector/__tests__/llm-payload-contract.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/signal-collector/__tests__/llm-payload-contract.test.js +130 -0
- package/core/dist/runtime-v2/signal-collector/__tests__/llm-payload-contract.test.js.map +1 -0
- package/core/dist/runtime-v2/signal-collector/index.d.ts +1 -1
- package/core/dist/runtime-v2/signal-collector/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/signal-collector/index.js +1 -1
- package/core/dist/runtime-v2/signal-collector/index.js.map +1 -1
- package/core/dist/runtime-v2/signal-collector/llm-stage.d.ts +15 -0
- package/core/dist/runtime-v2/signal-collector/llm-stage.d.ts.map +1 -1
- package/core/dist/runtime-v2/signal-collector/llm-stage.js +28 -0
- package/core/dist/runtime-v2/signal-collector/llm-stage.js.map +1 -1
- package/core/dist/runtime-v2/signal-collector/types.d.ts +9 -1
- package/core/dist/runtime-v2/signal-collector/types.d.ts.map +1 -1
- package/core/dist/runtime-v2/signal-collector/types.js +13 -1
- package/core/dist/runtime-v2/signal-collector/types.js.map +1 -1
- package/core/dist/runtime-v2/store/reconciliation-cursor-store.d.ts +23 -0
- package/core/dist/runtime-v2/store/reconciliation-cursor-store.d.ts.map +1 -0
- package/core/dist/runtime-v2/store/reconciliation-cursor-store.js +34 -0
- package/core/dist/runtime-v2/store/reconciliation-cursor-store.js.map +1 -0
- package/core/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
- package/core/dist/runtime-v2/store/sqlite-connection.js +7 -0
- package/core/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
- package/core/dist/runtime-v2/store/task/memory-task-store.d.ts.map +1 -1
- package/core/dist/runtime-v2/store/task/memory-task-store.js +22 -0
- package/core/dist/runtime-v2/store/task/memory-task-store.js.map +1 -1
- package/core/dist/runtime-v2/store/task/sqlite-task-store.d.ts.map +1 -1
- package/core/dist/runtime-v2/store/task/sqlite-task-store.js +20 -0
- package/core/dist/runtime-v2/store/task/sqlite-task-store.js.map +1 -1
- package/core/dist/runtime-v2/store/task/task-store.d.ts +14 -0
- package/core/dist/runtime-v2/store/task/task-store.d.ts.map +1 -1
- package/core/dist/runtime-v2/story-a-demo.d.ts.map +1 -1
- package/core/dist/runtime-v2/story-a-demo.js +2 -0
- package/core/dist/runtime-v2/story-a-demo.js.map +1 -1
- package/core/dist/runtime-v2/tools/artificer-l2-tool-contract.d.ts.map +1 -1
- package/core/dist/runtime-v2/tools/artificer-l2-tool-contract.js +0 -4
- package/core/dist/runtime-v2/tools/artificer-l2-tool-contract.js.map +1 -1
- package/core/dist/runtime-v2/types/event-payload.d.ts +1 -20
- package/core/dist/runtime-v2/types/event-payload.d.ts.map +1 -1
- package/core/dist/runtime-v2/types/event-payload.js +0 -12
- package/core/dist/runtime-v2/types/event-payload.js.map +1 -1
- package/core/dist/runtime-v2/types/event-types.d.ts +3 -18
- package/core/dist/runtime-v2/types/event-types.d.ts.map +1 -1
- package/core/dist/runtime-v2/types/event-types.js +0 -8
- package/core/dist/runtime-v2/types/event-types.js.map +1 -1
- package/core/dist/runtime-v2/types/index.d.ts +3 -3
- package/core/dist/runtime-v2/types/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/types/index.js +2 -2
- package/core/dist/runtime-v2/types/index.js.map +1 -1
- package/dist/installer.d.ts +49 -0
- package/dist/installer.d.ts.map +1 -1
- package/dist/installer.js +215 -3
- package/dist/installer.js.map +1 -1
- package/host-runtime/dist/legacy-rule-contract-symbols.d.ts +20 -0
- package/host-runtime/dist/legacy-rule-contract-symbols.js +37 -0
- package/host-runtime/dist/production-rulehost-gate.d.ts +0 -1
- package/host-runtime/dist/production-rulehost-gate.js +29 -5
- package/host-runtime/dist/rule-implementation-runtime.js +0 -2
- package/package.json +2 -2
- package/pd-cli/dist/commands/demo-story-a.d.ts +2 -0
- package/pd-cli/dist/commands/demo-story-a.d.ts.map +1 -1
- package/pd-cli/dist/commands/demo-story-a.js +41 -0
- package/pd-cli/dist/commands/demo-story-a.js.map +1 -1
- package/pd-cli/dist/commands/runtime-activation.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-activation.js +36 -7
- package/pd-cli/dist/commands/runtime-activation.js.map +1 -1
- package/pd-cli/dist/commands/runtime-compatibility-scan.d.ts +32 -0
- package/pd-cli/dist/commands/runtime-compatibility-scan.d.ts.map +1 -0
- package/pd-cli/dist/commands/runtime-compatibility-scan.js +94 -0
- package/pd-cli/dist/commands/runtime-compatibility-scan.js.map +1 -0
- package/pd-cli/dist/commands/runtime-internalization-enqueue-successors.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-enqueue-successors.js +48 -0
- package/pd-cli/dist/commands/runtime-internalization-enqueue-successors.js.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-retry.d.ts +38 -0
- package/pd-cli/dist/commands/runtime-internalization-retry.d.ts.map +1 -0
- package/pd-cli/dist/commands/runtime-internalization-retry.js +143 -0
- package/pd-cli/dist/commands/runtime-internalization-retry.js.map +1 -0
- package/pd-cli/dist/index.js +15 -0
- package/pd-cli/dist/index.js.map +1 -1
- package/pd-cli/dist/services/__tests__/evaluator-runner-deps.test.js +19 -7
- package/pd-cli/dist/services/__tests__/evaluator-runner-deps.test.js.map +1 -1
- package/pd-cli/dist/services/rulehost-pipeline-runner.d.ts.map +1 -1
- package/pd-cli/dist/services/rulehost-pipeline-runner.js +6 -2
- package/pd-cli/dist/services/rulehost-pipeline-runner.js.map +1 -1
- package/plugin/dist/bundle.js +517 -707
- package/plugin/dist/core/event-log.d.ts +1 -2
- package/plugin/dist/core/paths.d.ts +0 -2
- package/plugin/dist/core/profile.d.ts +0 -19
- package/plugin/dist/core/rule-host.d.ts +25 -0
- package/plugin/dist/core/runtime-v2-prompt-activation-reader.d.ts +8 -0
- package/plugin/dist/core/session-tracker.d.ts +0 -13
- package/plugin/dist/core/signal-collector-host.d.ts +7 -1
- package/plugin/dist/core/signal-keyword-store.d.ts +41 -0
- package/plugin/dist/core/thinking-os-parser.d.ts +0 -5
- package/plugin/dist/core/trajectory-types.d.ts +0 -1
- package/plugin/dist/core/trajectory.d.ts +0 -12
- package/plugin/dist/hooks/gate.d.ts +0 -1
- package/plugin/dist/service/auto-consumer-governance-wiring.d.ts +34 -0
- package/plugin/dist/templates/langs/en/skills/pd-mentor/SKILL.md +3 -4
- package/plugin/dist/templates/langs/zh/skills/pd-mentor/SKILL.md +3 -4
- package/plugin/dist/templates/workspace/.principles/PROFILE.json +0 -29
- package/plugin/dist/templates/workspace/.principles/PROFILE.schema.json +16 -25
- package/plugin/dist/templates/workspace/okr/CURRENT_FOCUS.md +0 -1
- package/plugin/dist/types/event-types.d.ts +1 -1
- package/plugin/openclaw.plugin.json +1 -1
- package/plugin/package.json +1 -1
- package/plugin/templates/langs/en/skills/pd-mentor/SKILL.md +3 -4
- package/plugin/templates/langs/zh/skills/pd-mentor/SKILL.md +3 -4
- package/plugin/templates/workspace/.principles/PROFILE.json +0 -29
- package/plugin/templates/workspace/.principles/PROFILE.schema.json +16 -25
- package/plugin/templates/workspace/okr/CURRENT_FOCUS.md +0 -1
- package/templates/workspace/okr/CURRENT_FOCUS.md +0 -1
- package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.d.ts +0 -2
- package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.d.ts.map +0 -1
- package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.js +0 -149
- package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.js.map +0 -1
- package/core/dist/runtime-v2/thinking-models/index.d.ts +0 -3
- package/core/dist/runtime-v2/thinking-models/index.d.ts.map +0 -1
- package/core/dist/runtime-v2/thinking-models/index.js +0 -3
- package/core/dist/runtime-v2/thinking-models/index.js.map +0 -1
- package/core/dist/runtime-v2/thinking-models/thinking-models-policy.d.ts +0 -73
- package/core/dist/runtime-v2/thinking-models/thinking-models-policy.d.ts.map +0 -1
- package/core/dist/runtime-v2/thinking-models/thinking-models-policy.js +0 -227
- package/core/dist/runtime-v2/thinking-models/thinking-models-policy.js.map +0 -1
- package/plugin/dist/commands/thinking-os.d.ts +0 -2
- package/plugin/dist/core/control-ui-db.d.ts +0 -117
- package/plugin/dist/core/thinking-models.d.ts +0 -25
- package/plugin/dist/templates/workspace/.principles/THINKING_OS_CANDIDATES.md +0 -9
- package/plugin/templates/workspace/.principles/THINKING_OS_CANDIDATES.md +0 -9
- package/templates/langs/en/skills/admin/SKILL.md +0 -39
- package/templates/langs/en/skills/bootstrap-tools/SKILL.md +0 -53
- package/templates/langs/en/skills/deductive-audit/SKILL.md +0 -36
- package/templates/langs/en/skills/evolution-framework-update/SKILL.md +0 -31
- package/templates/langs/en/skills/evolve-system/SKILL.md +0 -46
- package/templates/langs/en/skills/evolve-task/SKILL.md +0 -83
- package/templates/langs/en/skills/feedback/SKILL.md +0 -51
- package/templates/langs/en/skills/init-strategy/SKILL.md +0 -54
- package/templates/langs/en/skills/inject-rule/SKILL.md +0 -19
- package/templates/langs/en/skills/manage-okr/SKILL.md +0 -96
- package/templates/langs/en/skills/pain/SKILL.md +0 -19
- package/templates/langs/en/skills/pd-mentor/SKILL.md +0 -211
- package/templates/langs/en/skills/profile/SKILL.md +0 -24
- package/templates/langs/en/skills/reflection/SKILL.md +0 -40
- package/templates/langs/en/skills/reflection-log/SKILL.md +0 -37
- package/templates/langs/en/skills/report/SKILL.md +0 -13
- package/templates/langs/en/skills/root-cause/SKILL.md +0 -33
- package/templates/langs/en/skills/triage/SKILL.md +0 -29
- package/templates/langs/en/skills/watch-evolution/SKILL.md +0 -33
- package/templates/langs/zh/skills/admin/SKILL.md +0 -41
- package/templates/langs/zh/skills/bootstrap-tools/SKILL.md +0 -52
- package/templates/langs/zh/skills/deductive-audit/SKILL.md +0 -36
- package/templates/langs/zh/skills/evolution-framework-update/SKILL.md +0 -31
- package/templates/langs/zh/skills/evolve-system/SKILL.md +0 -46
- package/templates/langs/zh/skills/evolve-task/SKILL.md +0 -83
- package/templates/langs/zh/skills/feedback/SKILL.md +0 -53
- package/templates/langs/zh/skills/init-strategy/SKILL.md +0 -54
- package/templates/langs/zh/skills/inject-rule/SKILL.md +0 -19
- package/templates/langs/zh/skills/manage-okr/SKILL.md +0 -109
- package/templates/langs/zh/skills/pain/SKILL.md +0 -30
- package/templates/langs/zh/skills/pd-auditor/SKILL.md +0 -61
- package/templates/langs/zh/skills/pd-explorer/SKILL.md +0 -65
- package/templates/langs/zh/skills/pd-implementer/SKILL.md +0 -68
- package/templates/langs/zh/skills/pd-mentor/SKILL.md +0 -211
- package/templates/langs/zh/skills/pd-planner/SKILL.md +0 -65
- package/templates/langs/zh/skills/pd-reporter/SKILL.md +0 -78
- package/templates/langs/zh/skills/pd-reviewer/SKILL.md +0 -66
- package/templates/langs/zh/skills/profile/SKILL.md +0 -24
- package/templates/langs/zh/skills/reflection/SKILL.md +0 -40
- package/templates/langs/zh/skills/reflection-log/SKILL.md +0 -37
- package/templates/langs/zh/skills/report/SKILL.md +0 -13
- package/templates/langs/zh/skills/root-cause/SKILL.md +0 -33
- package/templates/langs/zh/skills/triage/SKILL.md +0 -29
- package/templates/langs/zh/skills/watch-evolution/SKILL.md +0 -33
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* C (crash/restart liveness 轮): rollout revision budget persistence fail-closed。
|
|
3
|
+
*
|
|
4
|
+
* 顺序契约 (record-first): routing intent (iteration/cause) 持久化成功是
|
|
5
|
+
* reopen 的前置 — 禁止 "reopen 成功 + budget metadata 丢失 + rollout 正常完成"。
|
|
6
|
+
*
|
|
7
|
+
* 故障注入: 真实 store 上包装 stateManager,令 rollout 任务元数据写入在
|
|
8
|
+
* 第一次携带 rolloutRevisionPayload 时失败;随后恢复并重放 revision flow。
|
|
9
|
+
*/
|
|
10
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
11
|
+
import * as fs from 'node:fs';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import * as os from 'node:os';
|
|
14
|
+
import { RuntimeStateManager } from '../../store/runtime-state-manager.js';
|
|
15
|
+
import { InternalizationOrchestrator } from '../internalization-orchestrator.js';
|
|
16
|
+
import { RolloutReviewerRunner } from '../rollout-reviewer-runner.js';
|
|
17
|
+
import { DefaultRolloutReviewerValidator } from '../rollout-reviewer-output.js';
|
|
18
|
+
import { SqliteConnection } from '../../store/sqlite-connection.js';
|
|
19
|
+
import { SqlitePIArtifactStore } from '../../store/artifact/sqlite-pi-artifact-store.js';
|
|
20
|
+
import { storeEmitter } from '../../store/event-emitter.js';
|
|
21
|
+
import { hydratePITaskRecord, createPITaskDiagnosticJson, mergePITaskMetadata } from '../pitask-metadata.js';
|
|
22
|
+
let workspaceDir;
|
|
23
|
+
let stateManager;
|
|
24
|
+
let orchestrator;
|
|
25
|
+
const SCRIBE_ID = 'scribe-c-prompt';
|
|
26
|
+
const ARTIFICER_ID = 'artificer-c-prompt';
|
|
27
|
+
const EVAL_ID = 'evaluator-c-prompt';
|
|
28
|
+
const ROLLOUT_ID = 'rollout_reviewer-c-prompt';
|
|
29
|
+
const SCRIBE_ART = 'pi-art-scribe-c';
|
|
30
|
+
beforeEach(async () => {
|
|
31
|
+
workspaceDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-clv-'));
|
|
32
|
+
stateManager = new RuntimeStateManager({ workspaceDir });
|
|
33
|
+
await stateManager.initialize();
|
|
34
|
+
orchestrator = new InternalizationOrchestrator({ stateManager }, { owner: 'clv', runtimeKind: 'test-double', dryRun: true });
|
|
35
|
+
});
|
|
36
|
+
afterEach(async () => {
|
|
37
|
+
await stateManager.close();
|
|
38
|
+
try {
|
|
39
|
+
fs.rmSync(workspaceDir, { recursive: true, force: true });
|
|
40
|
+
}
|
|
41
|
+
catch { /* temp */ }
|
|
42
|
+
});
|
|
43
|
+
function meta(o = {}) {
|
|
44
|
+
return createPITaskDiagnosticJson({
|
|
45
|
+
dependencyTaskIds: [], channel: 'prompt', timeoutMs: 300_000,
|
|
46
|
+
inputArtifactRefs: [], outputArtifactRefs: [], ...o,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async function mkTask(id, kind, deps) {
|
|
50
|
+
await stateManager.createTask({ taskId: id, taskKind: kind, status: 'pending', attemptCount: 0, maxAttempts: 3, diagnosticJson: meta({ correlationId: 'c', dependencyTaskIds: deps }) });
|
|
51
|
+
}
|
|
52
|
+
async function succeed(id) {
|
|
53
|
+
await stateManager.acquireLease({ taskId: id, owner: 'clv', runtimeKind: 'test-double' });
|
|
54
|
+
await stateManager.markTaskSucceeded(id);
|
|
55
|
+
}
|
|
56
|
+
function makeOutput(decision) {
|
|
57
|
+
return {
|
|
58
|
+
taskId: ROLLOUT_ID, sourceEvaluatorArtifactId: 'pi-art-eval-c',
|
|
59
|
+
review: { decision, summary: 'c', confidence: 0.9, requiredChanges: decision === 'needs_revision' ? ['必须改 X'] : [], rolloutRisks: [], safetyChecks: [] },
|
|
60
|
+
sourceTrace: { evaluatorArtifactId: 'pi-art-eval-c' }, risks: [], generatedAt: new Date().toISOString(),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function scriptedAdapter(output) {
|
|
64
|
+
return {
|
|
65
|
+
startRun: async () => ({ runId: 'run-c', runtimeKind: 'test-double', startedAt: new Date().toISOString() }),
|
|
66
|
+
pollRun: async () => ({ status: 'succeeded', runId: 'run-c' }),
|
|
67
|
+
fetchOutput: async () => ({ runId: 'run-c', payload: output }),
|
|
68
|
+
cancelRun: async () => undefined,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** 包装 stateManager: 对 ROLLOUT_ID 的 rolloutRevisionPayload 元数据写入前 failN 次失败 */
|
|
72
|
+
function wrapRoutingWriteFailure(failures) {
|
|
73
|
+
const inner = stateManager;
|
|
74
|
+
const orig = inner.updateTaskDiagnosticJson;
|
|
75
|
+
inner.updateTaskDiagnosticJson = async (taskId, json) => {
|
|
76
|
+
if (taskId === ROLLOUT_ID && json.includes('"rolloutRevisionPayload"') && failures.count > 0) {
|
|
77
|
+
failures.count -= 1;
|
|
78
|
+
throw new Error('injected routing metadata write failure (disk)');
|
|
79
|
+
}
|
|
80
|
+
return orig.call(stateManager, taskId, json);
|
|
81
|
+
};
|
|
82
|
+
return stateManager;
|
|
83
|
+
}
|
|
84
|
+
async function resetRolloutForRerun() {
|
|
85
|
+
// 生产语义的"新一轮" = reopenTaskForRevision: 清 runnerDecision +
|
|
86
|
+
// completionIntent (epoch 前进)。fixture 必须镜像同一清理,否则残留的
|
|
87
|
+
// applied completionIntent 会触发补 terminal 分支而非新一轮评估。
|
|
88
|
+
const t = await stateManager.getTask(ROLLOUT_ID);
|
|
89
|
+
const pi = hydratePITaskRecord(t);
|
|
90
|
+
if (pi) {
|
|
91
|
+
await stateManager.updateTaskDiagnosticJson(ROLLOUT_ID, createPITaskDiagnosticJson(mergePITaskMetadata(pi, { runnerDecision: undefined, completionIntent: undefined })));
|
|
92
|
+
}
|
|
93
|
+
await stateManager.updateTask(ROLLOUT_ID, { status: 'pending', attemptCount: 0 });
|
|
94
|
+
}
|
|
95
|
+
function makeRunner(injected) {
|
|
96
|
+
return new RolloutReviewerRunner({
|
|
97
|
+
stateManager: injected, runtimeAdapter: scriptedAdapter(makeOutput('needs_revision')),
|
|
98
|
+
eventEmitter: storeEmitter, validator: new DefaultRolloutReviewerValidator(),
|
|
99
|
+
artifactStore: new SqlitePIArtifactStore(new SqliteConnection(workspaceDir)),
|
|
100
|
+
reopenRevisionTarget: async (input) => {
|
|
101
|
+
const r = await orchestrator.reopenTaskForRevision(input.targetTaskId, {
|
|
102
|
+
revisionFeedback: input.revisionFeedback,
|
|
103
|
+
revisionCauseId: `rollout-${input.sourceRolloutTaskId}-r${input.revisionIteration}`,
|
|
104
|
+
});
|
|
105
|
+
return r.ok ? { ok: true, reason: r.reason, reopenedTaskId: input.targetTaskId } : { ok: false, reason: r.reason };
|
|
106
|
+
},
|
|
107
|
+
}, { owner: 'clv', runtimeKind: 'test-double', pollIntervalMs: 5, timeoutMs: 5_000 });
|
|
108
|
+
}
|
|
109
|
+
async function readRolloutRouting() {
|
|
110
|
+
const t = await stateManager.getTask(ROLLOUT_ID);
|
|
111
|
+
const pi = hydratePITaskRecord(t);
|
|
112
|
+
return {
|
|
113
|
+
iteration: pi?.rolloutRevisionPayload?.revisionIteration,
|
|
114
|
+
causeId: pi?.revisionCauseId,
|
|
115
|
+
runnerDecision: pi?.runnerDecision,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
describe('C — rollout revision budget persistence fail-closed (record-first)', () => {
|
|
119
|
+
it('routing 元数据写失败 → 不 reopen + 任务不 succeeded;恢复后重放恰一次;iteration 不回退;2-round bound 保持', async () => {
|
|
120
|
+
// lineage: scribe(validated bearer) → artificer → evaluator(succeeded+approved) → rollout
|
|
121
|
+
await mkTask(SCRIBE_ID, 'scribe', []);
|
|
122
|
+
await succeed(SCRIBE_ID);
|
|
123
|
+
await mkTask(ARTIFICER_ID, 'artificer', [SCRIBE_ID]);
|
|
124
|
+
await succeed(ARTIFICER_ID);
|
|
125
|
+
await mkTask(EVAL_ID, 'evaluator', [ARTIFICER_ID]);
|
|
126
|
+
await succeed(EVAL_ID);
|
|
127
|
+
const evalRaw = await stateManager.getTask(EVAL_ID);
|
|
128
|
+
if (!evalRaw)
|
|
129
|
+
throw new Error('seed: evaluator missing');
|
|
130
|
+
const evalPi = hydratePITaskRecord(evalRaw);
|
|
131
|
+
if (!evalPi)
|
|
132
|
+
throw new Error('seed: evaluator not hydratable');
|
|
133
|
+
await stateManager.updateTaskDiagnosticJson(EVAL_ID, createPITaskDiagnosticJson(mergePITaskMetadata(evalPi, { runnerDecision: 'approved' })));
|
|
134
|
+
await mkTask(ROLLOUT_ID, 'rollout_reviewer', [EVAL_ID]);
|
|
135
|
+
const conn = new SqliteConnection(workspaceDir);
|
|
136
|
+
const store = new SqlitePIArtifactStore(conn);
|
|
137
|
+
await store.upsertArtifact({
|
|
138
|
+
artifactId: 'pi-art-eval-c', artifactKind: 'principle', sourceTaskId: EVAL_ID,
|
|
139
|
+
lineageArtifactIds: [], validationStatus: 'pending',
|
|
140
|
+
contentJson: JSON.stringify({ evaluation: { decision: 'approved', score: 0.9, strengths: [], concerns: [], requiredChanges: [] } }),
|
|
141
|
+
createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(),
|
|
142
|
+
});
|
|
143
|
+
await store.upsertArtifact({
|
|
144
|
+
artifactId: SCRIBE_ART, artifactKind: 'principle', sourceTaskId: SCRIBE_ID,
|
|
145
|
+
lineageArtifactIds: [], validationStatus: 'validated',
|
|
146
|
+
contentJson: JSON.stringify({ principleId: 'c-p', text: '原则', principleDraft: { title: 'c-p', statement: '原则' } }),
|
|
147
|
+
createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(),
|
|
148
|
+
});
|
|
149
|
+
conn.close();
|
|
150
|
+
// ── 1) 注入: 第一次 routing 元数据写失败 ──
|
|
151
|
+
const failures = { count: 1 };
|
|
152
|
+
const injected = wrapRoutingWriteFailure(failures);
|
|
153
|
+
const r1 = await makeRunner(injected).run(ROLLOUT_ID);
|
|
154
|
+
// fail-closed: 任务未 succeeded (retry 路径),scribe 未被 reopen
|
|
155
|
+
expect(r1.status).not.toBe('succeeded');
|
|
156
|
+
expect((await stateManager.getTask(SCRIBE_ID))?.status).toBe('succeeded');
|
|
157
|
+
expect((await readRolloutRouting()).iteration).toBeUndefined(); // budget 未落
|
|
158
|
+
// ── 2) 恢复 + 重放 (模拟重启后的 revision flow) ──
|
|
159
|
+
// run1 的 payload 写失败已把任务置 retry_wait (intent 已 pending durable)
|
|
160
|
+
// — 直接重跑即触发入口门 resume (无 LLM 重问),无需手工 reset。
|
|
161
|
+
const r1Task = await stateManager.getTask(ROLLOUT_ID);
|
|
162
|
+
if (r1Task?.status !== 'retry_wait')
|
|
163
|
+
throw new Error(`C: expected retry_wait after failure, got ${r1Task?.status}`);
|
|
164
|
+
const r2 = await makeRunner(stateManager).run(ROLLOUT_ID);
|
|
165
|
+
expect(r2.status).toBe('succeeded');
|
|
166
|
+
expect((await stateManager.getTask(SCRIBE_ID))?.status).toBe('pending'); // reopen 恰发生一次
|
|
167
|
+
const after1 = await readRolloutRouting();
|
|
168
|
+
expect(after1.iteration).toBe(1); // 不回退、不重复
|
|
169
|
+
// ── 3) 第二轮 revision (target 完成后再次 needs_revision) ──
|
|
170
|
+
await succeed(SCRIBE_ID); // target 修订完成
|
|
171
|
+
await resetRolloutForRerun();
|
|
172
|
+
const r3 = await makeRunner(stateManager).run(ROLLOUT_ID);
|
|
173
|
+
expect(r3.status).toBe('succeeded');
|
|
174
|
+
const after2 = await readRolloutRouting();
|
|
175
|
+
expect(after2.iteration).toBe(2); // 递进, 未重置
|
|
176
|
+
// ── 4) 第三轮 → budget exhausted → needs_human_review (2-round bound) ──
|
|
177
|
+
await succeed(SCRIBE_ID);
|
|
178
|
+
await resetRolloutForRerun();
|
|
179
|
+
const r4 = await makeRunner(stateManager).run(ROLLOUT_ID);
|
|
180
|
+
expect(r4.status).toBe('succeeded'); // runner 完成
|
|
181
|
+
expect((await stateManager.getTask(ROLLOUT_ID))?.status).toBe('needs_human_review');
|
|
182
|
+
expect((await stateManager.getTask(SCRIBE_ID))?.status).toBe('succeeded'); // 未产生额外 revision
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('B — revision intent materialization state machine', () => {
|
|
186
|
+
// 复用 C describe 的 lineage 构造: 提取为 helper
|
|
187
|
+
async function seedLineage() {
|
|
188
|
+
await mkTask(SCRIBE_ID, 'scribe', []);
|
|
189
|
+
await succeed(SCRIBE_ID);
|
|
190
|
+
await mkTask(ARTIFICER_ID, 'artificer', [SCRIBE_ID]);
|
|
191
|
+
await succeed(ARTIFICER_ID);
|
|
192
|
+
await mkTask(EVAL_ID, 'evaluator', [ARTIFICER_ID]);
|
|
193
|
+
await succeed(EVAL_ID);
|
|
194
|
+
const evalRaw = await stateManager.getTask(EVAL_ID);
|
|
195
|
+
if (!evalRaw)
|
|
196
|
+
throw new Error('seed: evaluator missing');
|
|
197
|
+
const evalPi = hydratePITaskRecord(evalRaw);
|
|
198
|
+
if (!evalPi)
|
|
199
|
+
throw new Error('seed: evaluator not hydratable');
|
|
200
|
+
await stateManager.updateTaskDiagnosticJson(EVAL_ID, createPITaskDiagnosticJson(mergePITaskMetadata(evalPi, { runnerDecision: 'approved' })));
|
|
201
|
+
await mkTask(ROLLOUT_ID, 'rollout_reviewer', [EVAL_ID]);
|
|
202
|
+
const conn = new SqliteConnection(workspaceDir);
|
|
203
|
+
const store = new SqlitePIArtifactStore(conn);
|
|
204
|
+
await store.upsertArtifact({
|
|
205
|
+
artifactId: 'pi-art-eval-c', artifactKind: 'principle', sourceTaskId: EVAL_ID,
|
|
206
|
+
lineageArtifactIds: [], validationStatus: 'pending',
|
|
207
|
+
contentJson: JSON.stringify({ evaluation: { decision: 'approved', score: 0.9, strengths: [], concerns: [], requiredChanges: [] } }),
|
|
208
|
+
createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(),
|
|
209
|
+
});
|
|
210
|
+
await store.upsertArtifact({
|
|
211
|
+
artifactId: SCRIBE_ART, artifactKind: 'principle', sourceTaskId: SCRIBE_ID,
|
|
212
|
+
lineageArtifactIds: [], validationStatus: 'validated',
|
|
213
|
+
contentJson: JSON.stringify({ principleId: 'c-p', text: '原则', principleDraft: { title: 'c-p', statement: '原则' } }),
|
|
214
|
+
createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(),
|
|
215
|
+
});
|
|
216
|
+
conn.close();
|
|
217
|
+
}
|
|
218
|
+
function runnerWithInjectedWriteFailure(failures) {
|
|
219
|
+
return makeRunner(wrapRoutingWriteFailure(failures));
|
|
220
|
+
}
|
|
221
|
+
async function readIntent() {
|
|
222
|
+
const pi = hydratePITaskRecord(await stateManager.getTask(ROLLOUT_ID));
|
|
223
|
+
return { iteration: pi?.rolloutRevisionPayload?.revisionIteration, status: pi?.rolloutRevisionPayload?.status };
|
|
224
|
+
}
|
|
225
|
+
async function scribeRc() {
|
|
226
|
+
const pi = hydratePITaskRecord(await stateManager.getTask(SCRIBE_ID));
|
|
227
|
+
return pi?.revisionCount ?? 0;
|
|
228
|
+
}
|
|
229
|
+
it('B1: persist intent r1 → crash before reopen → restart 继续执行 r1 (不自动 r2),budget 只耗 1', async () => {
|
|
230
|
+
await seedLineage();
|
|
231
|
+
// 手工构造 crash 态: 只完成 intent 持久化 (status pending, r1), 不 reopen
|
|
232
|
+
const raw = await stateManager.getTask(ROLLOUT_ID);
|
|
233
|
+
if (!raw)
|
|
234
|
+
throw new Error('B1: rollout task missing');
|
|
235
|
+
const pi = hydratePITaskRecord(raw);
|
|
236
|
+
if (!pi)
|
|
237
|
+
throw new Error('B1: rollout task not hydratable');
|
|
238
|
+
await stateManager.updateTaskDiagnosticJson(ROLLOUT_ID, createPITaskDiagnosticJson(mergePITaskMetadata(pi, {
|
|
239
|
+
rolloutRevisionPayload: {
|
|
240
|
+
requiredChanges: ['x'], revisionIteration: 1, sourceRolloutTaskId: ROLLOUT_ID,
|
|
241
|
+
sourceArtifactId: SCRIBE_ART, targetTaskKind: 'scribe', status: 'pending',
|
|
242
|
+
},
|
|
243
|
+
})));
|
|
244
|
+
// restart 后 revision flow 重放 (rollout runner 正常跑 needs_revision)
|
|
245
|
+
const r = await makeRunner(stateManager).run(ROLLOUT_ID);
|
|
246
|
+
expect(r.status).toBe('succeeded');
|
|
247
|
+
const intent = await readIntent();
|
|
248
|
+
expect(intent.iteration).toBe(1); // 继续 r1, 未跳 r2
|
|
249
|
+
expect(intent.status).toBe('applied');
|
|
250
|
+
expect(await scribeRc()).toBe(1); // target revisionCount 只 +1
|
|
251
|
+
});
|
|
252
|
+
it('B2: persist r1 + reopen r1 → crash before rollout succeeded → restart 识别已 materialize,不 reopen r2,revisionCount 不变', async () => {
|
|
253
|
+
await seedLineage();
|
|
254
|
+
// 正常跑完第一轮 (含 reopen + applied + succeeded)
|
|
255
|
+
const r1 = await makeRunner(stateManager).run(ROLLOUT_ID);
|
|
256
|
+
expect(r1.status).toBe('succeeded');
|
|
257
|
+
expect(await scribeRc()).toBe(1);
|
|
258
|
+
const rcAfterRound1 = await scribeRc();
|
|
259
|
+
// 构造 B2 crash 态 (现代协议): "reopen 已 materialize 但 rollout 未标
|
|
260
|
+
// succeeded 前崩溃" = completionIntent 回 pending (保留 target 的
|
|
261
|
+
// causeId=r1);payload 回 pending 模拟 markRevisionIntentApplied 前窗口。
|
|
262
|
+
const runs = await stateManager.getRunsByTask(ROLLOUT_ID);
|
|
263
|
+
const sourceRunId = runs[runs.length - 1]?.runId;
|
|
264
|
+
if (!sourceRunId)
|
|
265
|
+
throw new Error('B2: no durable run for intent sourceRunId');
|
|
266
|
+
const pi = hydratePITaskRecord(await stateManager.getTask(ROLLOUT_ID));
|
|
267
|
+
if (!pi)
|
|
268
|
+
throw new Error('B2: rollout not hydratable');
|
|
269
|
+
const payload = pi.rolloutRevisionPayload;
|
|
270
|
+
if (!payload)
|
|
271
|
+
throw new Error('B2: revision intent payload missing');
|
|
272
|
+
await stateManager.updateTaskDiagnosticJson(ROLLOUT_ID, createPITaskDiagnosticJson(mergePITaskMetadata(pi, {
|
|
273
|
+
completionIntent: { decision: 'needs_revision', sourceRunId, revisionEpoch: pi.revisionCount ?? 0, status: 'pending', revisionIteration: 1 },
|
|
274
|
+
rolloutRevisionPayload: { ...payload, status: 'pending' },
|
|
275
|
+
})));
|
|
276
|
+
await stateManager.updateTask(ROLLOUT_ID, { status: 'pending', attemptCount: 0 });
|
|
277
|
+
// restart 后重放: 必须识别 r1 已 materialize (target causeId 匹配)
|
|
278
|
+
const r2 = await makeRunner(stateManager).run(ROLLOUT_ID);
|
|
279
|
+
expect(r2.status).toBe('succeeded');
|
|
280
|
+
const intent = await readIntent();
|
|
281
|
+
expect(intent.iteration).toBe(1); // 未进到 r2
|
|
282
|
+
expect(intent.status).toBe('applied');
|
|
283
|
+
expect(await scribeRc()).toBe(rcAfterRound1); // 未产生额外 reopen
|
|
284
|
+
});
|
|
285
|
+
it('B3: budget 按 materialized 计数 — r1/r2 applied 后第三个 verdict 才 needs_human_review', async () => {
|
|
286
|
+
await seedLineage();
|
|
287
|
+
// r1
|
|
288
|
+
expect((await makeRunner(stateManager).run(ROLLOUT_ID)).status).toBe('succeeded');
|
|
289
|
+
await succeed(SCRIBE_ID);
|
|
290
|
+
await resetRolloutForRerun();
|
|
291
|
+
// r2
|
|
292
|
+
expect((await makeRunner(stateManager).run(ROLLOUT_ID)).status).toBe('succeeded');
|
|
293
|
+
expect((await readIntent()).iteration).toBe(2);
|
|
294
|
+
await succeed(SCRIBE_ID);
|
|
295
|
+
await resetRolloutForRerun();
|
|
296
|
+
// 第三个 verdict → exhausted (applied=2)
|
|
297
|
+
const r3 = await makeRunner(stateManager).run(ROLLOUT_ID);
|
|
298
|
+
expect(r3.status).toBe('succeeded');
|
|
299
|
+
expect((await stateManager.getTask(ROLLOUT_ID))?.status).toBe('needs_human_review');
|
|
300
|
+
expect(await scribeRc()).toBe(2); // 恰两次 materialized reopen
|
|
301
|
+
});
|
|
302
|
+
it('B4: intent 写失败 → 无 reopen,任务重试,budget/intent 不变', async () => {
|
|
303
|
+
await seedLineage();
|
|
304
|
+
const before = await readIntent();
|
|
305
|
+
const r = await runnerWithInjectedWriteFailure({ count: 1 }).run(ROLLOUT_ID);
|
|
306
|
+
expect(r.status).not.toBe('succeeded');
|
|
307
|
+
expect((await stateManager.getTask(SCRIBE_ID))?.status).toBe('succeeded'); // 未 reopen
|
|
308
|
+
expect(await readIntent()).toEqual(before); // budget 未写
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
//# sourceMappingURL=crash-liveness-regressions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crash-liveness-regressions.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/crash-liveness-regressions.test.ts"],"names":[],"mappings":"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"}
|
package/core/dist/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-review-p0-regressions.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 外部复核 P0 回归测试 (P0-3 / P0-4 / P1-1)。
|
|
3
|
+
*
|
|
4
|
+
* P0-4 fault injection: repair seed 成功后模拟 evaluator completion crash,
|
|
5
|
+
* 重放同一 commit — 断言 repair task 唯一 (确定性 id) 且 reopen 真幂等
|
|
6
|
+
* (revisionCount 不递增)。
|
|
7
|
+
* P0-3 orchestrator 传导: durable verdict 缺失时 runs.output_payload 的
|
|
8
|
+
* 显式 verdict 是唯一 legacy 判据。
|
|
9
|
+
* P1-1: artificer prompt 真实携带 rollout revisionFeedback。
|
|
10
|
+
*/
|
|
11
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
12
|
+
import * as fs from 'node:fs';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
import * as os from 'node:os';
|
|
15
|
+
import { RuntimeStateManager } from '../../store/runtime-state-manager.js';
|
|
16
|
+
import { InternalizationOrchestrator } from '../internalization-orchestrator.js';
|
|
17
|
+
import { ArtificerRunner } from '../artificer-runner.js';
|
|
18
|
+
import { DefaultArtificerValidator } from '../artificer-output.js';
|
|
19
|
+
import { MemoryPIArtifactStore } from '../pi-artifact-store.js';
|
|
20
|
+
import { hydratePITaskRecord, createPITaskDiagnosticJson, mergePITaskMetadata } from '../pitask-metadata.js';
|
|
21
|
+
import { storeEmitter } from '../../store/event-emitter.js';
|
|
22
|
+
let workspaceDir;
|
|
23
|
+
let stateManager;
|
|
24
|
+
let orchestrator;
|
|
25
|
+
beforeEach(async () => {
|
|
26
|
+
workspaceDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-p0reg-'));
|
|
27
|
+
stateManager = new RuntimeStateManager({ workspaceDir });
|
|
28
|
+
await stateManager.initialize();
|
|
29
|
+
orchestrator = new InternalizationOrchestrator({ stateManager }, { owner: 'p0reg', runtimeKind: 'test-double', dryRun: true });
|
|
30
|
+
});
|
|
31
|
+
afterEach(async () => {
|
|
32
|
+
await stateManager.close();
|
|
33
|
+
try {
|
|
34
|
+
fs.rmSync(workspaceDir, { recursive: true, force: true });
|
|
35
|
+
}
|
|
36
|
+
catch { /* temp */ }
|
|
37
|
+
});
|
|
38
|
+
function meta(o = {}) {
|
|
39
|
+
return createPITaskDiagnosticJson({
|
|
40
|
+
dependencyTaskIds: [], channel: 'prompt', timeoutMs: 300_000,
|
|
41
|
+
inputArtifactRefs: [], outputArtifactRefs: [], ...o,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async function mkTask(taskId, taskKind, diagnosticJson) {
|
|
45
|
+
await stateManager.createTask({
|
|
46
|
+
taskId, taskKind, status: 'pending', attemptCount: 0, maxAttempts: 3, diagnosticJson,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async function succeed(taskId, runnerDecision) {
|
|
50
|
+
await stateManager.acquireLease({ taskId, owner: 'p0reg', runtimeKind: 'test-double' });
|
|
51
|
+
await stateManager.markTaskSucceeded(taskId);
|
|
52
|
+
if (runnerDecision) {
|
|
53
|
+
const t = await stateManager.getTask(taskId);
|
|
54
|
+
const pi = hydratePITaskRecord(t);
|
|
55
|
+
if (pi) {
|
|
56
|
+
await stateManager.updateTaskDiagnosticJson(taskId, createPITaskDiagnosticJson(mergePITaskMetadata(pi, { runnerDecision: runnerDecision })));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// ── P0-4: deterministic repair identity + idempotent reopen ──────────────────
|
|
61
|
+
describe('P0-4 — repair/reopen 真幂等 (fault injection)', () => {
|
|
62
|
+
it('repair 完成后 evaluator completion crash → 重放 commit: repair task 唯一,revisionCount 不递增', async () => {
|
|
63
|
+
const EVAL_ID = 'evaluator-p04-prompt';
|
|
64
|
+
const SCRIBE_ID = 'scribe-p04-prompt';
|
|
65
|
+
const REPAIR_ID = 'artificer-repair-evaluator-p04-prompt-r1'; // 确定性 id
|
|
66
|
+
await mkTask(SCRIBE_ID, 'scribe', meta({ correlationId: 'p04' }));
|
|
67
|
+
await succeed(SCRIBE_ID);
|
|
68
|
+
await mkTask('artificer-p04-prompt', 'artificer', meta({ dependencyTaskIds: [SCRIBE_ID], correlationId: 'p04' }));
|
|
69
|
+
await succeed('artificer-p04-prompt');
|
|
70
|
+
await mkTask(EVAL_ID, 'evaluator', meta({ dependencyTaskIds: ['artificer-p04-prompt'], correlationId: 'p04' }));
|
|
71
|
+
await succeed(EVAL_ID, 'needs_revision');
|
|
72
|
+
// evaluator runner 已 seed repair (生产由 seeder 创建; 此处按生产确定性 id)
|
|
73
|
+
await mkTask(REPAIR_ID, 'artificer', meta({
|
|
74
|
+
dependencyTaskIds: [SCRIBE_ID], correlationId: 'p04',
|
|
75
|
+
repairPayload: { requiredChanges: ['x'], concerns: [], previousScore: 0.4, repairIteration: 1, sourceArtificerArtifactId: 'pi-art-a', sourceEvaluatorTaskId: EVAL_ID },
|
|
76
|
+
}));
|
|
77
|
+
// repair 完成 → commit → evaluator reopen (第一次)
|
|
78
|
+
await succeed(REPAIR_ID);
|
|
79
|
+
const r1 = await orchestrator.commitNextTaskProposal(REPAIR_ID);
|
|
80
|
+
expect(r1.decision).toBe('revision_reopened');
|
|
81
|
+
let evalTask = await stateManager.getTask(EVAL_ID);
|
|
82
|
+
let evalPi = hydratePITaskRecord(evalTask);
|
|
83
|
+
expect(evalPi?.revisionCount).toBe(1);
|
|
84
|
+
// ── fault injection: 模拟 evaluator 修订轮完成过程中 crash ──
|
|
85
|
+
// (不推进 evaluator; consumer 下一周期重放同一 repair commit)
|
|
86
|
+
const r2 = await orchestrator.commitNextTaskProposal(REPAIR_ID);
|
|
87
|
+
// crash-liveness 轮: 同 cause 重放 = 真 no-op (不再是 revision_reopened)
|
|
88
|
+
expect(r2.decision).toBe('revision_reopen_noop');
|
|
89
|
+
// 关键断言: revisionCount 不递增 (同 causeId 重放 = no-op 语义)
|
|
90
|
+
evalTask = await stateManager.getTask(EVAL_ID);
|
|
91
|
+
evalPi = hydratePITaskRecord(evalTask);
|
|
92
|
+
expect(evalPi?.revisionCount).toBe(1);
|
|
93
|
+
// repair task 唯一: 重放没有创建第二个 repair 任务
|
|
94
|
+
const tasks = await stateManager.listTasks({});
|
|
95
|
+
const repairTasks = tasks.filter((t) => t.taskKind === 'artificer' && t.taskId.startsWith('artificer-repair-'));
|
|
96
|
+
expect(repairTasks.length).toBe(1);
|
|
97
|
+
expect(repairTasks[0]?.taskId).toBe(REPAIR_ID);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
// ── P0-3: orchestrator legacy verdict 传导 ───────────────────────────────────
|
|
101
|
+
describe('P0-3 — durable verdict 缺失时的显式 legacy 解析', () => {
|
|
102
|
+
it('runs.output_payload 携带 needs_revision → blocked_by_revision (不 ADVANCE,不 BLOCKED)', async () => {
|
|
103
|
+
const EVAL_ID = 'evaluator-p03-prompt';
|
|
104
|
+
await mkTask(EVAL_ID, 'evaluator', meta({ correlationId: 'p03' }));
|
|
105
|
+
await succeed(EVAL_ID); // 无 runnerDecision (历史数据形状)
|
|
106
|
+
// 历史 verdict 载体: 最近 succeeded run 的 output_payload
|
|
107
|
+
const runs = await stateManager.getRunsByTask(EVAL_ID);
|
|
108
|
+
expect(runs.length).toBeGreaterThan(0);
|
|
109
|
+
const runId = runs[runs.length - 1]?.runId ?? '';
|
|
110
|
+
await stateManager.updateRunOutput(runId, JSON.stringify({
|
|
111
|
+
evaluation: { decision: 'needs_revision', summary: 'x', score: 0.4, strengths: [], concerns: [], requiredChanges: ['y'] },
|
|
112
|
+
}));
|
|
113
|
+
const r = await orchestrator.commitNextTaskProposal(EVAL_ID);
|
|
114
|
+
expect(r.decision).toBe('blocked_by_revision');
|
|
115
|
+
});
|
|
116
|
+
it('无 durable 且 runs 无可解析 verdict → blocked_missing_verdict (fail-closed)', async () => {
|
|
117
|
+
const EVAL_ID = 'evaluator-p03b-prompt';
|
|
118
|
+
await mkTask(EVAL_ID, 'evaluator', meta({ correlationId: 'p03b' }));
|
|
119
|
+
await succeed(EVAL_ID);
|
|
120
|
+
// runs 存在但 output_payload 为空/非 JSON
|
|
121
|
+
const runs = await stateManager.getRunsByTask(EVAL_ID);
|
|
122
|
+
const runId = runs[runs.length - 1]?.runId ?? '';
|
|
123
|
+
const r1 = await orchestrator.commitNextTaskProposal(EVAL_ID);
|
|
124
|
+
expect(r1.decision).toBe('blocked_missing_verdict');
|
|
125
|
+
await stateManager.updateRunOutput(runId, 'not-json');
|
|
126
|
+
const r2 = await orchestrator.commitNextTaskProposal(EVAL_ID);
|
|
127
|
+
expect(r2.decision).toBe('blocked_missing_verdict');
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
// ── P1-1: artificer prompt 携带 rollout revisionFeedback ─────────────────────
|
|
131
|
+
describe('P1-1 — artificer 真实消费 rollout requiredChanges', () => {
|
|
132
|
+
it('revisionFeedback 存在时,发给 RuntimeAdapter 的 prompt 包含 requiredChanges 文本', async () => {
|
|
133
|
+
const SCRIBE_ID = 'scribe-p11-prompt';
|
|
134
|
+
const ARTIFICER_ID = 'artificer-p11-prompt';
|
|
135
|
+
await mkTask(SCRIBE_ID, 'scribe', meta({ correlationId: 'p11' }));
|
|
136
|
+
await succeed(SCRIBE_ID);
|
|
137
|
+
const artifactStore = new MemoryPIArtifactStore();
|
|
138
|
+
await artifactStore.upsertArtifact({
|
|
139
|
+
artifactId: 'pi-art-scribe-p11', artifactKind: 'principle', sourceTaskId: SCRIBE_ID,
|
|
140
|
+
lineageArtifactIds: [], validationStatus: 'validated',
|
|
141
|
+
contentJson: JSON.stringify({ principleId: 'p11', text: '原则', principleDraft: { title: 'p11', statement: '原则' } }),
|
|
142
|
+
createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(),
|
|
143
|
+
});
|
|
144
|
+
// artificer 任务带 rollout revisionFeedback (reopen 注入)
|
|
145
|
+
await mkTask(ARTIFICER_ID, 'artificer', meta({
|
|
146
|
+
dependencyTaskIds: [SCRIBE_ID], correlationId: 'p11',
|
|
147
|
+
revisionFeedback: 'Rollout review 判定 needs_revision,请修订后重新走验证链:\n- 必须修改: 规则必须覆盖子目录场景\n- 风险: 未覆盖 nested path',
|
|
148
|
+
}));
|
|
149
|
+
const capturedPrompts = [];
|
|
150
|
+
const adapter = {
|
|
151
|
+
startRun: async (input) => {
|
|
152
|
+
capturedPrompts.push(String(input.inputPayload));
|
|
153
|
+
return { runId: 'run-p11', runtimeKind: 'test-double', startedAt: new Date().toISOString() };
|
|
154
|
+
},
|
|
155
|
+
pollRun: async () => ({ status: 'succeeded', runId: 'run-p11' }),
|
|
156
|
+
fetchOutput: async () => ({ runId: 'run-p11', payload: null }),
|
|
157
|
+
cancelRun: async () => undefined,
|
|
158
|
+
};
|
|
159
|
+
const runner = new ArtificerRunner({
|
|
160
|
+
stateManager, runtimeAdapter: adapter, eventEmitter: storeEmitter,
|
|
161
|
+
artifactStore, validator: new DefaultArtificerValidator(), contentHashFn: undefined,
|
|
162
|
+
}, { owner: 'p11', runtimeKind: 'test-double', pollIntervalMs: 5, timeoutMs: 5_000 });
|
|
163
|
+
// fetchOutput 返回 null → runner 走失败路径;但 prompt 已捕获 — 断言 prompt 内容
|
|
164
|
+
await runner.run(ARTIFICER_ID).catch(() => undefined);
|
|
165
|
+
expect(capturedPrompts.length).toBeGreaterThan(0);
|
|
166
|
+
const prompt = capturedPrompts.join('\n');
|
|
167
|
+
expect(prompt).toContain('规则必须覆盖子目录场景'); // requiredChange 原文
|
|
168
|
+
expect(prompt).toContain('rollout_revision_feedback'); // 注入信封标记
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
//# sourceMappingURL=external-review-p0-regressions.test.js.map
|
package/core/dist/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-review-p0-regressions.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/external-review-p0-regressions.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -175,12 +175,21 @@ describe('Internalization Task Guards (PRI-62)', () => {
|
|
|
175
175
|
it('disallows retry_wait -> retry_wait (self-transition)', () => {
|
|
176
176
|
expect(canTransitionTo('retry_wait', 'retry_wait')).toBe(false);
|
|
177
177
|
});
|
|
178
|
-
it('
|
|
179
|
-
|
|
178
|
+
it('allows succeeded -> pending ONLY for revision reopen (P0-D, INV-02); disallows other successors', () => {
|
|
179
|
+
// 契约变更 (2026-08-18, MVP core-loop closure): succeeded → pending 是
|
|
180
|
+
// revision reopen 的合法出边 (orchestrator.reopenTaskForRevision:
|
|
181
|
+
// evaluator repair 轮、rollout revision 路由、上游修订级联)。
|
|
182
|
+
// 其余 succeeded 出边仍然全部禁止。
|
|
183
|
+
expect(canTransitionTo('succeeded', 'pending')).toBe(true);
|
|
180
184
|
expect(canTransitionTo('succeeded', 'leased')).toBe(false);
|
|
181
185
|
expect(canTransitionTo('succeeded', 'failed')).toBe(false);
|
|
182
186
|
expect(canTransitionTo('succeeded', 'retry_wait')).toBe(false);
|
|
183
187
|
});
|
|
188
|
+
it('allows needs_human_review -> pending (owner retry out-edge, INV-03); disallows others', () => {
|
|
189
|
+
expect(canTransitionTo('needs_human_review', 'pending')).toBe(true);
|
|
190
|
+
expect(canTransitionTo('needs_human_review', 'leased')).toBe(false);
|
|
191
|
+
expect(canTransitionTo('needs_human_review', 'failed')).toBe(false);
|
|
192
|
+
});
|
|
184
193
|
it('disallows failed -> any state', () => {
|
|
185
194
|
expect(canTransitionTo('failed', 'pending')).toBe(false);
|
|
186
195
|
expect(canTransitionTo('failed', 'leased')).toBe(false);
|