- 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>
- 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>
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>
- 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>
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>
- 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>
- 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>
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>
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>
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>
/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>
/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>
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>
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>
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>
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>
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>
- 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>
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>
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>
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>
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>
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>
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>
- 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>
- 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>
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>
- 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>
- 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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>