G
GSD·Lean

Architecture Health

Deep/shallow lens + deletion test. Append-per-run — newest run first.

Run — 2026-07-13T10:59:28Z

2026-07-13T10:59:28Z
2Candidates
0Strong
2Worth Exploring
src/gsd_lean/state/__init__.py
Cluster
gsd_lean.state
Why shallow
73 lines of pure re-export — zero implementation, an __all__ of 30+ names forwarded verbatim from state.config, state.detector, state.planning; interface surface (the name list a reader must scan) exceeds implementation depth (none).
Deletion test
The only runtime consumer is cli/app.py (its single from gsd_lean.state import (...) block). Internal modules bypass the facade already — state/config.py and workflow/engine.py import from gsd_lean.state.planning directly, and the test suite imports submodules directly. Deleting the facade forces app.py to point its import block at .planning / .config instead: a mechanical edit, no logic reconcentrates. Complexity vanishes for the sole caller; all other code is unaffected because it never used the facade.
Verdict
candidate for deletion
Dep class
in-process
Confidence
Worth-exploring
Rationale
Contested classification — a package __init__ re-export is a legitimate public-API idiom, but here it is used by exactly one caller and bypassed by internal modules and tests, so its value as an API boundary is unproven rather than clearly zero.
src/gsd_lean/workflow/__init__.py
Cluster
gsd_lean.workflow
Why shallow
19-line pure re-export of 7 names from workflow.engine; no logic, interface = implementation ≈ 0.
Deletion test
Only consumer is cli/app.py (from gsd_lean.workflow import PreconditionError and ... import transition as workflow_transition). tests/test_workflow.py already imports gsd_lean.workflow.engine directly, bypassing the facade. Deleting it forces app.py to import from gsd_lean.workflow.engine: trivial rename, no complexity migrates. Pass-through.
Verdict
candidate for deletion
Dep class
in-process
Confidence
Worth-exploring
Rationale
Same idiom-vs-shallowness ambiguity — single caller, tests bypass it; deleting is a judgment call about intended public surface, not an unambiguous win.

Note: the two flagged facades are the same pattern (single-caller re-export bypassed internally). If acted on, treat them as one cleanup decision about whether the package public API is worth an explicit facade at all — not two independent refactors.