# Capability -> component mapping. HAND-WRITTEN. This is the judgment call. # # Component ids come from docs/architecture/maven-architecture.json, whose # `status` field was read from code, config and compose and audited against # them. build_ledger.py derives the six implementation dimensions from those # statuses and refuses an id that file does not carry. # # What is mapped is what CARRIES the capability, never the infrastructure every # capability shares. core.reactive_handler, core.wiring, core.action_table, # core.daemon_api and bnd.ipc are deliberately absent: mapping them everywhere # would give all 51 rows the same status and say nothing. # # An empty list means no component carries it. That is the finding, not a hole # in this file. # --- The turn --- route-an-utterance: [router.cascade, router.stage0, router.heads, router.llm, router.classifier, router.embedder, router.extractor, core.turn_route, core.topics, core.decision_trace, state.decision_ring, state.routing_traces, state.routing_labels] ask-instead-of-guessing: [core.preroute, state.clarify_store, state.dialogue_sessions] speak-as-herself: [core.phraser, core.replier, core.action_chat, core.model_seam, svc.llama_server, eval.phrasing] answer-from-your-own-data: [core.query_chain, core.q.embed, core.q.memory, core.q.factbykey, core.q.notes, core.q.history, core.q.list, core.q.self, core.q.personal, state.list_items] answer-from-the-world: [core.q.search, core.q.web, core.q.general, core.q.personal, ext.searxng] read-an-encyclopedia: [core.q.kiwix, ext.kiwix] weather: [core.q.weather, ext.openmeteo] see-an-image: [core.vision, state.media_blobs] # --- Memory --- facts: [state.facts, core.action_fact, core.fact_enrichment, core.store_api] notes: [state.notes, core.action_note] recall: [core.recall, state.memory_vectors, router.embedder, core.q.memory, core.q.notes] memory-evaluation: [core.memory_eval] # --- Proactive --- reminders: [state.reminders, core.action_reminder, core.dispatcher, state.delivery_attempts] interruption-policy: [core.rules, core.dispatcher, core.gatherer, state.presence_state, state.nudges, state.tick_memo] digest-of-held-nudges: [state.digest_entries, core.tick_loop, core.rules] morning-routine: [core.morning, core.q.dayplan] routine-proposals: [core.pattern, core.routines, state.proposed_routines, state.events] tasks: [state.tasks, core.q.tasks] rss-and-news: [core.feed_worker, core.q.feeds] # --- Reach --- telegram: [core.sink_telegram, core.telegram_intake, ext.telegram, state.ack_sends] ntfy: [core.sink_ntfy, ext.ntfy] voice: [core.voice_server, bnd.voice_tcp, core.sink_voice, proc.mavenclient] web-ui: [proc.mavweb, bnd.http_web] desk-notifications: [core.event_bus, proc.mavweb] # --- Speech and senses --- speech-to-text: [core.stt_seam, proc.mavsttd, ext.whispercpp, ext.cw2_stt, bnd.worker] text-to-speech: [core.tts_seam, proc.mavttsd, ext.piper, bnd.worker] wake-word: [proc.mavwaked, cfg.systemd, ext.alsa] hearing: [core.capture, state.media_blobs] speaker-recognition: [core.speaker] # --- The ecosystem --- nexus: [ext.nexus, core.ecosystem, bnd.http_ecosystem, state.ecosystem_traces] praxis: [ext.praxis, core.ecosystem, core.praxis_acts, core.q.attention, state.surfaced_items, state.ecosystem_traces] hexis: [ext.hexis, core.ecosystem, core.ecosystem_hexis_gate, core.action_act, core.risk_policy, state.tools, state.pending_act, state.ecosystem_traces] smart-home: [ext.homeassistant, core.home_worker, core.q.home] network-scans: [core.netscan, core.q.network] # No package, no component. The finding, not an omission. bluetooth-control: [] mcps: [core.mcp_worker, ext.vikunja_mcp] # --- Operations --- the-deployed-stack: [cfg.compose, cfg.mavend, proc.mavend, proc.mavweb, proc.mavsttd, proc.mavttsd, proc.mavpoll, proc.mavgpud, ext.netdata, ext.uptimekuma] encrypted-database: [state.db_file, state.db, state.db_tmpfs, proc.mavseal] passkey-and-step-up: [state.wrapped_key, state.passkey_file, core.daemon_lock, core.auth_gate, bnd.http_web] model-swap: [core.modelswap, svc.llama_server] self-update: [proc.mavupdate] tests-and-analyzers: [eval.gates, eval.router, eval.phrasing] # --- Undesigned in v1 --- email-triage: [proc.mavmaild, core.mail_intake, state.maildata] calendar-management: [proc.mavcaldav, core.q.calendar] web-crawling: [core.crawl_worker, core.q.web] summaries: [] # Empty on purpose. core.telegram_intake is Telegram's own inbound channel and # is mapped to `telegram`. Mapping it here too would make this row read as # built and deployed when all three of its criteria fail on code missing. webhooks: [] cron-jobs: [core.routines, core.tick_loop] learning-the-style: [] # state.routing_labels holds owner corrections of a route and is deliberately # NOT mapped here. It is route learning, not behavioural learning, and mapping # it would make this row read as partially built when nothing reads it back. learning-from-mistakes: [] command-chaining: []