Skip to content

refactor: decompose internal god objects into focused, single-responsibility modules#56

Merged
deepjoy merged 3 commits into
mainfrom
decompose-spawn
Mar 19, 2026
Merged

refactor: decompose internal god objects into focused, single-responsibility modules#56
deepjoy merged 3 commits into
mainfrom
decompose-spawn

Conversation

@deepjoy
Copy link
Copy Markdown
Owner

@deepjoy deepjoy commented Mar 19, 2026

  • Decompose spawn_task god function — break the 380-line function into
    focused submodules (spawn/context.rs, spawn/completion.rs,
    spawn/failure.rs, spawn/parent.rs) with an ~85-line orchestrator; DRY up
    ActiveTaskMap bulk operations with a shared drain_where helper
  • Decompose TaskStore into focused services — move dependency-graph
    operations to store/dependencies.rs, consolidate pop/complete/fail
    into lifecycle/transitions.rs so the state machine is visible in one place
  • Decompose SubmitBuilder::resolve precedence chain — split into
    apply_prefix, apply_defaults, apply_module_scalar_defaults, and
    apply_overrides; unify the duplicated typed/untyped module-defaults logic
    No external API surface change.

deepjoy added 3 commits March 18, 2026 21:48
Break the 380-line spawn_task god function into testable units:

- spawn/context.rs: SpawnContext + TaskContext construction
- spawn/completion.rs: success path (children, recurring, dependencies)
- spawn/failure.rs: failure path (retry, dead-letter, fail-fast cascade)
- spawn/parent.rs: parent-child resolution
- spawn.rs: slim ~85-line orchestrator

Also DRY up ActiveTaskMap bulk operations (preempt_below, pause_module,
pause_all) with a shared drain_where helper and cancel_pause_emit.
Move dependency graph operations (resolve_dependents, fail_dependents)
out of lifecycle/ into store/dependencies.rs since they operate on the
dep graph, not task lifecycle states. Consolidate pop, complete, and
fail into lifecycle/transitions.rs to make the state machine visible
in one place. Add clear section headers to cancel_expire.rs.
…thods

Split the monolithic resolve() into four named methods that each own one
layer of the 5-layer precedence chain:

- apply_prefix: module name prefixing
- apply_defaults: layers 2–4 (TypedTask / submission / module defaults)
- apply_module_scalar_defaults: shared priority/group/TTL logic for both
  typed and untyped paths (eliminates duplicated conditional blocks)
- apply_overrides: layer 1 per-call builder overrides

No external API or behavioral change — all existing tests pass unchanged.
@deepjoy deepjoy enabled auto-merge (squash) March 19, 2026 05:06
@deepjoy deepjoy merged commit e97d72d into main Mar 19, 2026
1 of 2 checks passed
@github-actions github-actions Bot mentioned this pull request Mar 19, 2026
deepjoy pushed a commit that referenced this pull request Mar 19, 2026
## 🤖 New release

* `taskmill`: 0.5.0 -> 0.5.1 (✓ API compatible changes)

<details><summary><i><b>Changelog</b></i></summary><p>

<blockquote>

## [0.5.1](v0.5.0...v0.5.1)
- 2026-03-19

### Fixed

- *(bench)* eliminate per-sample scheduler setup cost in history
benchmarks ([#55](#55))
- *(bench)* remove premature cancellation token call in history
benchmark setup ([#54](#54))
- *(ci)* bootstrap _benchmarks branch on first push to main
([#53](#53))
- *(ci)* restore stderr capture for benchmark output on main
([#51](#51))
- *(ci)* exclude lib target from cargo bench to fix benchmark CI
([#49](#49))

### Other

- decompose internal god objects into focused, single-responsibility
modules ([#56](#56))
- eliminate stringly-typed history status and DRY violations
([#52](#52))
</blockquote>


</p></details>

---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant