Skip to content

Implement the session conductor: merge openchamber-dispatcher + openchamber-babysitter into openchamber-conductor #2153

Closed

Description

@dezren39

Implementation follow-on from the #2132 triage (queue task 3163, 2026-10-29). Parent design: #2132; babysitter design origin: #2021; fleet epic: #2055.

Build the merged session conductor designed on #2132:

  1. New job openchamber-conductor (20m cadence, owner goal:keep-the-four-repos-healthy) with one instruction file merged from the current dispatcher and babysitter instructions, preserving both rule sets verbatim where they do not conflict. One run = one capacity inventory + one quota snapshot (measurement gate: no dispatch or reroute without a quota picture ≤60 min old covering all pools), then:
    • SWEEP phase first: one pass over all live sessions — answer questions, nudge/kick stalls within the babysitter's existing limits, apply the escalation ladder: (a) reroute pool (Workhorse → Specialist; Summit only for synthesis-class work), (b) move off an exhausted pool, (c) stop the session and hand its task back to the queue parked with a reason — never leave a stopped session silent.
    • DISPATCH phase second: launch from the queue head into capacity the sweep confirmed or freed; Workhorse default; verified launch with session↔task binding; fire-and-forget (no babysitting inside dispatch).
  2. Cutover: enable the conductor, disable openchamber-dispatcher and openchamber-babysitter (disable, do not delete — rollback is re-enabling the pair). Update the fleet-watchdog roster to the merged job id in the same pass.
  3. Measurement: for 48h after cutover, the daily token check-in reports the conductor's input per cycle against the pair's check-in Bump build/buck/preludes/buck2-prelude from 3a02ea3 to 370cd4d #5 baseline (149M + 124M per ~15h window); success = ≤60% of the pair at equal sessions served. Report the first comparison on Design: session conductor — merge OpenChamber dispatcher + babysitter into one job (implements #2021 as the merged job) #2132.

Acceptance:

