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 @@ -20,6 +20,7 @@ Sections dated before 2026-09-19 predate the cycle and stay as they are.
- fix(doctor, test-stack-up): **in a cloud container, a missing Docker daemon is now reported as normal, with the Docker-free route, instead of a warning that says to start it.** The Claude Code on the web container has the docker CLI but no daemon, and the agent cannot start one. Doctor used to WARN "docker daemon is not responding … sudo systemctl start docker", so sessions tried, failed, and reported "cannot start the docker daemon" as a blocker, until the user said to use `mxcli run --local`. Now the cloud lane prints: no Docker here, normal, do not try to start it; build check = exec.sh's mxbuild gate; run the app = `./mxcli run --local`. On a desktop (Docker or Podman, stopped or absent) the warning and start hint stay, plus one line saying a container is optional: the mxbuild gate needs none, and Studio Pro's Run Locally or `mxcli run --local` runs the app. The no-runtime text no longer says the build check needs Docker. `test-stack-up.sh` with the app down and no reachable Docker/Podman now stops with the Docker-free route instead of failing inside `mxcli docker run`. — MendixMau
- fix(gate-check): **the stage-decision readers now read only the Decisions table, and Stage 7 accepts a dated CONFIRMED.** `has_confirmed_decision` (Stages 3 and 4) and the Stage 7 cutover check scanned every pipe row in the register, so an Open-questions row numbered 4 or 7 with Status CONFIRMED passed that stage with no decision behind it. Both now count only rows under a header whose first cell is `Stage`; a register with no such header keeps the old every-row scan. Stage 7 also matched the status string-exactly, so `CONFIRMED 2026-08-10` failed there while passing every other stage (TD-07); it now uses the same word-anchored match. Positive control: the pre-fix script passes Stages 4 and 7 on an Open-questions-only register and fails Stage 7 on the dated status. Fixture T13–T15 in `test-bug03-gates.sh` — MendixMau
- learn(bug-logs): **`BUG-DRAFT-grant-association-generalization-member`** — a member association owned by another module's entity cannot be named in a `grant` statement, so `revoke` + `re-grant` silently drops that member access and `mx check` reports CE0066; patch-only workaround provided. Found fixing a guest-groups association in a Mendix app (mxcli v0.23.0, Mendix 11.12.2). — MendixMau
- fix(routing, init-project, sync-project, agents): **routing tables are trigger lists now, not reading lists, and no setup file tells a session to read the whole runbook any more.** The line above every baseline table said "read a row when its Stage(s) cell names your stage", so a build session was told to read all 23 Stage 5 files, about 121k tokens, before touching the project, and every agent template was headed "Skills this agent must load". The runbook already said "How to read this file: not whole", but the `CLAUDE.local.md` that `init-project.sh` writes said "Read conversion-runbook.md FIRST — every session", and the ritual `sync-project.sh` appends said "re-read it in full" (~24k tokens, carried on every later call). Now: open a row's file when its trigger happens in this session and stage, never the table ahead, and a page task never opens the microflow rows; agent templates say the same above their table; the runbook row, `init-project.sh` and the ritual say "§1b plus your own stage's section, not the whole file". No row changed tier, so every trigger stays visible to the main session and to each agent. Found by the context report behind `bin/context-audit.sh`. Existing projects pick the new wording up through `bin/sync-project.sh` where the block is marked; a hand-written `CLAUDE.local.md` needs the two lines edited by hand. — MendixMau
- chore(inbox): **triage of `contrib/inbox/`: removed 15 promoted/obsolete files, gave the rest neutral names and scrubbed identifiers.** Gone: the ten machine-diff `*-patches.md` files from 2026-09-14, the 2026-09-27 field-project patch file, the built company-brain idea, and three already-promoted or superseded bug dumps. Kept for now: `2026-09-27-mxcli-upstream-issues.md`, because five drafts under `bug-logs/pending-github-issues/` cite it as their source. Four remaining files were renamed to `field-project-{a,b,c}` names; project and app names, home-style paths and personal names inside the 17 remaining entries were replaced with neutral labels or placeholders (technical content unchanged). — MendixMau
- learn(learned-mdl-preflight, learned-detection-gaps, microflow-preflight, testing-shape, learned-mdl-cannot-express, learned-page-patterns, rest-integration-first-time-right, journey-proof, learned-datagrid-customcontent-binding): **the skills side of BUG-142 to BUG-154.** STOP row 12 rewritten shorter for v0.24.0 — `ContentParams` takes a bare attribute or a quoted literal only, and the `toString(Attr)` fix it taught no longer builds; row 14 notes a narrowing `grant` merges, row 23 that `diff` prints false `-`/`~` lines. Detection gaps: the ContentParams row now covers any object-bound `dynamictext` and says check passes `if … then … else`; reserved words cover entities; new CE1870 row. microflow-preflight: CONV013 false positive and doc-comment round-trip resolved from "Not verified"; error handler without `return` is the second merge-overlap shape. testing-shape: `--test-endpoint` writes into the working model until a clean stop; `run --local` starts with scheduled events off (new register row). Also: five cannot-express rows (tab badge, validate-while-typing, AppTitle, always-open nav groups, sidebar toggle / page-load / Marketplace layout) and the DG2 `emptyplaceholder` correction; control-bar attributes, nested list view `Editable` and REPLACE-not-re-run-safe in page patterns; v0.24.0 REST bullets; two OQL journey traps. Triages three inbox notes (ContentParams, REST/JSON/page field notes, scheduled events) — card-disbursement requirements-driven build
- fix(project-bin/check-design-reaches-app.sh): **the model directory now comes from `find_model_dir`, and a knob file it cannot read is a fault, never clean.** #162 added a one-level `app/*.mpr` probe; this replaces it with `find_model_dir` in `_common.sh` (`$PROJECT_ROOT`, `$MPR_FILE`, the `app/` probe), plus an `app/theme` / `app/deployment` probe when no `.mpr` is found. The fault is the part #162 did not cover: a missing knob file, or one that declares no knobs, printed "knobs bound 0 of 0" under `clean` with exit 0; it now reports `FAULT … UNMEASURED` and exits 2. The knob file can also be passed as a third argument. Fixture: `tests/wave2/test-design-reaches-app.sh` cases 9–10 (both layouts, with and without an `.mpr`, missing and empty knob file, overrides). Field run: a Stage 5 obligation pass on a two-tree Mendix 11.14 app, 0 of 0 before, 26 of 30 knobs and 157 of 157 tokens after, with no arguments — a two-tree greenfield build
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -757,15 +757,15 @@ The "When to use which skill" table above is *situational* — load a skill when
<!-- Generated from bin/lib/skill-routing.tsv by bin/render-routing.sh.
Do not hand-edit between the markers: add or change the ROW, then re-render. -->
<!-- ROUTING:BEGIN readme-baseline -->
Read a row when its Stage(s) cell says *every stage* or names the stage the register (PROJECT.md) says you are in. Rows for other stages are not this session's reading.
Each row is a trigger, not a reading list: open a row's file when the first column happens in this session, and only rows whose Stage(s) cell says *every stage* or names the stage the register (PROJECT.md) says you are in. Do not read the table ahead — a build session that only writes pages never opens the microflow rows.

| Always relevant for | Reference this | Stage(s) |
|---|---|---|
| Before writing any .js or .sh for a check, gate or report — and before adding a rule to an existing one: judgement goes in a skill, code only fetches facts a reader cannot | `skills/skills-over-scripts.md` | every stage |
| Any pass whose input is missing, stale or unresolvable — before recording UNMEASURED, N/A or a silent skip: name what was missing, say what you assessed against instead, still deliver a verdict | `skills/degrade-to-judgement.md` | every stage |
| Any time an exit code, a tool's output or a subagent's report is about to become a stated finding — verify before you conclude | `skills/tool-output-is-not-ground-truth.md` | every stage |
| Before obeying any learned-* STOP or workaround that costs a detour — probe the binary you actually have, then stamp the verdict back into the rule | `skills/retesting-learned-rules.md` | every stage |
| Any pipeline work at all — every session, before producing any stage artifact (not just "when unsure"); READMEs and the guide are orientation only | `skills/conversion-runbook.md` | P,0,1,2,3,4,5,6,7 |
| Any pipeline work at all — every session, before producing any stage artifact: read §1b plus your own stage's section, not the whole file (gate-check.sh prints the line spans); READMEs and the guide are orientation only | `skills/conversion-runbook.md` | P,0,1,2,3,4,5,6,7 |
| Any question before asking the user or writing anything — query the model, then read the source, then ask the human, in that order | `skills/query-the-model.md` | P,0,1,2,3,4,5,6,7 |
| Putting a question TO the user — any gate, any stage: ask in chat not in a file, two named options plus your recommendation, one batch per gate then end the turn | `skills/interview-protocol.md` | P,0,1,2,3,4,5,6,7 |
| Any stage transition — the 2+1 format every CAC uses, and the one-register rule (answers land in PROJECT.md, never in a separate state file). The seven CACs themselves are routed per stage in the situational table | `skills/checkpoints/checkpoint-template.md` | 0,1,2,3,4,6,7 |
Expand Down
2 changes: 1 addition & 1 deletion ROUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ picks the row up. That is the whole procedure — there is no second list to rem

