Repository navigation
Conversation
#297) The loop sweep re-described every loop-containing microflow on every run: 1,917 describes in 2 h 45 at 6 workers on a 17,500-unit app (about 31 s each), while about 80 units had changed between rounds. - manifest.json stores a {UnitID: ContentsHash} snapshot of the .mpr Unit table and an mdl_index of the unit state each mdl/ file came from. - A refresh describes only new, changed or moved candidates, keeps the rest and deletes outputs of removed units. Full sweep on first run, --full, mxcli version change, or an unreadable Unit table. - UnitID -> name via mx-metadata-note.py units (shared Model base with the History-note code, no duplicate walk). The hash is computed from the .mxunit bytes: one stale Unit-table row was found in a field app's history. - bin/status.sh: "app map: N units changed since <date>" / "fresh". - skills/app-analysis.md: measured cost by app size. Fixture tests/wave2/test-app-facts-incremental.sh (92 checks, both layouts); bench tests/wave2/bench-app-sweep.sh (2,000 units, 1 % changed: 20 describes vs 2,000). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
) Remove the unit counts, timings and stale-row observation that came from a project outside this repository. The bytes-over-column hash rule stays, justified on its own terms. Field evidence is now: no field run; checked on synthetic and captured fixtures only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
- --freshness passed the whole unit hash list to Python in one env var; Linux caps that at 128 KB (~1,600 units), so on large apps it failed with 'Argument list too long' and status.sh silently lost the line. The list now goes through a temp file, cleaned up on exit. - A --skip-loops run keeps the last loop sweep's snapshot and its date (units.snapshot_taken), so a stale mdl/ never reads fresh. - skills/app-analysis.md: --full after edits made outside Studio Pro. - Fixture +16 checks: --freshness and status.sh on 2,101 units (fails on 6550815), module rename, --skip-loops freshness. Bench calls --freshness. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
MendixMau
pushed a commit
that referenced
this pull request
Oct 14, 2026
…s in status (#297) Review: independent review MERGE-AFTER-FIX — blocker: --freshness passed the unit hash list in one env var (Linux 128 KB cap; failed above ~1,600 units, status line silently vanished); module-rename and --skip-loops freshness gaps → hash list via temp file, T13 (2,101 units), T14 rename, T15 skip-loops snapshot, in e52e778; confirmation MERGE: 17,500-unit --freshness probe 0.7 s, T15 proven to discriminate. Fixtures: app-facts-incremental 108/108 (78 fail on master), app-report 109, catalog-edge-guard 20, status-existing-app 27. Bench: 20 of 2,000 describes at 1% changed. Read-only instrument; no field run (an earlier revision's client-derived figures were removed). Follow-up: pre-existing `ls mdl/*.mdl` arg-list limit above ~16k loop microflows. Closes the buildable half of #297 (jopterhorst). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
Merged
5 of 7 tasks
MendixMau
added a commit
that referenced
this pull request
Oct 15, 2026
…journey controls, fixes) (#385) Lands #340 #363 #362 #355 #370 #368 #364 #365 #366 #372 #367 #371 #376 #369 #373 #377 #378 #380. Review: each constituent PR independently reviewed by a fresh agent that did not write it; merged into integration/2026-10-15 only on a MERGE verdict with green CI (per-PR Review lines in the integration merge commits). After-fix rounds: #373 (env-var cap, rename/skip-loops freshness), #377 (inline URI fallback), #378 (full-pack double count, slice content). Stub diet (#369/#378/#380) behaviour A/B, 5 reps x 2 drafting tasks + 5 retrieval probes x 3 reps: trimmed context no worse than master on every scored metric (planted STOP refused 20/20, parse failures page 2/5 vs 3/5, probes 15/15); mdl Stage 5 56,236 -> 30,647 words, baseline 75,028 -> 73,233. Full suites on c9bc073: run-tests 33/0, wave2 111 fixtures 0 failing. Field evidence: none yet for the instruments (#355 warn-only, #373/#377 read-only). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
Owner
Author
|
Landed on master in #385 (squash Generated by Claude Code |
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.
Direct lane
What changed and why (one paragraph):
project-bin/app-facts.shre-described every loop-containing microflow on every run. The field report in #297 measured 2 h 45 at 6 workers for 1,917 describes on a 17,500-unit app (about 31 s each), while about 80 units had changed between rounds.manifest.jsonnow stores a{UnitID: ContentsHash}snapshot of the.mprUnit table, with its date inunits.snapshot_taken, and anmdl_indexrecording which unit state eachmdl/file was described from. A refresh describes only candidates that are new, changed (hash), moved (module or folder path), or without output. It keeps the rest and deletes outputs for units that were removed or no longer loop. The sweep is full on the first run, with--full, after an mxcli version change, or when the Unit table cannot be read (MPR v1);sections.loops.sweepsays which and why. UnitID-to-name mapping is a newunitssubcommand ofproject-bin/mx-metadata-note.py. ItsRevwalk was refactored into a sharedModelbase with a working-treeTreesubclass, so the mapping is not duplicated.bin/status.shprintsapp map: N units changed since <date>orapp map: fresh (built <date>)when a map exists (app-facts.sh --freshness, no mxcli needed); with no map it prints nothing.skills/app-analysis.mdnow gives the cost measured in #297 by app size, and names--fullas the remedy after edits made outside Studio Pro.Hash source: the hash is computed from the
.mxunitbytes in ContentsHash format rather than read from the column. Nothing guarantees that a row is rewritten in the same moment as its file, and a lagging row would hide a change. The column is the fallback for a unit with no file, and disagreements are counted inunits.reason(fixture case T3b).Not in scope / NEEDS-FIELD-DATA: replacing describe with catalog queries (mxcli v0.25
activitieswith loop depth). That needs a real v0.25 catalog capture to check parity with the parser. Follow-up: skip re-hashing unchanged.mxunitfiles by mtime + size. Not built: reading the files is already cheap, and an mtime-preserving copy could hide a change.Field evidence — no field run; checked on synthetic and captured fixtures only.
Review (MERGE-AFTER-FIX) — addressed in e52e778
--freshnesspassed the full hash list to Python inNOW_TSV. Linux caps one env string at 128 KB, about 1,600 units, so the call failed with "Argument list too long" and status.sh silently dropped the line. The list now goes through amktempfile, passed as an argument and removed on exit. No other unit list is passed through env or argv: the sweep already used files (.units.tsv,.sweep-plan.json, and the describe list on xargs' stdin). New case T13 runs--freshnessandstatus.sh --briefon 2,101 units: 3 checks fail on 6550815 and pass now. The bench also calls--freshness: fresh, then 20 changed, then fresh.--fullafter edits made outside Studio Pro.--skip-loopsfreshness. A--skip-loopsrun now keeps the last loop sweep's snapshot and its date, somdl/that is stale never reads fresh. New case T15: it fails on 6550815 (both layouts) and passes now.tests/wave2/test-app-facts-incremental.sh project-bin/app-facts.sh: 108/108, both layouts (78 checks fail against master's app-facts.sh)test-app-report.sh bin/app-report.sh109/0 ·test-catalog-edge-guard.sh project-bin/graph-sweep.sh20/0 ·test-status-existing-app.sh bin/status.sh27/27 ·test-mx-metadata-note.sh40/0 (re-run before e52e778; that commit does not change mx-metadata-note.py)tests/wave2/bench-app-sweep.sh(2,000 units, 1 % changed): first map 2,000 describes, no-change refresh 0, incremental 20,--full2,000; freshness reads fresh / 20 changed / freshfixtures/mx-metadata-note(Mendix 11.15.0); the rest is synthetic (fixtures/app-facts-incremental/mkmodel.py). Both layouts are tested; both platforms were considered (stdlib Python, forward-slash sqlite URI,mktempwithTMPDIR, nosed -i).CHANGELOG.mdline, credited "jopterhorst ([field 2026-10-13] App map: incremental loop sweep (2 h 45 on a 17.5k-unit model), map freshness in status #297)"Checks: render-routing --check in sync, baseline 75,028 words before and after (budget 80,000); check-scripts, check-portability, the leak guard, check-no-private-citations and check-pr-discipline are clean.
🤖 Generated with Claude Code
https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw