You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit ec90cf3
Browse filesBrowse the repository at this point in the historyBrowse files
Merge #317: interaction-model skill for Stage 3 (refs #291, part 1 of 3)
Review: MERGE (after fix round + confirmation) — ba routed, one Page parameter format, full paths, Gate-row walk; no client names from #291 leaked (grepped all names); baseline 76,270.
Copy file name to clipboardExpand all lines: CHANGELOG.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -21,6 +21,8 @@ Sections dated before 2026-09-19 predate the cycle and stay as they are.
21
21
- process(merging): **every PR gets an independent review before it merges — a merge go is not a review.** A reviewer that did not write the PR returns MERGE / MERGE-AFTER-FIX / HOLD on value, regression risk after sync, correctness and context cost; builder self-reports and green CI no longer count. Nine PRs merged on 2026-10-13 without one. — MendixMau
22
22
- process(context): **the baseline word budget is made room for by moving text, never by deleting rules.** Rules, STOP rows, denominators and failure examples are protected; stories and examples move behind pointers in a separate, independently reviewed trim PR; a trim PR lands first when a PR would take the baseline within 2,000 words of the cap. — MendixMau
23
23
- fix(page-fidelity): **text is matched against what the page shows, on whole words; ButtonStyle counts as `btn btn-<style>`; layout chrome comes from the layout** ([#158](https://github.com/MendixMau/mxcli-project-toolkit/issues/158), [#157](https://github.com/MendixMau/mxcli-project-toolkit/issues/157)). Headings, actions and content were a substring test over the whole page MDL with 60% of the >3-char words enough, so a wireframe H2 "Product overview" counted as present on a page named `Product_Overview`, "Deactivate product" on a button captioned "Deactivate", and an "Add" button passed with no words to test. Each wireframe string is now matched per literal against the page's own captions — headings against Title/Content/non-button Captions, actions against button Captions, content against every displayed literal — on whole words, all of them for a label under three words; bindings keep the identifier corpus. An `actionbutton` now declares `btn` + `btn-<ButtonStyle>` (`btn-default` when DESCRIBE omits it), per the measured DOM contract in `learned-stylegallery.md`. The page's layout, when its MDL is in the input (`describe layout`), or `--chrome a,b`, adds to the fixed chrome set; without either nothing changes. Whole-word matching folds plurals (`Orders` = `Order`) on both sides, and multi-line ALTER `set (…) on w` statements count, including a ButtonStyle that replaces the old one. Scores move: of the 11 page/wireframe pairs already in the repo, 10 are unchanged and a stub page drops 66%→39% (a "Waiting for customer" heading credited from `dgWaiting` + `CustomerQuery`); the new probe pairs fail on the old scorer; a field run on a live project is still owed. — MendixMau
24
+
- skill(interaction-model, design-artifacts, runbook): **Stage 3 writes `design/interaction-model.md` before the first wireframe — a home per role, an inbox per user task, and per page how it is reached, its page parameter and its data view source; every wireframe opens with a `wf-contract` block (`Page parameter:`, `Reached from:`, `Drawn as role:`)** ([#291](https://github.com/MendixMau/mxcli-project-toolkit/issues/291), part 1 of 3). Three apps built with the toolkit passed every gate (Stage 3/4 PASS, page fidelity 81-89% on the affected pages, lint 0 errors, e2e 69/69) while one of them rooted 8 pages on a parameterless "current record" retrieve, gave all 6 roles one home page and put 3 process stages in a 6-item menu; the wireframes were drawn as one role with one record, so every downstream check inherited the defect. Routed on demand, Stage 3, lead + ba + architect; the gate facts and the model-side check are follow-ups. — MendixMau
25
+
- chore(context): **baseline word budget freed — 79,735 → 75,963 words (−3,772) without dropping a rule.** The always-on tier sat 265 words under its 80,000 cap, so three open PRs could not all merge. Long incident narratives in `conversion-runbook.md`, `source-triage.md` and `interview-protocol.md` became one-line failure examples pointing at new on-demand `process/baseline-incident-history.md`, where the original text is kept verbatim per section (R1–R20, AR1, ST1–ST4, IP1–IP3); the runbook's copy of the open-questions status table now defers to `interview-protocol.md` §4; `agent-roles.md`'s six template shapes (setup-only, ~2,300 words) moved verbatim to `agents/README.md`, which the installers never copy (explicit `MXTK_AGENTS` list). Every STOP, rule, denominator and gate cell stays in place; files touched by open PRs were left alone. — MendixMau
24
26
- learn(testing-shape, test-result-audit): **three test-strength rules, each with a denominator: refusals probed on the server, every undeclared 4xx a failure, one clean-database final run** ([#172](https://github.com/MendixMau/mxcli-project-toolkit/issues/172)). A field comparison of two builds against one frozen spec found the toolkit build checked permission refusals only in the client (a hidden menu item), logged unexpected 400/422 responses as information, and reached 20/20 by stitching three runs. `testing-shape.md` §7 gains three report lines (`N of N restricted pairs probed server-side`, `undeclared 4xx/5xx: 0 of M requests — each fails its step`, `one clean-DB run <id>: N of N scenarios incl. timers, not stitched`); `test-result-audit.md` gains check 2e, which carries the reasons and the field evidence and asks for those numbers. Both baseline skills stay inside the 80,000-word baseline budget (79,997): the reasons live in the on-demand audit skill, and two redundant sentences in `testing-shape.md` §4's verdict paragraphs were folded (the empty-set corollary is stated in the Trace row, `harness-architecture.md` and `report-schema.md`). The backing inbox note is trimmed to its unpromoted "Keep" items. — MendixMau
25
27
- learn(learned-detection-gaps, module-review): **two UI defects every model gate passes: a lazy-loaded combo box filter hides its preset, and a theme that pins row heights by position lets the next row cover an inserted widget** ([#299](https://github.com/MendixMau/mxcli-project-toolkit/issues/299)). Both passed check, mxbuild, lint and the scripted checks on a 127-module production app and were found only in the running app. Two register rows with the first oracle and the pre-build check (pluggable properties that change *when* data loads; grep the theme for fixed `height` on positional row classes before an insert), and two LOOK lines in `module-review.md` §4c with denominators (`N of N filters show their preset on first load`, `N of N widgets inserted into an existing container fully visible`). — jopterhorst
26
28
- fix(app-restart, test-stack-up): **a port held by another process before `run --local` is named and reported as "instrument blocked" (exit 4), never killed** ([#262](https://github.com/MendixMau/mxcli-project-toolkit/issues/262)). Studio Pro had started its own runtime on the app/admin ports a restart needed; `mxcli run --local` then failed with "Authentication failed" (the admin API answering was Studio Pro's), the next journey ran against Studio Pro's runtime, and four more runs were NOT RUN. `app-restart.sh` now checks the app port and the admin port (record's `adminPort`, else app + 10) before stopping anything — a holder outside the recorded process tree exits 4 with its name, pid and parent — and again after the stop, where anything still holding a port is by definition not ours. `test-stack-up.sh` runs the same check wherever it would tell you to start `run --local` (`--no-docker`, no Docker daemon, `--check` with a leftover record), on the record's ports, `RUN_LOCAL_APP_PORT`/`RUN_LOCAL_ADMIN_PORT`, or mxcli's defaults 8080/8090. Holder lookup: lsof, then ss, then netstat + tasklist on Windows; unnamed holders still block when nothing of ours is running. Fixtures: `test-app-restart.sh` +2 cases (14 assertions, all fail on the old script), `test-stack-up-local.sh` T7 (4 of 6 fail on the old script). — AlvinnYeo
Copy file name to clipboardExpand all lines: README.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -580,6 +580,7 @@ Every mxcli project has a `.ai-context/skills/` directory (bundled by `mxcli ini
580
580
| After every wireframe edit: assembles design/wireframes/*.html into design/prototype.html, one hash-routed page a stakeholder can click through instead of twenty separate files. Generated, never edited (design-artifacts.md Step 3) |`project-bin/assemble-prototype.js`|
581
581
| Before wireframes pass to the build loop, and with --brd before a BRD is signed off: dead #/route links, orphan screens, controls with no data-bind and no data-cut, BRD routes no screen has, screens no use case walks (design-artifacts.md Step 3c, brd-validation.md check 8) | `project-bin/check-prototype-links.js` |
582
582
| Designing the brand and ONE ANNOTATED WIREFRAME PER SCREEN before building pages — the design system alone is half the deliverable |`skills/design-artifacts.md`|
583
+
| Stage 3, after the role model is CONFIRMED and BEFORE THE FIRST WIREFRAME — and any time a page shows ONE object, a menu item or home page is added, or a data source retrieves the current/first record: role homes, inboxes, and per page how it is reached and which object it takes as parameter |`skills/interaction-model.md`|
583
584
| Before a wireframe or a design commits to a WIDGET, when a requirement shows a widget to one role and not another, and when a page script hits a parse error that looks like a syntax mistake: the short list of things MDL cannot write at all, and the four-minute probe that answers it at Stage 3 instead of at build time|`skills/learned-mdl-cannot-express.md`|
Copy file name to clipboardExpand all lines: ROUTING.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -126,6 +126,7 @@ picks the row up. That is the whole procedure — there is no second list to rem
126
126
| After every wireframe edit: assembles design/wireframes/*.html into design/prototype.html, one hash-routed page a stakeholder can click through instead of twenty separate files. Generated, never edited (design-artifacts.md Step 3) |`project-bin/assemble-prototype.js`| architect,review | 3 | ondemand |
127
127
| Before wireframes pass to the build loop, and with --brd before a BRD is signed off: dead #/route links, orphan screens, controls with no data-bind and no data-cut, BRD routes no screen has, screens no use case walks (design-artifacts.md Step 3c, brd-validation.md check 8) |`project-bin/check-prototype-links.js`| architect,review | 3 | ondemand |
128
128
| Designing the brand and ONE ANNOTATED WIREFRAME PER SCREEN before building pages — the design system alone is half the deliverable |`skills/design-artifacts.md`| architect | 3 | ondemand |
129
+
| Stage 3, after the role model is CONFIRMED and BEFORE THE FIRST WIREFRAME — and any time a page shows ONE object, a menu item or home page is added, or a data source retrieves the current/first record: role homes, inboxes, and per page how it is reached and which object it takes as parameter |`skills/interaction-model.md`| lead,ba,architect | 3 | ondemand |
129
130
| Before a wireframe or a design commits to a WIDGET, when a requirement shows a widget to one role and not another, and when a page script hits a parse error that looks like a syntax mistake: the short list of things MDL cannot write at all, and the four-minute probe that answers it at Stage 3 instead of at build time |`skills/learned-mdl-cannot-express.md`| architect,mdl | 3,5 | ondemand |
130
131
| A style change that appears to have done nothing, a focus ring that paints on every page landing, or an app still grey after a design port every instrument called green — the three ways a correct rule paints nothing (matches nothing / matches chrome / loses the cascade), the two reads that tell them apart, and the class that arrived in the stylesheet and is bound to no widget |`skills/learned-css-that-never-applied.md`| mdl,review,gate | 5,6 | baseline |
0 commit comments