popeye-cli 2.2.0 → 2.7.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/dist/adapters/gemini.d.ts +14 -0
- package/dist/adapters/gemini.d.ts.map +1 -1
- package/dist/adapters/gemini.js +41 -6
- package/dist/adapters/gemini.js.map +1 -1
- package/dist/adapters/grok.d.ts +14 -0
- package/dist/adapters/grok.d.ts.map +1 -1
- package/dist/adapters/grok.js +42 -6
- package/dist/adapters/grok.js.map +1 -1
- package/dist/adapters/openai.d.ts +10 -0
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +44 -5
- package/dist/adapters/openai.js.map +1 -1
- package/dist/cli/commands/create.js +1 -1
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +324 -20
- package/dist/cli/interactive.js.map +1 -1
- package/dist/generators/all.d.ts.map +1 -1
- package/dist/generators/all.js +3 -2
- package/dist/generators/all.js.map +1 -1
- package/dist/generators/doc-parser.d.ts +21 -6
- package/dist/generators/doc-parser.d.ts.map +1 -1
- package/dist/generators/doc-parser.js +55 -4
- package/dist/generators/doc-parser.js.map +1 -1
- package/dist/generators/templates/fullstack.js +1 -1
- package/dist/generators/templates/website-components.js +1 -1
- package/dist/generators/templates/website-components.js.map +1 -1
- package/dist/generators/templates/website-config.d.ts +4 -1
- package/dist/generators/templates/website-config.d.ts.map +1 -1
- package/dist/generators/templates/website-config.js +17 -11
- package/dist/generators/templates/website-config.js.map +1 -1
- package/dist/generators/templates/website-conversion.js +1 -1
- package/dist/generators/templates/website-conversion.js.map +1 -1
- package/dist/generators/templates/website-landing.js +1 -1
- package/dist/generators/templates/website-landing.js.map +1 -1
- package/dist/generators/templates/website-layout.d.ts +36 -4
- package/dist/generators/templates/website-layout.d.ts.map +1 -1
- package/dist/generators/templates/website-layout.js +466 -23
- package/dist/generators/templates/website-layout.js.map +1 -1
- package/dist/generators/templates/website-pricing.js +1 -1
- package/dist/generators/templates/website-pricing.js.map +1 -1
- package/dist/generators/templates/website-sections.js +1 -1
- package/dist/generators/templates/website-sections.js.map +1 -1
- package/dist/generators/templates/website-seo.d.ts.map +1 -1
- package/dist/generators/templates/website-seo.js +4 -1
- package/dist/generators/templates/website-seo.js.map +1 -1
- package/dist/generators/templates/website.d.ts +1 -1
- package/dist/generators/templates/website.d.ts.map +1 -1
- package/dist/generators/templates/website.js +1 -1
- package/dist/generators/templates/website.js.map +1 -1
- package/dist/generators/website-content-ai.d.ts +52 -0
- package/dist/generators/website-content-ai.d.ts.map +1 -0
- package/dist/generators/website-content-ai.js +141 -0
- package/dist/generators/website-content-ai.js.map +1 -0
- package/dist/generators/website-content-scanner.d.ts +1 -1
- package/dist/generators/website-content-scanner.d.ts.map +1 -1
- package/dist/generators/website-content-scanner.js +98 -1
- package/dist/generators/website-content-scanner.js.map +1 -1
- package/dist/generators/website-context.d.ts +34 -1
- package/dist/generators/website-context.d.ts.map +1 -1
- package/dist/generators/website-context.js +131 -9
- package/dist/generators/website-context.js.map +1 -1
- package/dist/generators/website-debug.d.ts +12 -0
- package/dist/generators/website-debug.d.ts.map +1 -1
- package/dist/generators/website-debug.js +16 -0
- package/dist/generators/website-debug.js.map +1 -1
- package/dist/generators/website.d.ts.map +1 -1
- package/dist/generators/website.js +26 -4
- package/dist/generators/website.js.map +1 -1
- package/dist/pipeline/auto-recovery.d.ts +56 -0
- package/dist/pipeline/auto-recovery.d.ts.map +1 -0
- package/dist/pipeline/auto-recovery.js +185 -0
- package/dist/pipeline/auto-recovery.js.map +1 -0
- package/dist/pipeline/change-request.d.ts +39 -0
- package/dist/pipeline/change-request.d.ts.map +1 -1
- package/dist/pipeline/change-request.js +40 -1
- package/dist/pipeline/change-request.js.map +1 -1
- package/dist/pipeline/check-runner.d.ts +30 -1
- package/dist/pipeline/check-runner.d.ts.map +1 -1
- package/dist/pipeline/check-runner.js +122 -1
- package/dist/pipeline/check-runner.js.map +1 -1
- package/dist/pipeline/command-resolver.d.ts.map +1 -1
- package/dist/pipeline/command-resolver.js +33 -2
- package/dist/pipeline/command-resolver.js.map +1 -1
- package/dist/pipeline/consensus/arbitrator-query.d.ts +22 -0
- package/dist/pipeline/consensus/arbitrator-query.d.ts.map +1 -0
- package/dist/pipeline/consensus/arbitrator-query.js +70 -0
- package/dist/pipeline/consensus/arbitrator-query.js.map +1 -0
- package/dist/pipeline/consensus/consensus-runner.d.ts +131 -7
- package/dist/pipeline/consensus/consensus-runner.d.ts.map +1 -1
- package/dist/pipeline/consensus/consensus-runner.js +809 -35
- package/dist/pipeline/consensus/consensus-runner.js.map +1 -1
- package/dist/pipeline/cr-lifecycle.d.ts +42 -0
- package/dist/pipeline/cr-lifecycle.d.ts.map +1 -0
- package/dist/pipeline/cr-lifecycle.js +89 -0
- package/dist/pipeline/cr-lifecycle.js.map +1 -0
- package/dist/pipeline/gate-engine.d.ts +1 -0
- package/dist/pipeline/gate-engine.d.ts.map +1 -1
- package/dist/pipeline/gate-engine.js +26 -7
- package/dist/pipeline/gate-engine.js.map +1 -1
- package/dist/pipeline/orchestrator.d.ts +1 -1
- package/dist/pipeline/orchestrator.d.ts.map +1 -1
- package/dist/pipeline/orchestrator.js +306 -16
- package/dist/pipeline/orchestrator.js.map +1 -1
- package/dist/pipeline/packets/consensus-packet-builder.d.ts +15 -4
- package/dist/pipeline/packets/consensus-packet-builder.d.ts.map +1 -1
- package/dist/pipeline/packets/consensus-packet-builder.js +29 -17
- package/dist/pipeline/packets/consensus-packet-builder.js.map +1 -1
- package/dist/pipeline/phases/architecture.d.ts.map +1 -1
- package/dist/pipeline/phases/architecture.js +5 -3
- package/dist/pipeline/phases/architecture.js.map +1 -1
- package/dist/pipeline/phases/audit.d.ts.map +1 -1
- package/dist/pipeline/phases/audit.js +5 -3
- package/dist/pipeline/phases/audit.js.map +1 -1
- package/dist/pipeline/phases/consensus-architecture.d.ts.map +1 -1
- package/dist/pipeline/phases/consensus-architecture.js +10 -1
- package/dist/pipeline/phases/consensus-architecture.js.map +1 -1
- package/dist/pipeline/phases/consensus-master-plan.d.ts.map +1 -1
- package/dist/pipeline/phases/consensus-master-plan.js +10 -3
- package/dist/pipeline/phases/consensus-master-plan.js.map +1 -1
- package/dist/pipeline/phases/consensus-role-plans.d.ts.map +1 -1
- package/dist/pipeline/phases/consensus-role-plans.js +10 -1
- package/dist/pipeline/phases/consensus-role-plans.js.map +1 -1
- package/dist/pipeline/phases/done.d.ts.map +1 -1
- package/dist/pipeline/phases/done.js +9 -4
- package/dist/pipeline/phases/done.js.map +1 -1
- package/dist/pipeline/phases/intake.d.ts.map +1 -1
- package/dist/pipeline/phases/intake.js +7 -3
- package/dist/pipeline/phases/intake.js.map +1 -1
- package/dist/pipeline/phases/phase-context.d.ts +2 -0
- package/dist/pipeline/phases/phase-context.d.ts.map +1 -1
- package/dist/pipeline/phases/phase-context.js +3 -1
- package/dist/pipeline/phases/phase-context.js.map +1 -1
- package/dist/pipeline/phases/production-gate.d.ts.map +1 -1
- package/dist/pipeline/phases/production-gate.js +28 -3
- package/dist/pipeline/phases/production-gate.js.map +1 -1
- package/dist/pipeline/phases/qa-validation.d.ts.map +1 -1
- package/dist/pipeline/phases/qa-validation.js +38 -5
- package/dist/pipeline/phases/qa-validation.js.map +1 -1
- package/dist/pipeline/phases/recovery-loop.d.ts +2 -0
- package/dist/pipeline/phases/recovery-loop.d.ts.map +1 -1
- package/dist/pipeline/phases/recovery-loop.js +200 -6
- package/dist/pipeline/phases/recovery-loop.js.map +1 -1
- package/dist/pipeline/phases/review.d.ts.map +1 -1
- package/dist/pipeline/phases/review.js +58 -28
- package/dist/pipeline/phases/review.js.map +1 -1
- package/dist/pipeline/phases/role-planning.d.ts.map +1 -1
- package/dist/pipeline/phases/role-planning.js +18 -2
- package/dist/pipeline/phases/role-planning.js.map +1 -1
- package/dist/pipeline/phases/stuck.d.ts.map +1 -1
- package/dist/pipeline/phases/stuck.js +10 -0
- package/dist/pipeline/phases/stuck.js.map +1 -1
- package/dist/pipeline/repo-snapshot.d.ts.map +1 -1
- package/dist/pipeline/repo-snapshot.js +3 -0
- package/dist/pipeline/repo-snapshot.js.map +1 -1
- package/dist/pipeline/role-execution-adapter.d.ts +2 -1
- package/dist/pipeline/role-execution-adapter.d.ts.map +1 -1
- package/dist/pipeline/role-execution-adapter.js +22 -7
- package/dist/pipeline/role-execution-adapter.js.map +1 -1
- package/dist/pipeline/skill-loader.d.ts +19 -0
- package/dist/pipeline/skill-loader.d.ts.map +1 -1
- package/dist/pipeline/skill-loader.js +22 -0
- package/dist/pipeline/skill-loader.js.map +1 -1
- package/dist/pipeline/skills/coverage-gate.d.ts +44 -0
- package/dist/pipeline/skills/coverage-gate.d.ts.map +1 -0
- package/dist/pipeline/skills/coverage-gate.js +143 -0
- package/dist/pipeline/skills/coverage-gate.js.map +1 -0
- package/dist/pipeline/skills/usage-registry.d.ts +48 -0
- package/dist/pipeline/skills/usage-registry.d.ts.map +1 -0
- package/dist/pipeline/skills/usage-registry.js +55 -0
- package/dist/pipeline/skills/usage-registry.js.map +1 -0
- package/dist/pipeline/strategy-context.d.ts +20 -0
- package/dist/pipeline/strategy-context.d.ts.map +1 -0
- package/dist/pipeline/strategy-context.js +55 -0
- package/dist/pipeline/strategy-context.js.map +1 -0
- package/dist/pipeline/type-defs/artifacts.d.ts +25 -5
- package/dist/pipeline/type-defs/artifacts.d.ts.map +1 -1
- package/dist/pipeline/type-defs/artifacts.js +4 -0
- package/dist/pipeline/type-defs/artifacts.js.map +1 -1
- package/dist/pipeline/type-defs/audit.d.ts +25 -13
- package/dist/pipeline/type-defs/audit.d.ts.map +1 -1
- package/dist/pipeline/type-defs/checks.d.ts +18 -8
- package/dist/pipeline/type-defs/checks.d.ts.map +1 -1
- package/dist/pipeline/type-defs/checks.js +4 -0
- package/dist/pipeline/type-defs/checks.js.map +1 -1
- package/dist/pipeline/type-defs/packets.d.ts +104 -18
- package/dist/pipeline/type-defs/packets.d.ts.map +1 -1
- package/dist/pipeline/type-defs/packets.js +17 -1
- package/dist/pipeline/type-defs/packets.js.map +1 -1
- package/dist/pipeline/type-defs/state.d.ts +160 -16
- package/dist/pipeline/type-defs/state.d.ts.map +1 -1
- package/dist/pipeline/type-defs/state.js +26 -1
- package/dist/pipeline/type-defs/state.js.map +1 -1
- package/dist/shared/text-utils.d.ts +23 -0
- package/dist/shared/text-utils.d.ts.map +1 -0
- package/dist/shared/text-utils.js +66 -0
- package/dist/shared/text-utils.js.map +1 -0
- package/dist/shared/website-strategy-format.d.ts +18 -0
- package/dist/shared/website-strategy-format.d.ts.map +1 -0
- package/dist/shared/website-strategy-format.js +47 -0
- package/dist/shared/website-strategy-format.js.map +1 -0
- package/dist/state/index.d.ts +2 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +57 -8
- package/dist/state/index.js.map +1 -1
- package/dist/types/consensus.d.ts +1 -0
- package/dist/types/consensus.d.ts.map +1 -1
- package/dist/types/consensus.js.map +1 -1
- package/dist/types/website-strategy.d.ts +1 -1
- package/dist/types/workflow.d.ts +447 -0
- package/dist/types/workflow.d.ts.map +1 -1
- package/dist/types/workflow.js +3 -0
- package/dist/types/workflow.js.map +1 -1
- package/dist/upgrade/handlers.d.ts.map +1 -1
- package/dist/upgrade/handlers.js +6 -3
- package/dist/upgrade/handlers.js.map +1 -1
- package/dist/workflow/consensus.d.ts.map +1 -1
- package/dist/workflow/consensus.js +1 -0
- package/dist/workflow/consensus.js.map +1 -1
- package/dist/workflow/website-strategy.d.ts.map +1 -1
- package/dist/workflow/website-strategy.js +2 -29
- package/dist/workflow/website-strategy.js.map +1 -1
- package/dist/workflow/website-updater.d.ts.map +1 -1
- package/dist/workflow/website-updater.js +3 -2
- package/dist/workflow/website-updater.js.map +1 -1
- package/package.json +1 -1
- package/src/adapters/gemini.ts +51 -6
- package/src/adapters/grok.ts +51 -6
- package/src/adapters/openai.ts +53 -5
- package/src/cli/commands/create.ts +1 -1
- package/src/cli/interactive.ts +333 -19
- package/src/generators/all.ts +3 -2
- package/src/generators/doc-parser.ts +75 -15
- package/src/generators/templates/fullstack.ts +1 -1
- package/src/generators/templates/website-components.ts +1 -1
- package/src/generators/templates/website-config.ts +23 -11
- package/src/generators/templates/website-conversion.ts +1 -1
- package/src/generators/templates/website-landing.ts +1 -1
- package/src/generators/templates/website-layout.ts +491 -23
- package/src/generators/templates/website-pricing.ts +1 -1
- package/src/generators/templates/website-sections.ts +1 -1
- package/src/generators/templates/website-seo.ts +4 -1
- package/src/generators/templates/website.ts +3 -0
- package/src/generators/website-content-ai.ts +186 -0
- package/src/generators/website-content-scanner.ts +113 -1
- package/src/generators/website-context.ts +151 -12
- package/src/generators/website-debug.ts +26 -0
- package/src/generators/website.ts +28 -3
- package/src/pipeline/auto-recovery.ts +283 -0
- package/src/pipeline/change-request.ts +63 -1
- package/src/pipeline/check-runner.ts +141 -2
- package/src/pipeline/command-resolver.ts +34 -2
- package/src/pipeline/consensus/arbitrator-query.ts +101 -0
- package/src/pipeline/consensus/consensus-runner.ts +1099 -42
- package/src/pipeline/cr-lifecycle.ts +103 -0
- package/src/pipeline/gate-engine.ts +35 -7
- package/src/pipeline/orchestrator.ts +361 -16
- package/src/pipeline/packets/consensus-packet-builder.ts +44 -18
- package/src/pipeline/phases/architecture.ts +6 -3
- package/src/pipeline/phases/audit.ts +6 -3
- package/src/pipeline/phases/consensus-architecture.ts +10 -1
- package/src/pipeline/phases/consensus-master-plan.ts +10 -3
- package/src/pipeline/phases/consensus-role-plans.ts +10 -1
- package/src/pipeline/phases/done.ts +15 -4
- package/src/pipeline/phases/intake.ts +7 -3
- package/src/pipeline/phases/phase-context.ts +6 -1
- package/src/pipeline/phases/production-gate.ts +41 -3
- package/src/pipeline/phases/qa-validation.ts +51 -5
- package/src/pipeline/phases/recovery-loop.ts +229 -7
- package/src/pipeline/phases/review.ts +73 -30
- package/src/pipeline/phases/role-planning.ts +21 -2
- package/src/pipeline/phases/stuck.ts +10 -0
- package/src/pipeline/repo-snapshot.ts +3 -0
- package/src/pipeline/role-execution-adapter.ts +30 -4
- package/src/pipeline/skill-loader.ts +33 -0
- package/src/pipeline/skills/coverage-gate.ts +199 -0
- package/src/pipeline/skills/usage-registry.ts +87 -0
- package/src/pipeline/strategy-context.ts +60 -0
- package/src/pipeline/type-defs/artifacts.ts +4 -0
- package/src/pipeline/type-defs/checks.ts +4 -0
- package/src/pipeline/type-defs/packets.ts +18 -1
- package/src/pipeline/type-defs/state.ts +26 -1
- package/src/shared/text-utils.ts +70 -0
- package/src/shared/website-strategy-format.ts +56 -0
- package/src/state/index.ts +60 -8
- package/src/types/consensus.ts +1 -0
- package/src/types/workflow.ts +6 -0
- package/src/upgrade/handlers.ts +9 -3
- package/src/workflow/consensus.ts +1 -0
- package/src/workflow/website-strategy.ts +2 -36
- package/src/workflow/website-updater.ts +4 -2
- package/tests/adapters/gemini.test.ts +165 -0
- package/tests/adapters/grok.test.ts +137 -0
- package/tests/adapters/openai.test.ts +128 -0
- package/tests/generators/doc-parser.test.ts +88 -9
- package/tests/generators/quality-gate.test.ts +19 -3
- package/tests/generators/website-components.test.ts +34 -0
- package/tests/generators/website-content-ai.test.ts +308 -0
- package/tests/generators/website-content-scanner.test.ts +86 -0
- package/tests/generators/website-context.test.ts +3 -2
- package/tests/integration/smokestack-scaffold.test.ts +385 -0
- package/tests/pipeline/auto-recovery.test.ts +337 -0
- package/tests/pipeline/change-request.test.ts +70 -0
- package/tests/pipeline/command-resolver.test.ts +42 -0
- package/tests/pipeline/consensus/arbitrator-query.test.ts +107 -0
- package/tests/pipeline/consensus-runner.test.ts +1333 -10
- package/tests/pipeline/consensus-scoring.test.ts +602 -18
- package/tests/pipeline/gate-engine.test.ts +34 -0
- package/tests/pipeline/install-check.test.ts +261 -0
- package/tests/pipeline/orchestrator.test.ts +1506 -15
- package/tests/pipeline/packets/builders.test.ts +29 -6
- package/tests/pipeline/phases/role-planning.strategy.test.ts +204 -0
- package/tests/pipeline/pipeline-persistence.test.ts +230 -0
- package/tests/pipeline/recovery-loop-guidance.test.ts +280 -0
- package/tests/pipeline/role-execution-adapter.test.ts +88 -0
- package/tests/pipeline/skills/coverage-gate.test.ts +370 -0
- package/tests/pipeline/skills/usage-registry.test.ts +114 -0
- package/tests/pipeline/strategy-context.test.ts +148 -0
- package/tests/shared/text-utils.test.ts +155 -0
- package/tests/state/progress-analysis.test.ts +375 -0
- package/tests/upgrade/handlers.test.ts +33 -2
- package/tests/workflow/consensus.test.ts +6 -0
- package/tsconfig.json +1 -1
|
@@ -11,13 +11,17 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { readFileSync, existsSync } from 'node:fs';
|
|
13
13
|
import { join } from 'node:path';
|
|
14
|
-
import { createDefaultPipelineState } from './types.js';
|
|
14
|
+
import { createDefaultPipelineState, toLegacyPhase } from './types.js';
|
|
15
15
|
import { createGateEngine } from './gate-engine.js';
|
|
16
16
|
import { createArtifactManager } from './artifact-manager.js';
|
|
17
17
|
import { createSkillLoader } from './skill-loader.js';
|
|
18
18
|
import { createConsensusRunner } from './consensus/consensus-runner.js';
|
|
19
19
|
import { verifyConstitution } from './constitution.js';
|
|
20
|
+
import { SkillUsageRegistry } from './skills/usage-registry.js';
|
|
21
|
+
import { runSkillCoverageCheck } from './check-runner.js';
|
|
22
|
+
import { resolveActiveCR, checkStagnation } from './cr-lifecycle.js';
|
|
20
23
|
import { runIntake, runConsensusMasterPlan, runArchitecture, runConsensusArchitecture, runRolePlanning, runConsensusRolePlans, runImplementation, runQaValidation, runReview, runAudit, runProductionGate, runRecoveryLoop, runDone, runStuck, } from './phases/index.js';
|
|
24
|
+
import { updateState } from '../state/index.js';
|
|
21
25
|
// ─── Phase Dispatch Map ──────────────────────────────────
|
|
22
26
|
const PHASE_HANDLERS = {
|
|
23
27
|
INTAKE: runIntake,
|
|
@@ -42,17 +46,21 @@ const CR_CHECK_PHASES = new Set(['REVIEW', 'AUDIT']);
|
|
|
42
46
|
export async function runPipeline(options) {
|
|
43
47
|
const { projectDir, state, consensusConfig, additionalContext, onPhaseStart, onPhaseComplete, onProgress, } = options;
|
|
44
48
|
// Initialize pipeline state if needed
|
|
45
|
-
const pipeline = state.pipeline
|
|
46
|
-
|
|
49
|
+
const pipeline = state.pipeline ?? createDefaultPipelineState();
|
|
50
|
+
// Attach pipeline to state so persistence includes it
|
|
51
|
+
state.pipeline = pipeline;
|
|
47
52
|
// Persist user guidance in pipeline state so it survives resume
|
|
48
53
|
if (additionalContext && !pipeline.sessionGuidance) {
|
|
49
54
|
pipeline.sessionGuidance = additionalContext;
|
|
50
55
|
}
|
|
56
|
+
// Initialize skill usage events array (v2.2.1)
|
|
57
|
+
pipeline.skillUsageEvents = pipeline.skillUsageEvents ?? [];
|
|
58
|
+
const skillUsageRegistry = new SkillUsageRegistry(pipeline.skillUsageEvents);
|
|
51
59
|
// Create context dependencies
|
|
52
60
|
const gateEngine = createGateEngine();
|
|
53
61
|
const artifactManager = createArtifactManager(projectDir);
|
|
54
62
|
const skillLoader = createSkillLoader(projectDir);
|
|
55
|
-
const consensusRunner = createConsensusRunner(projectDir, consensusConfig);
|
|
63
|
+
const consensusRunner = createConsensusRunner(projectDir, consensusConfig, skillLoader, skillUsageRegistry);
|
|
56
64
|
// Ensure docs structure
|
|
57
65
|
artifactManager.ensureDocsStructure();
|
|
58
66
|
const context = {
|
|
@@ -63,6 +71,7 @@ export async function runPipeline(options) {
|
|
|
63
71
|
artifactManager,
|
|
64
72
|
gateEngine,
|
|
65
73
|
consensusRunner,
|
|
74
|
+
skillUsageRegistry,
|
|
66
75
|
};
|
|
67
76
|
let phase = pipeline.pipelinePhase;
|
|
68
77
|
let failedPhase = null;
|
|
@@ -99,6 +108,15 @@ export async function runPipeline(options) {
|
|
|
99
108
|
if (!result.success) {
|
|
100
109
|
onProgress?.(`Phase ${phase} FAILED: ${result.message}${result.error ? ` — ${result.error}` : ''}`);
|
|
101
110
|
}
|
|
111
|
+
// v2.2.1: Run skill coverage check before gates that require it
|
|
112
|
+
if (phase === 'CONSENSUS_ROLE_PLANS' || phase === 'PRODUCTION_GATE') {
|
|
113
|
+
const coverageResult = runSkillCoverageCheck(pipeline, phase);
|
|
114
|
+
const phaseChecks = pipeline.gateChecks[phase] ?? [];
|
|
115
|
+
// Replace any existing skill_coverage check result
|
|
116
|
+
const filtered = phaseChecks.filter((c) => c.check_type !== 'skill_coverage');
|
|
117
|
+
filtered.push(coverageResult);
|
|
118
|
+
pipeline.gateChecks[phase] = filtered;
|
|
119
|
+
}
|
|
102
120
|
// v1.1: Verify constitution integrity before evaluating gate
|
|
103
121
|
const constitutionCheck = verifyConstitution(pipeline, projectDir);
|
|
104
122
|
// Evaluate gate with constitution verification result
|
|
@@ -110,48 +128,168 @@ export async function runPipeline(options) {
|
|
|
110
128
|
mergeGateResult(pipeline, phase, gateResult);
|
|
111
129
|
if (gateResult.pass) {
|
|
112
130
|
// ─── PASS ────────────────────────────────────────
|
|
131
|
+
// v2.7.0: Clear failedPhase when the originally-failed phase now passes.
|
|
132
|
+
// INVARIANT: This is the ONLY place failedPhase is cleared during the main loop.
|
|
133
|
+
// It must remain set throughout the entire recovery traversal to guard budget resets.
|
|
134
|
+
if (pipeline.failedPhase === phase) {
|
|
135
|
+
pipeline.failedPhase = undefined;
|
|
136
|
+
pipeline.recoveryBaselineFailedCheckCount = undefined;
|
|
137
|
+
}
|
|
138
|
+
// v2.4.9: Resolve the active CR after its routed phase passes
|
|
139
|
+
if (pipeline.activeChangeRequestId) {
|
|
140
|
+
resolveActiveCR(pipeline, onProgress);
|
|
141
|
+
}
|
|
113
142
|
// v1.1: Check for pending CRs after REVIEW/AUDIT — route to consensus before continuing
|
|
114
143
|
if (CR_CHECK_PHASES.has(phase)) {
|
|
115
144
|
const crRoute = getNextCRRoute(pipeline);
|
|
116
145
|
if (crRoute) {
|
|
117
146
|
onProgress?.(`CR ${crRoute.cr_id} routing to ${crRoute.target_phase}`);
|
|
147
|
+
// v2.5.4: CR routing to a new phase — reset recovery budget
|
|
148
|
+
if (crRoute.target_phase !== phase && pipeline.recoveryCount > 0) {
|
|
149
|
+
onProgress?.(`Recovery budget reset: ${pipeline.recoveryCount} -> 0 (CR routing ${phase} -> ${crRoute.target_phase})`);
|
|
150
|
+
pipeline.recoveryCount = 0;
|
|
151
|
+
pipeline.lastRewindTarget = undefined;
|
|
152
|
+
}
|
|
153
|
+
pipeline.activeChangeRequestId = crRoute.cr_id;
|
|
118
154
|
phase = crRoute.target_phase;
|
|
119
155
|
pipeline.pipelinePhase = phase;
|
|
156
|
+
// v2.5.0: Stagnation check before continue (otherwise skipped by the continue)
|
|
157
|
+
if (checkStagnation(pipeline, onProgress)) {
|
|
158
|
+
phase = 'STUCK';
|
|
159
|
+
pipeline.pipelinePhase = phase;
|
|
160
|
+
}
|
|
161
|
+
// Persist before continue (otherwise CR-routed phase is lost on crash)
|
|
162
|
+
try {
|
|
163
|
+
await updateState(projectDir, { pipeline, phase: toLegacyPhase(phase) });
|
|
164
|
+
}
|
|
165
|
+
catch { /* non-fatal */ }
|
|
120
166
|
continue;
|
|
121
167
|
}
|
|
122
168
|
}
|
|
123
169
|
if (phase === 'RECOVERY_LOOP') {
|
|
124
170
|
// Recovery succeeded. RCA may specify rewind target.
|
|
125
171
|
const rca = getLatestRCA(pipeline, projectDir);
|
|
126
|
-
|
|
127
|
-
|
|
172
|
+
let rewindTarget = rca?.requires_phase_rewind_to;
|
|
173
|
+
// v2.4.6: Detect repeated same-target rewind — if we already rewound
|
|
174
|
+
// to this target last iteration and it didn't help, skip the rewind
|
|
175
|
+
// and re-test the failed phase directly.
|
|
176
|
+
if (rewindTarget && rewindTarget === pipeline.lastRewindTarget) {
|
|
177
|
+
onProgress?.(`Repeated rewind to ${rewindTarget} detected ` +
|
|
178
|
+
`(recovery #${pipeline.recoveryCount}) — re-testing ` +
|
|
179
|
+
`${failedPhase ?? 'QA_VALIDATION'} directly`);
|
|
180
|
+
rewindTarget = undefined;
|
|
128
181
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
182
|
+
// Determine effective target
|
|
183
|
+
const effectiveTarget = rewindTarget ?? failedPhase ?? 'QA_VALIDATION';
|
|
184
|
+
phase = effectiveTarget;
|
|
185
|
+
// Record only the actual rewind target taken (not undefined when skipped)
|
|
186
|
+
pipeline.lastRewindTarget = rewindTarget;
|
|
187
|
+
// v2.4.6: Clear stale gate data so the re-entered phase evaluates fresh
|
|
188
|
+
if (failedPhase) {
|
|
189
|
+
delete pipeline.gateResults[failedPhase];
|
|
190
|
+
delete pipeline.gateChecks[failedPhase];
|
|
132
191
|
}
|
|
133
192
|
failedPhase = null;
|
|
134
193
|
}
|
|
135
194
|
else {
|
|
136
195
|
// Normal progression
|
|
137
|
-
|
|
196
|
+
const nextPhase = gateEngine.getNextPhase(phase, gateResult);
|
|
197
|
+
// v2.5.4: Reset recovery budget on forward phase change.
|
|
198
|
+
// Each phase gets a fresh budget — prevents a single contentious consensus
|
|
199
|
+
// from consuming all iterations, leaving later phases with zero.
|
|
200
|
+
// v2.7.0: Don't reset budget during recovery traversal.
|
|
201
|
+
// failedPhase stays set until the originally-failed phase passes, so
|
|
202
|
+
// intermediate forward transitions (IMPL→QA→REVIEW→AUDIT) are skipped.
|
|
203
|
+
if (nextPhase !== phase && pipeline.recoveryCount > 0 && !pipeline.failedPhase) {
|
|
204
|
+
onProgress?.(`Recovery budget reset: ${pipeline.recoveryCount} -> 0 (advancing ${phase} -> ${nextPhase})`);
|
|
205
|
+
pipeline.recoveryCount = 0;
|
|
206
|
+
pipeline.lastRewindTarget = undefined;
|
|
207
|
+
}
|
|
208
|
+
phase = nextPhase;
|
|
138
209
|
}
|
|
139
210
|
}
|
|
140
211
|
else {
|
|
141
212
|
// ─── FAIL ────────────────────────────────────────
|
|
142
213
|
onProgress?.(`Gate FAILED for ${phase}: ${gateResult.blockers.join('; ')}`);
|
|
214
|
+
// v2.7.0: Regression detection — recovery made things worse than the original failure
|
|
215
|
+
if (pipeline.failedPhase === phase &&
|
|
216
|
+
pipeline.recoveryBaselineFailedCheckCount !== undefined &&
|
|
217
|
+
(gateResult.failedChecks.length + gateResult.missingArtifacts.length) > pipeline.recoveryBaselineFailedCheckCount) {
|
|
218
|
+
onProgress?.(`[regression] Recovery worsened ${phase}: ` +
|
|
219
|
+
`${pipeline.recoveryBaselineFailedCheckCount} -> ` +
|
|
220
|
+
`${gateResult.failedChecks.length + gateResult.missingArtifacts.length} failing checks. ` +
|
|
221
|
+
`Treating budget as exhausted.`);
|
|
222
|
+
pipeline.recoveryCount = pipeline.maxRecoveryIterations;
|
|
223
|
+
}
|
|
143
224
|
if (pipeline.recoveryCount >= pipeline.maxRecoveryIterations) {
|
|
144
|
-
|
|
225
|
+
const exhaustedPhase = phase; // capture before any reassignment
|
|
226
|
+
// v2.6.0: One auto-recovery attempt before STUCK
|
|
227
|
+
const arbitratorConfigured = !!(consensusConfig?.arbitrator);
|
|
228
|
+
if (!pipeline.autoRecoveryResult && arbitratorConfigured) {
|
|
229
|
+
onProgress?.(`[auto-recovery] Budget exhausted at ${exhaustedPhase}. Consulting arbitrator...`);
|
|
230
|
+
try {
|
|
231
|
+
const { attemptAutoRecovery } = await import('./auto-recovery.js');
|
|
232
|
+
const result = await attemptAutoRecovery({
|
|
233
|
+
pipeline, projectDir, artifactManager, consensusConfig,
|
|
234
|
+
});
|
|
235
|
+
pipeline.autoRecoveryResult = result.success ? 'success' : 'invalid';
|
|
236
|
+
if (result.artifact)
|
|
237
|
+
pipeline.artifacts.push(result.artifact);
|
|
238
|
+
if (result.success && result.guidance) {
|
|
239
|
+
onProgress?.(`[auto-recovery] Strategic guidance received (${result.guidance.length} chars). Resetting budget.`);
|
|
240
|
+
pipeline.recoveryCount = 0;
|
|
241
|
+
pipeline.lastRewindTarget = undefined;
|
|
242
|
+
// Stay on the failed phase — let the normal loop re-execute it
|
|
243
|
+
// with the injected strategic guidance
|
|
244
|
+
phase = exhaustedPhase;
|
|
245
|
+
pipeline.pipelinePhase = phase;
|
|
246
|
+
pipeline.failedPhase = exhaustedPhase;
|
|
247
|
+
// Clear stale gate data so re-entry evaluates fresh
|
|
248
|
+
delete pipeline.gateResults[exhaustedPhase];
|
|
249
|
+
delete pipeline.gateChecks[exhaustedPhase];
|
|
250
|
+
// Continue main loop (don't fall through to STUCK)
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
onProgress?.(`[auto-recovery] No useful guidance. Entering STUCK.`);
|
|
254
|
+
phase = 'STUCK';
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
pipeline.autoRecoveryResult = err?.message?.includes('timeout') ? 'timeout' : 'error';
|
|
259
|
+
onProgress?.(`[auto-recovery] Failed: ${err instanceof Error ? err.message : 'unknown'}. Entering STUCK.`);
|
|
260
|
+
phase = 'STUCK';
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
phase = 'STUCK';
|
|
265
|
+
}
|
|
145
266
|
}
|
|
146
267
|
else {
|
|
268
|
+
// v2.7.0: Capture baseline for fresh failure or when failure origin changes
|
|
269
|
+
if (pipeline.recoveryBaselineFailedCheckCount === undefined ||
|
|
270
|
+
pipeline.failedPhase !== phase // Different phase failing — new recovery origin
|
|
271
|
+
) {
|
|
272
|
+
pipeline.recoveryBaselineFailedCheckCount = gateResult.failedChecks.length + gateResult.missingArtifacts.length;
|
|
273
|
+
}
|
|
147
274
|
failedPhase = phase;
|
|
148
275
|
pipeline.failedPhase = phase;
|
|
149
276
|
phase = 'RECOVERY_LOOP';
|
|
150
277
|
pipeline.recoveryCount++;
|
|
151
278
|
}
|
|
152
279
|
}
|
|
280
|
+
// v2.5.0: Stagnation detection — shared helper checks rolling signature window
|
|
281
|
+
if (checkStagnation(pipeline, onProgress)) {
|
|
282
|
+
phase = 'STUCK';
|
|
283
|
+
}
|
|
153
284
|
// Update pipeline phase in state
|
|
154
285
|
pipeline.pipelinePhase = phase;
|
|
286
|
+
// v2.4.5b: Persist pipeline state after each phase transition (crash safety)
|
|
287
|
+
try {
|
|
288
|
+
await updateState(projectDir, { pipeline, phase: toLegacyPhase(phase) });
|
|
289
|
+
}
|
|
290
|
+
catch (persistErr) {
|
|
291
|
+
onProgress?.(`Warning: Failed to persist pipeline state: ${persistErr instanceof Error ? persistErr.message : String(persistErr)}`);
|
|
292
|
+
}
|
|
155
293
|
onProgress?.(`Transitioning to: ${phase}`);
|
|
156
294
|
}
|
|
157
295
|
// ─── Terminal State ────────────────────────────────────
|
|
@@ -167,6 +305,13 @@ export async function runPipeline(options) {
|
|
|
167
305
|
}
|
|
168
306
|
}
|
|
169
307
|
}
|
|
308
|
+
// Persist final pipeline state (DONE or STUCK)
|
|
309
|
+
try {
|
|
310
|
+
await updateState(projectDir, { pipeline, phase: toLegacyPhase(phase) });
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
// Best-effort for terminal persistence
|
|
314
|
+
}
|
|
170
315
|
return {
|
|
171
316
|
success: phase === 'DONE',
|
|
172
317
|
finalPhase: phase,
|
|
@@ -177,9 +322,153 @@ export async function runPipeline(options) {
|
|
|
177
322
|
: undefined,
|
|
178
323
|
};
|
|
179
324
|
}
|
|
180
|
-
/** Resume pipeline from saved state */
|
|
325
|
+
/** Resume pipeline from saved state — with STUCK recovery (v2.4.5) */
|
|
181
326
|
export async function resumePipeline(options) {
|
|
182
|
-
|
|
327
|
+
const pipeline = options.state.pipeline;
|
|
328
|
+
// v2.5.3: Normalize stale legacy status when pipeline is STUCK.
|
|
329
|
+
// completeProject() may have set status='complete' before the pipeline entered STUCK,
|
|
330
|
+
// leaving inconsistent state. Fix on load so the display layer never sees the lie.
|
|
331
|
+
if (pipeline &&
|
|
332
|
+
(pipeline.pipelinePhase === 'STUCK' || pipeline.pipelinePhase === 'RECOVERY_LOOP') &&
|
|
333
|
+
options.state.status === 'complete') {
|
|
334
|
+
options.state.status = 'in-progress';
|
|
335
|
+
try {
|
|
336
|
+
await updateState(options.projectDir, { status: 'in-progress' });
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
// Best-effort — display layer override in interactive.ts handles it regardless
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
// v2.4.8: RECOVERY_LOOP with remaining attempts — auto-resume without guidance.
|
|
343
|
+
// Must check this BEFORE the STUCK branch because RECOVERY_LOOP with exhausted
|
|
344
|
+
// attempts falls through to the guidance-required path below.
|
|
345
|
+
if (pipeline?.pipelinePhase === 'RECOVERY_LOOP' &&
|
|
346
|
+
pipeline?.failedPhase &&
|
|
347
|
+
pipeline.recoveryCount < (pipeline.maxRecoveryIterations ?? 5)) {
|
|
348
|
+
// Reset to the failed phase so the main loop re-enters. Do NOT reset
|
|
349
|
+
// recoveryCount — the pipeline retains its remaining iteration budget.
|
|
350
|
+
// Do NOT clear lastRewindTarget — preserve repeated-rewind detection.
|
|
351
|
+
pipeline.pipelinePhase = pipeline.failedPhase;
|
|
352
|
+
delete pipeline.gateResults[pipeline.failedPhase];
|
|
353
|
+
delete pipeline.gateChecks[pipeline.failedPhase];
|
|
354
|
+
options.onProgress?.(`[resume] Auto-resuming from RECOVERY_LOOP: resetting to ${pipeline.failedPhase}, ` +
|
|
355
|
+
`recoveryCount ${pipeline.recoveryCount}/${pipeline.maxRecoveryIterations}`);
|
|
356
|
+
}
|
|
357
|
+
else if (
|
|
358
|
+
// v2.4.7: STUCK (or RECOVERY_LOOP with exhausted attempts) requires user guidance.
|
|
359
|
+
(pipeline?.pipelinePhase === 'STUCK' ||
|
|
360
|
+
(pipeline?.pipelinePhase === 'RECOVERY_LOOP' &&
|
|
361
|
+
pipeline.recoveryCount >= (pipeline.maxRecoveryIterations ?? 5))) &&
|
|
362
|
+
pipeline?.failedPhase) {
|
|
363
|
+
// v2.5.2: Purge legacy CRs without drift_key (from pre-v2.5.0 infinite loop).
|
|
364
|
+
// These are orphaned — no drift_key means they can never be deduplicated or resolved.
|
|
365
|
+
// Runs unconditionally (before guidance check) so cleanup persists even without guidance.
|
|
366
|
+
if (pipeline.pendingChangeRequests) {
|
|
367
|
+
const before = pipeline.pendingChangeRequests.length;
|
|
368
|
+
pipeline.pendingChangeRequests = pipeline.pendingChangeRequests.filter((cr) => cr.drift_key != null || cr.status === 'proposed');
|
|
369
|
+
const purged = before - pipeline.pendingChangeRequests.length;
|
|
370
|
+
if (purged > 0) {
|
|
371
|
+
options.onProgress?.(`[resume] Purged ${purged} legacy CRs without drift_key`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// Clear stale activeChangeRequestId if the referenced CR was purged
|
|
375
|
+
if (pipeline.activeChangeRequestId &&
|
|
376
|
+
!pipeline.pendingChangeRequests?.some((cr) => cr.cr_id === pipeline.activeChangeRequestId)) {
|
|
377
|
+
options.onProgress?.(`[resume] Cleared stale activeChangeRequestId: ${pipeline.activeChangeRequestId}`);
|
|
378
|
+
pipeline.activeChangeRequestId = undefined;
|
|
379
|
+
}
|
|
380
|
+
const guidance = options.additionalContext?.trim() ?? '';
|
|
381
|
+
if (guidance.length > 0) {
|
|
382
|
+
// User provided guidance — allow one more retry
|
|
383
|
+
const prevRecovery = pipeline.recoveryCount;
|
|
384
|
+
pipeline.pipelinePhase = pipeline.failedPhase;
|
|
385
|
+
pipeline.recoveryCount = 0;
|
|
386
|
+
pipeline.lastRewindTarget = undefined;
|
|
387
|
+
pipeline.autoRecoveryResult = undefined; // v2.6.0: Fresh auto-recovery budget after user guidance
|
|
388
|
+
// Clear stale gate results and checks for the failed phase
|
|
389
|
+
delete pipeline.gateResults[pipeline.failedPhase];
|
|
390
|
+
delete pipeline.gateChecks[pipeline.failedPhase];
|
|
391
|
+
options.onProgress?.(`[resume] Recovering from ${pipeline.pipelinePhase}: resetting to ${pipeline.failedPhase}, ` +
|
|
392
|
+
`recoveryCount ${prevRecovery} -> 0 (user provided guidance)`);
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
// No guidance — v2.6.0: attempt auto-recovery before giving up
|
|
396
|
+
const arbitratorConfigured = !!(options.consensusConfig?.arbitrator);
|
|
397
|
+
if (!pipeline.autoRecoveryResult && arbitratorConfigured) {
|
|
398
|
+
options.onProgress?.(`[resume] No guidance provided. Attempting auto-recovery via arbitrator...`);
|
|
399
|
+
try {
|
|
400
|
+
const artifactManager = createArtifactManager(options.projectDir);
|
|
401
|
+
const { attemptAutoRecovery } = await import('./auto-recovery.js');
|
|
402
|
+
const result = await attemptAutoRecovery({
|
|
403
|
+
pipeline,
|
|
404
|
+
projectDir: options.projectDir,
|
|
405
|
+
artifactManager,
|
|
406
|
+
consensusConfig: options.consensusConfig,
|
|
407
|
+
});
|
|
408
|
+
pipeline.autoRecoveryResult = result.success ? 'success' : 'invalid';
|
|
409
|
+
if (result.artifact)
|
|
410
|
+
pipeline.artifacts.push(result.artifact);
|
|
411
|
+
if (result.success && result.guidance) {
|
|
412
|
+
options.onProgress?.(`[resume] Auto-recovery guidance received (${result.guidance.length} chars). Resetting budget.`);
|
|
413
|
+
const prevRecovery = pipeline.recoveryCount;
|
|
414
|
+
pipeline.pipelinePhase = pipeline.failedPhase;
|
|
415
|
+
pipeline.recoveryCount = 0;
|
|
416
|
+
pipeline.lastRewindTarget = undefined;
|
|
417
|
+
delete pipeline.gateResults[pipeline.failedPhase];
|
|
418
|
+
delete pipeline.gateChecks[pipeline.failedPhase];
|
|
419
|
+
options.onProgress?.(`[resume] Recovering from STUCK: resetting to ${pipeline.failedPhase}, ` +
|
|
420
|
+
`recoveryCount ${prevRecovery} -> 0 (auto-recovery guidance)`);
|
|
421
|
+
// Fall through to runPipeline() below
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
options.onProgress?.(`[resume] Auto-recovery produced no useful guidance.`);
|
|
425
|
+
// Fall through to return STUCK below
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
catch (err) {
|
|
429
|
+
pipeline.autoRecoveryResult = err?.message?.includes('timeout') ? 'timeout' : 'error';
|
|
430
|
+
options.onProgress?.(`[resume] Auto-recovery failed: ${err instanceof Error ? err.message : 'unknown'}`);
|
|
431
|
+
// Fall through to return STUCK below
|
|
432
|
+
}
|
|
433
|
+
// Persist state (whether auto-recovery succeeded or not)
|
|
434
|
+
try {
|
|
435
|
+
await updateState(options.projectDir, { pipeline });
|
|
436
|
+
}
|
|
437
|
+
catch { /* best-effort */ }
|
|
438
|
+
// If auto-recovery succeeded, fall through to runPipeline()
|
|
439
|
+
if (pipeline.autoRecoveryResult === 'success') {
|
|
440
|
+
return runPipeline(options);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
// No guidance, no auto-recovery (or auto-recovery failed) — return STUCK
|
|
444
|
+
try {
|
|
445
|
+
await updateState(options.projectDir, { pipeline });
|
|
446
|
+
}
|
|
447
|
+
catch {
|
|
448
|
+
// Best-effort — cleanup is still in memory for next resume
|
|
449
|
+
}
|
|
450
|
+
options.onProgress?.(`[resume] Pipeline is stuck at ${pipeline.failedPhase} after ${pipeline.recoveryCount} recovery attempts. ` +
|
|
451
|
+
`Provide guidance to attempt recovery.`);
|
|
452
|
+
return {
|
|
453
|
+
success: false,
|
|
454
|
+
finalPhase: 'STUCK',
|
|
455
|
+
artifacts: pipeline.artifacts,
|
|
456
|
+
recoveryIterations: pipeline.recoveryCount,
|
|
457
|
+
error: `Pipeline stuck at ${pipeline.failedPhase} after ${pipeline.recoveryCount} recovery iterations. Provide guidance to retry.`,
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
else if ((pipeline?.pipelinePhase === 'STUCK' || pipeline?.pipelinePhase === 'RECOVERY_LOOP') &&
|
|
462
|
+
!pipeline?.failedPhase) {
|
|
463
|
+
options.onProgress?.(`[resume] Pipeline is ${pipeline.pipelinePhase} but failedPhase is missing — cannot auto-recover`);
|
|
464
|
+
return {
|
|
465
|
+
success: false,
|
|
466
|
+
finalPhase: 'STUCK',
|
|
467
|
+
artifacts: pipeline?.artifacts ?? [],
|
|
468
|
+
recoveryIterations: pipeline?.recoveryCount ?? 0,
|
|
469
|
+
error: 'Pipeline is stuck with no failed phase recorded. Manual intervention required.',
|
|
470
|
+
};
|
|
471
|
+
}
|
|
183
472
|
return runPipeline(options);
|
|
184
473
|
}
|
|
185
474
|
// ─── Helpers ─────────────────────────────────────────────
|
|
@@ -190,12 +479,13 @@ export async function resumePipeline(options) {
|
|
|
190
479
|
*/
|
|
191
480
|
function mergeGateResult(pipeline, phase, gateResult) {
|
|
192
481
|
const existing = pipeline.gateResults[phase];
|
|
193
|
-
if (existing?.score !== undefined || existing?.consensusScore !== undefined) {
|
|
194
|
-
// Preserve consensus scores from the phase handler
|
|
482
|
+
if (existing?.score !== undefined || existing?.consensusScore !== undefined || existing?.finalStatus !== undefined) {
|
|
483
|
+
// Preserve consensus scores and finalStatus from the phase handler
|
|
195
484
|
pipeline.gateResults[phase] = {
|
|
196
485
|
...gateResult,
|
|
197
486
|
score: existing.score ?? gateResult.score,
|
|
198
487
|
consensusScore: existing.consensusScore ?? gateResult.consensusScore,
|
|
488
|
+
finalStatus: existing.finalStatus ?? gateResult.finalStatus, // v2.4.3
|
|
199
489
|
};
|
|
200
490
|
}
|
|
201
491
|
else {
|
|
@@ -213,7 +503,7 @@ function getNextCRRoute(pipeline) {
|
|
|
213
503
|
const nextCR = pending.find((cr) => cr.status === 'proposed');
|
|
214
504
|
if (!nextCR)
|
|
215
505
|
return undefined;
|
|
216
|
-
// Mark as
|
|
506
|
+
// Mark as routed/in-flight (kept as 'approved' for backward compatibility)
|
|
217
507
|
nextCR.status = 'approved';
|
|
218
508
|
return {
|
|
219
509
|
cr_id: nextCR.cr_id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/pipeline/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/pipeline/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Consensus Packet Builder — aggregates reviewer votes into a ConsensusPacket.
|
|
3
3
|
* Auto-computes consensus result (score, approval) and final status.
|
|
4
|
-
*
|
|
4
|
+
* v2.0: Option B scoring — avg(baseWeight * confidence) per reviewer.
|
|
5
|
+
* REJECT guard: REJECT with true blockers prevents APPROVED (not ARBITRATED).
|
|
6
|
+
* Normalization summary passthrough.
|
|
5
7
|
*/
|
|
6
8
|
import type { ArtifactRef, ReviewerVote, ConsensusPacket } from '../types.js';
|
|
7
9
|
export interface ConsensusRules {
|
|
@@ -9,6 +11,12 @@ export interface ConsensusRules {
|
|
|
9
11
|
quorum: number;
|
|
10
12
|
min_reviewers: number;
|
|
11
13
|
}
|
|
14
|
+
export interface NormalizationSummary {
|
|
15
|
+
tagged_blockers_demoted_to_suggestions: number;
|
|
16
|
+
tagged_blockers_demoted_to_required: number;
|
|
17
|
+
untagged_from_blocking_routed_to_required: number;
|
|
18
|
+
forced_rejects: number;
|
|
19
|
+
}
|
|
12
20
|
export interface BuildConsensusPacketArgs {
|
|
13
21
|
planPacketRef: ArtifactRef;
|
|
14
22
|
votes: ReviewerVote[];
|
|
@@ -18,18 +26,21 @@ export interface BuildConsensusPacketArgs {
|
|
|
18
26
|
merged_patch?: string;
|
|
19
27
|
artifact_ref?: ArtifactRef;
|
|
20
28
|
};
|
|
29
|
+
normalizationMoves?: NormalizationSummary;
|
|
21
30
|
}
|
|
22
31
|
/**
|
|
23
32
|
* Compute both simple and confidence-weighted consensus scores.
|
|
24
33
|
*
|
|
25
34
|
* Simple score: approve count / total votes (backward compat).
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
35
|
+
* Option B weighted score: average of (vote_weight * confidence) per reviewer.
|
|
36
|
+
* v2.4.2: Returns honest rawWeighted score + has_true_blockers flag.
|
|
37
|
+
* Force-zero veto removed — governance guard in buildConsensusPacket() is
|
|
38
|
+
* the single enforcement point for blocker-based rejection.
|
|
29
39
|
*/
|
|
30
40
|
export declare function computeConsensusScore(votes: ReviewerVote[]): {
|
|
31
41
|
score: number;
|
|
32
42
|
weighted_score: number;
|
|
43
|
+
has_true_blockers: boolean;
|
|
33
44
|
};
|
|
34
45
|
export declare function buildConsensusPacket(args: BuildConsensusPacketArgs): ConsensusPacket;
|
|
35
46
|
//# sourceMappingURL=consensus-packet-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consensus-packet-builder.d.ts","sourceRoot":"","sources":["../../../src/pipeline/packets/consensus-packet-builder.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"consensus-packet-builder.d.ts","sourceRoot":"","sources":["../../../src/pipeline/packets/consensus-packet-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EAChB,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,sCAAsC,EAAE,MAAM,CAAC;IAC/C,mCAAmC,EAAE,MAAM,CAAC;IAC5C,yCAAyC,EAAE,MAAM,CAAC;IAClD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,WAAW,CAAC;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,cAAc,CAAC;IACtB,gBAAgB,CAAC,EAAE;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,WAAW,CAAC;KAC5B,CAAC;IACF,kBAAkB,CAAC,EAAE,oBAAoB,CAAC;CAC3C;AASD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EAAE,GACpB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,OAAO,CAAA;CAAE,CA0BvE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,wBAAwB,GAAG,eAAe,CAiDpF"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Consensus Packet Builder — aggregates reviewer votes into a ConsensusPacket.
|
|
3
3
|
* Auto-computes consensus result (score, approval) and final status.
|
|
4
|
-
*
|
|
4
|
+
* v2.0: Option B scoring — avg(baseWeight * confidence) per reviewer.
|
|
5
|
+
* REJECT guard: REJECT with true blockers prevents APPROVED (not ARBITRATED).
|
|
6
|
+
* Normalization summary passthrough.
|
|
5
7
|
*/
|
|
6
8
|
import { randomUUID } from 'node:crypto';
|
|
9
|
+
import { isNoneVariant } from '../../shared/text-utils.js';
|
|
7
10
|
/** Vote weight mapping: APPROVE=1.0, CONDITIONAL=0.5, REJECT=0.0 */
|
|
8
11
|
const VOTE_WEIGHTS = {
|
|
9
12
|
'APPROVE': 1.0,
|
|
@@ -14,36 +17,38 @@ const VOTE_WEIGHTS = {
|
|
|
14
17
|
* Compute both simple and confidence-weighted consensus scores.
|
|
15
18
|
*
|
|
16
19
|
* Simple score: approve count / total votes (backward compat).
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
+
* Option B weighted score: average of (vote_weight * confidence) per reviewer.
|
|
21
|
+
* v2.4.2: Returns honest rawWeighted score + has_true_blockers flag.
|
|
22
|
+
* Force-zero veto removed — governance guard in buildConsensusPacket() is
|
|
23
|
+
* the single enforcement point for blocker-based rejection.
|
|
20
24
|
*/
|
|
21
25
|
export function computeConsensusScore(votes) {
|
|
22
26
|
if (votes.length === 0)
|
|
23
|
-
return { score: 0, weighted_score: 0 };
|
|
27
|
+
return { score: 0, weighted_score: 0, has_true_blockers: false };
|
|
24
28
|
// Simple score (backward compat): approve ratio
|
|
25
29
|
const approvedCount = votes.filter((v) => v.vote === 'APPROVE').length;
|
|
26
30
|
const score = approvedCount / votes.length;
|
|
27
|
-
//
|
|
28
|
-
let totalWeight = 0;
|
|
31
|
+
// Option B scoring: average of (vote_weight * confidence) per reviewer
|
|
29
32
|
let weightedSum = 0;
|
|
30
33
|
for (const v of votes) {
|
|
31
|
-
const
|
|
32
|
-
weightedSum +=
|
|
33
|
-
totalWeight += w;
|
|
34
|
+
const baseWeight = VOTE_WEIGHTS[v.vote] ?? 0;
|
|
35
|
+
weightedSum += baseWeight * v.confidence;
|
|
34
36
|
}
|
|
35
|
-
const rawWeighted =
|
|
36
|
-
//
|
|
37
|
-
|
|
37
|
+
const rawWeighted = weightedSum / votes.length;
|
|
38
|
+
// v2.4.2: Detect true blockers but don't force score to 0.
|
|
39
|
+
// Downstream code uses has_true_blockers for decisions instead.
|
|
40
|
+
const has_true_blockers = votes.some((v) => v.vote === 'REJECT' && v.blocking_issues.some((issue) => !isNoneVariant(issue)));
|
|
38
41
|
return {
|
|
39
42
|
score,
|
|
40
|
-
weighted_score:
|
|
43
|
+
weighted_score: rawWeighted,
|
|
44
|
+
has_true_blockers,
|
|
41
45
|
};
|
|
42
46
|
}
|
|
43
47
|
export function buildConsensusPacket(args) {
|
|
44
|
-
const { planPacketRef, votes, rules, arbitratorResult } = args;
|
|
45
|
-
const { score, weighted_score } = computeConsensusScore(votes);
|
|
46
|
-
|
|
48
|
+
const { planPacketRef, votes, rules, arbitratorResult, normalizationMoves } = args;
|
|
49
|
+
const { score, weighted_score, has_true_blockers } = computeConsensusScore(votes);
|
|
50
|
+
// Use weighted_score (not simple score) for approval decision
|
|
51
|
+
const approved = weighted_score >= rules.threshold && votes.length >= rules.quorum;
|
|
47
52
|
let finalStatus;
|
|
48
53
|
if (arbitratorResult) {
|
|
49
54
|
finalStatus = 'ARBITRATED';
|
|
@@ -54,6 +59,11 @@ export function buildConsensusPacket(args) {
|
|
|
54
59
|
else {
|
|
55
60
|
finalStatus = 'REJECTED';
|
|
56
61
|
}
|
|
62
|
+
// Governance guard: REJECT with true blockers prevents APPROVED (but not ARBITRATED)
|
|
63
|
+
const hasRejectWithTrueBlockers = votes.some((v) => v.vote === 'REJECT' && v.blocking_issues.some((i) => !isNoneVariant(i)));
|
|
64
|
+
if (hasRejectWithTrueBlockers && finalStatus === 'APPROVED') {
|
|
65
|
+
finalStatus = 'REJECTED';
|
|
66
|
+
}
|
|
57
67
|
return {
|
|
58
68
|
metadata: {
|
|
59
69
|
packet_id: randomUUID(),
|
|
@@ -72,9 +82,11 @@ export function buildConsensusPacket(args) {
|
|
|
72
82
|
score,
|
|
73
83
|
weighted_score,
|
|
74
84
|
participating_reviewers: votes.length,
|
|
85
|
+
has_true_blockers,
|
|
75
86
|
},
|
|
76
87
|
arbitrator_result: arbitratorResult,
|
|
77
88
|
final_status: finalStatus,
|
|
89
|
+
normalization_moves: normalizationMoves,
|
|
78
90
|
};
|
|
79
91
|
}
|
|
80
92
|
//# sourceMappingURL=consensus-packet-builder.js.map
|