Skip to content

Shipped feature coverage matrix

This page is the evidence-backed retroactive sweep required by issue #438 and operator Decision 11 (2026-08-10): every feature must name unit, integration, and end-to-end coverage. It reports the repository at commit 2b56c41; it does not expand product scope or override SPEC.md.

What the three layers mean

  • Unit executes one contract, pure module, component, or adapter boundary in isolation. Controlled values and mocks are allowed.
  • Integration joins multiple production boundaries. A disposable real PostgreSQL database, an ephemeral real HTTP process, or a real browser against a stub downstream may be used.
  • E2E driving the real tower uses a supported running ctower instance and asserts the real operator outcome. An in-process client, disposable test instance, stub/fixture echo, route-existence assertion, or page load is not E2E.

PRESENT means every selector named in the cell existed, collected, ran, passed, was not skipped, and is inside a required suite in tools/checks/expected-suites.toml. GAP means no test met that layer's bar; each missing cell has one issue.

Matrix

Shipped feature Unit Integration E2E driving the real tower
Chat send-box PRESENT (repository-policy): tests/repository/test_inbox_send_ui.py::InboxSendTransportTests::test_the_command_carries_only_text_thread_and_a_server_read_recipient; tests/repository/test_inbox_send_ui.py::InboxSendDurabilityTests::test_a_non_accepted_answer_is_not_read_as_a_sent_message PRESENT (dogfood-inbox-controls): tests/dogfood/test_inbox_controls_render.py::InboxSurfaceRenderTests::test_a_typed_message_appears_in_the_thread_without_a_reload; tests/dogfood/test_inbox_controls_render.py::InboxSurfaceRenderTests::test_a_non_accepted_answer_is_never_rendered_as_a_sent_message GAP #440. The browser tests use a stub Record source and explicitly never address a running ctower instance.
Terminal read PRESENT (repository-policy): tests/repository/test_inspection_grammar.py::InspectionGrammarCoverageTests::test_tmux_capture_is_bounded_and_never_writes_to_a_pane; tests/repository/test_surface_semantics.py::ChatStreamTests::test_status_lines_do_not_become_turns GAP #441. No test joins the production adapter and render path to a real tmux pane. GAP #442. No running-instance flow opens a live crew pane and observes its output.
Routines PRESENT (runtime-routine-module): tests/modules/runtime/test_schedule.py::test_catch_up_is_bounded_and_keeps_the_latest_due_fire PRESENT (operations-acceptance): tests/acceptance/increment-1/test_operations.py::test_routine_due_transaction_has_canonical_lineage_and_acceptance_gated_job GAP #443. No installed scheduler/control-worker test observes a real occurrence and outcome.
Dream pipeline PRESENT (dream-dispatch-contracts): tests/contracts/runtime/test_dream_dispatch_contract.py::test_four_nightly_dream_packs_carry_the_exact_effect_facts PRESENT (dream-dispatch-acceptance): tests/acceptance/increment-1/test_dream_dispatch_effect.py::test_nightly_dream_dispatch_stage_walk GAP #444. No installed worker emits, binds, consumes, and records custody for a real due dream effect.
Request capture PRESENT (request-contracts): tests/contracts/requests/test_request_contract.py::test_request_http_surface_is_strict_generated_and_phase_one_only PRESENT (request-acceptance): tests/acceptance/increment-1/test_requests.py::test_request_capture_ack_replay_and_authoritative_list GAP #445. No Request is captured and read back through a supported running instance.
Agreements/Rulings ledger PRESENT (ruling-contracts): tests/contracts/rulings/test_ruling_contract.py::test_ruling_http_surface_is_strict_generated_and_has_no_claimed_identity PRESENT (ruling-acceptance): tests/acceptance/increment-1/test_rulings.py::test_ruling_is_byte_exact_immutable_citable_and_superseded_by_a_new_fact GAP #446. No Ruling is appended and read byte-exact through a supported running instance.
Request digest PRESENT (morning-digest-contracts): tests/contracts/digest/test_morning_digest_contract.py::test_morning_digest_is_one_strict_read_only_generated_surface PRESENT (morning-digest-acceptance): tests/acceptance/increment-1/test_morning_digest.py::test_real_morning_digest_composes_record_derived_briefs_and_links GAP #447. No installed instance renders and delivers the real operator digest.
Request decision briefs PRESENT (decision-brief-contracts): tests/contracts/decision_briefs/test_decision_brief_contract.py::test_decision_brief_is_a_strict_read_shape_with_no_caller_fact_input PRESENT (decision-brief-acceptance): tests/acceptance/increment-1/test_decision_briefs.py::test_decision_request_renders_complete_record_derived_brief_and_ignores_extras GAP #448. No supported running-instance flow renders, answers, and closes a decision brief.
GitLab standing integration PRESENT (gitlab-integration-contracts): tests/contracts/integrations/test_gitlab_issue_sync_contract.py::test_gitlab_issue_sync_payloads_are_strict_and_typed PRESENT (connector-framework-acceptance): tests/acceptance/increment-1/test_connector_gitlab_integration.py::test_gitlab_issue_roundtrip_preserves_one_custody_chain_and_proof_gated_close GAP #449. Provider fixtures do not prove the installed registration, secret reference, egress, polling, or real provider outcome.
Notification mirror PRESENT (native-inbox-modules): tests/modules/inbox/test_ambiguous_commit_recovery.py::test_notification_replays_through_recover_ambiguous_commit PRESENT (notification-transport-acceptance): tests/acceptance/increment-1/test_notify_bridge.py::test_notification_ingest_is_idempotent_and_groups_an_unordered_seat_pair GAP #450. No configured Mission Control rail drives a notification into the installed instance and reads back the pair-grouped outcome.
Promotion control PRESENT (repository-policy): tests/repository/test_inbox_promotion_ui.py::InboxPromotionTransportTests::test_promotion_posts_only_the_optional_target_and_surfaces_the_problem_detail GAP #451. Backend promotion acceptance is not joined to the UI server action; the browser suite explicitly never submits this form. GAP #452. No running-instance browser flow submits the control and reads the linked Ticket outcome.
Portfolio PRESENT (repository-policy): tests/repository/test_portfolio_projection.py::RenderedCountEqualityTests::test_the_portfolio_ticket_total_equals_every_card; tests/repository/test_portfolio_projection.py::ScreenWiringTests::test_the_route_reads_through_the_adapter_seam GAP #453. Fixture projection tests are not joined to real Board and Inbox APIs; the separate PostgreSQL board test is not a portfolio-surface test or an activated suite. GAP #454. No running-instance navigation proves real project rows, totals, escalations, comms attribution, or unavailable-source truth.
Inbox send PRESENT (native-inbox-modules): tests/modules/inbox/test_ambiguous_commit_recovery.py::test_send_replays_through_recover_ambiguous_commit PRESENT (native-inbox-acceptance): tests/acceptance/increment-1/test_inbox.py::test_a_send_is_not_accepted_until_its_durable_receipt_commits GAP #455. No supported running instance sends, reads, acknowledges, and replies between provisioned seats.
Connector framework PRESENT (gitlab-integration-modules): tests/modules/integrations/test_connector_boundary_types.py::test_cursor_page_close_and_receipt_values_are_strict_and_serializable PRESENT (connector-framework-acceptance): tests/acceptance/increment-1/test_connector_registration_isolation.py::test_phase1_two_active_registrations_are_isolated GAP #456. No installed worker proves two active registrations with isolated cursors, leases, retries, and custody.

