# Test Plan — analyze.py classifier suite (compliance-required) _Generated: 2026-05-24. Mode: Author. Caller: Phase 1 Agent B._ ## Purpose Freeze classifier behavior in `analyze.py` so downstream `build_members.py` cannot silently regress KPI semantics. Compliance-required per PLAN.md §"analyze.py test suite". ## Scope **In:** `_norm_vote`, `_majority_position`, `classify_vote`, `aggregate` from analyze.py; end-to-end parse→classify→aggregate via parse.py. **Out:** parse.py exhaustive tests, render code, fetch code. ## Framework - **Chosen:** pytest 9.0.3 (installed via `python3 -m pip install --user --break-system-packages pytest`) - **Source of pinning:** project has no manifest; pytest is the standard Python runner ## Sandbox / Layout - **Path:** `./tests/` (in-tree, per the user-specified PLAN.md layout) - **Sandbox exception:** PLAN.md §"Target File Layout" mandates in-tree `tests/`. ## Mock Boundaries - **Mocked:** none. Fixtures are real XML on disk. - **Not mocked:** analyze.py, parse.py. ## Test Files | # | File | Covers | Test count (est.) | |---|---|---|---| | 1 | tests/test_analyze.py | normalization, classification, aggregation | ~12 | Fixtures: 4 required + 1 optional (split-party tied). ## CI visibility This suite lives under `./tests/` (in-tree, NOT gitignored — per PLAN.md). It runs when explicitly invoked via `python3 -m pytest tests/`. ## Approval token APPROVED-TEST-PLAN was provided by Phase 1 Agent B caller.