Activity

  1. developing-today commented on Oct 29, 2026

    @developing-today
    Contributor
  2. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    Triage verdict — cutover plan CONFIRMED against live definitions, implementation packet enqueued

    Queue task 3173 (triage, repo-worker-code, OpenChamber scheduled lane), 2026-10-30T04:4xZ. Read-only: no job was created, enabled, disabled or edited by this triage.

    Live state re-verified (source of truth, not the packet)

    Job Definition file enabled cadence timeout instruction
    openchamber-dispatcher ~/hatch-personal/workspace/goals/keep-the-four-repos-healthy/crons/minutely/openchamber-dispatcher__interval@15m.md true 15m 2700s hidden_files/openchamber-dispatcher-instruction.md
    openchamber-babysitter .../crons/minutely/openchamber-babysitter__interval@20m.md true 20m 1800s hidden_files/openchamber-babysitter-instruction.md

    Both carry owner: goal:keep-the-four-repos-healthy and deliver to the same chat a15e5512-51ce-49c1-ad0f-46beaea69b04, each running its own PRELUDE and its own full inventory. The duplicated fixed cost the merge removes is confirmed in the definitions themselves. openchamber-conductor is free: no cron file, no branch in hatch-personal, no open PR mentions it. #2132's triage verdict (task 3163) and this re-check agree; no premise correction needed.

    Cutover plan — confirmed, with the exact touch points

    1. Create openchamber-conductor__interval@20m.md in the same crons/minutely/ directory, enabled: true, owner: goal:keep-the-four-repos-healthy, every: 20m, timeout_secs: 2700 (the dispatcher's, per Design: session conductor — merge OpenChamber dispatcher + babysitter into one job (implements #2021 as the merged job) #2132 decision 1), delivery chat a15e5512-… unchanged, PRELUDE block copied verbatim.
    2. Merged instruction hidden_files/openchamber-conductor-instruction.md: dispatcher + babysitter rule sets preserved verbatim where they do not conflict; one capacity inventory + one quota snapshot per cycle shared by both phases; SWEEP first then DISPATCH; escalation ladder (nudge/kick within existing limits → reroute pool Workhorse→Specialist, Summit for synthesis only → move off an exhausted pool → stop and hand the task back parked with a reason); measurement gate binding on dispatch and reroute.
    3. Disable, never delete, the pair: flip enabled: false in both files above (definitions are versioned in hatch-personal, so this is a one-line-per-file, fully reversible change).
    4. Watchdog roster — three places, not one (the packet's "update the roster" understates this):
      • crons/minutely/fleet-watchdog__interval@15m.md METHOD Query A job_id IN (…) list;
      • the same cron file's Query B job_id IN (…) list;
      • hidden_files/fleet-watchdog-instruction.md §Fleet roster (line 18), the §Stuck-run threshold table (line 38, currently "dispatcher 60m, babysitter 45m" → one conductor threshold), and the §Watcher gaps rule (line 46, "openchamber-babysitter or repo-fleet-monitor" → openchamber-conductor). Missing the instruction-file edits leaves the watchdog alerting on two jobs that no longer run.
    5. Rollback = re-enable the two disabled files and disable the conductor. Reversible in one commit; no deletion, no data loss. Confirmed viable.

    Two gaps the implementation must close (not blockers, but silent-failure traps)

    • Measurement source. The 273M baseline (149M + 124M per ~15h window, check-in Bump build/buck/preludes/buck2-prelude from 3a02ea3 to 370cd4d #5) comes from the daily token check-in, not from dispatcher-log.md / babysitter-log.md, which record dispatches and rounds but no token input. The 48h comparison must read the same check-in source for the conductor, and the conductor's log must additionally record sessions swept + dispatched per window, otherwise "at equal sessions served" is unmeasurable. Ask for this in the implementation acceptance, do not leave it to prose.
    • Overlap semantics. timeout_secs: 2700 on a 20m cadence means runs can overlap pending occurrences; the scheduler coalesces them as cancelled, which the watchdog correctly does not count as failure. Same behaviour the pair has today (2700s on 15m), so it is a documentation note for the conductor instruction, not a design change.

    Routing

    Implementation packet enqueued on repo-health-code-pilot for this issue, kind small_fix, flagged live-fleet-change, carrying the four acceptance criteria above plus the watchdog three-place roster edit and the measurement-source requirement. Dedupe key repo-health:v1:fix:developing-today/code:issue:2153. #2021's open escalation question is answered by the ladder (step 2); the cutover report must link #2021 and #2055.

  3. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up

  4. added
    work/assignedQueue worker lifecycle state
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    status/parkedDeliberately paused with a recorded resume condition
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Oct 30, 2026
  5. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · parked

  6. added
    queue/claimedQueue worker lifecycle state
    and removed
    status/parkedDeliberately paused with a recorded resume condition
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    on Oct 30, 2026
  7. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up

  8. 26 remaining items

  9. added
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    status/parkedDeliberately paused with a recorded resume condition
    and removed
    queue/claimedQueue worker lifecycle state
    on Nov 3, 2026
  10. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · parked — one acceptance item remains

  11. added
    queue/claimedQueue worker lifecycle state
    and removed
    status/parkedDeliberately paused with a recorded resume condition
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    on Nov 4, 2026
  12. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    event: picked_up
    task: 8468
    lane: code-i
    execution_lane: direct
    summary: Task 8468 (triage, acceptance remainder of #2153) claimed by lane code-i on the direct lane. Acceptance item 2 (#2021 link) already done per prior progress; resuming item 1: compute the conductor 48h cost comparison and post it on #2132.
    next: assemble figures from the token check-in source and conductor-log.md, post on #2132, complete task 8468

  13. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    event: done
    task: 8468
    lane: code-i
    execution_lane: direct
    summary: Both #2153 acceptance items are now met. Item 2 (#2021 linked from the cutover report) was done earlier (6614026909 / 6614030429). Item 1 (48h cost comparison) is posted on #2132 (comment 6640808470): conductor first 48h (2026-10-30T22:13Z -> 2026-11-01T22:13Z) = 398.35M input over 139 runs (2.87M/run, 8.30M/h, 14 sessions dispatched) vs the check-in #5 dispatcher+babysitter baseline of 273.6M per ~14.7h (18.68M/h) = 44% per hour / 46% per 20-min slot — PASS against the <=60% target. Attribution method cross-validated against check-in #8's published conductor figure (96.39M measured vs 96M published). Closing #2153: implementation live since 2026-10-30 and every acceptance item now has posted evidence.
    next: none — task 8468 completing as triaged

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

source/creatorFiled by the new-issue-creator jobstatus:donetask/triageQueue packet kind: verify, reproduce, and route this item

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions