ben.stull
60a06de302
docs(products): DOC-2 column reference served at /api/products/columns.md (SLICE-8)
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-06-12 02:24:05 -07:00
ben.stull
7f51f5242f
feat(products): app-served image route — storefront-authorized, immutable cache (SD-0002 §6.4, INV-16)
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-06-12 00:34:04 -07:00
ben.stull
5d5341b29b
feat(products): confirm → fetching_images + post-commit fetch scheduling + startup recovery (SD-0002 §6.5.3/§6.9)
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-06-12 00:30:08 -07:00
ben.stull
155f9bd147
feat(api): GET /api/products/export — streamed canonical CSV, 409 empty_catalog (§6.4, PUC-9)
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-06-11 22:05:55 -07:00
ben.stull
4dacc2dafd
feat(products): /api/products/* BFF endpoints + sample.csv (DOC-3)
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-06-11 16:18:34 -07:00
ben.stull
22d738fc74
feat(slice-4): honest delivery failure — send-before-commit + 502 delivery_failed (INV-9; closes #7 )
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-06-10 23:35:01 -07:00
ben.stull
9f4295b77e
feat(slice-4): backend serves the built SPA — the deployed nginx-proxies-all topology (launch-app §2)
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-06-10 23:32:22 -07:00
ben.stull
a1c5544694
feat(slice-4): VERSION file + versioned /healthz — the flotilla verify contract (§8.1)
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-06-10 23:31:20 -07:00
ben.stull
306b5c1e5d
feat(slice-3): POST /api/storefronts + storefronts-fed entry routing (§6.4/§6.5)
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-06-10 22:36:50 -07:00
ben.stull
cfc28d7002
fix(slice-2): surface ecomm.* INFO logs so the one-time code reaches the dev log
...
uvicorn configures only its own loggers, so the LogMailer INFO line — PUC-10's local dev
channel (the code in the backend log) — was swallowed. Add an idempotent dedicated handler
for the 'ecomm' logger (propagate=False) in create_app so dev.sh/uvicorn runs show the code.
Caught by the SLICE-2 end-to-end walk; unit tests read the in-memory outbox and didn't.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-10 10:42:30 -07:00
ben.stull
d2eceac272
feat(slice-2): deps — mailer + session dependencies; build mailer at startup
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-10 10:34:13 -07:00
ben.stull
ef385340e8
feat(slice-1): FastAPI factory + /healthz; self-migrate at startup (INV-1/§6.4)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-10 08:38:42 -07:00
ben.stull
4acab40653
feat(slice-1): backend skeleton, deps, and import-linter layer contract
...
Four-layer package (main > domains > platform) per SD-0001 §6.2; GraphQL api layer
deferred. main.py is a stub so the top layer exists from the start (fleshed out in
the /healthz task). lint-imports green on the skeleton.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-10 08:34:38 -07:00