Classify every gap and rank the work (V-725)

Session 2 step 3, and the end of the explanation half.

gaps.md compares responsibilities and never package names. Eight classes. The
four capability classes are derived from the ledger's gap_class field and
rebuild with build_ledger.py. The four architecture classes are read from
findings.md and invariants.md, and every entry names the capability or invariant
it affects. An entry naming neither is marked non-blocking cleanup in those
words, which is the whole of class 8 and its eleven rows.

Of 46 v1 capabilities: 5 missing, 21 partial and reachable, 9 built and
unreachable, 11 reachable and unverified.

The nine unreachable ones are seven config blocks and two compose entries. Not
one is a code defect.

The ranked list puts phrasing first: speak-as-herself fails all three criteria,
and everything that asks the resident model to write a Russian sentence inherits
that. His own name not being stored is second. Nine capabilities one config
change from reachable is fourth, and it is the highest ratio of capability to
work in the list.

Items 10, 12 and 13 stall on unresolved invariants and are the owner's call, not
work.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-26 12:44:15 +04:00
parent 41c97bba8d
commit 8153e5eaa5
4 changed files with 310 additions and 1 deletions
+51
View File
@@ -34,6 +34,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'partial'
gap_class: 'capability partial'
components: [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]
scenarios:
- name: conversation_anaphora
@@ -96,6 +97,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'partial'
gap_class: 'capability partial'
components: [core.preroute, state.clarify_store, state.dialogue_sessions]
scenarios:
- name: conversation_anaphora
@@ -147,6 +149,7 @@ capabilities:
deployed: 'partial'
reachable: 'partial'
verified: 'no'
gap_class: 'capability exists but unreachable'
components: [core.phraser, core.replier, core.action_chat, core.model_seam, svc.llama_server, eval.phrasing]
scenarios:
- name: morning_missed
@@ -199,6 +202,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'partial'
gap_class: 'capability partial'
components: [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]
scenarios:
- name: assistant_workday
@@ -251,6 +255,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability partial'
components: [core.q.search, core.q.web, core.q.general, core.q.personal, ext.searxng]
scenarios:
- name: world_summary_quality
@@ -301,6 +306,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability partial'
components: [core.q.kiwix, ext.kiwix]
scenarios:
- name: kiwix_language_pick
@@ -351,6 +357,7 @@ capabilities:
deployed: 'partial'
reachable: 'partial'
verified: 'no'
gap_class: 'capability exists but unreachable'
components: [core.q.weather, ext.openmeteo]
finding: >-
the provider seam, the home city and the clarify path have no written reasoning anywhere. The audit found the capability broken on configuration alone.
@@ -413,6 +420,7 @@ capabilities:
deployed: 'no'
reachable: 'no'
verified: 'no'
gap_class: 'capability exists but unreachable'
components: [core.vision, state.media_blobs]
finding: >-
V-667 has the gemma-4 mmproj on the box and no written contract for what a vision call returns.
@@ -467,6 +475,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'partial'
gap_class: 'capability partial'
components: [state.facts, core.action_fact, core.fact_enrichment, core.store_api]
scenarios:
- name: morning_missed
@@ -526,6 +535,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'partial'
gap_class: 'capability partial'
components: [state.notes, core.action_note]
scenarios:
- name: note_delete
@@ -576,6 +586,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'partial'
gap_class: 'capability partial'
components: [core.recall, state.memory_vectors, router.embedder, core.q.memory, core.q.notes]
scenarios:
- name: assistant_workday
@@ -636,6 +647,7 @@ capabilities:
deployed: 'no'
reachable: 'no'
verified: 'no'
gap_class: 'capability exists but unreachable'
components: [core.memory_eval]
finding: >-
the evaluator ships, writes notes and cannot speak, and nothing records what its conclusions mean (V-248).
@@ -679,6 +691,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'partial'
gap_class: 'capability partial'
components: [state.reminders, core.action_reminder, core.dispatcher, state.delivery_attempts]
finding: >-
parking, firing, delivery, retry and cancellation are spread across three packages with no written contract.
@@ -749,6 +762,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability exists but unverified'
components: [core.rules, core.dispatcher, core.gatherer, state.presence_state, state.nudges, state.tick_memo]
finding: >-
the four presence-and-severity outcomes have never been written down as intended behaviour, only as code (V-281).
@@ -803,6 +817,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability exists but unverified'
components: [state.digest_entries, core.tick_loop, core.rules]
scenarios:
- name: evening_degraded
@@ -853,6 +868,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability exists but unverified'
components: [core.morning, core.q.dayplan]
scenarios:
- name: morning_missed
@@ -903,6 +919,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability exists but unverified'
components: [core.pattern, core.routines, state.proposed_routines, state.events]
finding: >-
the proposer reads a hand-written Russian verb list, which the language rules forbid as a route or fact source (V-606).
@@ -955,6 +972,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'partial'
gap_class: 'capability exists but unverified'
components: [state.tasks, core.q.tasks]
scenarios:
- name: assistant_workday
@@ -1007,6 +1025,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'partial'
gap_class: 'capability exists but unverified'
components: [core.feed_worker, core.q.feeds]
scenarios:
- name: morning_missed
@@ -1057,6 +1076,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'partial'
gap_class: 'capability exists but unverified'
components: [core.sink_telegram, core.telegram_intake, ext.telegram, state.ack_sends]
scenarios:
- name: evening_degraded
@@ -1107,6 +1127,7 @@ capabilities:
deployed: 'no'
reachable: 'no'
verified: 'no'
gap_class: 'capability exists but unreachable'
components: [core.sink_ntfy, ext.ntfy]
scenarios:
- name: ntfy_403
@@ -1149,6 +1170,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'partial'
gap_class: 'capability partial'
components: [core.voice_server, bnd.voice_tcp, core.sink_voice, proc.mavenclient]
finding: >-
the wire is documented and the listener is not. Nothing describes what holds a live voice session open.
@@ -1202,6 +1224,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'partial'
gap_class: 'capability partial'
components: [proc.mavweb, bnd.http_web]
scenarios:
scenario_note: >-
@@ -1250,6 +1273,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability partial'
components: [core.event_bus, proc.mavweb]
finding: >-
the inbound direction exists as the `ambient:notif` source and the outbound direction does not exist at all. Which one the owner means is an open product decision.
@@ -1294,6 +1318,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability exists but unverified'
components: [core.stt_seam, proc.mavsttd, ext.whispercpp, ext.cw2_stt, bnd.worker]
scenarios:
scenario_note: >-
@@ -1343,6 +1368,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability exists but unverified'
components: [core.tts_seam, proc.mavttsd, ext.piper, bnd.worker]
scenarios:
- name: tts_normalisation
@@ -1386,6 +1412,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability partial'
components: [proc.mavwaked, cfg.systemd, ext.alsa]
scenarios:
- name: voice_push
@@ -1428,6 +1455,7 @@ capabilities:
deployed: 'no'
reachable: 'no'
verified: 'no'
gap_class: 'capability exists but unreachable'
components: [core.capture, state.media_blobs]
scenarios:
- name: voice_push
@@ -1470,6 +1498,7 @@ capabilities:
deployed: 'no'
reachable: 'no'
verified: 'no'
gap_class: 'capability exists but unreachable'
components: [core.speaker]
deferred_note: >-
**Deferred past v1**, owner's call 2026-08-15. See `docs/roadmap.md`.
@@ -1505,6 +1534,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability partial'
components: [ext.nexus, core.ecosystem, bnd.http_ecosystem, state.ecosystem_traces]
scenarios:
- name: act_degraded
@@ -1565,6 +1595,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability partial'
components: [ext.praxis, core.ecosystem, core.praxis_acts, core.q.attention, state.surfaced_items, state.ecosystem_traces]
scenarios:
- name: morning_missed
@@ -1627,6 +1658,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability exists but unverified'
components: [ext.hexis, core.ecosystem, core.ecosystem_hexis_gate, core.action_act, core.risk_policy, state.tools, state.pending_act, state.ecosystem_traces]
scenarios:
- name: act_degraded
@@ -1687,6 +1719,7 @@ capabilities:
deployed: 'partial'
reachable: 'partial'
verified: 'no'
gap_class: 'capability exists but unreachable'
components: [ext.homeassistant, core.home_worker, core.q.home]
deferred_note: >-
**Deferred past v1**, owner's call 2026-08-15. See `docs/roadmap.md`.
@@ -1722,6 +1755,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'partial'
gap_class: 'capability exists but unverified'
components: [core.netscan, core.q.network]
scenarios:
- name: netscan_query
@@ -1772,6 +1806,7 @@ capabilities:
deployed: 'no'
reachable: 'no'
verified: 'no'
gap_class: 'capability missing'
components: []
finding: >-
nothing exists, and the box has no bluez (V-257). This is the only v1 item blocked on the host rather than on code.
@@ -1809,6 +1844,7 @@ capabilities:
deployed: 'no'
reachable: 'no'
verified: 'no'
gap_class: 'capability exists but unreachable'
components: [core.mcp_worker, ext.vikunja_mcp]
finding: >-
the allowlist, the stdio and http transports and the webfetch door all exist. Nothing records which servers may run, or why.
@@ -1861,6 +1897,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability partial'
components: [cfg.compose, cfg.mavend, proc.mavend, proc.mavweb, proc.mavsttd, proc.mavttsd, proc.mavpoll, proc.mavgpud, ext.netdata, ext.uptimekuma]
scenarios:
scenario_note: >-
@@ -1910,6 +1947,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'partial'
gap_class: 'capability partial'
components: [state.db_file, state.db, state.db_tmpfs, proc.mavseal]
scenarios:
scenario_note: >-
@@ -1961,6 +1999,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability partial'
components: [state.wrapped_key, state.passkey_file, core.daemon_lock, core.auth_gate, bnd.http_web]
scenarios:
- name: stepup_gate
@@ -2011,6 +2050,7 @@ capabilities:
deployed: 'partial'
reachable: 'partial'
verified: 'no'
gap_class: 'capability exists but unreachable'
components: [core.modelswap, svc.llama_server]
deferred_note: >-
**Deferred past v1**, owner's call 2026-08-15. See `docs/roadmap.md`.
@@ -2044,6 +2084,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability exists but unverified'
components: [proc.mavupdate]
deferred_note: >-
**Deferred past v1**, owner's call 2026-08-15. See `docs/roadmap.md`.
@@ -2077,6 +2118,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'partial'
gap_class: 'capability partial'
components: [eval.gates, eval.router, eval.phrasing]
scenarios:
scenario_note: >-
@@ -2127,6 +2169,7 @@ capabilities:
deployed: 'no'
reachable: 'no'
verified: 'partial'
gap_class: 'capability exists but unreachable'
components: [proc.mavmaild, core.mail_intake, state.maildata]
finding: >-
the product decision comes first. What she does with his mail is undecided, and deploying the daemon before deciding writes the decision by accident.
@@ -2190,6 +2233,7 @@ capabilities:
deployed: 'partial'
reachable: 'partial'
verified: 'partial'
gap_class: 'capability exists but unreachable'
components: [proc.mavcaldav, core.q.calendar]
scenarios:
- name: calendar_create
@@ -2249,6 +2293,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability partial'
components: [core.crawl_worker, core.q.web]
finding: >-
politeness and robots are implemented. The scheduling policy is not written anywhere.
@@ -2314,6 +2359,7 @@ capabilities:
deployed: 'no'
reachable: 'no'
verified: 'no'
gap_class: 'capability missing'
components: []
finding: >-
summarisation exists inside the world chain and inside digestion, and nothing owns it as a capability he can ask for.
@@ -2366,6 +2412,7 @@ capabilities:
deployed: 'no'
reachable: 'no'
verified: 'no'
gap_class: 'capability missing'
components: []
finding: >-
there is no general webhook capability in either direction, and no doc says which direction is wanted.
@@ -2418,6 +2465,7 @@ capabilities:
deployed: 'yes'
reachable: 'yes'
verified: 'no'
gap_class: 'capability partial'
components: [core.routines, core.tick_loop]
finding: >-
routines carry a `Cron` and are a separate mechanism from reminders. Whether "cron jobs" means user-defined scheduled acts or the existing routines is undecided.
@@ -2486,6 +2534,7 @@ capabilities:
deployed: 'no'
reachable: 'no'
verified: 'partial'
gap_class: 'capability missing'
components: []
finding: >-
nothing exists beyond `internal/phraser/eval/checks.go`, which scores style and does not learn it. Learning means behavioral, not weights: stored outcomes, no adapter, no training set.
@@ -2538,6 +2587,7 @@ capabilities:
deployed: 'no'
reachable: 'no'
verified: 'no'
gap_class: 'capability missing'
components: []
scenarios:
- name: learn_from_dismissal
@@ -2597,6 +2647,7 @@ capabilities:
deployed: 'no'
reachable: 'no'
verified: 'no'
gap_class: 'capability missing'
components: []
finding: >-
nothing exists.