Repository navigation
decompose: cut-score + app-facts fix (split from #293, 1/6) - #341
Merged
Merged
Conversation
bin/cut-score.sh, its fixture (tests/wave2/test-cut-score.sh + captured fixtures/cut-score/) and the app-facts.sh sqlite3-CLI fallback, copied from #293's head and adapted to master: the catalog build_mode label is recorded, not tested (#259), and an empty activities_data reads NOT DETECTED. Fixture 56 -> 64 checks (label, empty table, both layouts). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
4 of 5 tasks
- app-facts: the Python sqlite3 fallback strips \r (native Windows Python under Git Bash, which has no sqlite3 CLI); APPFACTS_NO_SQLITE3_CLI=1 forces that path. test-catalog-edge-guard gains a CRLF case (22/22). - cut-score: rows name the actual NOT DETECTED reason; parenthesise the own-module set difference; header states the template-app field run. - test-cut-score 64 -> 70. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
This was referenced Oct 14, 2026
Merged
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.
Split from #293 (1/6). #293's branch is untouched; files were copied from its head with
git checkout origin/claude/youthful-hypatia-qapq73 -- <paths>and adapted to current master.Direct lane
What changed and why (one paragraph):
bin/cut-score.shscores a proposed split of an existing app into several apps. You pass--cut "A,B|C|D", or it uses the default of one app per level ofapp-layer-map.json. It lists every module edge inanalysis/app-facts/dependencies.jsonthat crosses an app boundary and names the integration lane each ref kind would need: OData external entity, published action or REST, copy, deep-link, or none. It then gives each partition a clean / costly / blocked verdict and prints the denominator. Aggregates over a foreign entity are read from.mxcli/catalog.db. When that can't be done, rows read NOT DETECTED and name the actual reason: no catalog, empty table, missing columns, or unreadable. The fixture istests/wave2/test-cut-score.shplus the capturedtests/wave2/fixtures/cut-score/. Theproject-bin/app-facts.shchange from #293 runs the one-column guard queries through Python's sqlite3 when thesqlite3CLI is missing, stripping the\rthat native Windows Python prints.Adapted to master (not in #293): #259 changed the catalog guard to stop testing the
build_modelabel, because mxcli v0.24+ labels a complete catalogsource. #293's cut-score still testedbuild_mode != 'full'. Now the label is recorded and not tested, and an emptyactivities_datareads NOT DETECTED. The header no longer cites the decompose plan doc, which lands in a later split; it now points atskills/layering-review.md.Field evidence: this is #293's run, now stated in the script header.
App: a public Mendix field-service template app (Marketplace, 9.24.2, MPR v1), mxcli v0.26.0, 42 own modules, 312 own edges, 4,508 refs. app-facts took 25 s; each cut-score run took ≤ 1 s.
Cuts scored: seven, all
blocked. One app per level crossed 312 edges / 4,508 refs, which means little on its 36-module tangle. The best web | mobile landscape found was 132 edges / 1,442 refs with 2 bidirectional pairs.Spot-check: 6 blocker rows checked with
describe. All 6 were real references, but 2 had the wrong lane.Captured fixture: a planted four-module Mendix 10.24 app (
fixtures/cut-score/CAPTURE.txt).Known limits from that run, not fixed here:
callmixes client-side nanoflow/JS calls in with server-side ones. That is about 30% of the main seam's blocker mass.sync,widget,schedule,eventandpublishnever reachdependencies.json.No client data anywhere in the diff (leak guard and whole-word name grep are clean)
Size cap: exceeded. This PR needs the maintainer's size waiver. There are 612 non-test lines:
bin/cut-score.sh(~600) plus app-facts (+12). I looked at splitting off the HTML renderer (~180 lines). It is not a clean cut: HTML is the default output,-oand fixture section 7 depend on it, and what remains would still be about 430 lines, over the cap.Test tier reached: T1, fixtures on captured input plus synthetic layout trees and derived probes:
test-cut-score.sh70/70. That is Decompose and Rehost pipelines: field runs on FSM and GenAI Showcase, three new skills #293's 56 plus 14 new checks: thesourcelabel, an empty table, row reasons, the own-module derivation, and single-tree and two-tree catalog discovery. Against Decompose and Rehost pipelines: field runs on FSM and GenAI Showcase, three new skills #293's unadapted copy, 8 of the new checks fail.test-app-report.sh109/109.test-catalog-edge-guard.sh22/22, including a new case that forces the Python path with CRLF output. Without thetrit fails 2.For a new/changed instrument: golden input is captured (
CAPTURE.txt). Two-tree layout (.mprunderapp/): probed only with synthetic trees, and cut-score finds the catalog in both. No real two-tree project has been run. macOS and Git Bash/Windows: unverified. Everything ran on Linux. The CRLF case simulates native Windows Python's output, but nothing has been run on Windows.CHANGELOG.mdline appended (crediting Decompose and Rehost pipelines: field runs on FSM and GenAI Showcase, three new skills #293's field runs)Checks:
render-routing.sh --checkpasses; the baseline is 75,038 words before and after.check-scripts,check-portability, the leak guard,check-no-private-citationsandcheck-pr-disciplineare all clean.Review
The independent review returned MERGE-AFTER-FIX. Commit
c55182faddresses each item:\r, so on native Windows Python every[ "$(q …)" = "1" ]failed with "catalog schema is missing".| tr -d '\r', as_common.shdoes.APPFACTS_NO_SQLITE3_CLI=1forces the Python path.test-catalog-edge-guard.sh, a Python wrapper that ends every line in CRLF, run on both layouts. It passes 22/22 with the fix and 20/22 without it.{from} | {to} - {None}the precedence was wrong. Fixed: parenthesised, with a new case of noscopeplus an edge missingfrom. Decompose and Rehost pipelines: field runs on FSM and GenAI Showcase, three new skills #293's copy crashes on it.Impact
bin/cut-score.shis an on-demand instrument, not wired into any gate.app-facts.shno longer stops when the sqlite3 CLI is missing (falls back to Python's sqlite3).project-bin/app-facts.sh(installed script). Merges clean onto master 868b3cb (git merge-tree). No conflicts with the other PRs in this batch; #346 citesbin/cut-score.sh, so this lands before #346. Platform: Linux only; native-Windows CRLF path simulated, not run on Windows or macOS. Readsanalysis/app-facts/dependencies.json(producer:project-bin/app-facts.sh),analysis/app-layer-map.json(producer:bin/app-layer-map.sh; without it--cutis required), optional.mxcli/catalog.db(left byapp-facts.sh). Size waiver requested.git merge-treevs 868b3cb and pairwise;cut-score.shheaderbin/render-routing.sh --checkon master 868b3cb vs this head (c55182f) merged onto 868b3cb viagit merge-treein a temporary worktree🤖 Generated with Claude Code
https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw