Skip to content

HARNESS rows: out of the built counts; verify row shown as module sign-off status - #526

Merged
MendixMau merged 2 commits into
masterfrom
feat/harness-module-status
Oct 21, 2026
Merged

MendixMau merged 2 commits into
masterfrom
feat/harness-module-status

Conversation

@MendixMau

@MendixMau MendixMau commented Oct 21, 2026 •

Copy link
Copy Markdown
Owner

Direct lane

What changed and why (one paragraph):
Maintainer decision (MendixMau, 2026-10-21): a HARNESS row is a module's sign-off, not a build, so it should stop showing as an ordinary build row. Context: #446 (the verify-module/LOOK instruments) and #501 (the report reads a verify-module.sh <Module> HARNESS row from evidence via harness_verify()). This PR (1) leaves every HARNESS row out of the "x of y built" counts: phase cards, plan rollup and Stage 5 card in progress-report.py, and the lede of build-plan-status.sh --html ("N build rows", plus a "Not counted: N HARNESS rows (… module sign-offs, … harness pass)" note); (2) shows each module's verify row once, as a sign-off line on the phase card where the row sits (the last verify row per module), with the same evidence rule as #501: harness_verify's rule is now verify_evidence (the measurement, unchanged) and module_status (the label); the old harness_verify had no caller left and is removed. Forms: Verified ✓ <date> (LOOK n/n), Verify owed - LOOK + CONFIRM, Verify stale (N builds since), Verify not run, built? no verify summary, plus Verify not clean <date> (<why>) for a summary with a FAULT/FINDING/SKIPPED row (kept after review), Verify clean <date>, LOOK n/n - held: State says <State> (st-person, not counted as signed off) when State is blocked or pending a person, as #501 never promoted that case, and Verify stale (a script was marked done- after it) when the staleness is a newer done- file with no build row. A State cell that disagrees is flagged under the status; a module with no verify row gets no status; the plan card gets a one-line rollup ("Module sign-offs: k of n modules verified"), and the Stage 5 owed text, Build progress line and KPI add ", k of n modules signed off"; the lede's "Not counted" note counts sign-off modules, not rows; (3) drops the verify rows from the rendered row lists (phase-detail tables and the fallback table). Other HARNESS rows (coherence pass, harness runs) stay listed, marked "(not counted)" in both renderers. The Phase state badge is rolled up from the build rows only (display side; a HARNESS-only phase says "sign-off only", and its card "Sign-off phase: no build rows" with no bar); build-plan.json is byte-identical to master's apart from generatedAt (checked on the fixture project). build-plan.md, build-plan.json and the text output keep every row: the text output of build-plan-status.sh lists no plan rows at all (views A and B only), and its consumers (exec.sh, gate-check.sh, status.sh) use only --refresh, so nothing agent-facing changes. (4) The report has no obligations panel; the plan note now says the gate's own record of the look is the look obligation in gate-check.sh <project> 5 (index.html), so the two are not presented as competing sources.

Left open: the em dash in "Verify owed — LOOK + CONFIRM" renders as " - " because the page already replaces every em dash on output.

Impact

Row Answer
Process — human steps or gates added/removed; does anything new block; new stage artifacts none: display-only. No gate, no new artifact, nothing blocks; exit codes unchanged.
Dependencies — shared files touched; order vs other open PRs; new tools/platform assumptions; new artifact reads + their producer project-bin/progress-report.py, project-bin/build-plan-status.sh (both installed via install-manifest.sh; build-plan-status imports VERIFY_STEP from the generator, with a local copy as fallback for an older generator). No new artifact reads: the same .claude/loop/verify/<Module>/summary.tsv (verify-module.sh), design/ui-reviews/ui-review-*.html (module-review LOOK) and docs/BUILD-LOG.md (exec.sh) that #501 reads. Builds on #501 (on master).
Context cost — always-loaded words per role, base → head, baseline total vs 80,000 none: no routed or always-loaded file touched. bin/render-routing.sh --check base and head identical: "Baseline: 73828 words (budget 80000)", stage 6: 45003 words / 16 files, stage 7: 25464 words / 11 files on both.
Behaviour — A/B result for agent-read text n/a: scripts only (no skill, baseline-routed text or agent stub changed).
Runtime — seconds/resources added or saved per exec, gate or check No new script run, no mxcli or mxbuild call, no git call. Measured on the fixture project (single tree, 6 runs each, median): build-plan-status.sh --html master 388 ms → first head (af9876c) 362 ms → this head 318 ms; all within run-to-run noise (296–465 ms overall). progress-report.py alone, first round: 101 → 110 ms (noise).

