Skip to content

feat(migrate): harvest migration-learnings from #10#12

Merged
Hermsi1337 merged 1 commit into
masterfrom
feature/harvest-learnings-10
Jun 30, 2026
Merged

feat(migrate): harvest migration-learnings from #10#12
Hermsi1337 merged 1 commit into
masterfrom
feature/harvest-learnings-10

Conversation

@Hermsi1337

@Hermsi1337 Hermsi1337 commented Jun 30, 2026

Copy link
Copy Markdown
Member

What & why

Harvests the verified findings from migration-learnings issue #10 into the mittwald-migrate skill. Every claimed trap was checked against the live mw CLI (1.18.0) and the mittwald developer docs before being included; unverified or already-covered claims were dropped or redirected (see "Triage" below).

Changes

Headline — mirror the source engine by default (database-engines.md)
An autonomous migration should reproduce the source faithfully. New principle: a MariaDB source → mariadb container (matching major), never managed MySQL unless the operator explicitly opts into the engine swap. MariaDB ≠ MySQL (auth plugins, collations, system tables, JSON, sequences, virtual columns can break only in prod). Applied consistently at the decision and action sites:

  • discover-source.md §7b (DB-engines self-check) + inventory example gets a MariaDB row
  • migrate-mysql.md §0 recap
  • provision-target.md §7 (Managed MySQL guard)

App ↔ container DB networking (database-engines.md, pitfalls.md #16)
Documents that apps and container stacks share the project network — a managed/runtime app can reach a container DB by service name (DB_HOST=<service-name>). Source: mittwald containers docs. This makes "managed/runtime app + container MariaDB" a first-class shape and directly supports the mirror-source default above.

Deployer/Capistrano source layouts (discover-source.md)
Recognize release-rotation layouts (current/ -> releases/<ts>/, shared/); migrate the active state only, dereferencing symlinks with tar -h, instead of copying the whole releases/ history or shipping broken links.

SSH ControlMaster trap (ssh-modes.md)
Local SSH connection-sharing (ControlMaster auto) makes mStudio connections fail with a misleading could not connect to project. Fix: -o ControlMaster=no -o ControlPath=none. (Independently hit by two people.)

CLI doc fixes (mittwald-surfaces.md)

  • mw project get takes the project as a positional arg — the documented -p form is wrong (verified against mw project get --help).
  • mw project backup* / mw project backupschedule* are deprecatedmw backup* / mw backup schedule* (the CLI prints the deprecation).
  • Added the ingress path-update endpoint PATCH /v2/ingresses/{ingressId}/paths (resource-scoped, API-only — no CLI command yet).

Triage of #10 (for reviewers)

Finding Disposition
Mirror MariaDB → container (not managed MySQL) ✅ harvested (headline)
App ↔ container networking ✅ harvested
Deployer/Capistrano layout ✅ harvested
SSH ControlMaster ✅ harvested
mw project get -p, mw project backup* ✅ fixed
PHP runtime version not settable on mw app create mittwald/cli#1951 (CLI gap, not a skill workaround)
Ingress path update missing in CLI mittwald/cli#1952 (+ API endpoint documented here)
PHP app auto-provisions managed MySQL ❌ dropped — API/CLI create no DB

Testing

Repo CI gates, locally:

  • markdownlint-cli2 "**/*.md"0 errors
  • lychee --offline (Docker, as CI) → 0 errors

Closes #10.

🤖 Generated with Claude Code

Harvest the verified, generalizable findings from migration-learnings issue
#10 into the mittwald-migrate skill.

- database-engines.md: new "Default: mirror the source engine" principle — an
  autonomous migration reproduces the source faithfully; a MariaDB source goes
  to a `mariadb` container, never managed MySQL unless the operator explicitly
  opts into the engine swap (MariaDB != MySQL). Add "App <-> container DB
  networking" (apps and stack containers share the project network, so
  managed/runtime app + container DB is a first-class shape). Guard the
  "managed is the right call" list with the MySQL-source assumption.
- migrate-mysql.md, provision-target.md §7, discover-source.md §7b: apply the
  mirror-source default at the decision and action sites; add a MariaDB row to
  the inventory example.
- discover-source.md: recognize Deployer/Capistrano release-symlink layouts
  (current/ -> releases/, shared/); migrate the active state via `tar -h`.
- ssh-modes.md: local SSH ControlMaster/multiplexing breaks mStudio
  connections; disable with -o ControlMaster=no -o ControlPath=none.
- pitfalls.md #16: service-name reachability extends across the app<->stack
  boundary.
- mittwald-surfaces.md: fix `mw project get` (positional arg, not -p); update
  the deprecated `mw project backup*` forms to `mw backup*`; add the ingress
  path-update endpoint (PATCH /v2/ingresses/{id}/paths, API-only).

Two findings are tracked upstream as mittwald/cli gaps rather than skill
workarounds (runtime-version flag on `mw app create`; ingress path-update
command). One claim (auto-provisioned managed MySQL) was dropped — the API/CLI
create no database.

Closes #10.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@gandie gandie left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm, nice learnings!

One thought for meditation: Documenting sensible defaults and explaining mstudio behavior via pitfalls is a very good idea, but i am wondering how it will scale in the future. The error space of agent work is infinite and we can't document infinity ( yet ). Besides such regular learning harvests, maybe we need another ritual for consolidation to keep skills and playbooks tight? Just a thought to chew on i wanted to throw into the ring.

@Hermsi1337 Hermsi1337 merged commit 7eb6fa4 into master Jun 30, 2026
3 checks passed
@Hermsi1337 Hermsi1337 deleted the feature/harvest-learnings-10 branch June 30, 2026 11:55
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.

Migration learnings: Shared Hosting (Deployer/CI) → PHP Runtime App + MariaDB Container

2 participants