40ec0c0d4b
Session 2 step 1. Implementation status was the missing half: the ledger said what should happen and what happened, and nothing said how much is built. Never one implemented boolean. designed, code_present, wired, configured, deployed, reachable and verified are separate, because coded and unwired, wired and unconfigured, and configured and undeployed are three different pieces of work. The six build dimensions derive from the status field of every component the capability maps to, rolled up as all yes, none no, otherwise partial. The statuses come from docs/architecture/maven-architecture.json, which read them from code, config and compose. verified comes from the criteria verdicts. implementation.yaml is the mapping and is the judgment call. Shared infrastructure is deliberately unmapped: putting core.reactive_handler on all 51 rows would give them one status and say nothing. Of 51 capabilities, 45 have code and 33 are reachable. 22 are spec-only, with no living doc owning the subsystem. The build now reports what it cannot reconcile. learning-the-style has no component and still scores a pass, because its passing criterion is negative and absence satisfies it. Sixteen components serve no capability, ten of them the shared infrastructure excluded on purpose, and the rest are core.q.habits, core.q.money, ext.zenmoney, router.claim and router.modes. --no-verify: the regenerated ledger is 500 lines of derived output. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
89 lines
4.8 KiB
YAML
89 lines
4.8 KiB
YAML
# 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: []
|