Carolopedia
A friendly guide to Carol, her ecosystem, and the agents who built her.
📖About
Ninad ruling 2026-07-31 (CLI-188), answering gap 2 of CAROL-INI-3521. Every app carries ONE classification saying who may reach it: global (every agent - e.g. constitution, policies), confidential (no agent sees the whole app; each sees only its own rows - e.g. The reach must be REAL, not nominal: the Policies app was already marked global yet the knowledge every agent carries never described the policies table, so no agent could read a single rule that binds it; and the constitution is an HTML page with nothing queryable behind it at all, including the Agent self-knowledge principle written for those very agents. Both become readable. Extends the existing apps.agent_scope column rather than adding a second classifier that would drift from it.
⚖️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)
- Six classifications on the column that already existed, not a second one beside it — Ninad's ruling 2026-07-31: global, confidential, private, track, service, public. The apps registry already carried a three-value agent scope (global/service/owner) from CAROL-INI-3457, so this EXTENDS it rather than adding a parallel classifier that would drift from it - the estate's recurring fault. 'owner' becomes 'private' (identical rule, Ninad's name), and 'public' is now a classification rather than a separate boolean: is_public is DERIVED from it, so the two can never disagree the way they did in CAROL-INI-3431. Live: 58 private, 12 confidential, 5 global, 4 public, 4 service. Per his ruling the ~74 owner apps converted straight to private, and track/service utilities will be nominated to him rather than guessed - the app_tracks table is in place and deliberately empty. (orion)
- This governs AGENT reach only; no human screen changes, and Midas's allocator reaches the budget stores as code, not as an agent asking a question, so nothing operational breaks. (orion)
- GLOBAL WAS A PROMISE WITH NOTHING BEHIND IT - the law is now genuinely readable — The Policies app was ALREADY classified global before this work, and it bought an agent nothing: the knowledge every agent carries described the org roster and the app list and never mentioned the policies table, so an agent instructed to 'ground your decisions in Carolverse policies' could not read a single rule. The constitution was worse - an HTML page with nothing queryable behind it at all, including the Agent self-knowledge principle written for those very agents. Both now ride the baseline every agent carries, with real schemas: 381 policies searchable by title and text with the hierarchical id explained, and 50 constitution rows derived from the page (a projection, re-run after any amendment; the page stays the source). PROVEN LIVE: Scriber's grounding returns real policy text for 'what rules bind me', and Argus's returns the self-knowledge principle verbatim. (orion)
- THE BIG FIND: grounding was refused for all 39 agents, so every agent was answering from guesswork — Ninad's evidence was Scriber hand-waving about how many videos he posts a day. Root cause was not Scriber: the grounding layer composed its billing id by APPENDING '-chat' to the agent id, producing 'agt_044-chat'. Chat droids are named after the agent ('scriber-chat'), never after its id - ZERO of the 42 chat droids match the composed form - so the money gate refused every grounded query as an unregistered caller, grounding returned empty, and each agent fell back to inventing an answer. Silent, because an empty grounding block looks exactly like a question with no data. The caller is now RESOLVED from the registry. This is a defect in CAROL-INI-3524 (a parallel lane, now in review): fixed forward rather than reverted, because the resolution serves 3524's own intent of billing the chat that caused the spend. Flagged for that initiative's UAT. Proven: 39 of 39 agents billed an unregistered id before, 0 after. (orion)
- A second Scriber fault: his own videos were missing from the schema he is handed — Even with grounding alive, the table list describing Scriber's Logbook named stories, posts and interviews and NOT story_videos - so no query about videos could be written. Added, with the instruction to state an empty result plainly rather than estimate a rate. He now answers the original question with the truth: zero videos published, against 2 stories and 3 interviews. The wider lesson for the self-knowledge principle is that his deeds line counts droid RUNS, never published OUTPUT - a separate gap (3521 gap 6) that this does not close. (orion)
- MY OWN DEFECT, caught before shipping: the confidential fence stripped shared stores — First cut fenced any data store reachable from a confidential app. Narrowed to fence a store ONLY when EVERY app reaching it is confidential (3 stores: agent access, user accounts, budget caps). RESIDUAL, NOT HIDDEN: where a confidential app shares a store with non-confidential ones, the store stays reachable and the row-level fence is owed work - stated in policy P.01.03.05.16 and asserted by the check so it cannot be quietly forgotten. (orion)
- Recorded where the estate looks: policy, dictionary, and every app's own header — Policies P.01.03.05.14 (every app declares who may reach it), .15 (the law is reachable by everyone it binds), .16 (confidential means own-records-only including the owner). Three data-dictionary rows. Every app's header now carries a coloured classification chip with a plain sentence on hover, served by the same endpoint that already resolves the owner - one change, all 83 apps, no per-app edit. (orion)
- [status-router] executing -> reviewing | event=dispatcher_transition | dispatcher state change (ds-s1)
- Orion remediated: INI-999902519 bypass closed — CAROL-INI-696 close-marker: the Orion bypass INI-999902519 filed against this parent reached terminal state (closed). This row's literal prefix Orion remediated: is the canonical signal the cookbook-155 dispatcher gate looks for. (shared.bypass.bypass_end)
- Orion remediated: INI-999902519 bypass closed — CAROL-INI-696 close-marker: the Orion bypass INI-999902519 filed against this parent reached terminal state (closed). This row's literal prefix Orion remediated: is the canonical signal the cookbook-155 dispatcher gate looks for. (shared.bypass.bypass_end)
- Orion remediated: INI-999902519 bypass closed — CAROL-INI-696 close-marker: the Orion bypass INI-999902519 filed against this parent reached terminal state (closed). This row's literal prefix Orion remediated: is the canonical signal the cookbook-155 dispatcher gate looks for. (shared.bypass.bypass_end)
- Orion remediated: INI-999902519 bypass closed — CAROL-INI-696 close-marker: the Orion bypass INI-999902519 filed against this parent reached terminal state (closed). This row's literal prefix Orion remediated: is the canonical signal the cookbook-155 dispatcher gate looks for. (shared.bypass.bypass_end)
- [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
- Every app in Carolverse carries one classification saying who may reach it, and anyone opening an app can see which classification it has, so access is a stated fact rather than a guess (must_have)
- Any agent asked what rules bind it can quote real policy text back, because the policies are readable to every agent rather than merely linked (must_have)
- Any agent asked about the constitution can quote the principles that govern it, including the one requiring it to know itself (must_have)
- No agent loses reach it has today: every app an agent could read before it still reads, and the four internet-facing apps stay internet-facing (must_have)