Files
Maven/docs/capabilities/implementation.yaml
T
claude 40ec0c0d4b Map every capability to its components in seven dimensions (V-725)
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>
2026-08-26 12:37:37 +04:00

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: []