I1510 — A gap the audit calls planned names a plan object that exists
Check docs/COCKPIT_IDE_AUDIT.md's gap matrix against the plan, so that a row whose status is `planned` must name an issue that exists, and a row cannot quietly claim to be scheduled when nothing schedules it.
DONE wave 0 · p1 · implementation profile · parallel safe
Part of development-runtime — The runtime has a development surface.
Objective
Check docs/COCKPIT_IDE_AUDIT.md's gap matrix against the plan, so that a row whose status is `planned` must name an issue that exists, and a row cannot quietly claim to be scheduled when nothing schedules it.
Why
The audit's matrix uses a fixed status vocabulary in which `planned` requires a plan object, and its own search for the IDE keywords across the issues and the milestones returned nothing — so no row was planned and the work was not in the plan at all. That negative was true when it was written and it stayed true, unnoticed, for a day, because nothing reads the document. Re-run on today's master before this milestone was written, the same search still returned nothing for palette, diff view, CI status or syntax highlighting. A document that states a status vocabulary and has no reader is a document whose statuses drift the moment anyone edits it, which is the one-sided-check class this repository has now paid for several times: a relation asserted in one direction with the converse owned by nobody.
Current state
The matrix is prose. Its `planned` rows, of which there were none, reference nothing. Nothing notices when a row's status stops matching the repository, and nothing notices when a plan object that a row depends on is completed or cancelled.
Desired state
A check reads the matrix and the plan together. A row marked `planned` names an issue id that exists; a row that names an issue that does not exist is a failure with both named. Nothing is asserted about rows in the other statuses, which are evidence claims and not plan claims.
Scope
- test/cases
- scripts
- docs/COCKPIT_IDE_AUDIT.md
Out of scope
- Checking the other statuses. Whether a row is genuinely canonical+implemented+verified is an evidence question that its named test answers, not something a text check can decide.
- Generating the matrix. It is a human argument about a moment, and a generated table would lose the reasoning that makes it worth reading.
Dependencies
None. This issue is a root of the graph.
Acceptance criteria
- A row whose status is planned and which names no existing issue is a reported failure, with the row and the missing id named
- A row naming an issue that exists passes
- The check runs in the repository's own suite as test case 194
Validation
- bash test/run.sh 194_audit_rows_are_planned
- bin/majordomus doctor
Evidence required
- unplanned_row_is_refused
- check_is_in_the_suite
Evidence
| covers | type | command | result | at commit |
|---|---|---|---|---|
| unplanned_row_is_refused | test | bash test/run.sh 194_audit_rows_are_planned 94_ci_plan | tests: 2 passed, 0 failed; case 194 drives scripts/ci/audit-plan-check over fixture matrices: a planned row naming an existing issue passes, one naming a missing id fails MISSING with the row and the id, one naming no id fails UNPLANNED, a non-planned row naming a missing id is ignored (run 2026-10-14 17:4xZ on master ff3829709616e638596315d6ca42be64b570b74f plus this change) | ff38297 |
| check_is_in_the_suite | test | scripts/ci/audit-plan-check; scripts/ci-plan --check | audit-plan is a structure gate in .ai/repo/ci/gates.yaml, selected by the class audit-plan (the audit, the issues, the script, the case); on the real docs/COCKPIT_IDE_AUDIT.md: 0 planned row(s) of 66, rc 0; case 194 is in the suite | ff38297 |
Risk
Low. The trap worth naming is a check that parses prose too eagerly and starts failing on an editorial change to a sentence; it must key on the status vocabulary and the issue id, and ignore everything else in the row.
Timeline
- started
- 2026-10-14T17:42:28Z
- verified
- —
- completed
- 2026-10-14T17:42:45Z
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I1510.yaml. Read it back with majordomus plan show I1510.