Commit Graph

317 Commits

Author SHA1 Message Date
martbost 4014d12208 Make Promo Tools prominent on the member dashboard: gold nav button + full-width high-contrast CTA on the share card
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 06:26:55 -05:00
martbost 0754a858c3 Fix stale dashboard right after own tx: fresh=1 cache bypass (one-shot via sessionStorage flag) set on upgrade success and post-join redirect
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 15:36:08 -05:00
martbost 70fc321c3e On-dashboard upgrades: qualified members upgrade their level right from /my/<id> - ownership enforced by matching the connected wallet to the position's account, exact BigInt cost read live via getAllCosts, MoonPay assist when underfunded, wallet-app deep links on mobile
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 15:30:50 -05:00
martbost dd6644bc3b MoonPay links: /buy/pol is a soft-404 - switch to the live /buy/matic page (POL's old-name slug) + copy note that MATIC is POL's former name
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 14:11:07 -05:00
martbost 9a1833f2b0 Wallet-verified member messaging (matrix-lines permissions, admin visibility)
- messages.js: challenge/personal_sign/recover auth (vendored pinned
  js-sha3 0.9.3 + noble-secp256k1 1.7.1, server-side only; self-tested
  positive + tamper cases), 30d HttpOnly sessions, message store on the
  volume, matrix-line permissions (your downline direct or broadcast, your
  upline chain - nothing else, so spam is impossible by construction),
  daily rate limits (30 direct / 3 broadcasts), 1500-char plain text
- chain.js: memberIdByAccount (wallet -> position for sign-in)
- API: msg-challenge/-verify/-me/-inbox/-send/-read public + msg-unread
  (count only, no auth) + admin/messages (full visibility, disclosed to
  members in the UI)
- Dashboard: Messages card with unread bell, one-tap wallet sign-in,
  inbox with auto-read, compose with to-ID or whole-team broadcast
- Admin: Member Messages review table
- Chatbot canned answer + AI system prompt updated

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 13:31:31 -05:00
martbost ffd6fb9785 Join page: silent wallet auto-detect on load (eth_accounts, no prompts) + Trust deep link coin_id=966 so it opens the join page, not the site root
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 10:26:20 -05:00
martbost 506db9de81 Mobile wallet deep links on the join page: no injected wallet -> offer Open-in-MetaMask/Trust buttons that reopen this URL (ref included) inside the wallet's dApp browser
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 10:12:55 -05:00
martbost d620555209 MoonPay card on-ramp for crypto-new members (zero custody)
- GET /api/public/moonpay-url: returns a MoonPay checkout link for POL on
  Polygon (pol_polygon). With partner keys in config (moonpayPublicKey/
  moonpaySecretKey, now PATCHable), the URL is HMAC-signed and prefilled
  with the member's own wallet address + shortfall amount; without keys it
  falls back to MoonPay's generic buy page. MoonPay is merchant of record -
  the site never touches funds.
- Join page: when the connected wallet can't cover the Premium entry, a
  funding box appears with the exact shortfall, a buy button (new tab), and
  a refresh-balance button.
- Training page: "buy POL with a card" callout after the funding video with
  the three things to get right (POL, Polygon network, own address).
- Start page: one-line card-buy pointer under the sponsor card.
- Chatbot canned answer + AI system prompt updated (funding guidance).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 09:44:01 -05:00
martbost f0a35a0127 Coach card: raise row cap 8 -> 10 so high-value entries like a funded at-risk member aren't trimmed
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 07:07:13 -05:00
martbost 43753dda4e Coaching Radar: separate Marty-owned positions (config.ownerIds) into their own action-item block, exclude from member-nudge tiers
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 06:24:22 -05:00
martbost dae2de4248 Fix 'fmt is not defined' in the admin Coaching Radar (helper was function-local elsewhere)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 06:10:22 -05:00
martbost a3fbd1b2a9 Teach-forward framing across all coaching surfaces (founders' doctrine)
Every coaching output now ends by teaching the recipient how to teach:
point them at the Coach Your Team panel on THEIR own dashboard and tell
them to run the same play for their two.

- Member dashboard dCoach footer: "you're not coaching two people - you're
  teaching two coaches"; easy-win rows add "show them how you spotted it"
- Admin Coaching Radar: teach-forward rule footer
- AI chat system prompt: COACHING DOCTRINE section so chat answers frame
  guidance teach-forward

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 05:35:43 -05:00
martbost a835291eab Coaching Radar: live downline triage in admin + member dashboards
- chain.js getCoachingScan(rootId): classifies everyone below a root into
  atRisk (POL forming they can't catch - corrected bought-level rule),
  rollForward (qualified-at-Scintilla with entry rewards covering Ascensus),
  and oneAway (1/2 directs)
- Admin: GET /api/admin/coaching?root= (name-decorated) + "Coaching Radar"
  panel with tiered who/what-to-say/POL-at-stake rows, auto-loaded
- Member dashboards: memberPublic now returns .coach scoped to the member's
  own leg; new "Coach your team" card shows the same triage so every member
  coaches their own team - computed live, no snapshots or cron needed
- Chatbot canned answer + AI system prompt updated to describe the panel

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 05:15:45 -05:00
martbost 9966dc1728 Fix off-by-one in catch-eligibility: catcher must be AT the bought level
The pipeline widget, owner upgrade alerts, and the org routing/leak map all
treated a position as eligible to catch a payment at the buyer's PRE-upgrade
level (level >= depth). Verified against on-chain history: position 6, at
exactly the pre-upgrade level (Ascensus) and qualified, was passed over on
position 8's Fabrica buy - so the contract requires the catcher to be at the
level being BOUGHT (depth+1), matching the "stay one level ahead" doctrine.

- chain.js getOwnerUpgradeNeeds: eligible now pLevel >= depth+1; neededLevel
  reported as the bought level (was one low, so alerts would have stayed
  silent in exactly the situation they exist for)
- chain.js getOrgRouting catcher(): same correction in the routing simulation
- my.js pipeline: needLevel/eligible/summary-text ladder corrected; warnings
  now name the right level

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-18 16:54:07 -05:00
martbost b66d3a50e8 Team-depth breakdown: members per generation on admin org panel + member dashboard
- chain.js getOrgShare now returns genCounts (breadth-first members per
  generation below the root)
- Admin "Your Organization vs. the Network" panel renders a Gen 1..N bar list
  with fill-vs-capacity (2^n slots)
- Member dashboard "Your team" card gains a Team Depth section computed from
  the subtree client-side, labeling each generation with the level whose
  upgrade pays that position (gen D pays at the level D+1 buy)
- AI chat system prompt updated to describe the new dashboard section

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-18 16:40:22 -05:00
martbost 9dbe7eddcb Track the join funnel end-to-end through the self-enroll page
- Self-enroll pageviews now tracked as the "joinnow" event (track.js loaded
  on the page; server whitelist + admin tiles/columns extended)
- A confirmed on-chain registration in the wallet-connect flow now auto-posts
  to the submit-id API, so every self-enroll join records a submission with
  source + clickid attribution and fires the purchase event and BeMob postback
  with no manual ID entry
- Optional name/handle field on the join page feeds the submission and the
  team Telegram alert
- Admin Traffic panel: Join-now views tile, Join-now -> Confirmed conversion,
  and a per-source Confirmed column for campaign-level ROI reading

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-18 16:37:09 -05:00
martbost f0e938f065 Add the new integrated-join-process training video (Video 4)
New 4-min screen recording of the on-site wallet-connect join flow becomes
Video 4; the old dApp walkthrough is relabeled as the Video 5 backup method
and the payments explainer moves to Video 6. Chatbot canned answers and the
AI system prompt now describe the updated video lineup.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-18 08:19:12 -05:00
martbost 5aceb84863 Add EIP-6963 multi-wallet picker to the join tools
Both /join-now and /direct-join now discover every injected wallet (Brave,
MetaMask, SafePal, Trust, Coinbase…) via EIP-6963 and, when more than one is
present, show a 'Choose your wallet' picker on connect — instead of blindly
grabbing window.ethereum (which silently hangs when e.g. Brave's built-in wallet
wins the slot). Shared public/rmc-wallet.js; provider resolved on connect and
wallet events bound once after. Falls back to window.ethereum for legacy
single-provider wallets. CSP-safe (6963 icons are data URIs).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 08:01:07 -05:00
martbost 853e4736c9 Reword /start steps for the wallet-connect join flow + dApp fallback link
Steps 4-6 rewritten for /join-now (connect wallet, sponsor auto-assigned,
review+sign, land on dashboard, introduce yourself) instead of the old official-
dApp instructions; step 1 now mentions Trust Wallet. Added a small secondary
'official RM Circle dApp' fallback link under the join button (carries the
current sponsor's referral URL) for robustness — primary path stays /join-now.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 07:47:12 -05:00
martbost 629df6336c Wire the join funnel to the live /join-now self-enroll page
/join-now now honors ?ref=<id> (resolves that member's moving-link joinTarget;
falls back to the global rotation sponsor). Repointed: /start 'Join With Current
Sponsor' -> /join-now; /my pitch buttons -> /join-now?ref=<id>; invite page
/join/<id> join button -> /join-now?ref=<id>; bare /join redirect -> /join-now.
'Get Started' learn CTAs still go to /start for onboarding. When the flag is off,
/join-now gracefully redirects to /start, so the wiring is safe either way.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 07:37:19 -05:00
martbost e14c541e5e Add dormant public direct-join fallback (/join-now) + post-join redirect
/join-now: public self-enroll page gated behind config.dappFallbackPublic
(default off -> redirects to /start, invisible until needed). Auto-assigns the
current rotation sponsor via /api/public/current-sponsor, registers the user's
own wallet, then redirects to /my/<newId> so new members land on their live
position instead of guessing their ID. HTML lives in private/, served only via
the flagged route. Reuses the proven contract engine. Admin /direct-join now
also shows a 'View position ->' link to /my/<newId> after a successful join.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 07:09:57 -05:00
martbost 962eacd44c Show the new position ID (and upgrade result) in /direct-join
After submit, poll eth_getTransactionReceipt and read the member id from the
MemberRegistered event (topics[1]); surface it in a prominent success box plus
the activity log, instead of leaving the user to find it in Telegram. Same for
upgrades (shows the new level). Reverts are reported clearly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 06:22:07 -05:00
martbost c5b5ef7f86 Fix infinite refresh loop on /direct-join with Trust Wallet/Brave
chainChanged handler called location.reload(); wallets that fire chainChanged
on page load turned that into an endless refresh that blocked Connect. Handle
accountsChanged/chainChanged in place instead of reloading.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 06:12:32 -05:00
martbost 438b27ea3b Add admin-gated direct on-chain enrollment fallback (/direct-join)
Contingency tool: if the official RM Circle dApp ever goes down, positions can
still be created/upgraded straight from the member's own wallet. Vanilla JS
talks only to window.ethereum (CSP-safe, no external libs), builds register()
[0x30de37e4, sponsorId+tier, value=base*1.05] and upgrade() [0xd55ec697,
value=next-level cost] calls decoded from live txs, reads prices via
getAllCosts() and position via getMember(address). Page lives outside public/
and is served only through a getSession-gated route, so it's admin-only. The
contract is public and immutable, so this cements a company-domain-independent
path to enroll.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 05:38:26 -05:00
martbost c165226779 Teach the chatbot to handle recruiting objections honestly
Adds pyramid/Ponzi, 'if my 2 can't get their 2', affordability, 'not a
salesperson', and 'people quit' to both the chat.js canned KB and the
server.js AI system prompt (kept in sync). Answers distinguish this from a
pyramid (no pooled funds, same-tx peer-to-peer, verifiable on-chain), stay
honest (spillover fills the matrix but never qualifies; upgrades optional),
and never promise income. Keywords are apostrophe-free to match the punctuation-
stripped matcher.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 04:57:00 -05:00
martbost d48ecd3f5f Add leaders' objection-handling section to /tools
Six common recruiting objections as native <details> accordions (CSP-safe,
no inline JS), each with an honest 'the truth' mechanics note plus a
copy-ready 'say this' reply. Keeps team leaders accurate (spillover fills
the matrix but never qualifies; upgrades optional; verify on-chain) and
never promises income. Standalone team-resources/objection-handling.md kept
in sync.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 04:45:03 -05:00
martbost 436306f4d0 /my: default to pitch on link visits + big Join button above the fold
- default tab now: shared /my/<id> link -> Team Build pitch; form lookup /
  returning member on bare /my / #dash link -> dashboard (replaces the flaky
  "have you seen this ID before" heuristic that dumped returning prospects
  straight into the dashboard).
- added a big gold "Join the Team" CTA in the hero (right column), above the
  fold, so a sold visitor can join without scrolling past the video.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 08:39:52 -05:00
martbost 45797bdf9a Rebuild /my as a two-purpose tabbed page
Turns the member page into a persistent, tabbed dual-purpose page:
- Persistent context strip: "Member #X's RM Circle page · Verified · Qualified"
- Tab 1 "The Team Build": pitch for promoted-link visitors — hook, embedded
  overview video, 3 steps, live proof (member's real on-chain numbers), Join
  under #X CTA. Persistent (replaces the dismissible cold-intro banner).
- Tab 2 "Position Dashboard": the full dashboard as-is (facts, plan, matrix,
  pipeline, alerts, share, payments, lineage).
- Default: cold visitor opens on the pitch, the member opens on their dashboard;
  both always one tap apart. Retired the coldIntro banner + its handler.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 08:31:07 -05:00
martbost 800397cbdb Beef up /my cold-visitor "Start here" panel for promoted-link traffic
The dashboard serves two audiences — the member and prospects who click a
promoted link. Expanded the cold-visitor intro into a proper "New here? Start
here" panel at the top: what it is + 3 get-started steps + CTAs (join under this
member / watch training / strategy), and reframes the member detail below as
live proof. Member's own view still hides it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 06:45:43 -05:00
martbost a3e9d05f5d Dashboard 'My Next Step' panel + funded badge
Adds a synthesized next-step panel to /my: the level ladder (you-are-here →
upgrade-next), the single clearest action (qualify vs upgrade), and a funded
badge that checks the member's wallet against their next upgrade cost.

Privacy: the wallet balance is checked server-side (chain.balanceOf via
eth_getBalance) and ONLY a funded true/false is returned — the raw balance is
never exposed on the ID-addressable dashboard.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 06:33:59 -05:00
martbost cce3b060b3 Fix join button label to show the resolved sponsor (was showing inviter)
The .inv-id-inline spans (join button + dApp-sponsor mention) were left on the
inviter's id; now they follow joinTarget like the header/href already did.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-16 13:05:43 -05:00
martbost f0ea4469a4 Self-rotating personal links: qualified member's join routes to next-to-qualify
Fixes the spillover leak where a qualified member promoting their own link had
joins land back on themselves (bonus reward) instead of qualifying their team.

- /api/public/member now returns joinTarget: unqualified member -> self;
  qualified -> next-to-qualify in their leg (reuses rotation-aligned nextInLine);
  whole leg qualified -> global rotation sponsor; else -> spillover (prior behavior)
- /join page: the Join button, "join under" header, sponsor-ID copy, and the
  submitted sponsorId all follow joinTarget; a note explains "invited by #X,
  joining to help #Y qualify" so the new member knows their real sponsor
- Member's SHARE link is unchanged (/join/<id>); resolution happens when a
  visitor opens it, so it self-corrects even for links already in the wild

Dry-run verified: /join/27 -> #34, /join/34 -> #34 (self), /join/21 -> #34.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-16 13:02:34 -05:00
martbost 19751a6561 Banner kit: swap subline to instant direct-to-wallet payout angle
Subline now leads with the differentiator — "Instant on-chain payouts,
straight to your wallet, no middleman" (length-appropriate per size).
Framed as the payment mechanism, not an income promise.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-16 12:15:43 -05:00
martbost 4607c639e8 Make Promo Tools discoverable: footer link (all pages) + dashboard button
- added "Promo Tools" to the footer-links on every page
- added a Promo Tools button in the /my dashboard "Share this position" card

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-16 07:11:52 -05:00
martbost 6f692133dc Rebrand promo videos to RM Circle + retire stale scroll-captions clip
- combined clip: VO scenes 2 & 6 no longer name the Crypto Team Build Network;
  re-captured the rebranded site for the scroll; watermark now "The RM Circle"
- explainer clip: on-screen eyebrow "Crypto Team Build · Polygon" -> "The RM Circle · Polygon"
- both re-rendered + web-compressed (combined 10.9MB, explainer 2.7MB)
- removed rmc-scroll-captions (superseded + carried old branding)
- repo config seed synced to live (siteName "The RM Circle", programName "Premium Team Build · Polygon")

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-16 06:57:54 -05:00
martbost 3a80a50648 Rebrand public site to RM Circle Team Build (remove Crypto Team Build Network)
Public promo is now RM-Circle-only; the Crypto Team Build Network is learned
after joining, not surfaced to prospects.
- nav brand "Crypto Team Build" -> "RM Circle" (subtitle "Premium Team Build")
- all <title>, og:site_name, twitter meta, footers, disclaimers, 404, chatbot
  system prompt + canned answers, config siteName/supportLabel swept
- removed "a project of the Crypto Team Build Network" framing from prose
- banners regenerated: eyebrow now "The RM Circle · Polygon" (was Crypto Team Build)
- og-card.jpg regenerated (was "CRYPTO TEAM BUILD NETWORK PRESENTS")
- roadmap.webp already RM-Circle branded (no change needed)
- social posts/swipes: #CryptoTeamBuild -> #RMCircle, "crypto team build" -> "RM Circle team build"

Videos still reference old branding (VO + embedded site screenshot) — rebuilt next.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-16 06:43:23 -05:00
martbost 791ef721ef Fix join card centering, add video posters, https:// in swipes
- join.html: center the sponsor "invCard" (margin 20px auto)
- tools.html: add poster to explainer clip (was black), replace combined's
  mismatched poster with its own brand frame (rmc-*-poster.jpg from the videos)
- tools.html: prefix bare rmcircle.team with https:// in social posts + swipes
  so links are clickable in email clients that don't auto-linkify

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-16 06:29:05 -05:00
martbost 21bd77c07c Add banner kit + social posts + short/long swipes + Branded Voice CTA to /tools
- 7-size banner kit (1200x630, 1080x1080, 1080x1920, 300x250, 728x90,
  468x60, 125x125) rendered on-brand, exact dimensions, served from /banners
- Promo Tools page: 5 copy-paste social posts (X/Facebook), short + standard
  + long email swipes, banner grid (download / copy-URL), invite-link builder
- Branded Voice CTA (mybrandedvoice.com) for writing promos in your own voice
- Sync chatbot: chat.js canned answer + server.js AI system prompt updated

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-16 06:08:35 -05:00
martbost 4dbbc6780c Add payments video to training + new Promo Tools page (/tools)
Training: new "Video 5 · Why you're not getting paid yet" card with the
payments teaching video (+ poster). Promo Tools page at /tools (noindex,
unlinked from public nav — a team resource): share-ready video clips
with copy-link buttons, a personal invite-link builder, and three
compliant email/message swipes; banners noted as generate-on-request.
Chatbot gains a promo-tools answer. Old scroll-only clip is superseded
by the combined cut (retire it).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-16 05:47:01 -05:00
martbost 76c55fe4c2 Sweep all self-references to rmcircle.team (SEO/OG/canonical/chatbot)
Domain migration go-forward: replaced every hardcoded rmcircle.saasy.top
across public/*.html (canonical, og:url, og:image, twitter tags),
chat.js (chatbot answer URLs + linkify self-link matcher), my.js, and
server.js (member-page OG injection, unsubUrl, chat system prompt) with
rmcircle.team. Old domain still serves everything; canonical now points
search engines + social previews at the new primary domain.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-16 05:32:13 -05:00
martbost d0b1eddda2 Show which generation caught each pass-up + finish domain go-forward
Feature (Marty): live payment proof + notifications now show the
generation for upgrade pass-ups (matrix hop distance payer→recipient),
removing the "why did they get it" question. chain.genBetween() adds a
`gen` field to payout events + /api/public/payouts; rendered as a gold
"Gen N" badge in the feed, "Gen N pass-up" in toasts, and "Gen N …" in
Telegram team alerts.

Domain: rmcircle.team is now live (added to Coolify alongside
rmcircle.saasy.top, SSL issued, both serve, no redirect). Switched the
auto-tweet CTA to https://rmcircle.team.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-16 05:22:47 -05:00
martbost 663948595c Payments video v3: real #46 worked example + org-flow capstone
Per Marty: (1) added a real, on-chain-verifiable worked example — user
#46's actual payments climbing generation by generation with exact
amounts (entry 163.12 + 1st upgrade 310.70 → Gen1 #30; 2nd 621.40 →
Gen2 #24; 3rd 1,242.80 → Gen3 #21), names omitted; (2) a "deeper =
later but bigger" principle scene; (3) an "it all flows up to you" org
pyramid capstone that works at every level. Now 10 scenes ~3.4 min.
Re-encoded over the same /v/ filename.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-16 05:06:11 -05:00
martbost 37aaccc7f9 Payments video v2: add generations + who-gets-paid-first (order)
Per Marty's field observation (Orlando #30 / Neville #46,#49 see direct
payments flowing but don't grasp the upgrade ORDER): reworked into 7
scenes adding (1) a generations ladder — each generation pays you at a
DIFFERENT upgrade (Gen1→1st→Ascensus ... Gen4→4th→Apex), and (2) a
pass-up routing chain — the payment travels UP, skips the wrong-gen /
unqualified positions, and lands on the first one that's qualified +
leveled. Re-encoded over the same /v/ filename.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-16 04:32:31 -05:00
martbost af28f2e96e Add team-education video: how payments work (direct vs pass-ups)
New ~96s teaching video in Marty's voice for confused team members who
expect rewards but aren't getting them. Clarifies the two mechanisms:
direct rewards (only from people who join on YOUR link — spillover
doesn't pay you) vs upgrade pass-ups (travel up, skip you unless you're
qualified + leveled). Includes a 3-point self-diagnosis. Hosted at an
unlisted /v/ path; CTA rmcircle.team.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-16 04:17:29 -05:00
martbost 9717ddbd85 Admin: payment-routing / leak map for the org
New chain.getOrgRouting(rootId, ownerIds) simulates the contract's
_payUpline routing for every member below the org root on their NEXT
upgrade, classifying where the POL lands: your positions, a teammate
in-org (healthy), an outsider above the org (true LEAK), or fees.
Surfaced on /api/admin/income and rendered as a panel in "My Positions
— Income": 4-stat summary + expandable list of payments escaping the
org. Distinguishes real leaks (money leaving the team) from teammates
earning — which the old upgrade-needs alert conflated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 18:35:48 -05:00
martbost 0496584fb2 v1 video: bottom-align the two pay-card buttons
The two cards had different body-text lengths, so the CTA pills sat at
different heights. Made .card a flex column and pushed .pill to the
bottom (margin-top:auto), so both buttons align. Re-encoded over the
same /v/ filename.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 18:09:03 -05:00
martbost ad61355d85 Videos: correct new domain to rmcircle.team
Marty switched the domain from rmcircleteambuild.com to rmcircle.team
(bought at NameSilo). Updated v3 (spoken URL + end caption) and v1
(on-screen URL + scene-6 voiceover). Both re-encoded over their existing
/v/ filenames so shared links stay stable. Site/tweet CTAs remain on
rmcircle.saasy.top until DNS is live tomorrow.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 17:56:33 -05:00
martbost 9c5ce8b0fd Matrix panel: show full 8-level ladder (Scintilla→Corona), tapered
Dot pyramid (4 gens) on the left; 8-level ladder on the right with real
amounts through Apex and Fastigium/Vertex/Corona ascending (↑) so it's
complete without headlining ~40K POL. Panel raised above the caption
band so all 8 rows + the "not a promise of income" note stay clear.
Combined cut re-encoded over the same /v/ filename.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 17:46:26 -05:00
martbost 95b30a1d86 Re-render videos with new domain rmcircleteambuild.com (pre-migration)
Domain lands tomorrow; both domains will serve the site (old kept live
indefinitely). v3 combined cut: spoken URL + clean end caption now read
rmcircleteambuild.com. v1 designed-scenes: on-screen URL + regenerated
scene-6 voiceover updated to the new domain (kept its original wording).
Both re-encoded over their existing /v/ filenames so shared links are
stable. Tweet CTA + site links stay on rmcircle.saasy.top until the new
domain is live tomorrow.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 17:25:41 -05:00
martbost 204d12e3cd Combined-cut video: clean single-line rmcircle.saasy.top end caption
The spoken URL is still spelled for clarity, but the caption now collapses
"r m circle dot saasy dot top" into one gold rmcircle.saasy.top line
(no fragments). Re-encoded over the same /v/ filename so the link is stable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 17:06:08 -05:00