theslopmachine 0.6.2 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/MANUAL.md +21 -6
  2. package/README.md +55 -7
  3. package/RELEASE.md +16 -1
  4. package/assets/agents/developer.md +41 -1
  5. package/assets/agents/slopmachine-claude.md +101 -60
  6. package/assets/agents/slopmachine.md +40 -17
  7. package/assets/claude/agents/developer.md +42 -5
  8. package/assets/skills/clarification-gate/SKILL.md +25 -5
  9. package/assets/skills/claude-worker-management/SKILL.md +290 -57
  10. package/assets/skills/developer-session-lifecycle/SKILL.md +83 -38
  11. package/assets/skills/development-guidance/SKILL.md +21 -1
  12. package/assets/skills/evaluation-triage/SKILL.md +34 -23
  13. package/assets/skills/final-evaluation-orchestration/SKILL.md +88 -50
  14. package/assets/skills/hardening-gate/SKILL.md +17 -3
  15. package/assets/skills/integrated-verification/SKILL.md +3 -3
  16. package/assets/skills/planning-gate/SKILL.md +32 -3
  17. package/assets/skills/planning-guidance/SKILL.md +72 -13
  18. package/assets/skills/retrospective-analysis/SKILL.md +2 -2
  19. package/assets/skills/scaffold-guidance/SKILL.md +129 -124
  20. package/assets/skills/submission-packaging/SKILL.md +33 -27
  21. package/assets/skills/verification-gates/SKILL.md +44 -14
  22. package/assets/slopmachine/backend-evaluation-prompt.md +1 -1
  23. package/assets/slopmachine/frontend-evaluation-prompt.md +5 -5
  24. package/assets/slopmachine/scaffold-playbooks/android-kotlin-compose.md +81 -0
  25. package/assets/slopmachine/scaffold-playbooks/android-kotlin-views.md +191 -0
  26. package/assets/slopmachine/scaffold-playbooks/android-native-java.md +203 -0
  27. package/assets/slopmachine/scaffold-playbooks/angular-default.md +181 -0
  28. package/assets/slopmachine/scaffold-playbooks/backend-baseline.md +142 -0
  29. package/assets/slopmachine/scaffold-playbooks/backend-family-matrix.md +80 -0
  30. package/assets/slopmachine/scaffold-playbooks/database-module-matrix.md +80 -0
  31. package/assets/slopmachine/scaffold-playbooks/django-default.md +166 -0
  32. package/assets/slopmachine/scaffold-playbooks/docker-baseline.md +189 -0
  33. package/assets/slopmachine/scaffold-playbooks/docker-shared-contract.md +334 -0
  34. package/assets/slopmachine/scaffold-playbooks/electron-vite-default.md +124 -0
  35. package/assets/slopmachine/scaffold-playbooks/expo-react-native-default.md +73 -0
  36. package/assets/slopmachine/scaffold-playbooks/fastapi-default.md +134 -0
  37. package/assets/slopmachine/scaffold-playbooks/frontend-baseline.md +160 -0
  38. package/assets/slopmachine/scaffold-playbooks/frontend-family-matrix.md +134 -0
  39. package/assets/slopmachine/scaffold-playbooks/generic-unknown-tech-guide.md +136 -0
  40. package/assets/slopmachine/scaffold-playbooks/go-chi-default.md +160 -0
  41. package/assets/slopmachine/scaffold-playbooks/ios-linux-portable.md +93 -0
  42. package/assets/slopmachine/scaffold-playbooks/ios-native-objective-c.md +151 -0
  43. package/assets/slopmachine/scaffold-playbooks/ios-native-swift.md +188 -0
  44. package/assets/slopmachine/scaffold-playbooks/laravel-default.md +216 -0
  45. package/assets/slopmachine/scaffold-playbooks/livewire-default.md +265 -0
  46. package/assets/slopmachine/scaffold-playbooks/overlay-module-matrix.md +130 -0
  47. package/assets/slopmachine/scaffold-playbooks/platform-family-matrix.md +79 -0
  48. package/assets/slopmachine/scaffold-playbooks/selection-matrix.md +72 -0
  49. package/assets/slopmachine/scaffold-playbooks/spring-boot-default.md +182 -0
  50. package/assets/slopmachine/scaffold-playbooks/tauri-default.md +80 -0
  51. package/assets/slopmachine/scaffold-playbooks/vue-vite-default.md +162 -0
  52. package/assets/slopmachine/scaffold-playbooks/web-default.md +96 -0
  53. package/assets/slopmachine/templates/AGENTS.md +41 -3
  54. package/assets/slopmachine/templates/CLAUDE.md +111 -0
  55. package/assets/slopmachine/test-coverage-prompt.md +561 -0
  56. package/assets/slopmachine/utils/claude_create_session.mjs +3 -2
  57. package/assets/slopmachine/utils/claude_live_channel.mjs +188 -0
  58. package/assets/slopmachine/utils/claude_live_common.mjs +411 -0
  59. package/assets/slopmachine/utils/claude_live_hook.py +47 -0
  60. package/assets/slopmachine/utils/claude_live_launch.mjs +187 -0
  61. package/assets/slopmachine/utils/claude_live_status.mjs +25 -0
  62. package/assets/slopmachine/utils/claude_live_stop.mjs +46 -0
  63. package/assets/slopmachine/utils/claude_live_turn.mjs +277 -0
  64. package/assets/slopmachine/utils/claude_resume_session.mjs +3 -2
  65. package/assets/slopmachine/utils/claude_wait_for_rate_limit_reset.mjs +23 -0
  66. package/assets/slopmachine/utils/claude_wait_for_rate_limit_reset.sh +5 -0
  67. package/assets/slopmachine/utils/claude_worker_common.mjs +361 -4
  68. package/assets/slopmachine/utils/cleanup_delivery_artifacts.py +4 -0
  69. package/assets/slopmachine/utils/export_ai_session.mjs +1 -1
  70. package/assets/slopmachine/utils/normalize_claude_session.py +153 -0
  71. package/assets/slopmachine/utils/package_claude_session.mjs +123 -0
  72. package/assets/slopmachine/utils/prepare_strict_audit_workspace.mjs +65 -0
  73. package/package.json +1 -1
  74. package/src/constants.js +42 -3
  75. package/src/init.js +173 -28
  76. package/src/install.js +156 -8
  77. package/src/send-data.js +56 -57
