Commit Graph

286 Commits

Author SHA1 Message Date
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 2872a30b96 Coaching scan: expose earnedPol + next upgradeCost on at-risk entries for funded-vs-timing nudge framing
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-19 06:13:41 -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 99378daf01 Owner upgrade alerts go to email only, not Telegram
The private 'upgrade #N soon' owner alert was firing to both email and the
Telegram feed; Marty wants it in his inbox only. Drop the sendTelegram call
(the email on the line above already covers every owner watcher). Payout and
recruiting Telegram feeds are unaffected.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 15:19:29 -05:00
martbost 1695f712c6 Wire new matrix placements in ~60s, not once a day
The live tail wired a new member into its parent's matrix slots with a
guess-based fill and silently gave up on any fetchMember hiccup, deferring
to the once-daily full snapshot — so a placement could take up to 24h to
appear in the tree (observed: #119 qualified #38 on-chain but the dashboard
card still showed 1/2 with an open slot).

Now placement reads the parent's two slots straight from the contract
(getMatrixChildren) — authoritative and order-independent — and any member
that can't wire on its first pass is queued and retried every tick via
drainPendingWire(). Trees reflect real placements within one ~60s poll.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 15:17:39 -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 c91a530b7e Recruiting Telegram feed: add inline "Get Started" button to rmcircle.team
sendTelegram() takes an optional reply_markup; the recruiting posts carry an
inline URL button (🚀 Get Started — rmcircle.team) under every event, so the
busy new-members feed converts attention into clicks to the home page.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 07:40:02 -05:00
martbost 0fff3c92e0 Add recruiting-framed payout feed to a second Telegram topic
sendTelegram() now takes an optional topicId; the same team events that post to
the internal team-build topic also fan out a recruiting-framed version (social
proof + CTA to rmcircle.team, no internal/contact detail) to the new-members
topic. Gated on config.telegramRecruitTopicId — dormant until set.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-17 07:34:45 -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 f4481a390b Fix off-by-one level name on upgrade payouts (feed + tweets)
The contract books income atLevel = the level the payer upgraded OUT OF, so
levelName(p.level) showed the FROM level ("upgraded to Scintilla" when the member
actually went to Ascensus). For upline (upgrade) payouts, show the destination
level (p.level+1) — consistent with describeIncome and upgrade.newLevel.
Amounts/generations/recipients were always correct; this is the label only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-16 18:51:04 -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 6a977eebd0 Neutralize payout-tweet CTA (drop CTBN wording post-rebrand)
"Join the Crypto Team Build Network 👉" -> "See how it works 👉" — the tweets
are public/prospect-facing and link to rmcircle.team, so they stay RM-Circle-only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-16 07:29:42 -05:00
martbost 95a00e3ac1 Update payout-tweet hashtags to #RMCircle #Polygon #SmartContract #Crypto #Community
Matches the hashtags announced to the team (Zoom huddle). Also set live via
admin config (tweetHashtags), effective immediately for the next payout tweet.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-16 07:27:46 -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