Skip to content

Cascade an operator snooze from a governor to its governed tasks - #431

Merged
tildesrc merged 1 commit into
mainfrom
panopticon/cascade-snooze-to-children
Sep 23, 2026
Merged

tildesrc merged 1 commit into
mainfrom
panopticon/cascade-snooze-to-children

Conversation

@tildesrc

Copy link
Copy Markdown
Contributor

Snoozing a task muted that one row only, so a snoozed governor's ensemble kept demanding attention — bright rows, still counted in active agents N/M — even though the operator had said "not today" to the work they belong to.

TaskService.set_snooze now writes the same snoozed_until onto every non-terminal task governed (transitively) by the snoozed one, mirroring the existing cascade-drop:

  • Terminal descendants are skipped (a finished task demands no attention to mute), but the walk descends through them, so a completed child doesn't shield a live grandchild from its governor's snooze.
  • Clearing cascades the same way — un-snoozing a governor un-snoozes its ensemble. A child's own longer snooze is overwritten by its governor's.
  • Nothing cascades upward: e on a governed task mutes that task alone (this fork has no attention/piercing field).
  • An unchanged value is skipped, so a repeated snooze causes no updated_at/change-feed churn, and a seen set keeps a governance cycle (set_governor doesn't reject one) from looping.
  • Tasks created under an already-snoozed governor don't inherit it; snoozing the governor again re-cascades.
  • The service still stores the string verbatim and never reads a clock — whether a deadline is active stays a dashboard display decision.

The dashboard needs no change: each child now carries the fact on its own record, so the existing _snooze_label / dimming / counter / refresh-timer paths mute it.

Plan: the task's plan.md artifact.

Snoozing a task muted that one row only, so a snoozed governor's ensemble kept
demanding attention — bright rows, still counted in `active agents N/M` — even
though the operator had said "not today" to the work they belong to.

`TaskService.set_snooze` now writes the same `snoozed_until` onto every
non-terminal task governed (transitively) by the snoozed one, mirroring the
existing cascade-drop. Terminal descendants are skipped (nothing to mute) but
the walk descends through them, so a finished child doesn't shield a live
grandchild; an unchanged value is skipped so a repeated snooze causes no
`updated_at` churn; and a `seen` set keeps a governance cycle from looping.
Clearing cascades the same way. Nothing cascades upward — a governed task's own
snooze is its own — and the service still never reads a clock.

The dashboard needs no change: each child now carries the fact itself, so the
existing label/dimming/counter paths mute it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@tildesrc
tildesrc marked this pull request as ready for review September 23, 2026 23:03
@tildesrc
tildesrc merged commit ce2834b into main Sep 23, 2026
3 checks passed
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