@@ -0,0 +1,203 @@
1
+ # Android Native Java Scaffold Playbook
2
+
3
+ Use this playbook for native Android requests unless the prompt explicitly requires Kotlin, Compose, or a different Android stack.
4
+
5
+ ## Goal
6
+
7
+ Create a fast, repeatable Android scaffold that is:
8
+
9
+ - native Android
10
+ - baseline-only, not feature-complete
11
+ - honest about offline/bootstrap/runtime constraints
12
+ - portable broad-testable on Linux with Docker
13
+ - safe by default on secrets and bootstrap data
14
+
15
+ ## Runtime contract
16
+
17
+ - required Docker command: `docker compose up --build`
18
+ - required broad test command: `./run_tests.sh`
19
+ - both commands must be real and working
20
+ - `./run_app.sh` may exist as a helper for host-side convenience, but it does not replace the required Docker baseline
21
+
22
+ ## Verified baseline notes
23
+
24
+ From a real lab verification on 2026-04-14:
25
+
26
+ - the current Android baseline does converge honestly in Docker without an emulator
27
+ - `docker compose up --build -d --wait` reached a stable healthy state
28
+ - the healthy state was a loopback-only artifact server serving the built APK from `artifacts/app-debug.apk`
29
+ - `./run_tests.sh` reused the running container with `docker compose exec` for `:app:lintDebug` and `:app:testDebugUnitTest`, then smoke-checked the served APK
30
+ - the observed containerized Gradle verification completed successfully with `BUILD SUCCESSFUL in 1m 42s`
31
+ - the current practical proof boundary is: pinned toolchain + APK assembly + lint + JVM unit tests + artifact serving; it does **not** claim emulator or device runtime proof
32
+ - the current Docker strategy is acceptable because the heavy Android SDK/toolchain layers are pre-baked and cached instead of being reinstalled on every rerun
33
+
34
+ ## Safe default stack
35
+
36
+ - Android Gradle Plugin: `8.5.x`
37
+ - Gradle wrapper: `8.7`
38
+ - Java: `17`
39
+ - `compileSdk = 34`
40
+ - `targetSdk = 34`
41
+ - `minSdk = 29`
42
+ - Android Views by default unless the prompt explicitly requires Compose
43
+
44
+ ## Safe default libraries
45
+
46
+ - AppCompat
47
+ - Material
48
+ - ConstraintLayout
49
+ - Lifecycle
50
+ - Room
51
+ - JUnit
52
+
53
+ Robolectric is **optional**, not mandatory. Use it only when the verified Linux/Docker baseline can run it without extra native-runtime breakage or flaky heavyweight downloads. If that is not true, fall back to JVM tests + lint + assemble and document the proof boundary honestly.
54
+
55
+ Add security/storage libraries only when the prompt or selected baseline actually needs them.
56
+
57
+ ## Preferred repo shape
58
+
59
+ - `app/`
60
+ - `core/model/`
61
+ - `core/rules/`
62
+ - `core/data/`
63
+ - `feature/*/`
64
+
65
+ Only add deeper security/media/operator modules during scaffold when the requested technologies already make them necessary.
66
+
67
+ ## Required scripts
68
+
69
+ - `./init_db.sh` when the app has database dependencies
70
+ - `docker compose up --build`
71
+ - `./run_tests.sh`
72
+ - `./run_app.sh` when useful for host-side convenience
73
+
74
+ ## Bootstrap model
75
+
76
+ - use one bootstrap source of truth
77
+ - no committed plaintext bootstrap credentials
78
+ - no `.env` files
79
+ - if local bootstrap data is needed for dev/test, generate it only under ignored build output
80
+ - if packaged seed data is needed, package only non-sensitive assets
81
+ - app runtime must not contain duplicate hidden seed logic outside the chosen bootstrap path
82
+
83
+ ## Room and schema rules
84
+
85
+ - enable `exportSchema = true` when Room is present
86
+ - write schemas to a real repo-visible path such as `app/schemas/`
87
+ - add a real schema verification task when Room is part of the baseline
88
+ - route runtime/test/bootstrap through `./init_db.sh` when database setup exists
89
+
90
+ ## Docker runtime baseline
91
+
92
+ For Android-on-Linux scaffolds, prefer a **toolchain image + bind-mounted workspace + stable support surface** instead of pretending Docker proves full device runtime.
93
+
94
+ Recommended baseline shape from real verification:
95
+
96
+ 1. build a pinned Android toolchain image once
97
+ 2. pre-bake only the heavy reusable layers into that image:
98
+ - Java 17
99
+ - Android command-line tools
100
+ - pinned `compileSdk` platform package
101
+ - pinned build-tools package
102
+ - seeded Gradle wrapper/plugin cache when practical
103
+ 3. bind-mount the project source at runtime so source edits do **not** force SDK reinstall layers to rebuild
104
+ 4. run `:app:assembleDebug` without `clean`
105
+ 5. copy the real APK to a repo-visible `artifacts/` path
106
+ 6. keep the Compose stack alive with a lightweight long-running support service such as an artifact HTTP server
107
+ 7. expose at most one loopback-only host port when that support surface is published
108
+
109
+ This gives `docker compose up --build` a stable healthy state that is both honest and observable.
110
+
111
+ With the verified lab shape, the Compose command should be treated as acceptable when it:
112
+
113
+ - reaches healthy artifact-serving state predictably
114
+ - avoids SDK reinstall on reruns
115
+ - avoids default `clean` builds
116
+ - keeps the expensive work in image/toolchain layers and one running container rather than bouncing across multiple heavyweight containers
117
+
118
+ Avoid the failed pattern of separate Compose build/test containers sharing one mutable Gradle cache volume by default. That strategy easily produces cache-lock contention and does not improve baseline honesty.
119
+
120
+ If `./run_app.sh` also exists, it should:
121
+
122
+ 1. normalize `JAVA_HOME`
123
+ 2. detect `ANDROID_HOME` when available
124
+ 3. run `./init_db.sh` when relevant
125
+ 4. build a debug APK or equivalent baseline artifact
126
+ 5. print the artifact path and any non-sensitive local bootstrap output path when useful
127
+
128
+ ## `./run_tests.sh`
129
+
130
+ `./run_tests.sh` should be containerized and cover the honest Android broad baseline without requiring an emulator:
131
+
132
+ - lint
133
+ - assemble
134
+ - JVM tests
135
+ - Robolectric tests only when the verified Docker baseline supports them reliably
136
+ - schema verification when Room is used
137
+
138
+ Recommended broad-path execution pattern:
139
+
140
+ 1. start the baseline container with `docker compose up --build -d --wait`
141
+ 2. reuse that same running container for Gradle verification (`docker compose exec`) so the already-built toolchain state and build outputs are reused
142
+ 3. smoke-check the same artifact/support surface that `docker compose up --build` claims to provide
143
+ 4. tear the stack down in the script after verification
144
+
145
+ This avoids avoidable second-pass rebuild loops while still proving both the build and the documented Docker contract.
146
+
147
+ ## Minimal real test floor
148
+
149
+ At scaffold, include at least:
150
+
151
+ - one real rule/helper test
152
+ - one real Android-side unit or Robolectric test **when the verified Linux baseline supports it reliably**
153
+ - one real build/lint verification path
154
+ - schema verification when Room is used
155
+
156
+ If Android-side host-runtime tests are not stable on the truthful Linux baseline, replace that requirement with:
157
+
158
+ - at least two real scaffold JVM tests tied to shipped Android entrypoint logic
159
+ - real `lint` + `assemble` proof
160
+ - explicit README disclosure that Docker stops short of Robolectric/emulator proof on that baseline
161
+
162
+ Do not leave the broad path mostly `NO-SOURCE`.
163
+
164
+ ## README floor
165
+
166
+ `README.md` must already state:
167
+
168
+ - scaffold status versus implemented product scope
169
+ - Android-only scope
170
+ - required Docker command: `docker compose up --build`
171
+ - broad test command: `./run_tests.sh`
172
+ - host-side helper command: `./run_app.sh` when present
173
+ - bootstrap/setup honesty
174
+ - main module map and entry-point traceability
175
+ - what stable healthy state means for the Docker support surface
176
+ - what the Docker path does **not** prove on Linux
177
+
178
+ ## Common pitfalls
179
+
180
+ - hardcoded default passwords
181
+ - committed plaintext bootstrap credentials
182
+ - duplicate bootstrap paths in both script and app code
183
+ - unconditional amd64 forcing on arm hosts
184
+ - broad test path with almost no real tests
185
+ - fake emulator/runtime claims
186
+ - `docker compose up --build` that exits immediately after a one-shot build with no stable healthy support surface
187
+ - repeated Gradle or SDK downloads because the Dockerfile copies the entire source tree before caching heavy toolchain layers
188
+ - shared Gradle cache volumes across concurrent containers when a single running container would be enough
189
+ - default `clean` tasks in Docker commands
190
+ - insisting on Robolectric/native host-runtime coverage when it makes the Linux Docker baseline materially less reliable than honest JVM + lint + assemble proof
191
+
192
+ ## Acceptance checklist
193
+
194
+ Scaffold is acceptable when:
195
+
196
+ - `docker compose up --build` succeeds
197
+ - `./run_tests.sh` succeeds
198
+ - bootstrap path is single-source and secret-safe
199
+ - schema export and verification are real when relevant
200
+ - README is honest and traceable
201
+ - minimal real scaffold tests exist
202
+ - no plaintext credentials or `.env` artifacts exist in the repo or package
203
+ - the Docker path reaches a stable healthy artifact-serving state in a reasonable amount of time and avoids obvious rebuild loops on reruns
@@ -0,0 +1,181 @@
1
+ # Angular Default Scaffold Playbook
2
+
3
+ Use this playbook when the prompt explicitly wants Angular rather than a category-open frontend choice.
4
+
5
+ ## Goal
6
+
7
+ Create a simple Angular baseline that:
8
+
9
+ - uses the official Angular CLI bootstrap path
10
+ - pins the working defaults exactly
11
+ - keeps `docker compose up --build` as the runtime contract
12
+ - keeps `./run_tests.sh` as the broad containerized verification path
13
+ - includes minimal real Angular tests without pretending the app is product-complete
14
+
15
+ Verified lab: `/Users/yohannesakd/code/eaglepoint/demonstration/scaffold-lab/angular-baseline`
16
+
17
+ ## Runtime contract
18
+
19
+ - required Docker command: `docker compose up --build`
20
+ - required broad test command: `./run_tests.sh`
21
+ - both commands must be real and working
22
+
23
+ ## Official bootstrap path
24
+
25
+ Angular docs define the local project bootstrap as `ng new [project-name] [options]`.
26
+ The experimentally verified non-interactive baseline here used:
27
+
28
+ ```bash
29
+ npx -y @angular/cli@21.2.7 new angular-baseline --defaults --package-manager npm --skip-git --routing false --style css --ssr false --test-runner vitest
30
+ ```
31
+
32
+ Why this shape:
33
+
34
+ - official CLI path
35
+ - no SSR, routing, or extra product surface at scaffold time
36
+ - standalone app defaults preserved
37
+ - Angular 21 docs show `vitest` as the default test runner for new projects
38
+
39
+ ## Evidence basis for the defaults
40
+
41
+ - Angular CLI docs: `ng new` is the official command to create a workspace and initial application.
42
+ - Angular CLI docs: `test-runner` defaults to `vitest` for new projects.
43
+ - Angular version compatibility docs: Angular 21 supports Node `^20.19.0 || ^22.12.0 || ^24.0.0`.
44
+
45
+ ## Safe pinned defaults used in the verified lab
46
+
47
+ - bootstrap generator: `@angular/cli@21.2.7`
48
+ - Docker base image: `node:24.13.0-alpine3.22`
49
+ - Angular packages: `21.2.8`
50
+ - `@angular/build`: `21.2.7`
51
+ - `@angular/compiler-cli`: `21.2.8`
52
+ - `typescript`: `5.9.3`
53
+ - `vitest`: `4.1.4`
54
+ - `rxjs`: `7.8.2`
55
+ - `tslib`: `2.8.1`
56
+ - `jsdom`: `28.1.0`
57
+
58
+ Pin exact versions in `package.json` after generation so reruns are deterministic.
59
+
60
+ ## Docker / Compose pattern
61
+
62
+ Recommended light baseline pattern:
63
+
64
+ 1. **single pinned Node base image** for both runtime and verification
65
+ 2. **development target** runs `ng serve --host 0.0.0.0 --port 4200`
66
+ 3. **verify target** runs `npm run verify`
67
+ 4. **Compose services**
68
+ - `web` for `docker compose up --build`
69
+ - `test` behind a `test` profile for disposable verification
70
+ 5. **port strategy**
71
+ - expose only the Angular app port
72
+ - prefer `127.0.0.1::4200` so local worktrees do not collide
73
+ 6. **health strategy**
74
+ - use a localhost HTTP healthcheck against `/`
75
+
76
+ This keeps the baseline convergent without adding SSR, nginx, or browser automation.
77
+
78
+ ## Testing baseline
79
+
80
+ Minimum real testing floor for this playbook:
81
+
82
+ - Angular unit tests generated from the official starter
83
+ - at least one rendered-content assertion
84
+ - at least one real user interaction assertion (for example, toggling a panel)
85
+ - `npm run verify` that runs tests and production build
86
+ - `./run_tests.sh` that smoke-checks the live app and runs the verify container
87
+
88
+ Suggested scripts:
89
+
90
+ - `npm run test:ci`
91
+ - `npm run build`
92
+ - `npm run verify`
93
+ - `./run_tests.sh`
94
+
95
+ ## README floor
96
+
97
+ `README.md` must already state:
98
+
99
+ - that this is a baseline scaffold only
100
+ - exact official bootstrap command used
101
+ - required Docker command: `docker compose up --build`
102
+ - broad test command: `./run_tests.sh`
103
+ - exact pinned versions that materially matter
104
+ - what is intentionally included now
105
+ - what is intentionally deferred
106
+ - no `.env` / no secrets policy
107
+
108
+ ## Exact commands actually run in the verified lab
109
+
110
+ ```bash
111
+ npx -y @angular/cli@21.2.7 new angular-baseline --defaults --package-manager npm --skip-git --routing false --style css --ssr false --test-runner vitest
112
+ npm install
113
+ npm run verify
114
+ docker compose up -d --build
115
+ docker compose ps
116
+ docker compose port web 4200
117
+ curl -fsS http://127.0.0.1:<mapped-port>
118
+ docker compose down --remove-orphans
119
+ ./run_tests.sh
120
+ python3 - <<'PY'
121
+ import signal
122
+ import subprocess
123
+ import time
124
+ from urllib.request import urlopen
125
+
126
+ cwd = "/Users/yohannesakd/code/eaglepoint/demonstration/scaffold-lab/angular-baseline"
127
+ proc = subprocess.Popen(["docker", "compose", "up", "--build"], cwd=cwd)
128
+ error = None
129
+ try:
130
+ deadline = time.time() + 240
131
+ while time.time() < deadline:
132
+ try:
133
+ output = subprocess.check_output(["docker", "compose", "port", "web", "4200"], cwd=cwd, text=True).strip()
134
+ if output:
135
+ port = output.rsplit(":", 1)[1]
136
+ with urlopen(f"http://127.0.0.1:{port}", timeout=2) as response:
137
+ if response.status == 200:
138
+ print(f"Angular baseline reached while docker compose up --build was active at http://127.0.0.1:{port}")
139
+ break
140
+ except Exception as exc:
141
+ error = exc
142
+ time.sleep(2)
143
+ else:
144
+ raise RuntimeError(f"Angular baseline never became ready: {error}")
145
+ finally:
146
+ proc.send_signal(signal.SIGINT)
147
+ try:
148
+ proc.wait(timeout=30)
149
+ except subprocess.TimeoutExpired:
150
+ proc.kill()
151
+ proc.wait(timeout=30)
152
+ subprocess.run(["docker", "compose", "down", "--remove-orphans"], cwd=cwd, check=True)
153
+ PY
154
+ ```
155
+
156
+ ## Observed results from the verified lab
157
+
158
+ - `npm run verify`: passed
159
+ - `docker compose up --build`: reached a live Angular page before controlled shutdown
160
+ - `curl -fsS http://127.0.0.1:<mapped-port>`: returned the HTML shell containing `<title>Angular Baseline Lab</title>`
161
+ - `./run_tests.sh`: passed and printed `Smoke check passed at http://127.0.0.1:<mapped-port>`
162
+
163
+ ## Common pitfalls
164
+
165
+ - keeping caret ranges instead of exact pins after generation
166
+ - letting Angular's generated README overstate scope
167
+ - skipping containerized smoke proof and only running local tests
168
+ - adding routing, SSR, API clients, or auth before the baseline is verified
169
+ - checking in `.env` even though the scaffold does not need it
170
+
171
+ ## Acceptance checklist
172
+
173
+ Scaffold is acceptable when:
174
+
175
+ - `docker compose up --build` works
176
+ - `./run_tests.sh` works
177
+ - minimal real Angular tests exist
178
+ - package and Docker defaults are pinned safely
179
+ - README is honest
180
+ - no `.env` is required or committed
181
+ - the result is experimentally verified, not just theoretically scaffolded
@@ -0,0 +1,142 @@
1
+ # Backend Baseline Scaffold Playbook
2
+
3
+ Use this playbook when the request is for a category-level backend/API scaffold and the prompt does not already force a different backend family.
4
+
5
+ ## Goal
6
+
7
+ Create a simple backend baseline that:
8
+
9
+ - uses an official or safest-known bootstrap path for the selected backend family
10
+ - keeps the runtime contract honest and Docker-first
11
+ - includes a real database dependency and a safe config path
12
+ - exposes one portable broad test command
13
+ - stops at baseline infrastructure instead of product-specific features
14
+
15
+ ## Runtime contract
16
+
17
+ - required runtime command: `docker compose up --build`
18
+ - required broad test command: `./run_tests.sh`
19
+ - required database bootstrap command when a DB exists: `./init_db.sh`
20
+ - all three commands must be real and working
21
+
22
+ ## Selection matrix for major backend families
23
+
24
+ | Family | Official / bootstrap path | Strengths | Risks for baseline category work | Decision |
25
+ | --- | --- | --- | --- | --- |
26
+ | Node | `nest new backend-baseline --package-manager npm` | strongest official CLI, batteries included, built-in test scaffolding | heavier config/ORM wiring once safe config and DB state are enforced | good fallback when prompt explicitly asks for Nest or Node enterprise conventions |
27
+ | Python | `python3 -m venv .venv` + pinned install; if available, prefer `uv init backend-baseline` first | fastest API + DB prototype, smallest surface to keep honest, easy Docker/test story | no single dominant framework generator, so some app structure is still hand-wired | **chosen default** |
28
+ | Java | Spring Initializr / `start.spring.io` bootstrap | strongest official generator, production-shaped defaults, rich ecosystem | slower build/test loops, more boilerplate for a neutral category baseline | use when prompt explicitly asks for Spring or JVM enterprise patterns |
29
+ | Go | `go mod init backend-baseline` plus Gin/Chi setup | fast builds, simple container runtime, small deploy footprint | fewer built-in baseline opinions for validation/config/test ergonomics | use when prompt explicitly wants Go or minimal static binaries |
30
+ | PHP | `composer create-project laravel/laravel backend-baseline` or `laravel new backend-baseline` | strong official starter, batteries included, mature testing story | heavier than needed for neutral category baseline; requires PHP/Composer toolchain | use when prompt explicitly asks for Laravel/PHP |
31
+
32
+ ## Chosen default stack and version pins
33
+
34
+ Prototype and default recommendation:
35
+
36
+ - Python `3.12`
37
+ - FastAPI `0.122.0`
38
+ - Uvicorn `0.38.0`
39
+ - SQLAlchemy `2.0.44`
40
+ - SQLite `3` via Python stdlib driver
41
+ - pytest `8.4.2`
42
+ - httpx `0.28.1`
43
+
44
+ Why this default won:
45
+
46
+ - fastest verified path to a real API + real DB baseline
47
+ - Docker and test setup stay readable instead of framework-heavy
48
+ - works well as a category-level default when the prompt does not already lock the backend family
49
+
50
+ ## Bootstrap rule
51
+
52
+ - use the official or best-known bootstrap command for the requested backend family when one exists
53
+ - if the prompt leaves the backend family open, default to the Python/FastAPI baseline above
54
+ - after bootstrap, adapt only enough to make Docker runtime, DB wiring, config, and README honest
55
+
56
+ ## Database wiring pattern
57
+
58
+ - always route the app through one explicit runtime config path such as `APP_CONFIG_PATH=/runtime/config/app-config.json`
59
+ - generate the runtime config file at container startup instead of committing `.env` files
60
+ - for the default prototype, point the app at a SQLite file inside a Docker-managed volume so no DB credentials are needed
61
+ - provide `./init_db.sh` as the single project-standard database setup entrypoint
62
+ - `./init_db.sh` should create the baseline schema or migrations already known at scaffold time
63
+ - when the prompt requires a network DB later, keep the same config-file contract and swap only the database URL and service wiring
64
+
65
+ ## Safe secret/config defaults
66
+
67
+ - no `.env` dependency
68
+ - no committed secrets
69
+ - runtime secret values generated into Docker-managed volumes or mounted secret files
70
+ - app config should be able to load secrets from file paths rather than only raw environment variables
71
+ - Docker startup must work without user-side exports
72
+
73
+ ## Docker / Compose pattern
74
+
75
+ - one app service
76
+ - one database strategy: either an embedded DB file for the default fast baseline or a separate DB service when the prompt requires it
77
+ - one test service behind a `test` profile when practical
78
+ - app exposed on `127.0.0.1` only, preferably with a random host port
79
+ - healthchecks on app and database
80
+ - named volumes for runtime-generated config/state instead of committed files
81
+
82
+ ## Testing baseline
83
+
84
+ At scaffold, include at least:
85
+
86
+ - one health or smoke endpoint
87
+ - one CRUD-ish endpoint with real persistence
88
+ - containerized `./run_tests.sh`
89
+ - pytest, Jest, JUnit, Go test, or framework-equivalent tests that hit real routes and prove DB wiring
90
+
91
+ For the chosen Python baseline, the minimum real test floor is:
92
+
93
+ - `GET /health` proves API boot + DB connectivity
94
+ - `POST /items` then `GET /items` proves real persistence
95
+ - `./run_tests.sh` performs both smoke `curl` checks and containerized pytest execution
96
+
97
+ ## README requirements
98
+
99
+ `README.md` must already state:
100
+
101
+ - scaffold status versus implemented scope
102
+ - chosen stack and version pins
103
+ - required runtime command: `docker compose up --build`
104
+ - broad test command: `./run_tests.sh`
105
+ - database bootstrap command: `./init_db.sh`
106
+ - how config is generated safely without `.env`
107
+ - what is intentionally excluded from the baseline
108
+
109
+ ## Verification commands actually run for this prototype
110
+
111
+ Commands run in `/Users/yohannesakd/code/eaglepoint/demonstration/scaffold-lab/backend-baseline`:
112
+
113
+ ```bash
114
+ docker compose build
115
+ docker compose up --build -d
116
+ docker compose ps
117
+ docker compose port app 8000
118
+ curl -fsS "http://127.0.0.1:32771/health"
119
+ curl -fsS -X POST "http://127.0.0.1:32771/items" -H "content-type: application/json" -d '{"name":"manual-smoke-item"}'
120
+ curl -fsS "http://127.0.0.1:32771/items"
121
+ docker compose down --volumes --remove-orphans
122
+ ./run_tests.sh
123
+ ```
124
+
125
+ Observed result:
126
+
127
+ - app reached healthy state on `127.0.0.1:32771`
128
+ - `./run_tests.sh` finished with `2 passed in 0.49s`
129
+
130
+ ## Known caveats
131
+
132
+ - this baseline uses schema creation via `./init_db.sh`; upgrade to a migrations tool when the prompt starts evolving the schema over time
133
+ - the verified prototype uses SQLite for speed and zero-secret local startup; switch to a network database when the prompt needs external services, concurrent writers, or production-shaped infra
134
+ - the default stack choice is category-level guidance, not a rule; use the prompt-specific family when it is explicit
135
+
136
+ ## What to reuse later
137
+
138
+ - Docker-first runtime contract
139
+ - `./run_tests.sh` wrapper pattern
140
+ - `./init_db.sh` as the single DB bootstrap entrypoint
141
+ - config-file-plus-secret-file wiring instead of `.env`
142
+ - health endpoint + one persistence-backed route as the minimum real backend proof
@@ -0,0 +1,80 @@
1
+ # Backend Scaffold Family Matrix
2
+
3
+ Use this matrix after `backend-baseline.md` when the prompt or existing repo indicates a backend/API scaffold and the backend family still needs to be normalized.
4
+
5
+ ## Selection defaults
6
+
7
+ Follow the original prompt and existing repo first. When the prompt is language-level only, use these defaults:
8
+
9
+ | Prompt signal | Default family | Why this is the safe default |
10
+ | --- | --- | --- |
11
+ | Node.js | Nest + Fastify | strongest batteries-included Node backend starter, clear module structure, good DB/test story |
12
+ | Python | FastAPI | current playbook default; fastest honest API + DB baseline with low scaffold cost |
13
+ | Java | Spring Boot | strongest official bootstrap and production-shaped defaults |
14
+ | Go | Go + Chi | smallest reliable HTTP surface, easy Docker/runtime wiring, low framework lock-in |
15
+ | PHP | Laravel | strongest official starter, migrations/testing already standardized |
16
+ | `not_specified` | Python + FastAPI | current category-open backend default from `backend-baseline.md` |
17
+
18
+ If the repo already uses Express, Flask, Django, Gin, or another supported family, keep the repo family unless the prompt explicitly requests migration.
19
+
20
+ ## Shared contract for every backend family
21
+
22
+ - required runtime command: `docker compose up --build`
23
+ - required broad test command: `./run_tests.sh`
24
+ - required DB bootstrap command when persistence exists: `./init_db.sh`
25
+ - do not depend on a checked-in `.env`
26
+ - generate runtime config into a mounted runtime path such as `APP_CONFIG_PATH=/runtime/config/app-config.json`
27
+ - keep database services internal-only in Compose; publish host ports only when the prompt truly needs direct host access
28
+ - include a real health endpoint plus at least one persistence-backed route or module test
29
+ - wire healthchecks so app startup waits on database readiness when a database service exists
30
+
31
+ ## Supported backend family matrix
32
+
33
+ | Family | Likely scaffold root / bootstrap command | Safe default direction | Right choice when | Baseline API / test structure expectation | Database composition + shared Docker contract |
34
+ | --- | --- | --- | --- | --- | --- |
35
+ | **Nest + Fastify** (default Node family) | `npx @nestjs/cli@latest new <app-name> --package-manager npm` then `npm install @nestjs/platform-fastify` | Node `22 LTS`, TypeScript `5.x`, Nest `11.x`, Fastify `5.x`; keep Nest CLI layout and switch the HTTP adapter to Fastify | prompt says Node.js only, Nest, modular enterprise API, decorators/DI, or team-scale backend conventions | `src/main.ts`, root module, per-feature `module/controller/service`, unit `*.spec.ts`, e2e `test/*.e2e-spec.ts`, `/health` plus one persistence route | compose with SQLite for smallest local baseline or PostgreSQL for network DB; use Prisma/TypeORM/Drizzle only when chosen explicitly or already present; `./init_db.sh` owns migrations; app stays internal and waits on DB health |
36
+ | **Express + TypeScript** | `npx express-generator@latest <app-name> --no-view` then add TypeScript + test wiring | Node `22 LTS`, Express `5.x`, TypeScript `5.x`; keep the stack thin and explicit | prompt explicitly says Express, webhook/middleware-heavy service, or minimal Node API without Nest ceremony | `src/server.ts` or `src/app.ts`, route modules, service/repository split where needed, `tests/integration/*.test.ts` with Supertest, `/health` plus one persistence route | same Docker contract as Nest; prefer PostgreSQL for service DB, SQLite for smallest local baseline, MongoDB only when the prompt explicitly wants a document store |
37
+ | **FastAPI** (default Python family; experimentally verified) | `uv init <app-name>` then add FastAPI dependencies; fallback `python3 -m venv .venv && pip install fastapi uvicorn[standard] sqlalchemy pytest httpx` | Python `3.12`, FastAPI `0.122.x`, Uvicorn `0.38.x`, SQLAlchemy `2.0.x`, pytest `8.4.x`, httpx `0.28.x` | prompt says Python only, API-first service, typed request/response models, fast neutral backend scaffold | `app/main.py`, router package, config/settings module, DB/session module, `tests/test_health.py` and persistence tests using pytest | default local DB is SQLite in a Docker-managed volume; default network DB is PostgreSQL; keep `APP_CONFIG_PATH` contract, run migrations or schema bootstrap through `./init_db.sh`, and gate app on DB readiness when a DB service exists; see `fastapi-default.md` |
38
+ | **Flask** | `python3 -m venv .venv && pip install Flask SQLAlchemy pytest` | Python `3.12`, Flask `3.1.x`, SQLAlchemy `2.0.x`, pytest `8.4.x`; prefer app-factory structure | prompt explicitly says Flask, simple service/webhook, or very small Python backend without FastAPI/Django weight | `app/__init__.py` app factory, blueprints, DB/extensions module, `tests/` with pytest and Flask test client or httpx, `/health` plus one persistence route | SQLite is acceptable for the minimal baseline; PostgreSQL is the default service DB when a network database is needed; use Alembic or a small idempotent bootstrap in `./init_db.sh` |
39
+ | **Django** (experimentally verified) | `python3 -m pip install "Django>=5.2,<5.3" && django-admin startproject <app-name> . && python manage.py startapp api` | Python `3.12`, Django `5.2.x`; add Django REST Framework only when the scaffold is clearly JSON-API-first | prompt says Django, admin-heavy backend, server-rendered platform, or batteries-included Python monolith | project package + one or more apps, `urls.py`, models, migrations, `tests.py` or `tests/`, `/health` or equivalent readiness view, framework test runner or pytest-django | SQLite is acceptable only for tiny/local baselines; PostgreSQL is the default network DB; use Django migrations via `./init_db.sh`; Compose app should wait on DB health before migrations/start; see `django-default.md` |
40
+ | **Spring Boot** (default Java family; experimentally verified) | `curl -G "https://start.spring.io/starter.tgz" --data-urlencode "type=maven-project" --data-urlencode "language=java" --data-urlencode "javaVersion=21" --data-urlencode "dependencies=web,data-jpa,validation,actuator,testcontainers" --data-urlencode "baseDir=<app-name>" | tar -xz` | Java `21 LTS`, Spring Boot `3.5.x`, Maven wrapper by default, Actuator on, Validation on; prefer explicit config properties and a single app module at scaffold time | prompt says Java only, Spring, JVM enterprise conventions, strong validation/config needs, or production-shaped service baseline | `src/main/java/...` with controller/service/repository split, `src/test/java/...`, `@SpringBootTest` and slice tests, `/actuator/health` plus one persistence-backed API | PostgreSQL is the default network DB; MySQL only when explicit or existing-repo driven; use Flyway or Liquibase for SQL migrations, run through `./init_db.sh`, and keep the DB service internal with healthchecks; see `spring-boot-default.md` |
41
+ | **Go + Chi** (default Go family; experimentally verified) | `go mod init <module-path> && go get github.com/go-chi/chi/v5` | Go `1.24.x`, Chi `5.x`; stay close to `net/http`, `database/sql`, and small explicit packages | prompt says Go only, wants a low-magic service, small binary, or direct control over middleware and DB access | `cmd/server/main.go`, `internal/http`, `internal/store`, `internal/config`, `*_test.go` using `httptest`, `/health` plus one persistence route | SQLite is the local default; PostgreSQL is the default network DB using `pgx` or driver-equivalent; keep migration/bootstrap in `./init_db.sh`; no separate DB host port unless explicitly requested; see `go-chi-default.md` |
42
+ | **Go + Gin** | `go mod init <module-path> && go get github.com/gin-gonic/gin` | Go `1.24.x`, Gin `1.11.x`; use only when the request benefits from higher-level JSON binding/middleware helpers | prompt explicitly says Gin or wants faster handler ergonomics than Chi/stdlib | same structure as Chi, but handlers and middleware hang off Gin router groups; tests still use `httptest` and `go test ./...` | same DB and Docker contract as Chi; do not make MongoDB or Redis the default just because Gin is chosen |
43
+ | **Laravel** (default PHP family; experimentally verified) | `composer create-project laravel/laravel <app-name>` or `laravel new <app-name>` | PHP `8.3+`, Laravel `12.x`; keep built-in config/migration/test structure and queue/cache stubs off unless requested | prompt says PHP only, Laravel, admin/back-office style app, or batteries-included MVC/API backend | `routes/api.php`, controllers, models, migrations, `tests/Feature`, `tests/Unit`, `/up` or `/health` readiness route, real DB-backed feature test | MySQL is the conventional default service DB for PHP-only asks; PostgreSQL is also supported when the repo or prompt wants it; SQLite is fine for tiny local/test baselines; Eloquent migrations run through `./init_db.sh`; DB stays on an internal Compose network; see `laravel-default.md` |
44
+
45
+ ## Practical family guidance
46
+
47
+ - **Prefer Nest + Fastify over Express** when the prompt only says Node.js and does not push for minimalism.
48
+ - **Prefer FastAPI over Flask or Django** when the prompt only says Python and the task is an API/backend scaffold.
49
+ - **Prefer Django over FastAPI** only when the prompt implies Django conventions, admin-heavy behavior, or server-rendered/backend-monolith shape.
50
+ - **Prefer Chi over Gin** when the prompt only says Go and does not need extra framework ergonomics.
51
+ - **Prefer Laravel over custom PHP wiring** for every PHP-only baseline unless an existing repo already chose a different PHP framework.
52
+
53
+ ## Verified concrete playbooks
54
+
55
+ - `backend-baseline.md` — verified category-open backend baseline
56
+ - `fastapi-default.md` — experimentally verified FastAPI baseline
57
+ - `spring-boot-default.md` — experimentally verified Spring Boot baseline
58
+ - `django-default.md` — experimentally verified Django baseline
59
+ - `laravel-default.md` — experimentally verified Laravel baseline
60
+ - `go-chi-default.md` — experimentally verified Go + Chi baseline
61
+
62
+ ## Placeholder handling
63
+
64
+ - `backend_family=not_specified` means **choose from the language default table above**, not “invent a new framework.”
65
+ - `backend_language=not_specified` and no existing repo evidence means **Python + FastAPI**.
66
+ - `backend_family=not_specified` with an existing repo means **keep the existing repo family**.
67
+ - `database=not_specified` should not remove persistence entirely; pair the chosen backend family with the default database module from `database-module-matrix.md`.
68
+
69
+ ## Family-by-family default DB pairing summary
70
+
71
+ | Family | Local / smallest honest DB default | Network / service DB default |
72
+ | --- | --- | --- |
73
+ | Nest + Fastify | SQLite | PostgreSQL |
74
+ | Express + TypeScript | SQLite | PostgreSQL |
75
+ | FastAPI | SQLite | PostgreSQL |
76
+ | Flask | SQLite | PostgreSQL |
77
+ | Django | SQLite only for tiny local baseline | PostgreSQL |
78
+ | Spring Boot | SQLite only if the prompt truly keeps things local and tiny | PostgreSQL |
79
+ | Go + Chi / Gin | SQLite | PostgreSQL |
80
+ | Laravel | SQLite for tiny local/test baseline | MySQL |