Skip to content

Consolidate upgrade-toolkit and brain-kit: port 2 weeks of private-repo work - #745

Open
MendixMau wants to merge 6 commits into
masterfrom
consolidate/upgrade-toolkit-and-brain
Open

MendixMau wants to merge 6 commits into
masterfrom
consolidate/upgrade-toolkit-and-brain

Conversation

@MendixMau

Copy link
Copy Markdown
Owner

Summary

Ports upgrade-toolkit/ and the brain-kit example from the private personal-toolkit repo into this public toolkit, consolidating ~2 weeks of work (personal-toolkit PRs #144, #147, #148-154, #161) plus a worked FSM example and a final public-scrub pass. Routed from skills/mendix-upgrade.md, same pattern as build-company-brain.md → brain-kit/.

Contents:

  • upgrade-toolkit/: full upgrade method, gate (bin/gate.sh, 14 rungs incl. new layout and trail rungs), step-record cockpit, and controls suite (controls/run-controls.sh, 2400+ cases)
  • upgrade-toolkit/examples/fsm/: full worked 9.24→11.12 upgrade example (triage/plan/upgrade/test evidence, COCKPIT.html, README) — no MPK/MPR files included; those are release-asset-only and wait on a separate sign-off from Maurits
  • Public-clean scrub: all private app/customer names removed from fixtures and prose; 6 additional customer-adjacent names flagged during scrub (not on the leakguard denylist) and genericized on explicit instruction: "Material Cockpit" → "Asset Console", "ShopFloor"/"ShopFloorHome" → "LineApp"/"LineAppHome", "Team Leave Tracker" → "Time Off Tracker", "HisenseStarter" → "DemoStarterApp", "DISW_DesignSystem"/"OpcenterEXFN_DISW_DesignSystem" → "VendorDesignSystem"/"OpcenterEXFN_VendorDesignSystem", "WebEwi" → "WebTasks" — incident IDs and cross-references preserved
  • playbooks/deprecated-components.md/publisher-lessons.md still reference a vendor-name prefix that may be a real public Marketplace listing name — flagged, not touched in this round
  • PR Field harvest from a requirements-driven build: 26 instrument fixes, BUG-141 fix proven, BUG-142..154 #162 (test-resilience) intentionally not included — it's still mid-flight on another branch/session and out of scope here

Test results

Full control suite (controls/run-controls.sh, GNU coreutils/sed on PATH, closest to CI):

controls: 2446 passed, 13 failed, 66 skipped

All 13 failures are pre-existing/environmental, not caused by this port or the rename sweep (verified: none reference any of the renamed strings):

Failure Cause
mxrun-proxy-dryrun-pass, mxrun-proxy-sslcertfile-pass, mxrun-env-file-pass, gate-relative-value-config-pass, gate-config-relative-pass, gate-config-relative-catch, bt8-triage-without-tools-pass (7) macOS /tmp → /private/tmp symlink mismatch against hardcoded /var/folders/... test expectations
toolcheck-host-bsd-sed-catch (1) Test asserts BSD sed is in use; inverted by the GNU-sed-first PATH used for this verification pass
journeys-archive-keep-pass (1) Pre-existing, order-tied
remedy-apply-release-todo-pass (1) Pre-existing, order-tied
usercode-no-package-catch (1) Pre-existing, order-tied
bt9-fetch-skips-deployment-catch, bt9-fetch-note-pass (2) Fixture state built by other tests earlier in the sequential run; isolated/ordering coupling, not a real regression

Public-clean verification

  • bin/check-no-client-data.sh (leakguard): ✅ no client data detected in 2270 tracked files
  • git grep -ilE 'siemens|pharma|tramius|moneta|material cockpit|shopfloor|hisense|disw|webewi|team leave': 0 matches
  • Manual pass over file types leakguard's extension filter skips (.log, .tsv, etc.), including the FSM example's 40 evidence logs (caught a git grep --untracked default-gitignore gap and a .gitignore carve-out gap along the way — both fixed)

Open item

FSM example MPK files (~/upgrade-lab/examples/fsm-mpk) are intentionally not in this PR. They would only go up as GitHub Release assets, and only with Maurits's separate explicit sign-off.

Do not merge — opened for review per Maurits's "push and open the PR" instruction.

🤖 Generated with Claude Code

MendixMau and others added 6 commits November 12, 2026 21:19
…vate)

