Files
Profa 2253d05618 feat: flatten project structure — archive v2, promote v3 to root
Remove the nested v3/ subdirectory by moving all active source code,
tests, configs, and assets directly to the project root. Archive v2/
(dead code, 847MB) to v2-archive.tar.gz.

Key changes:
- Move v3/src/ → src/, v3/tests/ → tests/, v3/packages/ → packages/
- Move v3/tsconfig.json, v3/vitest.config.ts to root
- Merge v3/package.json into root package.json (ESM, scripts, deps, exports)
- Merge v3/scripts/ into scripts/, v3/implementation/ into docs/implementation/
- Update all CI workflows to remove "cd v3 &&" and v3/ path prefixes
- Fix all init installer path resolution (3-level-up → 2-level-up)
- Fix hooks to use "node ./dist/cli/bundle.js" instead of bare "aqe"
- Update settings.json ADR/DDD directories to docs/implementation/
- Fix helper scripts (statusline, adr-compliance, ddd-tracker, guidance-hooks)
- Update 58 agent definitions: aqe/v3/ → aqe/ memory namespaces
- Update 15 guidance shards: v3/src/ → src/ path references
- Fix sync interfaces: remove v3/ and v2/ path references
- Fix test path calculations (process.cwd() + '..' no longer needed)
- Fix flaky perf test threshold (500ms → 1000ms for CI environments)
- Fix complexity-analyzer test to match ADR-051 keyword-based eligibility

Build passes, 17,901 tests pass, CLI and MCP bundles verified.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 11:35:41 +00:00

211 lines
6.3 KiB
TypeScript

/**
* Integration tests for QueenCoordinator + Governance
*
* Verifies that governance is actually wired into QueenCoordinator,
* not just implemented as dead code.
*
* @see ADR-058-guidance-governance-integration.md
*/
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
import {
governanceFlags,
queenGovernanceAdapter,
trustAccumulatorIntegration,
continueGateIntegration,
} from '../../../src/governance/index.js';
describe('QueenCoordinator Governance Integration', () => {
beforeEach(() => {
// Reset governance state
governanceFlags.reset();
trustAccumulatorIntegration.reset();
continueGateIntegration.reset();
queenGovernanceAdapter.reset();
});
afterEach(() => {
vi.restoreAllMocks();
});
describe('beforeTaskExecution Integration', () => {
it('should call governance beforeTaskExecution on task submit', async () => {
// Initialize governance adapter
await queenGovernanceAdapter.initialize();
// Spy on beforeTaskExecution
const spy = vi.spyOn(queenGovernanceAdapter, 'beforeTaskExecution');
// Call beforeTaskExecution directly (simulating what QueenCoordinator does)
const decision = await queenGovernanceAdapter.beforeTaskExecution({
taskId: 'test-task-1',
taskType: 'generate-tests',
agentId: 'test-agent',
domain: 'test-generation',
priority: 'p1',
});
expect(spy).toHaveBeenCalledTimes(1);
expect(decision.allowed).toBe(true);
});
it('should block task when agent is throttled', async () => {
await queenGovernanceAdapter.initialize();
// Force agent into throttled state by recording identical actions
const agentId = 'throttle-test-agent';
for (let i = 0; i < 10; i++) {
queenGovernanceAdapter.onAgentAction({
agentId,
actionType: 'file:edit',
target: 'same-file.ts',
success: false,
});
}
// Now task should be blocked or have throttle recommendation
const decision = await queenGovernanceAdapter.beforeTaskExecution({
taskId: 'test-task-2',
taskType: 'generate-tests',
agentId,
domain: 'test-generation',
priority: 'p2',
});
// In non-strict mode, may still be allowed but with stats
expect(decision.agentStats).toBeDefined();
if (decision.agentStats) {
expect(decision.agentStats.reworkRatio).toBeGreaterThan(0);
}
});
});
describe('afterTaskExecution Integration', () => {
it('should track task outcomes for trust accumulation', async () => {
await queenGovernanceAdapter.initialize();
const agentId = 'outcome-test-agent';
// Record successful task
await queenGovernanceAdapter.afterTaskExecution(
{
taskId: 'task-1',
taskType: 'generate-tests',
agentId,
domain: 'test-generation',
priority: 'p1',
},
true, // success
0.05, // cost
1500 // tokens
);
// Trust should increase for successful task
const tier = trustAccumulatorIntegration.getTrustTier(agentId);
expect(tier).toBeDefined();
});
it('should track failed task outcomes', async () => {
await queenGovernanceAdapter.initialize();
const agentId = 'failure-test-agent';
// Record multiple failures
for (let i = 0; i < 5; i++) {
await queenGovernanceAdapter.afterTaskExecution(
{
taskId: `task-fail-${i}`,
taskType: 'generate-tests',
agentId,
domain: 'test-generation',
priority: 'p1',
},
false, // success = false
0.02,
500
);
}
// Trust should be lower due to failures
const metrics = trustAccumulatorIntegration.getAgentMetrics(agentId);
expect(metrics).toBeDefined();
if (metrics) {
expect(metrics.totalTasks).toBe(5);
expect(metrics.successRate).toBe(0);
}
});
});
describe('Memory Write Integration', () => {
it('should validate memory writes through governance', async () => {
await queenGovernanceAdapter.initialize();
// Test memory write decision
const decision = await queenGovernanceAdapter.beforeMemoryWrite({
key: 'test-pattern',
value: { rule: 'test rule' },
domain: 'test-generation',
});
expect(decision.allowed).toBe(true);
});
it('should register patterns for contradiction detection', async () => {
await queenGovernanceAdapter.initialize();
// Register a pattern
queenGovernanceAdapter.registerPattern({
key: 'pattern-1',
value: { rule: 'always use mocks' },
domain: 'test-generation',
});
// Try to write contradicting pattern
const decision = await queenGovernanceAdapter.beforeMemoryWrite({
key: 'pattern-2',
value: { rule: 'never use mocks' },
domain: 'test-generation',
});
// May or may not be blocked depending on semantic analysis
// but decision should be made
expect(decision).toBeDefined();
expect(typeof decision.allowed).toBe('boolean');
});
});
describe('Strict Mode Enforcement', () => {
it('should block violations in strict mode', async () => {
// Enable strict mode
governanceFlags.enableStrictMode();
await queenGovernanceAdapter.initialize();
const agentId = 'strict-mode-agent';
// Force agent into loop
for (let i = 0; i < 10; i++) {
queenGovernanceAdapter.onAgentAction({
agentId,
actionType: 'file:edit',
target: 'same-file.ts',
success: false,
});
}
// In strict mode, should block
const decision = await queenGovernanceAdapter.beforeTaskExecution({
taskId: 'strict-task',
taskType: 'generate-tests',
agentId,
domain: 'test-generation',
priority: 'p1',
});
// Strict mode blocks violations
if (decision.agentStats?.isThrottled) {
expect(decision.allowed).toBe(false);
}
});
});
});