Un plat par jour, pour toute la nation. Cette page suit la construction de la plateforme
en direct et se rafraîchit automatiquement.
This page tracks the build live and refreshes automatically.
Étapes / Pipeline
✓Bootstrap
✓Research
✓Interview
✓Modules
✓Design
6Specs
7Build
8Hardening
9Done
Prochaine action / Next up
PHASE 5 in progress, module-01 loop r1 reviewed -> ITERATE (3 blockers/18 majors/17 minors, .dancydev/reviews/specs-module-01-r1.md). Module-01 was SPLIT at the seam modules.md pre-agreed: module-01-foundation.md (449 l, 25 AC) + module-01b-pwa-shell.md (354 l, 23 AC); every module depending on 01 also depends on 01b.…
Journal (35)
2026-07-31 14:05specsD-K3: production/build domain settled and PROVISIONED. app.dancymeals.com serves the app over Let's Encrypt (cert expanded to cover it + the nip.io name, expires 2026-10-29, certbot.timer renews); HTTP 301s to HTTPS; nip.io preview, fraudecrypto.com and the 8090-8092/8443 sites all verified unaffected; dotfiles still 403. Also closed a live exposure the owner's wildcard A record created: DancyMeals was nginx's IMPLICIT 443 default_server, so every undefined *.dancymeals.com name was being served the app -- added 000-catchall-tls returning 444 for unmatched hosts. Owner clarified app.dancymeals.com is the BUILD origin only; at completion the app replaces dancymeals.com outright (no migration), which makes domain portability a build-wide rule and adds an origin-rebinding runbook (OAuth redirect URIs, Flutterwave webhooks, PWA scope, ALL push subscriptions). OPEN-44 gate is CLOSED -- modules 02 and 10 unblocked.
2026-07-31 13:20specsowner mandate mid-phase -> decisions.md Batch K: D-K1 latest laravel-boost MCP + ALL its bundled skills, D-K2 skills.sh Vercel-React + shadcn skills, all installed during module-01's BUILD; MCP needs a session reload before its tools are callable, so the install is a checkpoint boundary and counts as done only when verified in a reloaded session. design-system.md still wins over any skill's styling advice.
2026-07-31 13:00designPHASE 4 COMPLETE. All 11 must-fix applied and independently verified (13 archetypes, 17 sections, 47 components, 0 stale contrast refs, mockup linter 0 FAIL, all 6 mockups serve 200). Applying the corrected contrast law forced real changes, not just doc edits: .dm-tabbar and the menu footers moved to --nuit and the chat .step chip got its own --nuit ground, so no small orange text sits on --terre anywhere; chat composer raised 15px->16px (iOS zooms any control under 16px and A5 is position:fixed, so the zoom is unrecoverable); .dm-topbar height changed to calc(--bar-top + safe-area-inset) because border-box was letting a 47px notch eat the bar down to ~9px usable; .dm-money gained white-space:nowrap. Closed one item the executor left open: --alerte on --nuit is 2.53:1 not the documented 3.1:1 — below even the 3:1 non-text floor — so the urgent band rule fill also becomes #FF6B7A and the urgent state is now one colour. Executor correctly rejected 4 reviewer claims with evidence. Should-fix 1-15 deliberately deferred. NEXT: phase 5 specs, module-01-foundation.
2026-07-31 10:25designadversarial review of design-system.md: SHIP WITH FIXES, 11 must-fix + 15 should-fix. Most serious is MY error: --braise on --terre is 4.31:1 not the 4.9:1 I asserted in ART-DIRECTION.md, so it FAILS AA for body text — and that wrong number had become the design system's single stated exception ("the only place orange may be text"), licensing failing 11px tab labels, footer links and chat chips across 18 modules. Independently recomputed with the WCAG formula and confirmed; every other headline ratio holds. Also caught: design-system banned cook photographs (my mockup-only "no real faces" instruction leaked into a product rule) which contradicts D-D2 — cook photos ARE the pre-payment trust signal. Fixing surfaces rather than the mandated brand colour: orange-bearing chrome moves to --nuit (5.26:1), visually near-identical.
2026-07-31 10:05designOWNER APPROVED ALL 5 SCREENS at every breakpoint, no changes requested -> D-J6. Mockups are now visual ground truth. Writing the binding design-system.md (all 13 archetypes incl. the 8 unmocked, component inventory mapped to shadcn, contrast law, self-hosted-font requirement, PWA/perf budget, a11y floor).
2026-07-31 09:55design5 mockups built in parallel against ART-DIRECTION.md + tokens.css (shared stylesheet used to mechanically prevent 5 agents producing 5 different-looking apps): menu FR+EN, checkout, cook day board, chat, admin disputes. Verified via Playwright at 360/390/1440. Fixes applied on review: unified the day-state vocabulary (strip said "Ouvert" while cards said "Disponible" — one state, two names) incl. the JS SHORT map; chat location pin was orange on white (2.9:1) -> maroon; card payment marked [later] per feature 76 rather than shown as a live v1 option; cook earnings copy misstated delivery as commission-free (D-B1 puts it INSIDE the base) — rewritten to state the batching margin accurately; .dm-masthead links raised to a 44px tap target. Conformance linter: 0 FAIL. BLOCKED awaiting owner validation.
2026-07-31 09:10designowner settled 4 open items -> D-J1..D-J5. D-J1 overrode my recommendation: ONE permission-protected panel, shell switches at 768px (mobile-app feel below for EVERY actor incl. admin, space-leveraging web app above) — no separate cook app. Art direction "Peinture d'enseigne" (Cameroonian painted signage) written to ART-DIRECTION.md + enforced by tokens.css. Found a correctness issue: #FE670E is 2.9:1 against white so white-on-orange FAILS AA — primary button is orange fill with near-black ink (5.9:1). 8 real CC-licensed Cameroonian dish photos fetched from Wikimedia Commons into design/img/
2026-07-31 08:10designscreen-inventory.md written — 224 screens across all 18 modules grouped into 13 archetypes (A1-A13), weighted by time/money/difficulty; 5 validation screens selected (menu, checkout, cook day board, chat, admin disputes); 5 open items raised for phase 4 to settle
2026-07-31 06:45modulesadversarial critic: YES WITH FIXES, 14 must-fix. Root cause = modules.md was drafted against a decisions.md that predated the X5 correction round (my sequencing error). Real bugs found: nobody owned delivered->completed so cook payouts never finalise; post-cutoff/late-auth orders had no assigner; order-line price snapshot orphaned so a bulk reprice would rewrite settled payouts. Applying fixes + adopting 18-module split.
2026-07-31 06:10interviewPHASE 2 COMPLETE — owner explicitly confirmed the reconciled project ("Confirmed - proceed to modules"). 44/44 vision markers + 8/8 gap-check blockers resolved. vision.md + decisions.md are now the authoritative product definition.
2026-07-31 06:02interviewBatch I part 2 answered — float = 20% of commission to a self-scaling target (30d refunds + outstanding wallet liability), owner withdrawals gated below floor, wallet solvency enforced; cook-fault refunds adjudicated cook-then-admin with CAPPED recovery from future earnings (lawful because cooks are partners not employees); dispute windows tiered 1h/3h/end-of-day with a published non-qualifying list. INTERVIEW COMPLETE.
2026-07-31 05:55interviewgap-check returned 8 blocking gaps + 4 contradictions; corrections X1-X4 applied (lifecycle fixed: disputed becomes a parallel record, awaiting_authorisation/payment_abandoned added; wallet-funded orders release on completion). Batch I part 1 answered — fairness tallies FOOD ONLY (delivery in tally would have penalised the very quartier-batching the economics depend on); capacity held at payment initiation w/ 15min expiry + 60min post-cutoff honour; 28-day rolling availability, min 4 days soft-blocked; orders never split.
2026-07-31 05:32interviewlive preview domain UP: https://dancymeals.187.124.32.211.nip.io — Let's Encrypt cert (expires 2026-10-29, certbot.timer auto-renews), nginx name-based vhost on shared 80/443 (no port clash), HTTP->HTTPS 301, dotfiles 403, other sites unaffected. Root is public/ so Laravel takes over with no nginx change.
2026-07-31 05:18interviewBatch H answered — cook buys ingredients; expansion timing is owner's call but admin must fully support country/city creation; user guide = role-filtered admin content; all locale/calendar/complement/edit-lock assumptions confirmed. NEW REQUIREMENT (D-H5): nip.io SSL live-preview domain + nginx/UFW, with a recommendation to register the real domain before auth/payments work.
2026-07-31 05:08interviewBatch G answered — NO SMS anywhere (drops the 3-week MTN sender-ID lead item off the critical path); ratings split dish-vs-cook and are separate from moderated testimonials; soft invite-only launch w/ seeded geography from an OSM extract; explicit bad-day playbook incl. cut-off catch-up guard
2026-07-31 05:00interviewBatch F answered — full guest browsing w/ cart survival; chat carries text+image+LOCATION (OSM pin, opens in Google Maps — owner addition, and critical since Yaounde has no street addressing); delete personal data but keep anonymised financials; auth = Email OTP + Email/password + Google, NO SMS (owner declined; non-SMS phone mitigations adopted)
2026-07-31 04:52interviewBatch E answered — one payment per multi-day session w/ ledger allocation (forces the hand-rolled double-entry ledger); wallet-credit default + admin-only cash escape hatch w/ maker-checker; payout on ACTUAL settlement (T+1) with a retained platform float before owner distribution
2026-07-31 04:45interviewBatch D answered — full order lifecycle w/ handover-code proof of delivery; cook roster shown pre-payment, specific cook revealed at dispatch; single 12h00-15h00 window (protects cook batching margin); free cancel/modify until cut-off then committed, with post-cut-off address+phone edit as the transfer valve
2026-07-31 04:38interviewBatch C answered — owner rejected per-cook capacity declarations; capacity is a CITY STANDARD cooks are vetted against, which removes the under-declaration flaw and validates the brief's raw-value fairness rule unchanged (supersedes D-B4). Confirm 2h/redeem 30min sequential+excused absences, plus owner's off-duty cover-request escalation. Performance governs standing not order flow. Helpers get own logins, honest in-brand attribution.
2026-07-31 04:28interviewBatch B answered — visible delivery fee INSIDE commission base (owner's batching-surplus reasoning resurrects the 3.1x upside on the cook's side); cut-off 20h00 D-1 Africa/Douala; dispatch = single pass at cut-off; capacity = servings/cook/day
2026-07-31 04:20interviewBatch A answered — curated partnership (5-10 vetted home cooks/city, revenue-share, NO retainer); sale units fully configurable w/ bilingual name+image; delivery off-platform (cook's own rider); commission configurable 5-15% w/ promo reductions. Retainer removal makes the model materially more survivable than the researched one.
2026-07-31 04:05interviewadversarial critic launched over research.md Part 5; SMS/notifications gap-fill still running
2026-07-31 04:02discoverycameroon-pricing lane complete (7.4k w, 46 sources) — single delivered plate nets ~284 XAF (8%) and loses to a 600 XAF tourne-dos; marmite (7000-8000 XAF / 7 pers) nets ~1013 and IS mass-market. The pot is the business model — commit 3cfce4a
2026-07-31 04:00discoverystack lane complete (15.2k w) — Laravel 13 runs on PHP 8.3 (no upgrade needed); Inertia is v3 not v2; OSM tiles+Nominatim prohibited in production -> MapTiler $30/mo; react-leaflet pins leaflet alpha -> MapLibre; pg_advisory_xact_lock not SKIP LOCKED for fairness; Node 20 EOL — commit 22db2b0
2026-07-31 03:50discoverylaunched cameroon-pricing gap-fill lane (food prices, delivery fees, COD conversion were inferred-only)
2026-07-31 03:50discoverycameroon-reality lane complete (9k w) — Flutterwave v3 NOT sunset; in-app MoMo viable via mobile_money_franco callback mode (Orange CM unverified); XAF integer-only; Nominatim resolves quartier + Yaounde I-VII; cut-off D-1 20h00; employee-vs-revenue-share legal conflict — commit 03deffa
2026-07-31 03:44discoverycompetitors lane complete (7.3k w) + competitors-gaps lane (4.7k w) — Flutterwave webhook retry limit mandates a reconciliation console; Deliveroo Bologna ruling makes the claim mechanic a labour-law risk; Glovo 'excellence score' claim disproved and annotated — commit c36551c