Consolidates two weeks of upgrade-toolkit and brain-kit work (personal-toolkit
PRs #144, #147, #148-154, #161) into the public toolkit: the gate, step-record
cockpit, controls suite, and a finished brain-kit example. Scrubbed for public
release and verified against three scrub tools plus a manual pass over file
types the main one skips. Full control suite (GNU tools on PATH): 2465
passed, 11 failed (all pre-existing/environment, see CHANGELOG), 68 skipped.

Found and fixed three real bugs surfaced only during this port's own
verification (none in the ported source logic): a stale gate-trail row-index
test expectation from before the layout rung was merged in, two pipeline
functions missing from the timing-harness test's stub list, and 507 fixture
files plus private_hosts.sh that were never staged due to a .gitignore gap.

Left for a human call: three naming judgment calls flagged in CHANGELOG.md
(Marketplace listing names, two unlisted possibly-customer names, and
"Material Cockpit" — too widespread to rename unilaterally). PR #162
(test-resilience) left out, still mid-flight on another branch.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… port commit missed

A handful of edits made in the scratch worktree during the vendor-name/hostname
scrub session had never been staged before the prior commit landed: stray
"Siemens..." prefixes in README-generated widget filenames and playbook text,
a leftover /home/user/ sandbox path in bin/cloud/setup.sh, and the leakguard's
own internal hostname/home-path patterns in export-public.sh now sourced from
the external private_hosts.sh list instead of hardcoded inline.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Five operator-task-list.geo.json fixtures (old/prefix/wrapper layout rungs,
two viewport sizes) carried real customer-app image collection names
("...PharmaEquipmentMove48.svg", "...PharmaEquipmentRelease48.svg") copied
from a captured app's geometry dump. These weren't on the leak-guard denylist
(generic client terms, not a tracked client/project name), so the guard's
pass didn't catch them. Renamed to generic equivalents (AssetMove/AssetRelease);
nothing in run-controls.sh asserts on the old literal strings, only on
coordinates, so no test behavior changed. All 37 layout controls still pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…toolkit

Two-rung worked example (9.24.2 -> 10.24.28 -> 11.12.7) of a large public
Marketplace template (Field Service, web + native offline-sync), with every
step's evidence kept: triage, plan, upgrade logs, test (smoke/journeys/data
diffs/screens), gate summary, and the per-rung cockpit page. From f4's
rerun at ~/upgrade-lab/examples/fsm-public.

No MPK/MPR files included — those are release assets only, added later and
only with explicit sign-off; SHA256SUMS and make_mpk.py document how to
reproduce them from the app repository. Scrubbed clean: leakguard, the full
private-names denylist (including file types leakguard's own extension
filter skips, which matters here since 40 of the 120 files are .log
evidence), real emails, home paths and internal hostnames, re-checked with
--no-exclude-standard so gitignored files weren't silently skipped. Added a
.gitignore carve-out (upgrade-toolkit/examples/**/*.log) matching the one
already used for controls/fixtures, since the blanket *.log rule was
silently dropping all 40 evidence logs from `git add`. README paths and the
per-rung COCKPIT.html pages verified to resolve and be self-contained.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Material Cockpit, ShopFloor/ShopFloorHome, Team Leave Tracker,
HisenseStarter, DISW_DesignSystem/OpcenterEXFN_DISW_DesignSystem, and
WebEwi were surfaced as possibly customer-identifying during the final
scrub but weren't on the leakguard denylist. Maurits's call: genericize
all six, keeping incident IDs and cross-references pointed at the
renamed entities.