| Always relevant for | Load this | Agent(s) | Stage(s) | Tier |
|---|---|---|---|---|
| Any pipeline work at all — every session, before producing any stage artifact (not just "when unsure"); READMEs and the guide are orientation only | `skills/conversion-runbook.md` | all | P,0,1,2,3,4,5,6,7 | baseline |
| Any pipeline work at all — every session, before producing any stage artifact: read §1b plus your own stage's section, not the whole file (gate-check.sh prints the line spans); READMEs and the guide are orientation only | `skills/conversion-runbook.md` | all | P,0,1,2,3,4,5,6,7 | baseline |
| Any question before asking the user or writing anything — query the model, then read the source, then ask the human, in that order | `skills/query-the-model.md` | all | P,0,1,2,3,4,5,6,7 | baseline |
| Before writing any .js or .sh for a check, gate or report — and before adding a rule to an existing one: judgement goes in a skill, code only fetches facts a reader cannot | `skills/skills-over-scripts.md` | all | - | baseline |
| Any pass whose input is missing, stale or unresolvable — before recording UNMEASURED, N/A or a silent skip: name what was missing, say what you assessed against instead, still deliver a verdict | `skills/degrade-to-judgement.md` | all | - | baseline |
Expand Down
6 changes: 4 additions & 2 deletions agents/architect-agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,16 @@ You own architecture and build-plan decisions for {{PROJECT}}. Hard rule: you ne
- **Domain glossary (5–10 terms):** {{GLOSSARY}}
- **Where the truth lives:** BRDs at {{BRD_PATH}}, decisions in {{PROJECT_MD_PATH}}, architecture artifacts in {{ARCHITECTURE_DIR}}

## Skills this agent must load
## Skills — open each one when its trigger fires
<!-- Generated from mxcli-project-toolkit/bin/lib/skill-routing.tsv by bin/render-routing.sh.
Do not hand-edit between the markers: add or change the ROW, then re-render.
Paths are relative to the toolkit root given in the CLAUDE.local.md Wiring block. -->
<!-- ROUTING:BEGIN agent:architect -->
Open a file when its When cell happens in your task, not all of them at the start. A page task never opens the microflow rows; a microflow task never opens the page rows.

