feat(audit): complete Phase 1 data model (8 dataclasses, 12 new tests)
Tasks 1.3-1.10: AccessPatternEvidence, FrequencyEvidence, ResultCoverage, TypeAliasCoverage, CrossAuditFinding, CrossAuditFindings, DecompositionCost, OptimizationCandidate, AggregateProfile. All frozen dataclasses per error_handling.md Pattern 1 (immutability for cross-thread safety). Phase 1 complete: 19 unit tests passing (5 enum tests + 14 dataclass tests). AggregateProfile is the central artifact with 14 required fields + 2 optional (mermaid, markdown). Phase 2 (PCG - 3 AST passes + build_pcg()) next.
This commit is contained in:
+88
-2
@@ -9,7 +9,7 @@ postfix DSL + markdown + prefix tree text. See
|
||||
conductor/tracks/code_path_audit_20260607/spec_v2.md.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
from dataclasses import dataclass
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Literal
|
||||
|
||||
AggregateKind = Literal[
|
||||
@@ -59,4 +59,90 @@ class FunctionRef:
|
||||
fqname: str
|
||||
file: str
|
||||
line: int
|
||||
role: str
|
||||
role: str
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class AccessPatternEvidence:
|
||||
function: FunctionRef
|
||||
pattern: AccessPattern
|
||||
field_accesses: dict[str, int]
|
||||
confidence: str
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class FrequencyEvidence:
|
||||
function: FunctionRef
|
||||
frequency: Frequency
|
||||
source: str
|
||||
note: str = ""
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class ResultCoverage:
|
||||
total_producers: int
|
||||
result_producers: int
|
||||
total_consumers: int
|
||||
result_consumers: int
|
||||
summary: str
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class TypeAliasCoverage:
|
||||
total_sites: int
|
||||
typed_sites: int
|
||||
untyped_sites: int
|
||||
summary: str
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class CrossAuditFinding:
|
||||
audit_script: str
|
||||
site_count: int
|
||||
example_file: str
|
||||
example_line: int
|
||||
note: str = ""
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class CrossAuditFindings:
|
||||
weak_types: tuple[CrossAuditFinding, ...]
|
||||
exception_handling: tuple[CrossAuditFinding, ...]
|
||||
optional_in_baseline: tuple[CrossAuditFinding, ...]
|
||||
config_io_ownership: tuple[CrossAuditFinding, ...]
|
||||
import_graph: tuple[CrossAuditFinding, ...]
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class DecompositionCost:
|
||||
current_cost_estimate: int
|
||||
componentize_savings: int
|
||||
unify_savings: int
|
||||
recommended_direction: RecommendedDirection
|
||||
recommended_rationale: str
|
||||
batch_size: int | None
|
||||
struct_field_count: int
|
||||
struct_frozen: bool
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class OptimizationCandidate:
|
||||
candidate: str
|
||||
direction: RecommendedDirection
|
||||
affected_files: tuple[str, ...]
|
||||
estimated_savings_us: int
|
||||
effort: str
|
||||
priority: str
|
||||
cross_ref: str = ""
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class AggregateProfile:
|
||||
name: str
|
||||
aggregate_kind: AggregateKind
|
||||
memory_dim: MemoryDim
|
||||
producers: tuple[FunctionRef, ...]
|
||||
consumers: tuple[FunctionRef, ...]
|
||||
access_pattern: AccessPattern
|
||||
access_pattern_evidence: tuple[AccessPatternEvidence, ...]
|
||||
frequency: Frequency
|
||||
frequency_evidence: tuple[FrequencyEvidence, ...]
|
||||
result_coverage: ResultCoverage
|
||||
type_alias_coverage: TypeAliasCoverage
|
||||
cross_audit_findings: CrossAuditFindings
|
||||
decomposition_cost: DecompositionCost
|
||||
optimization_candidates: tuple[OptimizationCandidate, ...]
|
||||
is_candidate: bool
|
||||
mermaid: str = ""
|
||||
markdown: str = ""
|
||||
Reference in New Issue
Block a user