Skip to content

existing-app-change: map the app first, ask about findings, park until the change is named - #132

Merged
MendixMau merged 21 commits into
masterfrom
claude/inspiring-darwin-w0p1an
Sep 23, 2026
Merged

MendixMau merged 21 commits into
masterfrom
claude/inspiring-darwin-w0p1an

Conversation

@MendixMau

Copy link
Copy Markdown
Owner

Direct lane

What changed and why (one paragraph):
In "Change an existing app" mode, Stage 0 opened with "which slice?" before anyone had seen the app. The app-analysis instrument (app-facts.sh + app-report.sh, skills/app-analysis.md) already existed, but nothing in the change flow ran or read it; its own Related section said "Not yet wired". Now Stage 0a runs the map without asking, because it's read-only and takes about a minute. Then it asks the one question the user owns: fix / log / accept for each top finding. The project may park there, which is now a normal state and not a permanent red row. Stage 0b scopes the slice once the change is named and reads its blast radius from the map's tangles and edges instead of recomputing it. existing-app-assurance.md Track A (the à-la-carte audit) starts from the same report, so an audit that turns into a change doesn't redo it.

File Change
skills/existing-app-change.md New §"Map the app first"; Stage P/0 rows split into 0a/0b; blast radius starts from dependencies.json; deliverable added
skills/existing-app-assurance.md Track A starts with the map; findings land in the dossier and re-render
skills/app-analysis.md "Not yet wired" replaced by what is wired now and what still isn't (dossier not owed; no Stage 6 re-run)
bin/lib/artifact-manifest.tsv app-report row, Stage 0, owed in this mode only, report absence
bin/gate-check.sh Stage 0: mapped + untouched placeholder in this mode → PENDING "waiting on the change" (was FAIL forever). Stage 1: mode-specific hint names Path D, not an extractor
docs/pipeline-walks.html #129's change-app diagram and rows updated: map → findings → park / switch to assurance → 0b
tests/wave2/test-bug03-gates.sh T12: parked → PENDING; unmapped → still FAIL; migration with a stray report → still FAIL; Stage 1 hint per mode

Field evidence: a live client workflow app (Mendix, MPR v2), headless container, mxcli v0.23.0. app-facts.sh found 28 modules (9 own), 31 own-module edges, 8 bidirectional pairs, one tangle of 7 of the 9 own modules, and 213 loop microflows (201 described), in 76 s. app-report.sh rendered 2 high / 2 medium / 11 low findings. Then gate-check with this change: app-report PRESENT, Stage 0 PENDING "waiting on the change", 0 need attention (before: Stage 0 FAIL on the placeholder). Controls on the same checkout: report moved aside → FAIL returns; a signed-off scratch project with no map → app-report PENDING owed, Stage 0 PASS.

  • No client data anywhere in the diff (check-no-client-data.sh clean on 674 files; the app is described generically)
  • Size cap: 7 files, ~150 lines excluding CHANGELOG
  • Test tier: gate behaviour verified by hand against the real project plus two controls; T12 added and syntax-checked but not run locally (repo rule: ask before running fixtures). CI runs both suites.
  • Instrument change: no new parser; the gate edit reads a file's presence only. Two-tree layout (.mpr under app/) not probed: the parked check looks at $PROJECT_DIR/analysis/app-report.json, which is where app-report.sh writes.
  • CHANGELOG.md line appended, credited
  • check-pr-discipline, check-no-private-citations, check-scripts: clean

Stacked follow-up (not in this PR)

The app-analysis routing row still says "nothing else in the toolkit reads it yet". Rewording it re-renders README, ROUTING and three agent templates (6 files), so it goes in a second PR once this lands, to stay under the cap.

Still not wired (named in app-analysis.md)

  • The dossier (architecture/app-dossier.md) isn't owed by anything; only the rendered report is.
  • Nothing re-runs the facts at Stage 6 to show a change left the tangle and loop counts no worse.

The branch carries a -s ours merge of the already-squash-merged #120 history (tree unchanged), so the branch could be pushed without a force-push. The diff against master is only this change.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW


Generated by Claude Code

…y "full X" task

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
…three constraints

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
… pointer row, hand-curated)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
…names are the company's call), name fixed

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
…, PROPOSED badges on unshipped pieces

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
…running prototype, public-cites-private is the known failure

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
…itations CI floor, skill, fixture, agent eval

Shape extracted from a private repo that ran this model for a month. Fixture: 32/32
(instantiate, wire once, re-point in place, refusals, citation check positive+negative
control, leak wrapper, harvest --to). Four live private pointers reworded. The agent
eval needs a real design-system MPK and has not run.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
…ol, on a real frozen app

Six Sonnet sessions, two arms differing by the nine-line pointer block only. Grader
fixed mid-run (negation-blind markers). Install discipline not tested: no mxcli in the
container, so the rubric is split Part A (done) / Part B (open). Component is a marked
stand-in until the real design module lands.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
…stops green-lighting unread files

