# V25-BOARD-DELTAS.md — Exact Board-by-Board Spec for V25 Canvas Mocks

**Card**: S1 (21 Oct 2026) · **Inputs Reconciled**: Dash Revision 3 (`dash-mockups/`), V24 Canvas Mocks (`project/*.dc.html`), `hop-local` P0 Report (`ux-p0fix/REPORT.md`), Deepcheck (`UX-DEEPCHECK.md`), and **Owner PIN + Selfie Rules (`O-022`, 21 Oct 2026 06:55 IST)**.

---

## 0. Skin, Accessibility & O-022 Invariants (Apply Across All V25 Boards)

1. **Keep V24 Visual Skin Unchanged**:
   - **Palette**: `--bg: #F4EDE2` · `--surface: #FBF6EE` · `--surface-2: #EFE6D6` · `--ink: #1C1B19` · `--muted: #6E665C` · `--blush: #EAD5D7` · `--blush-deep: #C88D94` · `--gold: #D49B35` · `--teal: #1E5B53` · `--ok: #2A7B4C` · `--danger: #B83B2B`.
   - **Typography**: `Lora` (serif display titles) + `Inter` / `Noto Sans Devanagari` (UI & Hindi labels) + `JetBrains Mono` (clocks, PIN boxes, °C readings, ticket IDs).
   - **Embossed 3D Tactility**: Preserve inset/drop shadows (`0 2px 0 rgba(255,255,255,.75) inset, 0 -2px 0 rgba(28,27,25,.18) inset, 0 6px 14px rgba(28,27,25,.12)`).
2. **Touch-Target Floor (`UX-DEEPCHECK 4.2`)**:
   - Upgrade all `.btn-sm`, `.t-act`, and `.chip` action buttons from `32–36px` height to **`min-height: 48px; min-width: 48px`** (`64px` height for primary big green ticks `✓`).
3. **Owner PIN + Selfie Rules (`O-022` — Non-Negotiable)**:
   - **Rule 1 (Sole Self-Service)**: **PIN reset is the ONLY self-service we offer** (requested from the local kiosk → goes to manager → manager resets it). Remove all SMS/WhatsApp OTP self-service flows.
   - **Rule 2 (Two PIN Types)**: Explicitly label **`4-अंकीय यूज़र पिन · 4-digit User PIN` (`••••`)** on all staff/manager actions, and **`6-अंकीय कियोस्क पिन · 6-digit Outlet Kiosk PIN` (`••••••`)** on outlet kiosk pairing/unlock.
   - **Rule 3 (Manager PIN-Setting Lock)**: The manager may set/choose a user's 4-digit PIN **ONLY after that user has asked for a reset** (open reset request from kiosk). Never allow manager-initiated PIN changes.
   - **Rule 4 (Accountable Task Selfie)**: Every accountable / M3 / safety-critical task carries a **mandatory live selfie + 4-digit User PIN**.

---

## Part 1 · Concrete Change List Per Existing V24 Board (`project/*.dc.html`)

### 1. `Login.dc.html` (Outlet Kiosk Sign-In — Step 1, 2 & Waiting)
> **🚩 O-022 Contradictions Flagged**:
> - Contains `"Continue with Phone — 10-digit number, 4-digit OTP"` and `"G Continue with Google"` in the Step 1 footer (violates **O-022 Rule 1** and Dash `A400`).
> - Shows `"PIN reset? Ask manager"` as non-interactive muted text instead of the kiosk self-service PIN reset trigger (**O-022 Rule 1**).
> - Does not distinguish **4-digit User PIN** from **6-digit Outlet Kiosk PIN** (**O-022 Rule 2**).

- **REMOVE**:
  - In `.card` #1 (Step 1 footer): Delete the divider `"or"` and the two `<button class="btn-outline">` elements (`📱 फ़ोन नंबर से लॉगिन · Continue with Phone — 10-digit number, 4-digit OTP` and `G Continue with Google`).
- **REWORD**:
  - Top bar `.meta`: Change `"Kiosk · Ground"` to **`"Kiosk · Ground · 🔒 6-अंकीय कियोस्क पिन से जुड़ा (Bound via 6-digit Kiosk PIN)"`**.
  - In `.card` #2 (Step 2 — Ravi M. selected): Change `.card-sub` from `"4-digit PIN · or ask manager if first time"` to **`"अपना 4-अंकीय यूज़र पिन डालें + सेल्फ़ी लें · Enter 4-digit User PIN + live selfie"`**.
  - In `.card` #2 footer: Change muted text `"First time at Jubilee Hills? Tap Ask my manager (Priya) · PIN reset? Ask manager"` into two explicit `min-height: 48px` action buttons:
    1. `🙋 पहली बार? मैनेजर से मंज़ूरी माँगें · First time? Ask my manager (Priya)`
    2. `🔑 पिन भूल गए? पिन रीसेट माँगें · Forgot 4-digit PIN? Request reset from manager` *(sole self-service per O-022 Rule 1)*.
- **ADD**:
  - In `.card` #1 (Step 1 roster footer, alongside `+ और लोग दिखाएँ · Show all staff`): Add `<button class="more-link">❓ मेरा नाम सूची में नहीं है · My name is missing</button>` (from Dash `j02#j02-start`), showing helper banner: `"ड्यूटी मैनेजर (Priya) से बात करें · Ask duty manager to add you to Jubilee Hills roster."`
  - In `.card` #3 (Waiting for Priya): Add Dash `j02#j02-wait` live escalation strip under the `09:42 left` timer:
    - `अभी: शिफ़्ट लीड (Priya) · 0 मि` → `+2 मि: क्लस्टर मैनेजर (Rohan)` → `+4 मि: सिटी हेड (Ananya)`.
- **NEW STATE**:
  - Add compact sub-banner inside `.card` #3 for **Approved — Collect within 5:00** (Dash `j02#j02-approved`): green pill `"✓ Priya ने मंज़ूरी दी · 04:52 में इसी कियोस्क पर 4-अंकीय पिन डालें · Continue at this Kiosk within 04:52"`.

