Skip to content

docs(backlog): the dev gaps re-verified, sequenced, and one stale claim corrected - #53

Merged
tmttodd merged 3 commits into
mainfrom
docs/dev-gap-backlog
Oct 24, 2026
Merged

tmttodd merged 3 commits into
mainfrom
docs/dev-gap-backlog

Conversation

@tmttodd

@tmttodd tmttodd commented Oct 24, 2026

Copy link
Copy Markdown
Contributor

What

Develops the harness's "green does not prove" section into an actionable backlog:
docs/DEV-GAP-BACKLOG.md — ten entries (GB-1…GB-10), each with the capability and phase it
blocks, instrumented evidence, a runnable acceptance check, and its dependencies. Plus the
sequence, the first increment, and an explicit unverified list.

Also corrects one claim in docs/DEV-READINESS-REVIEW.md that is stale as of be0ba58.

Two things this found by executing, not reading

1. The P1 conformance gate is no longer missing — my own review said it was.

The review was written against 2191155, where ci-v2.yaml had no mutation or conformance
step. PR #51 then added the phase-gates job and I merged the review unchanged, so the merged
doc claimed a gap that the same PR had closed. The backlog re-ran it:

$ gh run view 40059341183 --json jobs --jq '.jobs[]|select(.name=="phase-gates")|.conclusion'
success
$ ... --log | grep -E 'all_mutants_caught|"passed"'
  "all_mutants_caught": true,        # 4/4 mutants caught
  "passed": 2, "failed": 0          # conformance

The review now says the gate is wired and its evidence is thin (the corpus is two checks),
which is the true statement.

2. POST /ops/changes returns 500 for every caller that omits created_by.

ChangeIn.created_by defaults to None, and model_dump() always emits the field, so None
reaches core.open_change, where change.get("created_by", default) never fires — the key
exists. The NOT NULL insert then raises, and only ValueError is caught. Reproduced here:

$ # create_app() on ASGI transport
created_by omitted -> 500 Internal Server Error
created_by null    -> 500 Internal Server Error

The route only works if the caller supplies created_by explicitly. It is not live (the CCB
has no deployment), which is why nothing caught it — and it is the first red test of the
recommended first increment.

The first increment this recommends

A pytest suite for corvus-v2/corvus/app.py on an ephemeral port. It is the smallest change
that turns the largest untested surface (six routes, 0% coverage) into a gate, and the fixture
two other entries need. It would also have caught the 500.

Honest limits

§4 lists seven things not verified, including: actual row loss on pod replacement (inferred
from emptyDir + Recreate, not observed), live-engine behaviour at be0ba58 (the deployed
image is still 2191155), and make mutation on the worktree (deliberately not run — it
rewrites the tree while other agents share it).

Develops the readiness review's "green does not prove" material into ten
prioritised entries (GB-1..GB-10), each with the instrument that settles it,
what it blocks, and a runnable acceptance check.

Every claim was re-derived on be0ba58 rather than copied from the review's
2191155 baseline. Two results are new:

- the P1 conformance gate IS in CI at be0ba58 (ci-v2.yaml phase-gates, run
  40059341183 green, 4/4 mutants caught) — the review's "not gated" is stale;
- the clients' 3 path matches are 0 working methods: an executed probe shows
  every SDK method fails against a real app.py (401 auth contract, then
  KeyError/422 on response shape), and POST /ops/changes 500s when
  created_by is omitted.

First increment: a pytest suite for corvus-v2/corvus/app.py on an ephemeral
port, which is also the fixture the parity test and the CCB deployment need.

Unverified claims are listed in the document's final section.
…im corrected

docs/DEV-GAP-BACKLOG.md: the "green does not prove" ledger developed into ten
prioritised entries (GB-1..GB-10), each with the capability and phase it blocks,
instrumented evidence, a runnable acceptance check and its dependencies, plus the
sequence, the first increment and an explicit unverified list.

Two findings re-verified by execution rather than inherited from the review:
- The review's "P1 conformance gate is not gated" was stale at be0ba58: the
  phase-gates job added by the harness PR runs mutation then conformance, and CI
  run 40059341183 shows 4/4 mutants caught and conformance 2/0. The review now
  says the gate is wired but the evidence is thin.
- The clients fail harder than a route count suggests. Executed against a real
  create_app(), all three path-matching SDK methods fail: 401 first (the clients
  send Authorization: Bearer, v2 reads X-Corvus-Key), then KeyError timestamp,
  KeyError created_at, and a 422 on the missing target parameter.

And one unreported bug, reproduced here: POST /ops/changes returns 500 whenever
the caller omits created_by. ChangeIn.model_dump() always emits the field, so
the None reaches core.open_change, where .get("created_by", default) never fires
because the key exists. The route works only if created_by is supplied.
@tmttodd
tmttodd merged commit b233ca0 into main Oct 24, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant