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

288 lines
7.3 KiB
Markdown

# Coverage Analysis Domain
## Bounded Context Overview
**Domain**: Coverage Analysis
**Responsibility**: O(log n) coverage gap detection with HNSW vector indexing
**Location**: `src/domains/coverage-analysis/`
The Coverage Analysis domain provides intelligent coverage analysis using sublinear algorithms and HNSW-indexed semantic search for finding similar coverage patterns.
## Ubiquitous Language
| Term | Definition |
|------|------------|
| **Coverage Gap** | Code section lacking test coverage |
| **Risk Score** | Calculated risk of uncovered code |
| **Coverage Summary** | Aggregate metrics (line, branch, function, statement) |
| **Coverage Trend** | Historical coverage trajectory |
| **Similar Pattern** | Semantically related coverage gap |
| **Q-Learning State** | Feature vector for RL-based prioritization |
| **Prioritized Test** | Test ranked by estimated coverage gain |
## Domain Model
### Aggregates
#### CoverageReport (Aggregate Root)
Complete analysis of a coverage dataset.
```typescript
interface CoverageReport {
summary: CoverageSummary;
meetsThreshold: boolean;
delta?: CoverageDelta;
recommendations: string[];
}
```
#### CoverageGaps (Aggregate Root)
Collection of detected coverage gaps with effort estimation.
```typescript
interface CoverageGaps {
gaps: CoverageGap[];
totalUncoveredLines: number;
estimatedEffort: number; // Hours to achieve coverage
}
```
### Entities
#### CoverageGap
Individual coverage gap with risk assessment.
```typescript
interface CoverageGap {
id: string;
file: string;
lines: number[];
branches: number[];
riskScore: number;
severity: Severity;
recommendation: string;
}
```
#### FileCoverage
Coverage data for a single file.
```typescript
interface FileCoverage {
path: string;
lines: { covered: number; total: number };
branches: { covered: number; total: number };
functions: { covered: number; total: number };
statements: { covered: number; total: number };
uncoveredLines: number[];
uncoveredBranches: number[];
}
```
### Value Objects
#### CoverageSummary
Immutable aggregate coverage metrics.
```typescript
interface CoverageSummary {
readonly line: number;
readonly branch: number;
readonly function: number;
readonly statement: number;
readonly files: number;
}
```
#### CoverageDelta
Change in coverage between measurements.
```typescript
interface CoverageDelta {
readonly line: number;
readonly branch: number;
readonly function: number;
readonly statement: number;
readonly trend: 'improving' | 'declining' | 'stable';
}
```
#### RiskFactor
Factor contributing to coverage risk score.
```typescript
interface RiskFactor {
readonly name: string;
readonly weight: number;
}
```
## Domain Services
### CoverageAnalysisAPI
Primary API for the domain.
```typescript
interface CoverageAnalysisAPI {
analyze(request: AnalyzeCoverageRequest): Promise<Result<CoverageReport, Error>>;
detectGaps(request: GapDetectionRequest): Promise<Result<CoverageGaps, Error>>;
calculateRisk(request: RiskCalculationRequest): Promise<Result<RiskReport, Error>>;
getTrend(request: TrendRequest): Promise<Result<CoverageTrend, Error>>;
findSimilar(request: SimilarityRequest): Promise<Result<SimilarPatterns, Error>>;
}
```
### Key Operations
#### Gap Detection (O(log n))
Uses HNSW indexing for sublinear gap detection:
```typescript
// Request
interface GapDetectionRequest {
coverageData: CoverageData;
minCoverage?: number;
prioritize?: 'risk' | 'size' | 'recent-changes';
}
// Response
interface CoverageGaps {
gaps: CoverageGap[];
totalUncoveredLines: number;
estimatedEffort: number;
}
```
#### Similarity Search
Find similar coverage patterns using vector embeddings:
```typescript
interface SimilarityRequest {
pattern: CoverageGap;
k: number; // Number of similar patterns to find
}
interface SimilarPatterns {
patterns: { gap: CoverageGap; similarity: number }[];
searchTime: number; // O(log n) search time
}
```
## Q-Learning Integration
### Coverage State for RL
```typescript
interface CoverageQLState {
id: string;
features: number[];
filePath: string;
currentCoverage: number;
targetCoverage: number;
complexity: number;
changeFrequency: number;
businessCriticality: number;
uncoveredLines: number;
branchPoints: number;
riskScore: number;
}
```
### Coverage Actions
```typescript
interface CoverageQLAction {
type: 'generate-unit' | 'generate-integration' | 'prioritize' | 'skip';
value: number | string;
}
```
### Q-Learning Predictions
```typescript
interface CoverageQLPrediction {
action: CoverageQLAction;
confidence: number;
value: number;
reasoning: string;
estimatedCoverageGain: number;
estimatedTestCount: number;
}
```
## Domain Events
| Event | Trigger | Payload |
|-------|---------|---------|
| `CoverageAnalyzedEvent` | Analysis complete | `{ summary, threshold, meetsThreshold }` |
| `GapsDetectedEvent` | Gaps identified | `{ gapIds, totalUncovered, riskLevel }` |
| `TrendCalculatedEvent` | Trend computed | `{ direction, forecast }` |
| `RiskAssessedEvent` | Risk calculated | `{ file, riskLevel, factors }` |
## Context Integration
### Upstream Dependencies
- **Test Execution**: Provides raw coverage data
- **Code Intelligence**: File complexity metrics
### Downstream Consumers
- **Quality Assessment**: Uses coverage for quality gates
- **Test Generation**: Targets low-coverage areas
- **Learning Optimization**: Pattern storage
### Anti-Corruption Layer
The domain abstracts different coverage report formats (Istanbul, c8, coverage.py) through the `CoverageData` interface.
## Task Handlers
| Task Type | Handler | Description |
|-----------|---------|-------------|
| `analyze-coverage` | `analyze()` | Full coverage analysis |
| `detect-gaps` | `detectGaps()` | O(log n) gap detection |
| `calculate-risk` | `calculateRisk()` | Risk score computation |
| `find-similar` | `findSimilar()` | Semantic pattern search |
## HNSW Configuration
```typescript
const HNSW_CONFIG = {
M: 16, // Max connections per node
efConstruction: 200, // Construction-time search width
efSearch: 50, // Query-time search width
distanceFunction: 'cosine', // Similarity metric
};
```
## Risk Scoring Algorithm
```typescript
function calculateRiskScore(gap: CoverageGap, factors: RiskFactor[]): number {
let score = 0;
for (const factor of factors) {
switch (factor.name) {
case 'complexity':
score += gap.complexity * factor.weight;
break;
case 'change-frequency':
score += gap.changeFrequency * factor.weight;
break;
case 'business-criticality':
score += gap.businessCriticality * factor.weight;
break;
case 'dependency-count':
score += Math.min(gap.dependencies / 10, 1) * factor.weight;
break;
}
}
return Math.min(100, score);
}
```
## ADR References
- **ADR-006**: Unified Memory Service (HNSW indexing)
- **ADR-009**: Hybrid Memory Backend
- **ADR-051**: LLM-powered gap recommendations