Skip to content

refactor(lifecycle): drive tasks through a phases handle - #1373

Draft
jbedard wants to merge 1 commit into
sc/1-bazel-flagsfrom
sc/3-phases
Draft

refactor(lifecycle): drive tasks through a phases handle#1373
jbedard wants to merge 1 commit into
sc/1-bazel-flagsfrom
sc/3-phases

Conversation

@jbedard

@jbedard jbedard commented Aug 5, 2026

Copy link
Copy Markdown
Member

TaskLifecycleTrait becomes Phases, and a task opens its _impl with ph = phases.new(ctx, data) instead of threading (ctx, lifecycle, data) through every call:

setup_phase(ctx, lifecycle, subject, kind, data, hc, bz, cmd)
    -> ph.setup(subject, kind, command = cmd)
task_update(ctx, lifecycle, status, progress, ...)
    -> ph.update(status, progress, ...)
dispatch_task_update(ctx, lifecycle, update)   -> ph.dispatch(update)
apply_repro_fix_hooks(ctx, lifecycle, data, ...)
    -> ph.suggest_fixes(kind, status, ...)

The records move behind the same namespace (phases.Update / .ProgressStyles / .Phase / .ReproFixCommand), so lifecycle.axl is a single import at the use site, and a task splats phases.TRAITS into its trait list. ph.reset(fresh) refills the held dict in place, which is what the Bazel retry loop needs between attempts.

traits.axl re-exports Phases for user config.axl files.

Changes are visible to end-users: no

Test plan

  • Covered by existing test cases

`TaskLifecycleTrait` becomes `Phases`, and a task opens its `_impl` with
`ph = phases.new(ctx, data)` instead of threading `(ctx, lifecycle, data)`
through every call:

    setup_phase(ctx, lifecycle, subject, kind, data, hc, bz, cmd)
        -> ph.setup(subject, kind, command = cmd)
    task_update(ctx, lifecycle, status, progress, ...)
        -> ph.update(status, progress, ...)
    dispatch_task_update(ctx, lifecycle, update)   -> ph.dispatch(update)
    apply_repro_fix_hooks(ctx, lifecycle, data, ...)
        -> ph.suggest_fixes(kind, status, ...)

The records move behind the same namespace (`phases.Update` /
`.ProgressStyles` / `.Phase` / `.ReproFixCommand`), so `lifecycle.axl` is a
single import at the use site, and a task splats `phases.TRAITS` into its
trait list. `ph.reset(fresh)` refills the held dict in place, which is what
the Bazel retry loop needs between attempts.

`traits.axl` re-exports `Phases` for user config.axl files.
@jbedard
jbedard requested a review from thesayyn August 5, 2026 19:48
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