Both found by running the first real drop, not by reasoning about it.

1. One wired session of three read AGENTS.md, CLAUDE.md, PROJECT.md and intake.md and
   never opened CLAUDE.local.md, so the company brain was invisible to it. The pointer
   now goes into every instruction surface the project already has, never creating one
   it does not.

2. The leak check delegated to a guard that scans tracked text files, so a folder of a
   PDF and a module package reported clean; outside git it printed errors and still
   exited 0. It now checks filenames, handles the pre-git case, and reports unscannable
   binaries out loud.

Fixture extended: multi-surface group plus four leak-check assertions. NOT YET RUN --
the repo requires asking before running a fixture; verified by inspection meanwhile
(one block per surface, 54-word pointer, check-scripts, citation check and
render-routing --check all clean).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
…r the wiring fix

Six sessions on the real artifacts. The one miss diagnosed a single point of failure in
the pointer wiring, fixed in the previous commit; re-run confirms 3/3. Every retrieving
session correctly refused to 'fix' the theme's deliberate colour deviation.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
…f surface, not a write mode

learned-mdl-preflight Step 0 names CLI and MCP as the co-equal write modes; MCP needs SP
running, so headless means CLI. Guidance, manifest template and eval rubric corrected.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
… mxcli import command exists

Proven: release download, mxcli new on 11.14.0, 9-module app, first build settled, no GUI.
Corrected: the manifest's './mxcli import mpk' was invented by an eval session and copied
without probing. Real routes are marketplace install (content id) and mx module-import
(local file). This package is refused: built with SP 10.6.4, needs a 10.21-10.24 hop, and
the CDN serves no 10.x mxbuild.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
…rt, inside a version window

11.14's converter accepts 10.21-10.24 and refuses 10.6.4, the same boundary module-import
names. So the company package needs one hop, and the intermediate mx is not published at
the CDN path the tooling uses (11.x 200, every 10.x 404). Corrects the earlier implication
that it simply cannot be installed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
…ate was mx's alone

mxcli reads the 10.6.4 model fine. The theme module has zero model documents, so install
is a file operation. Copying themesource/ alone builds green with NONE of the brand
colours applied -- main.scss imports the project's custom-variables while the module's
own variables file is imported by nothing. With that copy too: BUILD SUCCEEDED and all
five brand hexes verified in the compiled CSS.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
… already takes plain paths

PackageProject/PerformInstall/InstallPackageFiles/moduleNameFromMpk take paths and
strings, no marketplace client. InstallPackageFiles already does the bundled-file copy
done by hand. Recommendation: issue + PR + wrapper meanwhile; fork only if declined.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
…ld-run findings, final state

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
CHANGELOG: master moved to the Unreleased/release-cycle format (#111); this branch's
2026-09-19/20 lines now sit under Unreleased and its 2026-09-18 lines in that dated
section. skill-routing.tsv auto-merged; surfaces re-rendered.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
The leak guard's home-directory probe is right to flag them, even though they are a
cloud container's paths and not a person's machine. <scratch> and <home> carry the
same information.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
Master drained its merge queue (172 commits) while this branch was open. Three
conflicts, resolved:

- CHANGELOG.md: union under ## Unreleased, this branch's 11 lines above master's.
- README.md: master's rewritten sync paragraph kept verbatim (it is more accurate
  about CLAUDE.local.md vs CLAUDE.md); the company-brain paragraph appended after
  it, with the duplicated npm sentence dropped.
- toolkit-guide.html: master added its own section 9 (harness setting), so the
  wiring page is renumbered to section 10. Both kept; SVG balance re-checked.

Routing surfaces already in sync after the merge; baseline 73,074 / 80,000 words.
check-scripts, check-portability, leak guard (671 files), no-private-citations and
check-pr-discipline all clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
… until the change is named

Stage 0 in this mode opened with "which slice?" before anyone had seen
the app, and the app-analysis instrument (app-facts.sh + app-report.sh)
existed but nothing in the change flow ran or read it.

Now Stage 0a runs the map without asking (read-only, ~1 min), then asks
the user to disposition the top findings (fix / log / accept). The
project may park there; Stage 0b scopes the slice and reads its blast
radius from the map once the change is named. The manifest owes the map
(app-report) in this mode, gate-check reads a mapped-but-unscoped
project as Stage 0 PENDING rather than a permanent FAIL, and its Stage 1
hint names Path D. existing-app-assurance Track A starts from the same
report.

Field run: a live client workflow app, 28 modules, mapped in 76 s,
gate-check PENDING/parked with 0 needing attention. Fixture:
test-bug03-gates.sh T12 (parked, unmapped, other-mode controls).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cjxzzw8LVrfLrEmz8YMXQW
@MendixMau
MendixMau merged commit 5ebbd24 into master Sep 23, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants