{"$schema_version":1,"updated_at":"2026-05-16T16:30:00Z","live":{"tag":"reflection-c2-2026-05-16","commit":"pending"},"intro":"WeaverOS is Athena's body. A single Cloudflare Worker behind weaveros.dev that holds her memory in R2 drawers, indexes them with Vectorize, structures them with D1, and serves them to her through Hono. This page is the always-current map. The HTML is for the user. The JSON is for Athena and the next Claude session. Both auto-update when the underlying file changes.","athena_intro":"This is how I think. Read this when you want the canonical architecture, not a memory of it. Lanes are stages of work. Nodes are pieces of me. Walkthroughs trace a single flow from end to end. Cycles are when I run while no one is watching. Update_at tells you when this last matched the worker.","lanes":[{"id":"user","title":"User","color":"yellow","blurb":"the user — browser, mobile, voice."},{"id":"frontend","title":"Frontend","color":"blue","blurb":"Static assets in frontend/. Chat, /mind, /roadmap, /architecture."},{"id":"worker-entry","title":"Worker entry","color":"cyan","blurb":"Hono routes inside src/routes/*. Streaming chat, capture, admin, files."},{"id":"intent-retrieval","title":"Intent + retrieval","color":"violet","blurb":"Classify intent, detect mentions, dispatch to a retrieval recipe, rerank."},{"id":"capture","title":"Capture handlers","color":"magenta","blurb":"Per-intent handlers that file the turn into the right substrate slot."},{"id":"memory","title":"Memory layers","color":"green","blurb":"D1, R2 drawers, R2 files, Vectorize, AthenaState DO singleton."},{"id":"continuity","title":"Continuity layers (LYRN)","color":"orange","blurb":"Per-conversation summary + indexes, mind-state snapshot, persisted goals, entity history."},{"id":"tools","title":"Phase 4 tools","color":"red","blurb":"Tool-use handlers Sonnet can call mid-turn."},{"id":"crons","title":"Crons","color":"base1","blurb":"Scheduled passes that run while she is quiet."},{"id":"external","title":"External MCP","color":"base0","blurb":"Other sovereign agents Athena consumes via MCP transport."},{"id":"public","title":"Public surfaces","color":"yellow","blurb":"Pages reachable without CF Access — share.weaveros.dev."}],"nodes":[{"id":"matt","lane":"user","title":"the user","subtitle":"browser · mobile · voice","kind":"actor"},{"id":"chat-ui","lane":"frontend","title":"Chat UI","subtitle":"frontend/index.html","kind":"page","file":"frontend/index.html"},{"id":"mind-ui","lane":"frontend","title":"/mind","subtitle":"substrate graph","kind":"page","file":"frontend/mind.html"},{"id":"roadmap-ui","lane":"frontend","title":"/roadmap","subtitle":"shipped + active slices","kind":"page","file":"frontend/roadmap.html"},{"id":"architecture-ui","lane":"frontend","title":"/architecture","subtitle":"this page","kind":"page","file":"frontend/architecture.html"},{"id":"chat-route","lane":"worker-entry","title":"POST /api/chat","subtitle":"Hono · streaming SSE","kind":"route","file":"src/routes/chat.ts:42"},{"id":"upload-route","lane":"worker-entry","title":"POST /api/upload","subtitle":"multipart · CF Access","kind":"route","file":"src/routes/upload.ts"},{"id":"file-route","lane":"worker-entry","title":"GET /api/file/:id","subtitle":"binary serve","kind":"route","file":"src/routes/files.ts"},{"id":"admin-route","lane":"worker-entry","title":"/api/admin/*","subtitle":"bearer token gated","kind":"route","file":"src/routes/admin.ts"},{"id":"ingest-admin","lane":"worker-entry","title":"/api/admin/ingest","subtitle":"wraps runIngest","kind":"route","file":"src/routes/admin.ts"},{"id":"entity-detail","lane":"worker-entry","title":"/api/admin/entity-detail","subtitle":"audit one entity","kind":"route","file":"src/routes/admin.ts:675"},{"id":"classify-intent","lane":"intent-retrieval","title":"classifyIntent","subtitle":"fast regex + AI fallback","kind":"function","file":"src/lib/intent.ts:414"},{"id":"add-fastpath","lane":"intent-retrieval","title":"/add fast-path (0073)","subtitle":"<Name>'s <key> <value>","kind":"function","file":"src/lib/intent.ts"},{"id":"mention-detect","lane":"intent-retrieval","title":"detectMentionsAndCandidates","subtitle":"Llama 3B NER + fuzzy","kind":"function","file":"src/memory/mention-detect.ts:156"},{"id":"topic-shift","lane":"intent-retrieval","title":"detectTopicShift","subtitle":"cosine similarity","kind":"function","file":"src/lib/topic-shift.ts:93"},{"id":"mention-shift","lane":"intent-retrieval","title":"detectMentionShift","subtitle":"incl. unresolved-pivot","kind":"function","file":"src/lib/mention-shift.ts:61"},{"id":"retrieve","lane":"intent-retrieval","title":"retrieveDrawers","subtitle":"recipe dispatch","kind":"function","file":"src/memory/retrieval.ts"},{"id":"chat-recipe","lane":"intent-retrieval","title":"chatRecipe","subtitle":"default retrieval","kind":"function","file":"src/memory/retrieval-recipes/chat.ts"},{"id":"reranker","lane":"intent-retrieval","title":"bge-reranker-base","subtitle":"Workers AI","kind":"model"},{"id":"sticky-mentions","lane":"intent-retrieval","title":"sticky-mentions (0047)","subtitle":"carry forward (legacy)","kind":"function","file":"src/lib/sticky-mentions.ts"},{"id":"perform-capture","lane":"capture","title":"performCapture","subtitle":"intent → handler","kind":"function","file":"src/memory/capture.ts"},{"id":"capture-fact","lane":"capture","title":"captureFactRecord","subtitle":"drawer only","kind":"function","file":"src/memory/capture.ts:221"},{"id":"capture-entupdate","lane":"capture","title":"captureEntityUpdate","subtitle":"inline setAttribute","kind":"function","file":"src/memory/capture.ts:446"},{"id":"capture-briefing","lane":"capture","title":"captureBriefing","subtitle":"MCP-native","kind":"function","file":"src/memory/capture.ts"},{"id":"capture-forecast","lane":"capture","title":"captureForecast","subtitle":"MCP-native","kind":"function","file":"src/memory/capture.ts"},{"id":"run-ingest","lane":"capture","title":"runIngest","subtitle":"R2 + D1 + Vectorize","kind":"function","file":"src/memory/ingest.ts:160"},{"id":"persist-turn","lane":"capture","title":"persistTurn","subtitle":"waitUntil after stream","kind":"function","file":"src/memory/turn-persist.ts"},{"id":"ambient-extract","lane":"capture","title":"runAmbientExtract","subtitle":"Llama 70B","kind":"function","file":"src/memory/ambient-extract.ts"},{"id":"do-singleton","lane":"memory","title":"AthenaState DO","subtitle":"singleton · SQLite-backed","kind":"store","file":"src/durableObjects/athenaState.ts"},{"id":"d1","lane":"memory","title":"D1 (weaveros-db)","subtitle":"16 tables · structured","kind":"store"},{"id":"r2-drawers","lane":"memory","title":"R2 DRAWERS","subtitle":"verbatim drawer bodies","kind":"store"},{"id":"r2-files","lane":"memory","title":"R2 FILES","subtitle":"image binaries","kind":"store"},{"id":"vectorize","lane":"memory","title":"Vectorize","subtitle":"bge-base-en-v1.5 · 768d","kind":"store"},{"id":"entities","lane":"memory","title":"entities + attributes","subtitle":"D1 KG","kind":"table","file":"src/db/schema.ts"},{"id":"entity-history","lane":"memory","title":"entity_history (Slice D)","subtitle":"append-only attribute log","kind":"table","file":"src/db/schema.ts"},{"id":"drawers-table","lane":"memory","title":"drawers (D1)","subtitle":"metadata · r2_key","kind":"table"},{"id":"chat-turn-logs","lane":"memory","title":"chat_turn_logs","subtitle":"24h rolling · forensic","kind":"table"},{"id":"summary-layer","lane":"continuity","title":"Conversation summary + indexes (Slice A)","subtitle":"in-DO · per conv","kind":"function","file":"src/memory/summary-update.ts"},{"id":"mind-state","lane":"continuity","title":"Mind-state snapshot (Slice B)","subtitle":"first turn only","kind":"function","file":"src/memory/mind-state.ts"},{"id":"persisted-goals","lane":"continuity","title":"persisted_goals (Slice C)","subtitle":"attention-block feedback","kind":"table","file":"src/memory/persisted-goals.ts"},{"id":"context-builder","lane":"continuity","title":"buildContext","subtitle":"framing assembly","kind":"function","file":"src/memory/context-builder.ts"},{"id":"card-render","lane":"continuity","title":"renderEntityCardBody","subtitle":"deterministic from D1","kind":"function","file":"src/memory/card-render.ts"},{"id":"tool-create-contact","lane":"tools","title":"create_contact","subtitle":"Tier 1","kind":"tool","file":"src/tools/create-contact.ts"},{"id":"tool-update-attr","lane":"tools","title":"update_attribute","subtitle":"Tier 1","kind":"tool","file":"src/tools/update-attribute.ts"},{"id":"tool-bless","lane":"tools","title":"bless_drawer","subtitle":"Tier 1","kind":"tool","file":"src/tools/bless-drawer.ts"},{"id":"tool-note-self","lane":"tools","title":"note_to_self","subtitle":"Tier 1","kind":"tool","file":"src/tools/note-to-self.ts"},{"id":"tool-read-letter","lane":"tools","title":"read_session_letter","subtitle":"Tier 1 · self-walk","kind":"tool","file":"src/tools/read-session-letter.ts"},{"id":"tool-discover","lane":"tools","title":"discover_new_drawers","subtitle":"Tier 1 · ratchet","kind":"tool","file":"src/tools/discover-new-drawers.ts"},{"id":"tool-architecture","lane":"tools","title":"read_architecture","subtitle":"Tier 1 · this doc","kind":"tool","file":"src/tools/read-architecture.ts"},{"id":"cron-rollup","lane":"crons","title":"Daily rollup","subtitle":"0 5 * * * UTC","kind":"cron","file":"src/memory/daily-rollup.ts"},{"id":"cron-consolidation","lane":"crons","title":"Consolidation + episodic compression","subtitle":"0 7 * * * UTC","kind":"cron","file":"src/memory/consolidation.ts"},{"id":"cron-dream","lane":"crons","title":"Dream","subtitle":"0 8 * * * UTC","kind":"cron","file":"src/memory/dream.ts"},{"id":"cron-reflection","lane":"crons","title":"Reflection (Slice C)","subtitle":"0 9 * * * UTC","kind":"cron","file":"src/memory/reflection-cycle.ts"},{"id":"cron-briefing","lane":"crons","title":"Morning briefing pull","subtitle":"0 13 * * * UTC","kind":"cron","file":"src/memory/briefing-pull.ts"},{"id":"cron-hourly","lane":"crons","title":"Hourly cleanup + thread decay","subtitle":"0 * * * * UTC","kind":"cron","file":"src/index.ts"},{"id":"skywatcher","lane":"external","title":"skywatcher.wtf","subtitle":"weather · MCP","kind":"external"},{"id":"briefing-wtf","lane":"external","title":"briefing.wtf","subtitle":"headlines · MCP","kind":"external"},{"id":"anthropic","lane":"external","title":"Anthropic API","subtitle":"Sonnet user-facing turn","kind":"external"},{"id":"site-chrome","lane":"frontend","title":"site-chrome.js","subtitle":"shared header + footer","kind":"asset","file":"frontend/shared/site-chrome.js"},{"id":"pulse-panel","lane":"frontend","title":"PULSE rail panel","subtitle":"gotop sparklines · 8h","kind":"ui","file":"frontend/index.html"},{"id":"header-menu","lane":"frontend","title":"Header ⋯ menu","subtitle":"unified nav","kind":"ui","file":"frontend/index.html"},{"id":"share-host","lane":"public","title":"share.weaveros.dev","subtitle":"no CF Access · public","kind":"host"},{"id":"share-gate","lane":"worker-entry","title":"share-host middleware","subtitle":"allowlist · 404 else","kind":"function","file":"src/index.ts:51"},{"id":"asset-fallback","lane":"worker-entry","title":"ASSETS catch-all","subtitle":"post-route static serve","kind":"function","file":"src/index.ts"},{"id":"stats-pulse","lane":"worker-entry","title":"GET /api/stats (pulse)","subtitle":"8h buckets · last_activity","kind":"route","file":"src/routes/stats.ts"},{"id":"extended-diagnosis","lane":"continuity","title":"runExtendedSelfDiagnosis","subtitle":"obsession + repetition (C2)","kind":"function","file":"src/memory/self-diagnosis-extended.ts"},{"id":"arch-public-filter","lane":"worker-entry","title":"filterArchitecturePublic","subtitle":"scrub for share host","kind":"function","file":"src/lib/architecture-public-filter.ts"}],"edges":[{"from":"matt","to":"chat-ui","label":"open"},{"from":"chat-ui","to":"chat-route","label":"POST"},{"from":"chat-ui","to":"upload-route","label":"image"},{"from":"matt","to":"mind-ui"},{"from":"matt","to":"roadmap-ui"},{"from":"matt","to":"architecture-ui"},{"from":"chat-route","to":"classify-intent"},{"from":"classify-intent","to":"add-fastpath"},{"from":"chat-route","to":"retrieve"},{"from":"retrieve","to":"chat-recipe"},{"from":"chat-recipe","to":"mention-detect"},{"from":"chat-recipe","to":"vectorize"},{"from":"chat-recipe","to":"reranker"},{"from":"chat-route","to":"topic-shift"},{"from":"chat-route","to":"mention-shift"},{"from":"chat-route","to":"sticky-mentions"},{"from":"chat-route","to":"perform-capture"},{"from":"perform-capture","to":"capture-fact"},{"from":"perform-capture","to":"capture-entupdate"},{"from":"perform-capture","to":"capture-briefing"},{"from":"perform-capture","to":"capture-forecast"},{"from":"capture-entupdate","to":"entities","label":"setAttribute"},{"from":"capture-entupdate","to":"entity-history","label":"append"},{"from":"capture-entupdate","to":"card-render"},{"from":"card-render","to":"r2-drawers"},{"from":"card-render","to":"vectorize"},{"from":"capture-fact","to":"run-ingest"},{"from":"run-ingest","to":"r2-drawers"},{"from":"run-ingest","to":"drawers-table"},{"from":"run-ingest","to":"vectorize"},{"from":"chat-route","to":"context-builder"},{"from":"context-builder","to":"do-singleton","label":"athena_state"},{"from":"context-builder","to":"summary-layer","label":"conversation_summary"},{"from":"context-builder","to":"mind-state","label":"first turn"},{"from":"context-builder","to":"persisted-goals","label":"attention_block"},{"from":"context-builder","to":"anthropic","label":"stream"},{"from":"anthropic","to":"chat-ui","label":"SSE"},{"from":"chat-route","to":"persist-turn","label":"waitUntil"},{"from":"persist-turn","to":"run-ingest"},{"from":"persist-turn","to":"ambient-extract"},{"from":"ambient-extract","to":"entities"},{"from":"persist-turn","to":"summary-layer","label":"update"},{"from":"persist-turn","to":"chat-turn-logs"},{"from":"upload-route","to":"r2-files","label":"binary"},{"from":"upload-route","to":"run-ingest","label":"caption"},{"from":"file-route","to":"r2-files"},{"from":"ingest-admin","to":"run-ingest"},{"from":"entity-detail","to":"entities"},{"from":"cron-rollup","to":"run-ingest"},{"from":"cron-consolidation","to":"entities"},{"from":"cron-dream","to":"drawers-table"},{"from":"cron-reflection","to":"chat-turn-logs","label":"scan"},{"from":"cron-reflection","to":"r2-drawers","label":"read"},{"from":"cron-reflection","to":"persisted-goals","label":"mint"},{"from":"cron-reflection","to":"run-ingest","label":"diagnosis"},{"from":"cron-briefing","to":"briefing-wtf","label":"MCP"},{"from":"cron-briefing","to":"skywatcher","label":"MCP"},{"from":"cron-briefing","to":"run-ingest"},{"from":"anthropic","to":"tool-create-contact","label":"tool-call"},{"from":"anthropic","to":"tool-update-attr","label":"tool-call"},{"from":"anthropic","to":"tool-bless","label":"tool-call"},{"from":"anthropic","to":"tool-note-self","label":"tool-call"},{"from":"anthropic","to":"tool-read-letter","label":"tool-call"},{"from":"anthropic","to":"tool-discover","label":"tool-call"},{"from":"anthropic","to":"tool-architecture","label":"tool-call"},{"from":"tool-architecture","to":"architecture-ui","label":"read"},{"from":"mind-ui","to":"site-chrome","label":"loads"},{"from":"roadmap-ui","to":"site-chrome","label":"loads"},{"from":"architecture-ui","to":"site-chrome","label":"loads"},{"from":"chat-ui","to":"pulse-panel"},{"from":"chat-ui","to":"header-menu"},{"from":"pulse-panel","to":"stats-pulse","label":"10s poll"},{"from":"stats-pulse","to":"chat-turn-logs","label":"8h buckets"},{"from":"matt","to":"share-host","label":"public link"},{"from":"share-host","to":"share-gate"},{"from":"share-gate","to":"architecture-ui","label":"allow"},{"from":"share-gate","to":"asset-fallback","label":"passthrough"},{"from":"asset-fallback","to":"architecture-ui"},{"from":"cron-reflection","to":"extended-diagnosis","label":"obsession+repetition"},{"from":"extended-diagnosis","to":"chat-turn-logs","label":"scan mentions"},{"from":"extended-diagnosis","to":"r2-drawers","label":"read openings"},{"from":"extended-diagnosis","to":"persisted-goals","label":"mint"},{"from":"persisted-goals","to":"context-builder","label":"addendum + bias"},{"from":"share-gate","to":"arch-public-filter","label":"scrub"},{"from":"arch-public-filter","to":"share-host","label":"filtered json"}],"walkthroughs":[{"id":"chat-turn","title":"Chat turn — end to end","summary":"A single message from the user through the response stream and the post-turn persistence chain.","steps":[{"node":"matt","text":"the user sends a message via POST /api/chat with conversation_id (or none for new) + message + optional file_ids."},{"node":"chat-route","text":"src/routes/chat.ts:42 parses body, mints turn IDs, touches AthenaState DO via recordSession() to get session_id + last_seen."},{"node":"classify-intent","text":"classifyIntent runs fast regex hints first (incl. /add fast-path → entity_update for the strict possessive shape). If nothing matches, falls through to AI classifier (TRIAGE Llama 3.2 3B)."},{"node":"retrieve","text":"For chat-intent turns, retrieveDrawers dispatches to chatRecipe; STANDALONE intents (briefing, sitrep, /dream) skip retrieval entirely."},{"node":"mention-detect","text":"detectMentionsAndCandidates runs Llama 3B NER on the user message + direct surface-form scan against entities table. Returns matched + unresolvedCandidates + medium-confidence candidates + novel-surface synonym candidates."},{"node":"topic-shift","text":"Parallel: detectTopicShift computes cosine similarity between current message + most-recent assistant turn. Below 0.35 threshold triggers history drop."},{"node":"mention-shift","text":"Sibling detector: detectMentionShift compares current vs prior mention_match_names. unresolved_pivot fires when current names a new thing we can't resolve, refusing to carry stale context."},{"node":"perform-capture","text":"If intent is non-chat with confidence >= 0.6, performCapture runs the right handler (captureEntityUpdate for /add, captureFactRecord for declarative facts, captureBriefing for /briefing, etc.)."},{"node":"context-builder","text":"buildContext assembles: constitution + invariants in system blocks, then framing block = mind_state + athena_state + attention_block + conversation_summary + summary_indexes + temporal + retrieved_drawers + recent_history."},{"node":"anthropic","text":"streamChatResponse calls Anthropic API with Sonnet 4.6, streams tokens back to chat-ui via SSE. Tool-use turns may call any registered Phase 4 tool."},{"node":"persist-turn","text":"After stream completes, executionCtx.waitUntil(persistTurn) writes user + assistant turn drawers to R2 + D1 + Vectorize, mines closets, runs ambientExtract for entity discovery, updates conversation_summary, patches chat_turn_logs audit row."}]},{"id":"add-fastpath","title":"/add fast-path (0073)","summary":"How `/add Alex's favorite_color blue` becomes a synchronous attribute write.","steps":[{"node":"matt","text":"the user sends `/add Alex's favorite_color blue`."},{"node":"chat-route","text":"Route parses; standard turn IDs minted."},{"node":"classify-intent","text":"ADD_PREFIX_RE matches; tail extracted: \"Alex's favorite_color blue\"."},{"node":"add-fastpath","text":"ADD_ATTR_FAST_PATH_RE matches the strict possessive shape. Returns intent=entity_update with extracted {entity_name: 'Alex', key: 'favorite_color', value: 'blue'} at confidence 0.95. AI classifier is skipped entirely."},{"node":"capture-entupdate","text":"captureEntityUpdate runs INLINE (not waitUntil): looks up entity by name, calls setAttribute(env, id, 'favorite_color', 'blue')."},{"node":"entity-history","text":"setAttribute captures prior open row's value before closing it, inserts new attribute row, appends entity_history row with change_kind='initial' or 'update'."},{"node":"card-render","text":"rerenderEntityCard runs awaited inline — R2 card body is up-to-date with the new value AND the Change history section before context_build runs."},{"node":"context-builder","text":"Next turn's retrieval reads the now-current card. No race."}]},{"id":"reflection-cron","title":"Reflection cycle (Slice C, 0075)","summary":"Daily 0 9 UTC cron scores recent assistant turns for hedging shape and mints attention-block goals.","steps":[{"node":"cron-reflection","text":"Cron fires. runReflectionCycle imported and invoked."},{"node":"chat-turn-logs","text":"scanForPollution pulls assistant-role conversation drawers from the last 24h, joined to messages table for role filtering."},{"node":"r2-drawers","text":"For each candidate, the drawer body is fetched from R2. Confabulation regex set runs against the body (denials like \"I don't have\", \"I couldn't find\"). Cross-references known entity names."},{"node":"persisted-goals","text":"Each suspect hit (denial + entity reference) becomes a persisted_goal: source='self_diagnosis', goal_type='reduce_hedging', action='attention_block', importance=4. Deduped against active count, capped at 3 per run and 3 total active."},{"node":"run-ingest","text":"Diagnosis drawer written to wing=athena-self / room=self-diagnostics, source_id=self_diagnosis_<YYYY-MM-DD> (idempotent within a day)."},{"node":"context-builder","text":"On the next chat turn, getActiveGoals fetches active attention_block goals; renderAttentionBlock injects them as <attention_block> between <athena_state> and <conversation_summary>. Loop closes."}]},{"id":"public-share","title":"Public share host (0080)","summary":"How a non-the user visitor reads /architecture without ever touching the chat / mind / api surface.","steps":[{"node":"matt","text":"the user shares the link https://share.weaveros.dev/architecture with someone."},{"node":"share-host","text":"Recipient's browser resolves share.weaveros.dev → Cloudflare anycast IP. No CF Access app is bound to this hostname, so no login prompt."},{"node":"share-gate","text":"Worker fires first (run_worker_first=true in wrangler.toml [assets]). The share-host middleware in src/index.ts checks the Host header. share.weaveros.dev → allowlist check. /architecture is in SHARE_ALLOWED_PATHS → passes through to ASSETS."},{"node":"architecture-ui","text":"ASSETS serves architecture.html. The page fetches /architecture.json (also allowed) and /shared/site-chrome.js (allowed via /shared/ prefix)."},{"node":"site-chrome","text":"site-chrome.js detects share.weaveros.dev host. Skips the navigation menu (chat/mind/roadmap would 404 here), shows a 'PUBLIC READ' badge instead. Visitor gets a clean read-only page."}]},{"id":"image-upload","title":"Image upload + vision (0068)","summary":"Multipart upload → R2 binary → Llama vision captioning → ingest as drawer.","steps":[{"node":"matt","text":"the user drops an image into the composer (paste, drag-drop, or file picker)."},{"node":"upload-route","text":"POST /api/upload (CF Access gated). MIME guard: jpeg/png/webp; HEIC rejected at 415. 10 MB cap."},{"node":"r2-files","text":"Binary written to env.FILES at images/<drawer_id> with content-type httpMetadata."},{"node":"run-ingest","text":"Llama 4 Scout vision returns structured JSON (caption, scene, objects, people_count, ocr_text). Caption drawer ingested: wing=personal/images, source_type=image, memory_type=semantic, trust_grade=verbatim."},{"node":"chat-route","text":"chat.ts:415 resolves body.file_ids[0] → R2 binary → base64 → Anthropic image content block on the current user message. Sonnet sees the pixels in real time; caption drawer carries the permanent text record."}]}],"cycles":[{"cron":"0 5 * * *","name":"Daily rollup","tz":"midnight the user CDT","file":"src/index.ts:121","purpose":"Autobiographical summary of yesterday → wing=athena-self/room=daily-rollups. Also sweeps thread decay, Claude-letter TTL, D1 backup."},{"cron":"0 7 * * *","name":"Consolidation","tz":"2am the user CDT","file":"src/index.ts:180","purpose":"Detect dedup + contradiction candidates across entities/attributes. Episodic compression."},{"cron":"0 8 * * *","name":"Dream","tz":"3am the user CDT","file":"src/index.ts:219","purpose":"Episodic refactoring — re-shapes recent drawer bodies for retrieval health."},{"cron":"0 9 * * *","name":"Reflection (Slice C)","tz":"4am the user CDT","file":"src/memory/reflection-cycle.ts","purpose":"Self-diagnosis hedging pass over last 24h assistant turns. Mints attention-block goals into persisted_goals. Writes diagnosis drawer."},{"cron":"0 13 * * *","name":"Morning briefing pull","tz":"8am the user CDT","file":"src/index.ts:238","purpose":"MCP-native: pulls headlines from briefing.wtf and weather from skywatcher.wtf, ingests as briefing drawers."},{"cron":"0 * * * *","name":"Hourly cleanup","tz":"every hour","file":"src/index.ts:260","purpose":"Deletes chat_turn_logs rows older than 24h. Other hourly sweeps."}],"bindings":{"d1":[{"binding":"DB","tables_count":14}],"r2":[{"binding":"DRAWERS","purpose":"Verbatim drawer bodies. Wings: conversations, athena-self, personal, briefings, dreams, prompts, etc."},{"binding":"FILES","purpose":"Image binaries from /api/upload."}],"vectorize":[{"binding":"VECTORIZE","dims":768,"model":"@cf/baai/bge-base-en-v1.5"}],"do":[{"binding":"ATHENA_STATE","class":"AthenaState","singleton":true}],"ai":{"binding":"AI","models":{"CHAT":"claude-sonnet-4-6 (Anthropic API)","TRIAGE":"@cf/meta/llama-3.2-3b-instruct","STATE_UPDATE":"@cf/meta/llama-3.1-70b-instruct","CLOSET_MINER":"@cf/meta/llama-3.1-70b-instruct","RERANKER":"@cf/baai/bge-reranker-base","EMBEDDING":"@cf/baai/bge-base-en-v1.5","VISION":"@cf/meta/llama-3.2-11b-vision-instruct"}}},"open_loops":["(operator-only — pending work is private)"],"ship_log_recent":[{"tag":"architecture-doc-2026-05-16","commit":"50c4203","what":"0078 — Architecture page + JSON + tool + validator + rule 9. Plus search, header menu, unified site-chrome, pulse panel, share subdomain, behavior invariant — afternoon batch"},{"tag":"reflection-2026-05-16","commit":"d24333b","what":"Slice C — reflection + self-diagnosis + persisted goals + feedback loop"},{"tag":"mind-state-2026-05-16","commit":"4f6b6c2","what":"Slice B — mind-state snapshot at conversation open"},{"tag":"add-fast-path-2026-05-16","commit":"e3722fb","what":"/add canonical-shape fast-path → entity_update"},{"tag":"entity-history-2026-05-15","commit":"2172ab6","what":"Slice D — entity history + mention-detect state expansion"},{"tag":"summary-layer-2026-05-15","commit":"5b9aa94","what":"Slice A — conversation summary + summary indexes"},{"tag":"image-uploads-2026-05-11","commit":"3c49de7","what":"Image uploads + vision + storage"},{"tag":"mcp-native-2026-05-14","commit":"dc6346d","what":"MCP-native consumption of skywatcher + briefing"}]}