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
Lint receipt does not cover a project's edits to bundled rules, so mxcli's per-session refresh is charged to the next exec as a lint rise #524
mxcli's generated SessionStart hook runs mxcli init --sync-skills . at every session start and compaction, and that
rewrites any .claude/lint-rules/ file with a bundled name back to stock (mxcli side: mendixlabs/mxcli#1615). #264 and #461 cover
the toolkit's own four stock-named rules: the receipt holds their md5s, so a revert is caught as "lint BLIND" and, since #461, restored.
A project's own edit to a bundled example rule is not covered. example_microflow.star (CUSTOM002, microflow name
prefixes) is shipped by mxcli as an example to customise ("Customize the prefixes and patterns to match your project
standards"). A project that edits it, then takes a lint baseline, loses the edit at the next session start. The receipt
has no entry for that file, so lint-gate.sh has nothing to compare it against: the next exec would see CUSTOM002 rise (by about 38 on
one project) and charge the rise to that exec's script. Renaming the edited file does not help: --sync-skills recreates
the stock file beside it, so both run.
Reproduce
In a toolkit project, edit .claude/lint-rules/example_microflow.star (add prefixes), run lint, take the baseline.
mxcli init --sync-skills . (or start a new session, which runs it from the hook).
→ Refreshed 1 bundled lint rule(s) in .claude/lint-rules/ to match this mxcli: example_microflow.star
Run the lint gate (or bin/exec.sh on any script).
What follows (inferred, not yet run end to end): no BLIND, because grep -c example_microflow .claude/.mxtk-lint-receipt
→ 0; CUSTOM002 rises against the baseline and is reported as a rise caused by the script. Steps 1-2 (the revert itself)
were reproduced in a scratch folder on mxcli v0.27.0.
Expected
The receipt records the md5 of every bundled-name rule the project has edited (not only the toolkit's four), so a
refresh shows as lint BLIND: example_microflow.star reverted — or is restored the way exec: lint rules reverted to stock by mxcli's session-start sync end the run BLIND #461 restores the toolkit's
rules, from a versioned copy of the edit.
Field evidence 2026-10-24 (a Quality demo project, mxcli v0.26.0, three back-to-back headless sessions):
The session-start hook .claude/bootstrap-mxcli.sh runs ./mxcli init --sync-skills . || true on every start and every context compaction. Each time it prints "Refreshed 4 bundled lint rule(s) in .claude/lint-rules/ to match this mxcli". The files it overwrites are conv009_max_microflow_objects, conv010_act_microflow_content, data_change_microflows and entity_business_key (.star).
Those four rules are committed with project edits. After the refresh the lint ratchet no longer matches its baseline. The agent had to git checkout -- .claude/lint-rules/ twice in one session before the gate read 1617/1617 PASS again.
Each agent finds this on its own, and rounds 2 and 3 both spent time on it.
Suggested fix, same as above: --sync-skills should skip rule files the project has committed and changed (or warn and keep them), or the toolkit should ship its edited variants under its own names so the stock files can refresh safely.
Triage: DISCUSS track. Every fix either changes a gate verdict (a new BLIND / exit 1 where today the gate reports a rise) or how lint rules are named and installed (re-architecture). It affects every entry mode that runs the lint gate at Stage 5, plus à-la-carte assurance. The receipt gap is verified against the code. The revert mechanism was reproduced by the reporter on v0.27.0, and the maintainer's 2026-10-24 field note confirms it on v0.26.0. Problem:
The gap:project-bin/lint-gate.sh:200-252 checks only the rows in .claude/.mxtk-lint-receipt. bin/lib/install-lint-rules.sh:29 writes that receipt for rules the toolkit installed. A project's own edit to a bundled example (example_microflow.star, CUSTOM002) has no receipt row. So when mxcli's SessionStart init --sync-skills restores the stock file, the gate sees a CUSTOM002 rise and charges it to the next script.
The maintainer's note widens it: four committed rules with project edits (conv009…, conv010…, data_change_microflows, entity_business_key) are restored at every session start and compaction. Agents rediscover this independently each round (git checkout -- .claude/lint-rules/ twice in one session).
Value: High. It costs time in every multi-session project with edited rules, and a false rise blamed on a script is the kind of false red that sends people debugging the wrong thing. Options:
Receipt every edited bundled-name rule. When --update-baseline runs, record md5 + kind project for every .claude/lint-rules/*.star that differs from mxcli stock. A later revert then reads BLIND — reverted, not a rise. That's a new BLIND (exit 1) for projects with edits, an honest verdict but a flip. No extra mxcli calls. S–M.
Option 1, plus self-restore from git. If a receipt row reverted and the committed (HEAD) version matches the receipt md5, git checkout -- <file> it, print one warning line, and lint normally. Under guard rule 7 the gate unblocks itself. Risk: the gate writes to the working tree. One git call per reverted file. M.
Rename instead of edit. The toolkit ships its edited variants under its own names (mxtk_*.star) and lists the stock names in .claude/lint-rules-disabled.txt. The lint skill tells projects to copy-and-rename rather than edit a bundled file. The refresh can then restore stock files safely, because they are disabled. This changes the install layout and needs a sync-project.sh migration for existing projects. It is durable whatever mxcli does. M–L.
Recommendation: Option 3 for the toolkit's own four rules, which removes the cause. Option 2 as a safety net for project-edited examples until #1615 lands. Add one skill line now in lint-that-actually-runs.md, "an edit to a bundled rule is not durable; copy under a new name", whichever option is chosen. Decision needed from you: Should edited lint rules be protected by renaming (3), by the gate detecting and restoring them (1 or 2), or should we wait for mxcli (4)? Reply "go option N" to build it.
Option 1 shipped in #578 (squash a088b4e). --update-baseline receipts edited seeded rules, and a later revert by init --sync-skills reads BLIND — reverted with the git checkout remedy. The receipt:
ignores CRs;
covers only seeded rule names;
is written only on captured mxcli versions.
Field-checked: v0.27 overwrote an edit → BLIND, checkout → PASS; v0.28 keeps edited rules → no alarm. Option 3 (rename) is on the roadmap #579.
Activity
MendixMau commentedon Oct 24, 2026
Field evidence 2026-10-24 (a Quality demo project, mxcli v0.26.0, three back-to-back headless sessions):
.claude/bootstrap-mxcli.shruns./mxcli init --sync-skills . || trueon every start and every context compaction. Each time it prints "Refreshed 4 bundled lint rule(s) in .claude/lint-rules/ to match this mxcli". The files it overwrites areconv009_max_microflow_objects,conv010_act_microflow_content,data_change_microflowsandentity_business_key(.star).git checkout -- .claude/lint-rules/twice in one session before the gate read 1617/1617 PASS again.Suggested fix, same as above:
--sync-skillsshould skip rule files the project has committed and changed (or warn and keep them), or the toolkit should ship its edited variants under its own names so the stock files can refresh safely.🤖 Generated with Claude Code
MendixMau commentedon Oct 24, 2026
Triage: DISCUSS track. Every fix either changes a gate verdict (a new
BLIND/ exit 1 where today the gate reports a rise) or how lint rules are named and installed (re-architecture). It affects every entry mode that runs the lint gate at Stage 5, plus à-la-carte assurance. The receipt gap is verified against the code. The revert mechanism was reproduced by the reporter on v0.27.0, and the maintainer's 2026-10-24 field note confirms it on v0.26.0.Problem:
project-bin/lint-gate.sh:200-252checks only the rows in.claude/.mxtk-lint-receipt.bin/lib/install-lint-rules.sh:29writes that receipt for rules the toolkit installed. A project's own edit to a bundled example (example_microflow.star, CUSTOM002) has no receipt row. So when mxcli's SessionStartinit --sync-skillsrestores the stock file, the gate sees a CUSTOM002 rise and charges it to the next script.conv009…,conv010…,data_change_microflows,entity_business_key) are restored at every session start and compaction. Agents rediscover this independently each round (git checkout -- .claude/lint-rules/twice in one session).Value: High. It costs time in every multi-session project with edited rules, and a false rise blamed on a script is the kind of false red that sends people debugging the wrong thing.
Options:
--update-baselineruns, record md5 + kindprojectfor every.claude/lint-rules/*.starthat differs from mxcli stock. A later revert then readsBLIND — reverted, not a rise. That's a new BLIND (exit 1) for projects with edits, an honest verdict but a flip. No extra mxcli calls. S–M.HEAD) version matches the receipt md5,git checkout -- <file>it, print one warning line, and lint normally. Under guard rule 7 the gate unblocks itself. Risk: the gate writes to the working tree. Onegitcall per reverted file. M.mxtk_*.star) and lists the stock names in.claude/lint-rules-disabled.txt. The lint skill tells projects to copy-and-rename rather than edit a bundled file. The refresh can then restore stock files safely, because they are disabled. This changes the install layout and needs async-project.shmigration for existing projects. It is durable whatever mxcli does. M–L.Recommendation: Option 3 for the toolkit's own four rules, which removes the cause. Option 2 as a safety net for project-edited examples until #1615 lands. Add one skill line now in
lint-that-actually-runs.md, "an edit to a bundled rule is not durable; copy under a new name", whichever option is chosen.Decision needed from you: Should edited lint rules be protected by renaming (3), by the gate detecting and restoring them (1 or 2), or should we wait for mxcli (4)? Reply "go option N" to build it.
Generated by Claude Code
fix(lint-gate): a project-edited bundled rule lost to mxcli's session…
fix(lint-gate): #524 project rows ignore CRs, cover seeded rules only…
Bug sweep 2026-10-26: gates, runners, doctor, lint receipt, git hooks…
MendixMau commentedon Oct 26, 2026
Option 1 shipped in #578 (squash a088b4e).
--update-baselinereceipts edited seeded rules, and a later revert byinit --sync-skillsreadsBLIND — revertedwith thegit checkoutremedy. The receipt:Field-checked: v0.27 overwrote an edit → BLIND, checkout → PASS; v0.28 keeps edited rules → no alarm. Option 3 (rename) is on the roadmap #579.
Generated by Claude Code