Private
Public Access
0
0

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:
2026-06-22 01:10:57 -04:00
parent a8b85bc7ce
commit ef207cf684
2 changed files with 301 additions and 3 deletions
+88 -2
View File
@@ -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 = ""