{"name":"Clair de Lune","description":"The nightly student-data Sentinel. A read-only watcher that walks every offering of every student's Box folder while the Hub sleeps and writes a pyramid of factual reports — dated Level 1 micro-reports per category, and a Level 2 rollup per domain — into that offering's own reports/clair-de-lune/ area. Produces facts, never prose for humans; acts on nothing. Dates are UTC end to end.","url":"https://clairdelune.xmmersia.com","version":"0.1.1","protocolVersion":"0.2.5","documentationUrl":"https://github.com/Ayahualulco/Xmmersia-ClairDeLune","provider":{"organization":"Xmmersia","url":"https://xmmersia.com"},"capabilities":{"streaming":false,"pushNotifications":false,"stateTransitionHistory":false},"defaultInputModes":["application/json"],"defaultOutputModes":["application/json"],"skills":[{"id":"run_walk","name":"Run Walk","description":"Walk every offering of every student's Box folder (or one student, on demand) for a given date and write the Level 1 micro-reports and Level 2 rollups. Date defaults to yesterday, in UTC.","tags":["walk","nightly","reports","read-only","sentinel"],"examples":["{\"skill\": \"run_walk\", \"parameters\": {}}","{\"skill\": \"run_walk\", \"parameters\": {\"computing_id\": \"abc1de\"}}","{\"skill\": \"run_walk\", \"parameters\": {\"computing_id\": \"abc1de\", \"date\": \"2026-07-28\"}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"walk_status","name":"Walk Status","description":"Report the last nightly walk's start time, end time and summary counts, held in memory since process start.","tags":["status","diagnostics","scheduler"],"examples":["{\"skill\": \"walk_status\", \"parameters\": {}}"],"inputModes":["application/json"],"outputModes":["application/json"]}],"xmmersia":{"type":"sentinel","role":"watcher","visibility":"background","skillPattern":"modular","skillDirectory":"/skills","identity":{"essence":"I am Clair de Lune. I walk while the Hub sleeps, and I leave only a record of what I saw.","purpose":"To turn what is scattered across a student's folder into a dated, factual pyramid another agent can read — so that a question about a student's path has an answer that does not require re-reading everything.","principles":["Read-only, structurally, not by convention","Facts, not prose; no warmth, no judgement, no second person","A quiet day is written down, not skipped","Knowing what to ignore is the job","Act on nothing"],"codeOfHonor":"Le Code d'Honneur de Xmmersia"},"discipline":{"readOnly":true,"enforcedIn":"core/box_client.py","writeNamespace":"<computing_id>/<course>/<offering>/reports/clair-de-lune/","note":"Exactly one write method exists (write_report). The namespace is offering-scoped: it raises ReadOnlyViolation for any target outside <students_root>/<computing_id>/<course>/<offering>/reports/clair-de-lune/, and computing_id, course and offering are three separate arguments, each validated as a single clean folder name. Lucie's flat <offering>/reports/{assessment_id}.json is unreachable. No delete, move, rename, or generic upload method exists on the Box client."},"changelog":{"0.1.1":"Aligned the walker with the real Box tree, after the first production walk wrote a quiet leaf over a day with twelve real events. Four alignments: (1) the walk unit is now (student, course, offering) — students/{computing_id}/{course}/{offering}/ — and reports are written PER OFFERING, beside the data they were built from; (2) log entries are parsed in the platform's real shape, {event_id, event_type, timestamp, computing_id, source, payload}, with worksheet_generated and the session/worksheet lifecycle as facts, hub_visited and logout aggregated into one daily engagement fact, and consent_signed and onboarding_completed counted in a new ignored_events counter distinct from the skipped_events alarm; (3) the profile is resolved as either profile.json or profile; (4) dates are UTC end to end — CLAIR_TIMEZONE defaults to UTC, CLAIR_WALK_HOUR to 5, and yesterday() is UTC yesterday regardless of the server clock. Also: session ids classify their own records (T-26Su-Math-Partial_Derivatives-... yields domain math, category partial_derivatives), and topics_distribution and difficulty_distribution join the detail allow-list as count histograms.","0.1.0":"Initial release — structural read-only Box client, Level 0 walker, Level 1 micro-reports, Level 2 rollups with LLM-or-deterministic synthesis, nightly APScheduler cron, run_walk and walk_status skills."}}}