diff --git a/CHANGELOG.md b/CHANGELOG.md index baf8a4e2..b7202542 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ Sections dated before 2026-09-19 predate the cycle and stay as they are. Named m ## Unreleased +- fix(install-manifest): **a clean toolkit checkout passes its own `project-bin/` manifest self-check, so adopters no longer see the "named by NEITHER list" warning at the top of every sync.** `coverage-check-all.sh` (found by `review-module.sh` through its `_tool` lookup in the toolkit clone) and `ts-sync.sh` (UNPROVEN and SUPERSEDED per its header) join `MXTK_PROJECT_BIN_NOINSTALL` with reasons. New `tests/wave2/test-manifest-clean-checkout.sh` fails, rather than warns, when a `project-bin/` file is in neither list. — joshuamoesa (#381) - fix(sync-project): **the "Baseline-only skills cited" warning no longer fires on the toolkit's own wiring block, and no longer sizes a section that does not exist.** The check grepped all of `CLAUDE.md` for `skills/learned-mdl-preflight.md` / `skills/query-the-model.md`, and `wire-agents.sh`'s `mxtk:wiring` block cites the first, so every sync flagged the toolkit's own text; with no "mxcli-project-toolkit Integration" heading it then printed a whole-file word count as "heading to EOF". The wiring block is now stripped before the grep, and the warning is raised only when the heading exists. `tests/wave2/test-sync-dup-heading-exit.sh` T4 flips (no heading: no warning) and gains T7-T9. — joshuamoesa (#382) - learn(workflow, rest): **the v0.20-era workflow notes are marked superseded for mxcli v0.26.0:** `WAIT FOR NOTIFICATION` takes a name, `NOTIFY WORKFLOW` needs `TARGET Module.Workflow.Element` (CE0166 / MDL-WF16 without), mxcli writes the end-of-boundary-path marker itself so a boundary terminator is no longer a hand-add (the parallel-split terminator is a separate node and unchanged), and published REST `Authentication: (basic)` works (BUG-152 item 1: 401 / 401 / 200 proven, URL includes the resource segment). Sources: a five-app lab field run (Mendix 11.15, mxcli v0.26.0) and mxcli's public `write-workflows` skill and docs. `wf-add-path-terminators.py` already takes an `.mpr` since #294 (the reported crash was the older script). — TK-019 of a five-app lab report - learn(workflow): **a "compute, then branch" pattern in `workflow-structure-rules.md`: a workflow decision reads a Boolean or enumeration on the context and cannot call a microflow, so the rule is computed by an earlier call microflow into a context attribute (TK-023).** The same paragraph names the three limits a field run hit (called microflow returns Boolean, enumeration or nothing; decision expressions on the context only; single-outcome user task holds no activities, MDL-WF02 / CE1876). The call-microflow return rule and the lone-outcome rule were already in the skill (§5, `learned-workflow-patterns.md` §6); the report's claim that an `exposed as workflow action` microflow cannot return a value was not adopted, because mxcli's own docs show one with `returns String`. — five-app lab report, TK-023 diff --git a/bin/lib/install-manifest.sh b/bin/lib/install-manifest.sh index e1c939d3..13a78191 100644 --- a/bin/lib/install-manifest.sh +++ b/bin/lib/install-manifest.sh @@ -126,7 +126,7 @@ MXTK_PROJECT_BIN="app-restart.sh test-scratch.sh assemble-prototype.js prototype # installed because a PROJECT runs it. report-disposition-check.sh is run by gate-check.sh out of # the toolkit clone, so a project copy would be a second copy nothing calls — which is how the # per-script lists drifted in the first place. -MXTK_PROJECT_BIN_NOINSTALL="report-disposition-check.sh" # gate-check.sh runs it from the TOOLKIT clone ($TOOLKIT_DIR/project-bin/, gate-check.sh:2149), never from a project copy — installing it would create a second copy nothing calls +MXTK_PROJECT_BIN_NOINSTALL="report-disposition-check.sh coverage-check-all.sh ts-sync.sh" # gate-check.sh runs it from the TOOLKIT clone ($TOOLKIT_DIR/project-bin/, gate-check.sh:2149), never from a project copy — installing it would create a second copy nothing calls; coverage-check-all.sh is run by review-module.sh through its _tool lookup (beside it, then the toolkit clone), so a project copy is optional and nothing calls it from bin/; ts-sync.sh is a toolkit-side transplant helper marked UNPROVEN and SUPERSEDED in its header (#381) # --- Starlark lint rules ----------------------------------------------------------------- # Copied from toolkit lint-rules/ into /.claude/lint-rules/. Two lists, because the diff --git a/tests/wave2/test-manifest-clean-checkout.sh b/tests/wave2/test-manifest-clean-checkout.sh new file mode 100755 index 00000000..48e8e8e3 --- /dev/null +++ b/tests/wave2/test-manifest-clean-checkout.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +# #381: a clean toolkit checkout must pass its own install-manifest self-check. Every file in +# project-bin/ is named by MXTK_PROJECT_BIN or MXTK_PROJECT_BIN_NOINSTALL, so the warning fires +# only when a contributor adds a file and forgets the manifest, never on every adopter's sync. +# This test FAILS (not warns) on an unnamed file. +# +# usage: test-manifest-clean-checkout.sh [toolkit-root] +set -uo pipefail +TK="${1:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}" +. "$TK/bin/lib/install-manifest.sh" 2>/dev/null || { echo "FAIL cannot source install-manifest.sh"; exit 1; } +OUT="$(_mxtk_manifest_check_bin_unnamed 2>&1)" +if [ -z "$OUT" ]; then echo " ok project-bin/ is fully named by the manifest"; echo "test-manifest-clean-checkout: 1 passed, 0 failed"; exit 0; fi +echo " FAIL project-bin/ holds files named by neither list:"; printf '%s\n' "$OUT" | sed 's/^/ /' +echo "test-manifest-clean-checkout: 0 passed, 1 failed"; exit 1