---

### 2. `PhoneOTP.dc.html` → **RETIRE / REPURPOSE IN-PLACE**
> **🚩 O-022 & Dash Contradiction Flagged**:
> - Entire board is a 4-digit SMS OTP verification screen (`ओटीपी डालें · Enter 4-digit OTP sent to +91 98400 11223`). SMS OTP was **NOT approved** in Dash (`pilot-patch/otp-signin.html`, `j03#signin-a400`) and directly violates **O-022 Rule 1** (*"PIN reset is the only self-service we offer: requested from the local kiosk, the request goes to the manager, the manager resets it"*).

- **REMOVE**:
  - Remove the SMS OTP message bubble (`💬 HOP: आपका लॉगिन कोड 4 8 2 1 है`), `"बदलें · Change number"`, and `"कोड फिर से भेजें · Resend in 00:24"`.
- **REWORD & REPURPOSE (if file path kept in `canvas.json`)**:
  - Retitle board header to **`L2 · KIOSK PIN RESET REQUEST (O-022 RULE 1)`** (or replace in `canvas.json` with `KioskPinReset.dc.html` — see Part 2 #2).
  - Top bar title: **`पिन रीसेट माँगें · Request 4-Digit User PIN Reset`**.
  - Card body: Show selected worker (`Ravi M. · Oven`), status badge `"3 बार गलत पिन · 3 wrong PIN attempts"`, and primary 56px teal button **`🔑 मैनेजर (Priya) को पिन रीसेट रिक्वेस्ट भेजें · Send PIN Reset Request to Manager`**.
  - Bottom card: Show `"अनुरोध भेजा गया · Open request #PR-104 sent to Priya — Priya आपके लिए नया 4-अंकीय पिन सेट करेंगी · Manager will reset your 4-digit User PIN"`.

---

### 3. `LoginPhone.dc.html` (Personal Phone Sign-In)
> **🚩 O-022 & Dash Contradiction Flagged**:
> - Currently shows `"मोबाइल नंबर से लॉगिन · 10-digit mobile number"` + `"ओटीपी भेजें · Send OTP"` (violates **O-022 Rule 1** and Dash `j03#signin-a400`).

- **REMOVE**:
  - Delete the `+91 | 98400 11223` phone input row, the `"ओटीपी भेजें · Send OTP →"` button, and the `"4-digit OTP"` hint.
- **REWORD & ADD**:
  - Align with Dash `j03-signin-own-phone.html#signin-a400` + O-022:
  - Card title: **`अपने फ़ोन पर लॉगिन करें · Sign in on your own phone`**.
  - **Crew Section (Top)**:
    - Select your roster name (`Ravi M. · Oven`) + enter **`4-अंकीय यूज़र पिन · 4-digit User PIN` (`••••`)**.
    - Helper note: `"केवल आउटलेट कियोस्क पर हाज़िरी (चेक-इन) के बाद काम करेगा · Unlocks only after you check in at the outlet kiosk"` (links to `PhoneLocked.dc.html`).
    - Recovery link: `"पिन भूल गए? आउटलेट कियोस्क से मैनेजर को पिन रीसेट रिक्वेस्ट भेजें · Forgot PIN? Request reset at outlet kiosk (no phone self-service)"`.
  - **Manager / Lead Section (Bottom divider)**:
    - Keep `<button class="btn-outline">G Google से लॉगिन करें · Continue with Google</button>` and `<button class="btn-outline">✉ ईमेल और पासवर्ड · Email and password</button>` (Dash `A400`).

---

### 4. `KioskSelfie.dc.html` (Kiosk Check-In: Selfie + 4-Digit User PIN)
> **🚩 O-022 Rule 2 Alignment Needed**:
> - Label must explicitly say **4-digit User PIN** (`4-अंकीय यूज़र पिन`) so it is never confused with the 6-digit Outlet Kiosk PIN.

- **REWORD**:
  - `.pin-lbl`: Change `"4-अंकीय पिन · 4-digit PIN"` to **`"4-अंकीय यूज़र पिन · 4-digit User PIN (••••)"`**.
  - Primary CTA `.btn-go`: Change `"✓ चेक-इन करें · Check in (07:10)"` to **`"✓ सेल्फ़ी + पिन से चेक-इन करें · Check in with Selfie & 4-digit PIN (07:10)"`**.
- **ADD**:
  - Below `.cam-actions`: Add live-camera enforcement pill `"🔴 लाइव कैमरा अनिवार्य (फ़ाइल अपलोड बंद) · Live camera stream required (no file upload)"` (`UX-DEEPCHECK 1.2`).
  - Below the numeric keypad: Add `<button class="btn-ghost" style="min-height:48px">🔑 पिन भूल गए? रीसेट माँगें · Forgot PIN? Ask manager to reset</button>` (`O-022 Rule 1`).
- **NEW STATE**:
  - Add bottom receipt strip (Dash `j02#j02-collected`): **`"✓ हाज़िरी दर्ज · रवि एम. · 07:10 · Signed in & checked in (5 सेकंड में होम स्क्रीन लौटेगी · Auto-locks in 5s)"`**.

---

### 5. `Ground.dc.html` (Outlet Kiosk — Active Shift Task View)
> **🚩 O-022 & Dash Contradictions Flagged**:
> - Top task (`काउंटर साफ़ करें`) and temperature task (`चिलर का तापमान जाँचें`) both show `⌛ बाद में` (`Later`), contradicting Dash `j05#tasks-open` & `j08#reading-input` (readings are surfaced **first** and have **no `Later` button**).
> - Accountable tasks (`नकदी गिनें` / `प्रिप टेबल सैनिटाइज़ करें`) show a 1-tap `✓` without indicating **mandatory selfie + 4-digit User PIN** (**O-022 Rule 4**).
> - Shared kiosk identity bar only has a small `Sign out` text link instead of Dash's high-contrast `Recording as {Name}` + `Change person` + 60s timeout (`UX-DEEPCHECK 1.8`).

- **REWORD & REORDER**:
  - **Top Identity Bar (`.checkin-bar`)**: Reword `"✓ आप चेक-इन हैं · Checked in at 07:12"` to **`"🟢 अभी काम कर रहे हैं: रवि एम. · Recording as Ravi M. (00:58 में ऑटो-लॉक)"`** and replace the right-hand info pill with two `min-height: 48px` buttons:
    1. **`⇄ व्यक्ति बदलें · Change person`** (returns to `/login` roster).
    2. **`🚪 शिफ़्ट छुट्टी · Check out`** (opens `GroundCheckout.dc.html`).
  - **Task Order (`#tasks-open`)**: Move **`चिलर का तापमान जाँचें · Check walk-in chiller temp`** to **Position #1 (Hero card)** above routine tasks (Dash `j05#tasks-open`: *"Equipment reading surfaced first"*).
- **REMOVE**:
  - Remove the `⌛ बाद में · Later` button whenever a temperature reading task (`चिलर का तापमान जाँचें`) or critical safety task is in the hero card (`j08#reading-input`: **no snooze on readings**).
- **ADD**:
  - On temperature reading task row: Replace the green `✓` button with **`🌡️ °C दर्ज करें · Enter °C`** (`min-height: 48px`, opens `GroundReading.dc.html`).
  - On accountable / M3 task rows (`प्रिप टेबल सैनिटाइज़ करें · Sanitise prep table`, `नकदी गिनें · Count cash drawer`): Add badge **`📷 सेल्फ़ी + 4-अंकीय पिन अनिवार्य · Selfie + 4-digit PIN required (M3)`** (**O-022 Rule 4**), and change the green tick icon to **`📷✓`**.
  - In `"इस शिफ़्ट के लोग · This shift"` card: Remove any 1-tap check-in toggle behavior (`UX-DEEPCHECK 6.1`); make rows **read-only status pills** (`✓ 07:02`, `✓ 07:12`, `⏳ आ रही हैं · Not checked in`) with helper text `"हाज़िरी बदलने के लिए ऊपर 'व्यक्ति बदलें' दबाएँ · Use 'Change person' to check in with selfie + PIN"`.

---

### 6. `GroundCheckin.dc.html` (Outlet Kiosk — Pre-Check-In Roster State)
- **REWORD**:
  - In `.nudge-bar`: Change `"अपना नाम चुनें · 4-अंकीय पिन डालें · Tap your name below to check in"` to **`"अपना नाम चुनें → सेल्फ़ी लें + 4-अंकीय यूज़र पिन डालें · Tap your name → Take selfie + enter 4-digit User PIN"`**.
- **REMOVE**:
  - Remove the task preview list (`आज के काम · 4 बाकी`) and the critical alert card from this unauthenticated pre-check-in board (`UX-DEEPCHECK 1.1` / P0 1.1 fix: **zero operational data before sign-in**).
- **ADD**:
  - Replace the removed task list with a large, high-contrast **Shift Roster Grid** (`Asha K.`, `Ravi M.`, `Meena T.`, `Dev R.`, `Priya S.`) + footer buttons: **`+ और लोग दिखाएँ · Show all staff`** and **`🔑 पिन भूल गए? पिन रीसेट माँगें · Forgot PIN? Request reset`** (**O-022 Rule 1**).

---

### 7. `GroundTask.dc.html` (Task Detail & Accountable Task Completion)
> **🚩 O-022 Rule 4 Contradiction Flagged**:
> - Currently shows `"Chiller #2 · target 0–4 °C"` with a static `"4.2°"` pill and optional `📷 Take photo` / `🎬 How-to video` / `🎤 Voice note` tiles, and allows tapping `✓ हो गया Done` without a mandatory selfie + 4-digit User PIN.

- **REWORD & SPLIT BY TASK TYPE**:
  - Change target title to an **Accountable / M3 Task** (`प्रिप टेबल सैनिटाइज़ करें · Sanitise prep table` or `कैश ड्रॉअर गिनें · Count cash drawer`) *(since temperature readings move to dedicated `GroundReading.dc.html`)*.
  - Replace the `"4.2° Target 0–4°C"` pill with an **O-022 Rule 4 Mandatory Badge**: **`🔒 ज़िम्मेदार काम (M3) — सेल्फ़ी + 4-अंकीय यूज़र पिन अनिवार्य · Accountable task: Selfie + 4-digit User PIN required`**.
- **ADD**:
  - Promote **`📷 लाइव सेल्फ़ी व काम की फ़ोटो · Live Selfie + Work Proof (अनिवार्य · Mandatory)`** into a full-width live camera preview frame (with `Retake` button) + **4-digit User PIN (`••••`)** inline input row above the primary CTA.
  - Keep `🎬 वीडियो देखें · How-to video` and `🎤 आवाज़ नोट · Voice note` as secondary helper buttons (`min-height: 48px`).
- **REWORD PRIMARY CTA & ADD M3 WAIT RECEIPT**:
  - Primary button `.btn-done`: **`✓ सेल्फ़ी + पिन के साथ जमा करें · Submit with Selfie & PIN`**.
  - Below action row, add the post-submit **Dash `j05b#finish-pilot-wait` receipt strip**:
    - Amber pill: **`⏳ काम दर्ज — मैनेजर की जाँच बाकी · Recorded done at 08:14; independent manager check pending`** (or if returned by manager per `j05b#finish-future-return`: **`↩ सुधार के लिए लौटाया गया · Returned by Priya: "कोने दोबारा साफ़ करें" — फिर से जमा करें (संशोधन 2 · Resubmit Rev 2)`**).

---

### 8. `PhoneLocked.dc.html` (Personal Phone — Shift Gate Before Kiosk Check-In)
- **REWORD**:
  - Step 2 in `.steps`: Change `"कियोस्क पर अपनी सेल्फ़ी और 4-अंकीय पिन से चेक-इन करें · Take selfie + enter 4-digit PIN on the kiosk"` to **`"कियोस्क पर अपनी लाइव सेल्फ़ी और 4-अंकीय यूज़र पिन (••••) से चेक-इन करें · Take live selfie + enter 4-digit User PIN on the outlet kiosk"`** (**O-022 Rule 2**).
  - Footer `.foot`: Change `"फ़ोन गुम या पिन भूल गए? शिफ़्ट मैनेजर (प्रिया) से मिलें · Lost phone or PIN? Ask Priya"` to **`"पिन भूल गए? कियोस्क पर 'पिन रीसेट माँगें' दबाएँ (प्रिया रीसेट करेंगी) · Forgot PIN? Request reset at kiosk (Priya will reset it)"`** (**O-022 Rule 1**).
- **ADD**:
  - Make `.cta-hint` (`🔄 मैंने चेक-इन कर लिया — फिर से जाँचें · Tap to refresh once checked in`) a true `min-height: 52px` embossed button with `cursor: pointer`.

---

### 9. `Phone.dc.html`, `PhoneB.dc.html`, `PhoneC.dc.html` (Personal Phone — Active Shift Tasks)
> **🚩 O-022 & Dash Contradictions Flagged**:
> - `.t-act` buttons are `36×36px` (`UX-DEEPCHECK 4.2` requires `≥48×48px`).
> - Temperature reading (`चिलर का तापमान जाँचें`) is 2nd in list and has a `⌛` snooze button (`j05#tasks-open` requires readings **first** and **no snooze**).
> - Completed tasks (`झाड़ू और पोछा`, `ओवन प्री-हीट`) are mixed above or without Dash's explicit collapsible `Finished (2)` divider (`pilot-patch/tasks-finished-under-open.html`).

- **REWORD & RESIZE (Apply to `Phone.dc.html` and keep `PhoneB`/`PhoneC` synced or consolidate)**:
  - Increase `.t-act` buttons from `36×36px` to **`48×48px`** (`font-size: 18px`).
  - Move **`चिलर का तापमान जाँचें · Check walk-in chiller temp`** to the **top of Open Tasks**, remove its `⌛` button, and change its primary button to **`🌡️ °C`**.
  - On accountable M3 task (`प्रिप टेबल सैनिटाइज़ करें · Sanitise prep table`): Add pill **`📷 सेल्फ़ी + पिन · Selfie + PIN`** (**O-022 Rule 4**) and show post-submit state badge **`⏳ मैनेजर जाँच बाकी · Manager check pending`** (`j05b#finish-pilot-wait`).
  - On snoozed task (`कचरा बिन बदलें`): Show Dash's snooze counter badge **`⌛ +15 मि (1/2) · 08:05 पर वापस`** (`j05#tasks-later1`).
  - Group completed tasks at the very bottom under Dash's section header: **`पूरे हुए काम (2) · Finished under Open ▾`** (`pilot-patch/tasks-finished-under-open.html`).

---

### 10. `TaskReason.dc.html` (Cannot Do `✕` & Snooze `⌛` Reason Sheet)
- **REWORD & ADD (Align with Dash `j06-cannot-exception.html` & `j05#tasks-later2`)**:
  - **Mode Toggle Header**: Show two explicit tab states at top of sheet:
    1. **`✕ नहीं हो सकता · Cannot Do (अपवाद दर्ज करें)`** (active red tab)
    2. **`⌛ दूसरी बार बाद में (+30 मि, 2/2) · Second Later (+30m, 2 of 2 — final)`** (amber tab; note that 1st Later `+15m` is instant and 3rd Later or `<10m` to handover is refused per `j05#tasks-boundary`).
  - **6 Reason Chips (`min-height: 52px`)**: Keep all 6 Dash `j06#cannot-reasons` keys visible (`🔧 मशीन ख़राब · Machine broken`, `📦 सामान ख़त्म · No stock`, `👥 स्टाफ़ कम · Short staff`, `🗣 मैनेजर ने कहा · Manager said`, `🕒 मेरी शिफ़्ट नहीं · Not my shift`, `💬 अन्य · Other + voice`).
- **NEW STATE (Bottom Receipt Card — Dash `j06#cannot-saved` & `#cannot-repair`)**:
  - Replace the single bottom preview strip with Dash's two-phase receipt:
    - **State A (Both saved)**: `✓ दर्ज: नहीं हो सका (मशीन ख़राब) · Recorded: could not do` + **`🔧 मरम्मत रिपोर्ट बनी · Linked Repair #R-0418 created`** (`[मरम्मत देखें · Open repair]`).
    - **State B (Partial failure — `j06#cannot-saved`)**: `✓ काम का अपवाद दर्ज हो गया · Task exception saved` + amber warning **`⚠ मरम्मत रिपोर्ट नहीं भेजी जा सकी · Repair report not sent — [↻ फिर से भेजें · Retry sending repair]`**.

---

### 11. `RepairNew.dc.html` (New Repair Report + Hindi→English Translation)
- **REWORD & ADD (Align with Dash `j10-repair-payment.html` & `pilot-patch/maintenance-ground.html`)**:
  - Upgrade equipment `.chip` height from `36px` to **`48px`**.
  - In `.photo-box`: Require live camera capture (`📷 खराबी की फ़ोटो + सेल्फ़ी · Photo of fault + reporter selfie` per **O-022 Rule 4**).
- **NEW STATE (Post-Submit Receipt & Authority Chain — Dash `j10#repair-report` to `#payment-finance`)**:
  - Add a bottom receipt card showing what happens immediately after tapping `🔧 रिपोर्ट भेजें`:
    - **Receipt Header**: **`✓ मरम्मत अनुरोध दर्ज · Repair Request #R-0418 Created (07:49)`** (or amber `"Saved · Alert routing OFF — call duty manager Priyank"` if unrouted).
    - **Authority & Payment Stepper (Read-only preview from Dash `j10`)**:
      1. `1. रिपोर्ट दर्ज (Ravi M.) ✓`
      2. `2. काम की मंज़ूरी · City Head Work Authorisation (⏳ Pending)`
      3. `3. आउटलेट सत्यापन · Independent Manager Local Check (Repair verified / Not fixed)`
      4. `4. भुगतान मंज़ूरी · Payment 1 (City Head) → Payment 2 (Distinct Business Head) → Finance Settlement`.

---

### 12. `Manager.dc.html` (Manager Phone — Outlet Lounge & Day Control)
> **🚩 O-022 & Security Contradictions Flagged**:
> - Line 138 contains: `<div class="appr-warn">⚠ PIN already in use — approving asks Ravi for a new PIN on his next tap</div>`. This violates security (`UX-DEEPCHECK 6.3` PIN collision oracle) and contradicts **O-022 Rules 1 & 3** (PINs are verified per named user; manager sets a PIN only on an open user reset request).
> - Inline approval card only has `✓ Approve` and `✕ Deny` (`32px` buttons), missing the P0 1.7 non-blocking `⌛ Later (2 min)` / `✕ Dismiss` controls.
> - Missing **Open PIN Reset Requests** section (**O-022 Rules 1 & 3**).
> - Task rows show `✓ Confirm` without displaying the **crew member's mandatory selfie** (**O-022 Rule 4**) or Dash's `↩ Return for correction` button (`j05b#finish-future-return`).

- **REMOVE**:
  - Delete `<div class="appr-warn">⚠ PIN already in use — approving asks Ravi for a new PIN on his next tap</div>` completely.
- **REWORD & RESIZE**:
  - Upgrade all `.btn-sm` buttons (`✓ Approve`, `✕ Deny`, `✓ Confirm`, `⚑ Flag`) from `height: 32px` to **`min-height: 48px`**.
  - In **Top Attention Banner (`Needs you`)**: Split the counter badge using Dash `j14#queue-ready` rules:
    - **`🔴 2 ज़रूरी ध्यान · 2 Attention (1 Critical + 1 Open Task)`** · **`🔑 2 लॉगिन/पिन · 2 Access/PIN Asks`** · **`📷 2 काम जाँच · 2 M3 Work Checks`**.
  - On the **Inline Approval Card (`Ravi M.`)**: Add **`⌛ 2 मि बाद · Later (2m)`** and **`✕ छुपाएँ · Dismiss`** buttons (matching P0 1.7 fix in `views.py`), plus race-winner state (`"✓ पहले ही प्रिया द्वारा मंज़ूर · Already approved by Priya at 07:11"`).
- **ADD**:
  - **New Card — `🔑 पिन रीसेट अनुरोध · Open PIN Reset Requests (O-022)`**:
    - Shows active kiosk-initiated reset requests (e.g., `Dev R. · Counter · Kiosk reset requested 1m ago · 3 wrong PINs`).
    - CTA: **`🔑 4-अंकीय पिन सेट करें · Set 4-Digit User PIN`** (opens `ManagerPinReset.dc.html`).
    - Includes explicit lock note: `"🔒 नियम O-022: केवल खुली कियोस्क रिक्वेस्ट वाले स्टाफ़ का पिन बदला जा सकता है · Manager can set PIN ONLY when user has an open kiosk request"`.
  - **In `Shifttasks` (M3 Verification Rows)**:
    - Attach a **40×40px thumbnail of the crew's task selfie** (**O-022 Rule 4**) next to every completed accountable task (`Count cash drawer`, `Sanitise prep table`).
    - Replace the single `✓ Confirm` button with Dash `j05b#finish-pilot-check` & `#finish-future-return` controls:
      - **`✓ मैंने काम जाँचा · Confirm = I checked the work`** (disabled if viewer is the same person who did the task — **no self-confirm**; disabled if remote with no local photo).
      - **`↩ सुधार के लिए लौटाएँ · Return for correction`**.
  - **In `Close Day` Footer**:
    - Change `"CLOSE DAY — ALL 18 VERIFIED"` to show a **Pre-Close Gate Summary**: `"14/18 Ticked · 1 Blocked (Chiller) · 1 M3 Check Pending"` → tapping `CLOSE DAY` prompts for **Manager 4-digit User PIN (`••••`) + reason for any unclosed exception** (`UX-DEEPCHECK 3.2, 6.5`).

---

### 13. `ManagerApprove.dc.html` (Manager Phone — First-Time / Login Approval Detail)
> **🚩 O-022 & Dash Contradiction Flagged**:
> - Currently shows `<span class="badge-ok">✓ OTP सत्यापित</span>` (`OTP verified via +91 98400 11223`) — contradicts **O-022 Rule 1** and Dash `j02#j02-manager`.

- **REMOVE**:
  - Delete `<span class="badge-ok">✓ OTP सत्यापित</span>` and the `+91 98400 11223` OTP verification line.
- **REWORD & ADD**:
  - Replace with **`📍 आउटलेट कियोस्क से अनुरोध · Requested at Jubilee Hills Kiosk (09:42 left)`**.
  - Keep the large live kiosk selfie preview (`Ravi M.`) and add a side-by-side **Roster Reference Photo** (`नामांकन फ़ोटो · Onboarding reference`) for visual comparison.
  - If this is a **First-Time Crew Onboarding** (no 4-digit User PIN set yet, open kiosk request): include an optional inline **`प्रारंभिक 4-अंकीय यूज़र पिन सेट करें · Set initial 4-digit User PIN (••••)`** box unlocked by the user's kiosk request (**O-022 Rule 3**).
  - Add **`⌛ 2 मिनट बाद · Later (2 min)`** button below `✓ मंज़ूर करें · Approve` and `✕ अस्वीकार · Decline` (P0 1.7 non-blocking parity).
  - Add **Race / Expiry Notice Banner** at bottom (Dash `j02#j02-denial`): `"यदि किसी अन्य मैनेजर ने पहले ही फ़ैसला कर लिया है, तो रसीद दिखेगी: 'Already approved by Cluster Mgr Rohan' · Shows race-winner receipt if already decided"`.

---

### 14. `NeedsYou.dc.html` (Manager Phone — `Needs You Now` Queue)
- **REWORD & ADD (Align with Dash `j14-needs-you-queue.html` + `pilot-patch/needs-you-page.html` + O-022)**:
  - **Header Formula (`#queue-ready`)**: Replace single `3 बाकी · 3 pending` pill with:
    - Primary red pill: **`🔴 ध्यान दें: 2 · Attention: 2 (Critical + Open Tasks)`**
    - Secondary pills: **`🔑 लॉगिन/पिन: 2 · Access/PIN Asks: 2`** · **`📷 M3 काम जाँच: 1 · Work Checks: 1`** · *(FYI / Sold-out = 0)*.
  - **Stale / Partial-Load Indicator (`#queue-stale`)**: Add compact top-right state pill option: **`⚠ 3+? कुछ आइटम लोड नहीं हुए · Stale — tap to refresh`**.
  - **Queue Card #1 (Login / PIN Reset Ask)**: Show **O-022 PIN Reset Request** (`Dev R. · Forgot 4-digit PIN at Kiosk · Open Reset Request #PR-104`) with **`🔑 नया 4-अंकीय पिन सेट करें · Set 4-Digit PIN`** button.
  - **Queue Card #2 (M3 Accountable Work Check — O-022 Rule 4)**: Show `Asha K. · नकदी गिनें (Count cash drawer)` with **mandatory live selfie + cash drawer photo**, **`✓ मैंने काम जाँचा · Confirm work`**, and **`↩ सुधार के लिए लौटाएँ · Return`** (`min-height: 48px`).
  - **Queue Card #3 (Cannot / Abnormal Reading Exception)**: Show `Ravi M. · चिलर #2 (11 °C — सीमा से बाहर + मशीन ख़राब · Linked Repair #R-0418)` with **`🔧 मरम्मत व अपवाद देखें · View Repair & Exception`**.
  - **Snooze / Hide Control (`#queue-snooze`)**: Add footer link **`🕒 30 मिनट के लिए छुपाएँ · Hide non-critical for 30m (वापस लाएँ · Bring back)`**.

---

### 15. `Main.dc.html` (System Architecture Overview Board)
- **REWORD**:
  - In `.flow-strip`: Change `"OTP → PIN"` to **`"6-Digit Kiosk PIN → 4-Digit User PIN + Selfie"`** (**O-022 Rule 2 & 4**).
  - In Card #1 (`Outlet Kiosk`): Update bullet `4-digit PIN + live selfie on check-in` to **`6-digit Outlet Kiosk PIN (device) · 4-digit User PIN + live selfie on check-in & accountable tasks · Kiosk-to-Manager PIN reset (sole self-service)`** (**O-022 Rules 1–4**).
  - In Card #2 (`Crew Personal Phone`): Change `First-time OTP + manager approval` to **`Unlocks after Kiosk check-in · 4-digit User PIN · Big green tick ✓ (routine) vs Selfie + PIN (accountable M3)`**.
  - In Card #3 (`Manager Phone`): Add bullet **`Sets 4-digit User PIN ONLY against an open kiosk reset request · Independent M3 work check with crew selfie`**.

---

## Part 2 · New V25 Boards to Create (6 Boards — 5-Line Content Spec Each)

Add these 6 boards to `/private/tmp/claude-502/-Users-srinivas-workspaces-harleys-owner-oven-bus/3c8c381e-8d23-4312-99ec-8a63d5596240/scratchpad/shell-canvas/project/` (Row 3 in `canvas.json` at `y: 1940`, using the exact V24 `.dc.html` embossed skin):

### 1. `KioskSetup6Pin.dc.html` — Outlet Kiosk Pairing & Unlock (`O-022 Rule 2` + Dash `j02#j02-setup`)
- **Line 1 (Frame & Header)**: `820×620` Kiosk frame (`--bg: #F4EDE2`); dark top bar `"HOP · Jubilee Hills · कियोस्क सेटअप व अनलॉक · Outlet Kiosk Binding"` with status pill `"🔒 अनबाउंड डिवाइस · Unbound Kiosk Browser"`.
- **Line 2 (6-Digit Outlet Kiosk PIN Input — O-022 Rule 2)**: Center card titled **`"6-अंकीय आउटलेट कियोस्क पिन डालें · Enter 6-Digit Outlet Kiosk PIN"`** featuring **6 large monospace digit boxes (`• • • • • •`)** (`56×64px` each, gold focus ring on box #4) and a 3×4 tactile numeric keypad (`min-height: 56px` keys).
- **Line 3 (PIN Type Distinction Notice)**: Explicit callout strip inside the card: **`"ℹ️ यह 6-अंकीय पिन केवल आउटलेट कियोस्क मशीन के लिए है। स्टाफ़ का व्यक्तिगत पिन 4 अंकों (••••) का होता है · 6-digit PIN is for the outlet kiosk device only; individual User PINs are 4 digits."`**
- **Line 4 (Manager Setup Approval State — Dash `j02#j02-setup`)**: Secondary card below showing browser-bound manager renewal/setup grant: `"सिटी/क्लस्टर मैनेजर द्वारा कियोस्क सत्यापित · Kiosk setup approved by Ananya (valid 30 days)"` + primary 56px green CTA **`"✓ कियोस्क अनलॉक करें और शिफ़्ट रोस्टर खोलें · Unlock Kiosk & Open Roster"`**.
- **Line 5 (Error / Throttled Footer)**: Red/amber footer strip for wrong 6-digit Kiosk PIN ×3: `"⚠ 3 बार गलत कियोस्क पिन — 15 मिनट के लिए लॉक। क्लस्टर मैनेजर को कॉल करें · Locked 15m after 3 failed attempts"`.

---

### 2. `KioskPinReset.dc.html` — Kiosk Self-Service PIN Reset Request (`O-022 Rule 1` + Dash `j04#reset-help`, `#reset-success`)
- **Line 1 (Frame & Header)**: `820×660` Kiosk frame; top bar `"← नाम सूची पर वापस · Back to Roster"` + title **`"पिन रीसेट (एकमात्र सेल्फ़-सर्विस) · 4-Digit User PIN Reset"`** + worker badge `"Ravi M. · Oven"`.
- **Line 2 (State 1 — Wrong PIN ×3 Trigger & Request CTA)**: Top card showing red pill `"⚠ 4-अंकीय यूज़र पिन 3 बार गलत · Wrong 4-digit PIN ×3"` (keeping Ravi's open task `"Count cash drawer"` preserved in context per Dash `j04#reset-help`), live verification selfie thumbnail, and a 60px teal CTA: **`"🔑 मैनेजर (Priya) से पिन रीसेट माँगें · Request PIN Reset from Manager"`**.
- **Line 3 (State 2 — Waiting for Manager Reset)**: Middle card showing active request receipt **`"अनुरोध #PR-104 खुला है · Open Reset Request sent to Priya (09:18 left)"`** with helper text `"प्रिया अपने फ़ोन पर आपके लिए नया 4-अंकीय पिन सेट करेंगी और आपको बताएँगी · Manager will reset your 4-digit PIN and tell you"`.
- **Line 4 (State 3 — Verify New 4-Digit User PIN & Resume Task)**: Bottom green card (`Dash j04#reset-success` + `O-022 Rules 1 & 3`): **`"✓ प्रिया ने आपका नया 4-अंकीय पिन सेट कर दिया है · PIN Reset by Priya at 08:19"`** → 4-digit User PIN confirmation boxes (`••••`) + **`"✓ लॉगिन करें और अधूरे काम पर लौटें · Sign in & return to 'Count cash drawer'"`**.
- **Line 5 (O-022 Rule 1 Guardrail Note)**: Footer banner: `"🔒 सुरक्षा नियम: फ़ोन/SMS से पिन रीसेट नहीं होता — केवल इसी आउटलेट कियोस्क से मैनेजर को अनुरोध भेजा जा सकता है · Kiosk-to-manager request is the only self-service recovery."`

---

### 3. `ManagerPinReset.dc.html` — Manager Open-Request PIN Setter (`O-022 Rules 1 & 3` + Dash `j04#reset-wait`)
- **Line 1 (Frame & Header)**: `420×820` Manager Phone frame; dark header `"← ज़रूरी कतार · Back to Needs You"` + title **`"यूज़र पिन रीसेट · Reset 4-Digit User PIN"`** + rule badge `"O-022 Rule 3 Enforced"`.
- **Line 2 (Card A — UNLOCKED State: Active User Reset Request Exists)**: White embossed card with green pill **`"🟢 खुला अनुरोध #PR-104 · Open Kiosk Request from Ravi M. (08:16, Jubilee Hills Kiosk)"`**, showing Ravi's live kiosk selfie alongside his reference photo and reason (`"3 गलत पिन प्रयास · 3 wrong PIN attempts"`).
- **Line 3 (4-Digit User PIN Setter + Repeat)**: Inside Card A, two 4-box monospace inputs: **`"1. नया 4-अंकीय यूज़र पिन चुनें · Set new 4-digit User PIN (••••)"`** and **`"2. दोबारा डालें · Repeat 4-digit PIN (••••)"`** (no cross-user PIN collision warning per `UX-DEEPCHECK 6.3`), plus 54px green CTA **`"✓ नया 4-अंकीय पिन सेव करें · Save New PIN for Ravi"`** and `✕ अस्वीकार · Decline`.
- **Line 4 (Post-Reset Instruction Strip)**: Amber instruction box below CTA: **`"🗣 पिन सेव करने के बाद रवि को ये 4 अंक बताएँ — वह कियोस्क पर डालकर अपना काम पूरा करेगा · Tell Ravi these 4 digits in person; request #PR-104 closes immediately on save."`**
- **Line 5 (Card B — LOCKED State: No Open Request from User — O-022 Rule 3)**: Muted grey card at bottom demonstrating the constitutional lock for any staff member who has *not* requested a reset (`Meena T. · Counter`): **`"🔒 पिन बदलना बंद है · PIN Change Locked — मीना ने कियोस्क से पिन रीसेट नहीं माँगा है। मैनेजर अपनी मर्ज़ी से किसी का पिन नहीं बदल सकता (O-022 Rule 3)."`**

---

### 4. `GroundReading.dc.html` — Equipment Temperature Reading & Out-of-Range Escalation (Dash `j05#tasks-open`, `j08`)
- **Line 1 (Frame & Header)**: `820×660` Kiosk/Phone-compatible frame; top bar `"← आज के काम · Back to Tasks"` + equipment pill **`"🌡️ चिलर #2 · Walk-in Chiller #2 (लक्ष्य · Target: 0 °C से 5 °C)"`** + red badge **`"⏳ बाद में (Snooze) उपलब्ध नहीं · No 'Later' on readings"`**.
- **Line 2 (Numeric °C Entry + Tactile Keypad — Dash `j08#reading-input`)**: Left column card with empty large monospace display **`[  11.0  ] °C`** (never pre-filled), `±` minus sign key (for freezer `-18 °C`), decimal `.`, `0–9` keypad (`56×56px` keys), and primary CTA **`"✓ तापमान सेव करें · Save Reading"`** + secondary **`"✕ नहीं हो सकता · Cannot (मशीन ख़राब)"`**.
- **Line 3 (State A — Out-of-Range Warning Receipt — Dash `j08#reading-off` & `#hi-abnormal-hi`)**: Right column top card showing immediate response when `11.0 °C` (`> 5 °C`) is saved: red/amber alert header **`"⚠ तापमान सीमा से बाहर: 11.0 °C दर्ज किया गया · Reading stored (immutable): 11.0 °C is above 0–5 °C range"`**.
- **Line 4 (Mandatory Selfie + Escalation Action — O-022 Rule 4 + Dash `j08`)**: Inside the Out-of-Range card, live camera capture box **`"📷 थर्मामीटर डिस्प्ले व अपनी सेल्फ़ी लें · Capture thermometer display + selfie (O-022 Rule 4)"`** + automatic manager alert status (`"🔔 मैनेजर प्रिया को चेतावनी भेजी गई · Linked warning alert created"` or if routing OFF: **`"📞 तुरंत ड्यूटी मैनेजर को कॉल करें · Call duty manager now"`**).
- **Line 5 (State B — Unknown Range / Recheck Footer — Dash `j08#reading-unknown`, `#reading-recheck`)**: Bottom strip showing that the first accepted reading (`11.0 °C at 07:35`) is **immutable**; any follow-up check after 30 minutes is recorded as a separate **`"पुनः जाँच #2 · Recheck occurrence #2"`**.

---

### 5. `GroundCheckout.dc.html` — Shift Handover Acceptance & Check-Out Receipt (Dash `j02b#attendance-future`, `j09`)
- **Line 1 (Frame & Header)**: `820×660` Kiosk frame; top bar **`"शिफ़्ट हैंडओवर व छुट्टी · Shift Handover & Check-Out"`** + actor pill `"🟢 रवि एम. (शिफ़्ट 1 → शिफ़्ट 2) · Outgoing: Ravi M."`.
- **Line 2 (Card 1 — Open Exceptions & Handover Items Before Departure — Dash `j09#handover-items`)**: Lists unresolved items that cannot be silently abandoned: (a) `"⚠ चिलर #2 तापमान 11 °C (मरम्मत #R-0418 खुली है)"` and (b) `"🔄 काउंटर से सेक्शन हैंडओवर · Counter-to-Section Handover (S1→S2)"`.
- **Line 3 (Card 2 — Incoming Person Two-Party Handshake — Dash `j09#handover-accept`)**: Incoming shift crew/lead (`Meena T. · S2`) authenticates with her **4-digit User PIN (`••••`) + live selfie (`O-022 Rule 4`)** and chooses per item: **`"✓ हैंडओवर स्वीकार करें · Accept eligible item"`** vs. **`"✕ स्वीकार नहीं कर सकते · Cannot accept"`** (explicitly distinct from `"👁 सिर्फ़ पढ़ा · Read acknowledgement"`).
- **Line 4 (Card 3 — Outgoing Crew Check-Out Selfie + 4-Digit User PIN — O-022 Rules 2 & 4)**: Ravi M. captures his **checkout live selfie + enters his 4-digit User PIN (`••••`)** and taps **`"🚪 शिफ़्ट से चेक-आउट करें · Complete Shift Check-Out"`**.
- **Line 5 (Immutable Checkout Receipt — Dash `j02b#attendance-future` & `#hi-checkout-hi`)**: Bottom green receipt strip: **`"✓ छुट्टी दर्ज: रवि एम. · 15:05 · Checked out at 15:05 (अधूरे काम की ज़िम्मेदारी मीना टी. को सौंपी गई · Open work owner preserved; कियोस्क 5 सेकंड में लॉक होगा)"`**.

---

### 6. `CriticalTakeover.dc.html` — Critical Safety Alert Takeover & Offline Queue (`O-022 Rule 4` + Dash `j07`, `j-offline-failure`)
- **Line 1 (Frame & Header)**: `820×660` Kiosk/Phone split showcase; **Left Half (`400px`) = Full-Screen Critical Alert Takeover (`Dash j07#takeover-active`)** with crimson header `"🚨 गंभीर सुरक्षा अलर्ट · CRITICAL SAFETY ALERT — तुरंत कार्रवाई करें"`; **Right Half (`400px`) = Offline Queue & Reconcile (`Dash j-offline-failure`)**.
- **Line 2 (Left — Named Critical Hazard & Mandatory Selfie + 4-Digit User PIN — O-022 Rule 4)**: Alert body: **`"गैस की गंध — ओवन के पास · Gas smell near oven — मुख्य वाल्व बंद करें और वेंटिलेशन चालू करें"`**, followed by **mandatory live selfie frame + 4-digit User PIN (`••••`)** and 56px green CTA: **`"✓ सेल्फ़ी + पिन से पुष्टि करें: ठीक हो गया · Done (Verified with Selfie & 4-Digit PIN)"`**.
- **Line 3 (Left — Strict 2-Snooze Cap & Call Manager — Dash `j07#takeover-snoozed`, `#takeover-max`)**: Below primary CTA, two `48px` buttons: **`"⏳ 5 मिनट बाद याद दिलाएँ · Snooze 5 min (1 of 2 used)"`** (plus locked state preview: **`"🚫 2 में से 2 स्नूज़ पूरे हो चुके — अब और बाद में नहीं किया जा सकता · Snooze 2 of 2 used"`**) and **`"📞 मैनेजर (प्रियांक) को कॉल करें · Call Manager"`**.
- **Line 4 (Right — Actor-Isolated Offline Task & Checkout Queue — Dash `j-offline-failure#offline-task`, `#offline-checkout`)**: Amber banner **`"📡 इंटरनेट सिग्नल नहीं है · Offline — इसी डिवाइस पर सुरक्षित"`** showing **actor-isolated outbox**: `"रवि एम. के 2 काम सुरक्षित (चिलर 4 °C, काउंटर साफ़) · 2 items captured for Ravi M."` + `"यदि मीना टी. लॉगिन करती हैं, तो रवि की ऑफ़लाइन कतार अलग और सुरक्षित रहेगी · Actor-isolated queue"` + offline checkout receipt (`"छुट्टी समय 15:05 डिवाइस पर दर्ज · Checkout recorded locally"`).
- **Line 5 (Right — Reconnect Reconciliation Receipt — Dash `j-offline-failure#offline-reconcile`)**: Bottom card showing reconnect outcome: **`"🟢 सिग्नल वापस आया · Reconnected at 15:19 — ✓ सर्वर ने रवि के 2 काम और 15:05 चेक-आउट स्वीकार किए · Server accepted queued items"`** (plus conflict state: `"⚠ समय टकराव — मैनेजर मिलान आवश्यक · Manual reconciliation required"`).
