What happened
A brand-new dotnet new goldpath-solution (postgresql, broker none, openid, features: multitenancy+audittrail+idempotency+dataprotection+caching+locking+notification, vertical-slice) fails its own generated smoke test, locally and on CI identically: /health/ready hangs until the HttpClient 100s timeout.
Root cause
The template generates zero migrations, while the dev flow applies migrations ("Development auto-creates" per the generated CLAUDE.md). With nothing to apply there is no schema; Quartz cannot initialize (42P01: relation "qrtz_job_details" does not exist) and blocks startup; the Aspire proxy holds the socket, so the crash presents as a hang — the worst diagnostic shape.
dotnet ef migrations add Initial fixes it completely: the generated model already contains every module table including qrtz_* (67 references — the same count as CorPay's committed Initial). Smoke goes green in 22s.
Why no existing gate caught it
CorPay's migrations were committed long ago — only a FRESH generation walks this path, and no CI lane generates fresh. The first-click contract ("runs with one click") is broken for every new adopter on a jobs-bearing shape.
Suggested fix (either)
- Template ships the Initial migration per shape (heavier to maintain per feature-combination), or
dotnet new quickstart + generated CLAUDE.md state the one command, AND a CI lane generates a fresh solution and runs its smoke — the gate that makes the first-click contract mechanical.
Option 2 matches ADR-0005 (every standard ships with its verifier).
Found by the qorpe.apiPortal pilot's S0 — first fresh generation since CorPay.
What happened
A brand-new
dotnet new goldpath-solution(postgresql, broker none, openid, features: multitenancy+audittrail+idempotency+dataprotection+caching+locking+notification, vertical-slice) fails its own generated smoke test, locally and on CI identically:/health/readyhangs until the HttpClient 100s timeout.Root cause
The template generates zero migrations, while the dev flow applies migrations ("Development auto-creates" per the generated CLAUDE.md). With nothing to apply there is no schema; Quartz cannot initialize (
42P01: relation "qrtz_job_details" does not exist) and blocks startup; the Aspire proxy holds the socket, so the crash presents as a hang — the worst diagnostic shape.dotnet ef migrations add Initialfixes it completely: the generated model already contains every module table including qrtz_* (67 references — the same count as CorPay's committed Initial). Smoke goes green in 22s.Why no existing gate caught it
CorPay's migrations were committed long ago — only a FRESH generation walks this path, and no CI lane generates fresh. The first-click contract ("runs with one click") is broken for every new adopter on a jobs-bearing shape.
Suggested fix (either)
dotnet newquickstart + generated CLAUDE.md state the one command, AND a CI lane generates a fresh solution and runs its smoke — the gate that makes the first-click contract mechanical.Option 2 matches ADR-0005 (every standard ships with its verifier).
Found by the qorpe.apiPortal pilot's S0 — first fresh generation since CorPay.