Rory's simplification round for RitualOS and the mobile app: navigation, Today page, member profile, booking, checkout, wording, Employee Hub. Both app stores are live: iOS since Sep 17 and Android since Sep 22. The new sign-in and reset screens, the app name and the icon are built on a review branch, not in the live app yet.
Where: Mobile app · mobile-webview
What: Me + guest booking gave no text/email invite to the guest. Vidya reported on Sep 3 that this is done in the web layer; Rory has not re-verified. Keep as a verify-with-Rory item.
Fix: Rory books "me + guest" on TestFlight and the guest receives a text or email invite.
mobile canvas
Where: Mobile app · mobile-webview
What: Confirmation text when a session is booked. Vidya reported on Sep 3 that this is done in the web layer; Rory has not re-verified. Keep as a verify-with-Rory item.
Fix: Rory books a session on TestFlight and sees a confirmation message (and text where applicable).
mobile canvas
Where: Mobile app · mobile-webview
What: Purchased drop-in missing from wallet. Vidya reported on Sep 3 that this is done in the web layer; Rory has not re-verified. Keep as a verify-with-Rory item.
Fix: Rory purchases a drop-in on TestFlight and it appears in the wallet immediately.
mobile canvas
Where: Mobile app · mobile-webview
What: "Share the ritual" copy = "refer 3 friends and receive a complimentary session". Vidya reported on Sep 3 that this is done in the web layer; Rory has not re-verified. Keep as a verify-with-Rory item.
Fix: Rory confirms on TestFlight the Share the ritual text reads "refer 3 friends and receive a complimentary session".
mobile canvas
Where: Mobile app · mobile-webview
What: Membership change locks: an upgrade locks the membership for 2 months; a downgrade followed by an upgrade is locked at the higher rate for 2 cycles; block repeat changes and show a "message us" window instead. Vidya reported on Sep 3 that this is done in the web layer; Rory has not re-verified. Keep as a verify-with-Rory item.
Fix: On TestFlight, after an upgrade the change option is locked for 2 months; after downgrade then upgrade the higher rate is locked for 2 cycles; a further change attempt shows the message-us prompt instead of a change form. Rory confirms.
mobile canvas
Where: Mobile app · mobile-webview
What: Billing cycle date stays fixed. An upgrade takes effect on the next bill date, or immediately if the member pays the difference. A downgrade takes effect next cycle. Vidya reported on Sep 3 that this is done in the web layer; Rory has not re-verified. Keep as a verify-with-Rory item.
Fix: On TestFlight, the billing date does not move after a change; upgrade offers next-bill-date or pay-the-difference; downgrade is scheduled for the next cycle. Rory confirms.
mobile canvas
Where: Pricing catalog · os-web
What: When a scheduled cancellation executes (and when the auto-close job is built) or when a membership lapses past the 168 hour retry and is closed, mark the FoundingMembership row forfeited so the FOUNDING75 candidate no longer applies if the person rejoins; rejoining prices at standard. Do not reissue forfeited founder numbers. Past Due inside the retry ladder keeps the record intact. Ship with the auto-close of scheduled cancellations.
Fix: Matches the Membership Rules page and Rory's Sep 8 website copy.
Rory Sep 8: 'while your membership remains continuously active' and 'Protected membership rate while continuously active*'. App: membershipPricing.ts:134-146 existingFounder -> founderEligible -> FOUNDING75 candidate (persists after cancellation); research gap: nothing executes a scheduled cancellation and the renewal query does not exclude cancellation-SCHEDULED contacts (billing.router.ts:1361-1367).
Where: Membership rules · os-web
What: Founding rate persists through tier changes while continuously active. Cancellation ends founding status and protected pricing. A lapsed card gets a one week retry window; after that the membership lapses and founding status ends. Today the FoundingMembership row is kept after cancellation.
Fix: Cancel a founding QA member, rejoin: priced at standard. Lapse a card past 7 days: founding ends.
Rory, membership rules page feedback, Sep 14 2026
Where: Membership rules · os-web
What: Every tier change starts a new two billing cycle minimum commitment. Upgrades allowed anytime during it (subject to availability). Downgrades and cancellations take effect after the commitment completes; a downgrade keeps founding status and applies on the next billing date after the commitment. Preview and saved lock dates must agree (RR-0149).
Fix: Preview and apply an upgrade, then a downgrade: dates match and follow the rule.
Rory, membership rules page feedback, Sep 14 2026
Where: Membership rules · os-web
What: Retry ladder completes within 7 days. While Past Due: cannot book new sessions (booking attempt opens payment collection) and cannot attend booked sessions (staff check-in prompts payment collection).
Fix: Past Due QA member: booking opens payment capture; check-in prompts staff for payment.
Rory, membership rules page feedback, Sep 14 2026
Where: Membership rules · os-web
What: No tier can book sessions dated beyond the current 28 day billing cycle window.
Fix: Booking a session past the cycle end is refused with a clear message, for every tier.
Rory, membership rules page feedback, Sep 14 2026
Where: Membership rules · os-web
What: Eligibility is fire, police and military only; remove EMS from tags and code eligibility. Faster rewards = 15 points per dollar (10 is standard). A founding member who is also a first responder keeps founding pricing and also gets the welcome gift task, the one-time bonus guest pass and the 15 point rate.
Fix: Tagged member earns 15 pts per dollar; EMS tag absent; founding + first responder shows both perk sets.
Rory, membership rules page feedback, Sep 14 2026
Where: Membership rules · os-web
What: A second no-show within any 60 day window charges $40 to the account. After the first no-show, notifications include a reminder of the rule.
Fix: Two no-shows in 60 days: $40 invoice created and charged; first no-show notification carries the reminder.
Note: In production since Sep 18, not yet tested end to end. The card is not charged for no-shows until payments are live.
Rory, membership rules page feedback, Sep 14 2026
Where: Membership rules · os-web
What: In-app account deletion (App Store requirement) removes login and personal access, keeps visit and billing history, does not cancel the membership, and tells the member billing continues until they cancel with the studio.
Fix: Delete flow exists with the exact wording; records retained; membership untouched.
Note: In production since Sep 18, not yet tested end to end.
Rory, membership rules page feedback, Sep 14 2026
Where: Membership page · os-web
What: Daniel Sep 17 and 18: the highlight tag and color belong on Essential, not Complete. The website is making the same change so app and site agree.
Fix: Essential card carries the tag and accent; Complete has none.
Note: Built on a review branch Sep 22 to 23, not in the live app yet (the live app still shows Best Deal on Complete and the 0-value lines).
Mobile App canvas F0BNJG0ME00, Sep 17; #ritual thread Sep 18
Where: Employee Hub · employee-hub
What: Give the action a specific name: "Read procedure" for a reading task, "Upload certificate" for a certificate task, and "View instructions" for a practical demonstration.
Fix: Each task row's action is labeled "Read procedure", "Upload certificate" or "View instructions" according to its type; no generic "Open Task" label.
canvas-ritualos 9/9
Where: Pricing catalog · os-web
What: On founding activation (invoice PAID and founder number assigned), create a staff task 'Welcome kit, founder #N' with open and handed-over states, visible in the admin CRM on the contact and in a fulfillment list. Record who handed it over and when.
Fix: Matches the Membership Rules page and Rory's Sep 8 website copy.
Rory Sep 8: 'A curated welcome kit. A customized thank you gift for being part of our first 75 members ($200 value).' App: activation point membershipPricing.ts:509-511 'Founding membership can only be assigned after confirmed payment'.
Where: Pricing catalog · os-web
What: Mint a one-time bucket (for example founding_preview_session, self plus one guest, single use, no renewal) at founding activation, redeemable only against a Preview session type that staff create in selectable blocks once the facility is approved. Show it in the wallet as 'Pre-opening preview session for you and one guest'. Exclude it from the plan's sessions and guest-pass counts.
Fix: Matches the Membership Rules page and Rory's Sep 8 website copy.
Rory Sep 8: 'A preview experience for two. Enjoy a complimentary contrast therapy preview session for you and one guest, before we are open to the public.' and footnote 'Preview sessions will be offered in selectable blocks once the facility is approved for use.' App: bucket pattern in loyalty.router.ts:38-93 createRewardBucket; renewal replaces membership and guest_pass buckets only (utils/memberships.ts:247-287), so a separate bucket type survives renewal.
Where: Pricing catalog · os-web
What: Add an early-access window on opening-week session slots: founders (active FoundingMembership) can book 48 hours before general availability; everyone else sees the slot with the time it opens. Implement as a per-slot or per-week 'earlyAccessOpensAt' plus a founder check in the booking guard.
Fix: Matches the Membership Rules page and Rory's Sep 8 website copy.
Rory Sep 8: 'Opening-week priority booking. Book opening-week sessions 48 hours before everyone else.' App: bookings.service.ts enforces only the 12 hour cancellation window (:48, :160-162); no advance booking window logic exists.
Where: Pricing catalog · os-web
What: If enforced: add UNLIMITED_MEMBERSHIP_LIMIT = 15 using the same reservation pattern as founding (advisory lock, 30 minute reservation at checkout, real only once the invoice is paid, expired reservations reconciled and released), block new checkouts and upgrades into Unlimited when full with a 'join the Unlimited waitlist' message, and free a spot when an Unlimited member downgrades or cancels. If not enforced: nothing in the app; the card line stays marketing.
Fix: Matches the Membership Rules page and Rory's Sep 8 website copy.
Note: In production since Sep 18, not yet tested end to end.
Rory Sep 8: 'UNLIMITED card should have *only 15 spots available* or something like that on the card for the sense of urgency'. App pattern: membershipPricing.ts:7 FOUNDING_MEMBERSHIP_LIMIT, :205-211, :302-307 advisory lock, :376-436 reservation, :608-744 reconcile.
Where: Pricing catalog · os-web
What: Add a plan-level priorityBooking flag (true on Unlimited). Rory, Sep 22: Unlimited members can book ahead across the whole 28 day period, up to 15 sessions. Show 'Priority Booking' in the plan features.
Fix: Matches the Membership Rules page and Rory's Sep 8 website copy.
Note: Rory, Sep 22: Priority Booking means booking ahead across the whole 28 day period, up to 15 sessions. Built on a review branch as up to 15 future bookings inside the current paid cycle. Open: 15 at once or per cycle, and the other tiers' booking window.
Rory Sep 8 Unlimited card: 'Priority Booking'. App: no advance booking window logic exists (bookings.service.ts has only the 12 hour cancel window).
Where: Pricing catalog · os-web
What: For contacts with a verified Those Who Serve tag: (a) on membership activation open a staff task 'Welcome gift' like the founder kit task; (b) mint one bonus guest pass as its own bucket type (for example bonus_guest_pass, issued once, never reissued) so it is not wiped by the renewal's guest_pass replacement; (c) apply a higher points-per-dollar rate for tagged members once Rory gives the number (today 10 points per dollar). All three apply even when the member takes founding pricing instead of the 10 percent, pending Rory's confirmation.
Fix: Matches the Membership Rules page and Rory's Sep 8 website copy.
Rory Sep 8: 'A curated welcome gift. A thank you package when you activate your membership.'; 'A bonus welcome guest pass. One extra pass for a guest or family member, issued once, in addition to any guest passes included in your plan every four weeks.'; 'Faster rewards.' App: utils/memberships.ts:247-287 replaceRecurringBuckets drops and recreates guest_pass buckets each renewal; billing.router.ts:629 and :678 points = round(finalAmount x 10).
Where: Pricing catalog · os-web
What: Add fields for Those Who Serve verification (ID type shown, verified by staff user, verified at) and require them before the tag applies pricing. Never store an image or number of the ID. Surface the verification on the staff contact view and in the signup flow.
Fix: Matches the Membership Rules page and Rory's Sep 8 website copy.
Rory Sep 8: 'Valid service ID required at membership signup.' App: membershipPricing.ts:76-79 hasThoseWhoServeTag reads tags only; no verification record exists.
Where: Membership rules · os-web
What: Staff can refund a partial or custom amount from the OS, with a required note, on any payment.
Fix: Refund $X of a $Y payment with a note; ledger and Stripe reflect it.
Note: In production since Sep 18, not yet tested end to end.
Rory, membership rules page feedback, Sep 14 2026
Where: Membership rules · os-web
What: Allow staff freezes on recurring plans (freezeAllowed is false on every plan today). No member-facing pause. App, website and emails say: to pause or cancel, reach out to the studio.
Fix: Staff can freeze and unfreeze a recurring member; member app shows the reach-out wording.
Note: In production since Sep 18, not yet tested end to end.
Rory, membership rules page feedback, Sep 14 2026
Where: Membership rules · os-web
What: Three completed referrals earn one free session credit for the referrer. Build the server-side grant; the copy is already live.
Fix: Third referred member activates: referrer receives one session credit.
Note: In production since Sep 18, not yet tested end to end.
Rory, membership rules page feedback, Sep 14 2026
Where: Membership rules · os-web
What: Unlimited is limited to 15 total active memberships (checkout and upgrades into Unlimited stop at 15). Priority Booking: Rory defined it on Sep 22 (see the note).
Fix: The 16th Unlimited purchase is refused with a clear message.
Note: Rory, Sep 22: Priority Booking means booking ahead across the whole 28 day period, up to 15 sessions. Built on a review branch as up to 15 future bookings inside the current paid cycle. Open: 15 at once or per cycle, and the other tiers' booking window.
Rory, membership rules page feedback, Sep 14 2026
Where: Membership rules · os-web
What: Welcome kit task at first visit. Preview session = one shared session for member plus one guest, member present; founders activating after the preview blocks do not get it. 48 hour early booking window for opening week.
Fix: Founding member record shows kit task, preview credit for two, and the early window.
Rory, membership rules page feedback, Sep 14 2026
Where: Membership rules · os-web
What: Single sessions expire 3 months after purchase; 5 and 10 packs after one year; anything bought before opening starts its clock on opening day. Members get a 10 percent pack discount.
Fix: Expiry dates computed as specified; pre-opening purchases dated from the configured opening day.
Note: Member pack discount: 10 percent (Rory, Sep 22; already set in production).
Rory, membership rules page feedback, Sep 14 2026
Where: Membership page · os-web
What: Daniel Sep 17: the Core card shows a 0% discount line. Hide the retail line when the percentage is zero.
Fix: Core card shows no retail discount line; Essential 5%, Complete 10%, Unlimited 10% unchanged.
Note: Built on a review branch Sep 22 to 23, not in the live app yet (the live app still shows Best Deal on Complete and the 0-value lines).
Mobile App canvas F0BNJG0ME00, Sep 17; #ritual thread Sep 18
Where: App-wide wording · os-web
What: Daniel Sep 17: the app says every 28 days in places; the approved wording is every 4 weeks, consistent throughout.
Fix: Grep of rendered app text finds zero "28 days"; every cadence mention reads "every 4 weeks".
Mobile App canvas F0BNJG0ME00, Sep 17; #ritual thread Sep 18
Where: Membership page · os-web
What: Daniel Sep 17: hide the guest pass line when the count is zero.
Fix: Core and Essential cards show no guest pass line; Complete shows 1, Unlimited 2.
Note: Built on a review branch Sep 22 to 23, not in the live app yet (the live app still shows Best Deal on Complete and the 0-value lines).
Mobile App canvas F0BNJG0ME00, Sep 17; #ritual thread Sep 18
Where: Membership page · os-web
What: Daniel Sep 17: show a Limited to 15 line on the Unlimited card (display only until the cap is enforced under OS2-D11).
Fix: Unlimited card shows "Limited to 15".
Mobile App canvas F0BNJG0ME00, Sep 17; #ritual thread Sep 18
Where: Membership page · os-web
What: Daniel Sep 17: make space for a short note telling fire, police and military members their 10% standard-pricing discount and perks (welcome gift, bonus guest pass, faster rewards).
Fix: Note visible on the membership page with the approved wording; no EMS mention.
Note: Built on a review branch Sep 22 to 23, not in the live app yet.
Mobile App canvas F0BNJG0ME00, Sep 17; #ritual thread Sep 18
Where: Membership page · os-web
What: Daniel Sep 17: show the single session ($60, members $54) and the 5 pack ($275) and 10 pack ($500) prices on the membership page alongside the tiers.
Fix: Prices visible on the membership page; purchase stays gated until opening.
Mobile App canvas F0BNJG0ME00, Sep 17; #ritual thread Sep 18
Where: Member profile · os-web
What: Move "Lock Login" out of the main member profile view into account settings.
Fix: "Lock Login" no longer appears on the profile summary; it is available under the member's account settings and still locks/unlocks the login as before.
Note: LATER: a UI move of an existing login control, not a change to how sign-in works. No longer blocked by the store release: Both app stores are live (iOS Sep 17, Android Sep 22).
canvas-ritualos 9/9
Where: Manager tools · employee-hub
What: On the manager's employee-details page, move the existing login, invitation, password-reset, MFA, and suspend/reactivate controls into a collapsed section labeled "Login & access."
Fix: Employee-details page shows a collapsed "Login & access" section containing those controls; each still works when expanded.
Note: LATER: groups the login, invitation, password reset and MFA controls under one "Login & access" section. No longer blocked by the store release: Both app stores are live (iOS Sep 17, Android Sep 22).
canvas-ritualos 9/9
Where: Mobile login · mobile-native
What: Adjust the logo to be more prominent, with less space above it.
Fix: Login screen shows a larger logo with reduced top spacing; Rory confirms on TestFlight.
Note: Built on a review branch Sep 22 to 23, not in the live app yet.
mobile canvas
Where: Mobile login · mobile-native
What: Reduce the "make space for yourself" size, use a lighter weight, and olive color instead of black.
Fix: Headline is smaller, lighter weight and olive (not black); Rory confirms on TestFlight.
Note: Built on a review branch Sep 22 to 23, not in the live app yet.
mobile canvas
Where: Mobile login · mobile-native
What: Replace "We're a phone-free spa. 90 minutes to unplug and reconnect with yourself." with "Your next session starts here." smaller and lighter.
Fix: Login subtitle reads exactly "Your next session starts here." in a smaller, lighter style; the old sentence is gone.
Note: Built on a review branch Sep 22 to 23, not in the live app yet.
mobile canvas
Where: Mobile login · mobile-native
What: Remove button shadows.
Fix: Login-page buttons render flat with no drop shadow; Rory confirms on TestFlight.
Note: Built on a review branch Sep 22 to 23, not in the live app yet.
mobile canvas
Where: Mobile login · mobile-native
What: Visible "Email address" and "Password" labels. "FORGOT?" becomes "Forgot password?" placed beside the password label.
Fix: Both field labels are visible; "Forgot password?" appears next to the Password label and "FORGOT?" is gone.
Note: Built on a review branch Sep 22 to 23, not in the live app yet.
mobile canvas
Where: Mobile login · mobile-native
What: Sentence case "Sign in" and "Create account".
Fix: Buttons read "Sign in" and "Create account" (sentence case, not all caps or title case).
Note: Built on a review branch Sep 22 to 23, not in the live app yet.
mobile canvas
Where: Mobile app · mobile-native
What: App cover = circle R in black.
Fix: Installed app icon/cover is the black circle R; Rory confirms on TestFlight.
Note: Built on a review branch Sep 22 to 23, not in the live app yet.
mobile canvas
Where: Mobile app · mobile-webview
What: Create account said "validation failed" (possibly dev only). Vidya's Sep 3 "done in the web layer" note covered the non-login items; this one is part of account creation, so it has not been confirmed fixed.
Fix: Creating a new account on TestFlight against production succeeds without "validation failed"; Rory confirms.
Note: LATER: first confirm whether it reproduces on production or only on dev; if it does on production, escalate to Ravi for a fix decision. No longer blocked by the store release: Both app stores are live (iOS Sep 17, Android Sep 22).
mobile canvas
Where: Pricing catalog · os-web
What: Do not change MEMBER_DROP_IN_PRICE yet. If Rory keeps $54, leave it and remove or wire the unused topOffDiscountPercent field. If she says every single session is $60, set the member and guest rate to 60 and delete the dead field.
Fix: Matches the Membership Rules page and Rory's Sep 8 website copy.
Rory Sep 8 mentions only '$60' for a single session. App: utils/memberships.ts:52-53 MEMBER_DROP_IN_PRICE = 54 (guests of members also pay 54, :348-349); research open question on topOffDiscountPercent: 10 never read.
Where: Pricing catalog · os-web
What: Her subheader names fire, police, and military. Add an explicit 'police' (law enforcement) tag alongside 'first responder' so staff can tag precisely; keep 'ems' only if Rory confirms EMS is included, otherwise drop it from the eligible list and the seeded discount's eligibleTags.
Fix: Matches the Membership Rules page and Rory's Sep 8 website copy.
Rory Sep 8: 'Membership benefits for fire, police, and military personnel.' App tags: ['those who serve','first responder','military','ems'] (membershipPricing.ts:76-79); seeded eligibleTags First Responder/Military/EMS (syncMembershipCatalog.ts:120-140).
Where: Pricing catalog · os-web
What: The pack cards and corporate cards send people to signup forms that record what they are interested in (single session, 5-pack, 10-pack, a corporate package). Make sure the GHL form has that field and the RitualOS lead sync worker stores it on the contact so staff can follow up and so packs can be offered at opening.
Fix: Matches the Membership Rules page and Rory's Sep 8 website copy.
Rory Sep 8: 'each card's button should say Get Opening Updates and lead to an opening updates signup that records which option they're interested in.' App: server/src/worker.ts:32-39 runs the lead sync.
Where: Pricing catalog · os-web
What: After the first partner signs: a Company entity; four package SKUs (Premier $25,000 with 400 sessions and 8 team experiences, Elite $10,000 with 140 and 4, Team $5,000 with 65 and 2, Community $2,500 with 30 and 1); a session pool that employees spend one visit at a time; employee linking with verification; private team experience bookings for up to 12 people that block the facility; a remaining count for staff and the company contact; per-tier company limits (1, 2, 3, 4) and the 10 company total. Nothing before the first signing.
Fix: Matches the Membership Rules page and Rory's Sep 8 website copy.
Rory Sep 8 Corporate page: PREMIER, ELITE, TEAM, COMMUNITY cards; 'Limited to 10 partner companies'; 'Each private team experience accommodates up to 12 participants. Partnership prices are per package.'
Where: Membership rules · os-web
What: One year term, early renewal when sessions run out. Company contact supplies an approved employee list (personal emails allowed); Ritual links existing accounts or invites; app shows corporate access and books from the company balance; staff see affiliation; joiners and leavers managed in the admin dashboard; removing access keeps the personal account. Sequenced after the first signing.
Fix: Corporate group with shared balance, member linkage, admin list management.
Rory, membership rules page feedback, Sep 14 2026
Where: Membership rules · os-web
What: Pause and cancel always mean contacting the studio; the wording is consistent in the app, on the website FAQ and in automated emails and SMS.
Fix: Same sentence in all four surfaces.
Rory, membership rules page feedback, Sep 14 2026
Where: Native · Vidya
What: Daniel Sep 17: drop the s. Native display name; needs a store build. Vidya.
Fix: Home screen label reads Ritual Studio.
Note: Built on a review branch Sep 22 to 23, not in the live app yet.
Mobile App canvas F0BNJG0ME00, Sep 17; #ritual thread Sep 18
What: Rory's rule for this round: fewer decisions and less navigation for everyday work. If two controls do the same thing, consolidate them; hide advanced or occasional options until they are needed. Keep existing functionality and permissions when moving pages, reuse existing data and components, and update internal links so they still open the correct destination. Items marked LATER carry the reason in their constraint field. Work NOW items first (HIGH), then NEXT (MED). Every item has an acceptance line; Autosterea verifies on dev before production. The catalog items (OS2-C01 onward) come from the Membership Rules page and Rory's Sep 8 website copy. Both app stores are live (iOS Sep 17, Android Sep 22). The new sign-in screens, app name and icon are built on a review branch, not in the live app yet.
Link: /reports/call-log.html
What: The system for propagating any change across every surface, with owners and the verification sweep.
What: Every catalog change on this board traces to a rule or decision on this page.
Where: Navigation · os-web
What: Rename "Overview" to "Today." Keep existing functionality and permissions available when moving pages.
Fix: Main nav shows "Today" and no "Overview" label anywhere; opening it loads the former Overview page with the same content and role permissions.
Note: PARTIAL on DEV ef8457c (Sep 15): Build confirmed: served HTML references /assets/index-CexTLs1R.js. The 'Overview' rename is done everywhere it referred to the Today page, but the paired 'Calendar' rename is NOT. (1) Settings > Roles & Access matrix rows, extracted per role: Front Desk = "TODAY AUDIT VISIBILITY ONLY", "CALENDAR COMPLETE ADMIN OVERSIGHT", "CRM & SALES ...", "OPERATIONS ...", "INBOX ..."; Attendant = "CALENDAR AUDIT VISIBILITY ONLY", "OPERATIONS ..."; Owner / General Manager and…
verify-sep15 screenshot: C:\Users\ravik\local-ai\ritual-life\verify-sep15\labels-and-sop\OS2-001-roles-landing.png (also OS2-001-matrix-front-desk.png, OS2-001-matrix-attendant.png, OS2-001-matrix-owner-general-manager.png, OS2-001-matrix-studio-manager.png, OS2-001-history-back-button.png, OS2-001-api-key-scopes-crop.png, OS2-001-palette-overview.png, OS2-001-palette-empty.png)
Where: Pricing catalog · os-web
What: Change the auto-applied candidate from regular x 0.85 to regular x 0.90 and rename it SERVE10 (label 'Those Who Serve 10%'); update the seeded DB discount code from PERCENT 15 to PERCENT 10 (deactivate SERVE15 so old checkout links stop working); keep the base as the regular (standard) price, which it already is; keep the single-winner rule so it never combines with the founding rate. Update every place the text says 15 (checkout, receipts, plan features, staff CRM).
Fix: Matches the Membership Rules page and Rory's Sep 8 website copy.
Note: PARTIAL on DEV ef8457c (Sep 15): PRICING CONFIRMED, LIST/LOOPHOLE GAPS. (1) Automatic 10% for tagged members, admin quote POST /api/v1/sales/cart/preview: Rory Test Member (tag 'first responder', active Essential) Core -> unitAmount 152.10, regularAmount 169, pricingRuleCode 'SERVE10', pricingRuleLabel 'Those Who Serve 10%'; Bob Martin (tag 'First Responder') Core 152.10, Complete 251.10 (279 x 0.9).
verify-sep15 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep15/catalog/C01-admin-tag-rules.png (also C01-member-bob-change-quote.png, C01-admin-serve15-editor.png)
Where: Pricing catalog · os-web
What: Set each plan's feature list to Rory's card copy: sessions 'every four weeks' (4, 8, 12, Unlimited), 'Sauna, cold plunge, and rest areas included with each session', retail line per tier, Complete '1 complimentary guest pass every four weeks', Unlimited '2 complimentary guest passes every four weeks' and 'Priority Booking', then 'Access to member-only events' and 'Member rewards program' on all four. Keep '2 billing cycles minimum commitment' as the app's own line. No monthly wording anywhere; always 'every four weeks'.
Fix: Matches the Membership Rules page and Rory's Sep 8 website copy.
Note: PARTIAL on DEV ef8457c (Sep 15): Feature lists are generated server-side (approvedMembershipFeatures in catalogDefinition.ts) and rendered identically in the API, the admin MEMBERSHIPS tab and the member ?view=shop cards (CSS-uppercased). Exact lists in order: Core = '4 sessions every four weeks' | 'Sauna, cold plunge, and rest areas included with each session' | 'Access to member-only events' | 'Member rewards program' | '2 billing cycles minimum commitment'.
verify-sep15 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep15/catalog/member-alice-shop.png (also C02-C03-admin-memberships.png)
Where: Navigation · os-web
What: Combine the existing Calendar and Bookings pages under one "Bookings" navigation item, with "Calendar" and "History" tabs. Open Calendar by default. Keep existing functionality and permissions available when moving pages.
Fix: Nav has a single "Bookings" entry that opens on the Calendar tab; the History tab shows the former Bookings page; every action previously available on either page still works for the same roles.
Note: VERIFIED on DEV (Sep 10): Sidebar has a single "Bookings" entry and no "Calendar" entry (full list: Today | Bookings | Members | Sales | Marketing | Operations | Inbox | Employee Hub | Manager Tools | Request Center | Content Hub | Analytics | Settings).
verify-sep9 screenshot: C:\Users\ravik\local-ai\ritual-life\verify-sep9\nav-today\OS2-002-bookings-default.png (also OS2-002-history.png, OS2-002-hist-row-action.png, OS2-002-cal-blackout.png, OS2-002-cal-week.png, OS2-002-cal-month.png, OS2-002-cal-slot-booked.png, OS2-002-cal-slot-plus.png, OS2-002-role-manager-bookings.png)
Where: Navigation · os-web
What: Keep existing functionality and permissions available when moving pages. Update internal links so they still open the correct destination (links to Overview, Calendar and Bookings from Today, member profiles, notifications, dashboards, etc.).
Fix: Every in-app link or button that used to open Overview, Calendar or Bookings lands on the new Today page or the correct Bookings tab; no 404s or blank pages.
Note: VERIFIED on DEV (Sep 10): Old URLs: ?view=dashboard -> Today (h1 TODAY, nav item Today active); ?view=calendar -> Bookings with Calendar tab selected; ?view=bookings -> Bookings with History tab selected; ?view=bookings-calendar / bookings-history / bookings-new all render the Bookings hub (bookings-new also opens the Book a session panel).
verify-sep9 screenshot: C:\Users\ravik\local-ai\ritual-life\verify-sep9\nav-today\OS2-003-view-calendar.png (also OS2-003-view-bookings.png, OS2-003-view-dashboard.png, OS2-003-view-overview.png, OS2-003-link-view-all-bookings.png, OS2-003-link-view-tasks.png, OS2-003-link-open-inbox.png, OS2-003-link-review-session.png, OS2-003-link-open-profile.png, OS2-003-link-profile-bookings.png, OS2-003-link-analytics-view-bookings.png, OS2-003-palette-calendar-click.png, OS2-003-palette-today-click.png)
Where: Today page · os-web
What: Prioritize these existing functions in this order: (1) Today's bookings and upcoming arrivals, with current occupancy. (2) Guest or payment issues requiring action today. (3) Tasks due today. (4) Messages needing a response. Reuse existing data and components.
Fix: Today page sections appear top-to-bottom in exactly that order and each shows live data for today.
Note: VERIFIED on DEV (Sep 10): DOM order on Today (page y offsets, 1280x800): h3 "Today's bookings and upcoming arrivals" y=277 containing "Current occupancy: 0 / 12", "7 bookings today", h4 "Upcoming arrivals" (7 rows, e.g. "Sarah Jenkins / Contrast Therapy - Communal Room / 10:00 AM / Awaiting arrival") and h4 "Checked in" ("No checked-in sessions."); h3 "Guest and payment issues today" y=903 (7 entries "Sarah Jenkins - <time> / Billing information / Billing Address" with Review session + Open…
verify-sep9 screenshot: C:\Users\ravik\local-ai\ritual-life\verify-sep9\nav-today\OS2-004-today-full.png (also OS2-004-ops-due-today.png, OS2-004-inbox-needs-reply.png, OS2-004-api-bodies.json)
Where: Today page · os-web
What: Place "Book a session" and "New sale" buttons near the top of the Today page.
Fix: Both buttons are visible on Today without scrolling; "Book a session" opens the booking panel and "New sale" opens the sale flow.
Note: VERIFIED on DEV (Sep 10): On Today at 1280x800 with scrollY=0, main buttons "Book a session" (x=858, y=166, bottom=214) and "New sale" (x=1049, y=166) sit in the page header beside the "Refresh Today" icon, well inside the 800px viewport; at 390x844 both are at y=200 without scrolling. "Book a session" navigates to ?view=bookings-new and opens the side panel "Book a session / 2026-09-10 at Select time" with Date 09/10/2026, Time select (11:00 AM ...
verify-sep9 screenshot: C:\Users\ravik\local-ai\ritual-life\verify-sep9\nav-today\OS2-005-today-top.png (also OS2-005-book-a-session.png, OS2-005-new-sale.png, OS2-005-mobile-390.png)
Where: Today page · os-web
What: Move occupancy trends and historical comparisons off the Today page to Analytics. Reuse existing data and components.
Fix: Today shows no trend or historical-comparison widgets; the same charts appear on Analytics with identical data.
Note: VERIFIED on DEV (Sep 10): Today page scan: 0 svg elements wider than 120px, 0 canvas, 0 recharts containers, and no text matching trend / vs / compared / comparison / historical / yesterday / 7-day / 30-day anywhere in main (full-page screenshot shows only the four list sections).
verify-sep9 screenshot: C:\Users\ravik\local-ai\ritual-life\verify-sep9\nav-today\OS2-006-analytics-overview-full.png (also OS2-006-today-full.png, OS2-001-analytics-configure.png)
Where: Member profile · os-web
What: Put the guest's name, membership status, available sessions or passes, and next booking at the top of the member profile.
Fix: Opening any member profile shows name, membership status, available sessions/passes and next booking in the header before any other section.
Note: VERIFIED on DEV (Sep 10): Opened 22 member profiles as admin (drawer at /?view=crm-members&contactId=...). Every profile header, before the tab strip and any other section, reads: name, email/phone, then "Membership" (e.g. Alice Walker: "Complete / Active"; Bob Martin: "Essential / Past Due"; Jake Morrison: "Essential / Frozen"), "Available sessions" (2 / 10 / 0), "Guest passes" (0), and "Next booking" (Alice: "09/15/2026 at 8:00 AM Contrast Therapy / Confirmed"; Jake: "No upcoming booking").
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/member-booking/profile-Alice_Walker.png
Where: Member profile · os-web
What: Replace the repeated Member Action Queue and Identity Alerts with one compact "Needs attention" section. Display each unresolved issue once, with its existing resolution action. Hide this section when there are no outstanding issues.
Fix: A member with two unresolved issues shows one "Needs attention" section listing each issue once with its existing resolve action; a member with no issues shows no section and no empty placeholder.
Note: VERIFIED on DEV (Sep 10): Bob Martin (4 unresolved issues) shows exactly one <h3 id="member-needs-attention">Needs attention</h3> section listing each issue once with its existing action: "Past Due Payment / Update Card", "Billing Address Missing / Add Address", "High Churn Risk / View Activity", "Profile Review Needed: Billing information / Mark as reviewed". Jake Morrison shows 3 issues once each (Add Address, Add Emergency Contact, View Activity).
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/member-booking/profile-Bob_Martin.png
Where: Member profile · os-web
What: Check what "Confirm Audit" does. If it saves profile changes, rename it "Save Member Information." If it only records that the profile has been reviewed, rename it "Mark as reviewed."
Fix: The button reads "Save Member Information" or "Mark as reviewed" according to its verified behavior, and the finding (what the button does) is stated in the PR.
Note: VERIFIED on DEV (Sep 10): No "Confirm Audit" anywhere: 0 hits in profile text and 0 hits in bundle index-4zyxN6Ds.js (the only "...Audit" strings left are unrelated: "Finish Audit" in staff access, "Automation Run Audit", "Punctuality Audit"). The bottom action bar button DOM text is "Mark as reviewed" (rendered uppercase "MARK AS REVIEWED" via CSS), and the Needs-attention row also reads "Mark as reviewed".
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/member-booking/OS2-010-after-click.png
Where: Booking flow · os-web
What: If we need to update a guest's information or sell them a pass while making a booking, keep their name, date, and time selected. Once that's complete, take us directly back to finish the booking without having to enter anything again.
Fix: Start a booking, pick guest/date/time, edit the guest or sell a pass, and you return to the booking with the same guest, date and time pre-filled and can confirm without re-entering anything.
Note: VERIFIED on DEV (Sep 10): Booking panel (/?view=bookings-new) after choosing guest/date/time offers "Update guest", "Open billing", "Sell a pass". (1) Real guest edit: Rory Test Member, 2026-09-25 4:00 PM -> Update guest -> profile drawer -> "Add Emergency Contact" (name/phone saved, PATCH /api/v1/contacts/cmo284tkt0006ryyq7oa94coh 200) and in a second run "Add Address" ("100 QA Test Ave, Tacoma, WA 98402", PATCH 200).
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/member-booking/OS2-011-edit-guest-after-save.png
Where: Booking flow · os-web
What: Before confirming, automatically check that the selected time is still available and the guest meets the booking requirements (including after returning from a guest update or pass sale).
Fix: If the slot was taken or the guest no longer qualifies while the booking was paused, confirm is blocked with a clear message; otherwise confirm succeeds with no extra steps.
Note: VERIFIED on DEV (Sep 10): Bundle confirm handler re-fetches the contact, runs an eligibility gate, re-fetches /api/v1/bookings/slots and requires available>0 for the chosen start before POSTing. Verified live: (A) Slot taken while paused, REAL server-side: context A drafted Sarah Jenkins 2026-12-30 3:30 PM and detoured to Update guest; context B applied a blackout 15:30-16:00 that day (POST /api/v1/blackouts 201, id cmtvtvcj40094ry6bqotuawzv); context A returned (draft intact) and clicked…
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/member-booking/OS2-012-D-real-blackout-blocked.png
Where: Checkout · os-web
What: Make the "Cart summary" background lighter so it's easier to read.
Fix: Cart summary renders on a light background with clear text contrast; Rory confirms it is easier to read.
Note: VERIFIED on DEV (Sep 10): section[aria-label="Cart summary"] has class "min-w-0 bg-white p-5 text-stone-dark"; computed background rgb(255,255,255), text rgb(28,33,27), h3 "Cart summary" same dark color; all 4 ancestors transparent so nothing darkens it. Verified empty, with member, with item, and at the Reviewed step. Technical acceptance met; Rory's subjective confirmation is outside what I can verify.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/checkout-marketing/OS2-013-cart-summary-with-item.png
Where: Checkout · os-web
What: Rename "Guided Assisted Sale" to "New sale" wherever it appears (page title, buttons, navigation).
Fix: No "Guided Assisted Sale" label remains; the flow is called "New sale" everywhere, including the Today page button.
Note: VERIFIED on DEV ef8457c (Sep 15): Sidebar sub-item under Sales reads "NEW SALE" (label text "New sale", rendered uppercase) in all four contexts: admin 1280 (nav text "... Members Sales NEW SALE Marketing ...", page heading "New sale"), manager maya 1280 (same, "PERMISSION SET STUDIO MANAGER"), admin 390 and maya 390 (hamburger drawer with Sales active lists "Sales" at y=457 then "NEW SALE" at y=503; after scrolling the drawer's nav container the sub-item is at y=283 and…
verify-sep15 screenshot: C:\Users\ravik\local-ai\ritual-life\verify-sep15\labels-and-sop\OS2-014-admin-1280.png (also OS2-014-maya-1280.png, OS2-014-admin-390-scrolled.png, OS2-014-maya-390-scrolled.png, OS2-014-modal-sell-pack.png, OS2-014-modal-change-membership.png, OS2-014-modal-gift-purchase.png)
Where: Checkout · os-web
What: Remove the repeated "Needed" badges beside each step and the explanatory panels that repeat the same instructions.
Fix: Checkout steps show no "Needed" badges and instructions appear at most once; a sale can still be completed end to end.
Note: VERIFIED on DEV (Sep 10): "Needed" text count = 0 in every checkout state: empty, member selected (Tyler Brooks), New Member / Guest path ("WALK-IN / GUEST CHECKOUT"), Membership/Drop-In/Gift/Retail categories, after ADD TO CART, and after Review Sale. No duplicated paragraphs; the only instruction/status line is "Sale reviewed. Payment is ready when staff confirms." shown once.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/checkout-marketing/OS2-015-review-step.png
Where: Checkout · os-web
What: Show payment-method buttons only when the sale is ready for payment. They currently appear earlier as disabled options, adding clutter before we can use them.
Fix: No payment-method buttons are visible until the cart is ready for payment; once ready they appear enabled and work.
Note: VERIFIED on DEV (Sep 10): Before the cart is ready: zero payment-like buttons in the DOM; the only disabled control is "Review Sale" (disabled with no customer/items). After member + item, "Review Sale" enables; after clicking it the cart shows "Reviewed" and three payment buttons appear: "Charge Card On File", "Use Different Card", "Add / Save New Card", all disabled=false. None were clicked (no charge attempted).
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/checkout-marketing/OS2-016-after-review.png
Where: Booking panel · os-web
What: Remove the large dark "Direct Placement" banner from the booking panel.
Fix: Opening the booking panel shows no "Direct Placement" banner.
Note: VERIFIED on DEV (Sep 10): Opened the booking panel from Today > "Book a session" (lands on /?view=bookings-new, right-hand drawer) and from the calendar's "Book a session at 3:00 PM" buttons. Panel text contains no "Direct Placement" (0 hits; also 0 hits for "Placement" in the panel and 0 for "Direct Placement" in bundle index-4zyxN6Ds.js; the single remaining "Walk-in Placement" string is in the help/guide content, not the panel).
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/member-booking/OS2-017-booking-panel-open.png
Where: Booking panel · os-web
What: Change the panel heading from "Add Booking" to "Book a session."
Fix: Booking panel heading reads "Book a session"; no "Add Booking" text remains.
Note: VERIFIED on DEV (Sep 10): Panel heading is <h3 class="text-xl font-semibold text-evergreen">Book a session</h3>; Today page button reads "Book a session"; calendar slot buttons read "Book a session at 7:00 AM" etc. "Add Booking" / "ADD BOOKING" appear 0 times on the Today, Bookings calendar and panel text, and 0 times in bundle index-4zyxN6Ds.js ("Book a session" 8 hits).
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/member-booking/OS2-017-booking-panel-open.png
Where: Booking panel · os-web
What: Display the selected date and time in a compact line below the heading.
Fix: After picking a slot, one compact line directly under the heading shows the selected date and time.
Note: VERIFIED on DEV (Sep 10): Directly under the H3 heading (same wrapper div) is <p data-testid="booking-slot-summary" class="mt-1 text-sm">. Before picking a time it reads "2026-09-10 at Select time"; after selecting 3:00 PM it updates to "2026-09-10 at 3:00 PM" (and "2026-12-30 at 3:30 PM", "2026-09-25 at 4:00 PM" in other runs); it persists through the guest/billing/sale detours. Minor nit: the date is shown in ISO form (2026-09-10) while the rest of the app uses 09/10/2026.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/member-booking/OS2-019-after-select.png
Where: Booking panel · os-web
What: Change the search placeholder from "Search CRM" to "Search guests."
Fix: Guest search field placeholder reads "Search guests".
Note: VERIFIED on DEV (Sep 10): Guest search input is <input type="text" placeholder="Search guests" aria-label="Search guests">; "Search CRM" appears 0 times in the panel and 0 times in bundle index-4zyxN6Ds.js ("Search guests" 2 hits). CAVEAT (functional defect outside this item's acceptance line): the search only filters the first page of contacts. The panel calls GET /api/v1/contacts which returns pagination {page:1, limit:20, total:88, totalPages:5}, and the list shows those 20 (Zoe Sato ...
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/member-booking/OS2-017-booking-panel-open.png
Where: Mobile app · mobile-webview
What: Book tab watermark "r" should be the actual logo. Vidya reported on Sep 3 that this is done in the web layer; Rory has not re-verified. Keep as a verify-with-Rory item.
Fix: Rory confirms on TestFlight that the Book tab watermark is the real logo.
Note: VERIFIED on DEV (Sep 10): Web layer verified (device confirm still with Rory). Member alice, 390x844, ?nativeApp=1, view=book, Step 1 'Select Studio': the studio card renders <img data-testid="booking-location-native-mark" src="/icons/ritual-icon-192.png" alt="Ritual Studio"> (82x82 circular, naturalWidth 192, loaded). The image is the real Ritual monogram (stylised R inside a circle), the same asset as the PWA/apple-touch icon in manifest.webmanifest.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/mobile-member/OS2-060-book-step1.png (closeup: OS2-060-mark-closeup.png; non-native: OS2-060-book-nonnative.png)
Where: Mobile app · mobile-webview
What: Could not cancel sessions because all showed checked in. Vidya reported on Sep 3 that this is done in the web layer; Rory has not re-verified. Keep as a verify-with-Rory item.
Fix: On TestFlight, an upcoming session shows as upcoming (not checked in) and Rory can cancel it.
Note: VERIFIED on DEV ef8457c (Sep 15): Build check: served HTML at https://dev.ritualstudiospa.com/ references index-CexTLs1R.js. Ground truth via API (GET /api/v1/bookings/mine as alice, and GET /api/v1/bookings/location/loc_primary?date=... as admin): all five original bookings are status CONFIRMED and STILL carry the stale checkedInAt in the payload: Sep 15 08:00 cmsg811hg001cryprur562zkg (checkedInAt 2026-08-05T15:08:22Z), Sep 15 11:00 cmsg8ml4a007frypru877pqfr (2026-08-05T15:24:37Z), Sep 19…
verify-sep15 screenshot: C:\Users\ravik\local-ai\ritual-life\verify-sep15\member-schedule\OS2-064-a-full.png; OS2-064-b-full.png; OS2-064-c-full.png; OS2-064-d-full.png; OS2-064-e-full.png; OS2-064-upcoming-list.png; OS2-064-admin.png (admin Sep 15 8:00 AM); OS2-064-past.png (Aug 27 Completed control); OS2-064-past-list.png
Where: Mobile app · mobile-webview
What: Remove the "_" on checked in. Vidya reported on Sep 3 that this is done in the web layer; Rory has not re-verified. Keep as a verify-with-Rory item.
Fix: Checked-in status displays "Checked in" with no underscore; Rory confirms on TestFlight.
Note: VERIFIED on DEV (Sep 10): Bundle label map is VX={confirmed:"Confirmed",pending:"Pending",checked_in:"Checked in",checked_out:"Completed",cancelled:"Cancelled",no_show:"No show"}. In view=schedule the session-detail badge DOM text is exactly 'Checked in' (class text-transform: uppercase, so it renders as 'CHECKED IN') with sub-copy 'You are checked in for this session.'; a past non-cancelled session renders 'COMPLETED'.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/mobile-member/OS2-065-checked-in-label.png (past detail: OS2-065-past-detail.png)
Where: Mobile app · mobile-webview
What: The bottom line only when past / inside 12hr window / checked in. Vidya reported on Sep 3 that this is done in the web layer; Rory has not re-verified. Keep as a verify-with-Rory item.
Fix: On TestFlight, a session more than 12 hours out shows no bottom line; sessions that are past, within 12 hours, or checked in show it.
Note: VERIFIED on DEV ef8457c (Sep 15): Same booking cmsg811hg001cryprur562zkg (API date '2026-09-15', time '08:00', endTime '09:30'). Member schedule (alice 390x844 ?nativeApp=1): list row '8:00 AM PT', sheet 'TUESDAY, SEPTEMBER 15, 2026 / AT 8:00 AM PT', header 'Studio time (Pacific)'. Admin calendar (1280x800, day view 'Tuesday, September 15'): chip 'ALICE WALKER' sits in the '8:00 AM' slot and the panel reads 'SESSION START 08:00 / SCHEDULED END 09:30'.
verify-sep15 screenshot: C:\Users\ravik\local-ai\ritual-life\verify-sep15\member-schedule\OS2-066-member-pacific.png; OS2-066-admin-pacific.png; OS2-066-member-eastern.png; OS2-066-admin-eastern.png; OS2-066-member-kolkata.png; OS2-066-admin-kolkata.png
Where: Mobile app · mobile-webview
What: Messages and loyalty history show the first 5 items, then a Show more control. Vidya reported on Sep 3 that this is done in the web layer; Rory has not re-verified. Keep as a verify-with-Rory item.
Fix: On TestFlight, both Messages and Loyalty history list 5 items with a "Show more" that reveals the rest.
Note: VERIFIED on DEV (Sep 10): Messages (view=inbox): exactly 5 threads listed, then a button reading 'SHOW MORE (39)'; tapping it revealed all 44 threads and the button changed to 'SHOW LESS'. Loyalty history (view=wallet, section 'ACTIVITY HISTORY', fed by /api/v1/credits/history array(47)): exactly 5 rows ('Points earned from Drop-In 08/21/2026 +600 pts' ...
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/mobile-member/OS2-069-messages-before.png, OS2-069-messages-after.png, OS2-069-loyalty-before.png, OS2-069-loyalty-after.png
Where: Pricing catalog · os-web
What: Edit APPROVED_MEMBERSHIP_CATALOG retail discount values (essential 10 to 5, complete 15 to 10, unlimited stays 10, core 0), mirror in scripts/syncMembershipCatalog.ts and plan feature text, rerun the catalog sync, and confirm assertApprovedMembershipCatalogPlan accepts the new values and rejects the old ones. Check any retail or POS code path that reads the plan's retail discount.
Fix: Matches the Membership Rules page and Rory's Sep 8 website copy.
Note: VERIFIED on DEV ef8457c (Sep 15): GET /api/v1/pricing/plans: core retailDiscountPercent 0, essential 5, complete 10, unlimited 10. Admin Settings > Pricing & Discounts > MEMBERSHIPS tab (?view=settings-pricing) feature lines: Core has no retail line ('4 sessions every four weeks / Sauna, cold plunge, and rest areas included with each session / Access to member-only events / Member rewards program / 2 billing cycles minimum commitment'); Essential shows '5% off retail'; Complete shows '10% off…
verify-sep15 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep15/catalog/C02-C03-admin-memberships.png (also member-alice-shop.png)
Where: Pricing catalog · os-web
What: Create two non-recurring pack products (5 sessions $275, 10 sessions $500) that mint the existing pack bucket type, show in the member wallet, spend through the existing funding waterfall, and can be gifted. Add both, plus the $60 single session, to the approved catalog guard so prices cannot drift. Leave expiry configurable; default to no expiry until Rory answers decision 13, then set it. Do not sell before opening; until then the site records interest only.
Fix: Matches the Membership Rules page and Rory's Sep 8 website copy.
Note: VERIFIED on DEV ef8457c (Sep 15): Products exist, GET /api/v1/pricing/plans: plan_dropin 'Drop-In' type ONE_TIME price 60 credits 1; plan_pack_5 '5 Session Pack' type PACK price 275 credits 5 expiryDays 150 isShareable true; plan_pack_10 '10 Session Pack' type PACK price 500 credits 10 expiryDays 270.
verify-sep15 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep15/catalog/C04-member-buy-gated-full.png (also C04-admin-packs.png)
Where: Website · nginx gate
What: ritualstudiospa.com/journal returns 503 since the Sep 18 17:05 UTC website config repair. nginx auth_request to /api/v1/public/content/publication-check returns 503 because the X-Ritual-Publication-Snapshot from content-gate.nginx.inc (a873778a...) no longer equals publicationFingerprint(published posts). Regenerate journal/index.html and content-gate.nginx.inc from the app's current published set (or republish from the OS) and reload nginx.
Fix: GET https://ritualstudiospa.com/journal returns 200 from outside with the current published posts listed; /journal-sitemap.xml 200.
Note: Fixed September 18: the journal was republished from the app. Re-checked September 22: /journal loads with all 11 articles.
nginx error log + publicContent.router.ts, Sep 18
Where: Marketing · os-web
What: Replace the large "Member App Ribbon" banner with a compact row labeled "App announcement," showing the current announcement status and an "Edit announcement" button.
Fix: Top of Marketing shows a one-line "App announcement" row with the current status and an "Edit announcement" button that opens the existing editor.
Note: VERIFIED on DEV (Sep 10): Top of Marketing (Campaigns tab) is a 65px-tall <section class="flex flex-wrap items-center gap-3 border-b ..."> reading "App announcement Active Welcome to Ritual [Edit announcement]". "Member App Ribbon" / "Ribbon" = 0 hits in DOM and bundle. Clicking "Edit announcement" opens the editor: "Announcement text" textarea (value "Welcome to Ritual", placeholder "Example: Guest pass week is live this weekend."), PREVIEW, "Clear announcement", "Save announcement". Not saved.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/checkout-marketing/OS2-021-marketing-top.png
Where: Marketing · os-web
What: Remove the large "Goal to Audience to Channel to Content to Schedule to Review" explanation panel. Bring the existing campaign search, campaign list, and "Plan campaign" button directly below the announcement row.
Fix: No explanation panel; campaign search, campaign list and "Plan campaign" appear immediately below the App announcement row.
Note: VERIFIED on DEV (Sep 10): No "Goal"/"Audience"/"Channel"/"Schedule"/"Review" explanation text on the page (0 hits). Layout top-to-bottom: announcement row y=239-304, then search input placeholder "Search campaign history..." at y=316 and "PLAN CAMPAIGN" button at y=317, then the campaign list starting with "QA VERIFY frontdesk campaign 0724b" at y=419.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/checkout-marketing/OS2-022-marketing-full.png
Where: Marketing · os-web
What: Change "Dynamic Audience Architect" to "Create a contact group." Change "Live Population Estimate" to "Estimated contacts." Change "Deploy Segment Logic" to "Save group."
Fix: The three new labels appear in the contact-group panel and none of the old labels remain.
Note: VERIFIED on DEV (Sep 10): Segments tab: card button "Create a contact group" opens a drawer with h3 "Create a contact group" (edit mode: "Edit contact group"), footer text "Estimated contacts: ..." and button "Save group". Old labels "Dynamic Audience Architect", "Live Population Estimate", "Deploy Segment Logic" = 0 hits in DOM and in the bundle.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/checkout-marketing/OS2-025-segments-create.png
Where: Marketing · os-web
What: Remove the "98% accuracy" badge from the contact-group panel.
Fix: No accuracy badge is rendered in the contact-group panel.
Note: VERIFIED on DEV (Sep 10): "98%" and "accuracy" = 0 hits in the Segments view (list, new-group panel, edit-existing panel). Bundle has 0 occurrences of "98% accuracy"; its 3 "98%" hits are analytics data ("SLA Pass", weekend capacity, "SLA Adherence"), unrelated to contact groups.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/checkout-marketing/OS2-024-segments-full.png
Where: Marketing · os-web
What: Make the contact count a small summary near the save button instead of a large dark card.
Fix: The estimated contact count appears as small text next to the "Save group" button; the large dark card is gone.
Note: VERIFIED on DEV (Sep 10): Footer row <div class="pt-4 border-t ... flex flex-wrap items-center justify-end gap-4"> holds <p class="text-sm text-taupe" role="status">"Estimated contacts: 8 (last saved)" (14px, transparent background) directly left of the "Save group" button (148x44). No dark card with a count exists in the panel. Note: for a new unsaved group the text reads "Estimated contacts: Calculated on save" (no live number until saved).
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/checkout-marketing/OS2-025-save-row-closeup.png
Where: Loyalty · os-web
What: Remove the technical label "Persisted settings."
Fix: No "Persisted settings" text on the Loyalty page.
Note: VERIFIED on DEV (Sep 10): Members > LOYALTY (?view=crm-loyalty): "Persisted settings" / "Persisted" = 0 hits across all four tabs (How members earn points, Rewards Catalog, Referral rewards, Point adjustments) and 0 in the bundle.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/checkout-marketing/OS2-026-loyalty.png
Where: Loyalty · os-web
What: Replace the paragraph referencing a "dedicated backend endpoint" with a short explanation of any limitation that still exists. If the full points history remains unavailable, use: "You can adjust individual member balances here. Full points history is not available on this page."
Fix: The endpoint paragraph is gone; if points history is still unavailable the exact sentence above is shown, otherwise no limitation note appears.
Note: VERIFIED on DEV (Sep 10): "Point adjustments" tab shows heading "Point Adjustments", button "ADJUST BALANCE", and exactly one paragraph: "You can adjust individual member balances here. Full points history is not available on this page." "dedicated backend endpoint" / "endpoint" / "backend" = 0 hits in DOM and bundle.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/checkout-marketing/loyalty-tab-point-adjustments.png
Where: Loyalty · os-web
What: Change "Earning Architecture" to "How members earn points" and "Referral Engine" to "Referral rewards."
Fix: "How members earn points" and "Referral rewards" appear as the section headings; the old headings are gone.
Note: VERIFIED on DEV (Sep 10): Loyalty tabs read "How members earn points", "Rewards Catalog", "Referral rewards", "Point adjustments". Section headings: h3 "How members earn points" (with ADD RULE) and h3 "Referral rewards" (dark side panel with "Edit referral rewards"). "Earning Architecture" and "Referral Engine" = 0 hits in DOM and bundle.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/checkout-marketing/loyalty-tab-referral-rewards.png
Where: SOPs · os-web
What: Replace the long introductory paragraph with "Find procedures for opening, closing, guest care, safety, and equipment."
Fix: The SOP page intro is exactly "Find procedures for opening, closing, guest care, safety, and equipment."
Note: VERIFIED on DEV (Sep 10): Operations > SOPS (?view=ops-sops): the intro <p> under h2 "SOP Library" is exactly "Find procedures for opening, closing, guest care, safety, and equipment."; it is the only intro paragraph (eyebrow "OPERATIONS" above).
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/checkout-marketing/OS2-029-sops-viewport-1280x800.png
Where: SOPs · os-web
What: Replace the three large summary cards with one compact row displaying the same counts.
Fix: One compact row shows the same three counts the cards showed; the cards are gone.
Note: VERIFIED on DEV (Sep 10): One 20px-high inline row at y=315 with three items: "Active SOPs 12", "Require Acknowledgment 3", "Quick References 9" (widths 97/175/122px, no card styling). No large summary cards present.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/checkout-marketing/OS2-030-sops-full.png
Where: SOPs · os-web
What: Move the search bar and procedure list directly below that row so the procedures are visible sooner.
Fix: On load, the search bar and the first procedures are visible without scrolling on a laptop screen.
Note: VERIFIED on DEV (Sep 10): Search input "Search SOPs..." sits at y=364-410 directly under the counts row, with the category select beside it; the first six procedure cards (Studio Opening Checklist, First-Time Guest Welcome, Emergency Escalation, Studio Closing Checklist, Sauna And Cold Plunge Safety, Communal Room Etiquette) are fully in view without scrolling at both 1280x800 and 1366x768.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/checkout-marketing/OS2-031-sops-viewport-1366x768.png
Where: Employee Hub · employee-hub
What: Reduce the employee menu to five sections. Group the existing pages as follows: 1. Home: the employee's next shift, outstanding tasks, and items awaiting their action. 2. My schedule: combine the existing schedule and time-off pages, with "Schedule" and "Time off" tabs. 3. My training: combine the existing onboarding and training/credentials pages, with "Getting started," "Ongoing training," and "Certificates" tabs. 4. Resources: group the existing SOPs, handbook, and policies here. 5. My profile: keep the employee's personal information and employee documents here.
Fix: Employee menu shows exactly Home, My schedule, My training, Resources, My profile; every former employee page (including personal info and employee documents under My profile) is reachable from one of them.
Note: VERIFIED on DEV (Sep 10): Logged in as priya@ritualstudiospa.com (lands on ?view=employee-hub-home). Sidebar under 'Employee Hub' reads exactly: HOME, MY SCHEDULE, MY TRAINING, RESOURCES, MY PROFILE (then SIGN OUT). Every former page reachable: MY SCHEDULE -> ?view=employee-hub-schedule (tabs Schedule / Time off -> employee-hub-time-off); MY TRAINING -> employee-hub-onboarding (tabs Getting started / Ongoing training -> employee-hub-training / Certificates -> employee-hub-certificates)…
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/employee-hub/OS2-032-employee-menu.png (also OS2-032-my-profile.png)
Where: Employee Hub · employee-hub
What: Home: show the employee's next shift, outstanding tasks, and items awaiting their action.
Fix: Logged in as an employee, Home shows their next shift, open tasks and pending items using existing data.
Note: VERIFIED on DEV (Sep 10): Employee Home shows 'Priya Sharma / Get help', section 'Next shift / No upcoming shifts / VIEW SCHEDULE' (correct: GET /api/v1/staff/me/shifts returns 10 shifts, all dated 2026-07-14..2026-07-26, none after today 2026-09-10), 'Outstanding tasks (20)' as rows e.g.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/employee-hub/OS2-033-home.png
Where: Employee Hub · employee-hub
What: My schedule: combine the existing schedule and time-off pages, with "Schedule" and "Time off" tabs.
Fix: "My schedule" opens on the Schedule tab; the Time off tab contains the full former time-off page including requests.
Note: VERIFIED on DEV (Sep 10): Clicking MY SCHEDULE opens ?view=employee-hub-schedule with role=tab list 'Schedule [aria-selected=true] | Time off [false]' and body 'MY SCHEDULE / Upcoming assigned shifts / No upcoming shifts are assigned to this login. / Schedule edits belong in manager tools...'.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/employee-hub/OS2-034-schedule-tab-default.png and OS2-034-timeoff-tab.png
Where: Employee Hub · employee-hub
What: My training: combine the existing onboarding and training/credentials pages, with "Getting started," "Ongoing training," and "Certificates" tabs.
Fix: "My training" has the three tabs; onboarding tasks are under Getting started, ongoing training under Ongoing training, credentials under Certificates.
Note: VERIFIED on DEV (Sep 10): MY TRAINING shows tabs 'Getting started [selected] | Ongoing training | Certificates'. Getting started (?view=employee-hub-onboarding): '5% of assigned training complete' then onboarding stages 'Welcome & Employment Setup', 'Culture, Facility & Team', 'Role & Systems', 'Safety & Core Operations', 'Guest Experience & Retail', 'Readiness & Milestones' with 20 task rows + 'Completed (1)'.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/employee-hub/OS2-035-getting-started-tab.png, OS2-035-ongoing-tab.png, OS2-035-certificates-tab.png
Where: Employee Hub · employee-hub
What: Resources: group the existing SOPs, handbook, and policies here. Combine "SOPs & Resources" and "Handbook & Policies" under Resources, with "Procedures" and "Handbook & policies" tabs.
Fix: "Resources" has Procedures and Handbook & policies tabs; all former SOPs, handbook and policy content is reachable there.
Note: VERIFIED on DEV (Sep 10): RESOURCES (?view=employee-hub-resources) shows tabs 'Procedures [selected] | Handbook & policies'. Procedures lists all 12 ACTIVE SOPs returned by GET /api/v1/knowledge?type=SOP&status=ACTIVE (Studio Opening Checklist, First-Time Guest Welcome, Emergency Escalation, Studio Closing Checklist, Sauna And Cold Plunge Safety, Communal Room Etiquette, Sanitation And Room Reset, Equipment Checks And Escalation, Late Arrivals..., Membership Retail And POS Flow, Employee And…
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/employee-hub/OS2-036-procedures-tab.png and OS2-036-handbook-tab.png
Where: Employee Hub · employee-hub
What: Move "People & Support" to a clearly visible "Get help" link on Employee Hub Home.
Fix: "People & Support" is no longer a menu item; a clearly visible "Get help" link on Home opens the same content.
Note: VERIFIED on DEV (Sep 10): Employee sidebar has no 'People & Support' item (labels: Employee Hub, HOME, MY SCHEDULE, MY TRAINING, RESOURCES, MY PROFILE, SIGN OUT); ?view=employee-hub-people returns 'PAGE NOT AVAILABLE'. Home shows an underlined 'Get help' link with icon at top-right next to 'Priya Sharma'; clicking it opens ?view=employee-hub-support headed 'Get help' with the former content: three 'PEOPLE & SUPPORT' cards 'Manager - Schedule, time off, coaching, guest escalation, and onboarding…
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/employee-hub/OS2-037-get-help.png
Where: Employee Hub · employee-hub
What: Use the existing "Manager Tools" entry to access "My Team," rather than including "My Team" among the personal employee pages.
Fix: "My Team" is absent from the five personal sections and is reachable under Manager Tools for managers.
Note: VERIFIED on DEV (Sep 10): Employee (priya) sidebar contains no My Team / Manager Tools entry. Manager (maya) sidebar shows 'Employee Hub' (expanding to the same five sections) plus a separate 'Manager Tools' item under EMPLOYEE PORTAL; clicking it opens ?view=employee-hub-team headed 'My Team' with badge 'Manager Tools', 'Roster oversight' select (Alex Rivera... Priya Sharma - Front Desk... Zoe Kim) and 'PTO APPROVALS' with APPROVE/DECLINE.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/employee-hub/OS2-038-manager-tools.png and OS2-038-employee-probe-employee-hub-team.png
Where: Employee Hub · employee-hub
What: Replace the large task cards with compact rows showing the task name, due date, status, and relevant action. Open the full instructions when the employee selects a task.
Fix: Training list renders one row per task with name, due date, status and action; selecting a row opens the full instructions.
Note: VERIFIED on DEV (Sep 10): Getting started renders one compact row per task (measured row container 68px high, class 'flex min-w-0 flex-wrap items-center gap-x-4 gap-y-2 py-3') with name, status chip, due date and action link, e.g. 'Review Ritual mission, vision, and values | Not started | Due Sep 11, 2026 | View instructions', 'Acknowledge basic compliance expectations | Overdue | Due Sep 10, 2026 | Read procedure', 'Upload required credentials | Not started | Due Sep 15, 2026 | Upload…
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/employee-hub/OS2-039-task-open.png and OS2-039-training-rows.png
Where: Employee Hub · employee-hub
What: Put completed tasks in a collapsed "Completed" section.
Fix: Completed tasks sit under a collapsed "Completed" header that expands on click.
Note: VERIFIED on DEV (Sep 10): At the bottom of Getting started there is a <details> element whose <summary> reads 'Completed (1)' with open=false (collapsed; only the header text visible). Clicking it sets open=true and reveals the completed rows: 'Complete final knowledge check | Completed | Due Sep 15, 2025 | View instructions' (later 'Completed (2)' after tasks were completed during QA). Bundle renders it as details/summary 'Completed (N)' listing only items with status COMPLETED.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/employee-hub/OS2-041-collapsed.png and OS2-041-expanded.png
Where: Employee Hub · employee-hub
What: Replace the long yellow explanation about manager sign-off with a short "Awaiting manager sign-off" status when that is the actual task status.
Fix: Tasks awaiting sign-off show the status "Awaiting manager sign-off" and no yellow explanatory box; tasks in other states show their own status.
Note: VERIFIED on DEV (Sep 10): Produced the state on DEV: as priya MARK COMPLETE on 'Complete facility orientation' (PATCH /api/v1/staff/me/onboarding/cmrqlq2jn000bry81n16fsslk -> status COMPLETED, employeeCompletedAt 2026-09-10, managerSignedOffAt null), then as maya (Manager Tools > roster Priya) pressed WAITING EMPLOYEE (PATCH /api/v1/staff/onboarding/... {status:'IN_PROGRESS'}).
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/employee-hub/OS2-042-employee-rows.png and OS2-042-employee-dialog.png
Where: Employee Hub · employee-hub
What: Keep the existing completion requirements attached to each task. Opening a procedure should not automatically mark it as read or approved.
Fix: Opening a reading task's procedure leaves the task status unchanged until the employee completes the existing confirmation step.
Note: VERIFIED on DEV (Sep 10): Opened reading tasks via row name and via the 'Read procedure' action ('Review emergency response SOPs', 'Acknowledge basic compliance expectations') and opened SOPs from Resources (Studio Opening/Closing Checklist, Emergency Escalation): network log shows only GET calls (/api/v1/knowledge?type=SOP&status=ACTIVE), zero PATCH/POST; row status stayed 'Not started'/'Overdue' after closing and after a full reload.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/employee-hub/OS2-043-procedure-open.png, OS2-043-status-after.png, OS2-043-mission-task-history.png
Where: Employee Hub · employee-hub
What: On procedure cards, show the title, category, and a short description. Move the "Owner," "Version," and "Next review" details inside the procedure instead of displaying them on every card.
Fix: Cards show only title, category and description; Owner, Version and Next review are visible when the procedure is opened.
Note: VERIFIED on DEV (Sep 10): Procedure cards show only category eyebrow, title and description, e.g. 'OPENING / Studio Opening Checklist / Prepare the space, systems, amenities, and first session of the day.'; the Procedures tab text contains no 'Owner', 'Version' or 'Next review'. Opening a card shows a drawer 'SOP - OPENING / Studio Opening Checklist' with tiles OWNER, APPLICABLE ROLES, VERSION, EFFECTIVE DATE, LAST REVIEW, NEXT REVIEW followed by the steps.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/employee-hub/OS2-044-procedure-open.png
Where: Employee Hub · employee-hub
What: Put direct links to the existing opening checklist, closing checklist, and emergency procedures at the top of the Procedures tab.
Fix: Three direct links appear above the procedure list on the Procedures tab and each opens the correct procedure.
Note: VERIFIED on DEV (Sep 10): Procedures tab shows three underlined links with book icons 'Opening checklist', 'Closing checklist', 'Emergency procedures' at y=296, above the search box and first card (y=431). Clicking each opens the correct drawer: 'Opening checklist' -> 'SOP - OPENING / Studio Opening Checklist / 1.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/employee-hub/OS2-045-pinned-links.png, OS2-045-opening.png, OS2-045-closing.png, OS2-045-emergency.png
Where: Employee Hub · employee-hub
What: Links from Operations and Employee Hub should open the same underlying procedure record.
Fix: Opening the same procedure from Operations SOPs and from Employee Hub Resources shows identical content, and an edit made in one is reflected in the other.
Note: VERIFIED on DEV ef8457c (Sep 15): Admin: Operations > SOPs (?view=ops-sops, "SOP Library ... Active SOPs 12 Require Acknowledgment 3") > Studio Opening Checklist card opens "SOP Preview / OPENING / Studio Opening Checklist / Prepare the space, systems, amenities, and first session of the day." with metadata: "OWNER Not set", "APPLICABLE ROLES Not set", "VERSION Not set", "EFFECTIVE DATE Not set", "LAST REVIEW Not set", "NEXT REVIEW Not set", "ACKNOWLEDGMENT REQUIRED Not set", "PRINTABLE Not…
verify-sep15 screenshot: C:\Users\ravik\local-ai\ritual-life\verify-sep15\labels-and-sop\OS2-046-priya-preview.png (also OS2-046-admin-preview.png, OS2-046-admin-sops-list.png, OS2-046-priya-resources-list.png)
Where: Manager tools · employee-hub
What: Each task currently repeats "Open Task," "Waiting Employee," "Needs Follow-up," "Check-in Note," and "Manager Sign-off." Make the task title clickable to open its details. Show its current status alongside the title.
Fix: Clicking a task title opens its details; the current status is displayed next to the title; the repeated five-button strip is gone from each row.
Note: VERIFIED on DEV (Sep 10): Manager (maya) > Manager Tools lands on ?view=employee-hub-team ("EMPLOYEE HUB / My Team"). Each training row is <div data-testid="training-row"> containing only a title <button> (e.g. "Complete your staff profile", class "min-h-[44px] ... font-bold ... hover:underline") followed by a status pill span ("Overdue", "Not started", "Blocked", "Completed", "Awaiting manager sign-off") and "Due Sep 10, 2026".
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/manager-tools/OS2-047-list-1280.png (rows) and C:/Users/ravik/local-ai/ritual-life/verify-sep9/manager-tools/OS2-047-details-open.png (drawer after title click)
Where: Manager tools · employee-hub
What: Display "Review and sign off" as the main button when the task is ready for the manager's review.
Fix: Only tasks ready for review show a primary "Review and sign off" button, and it opens the existing sign-off action.
Note: VERIFIED on DEV (Sep 10): Initially 0 "Review and sign off" buttons anywhere (no DEV task was review-ready for any of the 13 employees). Bundle logic: row renders `Ee&&fm(pe)&&<button className=Qa>Review and sign off</button>` where fm = status not COMPLETED/BLOCKED and (status in AWAITING_MANAGER_SIGN_OFF/AWAITING_REVIEW/PENDING_REVIEW or employeeCompletedAt set without managerSignedOffAt); label helper e4 returns "Awaiting manager sign-off".
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/manager-tools/OS2-048-row-ready.png, C:/Users/ravik/local-ai/ritual-life/verify-sep9/manager-tools/OS2-048-row-ready-crop.png, C:/Users/ravik/local-ai/ritual-life/verify-sep9/manager-tools/OS2-048-signoff-action.png, C:/Users/ravik/local-ai/ritual-life/verify-sep9/manager-tools/OS2-048-after-signoff.png
Where: Manager tools · employee-hub
What: Move the existing status-change controls and "Check-in Note" action into the task details.
Fix: Status changes and Check-in Note are available inside the task detail view and no longer on each list row.
Note: VERIFIED on DEV (Sep 10): The task drawer (opened from a row title as manager) contains a "Check-in note" textarea and the buttons "WAITING EMPLOYEE", "NEEDS FOLLOW-UP", "SAVE CHECK-IN NOTE", "RECORD MANAGER SIGN-OFF" (becomes "REVIEW AND SIGN OFF" when the task is ready), plus COMPLETION HISTORY.
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/manager-tools/OS2-049-details-panel.png and C:/Users/ravik/local-ai/ritual-life/verify-sep9/manager-tools/OS2-049-drawer-after-status-change.png
Where: Manager tools · employee-hub
What: Use the available page width for the training list so it does not sit in a narrow column beside a large empty area.
Fix: On a laptop screen the training list spans the content area with no large empty column beside it.
Note: VERIFIED on DEV (Sep 10): 1280x800: <main> x=288 w=992 (p-10 padding gives 912px of content); the training list wrapper (section.min-w-0 > div.divide-y) and every training-row measure x=328 w=912, i.e. the full content width; due dates sit right-aligned at x~1148-1240 with no empty column beside the list (parent chain: div.min-w-0.space-y-6 w=912 > div.mx-auto.max-w-[1800px] w=912 > main w=992).
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/manager-tools/OS2-050-1280-viewport.png, C:/Users/ravik/local-ai/ritual-life/verify-sep9/manager-tools/OS2-050-390-viewport.png, C:/Users/ravik/local-ai/ritual-life/verify-sep9/manager-tools/OS2-050-390-full.png
Where: Manager tools · employee-hub
What: Keep outstanding training and approvals above that section (Login & access) so they are easier to find during routine staff management. Can ship before OS2-051 by placing training and approvals above the existing account controls as they are today.
Fix: On the employee-details page, outstanding training and approvals render above the login/account controls.
Note: VERIFIED on DEV (Sep 10): Employee details = ?view=employee-hub-team with an employee selected in "Roster oversight" (Alex Rivera - Attendant). Measured page y-order at 1280: "PTO APPROVALS" y=383 (first APPROVE/DECLINE at y=443) -> "MANAGER ONBOARDING WORKFLOW" y=2139 with "APPROVE INDEPENDENT WORK" y=2139 and first training row y=2268 -> "ACCESS & PERMISSIONS" y=3838 ("ACCOUNT STATUS" y=3946, "SAVE ACCESS" y=4266) -> "SECURE ACCOUNT ACTIONS" y=4475 ("SEND/RESEND INVITE" y=4590).
verify-sep9 screenshot: C:/Users/ravik/local-ai/ritual-life/verify-sep9/manager-tools/OS2-052-1280-full.png, C:/Users/ravik/local-ai/ritual-life/verify-sep9/manager-tools/OS2-052-1280-account-controls.png, C:/Users/ravik/local-ai/ritual-life/verify-sep9/manager-tools/OS2-052-390-full.png, C:/Users/ravik/local-ai/ritual-life/verify-sep9/manager-tools/OS2-052-390-account-controls.png