| topic | governance |
|---|---|
| type | guide |
| status | research-complete |
| last-validated | 2026-05-21 |
| superseded-by | |
| related-docs | 56, 58, 102, 103, 104, 109, 114, 285, 444, 450, 702, 703 |
| original-query | Document the actual ZAO fractal process, the Discord bot that runs it, and integration opportunities with ZAO OS (reconstructed) |
| tier | STANDARD |
Goal: Map the ZAO Fractal process from gathering to on-chain submission, describe the
fractalbotmarch2026Discord bot architecture, and document all 52 slash commands.
| Decision | Status | Details |
|---|---|---|
| Process is live + tested | ACTIVE | 100+ weeks running (since Aug 2024), Mondays 6pm EST + anytime with 4+ unplayed members |
| Bot platform: Discord | LIVE | Not Telegram or web; Python 3.10+, discord.py 2.0+, hosted on bot-hosting.net |
| Bot repo: fractalbotmarch2026 | v2.1 CURRENT | GitHub: bettercallzaal/fractalbotmarch2026; v2.1 (2026-03-28) - onchain auto-submit, Farcaster linking, Snapshot cog. Storage on Supabase since v2.0. |
| Fibonacci scoring (2x era) | DEPLOYED | Ranks 1-6 award 110/68/42/26/16/10 Respect (Fibonacci double from year 1) |
| Two Respect types | DEPLOYED | OG (ERC-20, one-time) vs ZOR (ERC-1155, weekly consensus only) |
| Hats Protocol integration | BUILT NOT USED | Tree treeId 226 on Optimism; bot has /hats command but Discord role sync not live |
| Proposal + Curation voting | BUILT | Bot has /propose and /curate commands; threaded discussion, 7-day expiry |
| Wallet registration | REQUIRED | Members must /register before playing + post introduction in #intros |
Preconditions:
- Member has posted in #introductions channel (one-time requirement)
- Member has run
/registerto add their Optimism wallet - Members waiting in "Fractal Waiting Room" Discord voice channel
No fixed time: Members can gather anytime. Official session: Mondays 6pm EST.
Eligibility: Members who haven't played in the past 7 days can participate.
Command: Admin runs /randomize in #fractals Discord channel
Bot action:
- Fetches all members in Fractal Waiting Room voice channel
- Splits into groups (max 6 per group, min 2)
- Auto-moves members into voice channels (e.g., "Fractal Group 1", "Fractal Group 2")
- Posts confirmation embed with group assignments
Command: Facilitator runs /timer in group voice channel thread
Bot action:
- Detects all members currently in voice channel
- Posts "Meet Your Group" embed with speaker queue
- Starts 4-minute countdown timer
- Displays interactive buttons: Done, Skip, Come Back Later, +1 Min, Raise Hand
- Pause/Resume controls
- Reactions trigger handler actions (speaker advances queue)
Audio: Supports both Stream.io (default) and 100ms (built-in transcription)
Command: Facilitator runs /zaofractal [fractal_number] [group_number] to start voting
Bot sequence (Levels 6 -> 1):
-
Voting starts at Level 6 (highest):
- Bot posts 6 colored voting buttons (one per candidate, Discord button IDs)
- Bot joins voice channel + plays ascending-pitch audio signal
- Each member clicks the button of who they think contributed most
- Votes are PUBLIC: bot announces each vote in thread
- Members can CHANGE votes at any time (button updates the vote, not additive)
-
Winner detection (Simple majority):
- Majority threshold:
ceil(group_size / 2) - When threshold met, winner is locked in
- Example: 4-person group needs 2 votes minimum
- Majority threshold:
-
Elimination loop:
- Winner receives Level 6 (110 Respect)
- Winner removed from next round
- Remaining members vote on Level 5 (68 Respect)
- Continue through Levels 5 -> 4 -> 3 -> 2 -> 1
- Last remaining person (without voting) gets Level 1 (10 Respect)
-
Final rankings posted:
- Bot posts table: Rank | Member | Respect Points
- Example:
1st | alice.eth | 110 R 2nd | bob.eth | 68 R 3rd | carol.eth | 42 R 4th | dave.eth | 26 R 5th | eve.eth | 16 R 6th | frank.eth | 10 R
Bot generates link: https://zao.frapps.xyz/submitBreakout?groupnumber=N&vote1=WALLET1&vote2=WALLET2&...&vote6=WALLET6
vote1= highest rank (Level 6, 110 R)vote2= 2nd (Level 5, 68 R)- ... down to
vote6= Level 1 (10 R) - Wallets sourced from bot's registry (via
/register)
Member clicks link -> Vite SPA at zao.frapps.xyz -> Builds transaction to OREC contract (Optimism)
OREC stores consensus -> Later, ZOR ERC-1155 tokens minted to top performers
| Rank | Level | Respect Points | Notes |
|---|---|---|---|
| 1st | 6 | 110 | Fibonacci: F(11)=89, doubled to 110 (rounded up) |
| 2nd | 5 | 68 | F(10)=55, doubled to 68 (rounded up) |
| 3rd | 4 | 42 | F(9)=34, doubled to 42 (rounded up) |
| 4th | 3 | 26 | F(8)=21, doubled to 26 (rounded up) |
| 5th | 2 | 16 | F(7)=13, doubled to 16 (rounded up) |
| 6th | 1 | 10 | F(6)=8, doubled to 10 (rounded up) |
Total per group: 110+68+42+26+16+10 = 272 Respect distributed
Displayed in fractal prompt to guide member voting:
- The ZAO Vision - Advancing music, art, and technology
- Contribution - Impactful work that pushes the collective vision forward
- Collaboration - Teamwork, uplifting others
- Innovation - Creative thinking, groundbreaking ideas
- Onboarding New Members - Helping newcomers join ZAO and Web3
Members vote based on who best embodies these across the week.
fractalbotmarch2026/
├── main.py # Entry point, Opus loading, extension loading
├── config/config.py # Constants: role IDs, channel IDs, respect points
├── cogs/
│ ├── fractal/
│ │ ├── cog.py # 52 slash commands (the router)
│ │ ├── group.py # Core voting logic, round management
│ │ └── views.py # Discord button UIs, naming modal
│ ├── timer.py # Presentation timer with speaker queue
│ ├── proposals.py # Proposal + curation voting system
│ ├── wallet.py # Wallet + ENS registration
│ ├── hats.py # Hats Protocol tree + Discord role sync
│ ├── history.py # Fractal history tracking + search
│ ├── snapshot.py # Snapshot GraphQL poll - posts new proposals (v2.1)
│ ├── guide.py # /guide + inline leaderboard
│ └── intro.py # Cached #intros lookup
├── utils/
│ └── web_integration.py # Webhook to web dashboard (ZAO OS)
└── data/ # Legacy JSON files - pre-v2.0 artifacts; live storage moved to Supabase in v2.0
├── history.json # Past session rankings (pre-migration snapshot)
├── wallets.json # Member wallet registry (pre-migration snapshot)
├── proposals.json # Proposals + curation votes (pre-migration snapshot)
├── events.json # Fractal event audit log (pre-migration snapshot)
└── intros.json # Cached #intros entries (pre-migration snapshot)
Method: Supabase. The bot migrated all data storage from JSON flat files to Supabase in v2.0 (commit "Migrate all data storage from JSON files to Supabase", 2026-03-27). v2.0.1 (2026-03-27) wired the bot into the existing ZAO OS Supabase tables rather than a separate schema, so the Discord bot and ZAO OS now read and write the same fractal_* and respect_* tables.
Legacy artifacts: The data/*.json files (history, wallets, proposals, events, intros) remain in the repo as pre-migration snapshots. They are not the live store post-v2.0.
Pre-migration era: Before v2.0 the bot used flat JSON files in data/ with utils/safe_json.py doing atomic-rename writes to prevent corruption on crash. That design is now retired.
Session record shape (stored in Supabase since v2.0; shown here in the pre-migration JSON form):
{
"fractals": [
{
"id": 1,
"group_name": "ZAO Fractal: ...",
"facilitator_id": "discord_id",
"facilitator_name": "Display Name",
"fractal_number": "session identifier",
"group_number": "group within session",
"rankings": [
{ "user_id": "id", "display_name": "name", "level": 6, "respect": 110 },
{ "user_id": "id", "display_name": "name", "level": 5, "respect": 68 }
],
"completed_at": "2026-03-22T12:00:00+00:00"
}
]
}| Command | Args | Effect |
|---|---|---|
/randomize |
none | Split Waiting Room members into groups, auto-move to voice channels |
/zaofractal |
[fractal_number] [group_number] |
Start voting session, create thread, initialize Level 6 |
/timer |
none | Start 4-min presentation timer, detect group members, post Meet Your Group |
/complete_round |
[round_num] [winner_id] |
Mark round complete, move to next level |
/finish_fractal |
none | Calculate final rankings, post scores, generate submission link |
/pause |
none | Pause voting rounds (can resume) |
/resume |
none | Resume paused voting |
/cancel |
none | Abort current session (no scores recorded) |
| Command | Args | Effect |
|---|---|---|
/register |
[eth_wallet_address] |
Store wallet in bot's registry (required before playing) |
/wallet |
[user] (optional) |
Query registered wallet for a member |
/wallet_list |
none (admin only) | Export all registered wallets (wallets.json) |
| Command | Args | Effect |
|---|---|---|
/guide |
none | Post inline leaderboard: total Respect by wallet (OG + ZOR + fractal) |
/myrespect |
none | DM user their total Respect breakdown |
/leaderboard |
[era] (optional: og/zor/all) |
Fetch from contract, post top 20 holders |
| Command | Args | Effect |
|---|---|---|
/hats |
none | Display Hats tree structure (treeId 226, Optimism) |
/myhats |
none | Show user's claimed hats (Discord role sync) |
/hat |
[hat_id] |
View details of a hat (requirements, holders) |
/claimhat |
[hat_id] |
Claim role (mints badge if eligible, syncs Discord role) |
| Command | Args | Effect |
|---|---|---|
/propose |
[title] [description] [type] |
Create proposal (text/governance/funding), auto-creates thread |
/curate |
[proposal_id] [yes/no] |
Vote on curation (e.g., Artizen nominations) |
/proposal_list |
[status] (optional: active/closed) |
List all proposals (7-day auto-expiry) |
/vote_weight |
[user] |
Show vote power = total on-chain Respect (OG + ZOR) |
/proposal_results |
[proposal_id] |
Display vote counts + weighted tallies |
| Command | Args | Effect |
|---|---|---|
/history |
[query] (optional: member name) |
Search past sessions by participant name or date |
/history_export |
none (admin) | Dump entire history.json to #admin-logs |
/my_history |
none | DM user all their past fractal rankings + scores |
/session_stats |
[fractal_num] |
Stats for a specific fractal: total Respect, participant count, etc. |
| Command | Args | Effect |
|---|---|---|
/sync_wallet_registry |
none | Re-scan #intros for new registrations, update wallets.json |
/import_airtable |
[csv_url] |
Bulk import OG-era fractal sessions (fractals 1-73) |
/post_submission_link |
[fractal_id] |
Re-generate + post zao.frapps.xyz/submitBreakout link |
/admin_award_respect |
[wallet] [amount] |
Manually grant Respect (for event contributions, etc.) |
/admin_override_ranking |
[fractal_id] [new_rankings_json] |
Correct erroneous session results |
/admin_dashboard |
none | Post live event dashboard (active sessions, proposals, leaderboard snapshot) |
| Command | Args | Effect |
|---|---|---|
/intro |
none | Prompts user to write introduction (posts in #intros) |
/intro_lookup |
[user] |
Fetch cached intro from #intros |
/welcome |
none | Post ZAO member guide + respect criteria (for new members) |
| Command | Args | Effect |
|---|---|---|
/test_webhook |
none | Fire test webhook event to ZAO OS (for integration testing) |
/test_contract_call |
none | Test OREC contract read (verify connection to Optimism) |
/ping |
none | Health check + latency (for monitoring) |
| Command | Args | Effect |
|---|---|---|
/help |
[command] (optional) |
List all commands or details for one |
/config |
none (admin) | Display bot's runtime config (role IDs, channel IDs, thresholds) |
/version |
none | Show bot version (v2.1, latest commit 2026-03-28) |
- Contract:
0x34cE89baA7E4a4B00E17F7E4C0cb97105C216957(Optimism) - Supply: 38,484 ZAO (as of March 2026)
- Holders: 122
- Purpose: ONE-TIME distributions for specific contributions (NOT weekly consensus)
- Awards:
- Introduction posted: 25 pts
- Camera on during meeting: 10 pts per meeting
- Full article: 50 pts
- Short article: 10 pts
- Editorial work: 10 pts
- Featured artist on thezao.com: 50 pts
- Community contributions: Per fractal ranking
- Contract:
0x9885CCeEf7E8371Bf8d6f2413723D25917E7445c(Optimism) - Token ID: 0
- Holders: 4 (early adoption, as of March; likely higher by May)
- Purpose: ONLY for weekly Respect Game consensus results (ORDAO/OREC-driven)
- Mint trigger: When session results submitted to OREC contract
- Key distinction: ZOR is 100% from weekly fractal voting; OG is manual curator grants
| Repo | Version | Date | Key Notes |
|---|---|---|---|
fractalbotv1old |
v1 | Early 2025 | Original, minimal voting |
ZAO-FRACTAL-BOTV2 |
v2 | ~2025 | Added proposals |
fractalbotV3June2025 |
v3 | June 2025 | Timer + presentations |
fractalbotnov2025 |
v4 | Nov 2025 | Hats Protocol added |
fractalbotdec2025 |
v5 | Dec 2025 | Curation voting |
fractalbotfeb2026 |
v5.5 | Feb 2026 | ETH Boulder hardening |
fractalbotmarch2026 |
v1.3.0 - v1.6 | March 6-12, 2026 | Rebranded, consolidated 52 commands, timer overhaul |
fractalbotmarch2026 |
v1.7 - v1.8.3 | March 24-27, 2026 | Auto-wallet pairing, code audit, health check, daily backups, event scheduling, /about |
fractalbotmarch2026 |
v2.0 / v2.0.1 | March 27, 2026 | Migrated all storage from JSON files to Supabase; wired into ZAO OS tables |
fractalbotmarch2026 |
v2.1 | March 28, 2026 | CURRENT - onchain auto-submit via hot wallet, Farcaster linking, Snapshot polling cog |
File: fractalbotmarch2026/utils/web_integration.py
Behavior: After each fractal session completes, bot POSTs to ZAO OS webhook
Endpoint: POST /api/fractals/webhook (ZAO OS, Vercel)
Events:
{
"fractalId": "discord_thread_id",
"event": "fractal_started" | "vote_cast" | "round_complete" | "fractal_complete" | "fractal_paused" | "fractal_resumed",
"data": { /* event-specific payload */ }
}Auth: Authorization: Bearer $FRACTAL_BOT_WEBHOOK_SECRET
Timeout: 10 seconds, fire-and-forget (non-blocking on bot)
-
Wallet resolution incomplete: Many members have not yet linked wallets. Bot stores Discord ID in fractal_scores, wallet address resolved later (or not at all).
- Workaround: Admin can manually
/sync_wallet_registryor use/admin_override_rankingto patch.
- Workaround: Admin can manually
-
Hats role sync not live: Bot has Hats Protocol code, but Discord role sync is disabled (feature branch).
- Workaround: Manual role assignment in Discord, or enable feature in bot config.
-
ornode down: frapps indexing endpoint unreachable. No impact for fractal submissions (direct contract calls work).
- Workaround: Read OREC contract directly via viem (done in ZAO OS leaderboard).
-
Proposal voting not weighted yet:
/curatevotes are 1-person-1-vote, not respect-weighted.- Expected: Bot will weight by total OG+ZOR holding in next version.
-
No multi-language support: All commands + prompts in English only.
What already syncs:
- Fractal session results ->
fractal_sessions+fractal_scores(webhook) - Respect balances (OG+ZOR) -> read via
/api/respect/leaderboard(contract queries)
What needs integration:
- Wallet registry sync (bot's wallets.json -> Supabase users.respect_wallet)
- Live session indicator (query
/api/discord/fractal-live, show "Fractal happening now") - Proposal voting (mirror bot proposals to ZAO OS ProposalsTab)
- Hats claims (sync Discord role claims -> ZAO OS member badges)
Discord channel references (community.config.ts):
{
id: 'fractal-call',
name: 'Fractal Call',
emoji: '📞',
description: 'Monday 6pm EST weekly fractal',
}Respect contracts (same as doc 114):
respect: {
ogContract: '0x34cE89baA7E4a4B00E17F7E4C0cb97105C216957',
zorContract: '0x9885CCeEf7E8371Bf8d6f2413723D25917E7445c',
zorTokenId: BigInt(0),
multicall3: '0xcA11bde05977b3631167028862bE2a173976CA11',
chain: 'optimism',
}-
Webhook handler is now production code (not proposed):
/api/fractals/webhook/route.tsfully validated and deployed (May 21 2026). -
Sessions page shows 200+ historical records:
SessionsTab.tsxlive with search + era filtering. March docs proposed this; now live. -
OREC confirmed still active: 242 txns, last activity May 19 2026. ZAO actively uses OREC for weekly Respect distribution via ZOR minting.
-
Leaderboard dual-mode deployed: Falls back to direct contract reads if Supabase cache empty. May 2026 implementation, March docs proposed.
-
Bot shipped v2.0 and v2.1 (March 27-28, 2026): v2.0 migrated all bot storage from JSON flat files to Supabase, and v2.0.1 wired the bot into the existing ZAO OS Supabase tables. v2.1 added optional onchain auto-submit of breakout results via a hot wallet (
BOT_PRIVATE_KEYenv var, falls back to the submitBreakout URL), Farcaster identity linking (/link_farcaster), and a Snapshot cog that polls Snapshot every 5 minutes. The pre-v2.0 March docs that described the bot as JSON-backed are now stale.
- Doc 56: ORDAO + Respect system architecture
- Doc 58: Respect deep dive (token mechanics)
- Doc 102: Fractals page design (frapps, ORDAO, ZAO OS integration)
- Doc 103: Fractal governance ecosystem
- Doc 104: Fractal communities directory
- Doc 109: ZAO fractal history (100+ weeks, Mondays 6pm EST)
- Doc 114: Fractal live infrastructure + data flows (companion to this doc)
- Doc 285: (Community governance deep dives)
- Doc 444: (Governance tools audit)
- Doc 450: (Hats Protocol integration)
- Doc 702: ZAO Fractal lineage (post-research renumber)
- Doc 703: ZAO Fractal current state (fresh audit, May 2026)
| Action | Owner | Due | Notes |
|---|---|---|---|
| Verify the v2.0 Supabase migration captured all legacy data/*.json records | Backend | 2026-06-02 | Spot-check pre-migration history.json/wallets.json against the live fractal_* and respect_* tables |
| Enable Hats Discord role sync in bot | Zaal | 2026-06-02 | Un-gate feature branch, test with treeId 226 |
| Add proposal voting weight (respect-weighted) | Bot Dev | 2026-06-09 | /curate should multiply votes by OG+ZOR balance |
| Test webhook under concurrent group sessions | Zaal | 2026-06-02 | Verify atomicity + ordering with 3+ fractals in parallel |
| Document command usage in #fractals pinned message | Zaal | 2026-06-02 | Help new members find /guide, /myrespect, etc. |
- Bot Repository: github.com/bettercallzaal/fractalbotmarch2026 (Python, discord.py) [FULL]
- Main Entry Point: fractalbotmarch2026/main.py (Opus loading, extension system) [FULL]
- Voting Logic: fractalbotmarch2026/cogs/fractal/group.py (round management, elimination) [FULL]
- Web Integration: fractalbotmarch2026/utils/web_integration.py (webhook to ZAO OS) [FULL]
- ZAO OS Webhook Handler:
src/app/api/fractals/webhook/route.ts(438 lines, validates all 6 event types) [FULL] - ZAO OS Sessions Route:
src/app/api/fractals/sessions/route.ts(62 lines) [FULL] - Community Config:
community.config.tslines 105-116 (contracts) [FULL] - Doc 109: ZAO fractal history + process (100+ weeks, Mondays 6pm EST) [FULL]
- Doc 114: Fractal live infrastructure (companion doc) [FULL]
- Doc 102: Fractals page design (frapps.xyz integration) [FULL]