Part 1 of B2, pulled forward on owner request — how a shop/provider/SHG owner manages products, services, rates and hours after B1 creates the page. Governed by B2-brief.md + B-UX-PLAN.md §1 ten laws / §3-B1/B2/B3 + DECISIONS #15 (owned page — owner-only instant-live edits, no pending states ever) and #19 (enquiries = Nyburs inbox; WhatsApp never appears on this surface). The cockpit's character: the page IS the editor (pencils in place, no settings maze), one decision per sheet, mic on every text field (L2), photo leads every product, zero English at decision points, and no completeness scores or nags anywhere (L9) — the only maintenance hook is the positive weekly line (L7). DECISIONS #8: frames English + the brief's binding Devanagari strings; B2·E = the hi locale check on the string-heaviest sheet.
The business page as the OWNER sees it (DECISIONS #15: owned — his edits go live the moment he taps, no steward, no review, no pending). Ruling R1: no separate "manage" screen — the public page anatomy grows pencils: a per-row pencil on every product, an Edit aside on every section header, an edit chip on the photo. Top of page = the available-now card (pulse dot = the B-series net-new widget; same dot customers see) with the toggle — §3-B2 puts it here + the morning prompt (b2d). Then the enquiries row "3 new messages" → his Nyburs inbox (#19 — customer questions are Nyburs chat, WhatsApp never renders on this surface), and the L7 proof line "5 people viewed your shop this week" (viewed, never "called") — the ONLY maintenance hook on the page; nothing scores, nothing nags (L9). Product rows = the b5e anatomy (photo · name · price/unit · min-order + delivers-to chips) with the photo thumb LEADING. "+ Add item" opens the b2b sheet. Hours rows + the amber "Closed today?" one-tap (drives the same dot — R5).
ONE sheet per product (R1), S5/S8 sheet pattern. Beat ① ADD: the camera tile LEADS — binding string "Photo of the item" (photo steering per §3-B1: the thing, never the face or the house) — with the gold assist tile "Add from a photo of your board" beside it: Sharma adds Sugar ₹42/kg by photographing his handwritten price board. Ruling R2: v1 = photo + manual confirm — the tile ships now so the habit forms; OCR pre-fill arrives behind the same tile later. Then name with the mic as the large target (L2; keyboard = the small icon), price + unit chips (₹/kg ₹/pkt… server-driven labels, §6), and the b5e row fields as OPTIONAL dashed chips — min-order + delivers-to/collect-from, owner-set, skippable at equal weight. CTA promises the #15 contract in words: "Add — live instantly" — no save-pending state exists. Beat ② EDIT: same sheet prefilled; delete = the quiet labelled row at the foot (R4 — a 48-year-old never discovers swipe). Photos: NSFW async invisible-when-clean, EXIF stripped, ≤200KB background upload (app-only).
The provider variant (Anil Electric Works). The privacy reassurance sits AT the editor, first thing under the bar — binding string "Rates show only to people who call or message" (§3-B2 private-rates rule: the public going-rates board was KILLED in #17; rates reveal pre-call on the locked sheet, blurred "₹ ???" in the directory). Without this line at the editor, providers under-quote or refuse to fill rates at all. Each row carries ONE of the 3 price modes: Fixed rate (Fan fitting ₹150) / "Starting from" (New wiring ₹80/point — row shown EXPANDED with the mode picker) / "Ask on call" chip (AC servicing — no number, honest). Max 10 rows, no descriptions — the cap renders as the quiet "3/10" counter chip, never a warning (R6, L9). Mic on the name field (L2). Below: the work-photos grid — the + tile invites, no minimum, no nag; photos rank the page (ghost pages sink) but absence never renders as a deficiency.
Beat ① WEEKLY HOURS: day chips + time PRESETS — the two presets cover most shops; "Custom hours" opens the time drums (advanced path, not the default). The closed day is a chip turned OFF, not a separate form. Below it the "Closed today?" one-tap override (amber): shows closed today, reverts itself tomorrow — no "remember to reopen" debt on the owner. Ruling R5: the override, the page-top toggle (b2a) and the prompts here drive ONE state machine — the same dot the customer sees on b5. Beat ② CLINIC VARIANT (§3-B3): "doctor visiting" = structured pickers — who / day chips / time slot — with the mic shortcut ("Say it by voice") and free text demoted to advanced; a medical store states when the doctor sits without typing a word. Beat ③ WHERE THE TOGGLE LIVES DAY-TO-DAY (§3-B2): the app-open morning prompt ("Is the shop open today?") and the evening AUTO-OFF nudge ("Still open?" — one-tap from the shade, L8) — without the evening nudge the pulse goes meaningless by week two.
DECISIONS #8: ONE language per screen via i18n — this frame renders the b2b ADD sheet end-to-end in hi (the string-heaviest B2 surface, per the brief). The binding Devanagari decision strings are identical in both frames by design; what this frame validates is the structural chrome around them: the photo-tile sublines, field helper "ज़रूरी नहीं", the spec sublines, status/nav keys (होम/जगह/खोजें/डेली/चैट्स). Unit labels (किलो/पैकेट/लीटर/पीस) and product vocabulary = server-driven domain labels (§6), NOT ARB keys. Remaining B2 hi keys (section headers "सामान और दाम"/"दुकान का समय", privacy line, prompts) ride the normal 12-locale pipeline — flagged for the lead.
Closes E2E P0-2: #21 ruled the page↔channel link but no surface designed it. The cockpit gains an "Our channel" section with two states. Beat ① NOT LINKED: one quiet dashed invite ("Link a channel") — invitation grammar like the +photo tile, never a nag, never auto-created (L9). Beat ② THE SHEET, one decision: link an EXISTING channel — his channels listed, one-tap Link (R7: the s8 communities machinery reused, no new wizard) — or — "Create new channel" create-from-page: name pre-filled "Sharma General Store", place-locked to the page's anchor (#22a SSOT centroid place — no place picker renders), ONE confirm, instant-live (#15). Beat ③ LINKED: the channel row (member count + the L4 dot) and the quiet "Remove" row (R8 — same labelled-row grammar as R4 delete; unlink detaches the channel from the page, never deletes the channel). WHY a channel at all: DM = Message (#19), channel = one-to-many — the business's broadcast surface; B3 offers will auto-land there (B3 council scope) + the place feed. Customer-side join CTAs ride b5h (group page, in-flight) and b2-discovery (business page). ⚠️ page-follow vs channel-join = ONE follow concept or two — the open #21 Q parked for the B3 council (recommendation stands: page-follow = lightweight default, channel-join = opt-in louder surface). NEVER auto-join — following a page must not subscribe anyone to a broadcast.
Closes E2E P0-3 — the track's PRIMARY CTA finally has a destination. Three entries, ONE thread: the Message button on a business/SHG page (b5e, b2-discovery) · "Check stock" on a B3 stock post · tapping a product row — all open the same Nyburs chat thread with the CONTEXT CARD AUTO-ATTACHED: the product (photo · name · ₹/unit · page attribution) pinned at the top of the thread. R9: everything else is the app's existing chat anatomy 1:1 — bubbles, composer, rails, no ticks/read-receipts (privacy policy) — the context card is the only net-new chat payload, rendered official-not-social (L6: a catalogue entry, zero social chrome; tapping it goes back to the product/page). Quick-ask chips pre-compose the common questions — "Is this available?" / "What's the rate?" / "Ask by voice" (mic custom ask) — R10: a chip fills the composer, never auto-sends (the L7 enquiry count must not inflate on a mis-tap); the mic stays the large composer target (L2). #19 GLOBAL ruling: this path is proximity-free — Santosh sits in Gurgaon messaging a Bheldi shop; rate-limit + report path = the existing chat abuse rails (app-only). Page-tap entry (no product) attaches the business card instead — same anatomy, shop photo + name + category. Send → the thread lives in his normal Chats tab; nothing new to learn.
The same thread from the owner's Nyburs inbox (the b2a "3 new messages" row lands here). The bar answers the owner's first question before he reads a word: customer name + where he is + where he's from — "Santosh · in Gurgaon, from Bheldi" (the migrant case made legible; a Bheldi boy in Gurgaon is a warmer lead than a stranger). The product context card stays pinned — Sharma knows it's about Sugar without scrolling. Quick-replies pre-compose the two answers that close most enquiries — "Yes, it's available" / "Ask on call" (R10: fill, never auto-send; the "Ask on call" reply offers his number through the SAME locked-sheet path — the number itself never enters the thread). Mic = the large reply target (L2). The quiet L7 line under the thread tells him the honest mechanics: this thread is exactly what "12 people contacted" counts on his page (#22c — measured enquiries, never unmeasured "orders"). The ghost slot below it is the #22c buyer order-confirm — DESIGNED-FOR, NOT BUILT: when the buyer one-tap "Order confirmed" ships in the enquiry thread, it lands in that slot and upgrades the page's proof line from enquiries to ORDERS (b5h #20h). Until then the slot never renders in the app.
B2 Part-1 position: the owner management cockpit for B1-created pages — the gap the product owner flagged ("no way how they can manage all the products or service"). Part 2 (public discovery/directory) follows with the full B2 council. Ruling log: R1 the page IS the editor — pencils on the public anatomy, one sheet per object, no separate manage screen · R2 board-assist = v1 photo + manual confirm (the "Add from a photo of your board" tile ships now so the habit forms; OCR pre-fill lands behind the same tile later) · R3 .b2-abar/.b2-fresh/.b2-prod/.b2-inp/.b2-mic re-declare b5/b1 FILE-LOCAL patterns 1:1 — flagged for the lead's journey.css consolidation pass · R4 delete = a quiet labelled row inside the edit sheet, never swipe · R5 available-now = ONE state machine, three surfaces (page-top card · morning app-open prompt · evening auto-off nudge · the "Closed today?" hours override drives the same dot) · R6 the max-10 services cap renders as the quiet "3/10" counter chip, never a warning banner (L9). Laws honoured: L2 mic on every text field (incl. price — voice fill works) · L7 the weekly viewed line is the ONLY maintenance hook, real numbers, never "called" · L9 zero completeness scores, zero nag chips anywhere on the cockpit · #15 every CTA states the instant-live contract in words ("live instantly") — no pending state exists in the UI · #19 enquiries land in the Nyburs inbox; WhatsApp never renders on the owner surface. App-only (cited, not designed): NSFW async photo scan invisible-when-clean · EXIF strip + ≤200KB compress + background upload (§5) · async voice transcription w/ field-level re-record · evening auto-off job + morning prompt scheduling · unit/category labels server-driven (§6) · enquiry chat = existing Nyburs chat rails, local+global (#19 owner ruling). For the lead's eye: b5e's CTA ordering is being revised to Message-first by a parallel agent — b2a's enquiries row already assumes that world; remaining B2 hi keys ride the normal 12-locale pipeline (only the b2e frame per the brief).
R+ (2026-06-11, E2E P0 closures — frames b2f/b2g/b2h, B-E2E-VALIDATION P0-2/P0-3): b2f gives #21 its surface — "Our channel" on the cockpit: quiet dashed invite (L9, never a nag, never auto-created) → ONE sheet: link an EXISTING channel one-tap OR create-from-page (name pre-filled from the page, place-locked to the #22a anchor, ONE confirm, #15 instant) → linked row + quiet "Remove" · R7 the sheet reuses the s8 communities machinery — no channel wizard, no settings maze; channel manage = the existing channels surface · R8 unlink = quiet labelled row (R4 grammar, never swipe), detaches the channel from the page, NEVER deletes it · b2g/b2h close P0-3 — the #19 primary CTA's destination: Message / "Check stock" / product-row tap all open ONE Nyburs chat thread with the CONTEXT CARD auto-attached (photo · name · ₹ · attribution, pinned at thread top; page-entry attaches the business card, same anatomy) · R9 chat = the app's EXISTING anatomy 1:1 (bubbles, composer, Chats rail, NO ticks/read-receipts per privacy policy) — the context card is the ONLY net-new chat payload, official-not-social (L6), tap = back to product/page · R10 quick-ask/quick-reply chips PRE-COMPOSE into the composer, never auto-send — the L7 enquiry count must never inflate on a mis-tap · owner bar = name + "in Gurgaon, from Bheldi" (migrant lead legible) · "Ask on call" quick-reply rides the SAME locked sheet, the number never enters the thread · L7/#22c: the in-thread "This enquiry was counted" line states what "N people contacted" counts; the buyer one-tap order-confirm (#22c) = a GHOST designed-for slot in b2h, NOT built, never renders until it ships (then upgrades the b5h #20h proof line to orders) · #19 GLOBAL: enquiry chat is proximity-free (Gurgaon → Bheldi), rate-limit + report on existing chat abuse rails (app-only) · channel join CTAs ride b5h (group, in-flight) + b2-discovery (business); page-follow vs channel-join = the open #21 Q parked for the B3 council; NEVER auto-join.