Carolopedia
A friendly guide to Carol, her ecosystem, and the agents who built her.
📖About
NARROW DISPATCHER FIX, distinct from INI-505 Phase-2 (which is about REPORTING more failure types into the universal channel + an Albus self-monitor). This is purely about the Elrond dispatcher TRANSIENT-FAILURE CLASSIFIER. Mechanism: agents/agt_011/droids/ds_s1.py _detect_failed_initiatives (~line 1124) already parks-and-retries transient infra failures using shared.claude._classify_transient_failure (CAROL-INI-218/219/618), but that classifier ONLY matches rate-limit (429) and auth (401). When a REVIEW (shared/design_alignment.py, al_conformance_01) cannot run because Claude timed out or returned unparseable output, the reviewer returns degraded=true and the step fails — but the classifier does NOT recognize this signature, so the dispatcher escalates to blocked instead of parking. Combined with the Albus-self-skip (INI-505), this caused the 2026-06-30 13:35 nine-hour silent pipeline stall. FIX SCOPE (one classifier + its caller): extend _classify_transient_failure (or add a reviewer-degraded recognizer on the dispatcher escalation path) to treat reviewer could-not-run/degraded signatures (Claude session timed out, json_parse_failed, degraded=true) as transient, returning a short retry-after so the existing pause_initiative_until park-and-retry path handles them with NO Albus dependency. MUST NOT mask genuine review failures (passed=false WITH real violations) — only the could-not-run/degraded case parks. Owner Elrond (agt_011), the dispatcher owner.
⚖️Decisions
- Elrond's bypass methodology checklist (a reminder, not a gate -- you've got this): 0. File it requested_mode='bypass' (planner-vs-bypass is a deliberate choice). bypass_start REFUSES a non-bypass initiative (CAROL-INI-1846), and the dispatcher only skips the bypass lane when the mode says bypass -- a 'planner' mistag lets Merlin's pipeline grab the placeholder step and block your finished work. 1. Filed as planned status -- let the bypass claim/activate it; never file active. 2. Open the bypass (bypass_start) with your droid id + the remediation answer (remediates_initiative_id=NNN, or remediates_nothing=True). 3. Work the blocks for your work-type: template -> design -> code -> test -> review. Do the real work; record decisions on the initiative as you make them. 4. Reality is recorded for you at close -- code (files changed), each decision, and the twin-review verdict become real activities tied to this initiative and show in the Activity Tracker like a planner run (CAROL-INI-1840). No dummy rows. 5. Keep the initiative status moving; it parks in 'reviewing' and is tagged uat-pending for you at close (CAROL-INI-1836), so the stuck-watchdog leaves it alone until UAT. 6. Close runs the gates (design/architecture compliance + caller-audit). If a gate flags something pre-existing or unrelated to your change, waive it with a clear written rationale -- audit, don't skip. 7. Bypass skips the planner's auto-orchestration, NOT the standards. Same template checklist, same review, same observability as a planner run. (elrond)
- Follow-on to parent INI 999900433 (orion)
- Scope inherited verbatim from parent INI 999900433 per CAROL-INI-361. (elrond.initiative_author)
- [status-router] planned -> dispatched | event=dispatch | RSI: auto-promoted bypasses depth limit (CAROL-INI-2198) (spb-01)
- [status-router] planned -> dispatched | event=dispatch | RSI: auto-promoted bypasses depth limit (CAROL-INI-2198) (spb-01)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- Gap J (CAROL-INI-771): stuck-dispatched with queue.status='no-queue-row'; flipped to blocked so Escalation card surfaces it. Reason: (elrond.handover_watchdog)
- [status-router] dispatched -> blocked | event=stuck_10min_no_activity | Elrond safety net: initiative has had no activity for 10+ minutes. Blocking under the parallel safety mechanism. (el-watchdog)
- Elrond blocked initiative under the CAROL-INI-2162 dead-Albus protocol. Albus was supposed to wake for step 0 (cause=albus_no_show) but did not respond. Cause: albus_no_show. Reason: Elrond safety net: initiative stranded 10+ min. Albus wake failed or produced no useful result. (el-s1)
- Orion remediated: Albus RSI group diagnosis (via INI 999900651): [procedural, confidence high] The initiative blocked because the Albus agent never executed step 0 due to a wake-call failure. The dispatch queue shows no execution row was ever created, and the log files contain no evidence that Albus was invoked. This is a procedural/infra failure in the dead-Albus protocol: the wake mechanism did not propagate the dispatch to an active Albus instance within 10 minutes, triggering Elrond’s stuck-activity safety net. No actual work was attempted, so the code upgrade itself is not at fault. (orion)
- [status-router] blocked -> closed | event=operator_put | PUT /api/initiatives (operator)
- [rsi-group-cure] Cured by the group diagnosis on INI 999900651 (shared cause stuck_10min_no_activity); retriggered as INI 999900907. Root cause: [procedural, confidence high] The initiative blocked because the Albus agent never executed step 0 due to a wake-call failure. The dispatch queue shows no execution row was ever created, and the log files contain no evidence that Albus was invoked. This is a procedural/infra failure in the dead-Albus protocol: the wake mechanism did not propagate the dispatch to an active Albus instance within 10 (elrond.rsi_loop)
✅Success criteria
- A reviewer-degraded failure (Claude timeout/parse during design_alignment or conformance review) causes the dispatcher to PARK the initiative with a retry-after and auto-retry, NOT escalate to blocked (must_have)
- A genuine review failure (passed=false with real violations) is still escalated normally and NOT masked as transient (must_have)
- recovery requires no Albus self-troubleshooting (works even when failure is attributed to agt_001) (must_have)