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¶
- Read
tools/checks/expected-suites.tomland enumerate the real test tree; do not infer coverage from filenames or prior PR prose. - Re-run every selector in each
PRESENTcell with verbose outcomes. A missing, failed, skipped, or no-longer-required selector changes the cell toGAPuntil a qualifying replacement runs. - 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.
- Add every newly shipped feature as one row with all three named cells and one issue per missing cell.
- Run
just checkwhile editing andjust verifybefore review.