Web Dockerfile Regression
Web Dockerfile Regression (MC #10505)
PR: #41
Status: DONE (merged 2026-05-02)
Root cause: PR #39 deleted apps/api-express/ but didn't clean apps/web/Dockerfile reference
Discovery
Discovered by: kelsey-hightower during MC #10494 deploy verification
Date: 2026-05-02 09:43 UTC
Symptom: Web Cloud Build pipeline failed with:
Step 8/24 : COPY apps/api-express/package.json ./apps/api-express/
ERROR: failed to compute cache key: "/apps/api-express/package.json" not found: not found
Root Cause
Timeline
- PR #39 (MC #10493): Deleted
apps/api-express/directory (141 files, Express backend removal) - Merge: 2026-05-02 08:51 UTC
- Side-effect:
apps/web/Dockerfilestill contained:COPY apps/api-express/package.json ./apps/api-express/ - Next web build: Cloud Build attempted to build web container → COPY directive failed → build aborted
Why the COPY existed
Context: Web Dockerfile used to extract api-express/package.json for dependency caching layer optimization. This was a monorepo build optimization pattern — cache API dependencies separately from web dependencies to improve Docker layer reuse.
Stale pattern: With Express deleted, the COPY line became a dangling reference.
Impact
Regression window: PR #39 merge (08:51 UTC) → PR #41 merge (12:03 UTC) = 3 hours 12 minutes
Failed builds:
- Cloud Build
4f8c2a1d(triggered by MC #10494 branch push) — FAIL - Cloud Build
7b3e9c5f(retry attempt) — FAIL - Cloud Build
a1d8e4b2(manual trigger for diagnosis) — FAIL
Blocked work:
- MC #10494 Sprint 0 P0 deploy (registration fix could not reach stage web)
- Any web-side changes requiring redeployment
User impact: Stage web remained on previous revision (bilko-web-stage-00001-xyz) for 3 hours. Sprint 0 fix was live in API but web could not be updated to reflect registration success flow changes.
Fix
Change Applied
File: apps/web/Dockerfile
Line removed:
COPY apps/api-express/package.json ./apps/api-express/
No replacement needed — web build has no runtime dependency on API package.json. The COPY was purely for Docker cache layer optimization (now obsolete with Express deletion).
PR Details
URL: https://github.com/johnatbasicas/bilko/pull/41
Commit: 23a695e
Branch: feat/bilko-fix-web-dockerfile-api-express-ref
Merge: Squash-merged 2026-05-02 12:03:05 UTC
Files changed:
apps/web/Dockerfile— 1 line deleted
Verification
Local Docker Build Test
Command:
cd ~/ALAI/products/Bilko
docker buildx build -f apps/web/Dockerfile -t bilko-web-test:local .
Result:
[+] Building 127.3s (24/24) FINISHED
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 1.2kB
...
=> exporting to image
=> => exporting layers
=> => writing image sha256:8c7d9e4f...
=> => naming to docker.io/library/bilko-web-test:local
Verdict: ✅ Local build SUCCESS (all 24 steps completed, no COPY error)
Cloud Build Verification
Trigger: PR #41 merge auto-triggered Cloud Build
Build ID: b3bbde85
Status: SUCCESS
Duration: 3m 47s
Image: gcr.io/alai-bilko/web:23a695e
Deploy: Stage web service updated to revision bilko-web-stage-00002-abc
Prevention Protocol
ZAKON Enforcement
ZAKON local-docker-build (active):
Before ANY Dockerfile change PR, agent MUST:
- Build container locally with
docker buildx build- Verify exit code 0 (no build failures)
- Include local build output in PR evidence
Violation in this case: PR #39 (Express deletion) changed workspace structure (deleted apps/api-express/) but did NOT test downstream Dockerfile references before merge.
Corrective action: kelsey-hightower identified the gap; codecraft applied fix; ZAKON already exists (enforcement was manual in this case).
Post-Mortem Insight
Why This Slipped Through PR #39 Review
- Scope misalignment: PR #39 title was "DELETE apps/api-express" — reviewer focus was on Express code removal, not Dockerfile references.
- No cross-directory grep in PR checklist: Express deletion PR did NOT include
grep -r 'api-express' apps/web/step. - Cloud Build web pipeline not triggered by API changes:
cloudbuild.yamltriggers only onapps/web/**path changes. Deletingapps/api-express/did NOT trigger web build → regression invisible until next web change.
Systemic Fix Proposal
MC #10498 (Arch roadmap) should include:
- Pre-merge checklist for monorepo deletions:
grep -r '<deleted_path>' .across all Dockerfiles, CI configs, and scripts - Cloud Build workspace-aware triggers: Trigger web build on ANY monorepo structure change (workspace additions/removals in
package.json) - Local multi-service build gate: Before any workspace deletion PR, run
npm run build(builds ALL workspaces) +docker compose build(if applicable)
Open Items
None — regression fully resolved. Web Cloud Build pipeline healthy.
References
MCs:
- MC #10505 — Web Dockerfile regression (this page)
- MC #10493 — Express deletion (upstream cause)
- MC #10494 — Sprint 0 P0 (blocked by this regression)
- MC #10498 — Arch roadmap (prevention protocol integration)
PRs:
Cloud Build:
- Failed builds:
4f8c2a1d,7b3e9c5f,a1d8e4b2 - Success build:
b3bbde85
Evidence:
- Local Docker build log:
/tmp/evidence-10505/docker-build.log(if saved) - Cloud Build console: https://console.cloud.google.com/cloud-build/builds/b3bbde85
No comments to display
No comments to display