ekp/postmortem/20260728-gui-verification-exit-contract.md
Kinneyzhang fd1210e557 fix: close repository audit findings
Complete task002 through task016 across cache correctness, editor lifecycle, C boundaries, build and release governance, dictionary provenance, performance, interactive workflows, tests, documentation, and final cleanup.
2026-07-28 22:43:10 +08:00

1.8 KiB

A Report Is Not a Gate Until Failure Propagates

Context

The GUI matrix measured the correct display facts and printed PASS or FAIL, but batch callers always received success. The visible table and the process contract were separate, so release automation could ignore a real overflow.

Decision

Each case returns its measurement plist plus name. One reporting boundary formats all rows, aggregates :pass, and exits batch Emacs with status 1 after printing the table when any case fails. Interactive use still displays the report without terminating Emacs.

Keep the matrix under tests/ because it owns showcase fixtures and developer-only display scenarios. User/developer documentation must load it explicitly rather than imply that requiring the runtime package defines it.

Alternatives Rejected

Search the rendered table for FAIL

Text parsing duplicates the decision and can diverge from measurement data.

Signal before printing

Automation gets a failure but loses the row evidence needed to diagnose it.

Move the showcase matrix into the runtime package

That expands the installed surface and couples production code to a developer fixture without improving the assertion contract.

Consequences

  • Batch success now means every GUI row passed.
  • Failure retains a complete diagnostic table and exits exactly 1.
  • The report formatter is testable without a graphical display.
  • Real pixel correctness still requires a GUI matrix run.

Verification

The missing-boundary control failed 0/1 before implementation. The repaired failure/success controls pass 2/2, both full ERT orders pass 110/110, and the live seven-case matrix passes 7/7. The final screenshot was verified as one fullscreen target buffer with no split or stale client message.

Rollback

Restore string results and report-only behavior. No persisted data needs migration.