perf(test): make schema-dump target + opt-in fast-path docs (WS-6)

Session 2.6's per-test migrate:fresh in 4 backfill test classes
replays ~120 migrations. Laravel's schema:dump produces a single
SQL file that migrate:fresh loads atomically when present —
significantly faster on environments where the host has the
\`mysql\` CLI available for Laravel's load step.

Changes:
- New Makefile target \`schema-dump\` runs mysqldump INSIDE the
  bm_mysql Docker container (no host mysqldump dependency to
  GENERATE the dump). Outputs api/database/schema/mysql-schema.sql.
- api/database/schema/.gitignore added: mysql-schema.sql is NOT
  committed by default. Laravel's auto-load on migrate:fresh
  shells out to the host's \`mysql\` CLI; on hosts without it,
  the presence of the dump file actively breaks migrate (exit 127).
  Treat the dump as opt-in per dev environment.
- CLAUDE.md "Schema dumps (opt-in fast path)" subsection added with
  the workflow: brew install mysql-client → migrate to head →
  make schema-dump → optionally commit.

phpstan-baseline.neon: removed a stale "unused use \$actor" entry
in FormSubmissionService whose underlying closure pint cleaned up
in commit 060d6f3 (Task 1).

Wall-time on this dev machine (no host mysql CLI): NO speedup,
backfill tests still ~6s per setUp. The dump file is ready for
environments that have mysql CLI. Documented as a deviation.

JSON canonicalization (commit 060d6f3) is the load-bearing
correctness fix from this branch; the schema-dump perf path is a
nice-to-have that activates per-environment.

Refs: WS-6 session 2.6 deviation #5 cleanup

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-28 14:07:15 +02:00
parent a791a276fa
commit fe110ba761
4 changed files with 58 additions and 8 deletions

View File

@@ -1,4 +1,4 @@
.PHONY: help services services-stop api app portal docs migrate fresh db-shell test test-db-create
.PHONY: help services services-stop api app portal docs migrate fresh db-shell test test-db-create schema-dump
# Colors
GREEN := \033[0;32m
@@ -27,6 +27,7 @@ help:
@echo " make fresh Fresh migrate + seed"
@echo " make db-shell Open MySQL shell"
@echo " make test-db-create Create crewli_test database (one-time)"
@echo " make schema-dump Regenerate MySQL schema dump (run after new migrations)"
@echo ""
@echo " $(YELLOW)Testing:$(NC)"
@echo " make test Run PHPUnit suite (creates crewli_test if needed)"
@@ -81,3 +82,23 @@ test-db-create:
test: test-db-create
@cd api && php artisan test
# Regenerate api/database/schema/mysql-schema.sql from the current
# crewli_test schema. Runs mysqldump INSIDE the bm_mysql Docker
# container, so contributors don't need mysqldump on the host.
#
# Workflow: this target dumps WHATEVER state crewli_test is currently
# in. Run `make test-db-create` (creates DB), then put it at the desired
# state — typically by running the test suite, which migrates the test
# DB to head — then `make schema-dump`.
#
# See CLAUDE.md "Schema dumps" — commit the regenerated dump alongside
# any new migrations so CI / fast-path migrate:fresh stays in sync.
schema-dump:
@echo "$(GREEN)Regenerating api/database/schema/mysql-schema.sql from current crewli_test state...$(NC)"
@docker exec bm_mysql mysqldump --no-tablespaces --skip-add-locks --skip-comments --skip-set-charset --tz-utc -u root -proot crewli_test --routines --no-data 2>/dev/null > /tmp/crewli-schema-structure.sql
@docker exec bm_mysql mysqldump --no-tablespaces --skip-add-locks --skip-comments --skip-set-charset --tz-utc -u root -proot crewli_test migrations --no-create-info 2>/dev/null > /tmp/crewli-schema-migrations.sql
@cat /tmp/crewli-schema-structure.sql /tmp/crewli-schema-migrations.sql > api/database/schema/mysql-schema.sql
@rm /tmp/crewli-schema-structure.sql /tmp/crewli-schema-migrations.sql
@echo "$(GREEN)✓ api/database/schema/mysql-schema.sql updated$(NC)"
@echo "$(YELLOW)Note: Commit the updated schema dump alongside any new migrations.$(NC)"