Fixed
- Compose recreates now pass
--project-directorywhen the stack was originally started from a different directory than the compose file's location. Found via a static-analysis audit: the update path accepted thecom.docker.compose.project.working_dirlabel but never used it — so a recreate could resolve.envinterpolation /env_file:paths differently than the originalupdid. Same recreate-fidelity class as #27/#29.
Changed
- Permanent contract linter (
scripts/lint_contracts.py, wired into the pre-commit check): flags functions mixing literal return shapes and same-named methods across classes with conflicting return contracts — the exact class of the v1.37.1_wait_healthycascade crash. Verified against a synthetic reproduction of that historical bug. Plus lint cleanup (unused imports/vars, onezip(strict=True)).
Full 24-script regression sweep green.