Carolopedia
A friendly guide to Carol, her ecosystem, and the agents who built her.
📖About
Ninad ruling (CLI-243): a user is one PERSON; the channels a person reaches Carol on live in a separate user-channel mapping. Merge the two Ninad rows (WhatsApp admin + web [email protected]) into ONE user carrying both identifiers; fold his carolverse instances into one contributor instance with the union of agent mappings; repoint history; new user_channels registry table seeded for all users (Ninad x2 channels, Werner, Sachin). Existing phone/email resolvers keep working off the single row (both identifiers on it) - migrating resolvers to read user_channels directly is recorded follow-up, per the prod-fallback rule. Design 542 versioned; cookbook 1277 updated in place.
⚖️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)
- [status-router] planned -> executing | event=bypass_executing | bypass transition (or-bx-01)
- Merged INTO the WhatsApp admin row (the older anchor): it now carries both identifiers, the one carolverse contributor instance and the union (39) of agent mappings; the web row's 8 history rows repointed; the web folder trashed after its person-level config (39 agents, 9 services) folded into the canonical folder so the legacy fallback resolves identically from either channel.
- user_channels seeded for all users (Ninad whatsapp+web, Werner, Sachin). Identifiers stay duplicated on the user row ON PURPOSE this release - the live resolvers read them; pointing resolvers at user_channels is the recorded follow-up (prod-fallback rule).
- INCIDENT, owned: the first bypass_start call used a WRONG initiative id and claimed the parallel lane's planned CAROL-INI-3784 (web-chat pause control). Released immediately: execution failed, run terminated, correction decision posted. The router forbids executing->planned and blocked->planned, so 3784 now sits BLOCKED with a clean reason - no work lost, it revives via its own bypass or a retrigger. Cost of the mistake: one wasted attempt row on their family.
- [delivery-check] 6 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_ini3785.py: FAIL (no tests ran in 0.36s) (orion)
- [status-router] executing -> reviewing | event=bypass_reviewing | bypass transition (or-bx-01)
- Operator addition during UAT (Ninad): Orion (agt_023) added to Ninad's carolverse instance mapping and the legacy fallback config - 40 agents mapped. Regression lock updated 39 -> 40 to match the ruled state.
- [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
- Exactly one Ninad user exists, carrying both his WhatsApp number and [email protected], access admin, and exactly one carolverse contributor instance holding the union (39) of his agent mappings (must_have)
- A user_channels registry table maps every user to their channels (Ninad: whatsapp + web; Werner and Sachin: whatsapp) with unique channel identifiers (must_have)
- Every reference that pointed at the removed web identity points at the merged user; no dangling or orphan rows remain (must_have)
- The legacy folder-based fallback still resolves: the merged user folder carries the person-level subscriptions and agent mapping so web and WhatsApp both land on the same folder (must_have)
- The merged web identity folder is moved to trash after its config is folded in, never rm-ed (must_have)
- Design 542 and cookbook 1277 state the users-are-people + separate-channel-map model, and a regression test locks single-row-per-person, unique channel identifiers, and the merged access resolution (must_have)