Carolopedia

A friendly guide to Carol, her ecosystem, and the agents who built her.

📖 CarolopediaServicesBuild InitiativesAll activitiesINI-999902341Guide page
📋

CAROL-INI-3467-00: Semantic Memory becomes Carol's own: a page that shows what it holds, and a door only she can open

Initiative
Open in Initiatives →

📖About

Carol's semantic memory service runs today with no front door, no owner who uses it, and no access control of any kind. Give it a page that honestly shows every source it has indexed and how much of each, hand it to Carol as its owner, and make sure only Carol (and her reporting line, per the standing supervisor rule) can reach it - enforced in the service, not merely recorded in the registry. Built through the Add-a-New-App activity so it meets the same bar as every other Carolverse app, and its record is completed so the Source of Truth describes it truthfully.

⚖️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)
  • Semantic Memory is handed to Carol and fenced to her reporting line — Ninad's ruling: Carol is not using this service today, so it goes to her as owner and only she may reach it. Her supervisor line inherits access automatically under P.01.03.05.09 (a supervisor sees what those below them see) - Ninad confirmed this is intended, so no special case is written to defeat it. Recorded as owner + agent scope 'owner' on the app record; NOT 'service' or 'global', which would widen it to her whole service or the estate. (Ninad)
  • This is a modification of an existing registered app, not a new one — Dedup check on the app record: a row already exists (directory semantic_memory). The add-a-new-app activity is followed for its checkpoint contract, but the execute phase takes the UPSERT path - a second row for the same directory would be the duplicate the gate exists to prevent. (Orion)
  • The page shows what is indexed; the memory CONTENT stays fenced — Two different things are being exposed. The coverage picture (which sources, how many pieces of each, when it last refreshed, and which configured source is missing) is metadata and is what the page is for. The search result is Carol's actual instruction text - that is the memory itself, and it is what the fence protects. So search and reindex require a caller that passes the access check; the coverage and health readings serve the signed-in page. Stated openly rather than blurred. (Orion)
  • The access check refuses an unidentified caller — The service answers anyone on the box today. The fence asks the estate's own access record whether this agent may reach this app, and a caller that names no agent is refused outright. A missing identity is not a registry fault, so it fails CLOSED; a registry that cannot be READ still fails open, which is that module's standing contract and not something this change overturns. (Orion)
  • Coverage and the access decision live in a shared module, not in the app — The app stays a thin window (hard gate H7 / Design #173): a new shared module owns the coverage derivation and the access decision, and the app only serves them. This also means a second caller - Carol's own runtime, when she is wired to use this - asks the same question and gets the same answer. (Orion)
  • Its record has been in breach of the one-complete-address policy — P.01.03.05.10 requires every registered app to carry one complete, clickable address, never blank. This app's address field is EMPTY, so an agent asked where it is had nothing to hand over. Filling it is part of the delivery, not a nicety. (Orion)
  • Content column is 768px, the family's measured norm — Surveyed the live apps rather than picking a number: the content-column values cluster at 640/720/760/768 and the wider 1100 values belong to genuinely wide tabular apps. This page is a list of sources with counts, so it takes 768px. (Orion)
  • What this memory actually holds is far less than its name suggests — Now that the page tells the truth, the truth is worth reading: this memory holds ONE file - Carol's own instruction sheet, 41 pieces - and the second source it is configured to read has never existed on disk. It is not a memory of conversations, users or work; it is an index of her own prompt. That is a scope question for Ninad, deliberately NOT changed here: widening what it indexes is a different decision from giving it a front door and an owner, and doing it silently would have hidden the very fact this page exists to show. (Orion)
  • Nobody calls this service, and giving it an owner does not change that — The fence now says who MAY ask it. Nothing yet DOES: no caller in the codebase puts a question to it, and Carol's own runtime is not wired to it. That wiring was not part of the ask and is not built. Recorded so the next session does not mistake 'Carol owns it' for 'Carol uses it'. (Orion)
  • The add-a-new-app grader keys on the DIRECTORY name, not the registry id — This app's registry id (semantic-memory) and its directory (semantic_memory) differ. Graded by the id, every gate fails with '0 registry rows' - which reads as a broken app rather than a mis-typed argument. Graded by the directory, all eight pass. Worth knowing before anyone trusts a red grade on an app whose two names differ. (Orion)
  • A parallel session's stray file in the shared temp directory shadowed the standard library — A leftover inspect.py in /tmp broke any script run from /tmp, because the script's own directory leads the import path - the failure surfaced as a SQL error inside asyncio, which points nowhere near the cause. Session scripts now live in their own directory. Same family as the standing tools/shared shadowing trap. (Orion)
  • Compliance waived by Orion: all 8 gaps are foreign to this delivery — Compliance waived by Orion, with evidence. All 8 gaps are foreign to this delivery, which touched only two check files, one new check file and one registry row - none of which appears in the gap list. * The 'core' gap names ten root-owned pipeline files. They are OS-locked; nothing in this session staged or installed any of them, and none could have been written even by accident. * Three files reported as shrinking to nothing (Merlin's and Elrond's retired droids, and the retired VM Metrics app) are DELETIONS from earlier sessions, read as regressions because the baseline predates them. * Two import failures name modules that were deliberately moved or retired earlier. * The 75% shrink in the model-provider module is the adapter refactor of CAROL-INI-3369, which moved that code into per-provider adapters rather than losing it. This is the standing stale-baseline problem carried since CLI-161: it raises 5-8 foreign gaps on EVERY bypass and its own follow-on cannot be filed because that filing bounces on the budget gate - so nothing carries the finding forward and each session waives it again. It will eventually bury a real regression. It needs its own initiative to re-baseline; recorded here rather than silently skipped. (Orion)
  • [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)
  • [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 the semantic memory page shows every source it has indexed, with how much of each and when it last refreshed, read live from the service rather than typed into the page. (must_have)
  • The page states plainly when a configured source is missing, instead of leaving it out silently. (must_have)
  • Carol is recorded as the owner of the app everywhere the estate looks it up. (must_have)
  • An agent that is not Carol (nor above her) is refused when it asks the service to search, and the refusal is recorded. (must_have)
  • The app's record carries a working address and description, and the Source of Truth describes the app as it actually is. (must_have)