Coordinated with theo-packs PR-A (usetheodev/theo-packs#20). Both PRs MUST merge on the same day per ADR D2 of
theo-packs/docs/plans/single-source-of-truth-plan.md.
Across 18 templates. All paths relative to repo root:
templates/fullstack-nextjs/Dockerfiletemplates/go-api/Dockerfiletemplates/java-spring/Dockerfiletemplates/monorepo-go/apps/{api,worker}/Dockerfiletemplates/monorepo-java/apps/{api,worker}/Dockerfiletemplates/monorepo-php/apps/{api,worker}/Dockerfiletemplates/monorepo-python/apps/{api,worker}/Dockerfiletemplates/monorepo-ruby/apps/{api,worker}/Dockerfiletemplates/monorepo-rust/apps/{api,worker}/Dockerfiletemplates/monorepo-turbo/apps/{api,web}/Dockerfiletemplates/node-express/Dockerfiletemplates/node-fastify/Dockerfiletemplates/node-nestjs/Dockerfiletemplates/node-nextjs/Dockerfiletemplates/node-worker/Dockerfiletemplates/php-slim/Dockerfiletemplates/python-fastapi/Dockerfiletemplates/ruby-sinatra/Dockerfiletemplates/rust-axum/Dockerfile
Verified: find templates -name Dockerfile -type f | wc -l returns 0.
- 18 template READMEs gain a
## Buildsection explaining that the Dockerfile is generated at deploy time by theo-packs (not committed) and that committing one causes exit code 2 rejection. - Root
README.mdgains a## Build artifactssection precedingWhat's Included. TheWhat's Includedtable updates the Dockerfile /.dockerignorerows from "production-optimized, multi-stage where applicable" to "Generated at deploy time by theo-packs".
tests/no_dockerfiles_test.sh is a 1-line find test that fails when any template ships a Dockerfile.
ACTION REQUIRED before merge — the PR-opening token used to author this branch lacks the workflow scope, so .github/workflows/ci.yml could not be modified. Wire the test into the validate-templates job by adding this step right after Check template consistency:
- name: Enforce single-source-of-truth (no Dockerfiles in templates)
run: bash tests/no_dockerfiles_test.shThe maintainer with workflow permission should commit that addition before merging. Without it, the contract is documented but not enforced at PR time.
Pre-release window with no external users; user has explicitly waived backward compatibility ("fix in FAANG level"). The previous setup (templates ship Dockerfiles, theo-packs gives them precedence) was the source of every "theo-packs is broken" misdiagnosis — the recent dogfood against monorepo-turbo found a buggy template Dockerfile (npm workspace hoisting + COPY apps/api/node_modules) and blamed theo-packs. Removing the templates' Dockerfiles eliminates the entire class of confusion.
PR-A alone (theo-packs) means theo-packs rejects every theo-stacks template that still ships a Dockerfile → every deploy fails. PR-B alone (this PR) means templates have no Dockerfile but theo-packs's old code path tries to copy a non-existent file → cosmetic but the contract is unenforced.
The two changes are a single semantic transition. Recommended sequence:
- Approve and merge theo-packs PR-A (
developbranch). - Immediately approve and merge this PR (
developbranch). - theo product picks up both via vendoring or fresh clone.
Explicitly NOT preserved. Pre-release; no external users.
bash tests/no_dockerfiles_test.sh ✓ OK: no Dockerfiles in templates
The existing validate-templates CI job continues to pass (templates still scaffold valid projects; only the Dockerfile is gone).
theo-packs/docs/plans/single-source-of-truth-plan.md— the plan this PR implements (ADRs D1-D6, full rationale).theo-packs/docs/plans/single-source-of-truth-inventory.md— frozen file list cross-checking PR-A and PR-B.theo-packs/docs/contracts/theo-packs-cli-contract.md— the canonical contract, now reflecting single-source-of-truth.