Live audit evidence

The selectors above were run together on 2b56c41 with Python 3.14.3, Node 24.16.0, pnpm 10.20.0, PostgreSQL test containers, and the frozen Node dependency graph. The clean run collected 29 tests and reported 29 passed, 0 skipped in 36.50 seconds. The one warning was Starlette's existing httpx deprecation warning and did not change a verdict.

The browser selectors initially failed closed because the frozen Node dependencies had not been installed. After pnpm install --frozen-lockfile --ignore-scripts, the same selectors passed; the complete 29-selector set was then rerun cleanly. No failed or skipped selector is recorded as PRESENT.

The expected-suite manifest independently reports browser-e2e as deferred to CT-I2-005, and the real test tree contains no feature E2E tests meeting the running-instance bar. That is why all 14 E2E cells are gaps even though several real-PostgreSQL acceptance tests and one stub-backed browser suite exist.

Gap priority

Issues #440 through #456 are one-to-one with the 17 missing cells. Daily operator surfaces and communication paths carry priority-p1: chat send, terminal read, dream output, Request capture, Rulings, digest, briefs, notification mirror, promotion, portfolio, and Inbox send. Routine, GitLab-provider, and generic connector E2E remain explicit gaps but rank below the controls the operator touches directly each day.

Regenerating the audit

  1. Read tools/checks/expected-suites.toml and enumerate the real test tree; do not infer coverage from filenames or prior PR prose.
  2. Re-run every selector in each PRESENT cell with verbose outcomes. A missing, failed, skipped, or no-longer-required selector changes the cell to GAP until a qualifying replacement runs.
  3. Re-evaluate each integration against the joined-boundary definition and each E2E against a supported running instance. Fixture echoes and page loads never move into the E2E column.
  4. Add every newly shipped feature as one row with all three named cells and one issue per missing cell.
  5. Run just check while editing and just verify before review.