The track's heartbeat — after B1 creates pages and B2 makes them manageable and findable, B3 makes them ALIVE: offers, stock signals, the haat day, and the weekly proof loop. Governed by B3-brief.md + B-UX-PLAN §3-B3 + DECISIONS #19 (Message-first — "Ask stock" is a Nyburs quick-enquiry, never WhatsApp), #21 (channel = the broadcast surface; offers auto-land there — the routing line makes that contract visible), #22c/L7 (every number measured). The posting character: FAB → camera → post — the photo of the handwritten price board IS the offer; no mode switch ever appears in the personal composer (R1). Stock claims carry mandatory quantities + the L4 traffic-light decay and the village keeps them honest ("Report incorrect", no stars). b3d frames the #21 open Q (follow vs channel-join) for the owner gate — recommendation: two concepts, never auto-join. ENGLISH-ONLY frames (cultural nouns romanized); b3f = the hi locale check.
Beat ① the "Share an offer" FAB lives on the OWNER page only (R1 — 🚫 mode switch inside the personal composer; the kirana lens never meets a business/personal picker). Beat ② tapping the FAB opens the CAMERA first (R2) — the composer renders after, with the board photo already in place: the photo of the handwritten price board IS the offer. One line + price chip are optional, equal weight. The routing line makes the #21 contract visible: "Goes to: Your followers (6) · Bheldi feed · Your channel (38)" — static truth, no checkboxes (R3); the channel chip is absent when no channel is linked (b2f). Beat ③ the offer lands in the Bheldi feed as the S6 post card untouched (DECISIONS #11) + business attribution + OFFER chip + the #19 enquiry chip.
The farmer's #3 ask: stock truth before the 8 km ride. Beat ① the fresh stock card — quantity is MANDATORY (R5, the card's dominant block) with the L4 traffic-light chip (the b5 freshness grammar verbatim), the green "12 found this accurate" count (no stars, #15), one-tap "Report incorrect", and the #19 "Ask stock" quick-enquiry chip. Beat ② the honesty decay: past 48h the chip turns and the quantity de-emphasizes — "call to confirm" (R6); 3 reports ⇒ the caution banner on the card, 5 ⇒ review queue. Beat ③ status signals beyond open/closed surface where people look: the doctor-visiting chip on the directory row + the Today-strip cell on visiting day (the migrant checks before telling his mother to go).
Beat ① on haat day the Today strip's third cell becomes the haat cell (R9 — village level only; mandi keeps that cell on block/district per b5). Beat ② tap → the haat detail sheet: day, location, open-in-maps, the machine-seed source line (day/place from state market records ~70% — report-if-wrong keeps it honest) and the "Coming this Thursday" vendor list built from stall announces. Beat ③ the vendor side: a one-tap "I'll have a stall" prompt on the vendor's own page (R10 — pre-composed, Yes/Not-this-week, no typing) → the HAAT STALL card lands on the haat strip + his followers.
DECISIONS #21 left ONE question open: BusinessFollower vs channel-membership — one follow concept or two? This frame renders the business page header with BOTH affordances live and annotates exactly what each gets the user. LEAD RECOMMENDATION (R11): TWO concepts. Follow = the lightweight default ask — counts in the follower line, offers reach the home feed in the later splice phase, no extra notifications. Channel-join = the opt-in louder lane — every broadcast in the channel inbox + push. NEVER auto-join in either direction; one-tap undo on both. The Option-A/Option-B panel below is the gate's decision surface.
THE page-maintenance hook (B-PHASES B3 feature 3 — build day-1): the weekly digest push. L7 measured-only (R12): views = page opens, messaged = enquiry threads (#22c — the b2h threads ARE the count), and calls render as "tapped Call" — the tap through the locked sheet is measured, the conversation is not, so the copy never claims more than the system knows. ≤1/week, no emoji, zero-week suppressed entirely (an empty digest is a nag — L9; zero never renders, L7). Tapping lands on the cockpit where the digest strip shows the same three numbers — no separate analytics screen for v1.
The b3a beat-② composer end-to-end in hi (DECISIONS #8: one language per screen via i18n — a translation check, NOT a pattern; the other 11 locales ride the normal pipeline). The §3-B3 binding string "ऑफर शेयर करें" is the FAB + sheet title; the routing line carries the same #21 contract. Devanagari runs taller — the field, chips and CTA use the /* Devanagari metrics */ weights (700, not 800) so nothing clips.
B3 position: the heartbeat phase — pages built in B1, managed/found in B2, become ALIVE here: offers, stock signals, the haat day, the weekly proof loop. Closes E2E P1-9 (the FAB placeholder + offers→channel routing now have designed surfaces). Ruling log: R1 business posting = a PLACE (owner/group page FAB, #20e), never a mode in the personal composer · R2 camera-FIRST literally — FAB opens the camera, the composer is the confirm step with the board photo in place; photo alone may post · R3 the routing line is STATIC TRUTH (#21 contract: followers + place feed + linked channel) — no checkboxes, channel chip absent when unlinked, never a create-channel nag (L9) · R4 offer/stock/stall cards = the S6 post card 1:1 (DECISIONS #11) + a brand-tinted wrapper strip + business attribution (icon tile + Business chip); action row stays — feed posts, not listings (L6 governs directory surfaces) · R5 stock quantity MANDATORY, the card's dominant block; push = item+qty+business+place · R6 staleness reuses the L4/b5-fresh traffic light verbatim — past 48h the chip turns red "call to confirm" AND the quantity de-emphasizes (the stale-mandi grammar) · R7 report-incorrect = one tap, count visible; 3 ⇒ caution banner on the card, 5 ⇒ CMS review queue; accuracy = the green count, never stars (#15) · R8 "Ask stock"/"Message about this offer" open the b2g enquiry composer, question PRE-COMPOSED, never auto-sent (b2 R10 — the L7 count must not inflate) · R9 the haat takes the Today strip's third cell on haat day, village level only (mandi keeps it on block/district); the strip never grows a 4th cell · R10 stall announce = one-tap Yes/Not-this-week from the vendor's own page, pre-composed HAAT_STALL post, expires after haat day · R12 digest = ≤1/week, measured triple (views · enquiry threads · call-TAPS — "tapped Call", never "called"), zero-week suppressed (L7+L9) · R13 .b3-abar/.b3-fresh/.b3-inp/.b3-mic/.b3-shot/.b3-cta/.b3-follow/.b3-chan/.b3-head re-declare b2/b5/b2p file-local patterns 1:1 — lead consolidates.
⚠️ FOR THE LEAD'S GATE: ① b3d is the decision frame for the #21 open Q — Option A (one concept) vs Option B (two concepts, RECOMMENDED: Follow = lightweight default, channel-join = opt-in louder, never auto-join either direction, one-tap undo on both); needed before the follower-push rails are wired. ② R4's action-row call: B3 cards keep the standard S6 action row (they are feed posts) — if the council reads L6 stricter (strip reactions from business posts), it is a wrapper-level change, the card is untouched. ③ haat machine-seed (~70% from state records) ships with the report-if-wrong line — steward correction path is app-side, not designed here. ④ followed-business posts → MAIN timeline = Owner Fork B0 #4, referenced in b3d's Follow card but NOT designed (brushes DECISIONS #5). Laws honoured: L2 mic on the one optional field · L4 one traffic-light grammar across mandi/stock/business activity · L7 every number a real tap or thread, zero never renders · L8 the stall prompt + stock-refresh nudge are one-tap notification actions · L9 no nags — no create-channel push, no empty digest, no "get more views". App-only (cited, not designed): BUSINESS_OFFER/STOCK_SIGNAL/HAAT_STALL sources + channel fan-out · follower push rails + stock push payload · NSFW async scan, EXIF strip, ≤200KB compress · 48h staleness job + 3/5 report thresholds · haat calendar seed + corrections · digest scheduler.