| Load this | When |
|---|---|
| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact (not just "when unsure"); READMEs and the guide are orientation only |
| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact: read §1b plus your own stage's section, not the whole file (gate-check.sh prints the line spans); READMEs and the guide are orientation only |
| `skills/query-the-model.md` | Any question before asking the user or writing anything — query the model, then read the source, then ask the human, in that order |
| `skills/skills-over-scripts.md` | Before writing any .js or .sh for a check, gate or report — and before adding a rule to an existing one: judgement goes in a skill, code only fetches facts a reader cannot |
| `skills/degrade-to-judgement.md` | Any pass whose input is missing, stale or unresolvable — before recording UNMEASURED, N/A or a silent skip: name what was missing, say what you assessed against instead, still deliver a verdict |
Expand Down
6 changes: 4 additions & 2 deletions agents/ba-agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,15 @@ You run discovery and the interview gates for {{PROJECT}}. You never touch the `

## Ground rules

## Skills this agent must load
## Skills — open each one when its trigger fires
<!-- Generated from mxcli-project-toolkit/bin/lib/skill-routing.tsv by bin/render-routing.sh.
Do not hand-edit between the markers: add or change the ROW, then re-render. -->
<!-- ROUTING:BEGIN agent:ba -->
Open a file when its When cell happens in your task, not all of them at the start. A page task never opens the microflow rows; a microflow task never opens the page rows.

| Load this | When |
|---|---|
| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact (not just "when unsure"); READMEs and the guide are orientation only |
| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact: read §1b plus your own stage's section, not the whole file (gate-check.sh prints the line spans); READMEs and the guide are orientation only |
| `skills/query-the-model.md` | Any question before asking the user or writing anything — query the model, then read the source, then ask the human, in that order |
| `skills/skills-over-scripts.md` | Before writing any .js or .sh for a check, gate or report — and before adding a rule to an existing one: judgement goes in a skill, code only fetches facts a reader cannot |
| `skills/degrade-to-judgement.md` | Any pass whose input is missing, stale or unresolvable — before recording UNMEASURED, N/A or a silent skip: name what was missing, say what you assessed against instead, still deliver a verdict |
Expand Down
6 changes: 4 additions & 2 deletions agents/gate-agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,16 @@ back to v1 and deleting `mprcontents/`, and `test` writes too. Two consecutive r
comparable, and the project's write-approval rule applies to them. Confirm against the project's
own bug log before running anything you have not run here before.

## Skills this agent must load
## Skills — open each one when its trigger fires
<!-- Generated from mxcli-project-toolkit/bin/lib/skill-routing.tsv by bin/render-routing.sh.
Do not hand-edit between the markers: add or change the ROW, then re-render.
Paths are relative to the toolkit root given in the CLAUDE.local.md Wiring block. -->
<!-- ROUTING:BEGIN agent:gate -->
Open a file when its When cell happens in your task, not all of them at the start. A page task never opens the microflow rows; a microflow task never opens the page rows.

| Load this | When |
|---|---|
| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact (not just "when unsure"); READMEs and the guide are orientation only |
| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact: read §1b plus your own stage's section, not the whole file (gate-check.sh prints the line spans); READMEs and the guide are orientation only |
| `skills/query-the-model.md` | Any question before asking the user or writing anything — query the model, then read the source, then ask the human, in that order |
| `skills/skills-over-scripts.md` | Before writing any .js or .sh for a check, gate or report — and before adding a rule to an existing one: judgement goes in a skill, code only fetches facts a reader cannot |
| `skills/degrade-to-judgement.md` | Any pass whose input is missing, stale or unresolvable — before recording UNMEASURED, N/A or a silent skip: name what was missing, say what you assessed against instead, still deliver a verdict |
Expand Down
6 changes: 4 additions & 2 deletions agents/mdl-agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,16 @@ architecture, build plan, BRDs) live in the **`## Wiring` block of the project-r
the single source of truth. Read that block at the start of every task and resolve paths from it. When
a rule below names an asset (e.g. "the wireframe", "the brief"), it means the path from that block.

## Skills this agent must load
## Skills — open each one when its trigger fires
<!-- Generated from mxcli-project-toolkit/bin/lib/skill-routing.tsv by bin/render-routing.sh.
Do not hand-edit between the markers: add or change the ROW, then re-render.
Paths are relative to the toolkit root given in the CLAUDE.local.md Wiring block. -->
<!-- ROUTING:BEGIN agent:mdl -->
Open a file when its When cell happens in your task, not all of them at the start. A page task never opens the microflow rows; a microflow task never opens the page rows.

| Load this | When |
|---|---|
| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact (not just "when unsure"); READMEs and the guide are orientation only |
| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact: read §1b plus your own stage's section, not the whole file (gate-check.sh prints the line spans); READMEs and the guide are orientation only |
| `skills/query-the-model.md` | Any question before asking the user or writing anything — query the model, then read the source, then ask the human, in that order |
| `skills/skills-over-scripts.md` | Before writing any .js or .sh for a check, gate or report — and before adding a rule to an existing one: judgement goes in a skill, code only fetches facts a reader cannot |
| `skills/degrade-to-judgement.md` | Any pass whose input is missing, stale or unresolvable — before recording UNMEASURED, N/A or a silent skip: name what was missing, say what you assessed against instead, still deliver a verdict |
Expand Down
Loading
Loading