Field evidence: the decision and the review case come from the maintainer (MendixMau, 2026-10-21). The verify summaries and the BUILD-LOG row in the fixture are the captured outputs under tests/wave2/fixtures/verify-446/ (written by verify-module.sh and exec.sh, from #446/#501); the plan and LOOK reports are agent-authored files, written in the fixture. No client project was used.

  • No client data anywhere in the diff (leak guard clean; whole-word client-name grep of added lines: 0)
  • Size cap: 4 files, ~230 lines changed excluding fixtures and CHANGELOG
  • Test tier: scoped fixtures (T1). test-progress-harness-verify.sh (rewritten, H1-H10 + N1-N6, both layouts): master 2/30 (N4, the json guard, passes on both by design), first head af9876c 18/30 (H9, H10, N1, N2, N5, N6 fail), this head 30/30. Unchanged and passing on head: test-progress-report.sh 101/101, test-build-plan-status-args.sh 6/6, test-build-plan-json.sh 70/70, test-progress-report-pages.sh 54/54, test-progress-report-polish.sh 53/53, test-progress-report-field-fixes.sh 105/105, test-progress-report-gitignore.sh 15/15. No count expectation in those changed: none of their plans renders a HARNESS row into an HTML count.
  • Instrument change: both layouts covered; no platform-specific call added (pure Python string work); golden inputs are the captured summaries/BUILD-LOG
  • CHANGELOG.md line under Unreleased, credited "MendixMau (decision 2026-10-21)", with a "Behaviour change to check in your project:" marker
  • check-scripts, check-portability, render-routing --check, leak guard, check-pr-discipline: all clean

Refs #446, #501.


Generated by Claude Code

…n-off status

A HARNESS step is a module's sign-off, not a build (MendixMau decision
2026-10-21). progress-report.py and build-plan-status.sh --html now leave
every HARNESS row out of "x of y built" (phase cards, plan rollup, Stage 5
card, lede). A verify-module.sh <Module> row is shown once, as its module's
status on the phase card, from the same evidence #501 reads (harness_verify
split into verify_evidence + module_status; nothing new measured, no extra
script run, no mxcli/mxbuild call). Other HARNESS rows stay listed, marked
"(not counted)". build-plan.md, build-plan.json and the text output keep
every row, so agents still see the step.

Fixture test-progress-harness-verify.sh rewritten to module-status form
(H1-H8) plus N1-N4, both layouts: 20 fail on master, 22/22 pass on head.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
… counts

- F1: a clean, LOOK n/n module whose State is blocked or pending a person is
  "held" (st-person), never Verified and not counted as signed off, as #501
  never promoted it.
- F2: the Phase state badge is rolled up from build rows only
  (disp_rollup); a HARNESS-only phase reads "sign-off only".
  build-plan.json is unchanged (byte-identical apart from generatedAt).
- F3: a phase with no build rows says "Sign-off phase: no build rows", no bar.
- F4: Stage 5 owed text, Build progress line and KPI add
  ", k of n modules signed off".
- F5: stale with no build since -> "a script was marked done- after it".
- F6: the lede counts sign-off modules, not rows.
- Drop the now-unused harness_verify(); "(not counted)" in the fallback table.

Fixture: H9, H10, N5, N6 added, N1/N2/N4 updated; both layouts.
master 2/30, previous head af9876c 18/30, this head 30/30.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
@MendixMau
MendixMau merged commit 393d253 into master Oct 21, 2026
2 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.

2 participants