Skip to content

fix(conformance): read "(0 …)" and "not found" only where mxcli prints them (#470) - #480

Merged
MendixMau merged 3 commits into
masterfrom
fix/conformance-absent-marker
Oct 20, 2026
Merged

MendixMau merged 3 commits into
masterfrom
fix/conformance-absent-marker

Conversation

@MendixMau

@MendixMau MendixMau commented Oct 20, 2026 •

Copy link
Copy Markdown
Owner

Fixes #470

Direct lane (changes to skills/, bug-logs/, bin/, project-bin/, project-tests/, pipelines)

What changed and why (one paragraph):
project-bin/conformance-check.sh probe() scored a row ABSENT when (0 or not found appeared anywhere in mxcli's answer, so a built element whose definition merely contained those characters went STALE. The issue's case is a microflow whose documentation reads HttpStatus (0 = no response or time-out) (five false STALEs in one module). The same substring match hits every describe navigation that sets a not-found page, because mxcli prints that setting as not found page <Page>. The fix reads each marker only where mxcli prints it. An error counts only on the first non-blank line (Error:…), which was the old start-of-output meaning: stderr is merged into the captured output, and with -c an error also exits 1, which the rc test already scores. An empty set counts only when the last non-blank line is exactly (0 …). mxcli prints the summary as fmt.Fprintf("\n%s\n", Summary) after the table, with Summary = (%d entities), (%d workflow group(s)), and so on (mdl/executor/format.go in mxcli). A body line can start at column 0. mxcli prints enumeration, scheduled-event and image-collection documentation raw inside /** … */, with * on the first line only (cmd_enumerations.go:417, cmd_scheduledevents.go:531, cmd_imagecollections.go:145), and multi-line strings print raw too. So a doc line Error: … must stay PRESENT; the first cut of this PR read any such line as ABSENT. A definition ends in /, ; or a grant, never in a parenthesised count. CR is stripped, and the summary regex has no trailing-space class, so CRLF output from a Windows-built mxcli matches because of the strip; the CRLF cases test that on their own. The matching uses here-strings, not printf | grep -q, to stay clear of the pipefail/SIGPIPE race test-pipefail-grep-q.sh pins. Nothing else changed: the Parse error / no describable document → UNRUNNABLE rule, rc ≠ 0 → ABSENT, and empty output → ABSENT.

Golden input. No mxcli binary was available in the author session (none under the public mxcli checkout, and building one was out of scope). So the new fixture replays two verbatim captures already in this repo:

  • tests/wave2/fixtures/design-audit-nav/describe-navigation-responsive-v025.txt: describe navigation Responsive, mxcli v0.25.0 on mxcli's public test app testapp-views/TestApp.mpr. It carries not found page Pages.Vehicle_Overview and scores ABSENT on master.
  • tests/wave2/fixtures/context-pack/capture/describe/MICROFLOW__Sales.ACT_ApprovalStep_Approve.out: a DESCRIBE MICROFLOW from mxcli v0.23.0. The documentation sentence quoted verbatim from the issue is spliced into its documentation line; that is the only edit, because the issue quotes the sentence, not the whole definition.

The empty-set reply ((0 entities) / (0 workflow group(s)) after a table) and the enumeration with a raw Error: doc line follow mxcli's own printers, read from its source. They are not captures, and the fixture header says so.

Field evidence (CLAUDE.md → "Shipping an instrument", rule 4):
Reported by jopterhorst against release/v1.0 at 2d80287 (same code on master): 5 false STALEs in one module. Reproduced here before the fix on the captures above: built -> ABSENT STALE for the documented microflow and for the navigation profile. After the fix, 5/5 rows were OK on the same ledger. Owed by the maintainer: one conformance-check.sh --module <M> run on a real project whose ledger has a documented microflow, ideally the reporter's.

Impact

Row Answer
Process: human steps or gates added/removed; does anything new block; new stage artifacts none. Same verdicts and exit codes; only fewer false ABSENT/STALE.
Dependencies: shared files touched; order vs other open PRs; new tools/platform assumptions; new artifact reads + their producer Only project-bin/conformance-check.sh (not _common.sh). No new tools: tr, sed, tail, grep -E as before. No new artifact reads. No ordering constraint against the other three PRs from this batch (#469, #471, #477). They touch disjoint files except CHANGELOG.md, which may need a trivial line merge.
Context cost: always-loaded words per role, base → head none: no routed or always-loaded file touched (bin/render-routing.sh --check clean).
Behaviour: A/B for agent-read text n/a: scripts only.
Runtime n/a. Two greps and one sed/tail per probe on output already in memory, which is negligible next to the mxcli call.
  • No client data anywhere in the diff (whole-word grep of added lines for the denylist terms, /Users/ and /home/user: 0 hits; LEAKGUARD_ALLOW_NO_DENYLIST=1 bin/check-no-client-data.sh clean)
  • Size cap: 3 files, about 30 lines changed outside the fixture and CHANGELOG (the branch also carries a merge of origin/master)
  • Test tier reached: T1. New fixture tests/wave2/test-conformance-absent-marker.sh project-bin/conformance-check.sh gives 24/24; on the master script it gives 6 FAIL (documented microflow, navigation and CRLF, on each layout). It also catches both review mutations: on the first head of this PR (ce2bda2), the enum-doc and CRLF-Error: cases give 4 FAIL; with the tr -d '\r' removed, the CRLF summary case gives 2 FAIL. The scoped fixtures over the touched script all pass: test-conformance-baseline-scope.sh 9/0, test-conformance-per-brd-ledger.sh 19/0, test-review-conformance-per-brd.sh 6/0, test-verify-stack-blocked.sh 6/0, test-pipefail-grep-q.sh 3/0. bin/check-scripts.sh, bin/check-portability.sh, bin/render-routing.sh --check and bin/check-pr-discipline.sh origin/master are clean.
  • For a changed instrument: golden input captured, not hand-written (see above for the one splice and the one printer-derived line). Both layouts: every case runs on a single-tree and a two-tree (.mpr under app/) project. Both platforms: CRLF output is a case; only POSIX tr/sed/tail/grep -E are used (BSD and GNU alike).
  • For a new skill: n/a
  • CHANGELOG.md line appended, crediting jopterhorst
  • New bug entries: n/a

Left open: mxcli also prints some empty results as No <things> found (for example No business events found, rc 0). Neither the old nor the new probe treats that as ABSENT. I left it out because it is not part of #470 and I had no capture to pin it.

https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw


Generated by Claude Code

…s them (#470)

probe() matched both absence markers anywhere in mxcli's answer, so a
built microflow whose documentation said "(0 = …)" and every navigation
describe with a not-found page scored ABSENT and went STALE. An error is
now a line starting "Error:", an empty set is a last non-blank line of
the "(0 …)" summary form; CRLF stripped. New fixture replays verbatim
captures already in the repo on both layouts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
mxcli prints enumeration, scheduled-event and image-collection docs raw,
so a doc line can start "Error:"; the any-line check scored those
ABSENT. Only the first non-blank line is read now (an -c error also
exits 1, which the rc test already scores). The summary regex drops its
trailing-space class so the CRLF cases test the CR strip itself. Fixture
gains a raw enum-doc case and separate CRLF cases (24/24; 6 FAIL on
master; 4 FAIL on the previous head).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
@MendixMau
MendixMau merged commit d103df7 into master Oct 20, 2026
2 checks passed
MendixMau added a commit that referenced this pull request Oct 20, 2026
Merges six independently reviewed bug fixes. Each was MERGE after one fix round.
- #486 progress-report nav (#479 items 1-3)
- #480 conformance-check (#470)
- #482 page-fidelity popup (#471)
- #481 monkey sign-out i18n (#469)
- #484 bare $VAR before non-ASCII (#467)
- #485 \t in sed/grep brackets (#468)

Verified on the integrated tree:
- check-scripts, check-portability, render-routing --check, pr-discipline and the leak guard are clean.
- progress-report polish 53, field-fixes 105 and pages 54 pass.
- conformance-absent-marker 24, monkey-left-app 22, page-fidelity-mocks 78, status-bare-var 3, sed-tab-bracket 9, context-pack 55 and bug03-gates 47 pass.
Field runs on real projects are owed by the maintainer.

Fixes #479 items 1-3, #470, #471, #469, #467, #468.
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.

conformance-check.sh reads any "(0 " or "not found" in DESCRIBE output as absent, documentation included

2 participants