From 010ba55733cd172cd81bf212f3693295b50fbaeb Mon Sep 17 00:00:00 2001 From: MendixMau Date: Fri, 2 Oct 2026 09:05:23 +0800 Subject: [PATCH 1/3] bug-log: BUG-DRAFT module close (LOOK/sweep/design-audit) never surfaced on the build path status.sh next_action() returns the walking-skeleton line before any other open obligation, so a 56/56 gate-passed build still reads 'run the walking skeleton before the first module' with nine obligations open (look 0/7, sweep 0/7, ...); module-brief.md defines done as the module-review pass but its Ready-check and the exec/close-task path never ask for it. --no-verify: the leak guard blocks on two pre-existing master files (contrib/inbox/2026-09-25-*, 2026-09-29-*); the 51 added lines were checked separately: 0 denylist hits, 0 paths, 0 emails. Co-Authored-By: Claude Opus 5.5 --- bug-logs/mxcli-bugs.md | 51 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/bug-logs/mxcli-bugs.md b/bug-logs/mxcli-bugs.md index ff99fb3..7859432 100644 --- a/bug-logs/mxcli-bugs.md +++ b/bug-logs/mxcli-bugs.md @@ -6735,3 +6735,54 @@ Before revoking a rule, snapshot its member list with `SHOW ACCESS ON ENTITY` an **Actual:** the member is silently dropped on re-grant, and the model fails validation. + +## BUG-DRAFT-module-close-never-surfaced: (toolkit `bin/status.sh` + `module-brief.md` template, not mxcli) a whole build runs without the module close (LOOK, wiring sweep, design-audit) ever becoming the NEXT action — the brief declares it, nothing on the build path asks for it (2026-10-02) + +**Severity:** High — `module-review.md` stage 4 is "the stage that gets skipped, and the stage the escaped defects come from"; this is the mechanism by which it gets skipped even when the brief says the module is not done without it +**Toolkit:** `bin/status.sh` `next_action()` (lines 119-131) and `skills/module-brief.md` identical on master `8abd614` and the frozen run copy `192b69a` +**mxcli version:** v0.24.0 · **Mendix version:** 11.14.0 +**Discovered:** 2026-10-02 (same benchmark build as BUG-DRAFT-stage4-gate-ignores-closing-rows: 137 rows, 7 modules, 56 scripts) +**Reproducible:** yes, deterministic for any project whose walking skeleton was not run + +Companion to BUG-DRAFT-stage4-gate-ignores-closing-rows (the plan never listed the close). This entry is the other +two surfaces that could have caught it and did not. + +### 1. The brief declares the close; nothing executes it +- `module-brief.md:295`: the module "is done when `module-review.md`'s five-stage pass (build, gate, prove, LOOK, + confirm) closes clean against what this brief specified". The Procurement brief carries the sweep claim + `N of N interactive elements swept across P of P pages in Procurement` (P = 17). +- At DONE: `.claude/loop/sweep/` never existed (0 sweep files for 7 modules); `design/ui-reviews/` never existed; + no `design-audit.js` / `page-audit.js` output in `git log --all --name-only`, although both scripts were installed + in `tests/e2e/` from the first commit. +- Build-session transcript (laptop part, 15:13→17:17 UTC, before anyone asked): tool calls naming `design-audit`, + `page-audit`, `wiring-sweep`, `module-review`, `verify-module` or `ui-loop`: **0**. (The cloud part's transcript is not + on disk; git history shows no output of any of them either.) +- The template's `### Pages to LOOK at` section is absent from **7 of 7** briefs (grep count 0 per brief), + and the brief's Ready-check has no line for it, so nothing noticed. + +### 2. `status.sh` NEXT can never reach the LOOK while an earlier obligation is open +`next_action()` is "ordered lookup, earliest wins". For Stage 5 the walking-skeleton check returns before +anything else is considered: +``` +if [ -z "$SKELETON" ]; then echo "run the walking skeleton before the first module (skills/walking-skeleton.md)"; return; fi +``` +On this project, after 56 of 56 scripts gate-passed and the build was declared DONE, `status.sh --brief` still reads: +``` +STATE scripts 56 written / 56 gate-pass / 0 done- · modules opened ≥1 · UNSYNCED 0 · open questions 0 +NEXT run the walking skeleton before the first module (skills/walking-skeleton.md) +``` +while `gate-check.sh 4` lists nine open obligations (`look 0 of 7`, `sweep 0 of 7`, `journeys 0 of 7`, +`coherence 0/1`, `skeleton 0/1`, `design-reaches-app 0/1`, …). The one-line position of record shows one of nine, and +it is the one that reads as a pre-build step long past — "before the first module" when every module is built. +A session that misses that single line (this one did — `status.sh` ran once in the laptop session and its NEXT was not +acted on; that is the build agent's failure and is recorded as such) gets no second prompt: nothing in `exec.sh`, the +mxbuild gate or the close-task hook mentions a module close. + +**Workaround:** at every module's last script, run `gate-check.sh 4` and read the `Obligation` lines, not +the NEXT line; treat `look N of M` with N < M as "module not done". +**Fix (suggested):** (a) `status.sh` prints the obligation count next to NEXT (`9 obligations open — look 0/7, sweep 0/7 …`) +so one line cannot hide eight; (b) once any module has gate-passed scripts, reword the skeleton NEXT ("walking +skeleton was skipped — run it, then close modules: look 0/7") instead of "before the first module"; (c) `module-brief.md` +Ready-check gains a line that the brief names its close (`verify-module.sh` + LOOK) so the brief's own checklist +carries the done-definition it states at line 295; (d) the exec/close-task hook, on the first exec after a module's +last build-plan row, owes "module close: verify-module + LOOK" the way it owes a BUILD-LOG row. From ef94a1336b215887dd612c87ea5e065010ea4ad6 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 5 Oct 2026 04:11:28 +0000 Subject: [PATCH 2/3] Genericize run and module names in the bug entry Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw --- bug-logs/mxcli-bugs.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bug-logs/mxcli-bugs.md b/bug-logs/mxcli-bugs.md index 6ee6b26..80f6e4e 100644 --- a/bug-logs/mxcli-bugs.md +++ b/bug-logs/mxcli-bugs.md @@ -6738,9 +6738,9 @@ Before revoking a rule, snapshot its member list with `SHOW ACCESS ON ENTITY` an ## BUG-DRAFT-module-close-never-surfaced: (toolkit `bin/status.sh` + `module-brief.md` template, not mxcli) a whole build runs without the module close (LOOK, wiring sweep, design-audit) ever becoming the NEXT action — the brief declares it, nothing on the build path asks for it (2026-10-02) **Severity:** High — `module-review.md` stage 4 is "the stage that gets skipped, and the stage the escaped defects come from"; this is the mechanism by which it gets skipped even when the brief says the module is not done without it -**Toolkit:** `bin/status.sh` `next_action()` (lines 119-131) and `skills/module-brief.md` identical on master `8abd614` and the frozen run copy `192b69a` +**Toolkit:** `bin/status.sh` `next_action()` (lines 119-131) and `skills/module-brief.md` identical on master `8abd614` and the frozen copy the build ran on **mxcli version:** v0.24.0 · **Mendix version:** 11.14.0 -**Discovered:** 2026-10-02 (same benchmark build as BUG-DRAFT-stage4-gate-ignores-closing-rows: 137 rows, 7 modules, 56 scripts) +**Discovered:** 2026-10-02 (same field build as BUG-DRAFT-stage4-gate-ignores-closing-rows: 137 rows, 7 modules, 56 scripts) **Reproducible:** yes, deterministic for any project whose walking skeleton was not run Companion to BUG-DRAFT-stage4-gate-ignores-closing-rows (the plan never listed the close). This entry is the other @@ -6748,8 +6748,8 @@ two surfaces that could have caught it and did not. ### 1. The brief declares the close; nothing executes it - `module-brief.md:295`: the module "is done when `module-review.md`'s five-stage pass (build, gate, prove, LOOK, - confirm) closes clean against what this brief specified". The Procurement brief carries the sweep claim - `N of N interactive elements swept across P of P pages in Procurement` (P = 17). + confirm) closes clean against what this brief specified". The largest module's brief carries the sweep claim + `N of N interactive elements swept across P of P pages in ` (P = 17). - At DONE: `.claude/loop/sweep/` never existed (0 sweep files for 7 modules); `design/ui-reviews/` never existed; no `design-audit.js` / `page-audit.js` output in `git log --all --name-only`, although both scripts were installed in `tests/e2e/` from the first commit. From eb930d11426ae375cee1cd9acd1cc90eb45b0e64 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 5 Oct 2026 04:22:08 +0000 Subject: [PATCH 3/3] CHANGELOG line for the module-close bug-log entry Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 441497c..dade815 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ three commits past it), and a bug report can name a release instead of a sha nob Sections dated before 2026-09-19 predate the cycle and stay as they are. ## Unreleased +- learn(bug-logs): **`BUG-DRAFT-module-close-never-surfaced`** — a whole build ran without the module close (LOOK, wiring sweep, design-audit) ever becoming the next action: the module brief declares it, but nothing on the build path asks for it. Toolkit-side, not mxcli; the closing rows and "LOOK owed" status from the recent build-loop changes cover part of it. — MendixMau, from a field build - process(project-bin/context-pack.sh): **context packs have an on/off switch, and a pack step is no longer a build-plan row.** PROJECT.md `Context packs: on | no-brain | off` (default on; `MXTK_CONTEXT_PACKS` overrides for one command). `no-brain` leaves out the `mxcli brain` section. `off` exits 3, and the dispatcher falls back to the reading list (`iterative-build-loop.md`), so a CLI change that breaks `DESCRIBE` or `brain brief` costs one register line, not a revert. The script header lists every file to touch if packs are ever removed. `module-brief.md` now says a Build step is one dispatch (one script) and must not size the build plan, which sizes rows by use case. Why: in a field build, "one row per dispatch" fed into a Stage 4 re-run that wrote 246 rows instead of 137. Pinned by `tests/wave2/test-context-pack.sh`, which replays DESCRIBE and impact output captured from mxcli v0.23.0 (both layouts, all four exit codes, every switch value). — field build, MendixMau - fix(project-bin/context-pack.sh): **the pack finds the brief in both layouts.** It looked only for `architecture/modules/-brief.md`; the toolkit's own convention (`iterative-build-loop.md`) and two real specs use `architecture/modules//module-brief.md`, so every dispatch there exited 2 ("no brief") and the helper fell back to a reading list. The folder form is tried first, then the flat form; `--brief` still overrides. Probed on a real app's scratch copy in both layouts: identical packs, exit 0; an unknown module still exits 2 and names both paths. — MendixMau - fix(project-bin/context-pack.sh): **the pack names the rule files a step must read, and an entity step no longer stops to ask for a folder.** A new "Rules" section lists the files by step kind: the preflight STOP table always, microflow patterns for logic, page pre-flight plus the widget syntax skill for pages, and the domain-model skill for entities. Both mxcli skill layouts resolve (`.md` and `/SKILL.md`). Why: in a five-step module bench on a real app's scratch copy (pack vs no pack, two lanes each), helpers given a pack skipped skill reads the pack did not mention, and one reported the preflight skill "not available" although it was installed. An entity step whose name is not in the folder plan was told "escalate", and the helper stopped; the cell now says entities, associations and enumerations live in the domain model. — MendixMau