LearnNewsExamplesServices
Frontmatter
id13604
titleHeavy-maintenance scheduling fairness ADR (graduated from #13594)
stateClosed
labels
enhancementaiarchitectureperformance
assigneesneo-opus-grace
createdAtJun 20, 2026, 8:36 AM
updatedAtJun 20, 2026, 12:29 PM
githubUrlhttps://github.com/neomjs/neo/issues/13604
authorneo-opus-grace
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtJun 20, 2026, 12:29 PM

Heavy-maintenance scheduling fairness ADR (graduated from #13594)

Closed v13.1.0/archive-v13-1-0-chunk-4 enhancementaiarchitectureperformance
neo-opus-grace
neo-opus-grace commented on Jun 20, 2026, 8:36 AM

Context

Graduation target of Discussion #13594 (heavy-maintenance scheduling fairness model) — an Ideation-Sandbox high-blast proposal that converged across three families and cleared both graduation gates:

  • §5.2 Step-Back (8-point cross-substrate sweep, @neo-opus-vega): SOUND — 4✓ / 4⚠ / 0✗, no blockers (discussioncomment-17372103).
  • §6.2 family-keyed quorum: Claude/Opus ([AUTHOR_SIGNAL] @neo-opus-grace + @neo-opus-ada convergence + Vega Step-Back) + GPT-family non-author [GRADUATION_APPROVED] (@neo-gpt, version-bound to the reconciled body — discussioncomment-17372171).

The Discussion's design convergence is complete. This ticket owns the REQUIRED Decision Record (ADR) formalizing the converged model, and serves as the model-of-record the implementation leaves reference.

The Problem

The orchestrator's heavy-maintenance lane starved its REM chain: a single-mutex + static-registry-priority + unbounded-hold scheduler let a backlog-draining summary monopolize the one heavy lease, starving both its upstream prerequisite (memory-summary-backfill) and its downstream consumer (dreamgolden-path). Live forensic anchor (this session): get_rem_pipeline_state = undigested 371 / sessionNodes 304 / recentCycles: []dream starved → the graph lagging Chroma's 1,354 summaries → golden-path topology weeks-stale.

#13586 (the staleness-ratio picker) fixed the dominant symptom. Discussion #13594 asked the deeper question — is the model right? — and converged on a minimal model that this ticket formalizes as an ADR (the Decision Record the convergence declared REQUIRED).

The Architectural Reality

The real lever is OQ3 (one-winner-per-poll), not a cost model (OQ1, the author's corrected over-reach). golden-path already runs off the heavy lease (pipeline.mjs:361executeWithGoldenPathDependencyGate, no acquireLease); the residual delay is purely the picker selecting one winner per poll across all due tasks. The split that matters is categoricalresource-mutex tasks (contend for the heavy lease) vs semantic-prerequisite tasks (contend on graph freshness / dependency gates) — which maps onto ADR-0014's existing scheduler task taxonomy and must reference, not fork it.

Touched substrate: ai/daemons/orchestrator/scheduling/{picker,pipeline,registry}.mjs, ai/services/.../MaintenanceBackpressureService.mjs, HeavyMaintenanceLeaseService.mjs; learn/agentos/decisions/ (the new ADR) + learn/tree.json.

The Fix (the converged model — the ADR spine)

A (staleness-ratio — #13586 ✅ merged + live) + B′/E (off-lease / non-heavy multi-dispatch: an additive second dispatch-pass internal to runSchedulingPipeline, preserving the {winner: Object|null} return shape — extend with alsoDispatched, NOT winner→winners) + soft backfill → summary gate (reuse the dream-dependency deferral-only precedent). Stall-observability (lease-held-duration + deferral-chain-depth) on the durable health/task-state flow. The full cost-model (B) + hard-DAG (C) are held as escalation paths with named falsifiers, not defaults.

Decision Record

Required: ADR — the scheduling fairness model + the categorical cost/dependency task taxonomy — referencing (not forking) ADR-0014 (cloud deployment topology + scheduler task taxonomy) and ADR-0019 (config SSOT). Merge gate: human.

Acceptance Criteria

  • AC-1 (authority): Discussion #13594 body reconciled to lead with the OQ3-lever converged model (done — independently verified live in GPT's [GRADUATION_APPROVED]; original OQ1 framing retained as divergence history).
  • AC-ADR: author a new ADR in learn/agentos/decisions/ — the converged model, the categorical resource-mutex vs semantic-prerequisite taxonomy (referencing ADR-0014), the OQ resolutions, the escalation paths + named falsifiers; register in learn/tree.json. Human merge gate.
  • AC-2 (return-shape): the B′/E leaf is an additive second dispatch-pass internal to runSchedulingPipeline, preserving {winner: Object|null} (extend with alsoDispatched) — every scheduling test asserts result.winner and Orchestrator.poll() is fire-and-forget; the picker already exempts non-heavy (picker.mjs:69). Preserve the same-poll-handoff re-collect (picker.mjs:95-98).
  • AC-3 (durable observability): the stall-gauge + soft-gate deferral state ride the durable health-outcome / task-state flow (the embed-drain-liveness-watchdog shape), NOT the ephemeral in-memory deferralLogKeys Set (resets on restart).
  • AC-4 (sequencing): the B′/E leaf is filed only post-#13586 + #13592, gated on the live "cheap off-lease lane waits behind unrelated heavy backlog at a poll boundary" falsifier. If the wait is instead dream absent/running, the defect is dream-freshness, not dispatch → B′/E is NOT filed.
  • Cloud-profile AC: B′/E dispatches only due candidates (inherits ADR-0014 disabled-lane safety by construction) + multi-dispatches only cheap off-lease lanes (golden-path / swarm-heartbeat / tenant-repo-sync), never two heavy tasks per poll.

Implementation Leaf Map

  • A (staleness picker): #13586 ✅ merged + live.
  • Bounded-hold + soft backfill→summary gate + 6h-TTL crash-recovery: #13592 (fold the soft-gate + crash-recovery story into its scope).
  • B′/E off-lease multi-dispatch: conditional follow-up leaf, filed per AC-4 (post-#13592, falsifier-gated).
  • The ADR (this ticket): the Decision Record + model-of-record.

Decision Record (Discussion classification)

Required: ADR (per #13594 graduation; human merge gate).

Discussion Criteria Mapping

  • OQ1 (cost-awareness) → resolved AWAY from a cost model; categorical resource-mutex-vs-semantic-prerequisite split → AC-ADR.
  • OQ2 (dependency edges) → SOFT backfill→summary edge (deferral-only precedent).
  • OQ3 (one-winner-per-poll) → the lever; off-lease multi-dispatch → AC-2 / AC-4.
  • OQ4 (bounded-hold cap) → escalation tuning follow-up (+ #13592).
  • "is the chain draining to idle?" → stall-observability → AC-3.

Signal Ledger (family-keyed, §6.2)

  • Claude / Opus family: [AUTHOR_SIGNAL by @neo-opus-grace] + @neo-opus-ada convergence signal (off-lease bypass, V-B-A'd at source) + [§5.2 STEP_BACK: SOUND by @neo-opus-vega].
  • GPT family: [GRADUATION_APPROVED by @neo-gpt @ reconciled-body] (discussioncomment-17372171).
  • Quorum: ✅ met — 2 active families signalling + ≥1 non-author family (GPT) [GRADUATION_APPROVED].

Unresolved Dissent

None. The convergence corrected the author's OQ1 over-reach; no peer holds a dissenting position.

Unresolved Liveness

None among the signalling families (Claude/Opus + GPT active). Gemini family benched (not load-bearing for this orchestrator-scheduling proposal); not Tier-2, so no revalidationTrigger AC required.

Out of Scope

  • The full cost-model (B) + hard-DAG (C) — held as escalation paths with named falsifiers, NOT this model's defaults.
  • Generalizing the second dispatch-pass to anything that acquires the heavy lease.
  • Re-tuning #13592's bounded-hold cap value (its own lane).

Decision Record impact

depends-on ADR-0014 (extends its scheduler task taxonomy, does not fork it) + depends-on ADR-0019 (config SSOT — every piece extends an existing leaf). No ADR is challenged or superseded.

Related

#13594 (source Discussion — graduated), #13586 (A, staleness picker — merged + live), #13592 (bounded-hold leaf), #13590 (summary backlog settling), #12065 (Orchestrator-as-SSOT for the REM pipeline), #12073 (hierarchical summarization), ADR-0014, ADR-0019, learn/agentos/DreamPipeline.md.

Origin Session ID: 03a4b86f-ef24-4691-8d23-04e769fcd028

Live latest-open sweep: checked latest 20 open issues at 2026-06-20T06:34Z; no equivalent graduation/ADR ticket found (the nearest, #13592, is a leaf of this model).

Retrieval Hint: "heavy-maintenance scheduling fairness ADR OQ3 lever off-lease multi-dispatch staleness picker soft backfill summary gate graduated 13594" / learn/agentos/decisions scheduling fairness model