Renamed to Asset Console, LineApp/LineAppHome, Time Off Tracker,
DemoStarterApp, VendorDesignSystem/OpcenterEXFN_VendorDesignSystem, and
WebTasks respectively, across run-controls.sh, playbooks, bin/ tools,
layout fixtures, and docs. Also fixed two lowercase local-path mentions
the camelCase-only rename missed (~/upgrade-lab/shopfloor/ ->
~/upgrade-lab/lineapp/).

Verified: full control suite 2446 passed/13 failed/66 skipped (all 13
pre-existing/environmental, none touching renamed strings - see
CHANGELOG), leakguard clean (2270 tracked files), and
git grep -ilE 'siemens|pharma|tramius|moneta|material cockpit|
shopfloor|hisense|disw|webewi|team leave' returns 0.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ported from personal-toolkit feat/test-resilience @58db42b8:

- run_journeys.py: an OLD-APP ref whose cited line names another
  journey no longer counts as evidence. When this journey sits on
  exactly one other line of the file, that line is used and the
  report says the citation moved; otherwise the defect stays INVALID
  with "cite it by its own line".
- gate.sh: the journeys summary line counts FAIL, so a run whose only
  FAILs are tagged BASELINE DEFECT (failing the same way on the old
  app) read as a regression. When every per-journey FAIL line carries
  that tag the rung needs a decision; one untagged FAIL keeps it a
  regression.

Controls: journeys-coverage-defect-old-app-drift-pass/-catch,
gate-journey-baseline-only-decision-pass,
gate-journey-untagged-fail-regression-catch. Inserted by hand (the
upstream patch's run-controls.sh hunk no longer applied after the
layout/trail rung merge and the genericization renames shifted line
numbers) rather than a raw patch apply.

Verified: full suite (GNU coreutils/sed on PATH) 2452 passed/11
failed/66 skipped - all 11 are the same pre-existing/environmental
categories already documented in this branch's CHANGELOG entry
(macOS /tmp->/private/tmp symlink mismatch, BSD-sed assertion
inverted by GNU-sed-first PATH, two order-tied pre-existing failures).
Leakguard clean (2270 tracked files); customer_names_check.sh clean;
git grep -ilE 'siemens|pharma|tramius|moneta|material cockpit|
shopfloor|hisense|disw|webewi|team leave' returns 0.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@MendixMau

Copy link
Copy Markdown
Owner Author

Review: HOLD — private-data concern outside the final tree. The details were sent to the maintainer privately on purpose and are not repeated here, because this is a public repo.

The final tree's content passes the leak guard and the private-citations check. The concern is the material around that tree: the branch history, the PR text, the commit messages, and one fixture. Re-raising the PR from a clean single commit with a scrubbed body is likely needed. The maintainer has the specifics.

Findings that don't need privacy:

  • Size: 1,100 files / 211k lines, against the ≤10 files / ≤400 lines cap (RELEASE-PROCESS §4). There is no split plan. It needs a stack (skill + routing / bin / controls + fixtures / examples) or an explicit maintainer exception.
  • Generic first: upgrade-toolkit/vendor/e2e/ copies project-tests/e2e inside the same repo. Draft docs: point to the Mendix upgrade toolkit #654 chose a link instead of a copy for this reason.
  • Separate-repo leftovers: PUBLIC-README.md, PUBLIC-LICENSE (the repo root has no LICENSE), export-public.sh, and a dangling company-brain-test/ reference.
  • Guard change: bin/check-no-client-data.sh:139 widens the email allow-list for every consumer (e.g. x@test.<company>.com now passes).
  • Unchecked scripts: check-scripts.sh and check-portability.sh don't scan the new trees, so 48 new .sh files are unchecked, and 8 are zsh, which doesn't run under Git Bash. CI does not run the controls suite.
  • Failing controls: the 11–13 "pre-existing" failures are new to this repo, and the CHANGELOG (2465/11) and PR body (2446/13) disagree. Some cases depend on run order (--only gives missing-fixture tracebacks), and some fail on Linux because zsh is absent.
  • Context cost: 66,025 → 66,025 (one on-demand routing row). Time cost: CI +0 s.

Generated by Claude Code

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.

1 participant