meet.boas.dev · Design Bible — living canon (conventions + every screen)
The Lane-A Client Journey, screen by screen.
Every interface a client meets from first invite to post-meeting summary — in journey
order, each pinned to its design-of-record and judged against what production actually
serves. This is the walkable visual truth behind the canon table; where a screen and its
build disagree, the divergence is shown, not hidden.
Live-verified 2026-07-08 · Lane A ruled (R1) · full machine walk RUN 5 GREEN end-to-end (metis 081)
8Journey screens
5 / 6Divergences closed
1Remaining design gap
RUN 5Walk GREEN — fresh booking, no shortcuts, ends in /g (PR #238 / #239)
Verdict:MATCHES live = design · BUILT / PENDING designed & built, awaiting merge / link ·
DIVERGES live ≠ design · GAP ruled, not yet built.
Lane key: each screen carries its lane-entry ref — R1–R5 rulings, G# gap register,
canon # row in PRODUCTION-SCREEN-CANON.md — so it maps 1:1 onto the Live PRD lane entries.
Evidence:[live] vs prod · [code] vs landed renderer · [design] apollo design-of-record.
R6 — BUILT + WALKED (082, PR #238 1b529bd): after booking, the client's home is the ★ /g portal (their space — countdown, prep, artifacts, past meetings); accept mints a 90d guest token inside the OTP-verified POST → confirmed card portal-CTA + 4.5s auto-forward to /g/<slug>?t&ns; confirmation mail leads with the portal, /m demoted to a per-meeting manage deep-link. Walk RUN 5 arrived in /g — first ever end-to-end.
§
Conventions & Laws
design SSOTapollo · livingevery meet.boas.dev surface obeys these
No h1 / no decorative headlinesContent leads. Eyebrow + section labels only. [operator 2026-07-09]
No self-referential metaThe "this page is the product / you got here via the thing we build" framing is banned as a class — not just a string list. [operator 2026-07-09]
No narration ledesNever summarize what a page or section is about to say in a heading, lede, or sub-line. An empty lede omits the element entirely. [operator 2026-07-09]
No fabricated claimsState a capability or integration only if shipped + verifiable. Offers are stated as offers, with attribution; status labels match reality. NULL over guess (= CRM rule #20). [operator 2026-07-09]
User-zone navigationEvery guest artifact page (prep / doc / deck) carries a top-left ← Back to portal. Target is client-derived from the page's own URL; the ?t= token is preserved.
Warp disciplineONE warped protagonist per surface (the procedural .edge--frame / console CTA). Everything else crisp.
Hard bansNo left-accent card / callout bars. No #4a4a4a text on dark.
LanguageNarrative = EN (rule #13); chrome may localize. Any Icelandic prose runs the hard gate.
Template disciplineGuest artifacts are byte-derived from a canonical template + per-world slot data — instances are never hand-edited. Contract: metis content/guest-prep/_template/SLOTS.md (mirrors these laws).
1
Invitation email
R2 · canon #1metis · WIRED🟢 CLOSED
proposal-invite · multipart/alternative · v3.4.0 · LIVE render
Design of recordemail-suite/v3/proposal-invite.html — "You're invited", accept / reschedule. Live preview above renders the real HTML (hosted band + sample vars); this screen is now live code, not a screenshot.
Verdict — live vs design🟢 CLOSED (070 R2). The designed HTML invite is sent as branded multipart/alternative via mercury-send (d809807, athena live-verified). Was plain-text (divergence #2) — closed. [code][live]
Canon reconcile — 2026-07-09 (093)🟢 RECONCILED to the email-hybrid tier. Operator judged the render "not at all inline." Grounded against the primitive SSOT — boas-dev/brand/boas-kit.css + boas-dev/reference/email-hybrid-partial.html + boas-dev/brand-guide.md. The email tier = light body + dark procedural band PNG (carries the edge+halftone) + bulletproof console button + azure 4px left-tick readout (RULE 3). The left-tick is the EMAIL primitive (the edge blue-structure pole echoed for a medium with no feTurbulence) — distinct from the web no-left-accent law; an earlier edit wrongly stripped it and it is restored. Title = Bricolage display <div> (no <h1>). Render-verified. metis re-installs into the mercury template. [design: 093][code: email-suite/v3][primitive: boas-kit.css]
2
/p proposal — the booking surface, all states
R1 (THE journey) · canon #2/3/Ametis🟢 MATCHES (page)🟢 counter LIVE (#231)🟢 G11 fixed (078)
renderProposalError — branded shell, reuses the .term vocab (PR metis#214 merged). Live-renderer state; captured in the /p page renderer, not a separate design file.
Counter — desktop calendar (design-of-record)
Design of recordreports/2026-06-30_p-page-v3/ (page) + reports/2026-07-08_p-counter-calendar-desktop-v3/ (desktop counter, 8-wk horizon) + proposal-page.ts. Live states render:screens/p-page.html — fresh · accept→email · OTP entry · declined, all four in one iterable file (replaces the old static shots), no <h1> per § Laws.
Verdict — page🟢 MATCHES. The branded booking lane is fully built, v3.4.0. Lane A /p is THE client journey (R1) — cal.com is backend-only; any client-visible cal.com surface is a bug. [code][live]
Verdict — counter picker🟢 LIVE IN PROD. Desktop-first two-pane calendar shipped into the live renderers (shared availability-picker.ts), retiring the cramped slot-list. PR metis#231 merged→main (45bed53 cherry-picked clean, tsc + 332 tests green), CF-deployed; /p?step=counter serves the two-pane calendar (calgrid / month / week markers live). 8-wk horizon is a non-blocking follow-up (data-driven — auto-extends when metis adds getRangeSlots + MAX_DAYS→56). [live: metis-verified][code: #231]
Verdict — OTP leg (G11)🟢 FIXED + DEPLOYED. The E2E run-2 post-OTP 410 (gap G11) is fixed — idempotent terminal on booked proposals (task 078, 6fd99e4), merged to main and carried live by the #231 deploy. The E2E run itself is the live proof of the leg. [code+deploy]
2b
/book — walk-up main booking page
R1 · canon #2 · metis#256metis · LIVE (PR #257)🟢 LIVE
Live surface — view at meet.boas.dev/book. Rendered server-side from functions/lib/book-page.ts (the shared two-pane picker + identity fields); static render pending.
Verdict — live vs design🟢 LIVE (metis#256, PR #257). Own-branded MAIN booking page — walk-up guests pick a slot on the two-pane calendar, enter name/email, and enter the /p journey (OTP → accept → booked → confirmed). cal.boas.dev retired from all guest exposure (backend-only; safeUrl + tests enforce). The durable Book target from every guest surface (portal book-btn, prep CTA → /book). [live][code: #257]
Picker canon — unifiedOne shared picker lib (availability-picker.ts · availabilityPicker()) across /book + /p counter + /reschedule — apollo desktop-first two-pane calendar (PR #231), data-driven horizon (auto-extends to 8wk when metis raises MAX_DAYS). Design pass 092: added the missing #tz-note viewer-local-time reassurance on /book.
Content-law flag — counter h1⬜ FLAG (§ Laws: no h1).renderProposalPage(step=counter) (proposal-page.ts:276) still renders <h1>{row.title}</h1> — pre-dates the no-h1 ruling. Fix: drop to an eyebrow lede like /book. The other /p steps share the same h1 pattern; same fix applies. metis to ship (live renderer).
3
Booking confirmation email
R3 · canon #5metis · WIRED🟢 CLOSED
confirmation · single branded · ics · email-suite/v3
Design of recordemail-suite/v3/confirmation.html — one branded email, ics + /m link. Canon reconcile 2026-07-09 (093): aligned to the email-hybrid tier — keeps the azure 4px left-tick readout (RULE 3, the email primitive), title demoted to a Bricolage display <div> (no <h1>).
Verdict — live vs design🟢 CLOSED (070 R3). cal.com native attendee email suppressed (live-verified zero cal email post-flip, f798c1c); the single branded confirmation is the sole send. Was a double-send (divergence #5) — closed. [code][live]
G12 — delivery fixed🟢 Mail now actually lands. The confirmation queue-drainer had never loaded (all mail unsent since 06-27) — now inline JMAP, landed-mail proven. [live]
R6 — where it points (BUILT + WALKED, 082)Post-confirmation, the client's destination is their /g portal (screen 6). The confirmation mail now leads with the portal CTA and demotes the /m meeting link to a "manage" deep-link (PR #238 1b529bd); walk RUN 5 confirmed the mail landed portal-primary. The portal, not the bare card, is home. [live: RUN 5]
4
/m per-meeting page (deep-link plumbing)
R6 · canon #6metis · DEPLOYED🟢 MATCHES
/m/<uid> · v3.4.0 · m-page-v3 design-of-record
Design of recordreports/2026-06-30_m-page-v3/ + m-invitee-design.patch; renderer confirms dual-tz + live countdown + JOIN + JaaS embed.
Verdict — live vs design🟢 MATCHES. Countdown, joining-as, JOIN, add-to-calendar, choose-new-time, cancel — v3.4.0 deployed, matches design. [live]
R6 — role reframed (BUILT + WALKED, 082)/m is the per-meeting manage deep-link, not the post-confirmation landing. The client's home after booking is their /g portal (screen 6). /m/<uid> is reached FROM the portal or the confirmation mail's demoted "manage" link — the single-meeting join/prep view. Walk RUN 5 rendered /m as the manage view (UPCOMING · JOIN), not the destination the client is dropped on. [live: RUN 5][code: PR #238]
meet.boas.dev/ · our shell · 8x8 media backend only
Design of recordThe room index.html pre-join shell itself; v3.4.0 blue reskin 72aa670. 8x8 (JitsiMeetExternalAPI("8x8.vc")) is the media backend only — vendor watermark off (SHOW_BRAND_WATERMARK:false). preview: shell only — external 8x8 media not loaded in-frame
Verdict — live vs design🟢 BUILT + DEPLOYED (v3.4.0). Our own branded pre-join shell wraps 8x8 as media backend; PR metis#217 merged (883c41f) + deployed — live-verified all-blue, Bricolage, #edgeLive, watermark off. The prior "vendor chrome" verdict was wrong (read a running media session as the whole surface). Operator ruling: full branded room, no JaaS tune. [live][code]
/g/<slug> · guest variant of the /me portal system
Design of recordreports/2026-07-01_me-portal-full-v3/ + me-portal-design-analysis.md. /g inherits the /me portal pattern — greeting, tabs, meetings w/ decisions/actions, graph, book-CTA. (Preview shows the populated /me composition-of-record; live /g is the guest variant, ratified matching.)
Verdict — live vs design🟢 MATCHES + PINNED + WALKED (082). Live render (HTTP 200) ratified as the guest-variant canon of the /me portal system, now walked green end-to-end (metis 081, RUN 5). All four prior walk gaps closed (PR #238 1b529bd): (a) artifact surface built (token-gated /g/<slug>/prep, hero-zone card — screen 7); (b) R6 arrival wired (auto-forward + confirmation-mail portal CTA); (c) countdown LIVE (ticks 1/s, ?ns arrival hint — walk showed T-15:58 ticking); (d) ego-graph verified (12 nodes / 20 edges, 10× colleague_of). [live][code]
R6 — the post-confirmation destination (BUILT + WALKED, 082)This is where the client lands after booking — their space. Countdown to the next meeting, prep, artifacts (screen 7), and past meetings all live here; the portal deep-links out to the specific /m per-meeting view (screen 4) and the room (screen 5). Walk RUN 5 auto-forwarded into /g/demo-rehearsal?t&ns — the journey's client home is the portal, proven, not a bare meeting card. [live: RUN 5]
G10 — resolved🟢 CTA retargeted off cal.boas.dev. The guest /g book-CTA no longer leaks a cal.com surface — retargeted to the Lane-A pipeline (task G10, 09252ae), merged to main + deployed with #231. R1 restored on the portal. [code+deploy]
/g/<slug>/prep · token-gated · opened from a portal hero-zone card
Design of recordservices/meet-boas-dev/content/guest-prep/_template/ (metis) — canonical guest-prep template + per-world slot data; the Coral instance is byte-derived (render.mjs). Slot contract mirrors the Conventions above: _template/SLOTS.md.
Verdict — build state (091 rework)🟢 REWORKED + TEMPLATIZED (091, 2026-07-09). Operator live-walk rulings applied: zero banned meta-copy, no h1, condensed, ← Back to portal nav (client-derived, token preserved), own-domain CTA slot ({{book_url}} → our /p; never mailto/cal.com). Now a strict template with auto-population slots for metis#252. Handed to metis; ships via build-guest-prep.mjs. [design: 091][code: metis _template/]
Deviation from apollo mount-spec — VERDICT: ACCEPTSpec 079-ui-bible/coral-artifact-mount-spec.md said copy into assets/guest/…. But /assets/* is public per auth-policy — a static copy bypasses the token gate the spec itself mandates (capability escalation). Metis embedded the content as functions/lib/guest-prep-content.ts (generated by scripts/build-guest-prep.mjs) = reachable ONLY through the gate. The gate was the load-bearing WHAT; assets/guest/ a contradictory HOW — accepted. apollo-meta comment strip (internal-category leak in a client-reachable file) accepted too.
8
Guest post-meeting summary (on /m)
G2 · canon #8apollo design · metis data-contract⬜ RULED → DESIGN OPEN — the one remaining journey gap
/m post-meeting state · dual-consent-gated · design-of-record (not yet built)
Design of recordreports/2026-07-08_m-postmeeting-summary-v3/ — the /m post-meeting state, 3 dual-gate variants (consent-pending · release-pending · summary-ready), brand-guardian-clean.
Verdict — the remaining gap⬜ RULED → DESIGN OPEN (operator P0). Expose the transcript summary (not the raw transcript) to the guest on /m, dual-gated: renders only when recording_consent=true AND summary_released_at != null. Design-of-record exists; build waits on the metis meetings data contract (both fields). This is the sole open client-journey gap — every other divergence is closed. [design]
This is the single canonical place for meet.boas.dev design — conventions (§ Laws) + every screen's design-of-record + live-vs-design verdict, one document. It is living: apollo updates it the same session a surface ships (operator standing duty). Viewable on the Apollo hub, grouped under project meet-boas-dev. Law-ledger source:projects/meet-boas-dev/PRODUCTION-SCREEN-CANON.md (markdown per-screen pin + verdict) · lane epic:client-journey · Live PRD 2026-07-08-lane-a-client-journey-live-prd.md. Implementation mirror: metis content/guest-prep/_template/SLOTS.md. Design: apollo · meet.boas.dev portal v3.4.0 · living canon, last reconciled 2026-07-09 (093 — invite+confirmation canon-fix, scheduling arc fully live-code, no screenshots) · EN.