Carolopedia
A friendly guide to Carol, her ecosystem, and the agents who built her.
📖About
The admin Visits view counts bots/crawlers as visitors and shows no visit time, because the count is logged on page-load but the time needs the 15s JS heartbeat that crawlers never run. Redefine the admin view: a VISITOR = a real human = a visit that actually engaged (recorded a duration > 0, i.e. ran the heartbeat) and is not an obvious bot user-agent; crawlers (Googlebot, Google-Safety, and JS-rendering crawlers that bounce instantly) are excluded. VISIT TIME for a day = the sum of those human visits' durations, each capped (60 min) so a forgotten open tab cannot skew it. Number of raw visits is not shown/important. Implement in the admin frontend aggregation (no auth-service change); update the explanatory note.
⚖️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)
- Admin Visits now counts real humans only (engaged visits with duration>0 + non-bot UA) and shows per-day total time (sum of capped durations); 6/26 went from ~50 bot-inflated visitors/no-time to 2 humans / ~5h. — Crawlers fire one page-load and leave (no 15s heartbeat -> duration 0), so engagement is the clean human signal even when UA is spoofed; 60-min per-visit cap drops the ~20h left-open-tab reading. Done in the admin frontend; it serves index.html fresh so a refresh applies it. (Orion (or-bx-01))
- [status-router] executing -> reviewing | event=bypass_reviewing | bypass transition (or-bx-01)
- Calendar bar now counts distinct human VISITORS per day (was page-view row count), so the bar matches the day-detail headline - removes the chart-vs-detail mismatch. — Two different metrics under one label was a key source of the confusing numbers. (Orion (or-bx-01))
- Admin dashboard now served no-store; a stale process + browser cache were serving an old page, making the same day show different numbers between loads. — Restarted the dashboard process (was started before the fix) and added Cache-Control no-store. (Orion (or-bx-01))
- Ground truth after filtering bots + Ninas own sessions: 6/26 = 0 external humans (the 50/67 were a crawler + Ninad testing); 6/22=1, 6/24=5, 6/25=1. — Authoritative counts computed directly from the visit log matching the exact UI logic. (Orion (or-bx-01))
- Root cause of no-change-on-refresh: the Stats charts (Chart.js Visitors/Visit-time) load their OWN copy of the visit data (STATS_VISITS), separate from the Visits calendar I first fixed. Applied the human filter there too, and made the Visitors line count DISTINCT humans (it was plotting visit rows despite being labeled Visitors). — Two independent data paths in the admin; the user watches the Stats charts. Cloudflare confirmed DYNAMIC (no edge cache), no service worker, app serves no-store -> not a caching issue. (Orion (or-bx-01))
- [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
- Admin Visitors count = distinct real humans (engaged visits with duration>0, bot user-agents excluded); crawlers no longer inflate it. (must_have)
- Each day shows real visit time = sum of human visit durations, each capped at 60 min; the ~20h junk reading no longer skews it. (must_have)