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 (dream → golden-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:361 → executeWithGoldenPathDependencyGate, no acquireLease); the residual delay is purely the picker selecting one winner per poll across all due tasks. The split that matters is categorical — resource-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
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
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:
[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
summarymonopolize the one heavy lease, starving both its upstream prerequisite (memory-summary-backfill) and its downstream consumer (dream→golden-path). Live forensic anchor (this session):get_rem_pipeline_state= undigested 371 / sessionNodes 304 /recentCycles: []→dreamstarved → 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-pathalready runs off the heavy lease (pipeline.mjs:361→executeWithGoldenPathDependencyGate, noacquireLease); the residual delay is purely the picker selecting one winner per poll across all due tasks. The split that matters is categorical — resource-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)
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
[GRADUATION_APPROVED]; original OQ1 framing retained as divergence history).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 inlearn/tree.json. Human merge gate.runSchedulingPipeline, preserving{winner: Object|null}(extend withalsoDispatched) — every scheduling test assertsresult.winnerandOrchestrator.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).embed-drain-liveness-watchdogshape), NOT the ephemeral in-memorydeferralLogKeysSet (resets on restart).dreamabsent/running, the defect is dream-freshness, not dispatch → B′/E is NOT filed.golden-path/swarm-heartbeat/tenant-repo-sync), never two heavy tasks per poll.Implementation Leaf Map
#13586✅ merged + live.backfill→summarygate + 6h-TTL crash-recovery:#13592(fold the soft-gate + crash-recovery story into its scope).Decision Record (Discussion classification)
Required: ADR(per #13594 graduation; human merge gate).Discussion Criteria Mapping
backfill→summaryedge (deferral-only precedent).#13592).Signal Ledger (family-keyed, §6.2)
[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].[GRADUATION_APPROVED by @neo-gpt @ reconciled-body](discussioncomment-17372171).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
revalidationTriggerAC required.Out of Scope
#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/decisionsscheduling fairness model