Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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(research): **`process/context-cost-research-2026-09-30.md` — how much each session is made to read, file by file, and the plan to cut a build helper's start load from about 109k tokens of skills to about 15–20k.** The routing `agents` column filters only the agent stubs, so every Stage 5 helper loads the lead's, tester's and reviewer's rows too; the runbook alone is 24k of which a page helper needs at most 1.2k. Includes the per-file keep/trim/move table, the preflight and microflow probe results against mxcli v0.24.0, the page-preflight-versus-screenshot-loop question, and a four-variant test build to measure the cut before it ships. — MendixMau
- 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/<Module>-brief.md`; the toolkit's own convention (`iterative-build-loop.md`) and two real specs use `architecture/modules/<Module>/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
Expand Down
51 changes: 51 additions & 0 deletions bug-logs/mxcli-bugs.md
Original file line number Diff line number Diff line change
Expand Up @@ -6734,3 +6734,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 copy the build ran on
**mxcli version:** v0.24.0 · **Mendix version:** 11.14.0
**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
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 largest module's brief carries the sweep claim
`N of N interactive elements swept across P of P pages in <Module>` (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 <project> 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 <project> 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.
Loading