Design workflow & handoff
How designs move from Claude Design to code — project structure, frame naming, statuses and who moves them, annotations, the handoff bundle, asset export, token releases, change requests after handoff, design QA and responsibilities.
This page is the working agreement between Akram (design), Imad (Flutter apps) and Anis (server, back-office, reseller web). It applies from Day 1 of the design plan to the last design QA.
V1 fits in three months, design to deployment, so handoff is incremental. Each app's frames reach Ready for dev at its client checkpoint, because Imad starts building the reseller app while the back-office is still being designed. Design handoff complete (Day 21) closes the V1 design; it is not the first moment developers see a frame.
Project structure
One Claude Design project, HOCO B2B — Design, shared by link with Anis and Imad (they take the handoff from it) and with HOCO (view and comment, through share links per checkpoint).
| Page | Content | Organised by |
|---|---|---|
| Cover | Name, version (v1.0), status legend, naming rules, the changelog (one row per release and change request), links to this site | — |
| Foundations | Tokens (colour, status tones, spacing, radius), text styles, effect styles (elevation), grids, icon set and custom icons, motion specs, the annotation kit | One frame per foundation (design system) |
| Components-Mobile | Flutter-bound components with variants | Sections: Actions, Inputs, Selection, Commerce, Orders, Field, Feedback, Navigation, System |
| Components-Web | @hoco/ui-bound components, the five back-office page templates, the reseller-web shell | Sections: Primitives, Data, Navigation, Overlays, Maps & planning, Templates, Reseller web shell |
| Reseller App | RA screens with every state | 00 · Flows & wireframes, then one section per inventory section (RA · Onboarding & account, RA · Shopping, …) |
| Delegate App | DA screens | 00 · Flows & wireframes, DA · Access, DA · Day, DA · Tour, DA · Visit, DA · Prospects & conversion, DA · Profile, DA · System |
| Back-office | BO pages: bespoke pages in full, template pages as template plus page spec | One section per sidebar group (inventory) |
| Reseller Web | RW layouts at 1440, 1024 and 768 | Sections mirroring RA |
| Prototypes | Reseller ordering (guest to live tracking); delegate visit day; optional back-office confirmation and delivery | One flow per prototype, with a start frame |
| Archive | Superseded frames, moved here with the date and the change-request id, never deleted | By date |
Rules:
- Components live only on the two component pages. Screens contain instances, never detached copies. Detaching a component needs a written reason in an annotation.
- Every colour, radius, spacing and text style is bound to a token or style. A raw hex value in a screen is a defect.
- One shared mock data set is used in every frame: one store (Bazar du Centre,
REV-000123, Oran, Demi-gros), one delegate, one tour, a few orders. It is consistent across frames and in the canonical formats. - If the project gets too large (several hundred frames with states), split it into a design-system project (Foundations plus Components) and a product project. The page names stay the same.
Frame naming
Format: SCREEN-ID · Screen name · state, for example RA-18 · Checkout · default.
SCREEN-IDandScreen nameare exactly as inscreens.json(English name).stateis kebab-case, from this vocabulary:
| State | Meaning | Example |
|---|---|---|
default | Nominal, data loaded | RA-12 · Catalog · default |
loading | Skeletons | RA-21 · Orders · loading |
empty · empty-filtered | No data · no result for the filters | RA-12 · Catalog · empty-filtered |
error-<code> | One API error, code in lower kebab-case | RA-18 · Checkout · error-credit-limit-exceeded |
offline | No network | DA-06 · Tour programme · offline |
permission-<kind> | Device permission missing | DA-08 · Map & navigation · permission-location-denied |
guest | Visitor without an account | RA-14 · Product detail · guest |
status-<enum-value> | One business status, from enums.json in lower kebab-case | RA-22 · Order detail & tracking · status-shipped |
live-<event> | A live update arriving | RA-22 · Order detail & tracking · live-status-changed |
<sheet or step> | A sheet, dialog or step of the screen | RA-13 · Advanced filters & sort · attribute-range |
suffix · 1/3 | A sequence | DA-14 · New reseller · 2/3 |
suffix · 1440 / · 1024 / · 768 | Web breakpoint | BO-41 · Orders to confirm (new, on hold, assisted) · default · 1440 |
Components use Family/Component with variant properties named like the code parameters: Commerce/Price block, with variant=card|detail|promo|total, state=default|locked. Layers that carry data are named after the field they show (price, availability, orderNumber), so annotations and the handoff read the same.
Design statuses
| Status | Meaning | Set by | To leave this status |
|---|---|---|---|
| WIP | Being designed | Akram | All listed states drawn, annotations done |
| Ready for review | Complete; waiting for the daily feasibility check | Akram (end of day) | Imad (RA, DA) or Anis (BO, RW) answers OK, OK with notes or Needs change within 15 minutes of review time |
| Client review | Feasible; shown to HOCO at a checkpoint | Akram | HOCO's answer is recorded. Assumption: within 3 working days |
| Approved | HOCO approved, or its feedback was applied | Akram, recording the approval (meeting date or comment link) on the section | Assets exported, annotations final |
| Ready for dev | Frozen for build; the dev task may start | Akram, acknowledged by the consuming developer | The developer starts the build task |
| In dev | Being built | Imad or Anis | Build on staging, then design QA |
| Design QA passed | Build matches the design; no open S1 or S2 issue | Akram, after the DQA task | — |
How it shows in Claude Design:
- A status badge component (variants per status) sits at the top left of every section.
- For developers, only Ready for dev sections go into the exported design bundle of a handoff.
- A frame changed after Ready for dev carries a Changed badge with the change-request id and date, and the section returns to Ready for dev.
When each app reaches Ready for dev. The reseller app after checkpoint 3 (Reseller app designs ready for client review); the delegate app after checkpoint 4; the back-office after checkpoint 5; the reseller web after the Day-21 presentation, because WEB-01 starts once the back-office foundation exists. The build tasks are scheduled after these points in the Gantt. A frame that a developer needs earlier, such as the Day-6 onboarding for MOB-06, goes Ready for dev after the feasibility check, with HOCO's asynchronous look recorded.
Annotation conventions
Annotations use the annotation kit on Foundations. Each one starts with a prefix, so its meaning never depends on its colour.
| Prefix | Content | Example |
|---|---|---|
STATE | The states this frame stands for, and links to the other state frames | STATE: default · see error-min-amount, error-credit-limit-exceeded, offline |
ACTION | Trigger → result → feedback | ACTION: tap « Ajouter au panier » → cart.items.add → badge bumps, snackbar « Ajouté au panier » (4 s, action « Voir ») |
COPY | Final French copy, with variables in ICU form | {count, plural, one {# référence} other {# références}} · « Plus que {amount} pour atteindre le minimum » |
DATA | Field ← API operation id (field names as in the OpenAPI document); derived values with their rule | DATA: Solde et crédit ← finance.summary. « En retard » = planned and time slot passed (derived) |
RULE | Requirement ids and the business rule | RULE: [ORD-02] minimum amount from settings; checkout disabled below it |
A11Y | Accessible label, focus order, live region, text scaling | A11Y: announce status changes (polite); stepper buttons labelled « Retirer une pièce » / « Ajouter une pièce » |
RESP | Web breakpoint behaviour | RESP: below 1024 the filter sidebar becomes a drawer with a sticky « Voir 128 produits » |
EDGE | Edge cases and limits | EDGE: names over 2 lines → ellipsis; more than 99 items → « 99+ » |
DECISION | Points that wait on an open decision, with a link to the decision register | DECISION: prices visible before validation (default: yes) |
Every screen frame has at least STATE, DATA and COPY. Every interactive element has an ACTION the first time it appears in a flow.
Using the handoff
- Access. Akram shares the Claude Design project with Imad and Anis by link. The handoff is the shared link plus the exported design bundle and the token file (
hoco.tokens.json). - Filter on Ready for dev. Never build from a WIP or Client review frame. If a needed frame is not ready, ask in the team channel; the 15-minute check exists for exactly this.
- Read tokens, not values. Bound tokens are named (
color/status/success/bg,space/4) in the handoff and in the token file. Use the token, not the hex. - Units. Mobile frames are drawn at 360 × 800, so 1 px in the design = 1 dp in Flutter. Web frames are drawn at 1x CSS pixels.
- Compare changes. The Changed badge and the changelog on the Cover show what moved since a frame was marked Ready for dev. Use them together with the change request that caused the change.
- Component names are the link between the design and
@hoco/ui/hoco_ui. The exported design bundle can be handed to Claude Code as a starting point, but the build always uses the existing library components.
Assets export
| Asset | Format and sizes | Naming | Goes to |
|---|---|---|---|
| Lucide icons | Not exported: used from lucide-react and lucide_icons_flutter by name | Lucide name in the annotation (map-pin) | — |
| Custom icons | SVG, 24 × 24 viewBox, 2 px stroke, currentColor, no masks, filters or transforms | ic-gps-check-in.svg (kebab-case, ASCII) | hoco_ui assets (Imad) · @hoco/ui icon components (Anis) |
| Illustrations (empty states, onboarding) | SVG preferred. If raster: WebP in Flutter density buckets name.webp, 2.0x/name.webp, 3.0x/name.webp; web 1x and 2x | ill-empty-cart | Same |
| Product placeholder | SVG 1:1 | img-product-placeholder.svg | Both |
| App icons (DQA-01) | Master 1024 × 1024 PNG per app. Android adaptive layers (foreground, background, monochrome) at 432 × 432 px with the logo inside the 66 dp safe zone. A corner ribbon for the dev and staging flavors | ic-launcher-reseller-*.png | Imad (flutter_launcher_icons) |
| Splash (Android 12 and later) | Icon centred on a solid blue.600 background. Without icon background: 288 × 288 dp, inside a 192 dp circle. With icon background: 240 × 240 dp, inside a 160 dp circle | splash-reseller.png | Imad |
| Play Store | Icon 512 × 512 PNG; feature graphic 1024 × 500; phone screenshots 1080 × 1920 | store-*.png | Imad (MOB-14) |
| Web | favicon.svg, 32 px PNG, apple-touch-icon 180 × 180, Open Graph image 1200 × 630 (back-office and reseller web) | — | Anis |
| Document templates (DQA-09) | A4 layout spec with measurements, fonts and an HTML/CSS-friendly structure | — | Anis (SRV-18) |
Akram sets the export settings in Claude Design and delivers the exports as one archive per release. The consuming developer commits them; Akram does not need repository access.
Tokens release process
- Change. Akram edits the tokens in Claude Design on Foundations. Values that are already released are never changed silently.
- Export
hoco.tokens.json(W3C DTCG format; see token delivery) and write the changelog entry on the Cover page. - Web. Anis commits the JSON to
AnisBetehi/hocowith a Conventional Commit (chore(ui): design tokens v1.0). The build regenerates the@hoco/uiCSS variables. The release is taggedtokens-v1.0.0. - Mobile. Imad copies the same JSON into
hoco-mobile, regenerates the DartThemeExtensions and commits (chore(ui): design tokens v1.0). - Check. A visual pass in Imad's widget gallery app (MOB-04) and on one back-office page. Akram confirms.
| Version | When | Content |
|---|---|---|
| v0.9 | End of Day 2 | All foundations. Only additive changes afterwards, because MOB-04 starts after Day 3 |
| v1.0 | Day 21 (Design handoff complete) | Final V1 values |
| v1.1 | DES-22 | Only if feedback changes values |
| Later | On change request | Semantic versioning: a value change is a patch, a new token a minor, a renamed or removed token a major (both codebases updated in the same week) |
## tokens v1.1 — <date>
Changed: color.status.warning.fg #B45309 → #A84C08 (contrast on new pill background)
Added: color.whatsapp #128C7E
Reason: CR-014 (HOCO feedback, checkpoint 6)
Impact: status pills (all apps); WhatsApp button (RA, RW)Handoff checklist (Day 21)
- Every V1 frame is Approved or Client review with its open items listed. No V1 frame is WIP.
- Every frame name follows
ID · Name · state, and the states listed on the screen pages exist as frames or asSTATEannotations. - No detached components; no raw hex, radius or font values (checked in the consistency pass).
-
STATE,DATAandCOPYannotations on every screen frame;DECISIONstickers link the decision register. - Prototypes work end to end: reseller ordering, delegate visit day.
- Tokens v1.0 exported; changelog written; the commits are planned with Anis and Imad.
- Assets exported (custom icons, illustrations, placeholders), with app icons and splash drafts for DQA-01.
- The client presentation is held and its feedback recorded for DES-22.
- A 1-hour handoff walkthrough with Imad and Anis: questions answered or turned into change requests.
Change requests after handoff
A frame that is Ready for dev or later changes only through a change request (CR). This covers HOCO feedback after a checkpoint, a design QA finding that needs a design decision, or a developer's proposal.
- Raise. Open an issue in the repository of the affected app:
hoco-mobilefor RA and DA,AnisBetehi/hocofor BO and RW, labeldesign-change. The title is[RA-18] Afficher le crédit disponible au-dessus des méthodes de paiement. The issue gives the screen ids, the reason, who asked, and a link to the frame (node link). HOCO's requests reach it through Anis. - Triage by Anis, within one working day:
- accept, reject, or move to V2;
- size it: S (copy or visual tweak, under an hour of design), M (a new state or component variant, up to a day), L (a new screen, flow or rule);
- check the plan impact. L requests change the scope: they need HOCO's written approval (the cahier's scope clause) and a plan update in
tasks.json.
- Design. Akram changes the frames and adds a changelog row on the Cover, with the CR id, the date and the frames. The changed frames get the Changed badge; superseded versions move to Archive.
- Docs. The screen's page on this site is updated in the same week. The screen pages are the written spec developers read.
- Task. The CR becomes a task: an update of the existing build task if it is not done, or a new fix task. It links the issue and the Claude Design frame.
- Build and QA. The developer implements the change and links the pull request to the issue; Akram checks it in the next design QA.
Rules:
- A design change announced only in chat, by voice, or as a screenshot is not a change.
- A comment on the shared design becomes a CR only when someone opens the issue.
- Frames In dev are never edited without a CR.
Design QA procedure
| Task | Scope | When |
|---|---|---|
| Continuous | Each Flutter component in Imad's widget gallery; each @hoco/ui component as it is built | During MOB-04 and DSH-01 |
| DQA-02 | Reseller app build | After MRA-09 |
| DQA-03 | Delegate app build, including outdoor readability on a real phone | After MDA-11; findings go to MOB-17 |
| DQA-04 | Back-office at desktop, tablet and large widths | After DSH-12 |
| DQA-05 | Reseller web at desktop, tablet and phone widths | After WEB-05, before the functional test campaign (QA-03) |
| DQA-12 | V2 surfaces | P4 |
Devices and settings. Staging builds. One mid-range Android phone (about 6.5 inches, 1080p, a recent Android version), one 360-dp-wide phone, and both at 130 % text size; the delegate app also outdoors at full brightness. Web: Chrome at 1440, 1280, 1920 and 1024 × 768, plus a phone width for the reseller web.
Checklist (screen by screen, against the Ready for dev frames)
| Area | Check |
|---|---|
| Layout | Spacing, alignment and sizes follow tokens. Nothing is clipped at 360 dp or 130 % text |
| Type and colour | Text styles; status pills use the right tone; no stray colours |
| Components | The right variant; correct pressed, focused and disabled states |
| States | Loading, empty, error, offline, guest, pending and live states reachable and matching the frames |
| Copy | French copy as annotated; accents; no-break spaces; no truncated key information; error messages per code |
| Formats | Money 1 250,00 DA; dates; phones; business numbers; no stock quantity shown to resellers or delegates |
| Interaction | Feedback on every tap; transitions; undo and confirmations as specified |
| Accessibility | Contrast spot checks; touch targets; TalkBack labels on icon buttons; focus visible on web; text scaling |
| RTL readiness | Smoke test with the layout direction forced to RTL on key screens (no broken layout, directional icons mirrored) |
| Field (delegate) | Readable in direct sunlight; usable with one hand; GPS and sync states clear |
Evidence. Each issue has a screenshot or a screen recording next to the Claude Design frame link, the device and build number, and the steps to reproduce.
Severity
| Level | Definition | Expectation |
|---|---|---|
| S1 — Blocker | Wrong data or action, broken flow, unreadable text, an accessibility blocker, a stock quantity exposed | Fixed before the release or the acceptance |
| S2 — Major | Wrong component or state, misleading copy, wrong status colour, missing state | Fixed in the current build task or the next fix batch |
| S3 — Minor | Spacing or alignment off by a step, wrong icon, small inconsistency | Batched, with an owner and a date |
| S4 — Polish | Suggestion or improvement | Backlog, or reviewed with the pilot findings (DQA-08) |
Where issues go. GitHub issues in the app's repository (hoco-mobile or AnisBetehi/hoco), with the labels design-qa and S1…S4, and the screen id in the title ([DA-08] Bouton « Je suis arrivé » actif hors tolérance). Assumption: GitHub Issues is the tracker; Anis confirms.
Exit. The DQA task is done when no S1 or S2 issue is open on its scope and the S3 issues have an owner. Akram then marks the sections Design QA passed. Fixed S1 and S2 issues are re-checked on the next build.
Responsibilities
| Activity | Akram | Imad | Anis | HOCO |
|---|---|---|---|---|
| Design system (tokens, components) | Owns, designs | Reviews mobile feasibility; builds hoco_ui (MOB-04) | Reviews web feasibility; builds @hoco/ui (DSH-01) | Approves the direction (checkpoint 1) |
| Screen inventory | Leads Day 5 | Co-validates RA and DA | Co-validates BO and RW; updates screens.json | Confirms the scope (checkpoint 2) |
| Screen designs | Owns | 15-minute daily check on mobile days | 15-minute daily check on web days | Reviews at checkpoints 3–6 |
| Client presentations | Presents | Attends RA and DA | Attends all; records decisions in the decision register | Feedback within the agreed delay; approval |
| Statuses | WIP → Ready for review → Client review → Approved → Ready for dev; Design QA passed | Sets In dev on mobile | Sets In dev on web | — |
| Tokens release | Edits tokens, exports the JSON, writes the changelog | Generates and commits the Dart tokens | Commits the JSON, generates the CSS, tags the release | — |
| Assets | Exports | Integrates mobile assets, icons, splash | Integrates web assets | Supplies vector logos, product photos and the legal mentions for documents |
| Copy (French) | Writes UI and message copy (DQA-10) | — | Reviews API error messages; co-owns DQA-10 | Validates terminology and tone |
| Change requests | Designs, updates the changelog | Implements mobile | Triages, plans, implements web, updates docs and tasks | Raises through Anis; approves scope changes |
| Design QA | Runs it, files issues | Fixes mobile (MOB-17) | Fixes web | — |
| Screen spec pages on this site | Supplies content and corrections | Flags gaps found while building | Publishes and keeps them in sync | — |
Reseller web
Screen specifications RW-01 to RW-15 of the reseller web — what changes from the reseller app at desktop and tablet widths, which app screens each page mirrors, and the web-only concerns: invitation landing, session cookie, live updates, breakpoints, keyboard.
Mobile track
The two Flutter apps at a glance: what each does, Imad's plan, how the mobile work runs in parallel with the server contract, and the first-week checklist.