IR Brief — STAND BY Fix + Teletype Receipt Sequence¶
SURFACE: ir.ucca.online (ucca-ir) DO NOT TOUCH: ucca-keys, t.ucca.online, any other Worker or repo
Part 1 — Fix STAND BY card (do this first)¶
1. Kill the ghost logo¶
Delete this line from the HTML:
Delete the.ucca-logo-faded CSS rule entirely.
2. Fix horizontal overflow¶
The card overflows the viewport on narrow screens due to letter-spacing + padding. Apply:
.receipt-block {
width: calc(100vw - 2rem);
max-width: 380px;
box-sizing: border-box;
overflow: hidden;
}
.receipt-headline {
letter-spacing: 0.15em; /* was 0.3em */
}
.receipt-cta {
letter-spacing: 0.12em; /* was 0.25em */
}
3. Constrain the container¶
#ir-confirmation {
width: 100%;
display: flex;
justify-content: center;
box-sizing: border-box;
padding: 0 1rem;
}
Part 1 acceptance¶
- No horizontal scroll at 360×740 ✓
- No ghost logo ✓
- Card centred on all viewports ✓
Puppeteer screenshot at 360×740 and 430×932. Confirm before proceeding to Part 2.
Part 2 — Teletype receipt sequence¶
This replaces everything that happens after the STAND BY card. The STAND BY card itself stays — Part 2 begins after it.
The full sequence¶
Phase 1 — STAND BY (existing) - Form submits → STAND BY card appears - Video continues playing underneath — never stops, never pauses - Hold 3 seconds
Phase 2 — Fade to black - Everything fades to black over 1.2s — card, video, everything - Pure black. Nothing visible.
Phase 3 — Tractor feed receipt Pure black screen. Monospace receipt prints from top, jerking upward line by line.
Layout:
- max-width: 480px, centred on screen, left-aligned text within that column
- Font: IBM Plex Mono / Courier New (existing monospace)
- Colour: #e8e8e8 on #000000
- Cursor: blinking block █ at 600ms interval, always visible at end of current line
Tape movement: - Discrete upward jerks — NOT smooth scroll - Each new line causes existing lines to jump up one line-height - Like tractor feed. Like a real teletype. No easing, no animation — just a jump.
Typing speed: 28ms per character
Receipt content and timing¶
Each line prints character by character at 28ms/char. Cursor blinks during pauses. Pauses are non-uniform — the machine is waiting for data down the serial line.
pause 1.8s pause 0.8s pause 1.4s pause 0.4s pause 2.2s — long pause pause 0.6s[BARCODE — see spec below] pause 1.6s
pause 0.8s pause 1.2s (omit this line entirely if no mobile was provided)pause 2.8s — longest pause. cursor blinks. machine waiting for ACK. pause 0.6s pause 3.0s — cursor blinks. human reads.
Then four carriage returns — blank lines jerking up, paper feeding out:
pause 0.4s pause 0.4s pause 0.4s pause 0.4s hold 4.0s — cursor blinks. human can screenshot. machine is done.Fade to black — 2.0s fade. Page stays black. No UI. No button. No navigation. Done.
Barcode spec¶
Render a Code128 barcode of the short_hash value.
- Library: JsBarcode from CDN —
https://cdnjs.cloudflare.com/ajax/libs/jsbarcode/3.11.5/JsBarcode.all.min.js - Render to
<svg>or<canvas> - Width: fit within receipt column
- Height: 48px
lineColor: '#e8e8e8',background: '#000000'- No text label under barcode — REF line above it is the label
- Barcode materialises instantly when its turn comes — no animation on the barcode itself
- Tape jerks up to accommodate its height after it appears
Cursor behaviour¶
- Blinking block
█always at end of last printed line - Blinks at 600ms interval continuously
- During character printing, cursor stays live at the advancing position
- During pauses, cursor blinks at end of last complete line
Data from Worker¶
Registration response must include these fields (add any missing):
- shortHash — for REF line and barcode
- maskedEmail — server-side masked, format: first char + ***@ + domain (e.g. t***@gmail.com)
- maskedMobile — server-side masked, format: country code + first digit + XX XXX XXX (e.g. +61 4XX XXX XXX). null if not provided.
- timestamp — ISO string, formatted client-side as DD MMM YYYY
What does NOT change¶
- Registration Worker logic
- D1 schema
- SMS flow
- Email flow
- Keys ledger
- Video — plays through entire sequence. Pause only after the final black fade is complete.
- STAND BY card design (beyond Part 1 fixes)
Part 2 acceptance criteria¶
- Video plays continuously through STAND BY and fade-to-black ✓
- Tape jerks upward discretely — no smooth scroll ✓
- Cursor blinks between every line ✓
- Pauses are non-uniform — feels like a machine waiting for data ✓
- Barcode renders white on black, Code128 of short_hash ✓
- Email masked correctly server-side ✓
- SMS line absent if no mobile captured ✓
- Four blank CR lines print after CHECK YOUR ENDPOINTS ✓
-
MESSAGE ENDS prints, holds 4s, fades to black ✓¶
- After final fade — black screen, nothing. No UI. Done. ✓
Deploy¶
Puppeteer captures at: - 360×740 and 430×932: mid-receipt (after REF, before barcode) and at ### MESSAGE ENDS - 1440×900: same two states
Paste all before deploying.