Repository navigation
Conversation
…push build and unit tests move to module close (#686) PROJECT.md `Pipeline mode: high-speed | balanced | high-quality`; no line = balanced. balanced: per row the exec gate + one 1280 LOOK; journeys, 390+1280 LOOK, a bounded polish loop (85% fidelity AND a written LOOK, max 3 rounds) and unit tests at module close; the pre-push full mxbuild once per module (hook v2). high-speed: no per-row LOOK, 75%/2. high-quality: master's per-row cadence + pre-push build every push, 95%/5. `UI polish:` overrides the polish numbers. Intake Q15 asks the mode. Read via new _common.sh helpers mxtk_pipeline_mode / mxtk_ui_polish (exec.sh, module-close.sh, pre-push hook). Field run: #686 (19 min/row average, up to 41; per-row LOOKs 0 unique catches over 42 findings). Always-loaded words 65,053 -> 65,053 (narratives moved verbatim to process/baseline-incident-history.md). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jQvaonym9V1wKKfAEPmRr
A: honour the journeys column of a CONFIRMED `## Test strategy` "Every change" row, not only unit. B: correct the #686 defect figure (about 7 of about 10). C: sync-project.sh prints one line when PROJECT.md has no `Pipeline mode:`. D: intake Q15 says estimated >=8 min less per row. E: drop the dangling pointer in UI7. F: module-close.sh records its full build for the pre-push hook; the hook also builds with no build recorded, after 10 deferred pushes, or on a Java fingerprint change. G: an unreadable mode builds (safe side). Also: a PROJECT.md comment line no longer reads as a `Pipeline mode:` setting. Fixture test-module-close-cadence.sh: 50/50 (38 fail on master ee12a61). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jQvaonym9V1wKKfAEPmRr
This was referenced Nov 6, 2026
…e polish cap; high-quality 90%/5 (#686, PR #700 experiment) P1: mxtk_change_class marks a page script with its co-located GRANT as logic, so balanced printed "the exec gate only" for 8 of 10 page scripts in the mode experiment. The class still decides the tests; any page/snippet/layout statement now adds the mode's per-row page check (balanced: 1280 LOOK; high-quality: journeys + 390/1280 LOOK; high-speed: none, said so). (b) module-close.sh writes a `Polish: n of cap` row per page (template; no gate). (c) high-quality polish default 90% / 5 rounds: a correct first-build popup reached 86% statically. Fixture test-module-close-cadence.sh: 55/55 (42 fail on master ee12a61). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jQvaonym9V1wKKfAEPmRr
…sh, verify-model.sh and the hook (PR #700 re-review) exec.sh recorded mxtk_java_fp of PROJECT_ROOT while the hook compared the model dir, so on a two-tree checkout every push read as a Java change. Deeper: mxtk_java_fp ran `git hash-object --stdin-paths` with cwd-relative names, which git resolves from the top level, so in any folder below it the hashing failed and the fingerprint never changed. New _common.sh helper mxtk_model_java_fp (model folder via find_model_dir) used by all three; mxtk_java_fp now lists --full-name and hashes from the top (single-tree values unchanged). exec.sh's Java-actions probe also looks in the model folder. Intake Q15: "an estimate from #686's field data". Fixture test-module-close-cadence.sh: 59/59 (45 fail on master ee12a61), new T1-T3 two-tree cases. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jQvaonym9V1wKKfAEPmRr
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
The cadence of the per-row proof stack is now a project setting: pipeline modes. PROJECT.md
Pipeline mode: high-speed | balanced | high-quality. No line meansbalanced.The single source of this table is
skills/iterative-build-loop.md§ "Pipeline mode". The other skills say "balanced" and point there.Cut 1: journeys and the dual-viewport LOOK move to module close.
project-bin/exec.sh(change_lane, ~:497–535) prints the lane for the mode and names it (test lane (…; Pipeline mode: balanced)). The init-project CLAUDE.local.md text (bin/init-project.shstep 5) now asks for one viewport per page script and both at module review. It also names the three modes. The protected 2026-09-19 "a fidelity score is not a LOOK" line is unchanged.skills/ui-loop.md,testing-shape.md,ui-preflight-pages.mdandcheckpoint-build.mdchange only where they stated the per-row cadence.skills/dispatching.mdgets the STOP row Research: Stage 5 per-row cost (avg 19 min, up to 41 min per build-plan row), where the time goes and what the toolkit should prescribe instead #686 proposed: a per-row brief carries only the per-row checks of the project's mode.The per-row page check keys on page statements, not on the change class. The class still decides the tests. But any CREATE/ALTER PAGE, SNIPPET or LAYOUT statement now also adds the mode's per-row page check:
So a page script with its co-located GRANT, which classifies as
logic, gets both the logic lane's tests and the page check. This came from the mode experiment below.Cut 2: the pre-push full mxbuild runs once per module.
project-bin/install-project-hooks.shwrites a pre-push hook v2. UnderGate mode: check, a stamp that says the model was only mx-checked now leads to a full build only when one of these holds:docs/progress/module-close/*.mdreport is newer than the hook's last full build (.claude/loop/prepush-build.last, written only on a passing build);docs/progress/module-close/;high-quality;MXTK_PREPUSH_BUILD=alwaysis set.It also builds in these cases:
MXTK_PREPUSH_MAX_DEFERRED(10) pushes in a row deferred it, so a project that never runs module-close still gets one;_common.sh). Unsure means build.module-close.shrecords its own full build for the hook, after writing its report, so the next module's first push does not build again. Otherwise the hook prints one line saying the build is deferred to module close.--checkaccepts only v2, sosync-project.shrefreshes a v1 hook. Our own v1 hook is replaced in place, never chained.Cut 3: unit tests run per module. The per-row driver is the
affected tests: ./bin/affected-tests.sh <script>pointer that exec.sh prints. In balanced and high-speed it now printstests owed at module close: ./bin/affected-tests.sh --moment module --module <Module>. Per-row tests stay in two cases.high-qualitykeeps everything per row. Below it, a## Test strategyrowEvery changeis honoured column by column: a unit scope keeps unit tests per row, and a journeys scope keeps the reached pages' journeys per row. A CONFIRMEDaffected | affectedrow therefore keeps both. The CAC-5 offer now defaults that row tonone (exec gate only) | none.affected-tests.shitself is unchanged apart from a comment: it is a calculator and still lists a change's touched set when asked.PROJECT.md'sUnit tests defaultand module flips still decide which modules have unit tests at all.Module-close polish loop (maintainer addition).
module-close.sh's report now names the journeys and unit tests owed and the 390 + 1280 LOOK. It also gives the bounded polish loop per page, with that mode's numbers:design/ui-reviews/and reported at the gate. It does not block the module.UI polish: <N>% / <R> roundsin PROJECT.md overrides either number in any mode. The round cap is not enforced: the agent counts the rounds. The report carries onePolish: n of caprow per page to count in. It is a template only; no gate reads it yet. ThePage | Roletable stays last, becauserow-groups.shreads it.One Java fingerprint, taken from the model folder. exec.sh (gate kind), verify-model.sh and the pre-push hook all call
mxtk_model_java_fpin_common.sh. It fingerprints the folder that holds the.mpr, which isapp/on a two-tree checkout.mxtk_java_fpnow lists--full-namepaths and hashes from the repository top. Before this,git hash-object --stdin-pathscould not open the cwd-relative names below the top, so on a two-tree checkout the fingerprint never changed and a Java edit never forced a full build. Single-tree fingerprints are byte-identical to master's.Settings reading.
_common.shhad no PROJECT.md setting helper (exec.sh's_first_matchis private to exec.sh, and the pre-push hook cannot reach it). So this PR addsmxtk_pipeline_modeandmxtk_ui_polishto_common.sh. exec.sh, module-close.sh and the pre-push hook all call them. The hook sources_common.shthe same way the post-commit hook already does forresolve_py. EnvMXTK_PIPELINE_MODEwins. An unrecognised value reads as balanced, and the lane prints the mode in effect.sync-project.sh prints one line when PROJECT.md has no
Pipeline mode:line: "Pipeline mode not set → balanced: journeys, the 390+1280 LOOK and the full build now run at module close. SetPipeline mode: high-qualityin PROJECT.md to keep the old per-row cadence."Intake Q15 asks for the mode in plain words, with three options and their trade-offs. A new PROJECT.md gets
Pipeline mode: balancedplus a short comment.sync-project.shreports Q15 as missing on existing intakes and appends it only with--repair-intake, the existing contract. This changes no behaviour.Disclaimer. "Screens are polished and checked at module close; mid-module pages may look rough, that's expected." It prints under the lane (balanced and high-speed) and on the progress report's build tab.
Word budget: three incident narratives were moved, verbatim, to
process/baseline-incident-history.md(UI5, UI6, UI7, DP1), each leaving a one-line pointer. Moved:ui-loop.md"why cadence",module-review.md4a-0 gallery measurement and rows 8–9 history, anddispatching.mdrestart history. No rule, STOP row or denominator was removed.Mode experiment (build run on 19a848a, same plan in all three modes)
mxtk_change_classmarks any script that contains GRANT, ALTER NAVIGATION or CREATE MICROFLOW aslogic, and the toolkit mandates co-located page grants. So 8 of 10 page-creating scripts printed "per row: the exec gate only" under balanced. In practice balanced ≈ high-speed per row, and high-quality ≈ balanced plus a build. Fixed above; fixture E9.module-close.sh. The push after close did not build, because the stamp was already full. In high-quality, 9 of 10 pushes ran a full build, with 0 errors. No full-build-only error first appeared at module close (the app has no Java actions, so the risk was low).module-close.shprinted the right numbers per mode. The cap had no counter, hence the newPolish: n of caprows. Two screens stayed at 86% static fidelity from row 9/13 to module close in all three arms, so high-quality's default is lowered from 95% to 90% / 5.## Test strategy, andUnit tests default: noleft nothing to run per row, so no arm ran unit tests or journeys per row.Why (#686 numbers)
exec.shwas only about 8% of wall-clock; most of the time went to per-row journeys, both viewports and screenshot sets.Time cost (per #687)
mxcli test)mxcli testmeasured ~6 min)Estimated ≥8 min per row saved in balanced.
high-qualitycosts the same as master per row and adds a stricter polish loop at close.Regression risk after
sync-project.shPipeline mode:line meansbalanced. After sync, a project's exec.sh stops pointing at per-row journeys and per-row unit tests. Its pre-push hook (refreshed to v2 by sync, because--checkfails on v1) stops building on every push. A project that wants today's behaviour addsPipeline mode: high-quality. The CHANGELOG line says so in bold.## Test strategyrowEvery changenames a scope keeps that column per row in any mode. Projects that accepted the old CAC-5 default (affected, modules on only | affected) are in this group, which means their CONFIRMED decision wins over balanced. To take cuts 1 and 3 they set that row tonone | none.mxtk-module-close:summary line and keeps thePage | Roletable last;bashspawn to source_common.sh. If_common.shis old or missing, the mode reads as balanced.$b/..(the project root the hook already used) or_common.sh'sPROJECT_ROOT. Platforms: onlyfind -newer,sed -n,git diff/logand a bash here-string are used. There is no GNU-only flag, andcheck-portability.shis clean.Always-loaded words
bin/render-routing.sh --check: 65,053 before → 65,070 after (budget 80,000). That is +4 words for the journeys-column rule intesting-shape.mdand +13 for thePolish: n of Rpointer inmodule-review.md. The added mode/STOP/polish text is balanced by moving four incident narratives out verbatim.Field-validation plan
balanced(no line, orPipeline mode: balanced).progress-report/.claude/loop/metrics-ledger.tsvfor that module against the previous modules (baseline: 19 min average, Research: Stage 5 per-row cost (avg 19 min, up to 41 min per build-plan row), where the time goes and what the toolkit should prescribe instead #686).module-close.shreport, Page | Role table, polish-loop gaps indesign/ui-reviews/) next to those found per row. Classify each defect by the step that could first have seen it.balanced.Proof
tests/wave2/test-module-close-cadence.sh: 59/59 pass. Against a worktree of master ee12a61, 45 fail. The 14 that pass there are guards that master's behaviour survives where it should. It covers:app/javasourcemeans a full build in the hook and in exec.sh;always, first push, report-newer, module-close commit, failing build, an unreadable mode, N deferred pushes, a Java fingerprint change, and v1 → v2;Polish: n of caprow (M5);check-scripts,check-portability, the leak guard (LEAKGUARD_ALLOW_NO_DENYLIST=1 LEAKGUARD_BASE=origin/master),check-pr-disciplineandrender-routing --checkare clean. No full suites were run.test-exec-gate-kind.shK8c–e now run withMXTK_PREPUSH_BUILD=always, because the every-push build is opt-in;test-test-strategy-docs.shasserts the new CAC-5 default row and the mode-aware logic lane. Master's logic lane text is still asserted, since it is the high-quality branch.Review: pending independent review
https://claude.ai/code/session_013jQvaonym9V1wKKfAEPmRr
Generated by Claude Code