Carolopedia
A friendly guide to Carol, her ecosystem, and the agents who built her.
📖About
Requirement from Ninad (2026-07-02): EVERY Carol interaction that sounds like a request must be recorded in the Requests inbox (registry incoming_requests via the shared inbox module) and classified to an appropriate service. Today capture only fires on narrow paths (anonymous-user/subscription flows); normal Carol conversations that contain a request are never recorded. Scope: (1) add a request-detection pass to Carol's conversation flow so any request-sounding message creates an inbox entry with conversation context, sender identity, and timestamps; (2) run the service classifier on each captured request, populating is_request, classified_service, classification_confidence, classification_reason; (3) unmatched/ambiguous requests get a low-confidence classification and stay visible for triage, never silently dropped; (4) dedupe so one conversation thread yields one request row updated over the thread, not spam rows. Related defect discovered same day: regression tests test_ini666/test_ini718 send REAL approval emails and upsert the REAL inbox (mock mail + inbox in tests) - fix alongside or as sibling.
⚖️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 999900478 (orion)
- Scope inherited verbatim from parent INI 999900478 per CAROL-INI-361. (elrond.initiative_author)
- [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)
- [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 999900432): [procedural, confidence high] Albus executor did not wake to process the initiative after dispatch, as confirmed by the empty execution history and the Elrond safety net block at 2026-07-03 01:41:55 with cause=albus_no_show (see decision 'Elrond blocked initiative under the CAROL-INI-2162 dead-Albus protocol' and rsi_loop.log entries around that time). This is a procedural failure: the executor never started work, matching a systemic pattern affecting 63 other initiatives in the same block group. (orion)
- [status-router] blocked -> closed | event=operator_put | PUT /api/initiatives (operator)
- [rsi-group-cure] Cured by the group diagnosis on INI 999900432 (shared cause stuck_10min_no_activity); retriggered as INI 999900800. Root cause: [procedural, confidence high] Albus executor did not wake to process the initiative after dispatch, as confirmed by the empty execution history and the Elrond safety net block at 2026-07-03 01:41:55 with cause=albus_no_show (see decision 'Elrond blocked initiative under the CAROL-INI-2162 dead-Albus protocol' and rsi_loop.log entries around that time). This is a procedural failure: the executor ne (elrond.rsi_loop)
✅Success criteria
- A request-sounding message in any Carol conversation (any tier, any channel) produces a row in incoming_requests with conversation context and sender identity (must_have)
- Every captured request is classified to a service with confidence and reason populated; ambiguous ones are kept with low confidence, not dropped (must_have)
- One conversation thread yields one request row (updated in place), not duplicates (must_have)
- Regression tests no longer send real approval emails or write the real inbox (mail + inbox mocked) (must_have)