feat(P02): backend-enriched tier, chaos engineering, prioritization — IDEATE-04,05,06,09,10
---ci---
phase: 2
milestone: v0.10
status: execute
decisions:
- id: D-087
decision: All 6 innovative features in v1 (pattern mining, drift detection, layer inversion, cross-project, chaos, spec)
rationale: User wants bleeding-edge; all uniquely differentiated
confidence: 0.82
requirements:
covered:
- IDEATE-04
- IDEATE-05
- IDEATE-06
- IDEATE-09
- IDEATE-10
---/ci---
- IDEATE-04: Verification layer inversion (structural, behavioral, security, quality missing detection)
- IDEATE-05: Architectural drift detection (documented vs actual component comparison)
- IDEATE-06: Spec-driven improvement (ambiguity detection, missing category detection)
- IDEATE-09: Backend-enriched analysis (prioritization, novel suggestions, action plans)
- IDEATE-10: Chaos engineering ideation (backend unavailable, requirement change, coverage drop)
- Deduplicated type exports: IdeationSource/Idea/etc now in types/ideation.ts
- 538 tests passing
This commit is contained in:
@@ -2,7 +2,8 @@ import * as fs from "node:fs";
|
||||
import * as path from "node:path";
|
||||
import * as os from "node:os";
|
||||
import { IdeationAgent } from "../agents/ideation-agent.js";
|
||||
import { IdeationEngine, resetIdeaCounter, Idea } from "../core/ideation.js";
|
||||
import { IdeationEngine, resetIdeaCounter } from "../core/ideation.js";
|
||||
import { Idea, IdeationAction, DEFAULT_IDEATION_CONFIG } from "../types/ideation.js";
|
||||
|
||||
describe("IdeationAgent", () => {
|
||||
let tempDir: string;
|
||||
@@ -244,4 +245,86 @@ describe("IdeationEngine", () => {
|
||||
expect(results.every((r) => r.addedToRequirements || r.addedToRoadmap)).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("Phase 2: Backend-enriched and chaos", () => {
|
||||
let tempDir: string;
|
||||
|
||||
beforeEach(() => {
|
||||
resetIdeaCounter();
|
||||
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "ciagent-p2-test-"));
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
fs.rmSync(tempDir, { recursive: true, force: true });
|
||||
});
|
||||
|
||||
it("runBackendEnriched prioritizes mechanical findings", () => {
|
||||
const engine = new IdeationEngine(tempDir);
|
||||
const mechanicalIdeas: Idea[] = [
|
||||
{
|
||||
id: "IDEATE-01",
|
||||
source: "uncovered_requirement",
|
||||
category: "coverage",
|
||||
title: "Missing test",
|
||||
rationale: "No test file",
|
||||
confidence: 0.7,
|
||||
actions: ["add_test"],
|
||||
tier: "mechanical",
|
||||
},
|
||||
{
|
||||
id: "IDEATE-02",
|
||||
source: "escalation_pattern",
|
||||
category: "security",
|
||||
title: "Security issue",
|
||||
rationale: "Repeated escalation",
|
||||
confidence: 0.8,
|
||||
actions: ["add_security_pattern"],
|
||||
tier: "mechanical",
|
||||
},
|
||||
];
|
||||
|
||||
const enriched = engine.runBackendEnriched(mechanicalIdeas);
|
||||
expect(enriched.length).toBeGreaterThanOrEqual(2);
|
||||
const prioritizedIdeas = enriched.filter((i) => i.source === "uncovered_requirement" || i.source === "escalation_pattern");
|
||||
expect(prioritizedIdeas.length).toBeGreaterThanOrEqual(2);
|
||||
for (const idea of prioritizedIdeas) {
|
||||
expect(idea.tier).toBe("backend-enriched");
|
||||
}
|
||||
});
|
||||
|
||||
it("runBackendEnriched adds novel suggestions for missing categories", () => {
|
||||
const engine = new IdeationEngine(tempDir);
|
||||
const mechanicalIdeas: Idea[] = [
|
||||
{
|
||||
id: "IDEATE-01",
|
||||
source: "uncovered_requirement",
|
||||
category: "coverage",
|
||||
title: "Cover this",
|
||||
rationale: "Missing",
|
||||
confidence: 0.7,
|
||||
actions: ["add_test"],
|
||||
tier: "mechanical",
|
||||
},
|
||||
];
|
||||
|
||||
const enriched = engine.runBackendEnriched(mechanicalIdeas);
|
||||
const novelIdeas = enriched.filter((i) => i.source === "improvement_pattern");
|
||||
expect(novelIdeas.length).toBeGreaterThanOrEqual(1);
|
||||
});
|
||||
|
||||
it("generateChaosScenarios uses default scenarios when enabled", () => {
|
||||
const engine = new IdeationEngine(tempDir);
|
||||
const chaosIdeas = engine.generateChaosScenarios();
|
||||
|
||||
expect(chaosIdeas.length).toBe(3);
|
||||
expect(chaosIdeas.every((i) => i.source === "chaos_scenario")).toBe(true);
|
||||
expect(chaosIdeas.every((i) => i.category === "chaos")).toBe(true);
|
||||
expect(chaosIdeas.every((i) => i.tier === "backend-enriched")).toBe(true);
|
||||
expect(chaosIdeas.every((i) => i.confidence >= 0.5)).toBe(true);
|
||||
const titles = chaosIdeas.map((i) => i.title);
|
||||
expect(titles.some((t) => t.includes("backend"))).toBe(true);
|
||||
expect(titles.some((t) => t.includes("requirement"))).toBe(true);
|
||||
expect(titles.some((t) => t.includes("coverage"))).toBe(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user