Per post_module_taxonomy_de_cruft_20260627 Phase 0 prerequisite.
Master is at 6344b49f (pre-merge of v2 SHIPPED). This merge brings in
the 18 v2 SHIPPED commits that define the destination modules
(src.mma, src/project.py, src/project_files.py, src.tool_presets,
src.tool_bias, src.external_editor, src.personas,
src.workspace_manager, src.mcp_client) needed by the Phase 2
consumer migration in commit 8f11340b.
Conflicts resolved (all were import-block re-orderings between my
migration's update and v2 SHIPPED's update of the same files):
- src/external_editor.py: took v2 SHIPPED version (class definitions
+ the no-alias import pattern)
- src/personas.py: took v2 SHIPPED version
- src/tool_bias.py: took v2 SHIPPED version
- src/tool_presets.py: took v2 SHIPPED version
- src/workspace_manager.py: took v2 SHIPPED version
- src/ai_client.py: took v2 SHIPPED version (removes the 'as _FIC'
alias; uses 'from src.project_files import
FileItem' directly per the v2 SHIPPED style)
- conductor/tracks/module_taxonomy_refactor_20260627/spec.md: took
HEAD version (my Phase 1 VC2 + VC10
corrections; the v2 SHIPPED version was
the pre-correction spec)
Per FOLLOWUP_module_taxonomy_v2_review:
VC2 correction:
The original spec said '5 ImGui LEAK files deleted' including
patch_modal.py. patch_modal.py is NOT a LEAK — it's the data module
(DiffHunk, DiffFile, PendingPatch dataclasses) per the data/view/ops
split rule. The diff_viewer classes (DiffHunk, DiffFile) were moved
INTO patch_modal.py during the cruft_elimination_20260627 track's
diff_viewer split. Deleting patch_modal.py would violate the data
module's integrity (and break tests that depend on PendingPatch).
VC2 is now: 4 LEAK files deleted (bg_shader, shaders, command_palette,
diff_viewer). patch_modal.py is correctly retained as the data layer
per the data/view/ops split.
VC10 correction:
The original spec said 'src/models.py reduced to <=30 lines'. The
30-line target was aspirational; the actual achieved count is ~135
lines (Pydantic proxies + DEFAULT_TOOL_CATEGORIES + lazy __getattr__
for backward compat with 30+ legacy imports). The lazy __getattr__
is necessary until consumers migrate to direct subsystem imports
(FR7 of the post_module_taxonomy_de_cruft_20260627 follow-up).
VC10 is now: src/models.py reduced from 1044 to ~135 lines (the 30-line
target was aspirational; full backward-compat shim removal is FR7
of the post_module_taxonomy_de_cruft_20260627 track). The legacy
Metadata = TrackMetadata alias is preserved for tests that import it.
TIER-2 READ AGENTS.md, conductor/workflow.md, conductor/edit_workflow.md,
conductor/tier2/githooks/forbidden-files.txt,
conductor/tracks/tier2_leak_prevention_20260620/spec.md,
conductor/code_styleguides/data_oriented_design.md,
conductor/code_styleguides/error_handling.md,
conductor/code_styleguides/type_aliases.md,
conductor/product-guidelines.md, conductor/code_styleguides/python.md,
docs/guide_meta_boundary.md before module_taxonomy_refactor_20260627/Phase3b.
The v2 spec/plan (c35cc494) is the canonical guide. Phases 0, 1, 2 are
done in the branch. Phase 3a (mma.py, cd828e52) and Phase 3g (persona
to personas.py, d7872bea) are already committed; back-compat re-exports
exist in src/models.py. The remaining work: 3b (project.py), 3c
(project_files.py), 3d-3f + 3h-3i (6 merges), 4 (delete
AGENT_TOOL_NAMES), 5 (reduce models.py), 6 (verify + report).
The cruft_elimination track is no longer a blocker: the ProjectContext
+ 5 sub dataclasses are at models.py:797-873 (the cruft track merged
them in earlier). The v2 plan can extract them.
failcount state: 0/0 (prior reset via c35cc494).
TIER-1 READ AGENTS.md + conductor/workflow.md + conductor/edit_workflow.md
+ conductor/code_styleguides/data_oriented_design.md + conductor/code_styleguides/error_handling.md
+ conductor/code_styleguides/type_aliases.md + conductor/code_styleguides/code_path_audit.md
+ conductor/tracks/module_taxonomy_refactor_20260627/spec.md + conductor/tracks/module_taxonomy_refactor_20260627/plan.md
+ docs/reports/FOLLOWUP_module_taxonomy_refactor_20260627_recoverable.md before this commit.
v2 fixes v1 gaps that gave Tier 2 discretion:
1. THE 4-CRITERIA DECISION RULE (the taxonomy law):
- C1: Cross-system usage (consumed by >= 3 unrelated systems)
- C2: State machine / lifecycle
- C3: Test file already exists
- C4: Substantial size (> 30 lines OR > 5 fields)
- Rule: C1 OR C2 OR C3 -> DEDICATED FILE; ONLY C4 -> MERGE INTO DESTINATION; NONE -> KEEP
2. THE DATA/VIEW/OPS SPLIT (the GUI boundary):
- Data classes go in data files (src/<system>.py)
- View code (ImGui rendering) goes in src/gui_2.py
- Ops (operations on data) go with the data
- Exception: imgui_scopes.py is the EXCEPTION (Python with context managers)
3. ZERO TIER 2 DISCRETION:
- Every move is pre-decided in the spec
- Tier 2 executes, doesn't decide
- v1 had 22 commits because of exploration; v2 has 16 because the work is prescriptive
4. PRESERVED Pydantic PROXIES:
- _create_generate_request, _create_confirm_request, __getattr__ stay in models.py
- They're API-specific; moving them is out of scope for v2
Applied to all 11 classes in models.py:
- DEDICATED: Ticket, Track, WorkerContext, TrackState, TrackMetadata, ThinkingSegment -> src/mma.py (6 classes; C1+C2+C3+C4)
- DEDICATED: FileItem, Preset, ContextPreset, ContextFileEntry, NamedViewPreset -> src/project_files.py (5 classes; C1+C3+C4)
- DEDICATED: ProjectContext + 5 sub + config IO -> src/project.py (1+5+functions; C1+C3+C4)
- MERGE: Tool, ToolPreset -> src/tool_presets.py (C1 NO)
- MERGE: BiasProfile -> src/tool_bias.py (C1 NO)
- MERGE: TextEditorConfig, ExternalEditorConfig -> src/external_editor.py (C1 NO)
- MERGE: Persona -> src/personas.py (C1 NO)
- MERGE: WorkspaceProfile -> src/workspace_manager.py (C1 NO)
- MERGE: MCPServerConfig, MCPConfiguration, VectorStoreConfig, RAGConfig, load_mcp_config -> src/mcp_client.py (C1 YES, coupled to MCP)
- DELETE: AGENT_TOOL_NAMES (redundant with mcp_tool_specs.tool_names())
Net: 65 -> 61 files (possibly 60 if models.py eliminated)
16 atomic commits (down from v1's 22)
14 VCs (added VC13 + VC14: verify the 4-criteria rule and data/view/ops split are documented)
The git stash ban is in place at 3 layers (commit 6240b07b). The timeline-
is-immutable principle is explicit in the agent prompt. The next Tier 2
should not be able to corrupt files the same way.