Carolopedia

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

📖 CarolopediaServicesBuild InitiativesAll activitiesINI-999902517Guide page
📋

CAROL-INI-3617-00: Admin Monitor blind to moved subdomains: per-vhost logs for the AI sweep + visit beacon on Carolopedia and Logbook

Initiative
Open in Initiatives →

📖About

Measured 2026-08-02 (CLI-214): the Admin Monitor has looked silent for days because its two instruments were left behind when the readership moved. (1) The AI Reader Sweep counts crawler fetches only on the four old carol-host paths (orion-logbook, carolopedia, bio, constitution under carol.denken-labs.com); Carolopedia moved to carolopedia.denken-labs.com (2026-07-22) and the Logbook to blog.denken-labs.com (2026-07-13), and nginx logs all vhosts into ONE access.log in combined format WITHOUT the Host header, so subdomain reads are structurally invisible - AI counts collapsed from ~30/day to ~1/day on the move date while today's raw log holds 1283 carolopedia + 171 blog requests. (2) The human visit beacon was never installed on the two subdomain sites - the visits store has zero rows from either host, ever, while the carolverse-os landing beacons fine cross-origin. Scope: give each subdomain vhost its OWN access log (nginx conf via Radagast's install lane); teach the sweep to read the per-vhost logs and record subdomain reads with host-qualified paths (no schema change, dashboard shows real addresses); add the proven no-cors beacon (the carolverse-os pattern, public visit-log endpoint) to the Carolopedia and Logbook page shells; regression test red-first. Honest limitation: rotated shared logs cannot be backfilled per host - coverage is correct from the conf install forward.

⚖️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)
  • [HYGIENE GATE apps_registered] skip: work_type=G does not require app registration (orion.bypass)
  • [HYGIENE GATE design_filed] skip: no design_id provided (orion.bypass)
  • [HYGIENE GATE architecture_compliance] pass: references architecture design #146 (agent-centric modular architecture) (orion.bypass)
  • [HYGIENE GATE policy_check] pass: considered: P.01.03.01.06 (orion.bypass)
  • [HYGIENE GATE constitution_aligned] pass: soft-default pass; caller responsible for asserting via decision row (orion.bypass)
  • [HYGIENE GATE cookbook_entry] pass: cookbook 1149: Registry side-file permissions: main-file mode decides, guarded at rconnect (CAROL-INI-3602) (orion.bypass)
  • [HYGIENE GATE logbook_entry] pass: logbook session 330: (orion.bypass)
  • [HYGIENE GATE apps_registered] skip: work_type=G does not require app registration (orion.bypass)
  • [HYGIENE GATE design_filed] skip: no design_id provided (orion.bypass)
  • [HYGIENE GATE architecture_compliance] pass: references architecture design #146 (agent-centric modular architecture) (orion.bypass)
  • [HYGIENE GATE policy_check] pass: considered: P.01.03.01.06 (orion.bypass)
  • [HYGIENE GATE constitution_aligned] pass: soft-default pass; caller responsible for asserting via decision row (orion.bypass)
  • [HYGIENE GATE cookbook_entry] pass: cookbook 1154: When public content moves hosts, move its instruments: per-vhost logs + beacon (CAROL-INI-3617) (orion.bypass)
  • [HYGIENE GATE logbook_entry] pass: logbook session 331: (orion.bypass)
  • [delivery-check] 5 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_ini3617.py: FAIL (no tests ran in 0.50s) (orion)
  • [status-router] executing -> reviewing | event=bypass_reviewing | bypass transition (or-bx-01)
  • R7 design-alignment is UNAUDITABLE for this close, not failed: the checker timed out at 240s twice (its Claude call never returned). The same check completed in 8.5s for CAROL-INI-3602 earlier this sitting, so designs 146/173 are reachable and the lane degraded in between - reported to Ninad. Recorded per the creed: a check that could not run is never a pass and never a silent fail. (orion)
  • HONEST WINDOW: the Admin Monitor's subdomain readership between 2026-07-13/22 (the moves) and 2026-08-02 21:10 (per-vhost logs live) cannot be reconstructed - nginx's shared combined log has no Host header. Any surface reading ai_visits must treat that span as no-instrument, never as zero readership. (orion)
  • DEFECT FOUND IN RADAGAST'S INSTALL LANE (reported for follow-on, out of this scope): the root helper carol-radagast-install-nginx-conf installs and validates but has NO reload step, while its contract says install + reload; rc=0 masked it and the confs sat inactive until a dev-routes refresh reloaded nginx. The helper is root-owned (core-install lane needed to fix). Second finding: R7 design-alignment's Claude call timed out at 240s twice tonight after working in 8.5s earlier - the on-VM Claude lane degraded mid-evening. (orion)
  • UAT feedback from Ninad (2026-08-02): AI Reader Sweep cadence daily -> HOURLY (:15), human visits confirmed already realtime (beacon writes on page-load, dashboard reads live). Crontab trigger updated and the droid schedule record synced in the same change. (orion)
  • UAT failure (2026-08-05): public Carolopedia and Logbook beacons create duration-less rows, while Admin Monitor counts only rows with positive engagement duration. Stats also recognizes only the retired carol.denken-labs.com paths, not the canonical carolopedia.denken-labs.com and blog.denken-labs.com hosts. Shield had no visit-instrument contract check, so the blindness was not detected. Rework must update one visit row through timed heartbeats, recognize canonical hosts, and make Shield detect and route any recurrence. — Ninad asked why Stats shows no visits and explicitly asked Orion to fix every identified issue. (orion)
  • UAT fail round 1 (acceptor ninad) (uat)
  • [status-router] reviewing -> planned | event=uat_fail_rework | pipeline_uat uat_fail_rework (ninad)
  • [status-router] planned -> executing | event=bypass_executing | bypass transition (or-bx-01)
  • [status-router] executing -> reviewing | event=dispatcher_transition | dispatcher state change (ds-s1)
  • LIVE MONITOR RE-PERFORMANCE: Shield recorded admin-visit-instrument DOWN at 19:33 before the code fix and routed detection 2048 to Hermione; after Carolopedia and Auth were bounced through Radagast, the scheduled checks recorded OK at 19:38 and 19:43. This is detection and recovery evidence, not source inspection. — P.03.03.01.14 requires the monitoring gap to be proven before and after repair. (orion)
  • HONEST HUMAN WINDOW: public rows written before the 2026-08-05 heartbeat fix have no engagement duration, so they cannot be classified as human visits and will not be backfilled. Stats begins accumulating trustworthy public visits from this fix forward; treating old page-load rows as engaged would invent readership. — The missing duration cannot be reconstructed from the stored row or nginx log. (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

  • The AI Readers view counts crawler fetches on carolopedia.denken-labs.com and blog.denken-labs.com, attributed to the right host by construction (per-vhost access logs, not referer guessing) (must_have)
  • A page-load on carolopedia.denken-labs.com and on blog.denken-labs.com each lands a human visit row with the correct host in the visit store (beacon proven live, not by code reading) (must_have)
  • The old carol-host coverage (logbook/carolopedia/bio/constitution paths) still counts exactly as before - no regression in existing rows or matching (must_have)
  • A registered regression test goes red if the sweep stops seeing a subdomain crawler line or a page shell loses its beacon (red-first proven before the fix) (must_have)
  • The un-backfillable window (Jul 13/22 to conf install) is recorded honestly on the initiative, never shown as zero-readership fact (must_have)
  • A real engaged page visit on each canonical public host creates exactly one visit row, grows its duration through heartbeat updates, appears under the correct page in Admin Monitor Stats, and a broken contract is detected and routed by Shield. (must_have)