popeye-cli 2.1.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 +328 -21
- package/dist/cli/interactive.js.map +1 -1
- package/dist/generators/all.d.ts.map +1 -1
- package/dist/generators/all.js +25 -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/artifact-manager.d.ts.map +1 -1
- package/dist/pipeline/artifact-manager.js +3 -0
- package/dist/pipeline/artifact-manager.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 +27 -8
- package/dist/pipeline/gate-engine.js.map +1 -1
- package/dist/pipeline/migration.d.ts.map +1 -1
- package/dist/pipeline/migration.js +3 -26
- package/dist/pipeline/migration.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 +311 -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 +1 -0
- package/dist/pipeline/phases/intake.d.ts.map +1 -1
- package/dist/pipeline/phases/intake.js +56 -13
- 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 +20 -5
- 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/constitution-generator.d.ts +51 -0
- package/dist/pipeline/skills/constitution-generator.d.ts.map +1 -0
- package/dist/pipeline/skills/constitution-generator.js +210 -0
- package/dist/pipeline/skills/constitution-generator.js.map +1 -0
- 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/generator.d.ts +65 -0
- package/dist/pipeline/skills/generator.d.ts.map +1 -0
- package/dist/pipeline/skills/generator.js +221 -0
- package/dist/pipeline/skills/generator.js.map +1 -0
- package/dist/pipeline/skills/role-map.d.ts +38 -0
- package/dist/pipeline/skills/role-map.d.ts.map +1 -0
- package/dist/pipeline/skills/role-map.js +234 -0
- package/dist/pipeline/skills/role-map.js.map +1 -0
- package/dist/pipeline/skills/types.d.ts +47 -0
- package/dist/pipeline/skills/types.d.ts.map +1 -0
- package/dist/pipeline/skills/types.js +5 -0
- package/dist/pipeline/skills/types.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 +30 -5
- package/dist/pipeline/type-defs/artifacts.d.ts.map +1 -1
- package/dist/pipeline/type-defs/artifacts.js +5 -0
- package/dist/pipeline/type-defs/artifacts.js.map +1 -1
- package/dist/pipeline/type-defs/audit.d.ts +28 -13
- package/dist/pipeline/type-defs/audit.d.ts.map +1 -1
- package/dist/pipeline/type-defs/checks.d.ts +19 -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 +119 -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 +165 -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 +337 -20
- package/src/generators/all.ts +25 -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/artifact-manager.ts +3 -0
- 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 +36 -8
- package/src/pipeline/migration.ts +5 -30
- package/src/pipeline/orchestrator.ts +367 -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 +67 -14
- 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 +23 -5
- 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/constitution-generator.ts +236 -0
- package/src/pipeline/skills/coverage-gate.ts +199 -0
- package/src/pipeline/skills/generator.ts +287 -0
- package/src/pipeline/skills/role-map.ts +248 -0
- package/src/pipeline/skills/types.ts +53 -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 +5 -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/migration.test.ts +4 -3
- 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/constitution-generator.test.ts +201 -0
- package/tests/pipeline/skills/coverage-gate.test.ts +370 -0
- package/tests/pipeline/skills/generator.test.ts +213 -0
- package/tests/pipeline/skills/role-map.test.ts +198 -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;
|
|
@@ -95,6 +104,19 @@ export async function runPipeline(options) {
|
|
|
95
104
|
};
|
|
96
105
|
}
|
|
97
106
|
onPhaseComplete?.(phase, result);
|
|
107
|
+
// Log phase outcome — critical for diagnosing pipeline loops
|
|
108
|
+
if (!result.success) {
|
|
109
|
+
onProgress?.(`Phase ${phase} FAILED: ${result.message}${result.error ? ` — ${result.error}` : ''}`);
|
|
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
|
+
}
|
|
98
120
|
// v1.1: Verify constitution integrity before evaluating gate
|
|
99
121
|
const constitutionCheck = verifyConstitution(pipeline, projectDir);
|
|
100
122
|
// Evaluate gate with constitution verification result
|
|
@@ -106,47 +128,168 @@ export async function runPipeline(options) {
|
|
|
106
128
|
mergeGateResult(pipeline, phase, gateResult);
|
|
107
129
|
if (gateResult.pass) {
|
|
108
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
|
+
}
|
|
109
142
|
// v1.1: Check for pending CRs after REVIEW/AUDIT — route to consensus before continuing
|
|
110
143
|
if (CR_CHECK_PHASES.has(phase)) {
|
|
111
144
|
const crRoute = getNextCRRoute(pipeline);
|
|
112
145
|
if (crRoute) {
|
|
113
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;
|
|
114
154
|
phase = crRoute.target_phase;
|
|
115
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 */ }
|
|
116
166
|
continue;
|
|
117
167
|
}
|
|
118
168
|
}
|
|
119
169
|
if (phase === 'RECOVERY_LOOP') {
|
|
120
170
|
// Recovery succeeded. RCA may specify rewind target.
|
|
121
171
|
const rca = getLatestRCA(pipeline, projectDir);
|
|
122
|
-
|
|
123
|
-
|
|
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;
|
|
124
181
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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];
|
|
128
191
|
}
|
|
129
192
|
failedPhase = null;
|
|
130
193
|
}
|
|
131
194
|
else {
|
|
132
195
|
// Normal progression
|
|
133
|
-
|
|
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;
|
|
134
209
|
}
|
|
135
210
|
}
|
|
136
211
|
else {
|
|
137
212
|
// ─── FAIL ────────────────────────────────────────
|
|
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
|
+
}
|
|
138
224
|
if (pipeline.recoveryCount >= pipeline.maxRecoveryIterations) {
|
|
139
|
-
|
|
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
|
+
}
|
|
140
266
|
}
|
|
141
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
|
+
}
|
|
142
274
|
failedPhase = phase;
|
|
143
275
|
pipeline.failedPhase = phase;
|
|
144
276
|
phase = 'RECOVERY_LOOP';
|
|
145
277
|
pipeline.recoveryCount++;
|
|
146
278
|
}
|
|
147
279
|
}
|
|
280
|
+
// v2.5.0: Stagnation detection — shared helper checks rolling signature window
|
|
281
|
+
if (checkStagnation(pipeline, onProgress)) {
|
|
282
|
+
phase = 'STUCK';
|
|
283
|
+
}
|
|
148
284
|
// Update pipeline phase in state
|
|
149
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
|
+
}
|
|
150
293
|
onProgress?.(`Transitioning to: ${phase}`);
|
|
151
294
|
}
|
|
152
295
|
// ─── Terminal State ────────────────────────────────────
|
|
@@ -162,6 +305,13 @@ export async function runPipeline(options) {
|
|
|
162
305
|
}
|
|
163
306
|
}
|
|
164
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
|
+
}
|
|
165
315
|
return {
|
|
166
316
|
success: phase === 'DONE',
|
|
167
317
|
finalPhase: phase,
|
|
@@ -172,9 +322,153 @@ export async function runPipeline(options) {
|
|
|
172
322
|
: undefined,
|
|
173
323
|
};
|
|
174
324
|
}
|
|
175
|
-
/** Resume pipeline from saved state */
|
|
325
|
+
/** Resume pipeline from saved state — with STUCK recovery (v2.4.5) */
|
|
176
326
|
export async function resumePipeline(options) {
|
|
177
|
-
|
|
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
|
+
}
|
|
178
472
|
return runPipeline(options);
|
|
179
473
|
}
|
|
180
474
|
// ─── Helpers ─────────────────────────────────────────────
|
|
@@ -185,12 +479,13 @@ export async function resumePipeline(options) {
|
|
|
185
479
|
*/
|
|
186
480
|
function mergeGateResult(pipeline, phase, gateResult) {
|
|
187
481
|
const existing = pipeline.gateResults[phase];
|
|
188
|
-
if (existing?.score !== undefined || existing?.consensusScore !== undefined) {
|
|
189
|
-
// 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
|
|
190
484
|
pipeline.gateResults[phase] = {
|
|
191
485
|
...gateResult,
|
|
192
486
|
score: existing.score ?? gateResult.score,
|
|
193
487
|
consensusScore: existing.consensusScore ?? gateResult.consensusScore,
|
|
488
|
+
finalStatus: existing.finalStatus ?? gateResult.finalStatus, // v2.4.3
|
|
194
489
|
};
|
|
195
490
|
}
|
|
196
491
|
else {
|
|
@@ -208,7 +503,7 @@ function getNextCRRoute(pipeline) {
|
|
|
208
503
|
const nextCR = pending.find((cr) => cr.status === 'proposed');
|
|
209
504
|
if (!nextCR)
|
|
210
505
|
return undefined;
|
|
211
|
-
// Mark as
|
|
506
|
+
// Mark as routed/in-flight (kept as 'approved' for backward compatibility)
|
|
212
507
|
nextCR.status = 'approved';
|
|
213
508
|
return {
|
|
214
509
|
cr_id: nextCR.cr_id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/pipeline/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,QAAQ,EACR,iBAAiB,EACjB,eAAe,EACf,OAAO,EACP,QAAQ,GACT,MAAM,mBAAmB,CAAC;AAkB3B,4DAA4D;AAE5D,MAAM,cAAc,GAAuE;IACzF,MAAM,EAAE,SAAS;IACjB,qBAAqB,EAAE,sBAAsB;IAC7C,YAAY,EAAE,eAAe;IAC7B,sBAAsB,EAAE,wBAAwB;IAChD,aAAa,EAAE,eAAe;IAC9B,oBAAoB,EAAE,qBAAqB;IAC3C,cAAc,EAAE,iBAAiB;IACjC,aAAa,EAAE,eAAe;IAC9B,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,QAAQ;IACf,eAAe,EAAE,iBAAiB;IAClC,aAAa,EAAE,eAAe;IAC9B,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF,kDAAkD;AAClD,MAAM,eAAe,GAAuB,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAEzE,4DAA4D;AAE5D,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAwB;IACxD,MAAM,EACJ,UAAU,EACV,KAAK,EACL,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,UAAU,GACX,GAAG,OAAO,CAAC;IAEZ,sCAAsC;IACtC,MAAM,QAAQ,GAAmB,KAAiD,CAAC,QAAQ;WACtF,0BAA0B,EAAE,CAAC;IAElC,gEAAgE;IAChE,IAAI,iBAAiB,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QACnD,QAAQ,CAAC,eAAe,GAAG,iBAAiB,CAAC;IAC/C,CAAC;IAED,8BAA8B;IAC9B,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IACtC,MAAM,eAAe,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,eAAe,GAAG,qBAAqB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAE3E,wBAAwB;IACxB,eAAe,CAAC,mBAAmB,EAAE,CAAC;IAEtC,MAAM,OAAO,GAAiB;QAC5B,KAAK;QACL,QAAQ;QACR,UAAU;QACV,WAAW;QACX,eAAe;QACf,UAAU;QACV,eAAe;KAChB,CAAC;IAEF,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC;IACnC,IAAI,WAAW,GAAyB,IAAI,CAAC;IAE7C,wDAAwD;IACxD,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QAC7C,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC;QACtB,UAAU,EAAE,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC;QAEzC,4BAA4B;QAC5B,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,KAAK;gBACjB,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,kBAAkB,EAAE,QAAQ,CAAC,aAAa;gBAC1C,KAAK,EAAE,yBAAyB,KAAK,EAAE;aACxC,CAAC;QACJ,CAAC;QAED,IAAI,MAAmB,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG;gBACP,KAAK;gBACL,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,EAAE;gBACb,OAAO,EAAE,kCAAkC;gBAC3C,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;QAED,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAEjC,6DAA6D;QAC7D,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAEnE,sDAAsD;QACtD,MAAM,UAAU,GAAG,UAAU,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE;YAC1D,iBAAiB,EAAE,iBAAiB,CAAC,KAAK;YAC1C,kBAAkB,EAAE,iBAAiB,CAAC,MAAM;SAC7C,CAAC,CAAC;QAEH,wFAAwF;QACxF,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAE7C,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;YACpB,oDAAoD;YAEpD,wFAAwF;YACxF,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;gBACzC,IAAI,OAAO,EAAE,CAAC;oBACZ,UAAU,EAAE,CAAC,MAAM,OAAO,CAAC,KAAK,eAAe,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;oBACvE,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC;oBAC7B,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC;oBAC/B,SAAS;gBACX,CAAC;YACH,CAAC;YAED,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;gBAC9B,qDAAqD;gBACrD,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAC/C,IAAI,GAAG,EAAE,wBAAwB,EAAE,CAAC;oBAClC,KAAK,GAAG,GAAG,CAAC,wBAAwB,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACN,+BAA+B;oBAC/B,KAAK,GAAG,WAAW,IAAI,eAAe,CAAC;gBACzC,CAAC;gBACD,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,qBAAqB;gBACrB,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,oDAAoD;YACpD,IAAI,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,qBAAqB,EAAE,CAAC;gBAC7D,KAAK,GAAG,OAAO,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAG,KAAK,CAAC;gBACpB,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC7B,KAAK,GAAG,eAAe,CAAC;gBACxB,QAAQ,CAAC,aAAa,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC;QAC/B,UAAU,EAAE,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,0DAA0D;IAC1D,iDAAiD;IACjD,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QAC1C,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,kCAAkC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK,KAAK,MAAM;QACzB,UAAU,EAAE,KAAK;QACjB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,kBAAkB,EAAE,QAAQ,CAAC,aAAa;QAC1C,KAAK,EAAE,KAAK,KAAK,MAAM;YACrB,CAAC,CAAC,wBAAwB,QAAQ,CAAC,aAAa,sBAAsB;YACtE,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,uCAAuC;AACvC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAwB;IAC3D,sEAAsE;IACtE,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,4DAA4D;AAE5D;;;;GAIG;AACH,SAAS,eAAe,CACtB,QAAuB,EACvB,KAAoB,EACpB,UAAsB;IAEtB,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,QAAQ,EAAE,KAAK,KAAK,SAAS,IAAI,QAAQ,EAAE,cAAc,KAAK,SAAS,EAAE,CAAC;QAC5E,mDAAmD;QACnD,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG;YAC5B,GAAG,UAAU;YACb,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK;YACzC,cAAc,EAAE,QAAQ,CAAC,cAAc,IAAI,UAAU,CAAC,cAAc;SACrE,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC;IAC3C,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CACrB,QAAuB;IAEvB,MAAM,OAAO,GAAG,QAAQ,CAAC,qBAAqB,CAAC;IAC/C,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,+DAA+D;IAC/D,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC;IAE3B,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CACnB,QAAuB,EACvB,UAAkB;IAElB,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS;SACpC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,YAAY,KAAK,MAAM,CAAC;SACnE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAE1D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAEhD,yCAAyC;IACzC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;QAChD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/pipeline/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,OAAO,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,QAAQ,EACR,iBAAiB,EACjB,eAAe,EACf,OAAO,EACP,QAAQ,GACT,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAehD,4DAA4D;AAE5D,MAAM,cAAc,GAAuE;IACzF,MAAM,EAAE,SAAS;IACjB,qBAAqB,EAAE,sBAAsB;IAC7C,YAAY,EAAE,eAAe;IAC7B,sBAAsB,EAAE,wBAAwB;IAChD,aAAa,EAAE,eAAe;IAC9B,oBAAoB,EAAE,qBAAqB;IAC3C,cAAc,EAAE,iBAAiB;IACjC,aAAa,EAAE,eAAe;IAC9B,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,QAAQ;IACf,eAAe,EAAE,iBAAiB;IAClC,aAAa,EAAE,eAAe;IAC9B,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF,kDAAkD;AAClD,MAAM,eAAe,GAAuB,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAEzE,4DAA4D;AAE5D,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAwB;IACxD,MAAM,EACJ,UAAU,EACV,KAAK,EACL,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,UAAU,GACX,GAAG,OAAO,CAAC;IAEZ,sCAAsC;IACtC,MAAM,QAAQ,GAAkB,KAAK,CAAC,QAAQ,IAAI,0BAA0B,EAAE,CAAC;IAC/E,sDAAsD;IACtD,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAE1B,gEAAgE;IAChE,IAAI,iBAAiB,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QACnD,QAAQ,CAAC,eAAe,GAAG,iBAAiB,CAAC;IAC/C,CAAC;IAED,+CAA+C;IAC/C,QAAQ,CAAC,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,IAAI,EAAE,CAAC;IAC5D,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAE7E,8BAA8B;IAC9B,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IACtC,MAAM,eAAe,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,eAAe,GAAG,qBAAqB,CAAC,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAE5G,wBAAwB;IACxB,eAAe,CAAC,mBAAmB,EAAE,CAAC;IAEtC,MAAM,OAAO,GAAiB;QAC5B,KAAK;QACL,QAAQ;QACR,UAAU;QACV,WAAW;QACX,eAAe;QACf,UAAU;QACV,eAAe;QACf,kBAAkB;KACnB,CAAC;IAEF,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC;IACnC,IAAI,WAAW,GAAyB,IAAI,CAAC;IAE7C,wDAAwD;IACxD,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QAC7C,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC;QACtB,UAAU,EAAE,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC;QAEzC,4BAA4B;QAC5B,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,KAAK;gBACjB,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,kBAAkB,EAAE,QAAQ,CAAC,aAAa;gBAC1C,KAAK,EAAE,yBAAyB,KAAK,EAAE;aACxC,CAAC;QACJ,CAAC;QAED,IAAI,MAAmB,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG;gBACP,KAAK;gBACL,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,EAAE;gBACb,OAAO,EAAE,kCAAkC;gBAC3C,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;QAED,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAEjC,6DAA6D;QAC7D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,UAAU,EAAE,CAAC,SAAS,KAAK,YAAY,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtG,CAAC;QAED,gEAAgE;QAChE,IAAI,KAAK,KAAK,sBAAsB,IAAI,KAAK,KAAK,iBAAiB,EAAE,CAAC;YACpE,MAAM,cAAc,GAAG,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC9D,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACrD,mDAAmD;YACnD,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,gBAAgB,CAAC,CAAC;YAC9E,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC9B,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC;QACxC,CAAC;QAED,6DAA6D;QAC7D,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAEnE,sDAAsD;QACtD,MAAM,UAAU,GAAG,UAAU,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE;YAC1D,iBAAiB,EAAE,iBAAiB,CAAC,KAAK;YAC1C,kBAAkB,EAAE,iBAAiB,CAAC,MAAM;SAC7C,CAAC,CAAC;QAEH,wFAAwF;QACxF,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAE7C,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;YACpB,oDAAoD;YAEpD,yEAAyE;YACzE,iFAAiF;YACjF,sFAAsF;YACtF,IAAI,QAAQ,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;gBACnC,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC;gBACjC,QAAQ,CAAC,gCAAgC,GAAG,SAAS,CAAC;YACxD,CAAC;YAED,8DAA8D;YAC9D,IAAI,QAAQ,CAAC,qBAAqB,EAAE,CAAC;gBACnC,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACxC,CAAC;YAED,wFAAwF;YACxF,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;gBACzC,IAAI,OAAO,EAAE,CAAC;oBACZ,UAAU,EAAE,CAAC,MAAM,OAAO,CAAC,KAAK,eAAe,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;oBACvE,4DAA4D;oBAC5D,IAAI,OAAO,CAAC,YAAY,KAAK,KAAK,IAAI,QAAQ,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;wBACjE,UAAU,EAAE,CAAC,0BAA0B,QAAQ,CAAC,aAAa,qBAAqB,KAAK,OAAO,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC;wBACvH,QAAQ,CAAC,aAAa,GAAG,CAAC,CAAC;wBAC3B,QAAQ,CAAC,gBAAgB,GAAG,SAAS,CAAC;oBACxC,CAAC;oBACD,QAAQ,CAAC,qBAAqB,GAAG,OAAO,CAAC,KAAK,CAAC;oBAC/C,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC;oBAC7B,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC;oBAC/B,+EAA+E;oBAC/E,IAAI,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;wBAC1C,KAAK,GAAG,OAAO,CAAC;wBAChB,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC;oBACjC,CAAC;oBACD,uEAAuE;oBACvE,IAAI,CAAC;wBACH,MAAM,WAAW,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAC3E,CAAC;oBAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;oBAC3B,SAAS;gBACX,CAAC;YACH,CAAC;YAED,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;gBAC9B,qDAAqD;gBACrD,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAC/C,IAAI,YAAY,GAAG,GAAG,EAAE,wBAAwB,CAAC;gBAEjD,qEAAqE;gBACrE,oEAAoE;gBACpE,yCAAyC;gBACzC,IAAI,YAAY,IAAI,YAAY,KAAK,QAAQ,CAAC,gBAAgB,EAAE,CAAC;oBAC/D,UAAU,EAAE,CACV,sBAAsB,YAAY,YAAY;wBAC9C,cAAc,QAAQ,CAAC,aAAa,iBAAiB;wBACrD,GAAG,WAAW,IAAI,eAAe,WAAW,CAC7C,CAAC;oBACF,YAAY,GAAG,SAAS,CAAC;gBAC3B,CAAC;gBAED,6BAA6B;gBAC7B,MAAM,eAAe,GAAG,YAAY,IAAI,WAAW,IAAI,eAAe,CAAC;gBACvE,KAAK,GAAG,eAAe,CAAC;gBAExB,0EAA0E;gBAC1E,QAAQ,CAAC,gBAAgB,GAAG,YAAY,CAAC;gBAEzC,wEAAwE;gBACxE,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;oBACzC,OAAO,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;gBAC1C,CAAC;gBAED,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,qBAAqB;gBACrB,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBAE7D,yDAAyD;gBACzD,2EAA2E;gBAC3E,iEAAiE;gBACjE,wDAAwD;gBACxD,qEAAqE;gBACrE,uEAAuE;gBACvE,IAAI,SAAS,KAAK,KAAK,IAAI,QAAQ,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;oBAC/E,UAAU,EAAE,CAAC,0BAA0B,QAAQ,CAAC,aAAa,oBAAoB,KAAK,OAAO,SAAS,GAAG,CAAC,CAAC;oBAC3G,QAAQ,CAAC,aAAa,GAAG,CAAC,CAAC;oBAC3B,QAAQ,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBACxC,CAAC;gBAED,KAAK,GAAG,SAAS,CAAC;YACpB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,oDAAoD;YACpD,UAAU,EAAE,CAAC,mBAAmB,KAAK,KAAK,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAE5E,sFAAsF;YACtF,IACE,QAAQ,CAAC,WAAW,KAAK,KAAK;gBAC9B,QAAQ,CAAC,gCAAgC,KAAK,SAAS;gBACvD,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,GAAG,UAAU,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,gCAAgC,EACjH,CAAC;gBACD,UAAU,EAAE,CACV,kCAAkC,KAAK,IAAI;oBAC3C,GAAG,QAAQ,CAAC,gCAAgC,MAAM;oBAClD,GAAG,UAAU,CAAC,YAAY,CAAC,MAAM,GAAG,UAAU,CAAC,gBAAgB,CAAC,MAAM,mBAAmB;oBACzF,+BAA+B,CAChC,CAAC;gBACF,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC,qBAAqB,CAAC;YAC1D,CAAC;YAED,IAAI,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,qBAAqB,EAAE,CAAC;gBAC7D,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,kCAAkC;gBAEhE,iDAAiD;gBACjD,MAAM,oBAAoB,GAAG,CAAC,CAAC,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;gBAC7D,IAAI,CAAC,QAAQ,CAAC,kBAAkB,IAAI,oBAAoB,EAAE,CAAC;oBACzD,UAAU,EAAE,CAAC,uCAAuC,cAAc,4BAA4B,CAAC,CAAC;oBAEhG,IAAI,CAAC;wBACH,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;wBACnE,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC;4BACvC,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe;yBACvD,CAAC,CAAC;wBAEH,QAAQ,CAAC,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;wBACrE,IAAI,MAAM,CAAC,QAAQ;4BAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;wBAE9D,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;4BACtC,UAAU,EAAE,CAAC,gDAAgD,MAAM,CAAC,QAAQ,CAAC,MAAM,4BAA4B,CAAC,CAAC;4BACjH,QAAQ,CAAC,aAAa,GAAG,CAAC,CAAC;4BAC3B,QAAQ,CAAC,gBAAgB,GAAG,SAAS,CAAC;4BACtC,+DAA+D;4BAC/D,uCAAuC;4BACvC,KAAK,GAAG,cAAc,CAAC;4BACvB,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC;4BAC/B,QAAQ,CAAC,WAAW,GAAG,cAAc,CAAC;4BACtC,oDAAoD;4BACpD,OAAO,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;4BAC5C,OAAO,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;4BAC3C,mDAAmD;wBACrD,CAAC;6BAAM,CAAC;4BACN,UAAU,EAAE,CAAC,qDAAqD,CAAC,CAAC;4BACpE,KAAK,GAAG,OAAO,CAAC;wBAClB,CAAC;oBACH,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,QAAQ,CAAC,kBAAkB,GAAI,GAAa,EAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;wBACjG,UAAU,EAAE,CAAC,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,mBAAmB,CAAC,CAAC;wBAC3G,KAAK,GAAG,OAAO,CAAC;oBAClB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,KAAK,GAAG,OAAO,CAAC;gBAClB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,4EAA4E;gBAC5E,IACE,QAAQ,CAAC,gCAAgC,KAAK,SAAS;oBACvD,QAAQ,CAAC,WAAW,KAAK,KAAK,CAAE,gDAAgD;kBAChF,CAAC;oBACD,QAAQ,CAAC,gCAAgC,GAAG,UAAU,CAAC,YAAY,CAAC,MAAM,GAAG,UAAU,CAAC,gBAAgB,CAAC,MAAM,CAAC;gBAClH,CAAC;gBACD,WAAW,GAAG,KAAK,CAAC;gBACpB,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC7B,KAAK,GAAG,eAAe,CAAC;gBACxB,QAAQ,CAAC,aAAa,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,+EAA+E;QAC/E,IAAI,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;YAC1C,KAAK,GAAG,OAAO,CAAC;QAClB,CAAC;QAED,iCAAiC;QACjC,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC;QAE/B,6EAA6E;QAC7E,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,UAAU,EAAE,CAAC,8CACX,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC7E,CAAC;QAED,UAAU,EAAE,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,0DAA0D;IAC1D,iDAAiD;IACjD,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QAC1C,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,kCAAkC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;IACzC,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK,KAAK,MAAM;QACzB,UAAU,EAAE,KAAK;QACjB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,kBAAkB,EAAE,QAAQ,CAAC,aAAa;QAC1C,KAAK,EAAE,KAAK,KAAK,MAAM;YACrB,CAAC,CAAC,wBAAwB,QAAQ,CAAC,aAAa,sBAAsB;YACtE,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAwB;IAC3D,MAAM,QAAQ,GAA8B,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;IAEnE,gEAAgE;IAChE,sFAAsF;IACtF,mFAAmF;IACnF,IACE,QAAQ;QACR,CAAC,QAAQ,CAAC,aAAa,KAAK,OAAO,IAAI,QAAQ,CAAC,aAAa,KAAK,eAAe,CAAC;QAClF,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU,EACnC,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,+EAA+E;QACjF,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,+EAA+E;IAC/E,8DAA8D;IAC9D,IACE,QAAQ,EAAE,aAAa,KAAK,eAAe;QAC3C,QAAQ,EAAE,WAAW;QACrB,QAAQ,CAAC,aAAa,GAAG,CAAC,QAAQ,CAAC,qBAAqB,IAAI,CAAC,CAAC,EAC9D,CAAC;QACD,qEAAqE;QACrE,uEAAuE;QACvE,sEAAsE;QACtE,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC;QAC9C,OAAO,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAClD,OAAO,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACjD,OAAO,CAAC,UAAU,EAAE,CAClB,2DAA2D,QAAQ,CAAC,WAAW,IAAI;YACnF,iBAAiB,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,qBAAqB,EAAE,CAC5E,CAAC;IACJ,CAAC;SAAM;IACL,mFAAmF;IACnF,CAAC,QAAQ,EAAE,aAAa,KAAK,OAAO;QACnC,CAAC,QAAQ,EAAE,aAAa,KAAK,eAAe;YAC3C,QAAQ,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC,qBAAqB,IAAI,CAAC,CAAC,CAAC,CAAC;QACnE,QAAQ,EAAE,WAAW,EACrB,CAAC;QACD,8EAA8E;QAC9E,sFAAsF;QACtF,0FAA0F;QAC1F,IAAI,QAAQ,CAAC,qBAAqB,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC;YACrD,QAAQ,CAAC,qBAAqB,GAAG,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CACpE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,MAAM,KAAK,UAAU,CACzD,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC;YAC9D,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,UAAU,EAAE,CAAC,mBAAmB,MAAM,+BAA+B,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAED,oEAAoE;QACpE,IACE,QAAQ,CAAC,qBAAqB;YAC9B,CAAC,QAAQ,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,KAAK,QAAQ,CAAC,qBAAqB,CAAC,EAC1F,CAAC;YACD,OAAO,CAAC,UAAU,EAAE,CAAC,iDAAiD,QAAQ,CAAC,qBAAqB,EAAE,CAAC,CAAC;YACxG,QAAQ,CAAC,qBAAqB,GAAG,SAAS,CAAC;QAC7C,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACzD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,gDAAgD;YAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC;YAC5C,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC;YAC9C,QAAQ,CAAC,aAAa,GAAG,CAAC,CAAC;YAC3B,QAAQ,CAAC,gBAAgB,GAAG,SAAS,CAAC;YACtC,QAAQ,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAE,yDAAyD;YAEnG,2DAA2D;YAC3D,OAAO,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAClD,OAAO,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAEjD,OAAO,CAAC,UAAU,EAAE,CAClB,4BAA4B,QAAQ,CAAC,aAAa,kBAAkB,QAAQ,CAAC,WAAW,IAAI;gBAC5F,iBAAiB,YAAY,gCAAgC,CAC9D,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,+DAA+D;YAC/D,MAAM,oBAAoB,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACrE,IAAI,CAAC,QAAQ,CAAC,kBAAkB,IAAI,oBAAoB,EAAE,CAAC;gBACzD,OAAO,CAAC,UAAU,EAAE,CAClB,2EAA2E,CAC5E,CAAC;gBAEF,IAAI,CAAC;oBACH,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBAClE,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;oBACnE,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC;wBACvC,QAAQ;wBACR,UAAU,EAAE,OAAO,CAAC,UAAU;wBAC9B,eAAe;wBACf,eAAe,EAAE,OAAO,CAAC,eAAe;qBACzC,CAAC,CAAC;oBAEH,QAAQ,CAAC,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;oBACrE,IAAI,MAAM,CAAC,QAAQ;wBAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBAE9D,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBACtC,OAAO,CAAC,UAAU,EAAE,CAClB,6CAA6C,MAAM,CAAC,QAAQ,CAAC,MAAM,4BAA4B,CAChG,CAAC;wBACF,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC;wBAC5C,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC;wBAC9C,QAAQ,CAAC,aAAa,GAAG,CAAC,CAAC;wBAC3B,QAAQ,CAAC,gBAAgB,GAAG,SAAS,CAAC;wBACtC,OAAO,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;wBAClD,OAAO,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;wBAEjD,OAAO,CAAC,UAAU,EAAE,CAClB,gDAAgD,QAAQ,CAAC,WAAW,IAAI;4BACxE,iBAAiB,YAAY,gCAAgC,CAC9D,CAAC;wBACF,sCAAsC;oBACxC,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,UAAU,EAAE,CAAC,qDAAqD,CAAC,CAAC;wBAC5E,qCAAqC;oBACvC,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,QAAQ,CAAC,kBAAkB,GAAI,GAAa,EAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;oBACjG,OAAO,CAAC,UAAU,EAAE,CAClB,kCAAkC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CACnF,CAAC;oBACF,qCAAqC;gBACvC,CAAC;gBAED,yDAAyD;gBACzD,IAAI,CAAC;oBACH,MAAM,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACtD,CAAC;gBAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;gBAE7B,4DAA4D;gBAC5D,IAAI,QAAQ,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;oBAC9C,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;YAED,yEAAyE;YACzE,IAAI,CAAC;gBACH,MAAM,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,2DAA2D;YAC7D,CAAC;YACD,OAAO,CAAC,UAAU,EAAE,CAClB,iCAAiC,QAAQ,CAAC,WAAW,UAAU,QAAQ,CAAC,aAAa,sBAAsB;gBAC3G,uCAAuC,CACxC,CAAC;YACF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,OAAO;gBACnB,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,kBAAkB,EAAE,QAAQ,CAAC,aAAa;gBAC1C,KAAK,EAAE,qBAAqB,QAAQ,CAAC,WAAW,UAAU,QAAQ,CAAC,aAAa,kDAAkD;aACnI,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IACL,CAAC,QAAQ,EAAE,aAAa,KAAK,OAAO,IAAI,QAAQ,EAAE,aAAa,KAAK,eAAe,CAAC;QACpF,CAAC,QAAQ,EAAE,WAAW,EACtB,CAAC;QACD,OAAO,CAAC,UAAU,EAAE,CAClB,wBAAwB,QAAQ,CAAC,aAAa,mDAAmD,CAClG,CAAC;QACF,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,OAAO;YACnB,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,EAAE;YACpC,kBAAkB,EAAE,QAAQ,EAAE,aAAa,IAAI,CAAC;YAChD,KAAK,EAAE,gFAAgF;SACxF,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,4DAA4D;AAE5D;;;;GAIG;AACH,SAAS,eAAe,CACtB,QAAuB,EACvB,KAAoB,EACpB,UAAsB;IAEtB,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,QAAQ,EAAE,KAAK,KAAK,SAAS,IAAI,QAAQ,EAAE,cAAc,KAAK,SAAS,IAAI,QAAQ,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;QACnH,mEAAmE;QACnE,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG;YAC5B,GAAG,UAAU;YACb,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK;YACzC,cAAc,EAAE,QAAQ,CAAC,cAAc,IAAI,UAAU,CAAC,cAAc;YACpE,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,UAAU,CAAC,WAAW,EAAG,SAAS;SACxE,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC;IAC3C,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CACrB,QAAuB;IAEvB,MAAM,OAAO,GAAG,QAAQ,CAAC,qBAAqB,CAAC;IAC/C,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,2EAA2E;IAC3E,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC;IAE3B,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CACnB,QAAuB,EACvB,UAAkB;IAElB,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS;SACpC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,YAAY,KAAK,MAAM,CAAC;SACnE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAE1D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAEhD,yCAAyC;IACzC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;QAChD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -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
|