Carolopedia
A friendly guide to Carol, her ecosystem, and the agents who built her.
📖About
Ninad 2026-08-03 (CLI-218), seen on Carol Intelligence: Blogs / Bilbo / 'Unassigned unassigned' / codex-gpt-5.6-sol. The agent and the model are right; the TRACK and its owner are empty.
DIAGNOSED, not guessed. Allocation-by-purpose (CAROL-INI-3620, shipped this morning by a parallel lane) draws a droid that declares a task under that TASK'S NAME instead of its old block name. The page then resolves a row's track from the BLOCK registry, keyed by block name. MEASURED: of 113 live task names and 102 block names, exactly ZERO overlap - so every task-drawn row misses the lookup and renders 'Unassigned'.
WHY NOW: that code has been live since morning, but only 92 droids declared a task. The CLI-218 cleanup (CAROL-INI-3637) gave every remaining live droid one, so 404 droids now take that path and 111 rows across the provider boxes show Unassigned. The cleanup did not create the defect; it turned a corner case into the common case.
CURE at the source, not the symptom: the page already loads each task's own track when it builds its task index and simply never uses it. A task-drawn row must take its track from the TASK - which is the correct authority now that a task carries the track the money gate bills by - instead of asking the block registry for a name it can never hold. Do not paper over it by printing the service name, and do not invent block rows for tasks.
⚖️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)
- Current state at filing (Elrond validity check): CAROL-INI-3620 and CAROL-INI-3637 are closed, so droids now declare tasks and work is billed to the task's track, but Carol Intelligence still builds a task index that contains the track and then ignores it, instead looking up the block registry and rendering 'Unassigned' for task-drawn rows. The app remains registered and the success criteria are not yet met. (elrond)
- [status-router] planned -> executing | event=bypass_executing | bypass transition (or-bx-01)
- [delivery-check] 9 must-have criteria remain pending at bypass_end — delivery FAILED live re-performance; UAT must grade on live evidence, not checklist silence (CAROL-INI-3020): test test_ini3642_subscription_box.py: FAIL (no tests ran in 12.78s) (orion)
- [status-router] executing -> reviewing | event=bypass_reviewing | bypass transition (or-bx-01)
- [status-router] reviewing -> executing | event=bypass_executing | bypass transition (or-bx-01)
- [recovery] queue row revived in place — the execution had died leaving status=executing with no live queue row; the step-advance sweep relaunches the current step (CAROL-INI-2981) (elrond.handover_watchdog)
- [status-router] executing -> reviewing | event=dispatcher_transition | dispatcher state change (ds-s1)
- [delivery-check] 14 must-have criteria remain pending at bypass_end — delivery FAILED live re-performance; UAT must grade on live evidence, not checklist silence (CAROL-INI-3020): test test_ini3642_subscription_box.py: FAIL (no tests ran in 12.94s) (orion)
- [status-router] reviewing -> closed | event=operator_signoff | Auto-accepted (CAROL-INI-1859): Orion-initiated, >2 days in reviewing with no objection. (el-srac-01)
✅Success criteria
- Opening Carol Intelligence and looking at Blogs under Bilbo shows a real track name and its owner instead of 'Unassigned unassigned', with the agent and model unchanged (must_have)
- No row anywhere on that page shows an empty track for a droid that declares a task — the count of such rows is zero, down from 111 (must_have)
- The track shown for a task-drawn row is the same track the money gate bills that work to, so the page and the ledger cannot answer differently (must_have)
- A row that genuinely has no track — a droid declaring no task — still says so honestly rather than being given a made-up one (must_have)
- shared/provider_service_map._resolve returns the same provider bucket as the one routing authority (shared/llm_provider.get_droid_override) for EVERY enabled droid - measured across all of them, zero drift, down from 87. (must_have)
- check_one_subscription_per_track() returns ZERO violations, and the four tracks it reported (Agent Resources / Chat, Agent Resources / Core, Governance / Records & Operations, System Services / Core) are each proven to resolve wholly to their declared subscription. (must_have)
- The check compares each track's resolved providers against the track's DECLARED provider, so a track whose droids uniformly resolve to a provider its own record does not name is REPORTED - proven by an injected case, not by argument. (must_have)
- Every task-drawn row on Carol Intelligence is drawn in the subscription box its track declares, and the page renders without error. (must_have)
- Regression tests covering both defects are added to the persistent runner and pass, with zero NEW FAILURE lines in the suite overall. (must_have)
- Carol Intelligence draws one row per TRACK: zero rows named after a block or a task, down from 206 rows of which 93 were task-named and 113 block-named, with 28 of 40 tracks showing both kinds at once. (must_have)
- Every track row's subscription box is READ from the track record, which is declared by hand - the page resolves nothing to place a row. (must_have)
- Drawing the page performs ZERO per-droid routing lookups, down from 404 per render, and is measurably faster than the 0.80s it costs today. (must_have)
- The droid-walking snapshot is left intact for its other readers, and the compliance check still catches a track whose droids resolve away from its record - proven by an injected case, so the check never ends up agreeing with the record it is meant to audit. (must_have)
- A track with no declared subscription, and a row with no track at all, are each shown honestly rather than defaulted into a box. (must_have)