A public draft · open to suggestions · not open source

Layer 1: a bet with a clock

A Smart Poll opens, takes stakes, closes, and the option holding the most credits becomes its recorded answer. There is no oracle and no way out. Two rules stand in for the oracle: a stake ceiling that falls with time, and one bet per person. This is the math of that layer as it runs today, and the three changes drafted for it — written down so that serious people can tell us where it is wrong.

Try the app on TestFlight → Read the rules iPhone · free · Credits ✦ are play money
Draft — three migrations on disk, none applied Runs on Credits ✦, which are play money Nothing here is on chain · contracts on Base Sepolia testnet only
First, what a Smart Poll is

The verdict is the bigger pot. On purpose.

A Smart Poll is not a prediction market. Nothing outside the poll decides it. That is the design, and the rest of this page hangs on that sentence.

The money is meant to buy the verdict. If 50,000 Credits ✦ sit on yes and 40,000 on no, yes is the recorded answer, and everyone who backed yes splits the pot the no side put in. That is the design, not a defect in it. There is no oracle at the end of a Smart Poll, so the pot is the only thing that can decide it.

What keeps that honest is not an outside judge. It is two rules that shape when and how much conviction can land: a stake ceiling that falls as the poll ages, so early belief counts for more than late sniping, and a limit of one bet per person, so a verdict is a crowd rather than a wallet. And nothing comes out before the clock does — there is no withdraw, no sell, no cancel.

So a Smart Poll is a conviction-weighted consensus instrument. It does not claim to find truth; it claims to find what people with skin in the game believe. The servers rule — rank the options by credits, most credits first, head count only to break an exact tie — is the intended rule, not a bug.

Some of our earlier writing says the opposite, that money “can never buy the verdict”, and the current outertalk.com copy is among it. That wording is stale, and this page is part of replacing it. What a polls answer is never allowed to do is a separate matter, spelled out under the wall (R10).

One poll · from open to settled · nothing comes out before the clock does

Opens created_at max_bet duration_minutes stake Stakes land under a ceiling that falls as f runs 0 → 1 wait Closes created_at + duration_minutes no more stakes ended Cron, job 19 every 5 minutes auto_settle_ expired_polls rank Most ✦ wins rank by credits head count only breaks a tie no way out — ever one option leads tie Distribute losing pot → winners 3% fee off the stakes Exact tie → refund all stakes back fee 0 the verdict is one row in pool_settlements, written within five minutes of the close
A clock and a pot, and nothing else. Stakes go in while the poll is open and cannot come out. When it closes, a cron job ranks the options by credits and the leader is the answer; head count is consulted only to break an exact tie in credits. Ties refund everyone with no fee. Everything else on this page is about the ceiling the stakes land under, the one-bet rule, and how the pot is split.
LAYER 1 · SMART POLLS · THIS PAGE

A bet on an opinion question

Opens, takes stakes under a ceiling that falls with time, closes, pays out to whichever side carried more. No withdrawals. It is a consensus instrument and it settles against its own pool.

LAYER 2 · THE MAP · A SEPARATE PAGE

Tokens you hold and, under the draft, can sell open

No bets, no settlement, no clock. Back a concept, hold, and — if the drafted exit is adopted — sell when you change your mind. The sell rule is drafted, not decided; the earlier rule was lock-only, no trading curve. Its rules live at the concept-token page. Money there may light a concept and nothing more.

The rules · twelve of them

What a stake may be, what the clock does to it, and what the pot pays

Each rule says whether it is decided, still open, built, or drafted and waiting. Where the code and the rule disagree today, the rule says so, with the number.

R1decided

What the poll decides decided

A Smart Poll has options, a max_bet — the most one account may ever hold in it — and a duration_minutes. Stakes go in while it is open. When it closes, the option holding the most credits is the recorded answer. Head count is used only to break an exact tie in credits. There is no oracle: nothing outside the poll is consulted, and nothing outside it can overrule the pot.

What that answer is: one row in pool_settlements, read by the payout path and shown on the category page as the settled outcome. What it is not: truth, a name on the map, a position, or brightness. See R10.

R2decided

No way out decided

Once a stake is in, it stays until the poll closes. There is no withdraw, no sell, no cancel. Someone who filled the ceiling early is never refunded and never forced out; they simply cannot add. That is the intent: early conviction counts, late sniping does not. The only paths that return a stake are the refund paths of R8 and R9, and those return everyone's, together.

R3built

The stake ceiling decided

place_bet never reads max_bet itself. It asks one function, stake_ceiling(post_id), how much one account may hold in this poll right now, and refuses the stake if the account's existing holding plus the new amount would exceed it. The holding is counted across every option of the poll, so tapping Bet ten times cannot beat the cap. The balance row is locked before the check, which closed a race where one account could pass the ceiling by staking from two sessions at once (fix 20260910000100).

stake_ceiling is least(decay, concentration): the time curve of R4 and the concentration cap of R6, whichever is smaller. A vote-only post carries max_bet = 0, and the same function returns 0 for it, so a vote-only poll accepts no stake by the same rule and not by a separate one.

Rule 3 · the chain that decides a ceiling · verified from production, 28 September 2026

place_bet(post, option, amount) locks the balance row first one call decides the ceiling asks stake_ceiling(post_id) reads the post and the pool returns one number ceiling refuse if held + amount > ceiling held = your stakes on every option the error names both numbers draft bet_ceiling_for_mode posts.decay_mode · no flag read draft 000300 · not applied replaces decay bet_ceiling the curve · reads two flags 0 when max_bet = 0 (vote-only) conc. concentration_ceiling seed_floor is NULL · 73 of 73 inert here · binds on grades decay conc. least(decay, conc) the smaller one wins no seed → decay only the number place_bet compares against since 20260910000100 the cap is on the account's whole holding in the poll, not on one bet
One function owns every input to the ceiling. place_bet locks the balance row, asks stake_ceiling, and compares. The curve is bet_ceiling, which today reads two global flags. The concentration branch exists and does nothing on polls, because the seed floor is NULL on all 73 of them. The dashed box is the draft that would make the curve a property of the poll rather than of a flag; it is on disk and not applied.
R4built

The curve decided

Let f be the fraction of the poll's life that has elapsed: 0 at open, 1 at close, clamped. The ceiling is floor(max_bet × weight(f)). Two weights exist, and they are the same parabola — what differs is when it starts. Immediate: 1 − f², full at the open and falling away faster the longer the poll runs. Delayed: 1 while f ≤ 0.25, then 1 − ((f − 0.25) / 0.75)² — that same curve, held flat for a quarter and then compressed into the three quarters that remain.

Corrected 30 September 2026 (decision 95). Until today this page and the code described the immediate curve as (1 − f)². That is a parabola too, but the opposite one: its vertex sits at the close, so it surrenders most of the ceiling in the poll's first moments and then runs nearly flat along the bottom — moving from three quarters elapsed to the close would cost an account almost nothing. A ceiling exists to make waiting expensive, so the penalty has to grow as the close approaches, and that curve is 1 − f². The delayed curve always had the right shape, as does the quarterly grade allowance (grade_ceiling_weight), which is flat for half a quarter and then falls on the same parabola; the immediate curve was the only one in the codebase shaped the other way. The flag-driven quadratic branch still computes the old shape in live code — it is switched off in production and has never run a poll — and the drafted per-poll migration now carries the corrected one.

Today the curve is picked by two global flags. In production quadraticDecay = false and quadraticDecayDelayed = true, so every poll runs the delayed curve. The code's own defaults are the opposite (quadratic: true), which is one reason R5 exists — and why the superseded shape still matters even though it is off: if the app_settings row went missing, both server and client would fall back to it. quadraticDecay is tested first, so if both were on the immediate curve would win; the SQL twin repeats that order on purpose, because if the two disagreed the screen would show one number and the server would enforce another.

Pinned values at max_bet 10,000, halfway through: immediate 7,500, delayed 8,888, none 10,000. One fifth of the way through: delayed 10,000 (still flat), immediate 9,600. Three quarters through, where the two sit furthest apart in credits: delayed 5,555, immediate 4,375.

The superseded curve carried a load-bearing quirk, and the correction retires it. The server wrote floor(max_bet * (1 − f) * (1 − f)) left to right and the client wrote the same, because folding it to max_bet * weight changed the last bit of a double on some fractions and floor() turned that into a whole credit — the screen offered 8,649 and the server refused it. Three comments say that happens on “42 of 101” sampled fractions; a re-run measured 9 of 101, and the test pins three (0.07, 0.14, 0.27). 1 − f² builds a weight and multiplies once, exactly like the delayed branch, so there is a single multiplication and no order to get wrong. The warning stays true of the live flag-driven function, which still holds the old form; the count in its comments is overstated (decision 63).

Rule 4 · one parabola, two starting points · computed from the formulas at max_bet 10,000

immediate · 1 − f² · not the one running delayed · flat to ¼ · live in prod none decay begins 10,000 at f = 0.2 · still flat 8,888 7,500 5,555 4,375 delayed · live immediate 10,000 7,500 5,000 2,500 0 open ¼ ½ ¾ close f · fraction of the poll elapsed ceiling at max_bet 10,000
One parabola, two starting points. Both curves hold the full ceiling at the open, fall away faster the longer the poll runs, and reach zero exactly at the close — so the cost of waiting is smallest at the start and largest right where sniping would pay. The delayed curve, the one production runs, is the immediate curve held flat for the first quarter and then compressed into the three that remain: substitute (f − ¼) / ¾ for f and the two are the same function. That is what makes the mode a choice about when decay begins rather than about what shape it has. Every point is floor(max_bet × weight), pinned by the draft migration's self-test at a fifth, a half and three quarters.
R5drafted

The curve becomes a per-poll choice decided the plan

Decided 28 September 2026: “i can see the immediate quadratic curve be useful as well as the delayed one, that needs to be an option in smart poll creation, but the default should be delayed.”

The draft (DRAFT_20260929000300, on disk, not applied) adds posts.decay_mode — immediate, delayed or none, default delayed — chosen when the poll is created and immutable once the first stake lands (a trigger refuses the change), so the rule cannot move under people who already staked. The 73 existing smart polls take the default, which is the curve they have run under since 10 September 2026, so nothing they do changes. A new pure function, bet_ceiling_for_mode(created_at, duration, max_bet, mode), computes the curve with no flag read; stake_ceiling keeps its identity and calls it, falling back to the flag-driven bet_ceiling only if the mode is somehow NULL, so the global flags become a fallback and stop being the rule. The migration's self-test pins 7,500 / 8,888 / 10,000 at f = 0.5, 9,600 / 10,000 at f = 0.2, 4,375 / 5,555 at f = 0.75, and that vote-only and closed polls still return 0. It also carries the corrected immediate curve and the renamed mode value, so applying it is what makes 1 − f² real; the client half — every screen that reads the flags, plus the two client copies of the superseded shape — is unbuilt (Q2).

R6built

The concentration cap decided

Decay is about time (late sniping). Concentration is about distribution (one account owning a pool). concentration_ceiling(seed_floor, pool, share_cap) = max(seed_floor, floor(share_cap × pool)), where the pool is counted before the new stake — deliberately conservative, since a holder's true share afterwards is strictly smaller. stake_ceiling takes the smaller of this and the decay ceiling; a NULL seed floor means no cap at all.

On Smart Polls it does nothing today: stake_seed_floor is NULL on all 73. That was chosen on purpose when it shipped, because 14 of the 15 positions open on 10 September 2026 would have been locked out of their own polls by a retroactive cap. Why it exists at all, measured that day: the average pool was 215 credits against a ceiling of 10,000, the largest account held 64% of its own pool, and polls averaged 1.6 stakers — a flat ceiling had never bound anything, and lowering it would not have either. The cap binds today only on governance grades (share cap 0.10; seed floors 100 federal, 50 state, 25 local), which are a different instrument with their own page.

R7drafted

One bet per person decided not enforced the plan

The rule, in his words: “we need to fix the 1 bet per user to enforce it, but there needs to be variable honestly, so users can maybe bet twice, once in the first half of the poll and once in the second half of the poll, but that needs to be able to change on a per poll basis.”

Today it is not enforced. The unique index on pool_bets is (post_id, user_id, option_idx) — one row per option — and place_bet tops a row up without limit (ON CONFLICT … amount + excluded.amount). So an account may sit on every option of one poll. Measured 28 September 2026: 21 user-poll pairs hold more than one bet, and all 21 are on both sides of the same poll. Under the payout rule of R1 a hedged account is in the winning and the losing pot at once.

The draft (DRAFT_20260929000200, on disk, not applied): posts.bet_windows, 1 to 4, default 1, set at publish and immutable once the first bet lands. 1 means one bet for the life of the poll; 2 means one per half. place_bet computes window_no = least(bet_windows, floor(f × bet_windows) + 1) and refuses a second bet in the same window with a message naming when the next window opens. A bet in a later window may be on a different option — that is the point: the second bet is how you change your mind, and the curve of R4 has already made it worth less. The unique key becomes (post_id, user_id, window_no), partial on rows dated after the migration, so the 21 historical hedges stay exactly as they are. Both sides in one window becomes impossible by construction. A poll with no duration has one window whatever bet_windows says. At 14 users this changes nothing visible except that hedging stops.

Rule 7 · bet_windows · one bet per person per window · draft 000200, not applied

today: unique per (post, user, option) · 21 accounts sit on both sides of one poll bet_windows = 1 the default one bet · for the life of the poll open close bet_windows = 2 his example bet 1 · window 1 bet 2 · may switch option open ½ close delayed ceiling when window 2 opens: 8,888 of 10,000 bet_windows = 4 the maximum 1 2 3 4 open ¼ ½ ¾ close ceilings when each opens (delayed): 10,000 · 10,000 · 8,888 · 5,555 window_no = least(bet_windows, floor(f × bet_windows) + 1) · a second bet in the same window is refused
A window is a slot for one bet; the curve is what makes the later slot cost something. Under the draft a poll is cut into one to four windows and an account may stake once in each, on any option. Changing your mind is allowed only in a later window, and by then the ceiling of R4 has fallen — 8,888 at the half, 5,555 at three quarters on the delayed curve — so waiting to see where the money went makes the revision worth less. The red line is today: no windows, one row per option, and both sides at once.
R8built

Settlement decided

A cron job (job 19, every five minutes, active) runs auto_settle_expired_polls: every smart poll past created_at + duration_minutes with no settlement row and no freeze, oldest first, 200 per run. It ranks the options by credits, then by bettors, and takes rank 1. An exact tie refunds everyone; otherwise it distributes. A frozen poll (under review for suspected cheating or system error) is never settled automatically — the whole point of freezing is that the money stops moving until a human decides. The kill switch is the flag autoSettleSmartPolls, which defaults to true when the key is missing. The manual path, settle_poll, has been used 0 times in 34 settlements; the fallback became the whole mechanism.

The fee. 3% of the stakes, in four parts (migration 20260605000000): 1.0% treasury, 1.0% notes, 0.5% locked, and 0.5% to the Investigator who authored the poll. When the author is Yon, revoked, or not an Investigator, that slice folds back into treasury, which then takes 1.5%. The total on bettors stays 3% in every case. On the refund path the fee is 0 and every bettor is credited the full stake.

Rule 8 · what the pot pays · fee split from migration 20260605000000

The pot every stake on every option no fee taken yet close Rank the options credits, then bettors rank 1 is the verdict frozen → never one leads tie / unanimous Distribute one option leads 3% fee, then winners 97% Winning side pro rata to stake shares the losing pot 3% treasury 1.0% (1.5% *) notes 1.0% locked 0.5% Investigator 0.5% (0 *) * no active Investigator author Refund everyone exact tie · live uncontested · draft 100% Every bettor full stake back fee_amount = 0 rank by credits · head count only breaks a tie
Two exits from the pot, and only one of them takes a fee. When one option leads, 3% of the stakes comes off the top in four fixed slices and the rest goes to the winning side in proportion to what each staked. When the credits tie exactly — and, under the draft of R9, when every stake sat on one option — every bettor is credited the full stake and the fee is zero. The Investigator slice is the only one that ever goes to a person, and only to the poll's author.
R9drafted

Uncontested pools refund decided the plan

11 of the 19 distributions to date had every stake on one option. Nothing was decided, there was no losing pot to split, and a ~3% fee was booked against unanimity. The draft (DRAFT_20260929000100, on disk, not applied) adds one guard to auto_settle_expired_polls: if fewer than two options carry stake, refund instead of distribute. The refund path already credits each bettor the full stake and writes fee_amount = 0, so no new money code is needed. Applied to history it would have returned the fee on 11 of 19. The function's signature stays byte-identical, because the cron resolves it by name at first execution and an arity change would apply green and then throw where nobody is told.

The first version of this draft also added a three-bettor quorum. It was removed. By its own arithmetic it would have refunded 33 of 34 historical settlements, and with 10 lifetime bettors that is an off switch with a comment on it, not a floor. Neither comparable uses one: a market with one trade still resolves when the answer comes from outside, and tote pools subsidise thin markets rather than void them. The draft's own header says the cheaper, reversible move is the flag — autoSettleSmartPolls = false until a resolution source exists — and to reach for the migration only if auto-settle is staying on (Q5). One wart, cosmetic: the refund path marks the settlement is_tied = true with winning_option = 0, and an uncontested pool is unanimous, not tied (Q3). The money is right.

R10the wall

The wall, for this layer decided

Two things a poll's money may never touch. First, brightness on the map is never money. A settled poll counts as activity, which glows and fades over about a day; how much was staked in it moves nothing. Second, a poll's outcome is shown with the people% and the money% side by side, never collapsed — a whale can move money%, but cannot erase the people% beside it (docs/mission-roadmap-milestones.md, under “The WALL”).

The second is decided and not collected. Measured for the plan on 28 September 2026: 73 smart-market posts carry 3 free votes from 2 distinct voters; the smart-poll card (PollCard.tsx, 1,171 lines) never reads poll_votes — its option shares are pool shares. What the app calls people% on a consensus poll is a distinct-bettor count, which is money in disguise. There is no personhood-capped vote channel. Until there is, a Smart Poll card shows money, and this page says so rather than pretend otherwise.

R11honest

Sybil is unsolved open

One bet per person is one bet per account, and every account is minted with 10,000 free credits. So every limit on this page is a speed bump, not a wall, until proof of personhood exists in design. Irrelevant on play money; decisive the day money is real.

R12status

What is actually built mostly built

See the ledger below. The curve, the ceiling, the cron and the fee split are live. The three drafts — uncontested refund, bet windows, per-poll decay mode — are on disk and not applied. The client half of R5 is unbuilt. One bet per person is not enforced.

For engineers

The math, exactly

Integer credits only. Every ceiling is floored. The SQL is the authority and the client is its twin; a test pins them to each other.

// f = fraction of the poll elapsed · 0 at open, 1 at close · clamped · max_bet is the post's column
weight_immediate(f) = 1 − f² · corrected 30 Sep · decision 95 · draft 000300
weight_delayed(f) = f ≤ 0.25 ? 1 : 1 − ((f − 0.25) / 0.75)² · = weight_immediate((f − 0.25) / 0.75)
weight_none(f) = 1
bet_ceiling = floor( max_bet × weight_delayed(f) ) · delayed · the curve production runs
= floor( max_bet × (1 − f) × (1 − f) ) · LIVE quadratic branch · superseded shape · flag off
= 0 when max_bet = 0 (vote-only), created_at is NULL, or duration ≤ 0 (closed)
= max_bet when duration is NULL (unbounded · no decay)
concentration = max( seed_floor, floor(share_cap × pool_before) ) · NULL seed_floor = no cap · NULL on all 73
stake_ceiling = seed_floor IS NULL ? bet_ceiling : least( bet_ceiling, concentration )
place_bet refuses held_in_poll + amount > stake_ceiling · held is across every option · balance locked first

// windows · draft 000200 · not applied
bet_windows ∈ 1..4 · default 1 · immutable after the first stake
window_no = least( bet_windows, floor(f × bet_windows) + 1 ) · 1 when the poll has no duration
unique (post_id, user_id, window_no) · partial · rows dated after the migration · no accumulate

// decay mode · draft 000300 · not applied
decay_mode ∈ { immediate, delayed, none } · default delayed · immutable after the first stake
bet_ceiling_for_mode(created_at, duration, max_bet, mode) · pure · no flag read · same order of multiplication

// settlement · cron job 19 · every 5 minutes · 200 polls per run
verdict = the option at rank 1 over ( credits DESC, bettors DESC )
exact tie → refund all · fee 0
uncontested → options_with_stake < 2 → refund all · fee 0 · draft 000100 · not applied
fee = 3% of stakes = 1.0% treasury + 1.0% notes + 0.5% locked + 0.5% Investigator
· no active Investigator author → that 0.5% folds into treasury, which takes 1.5%

// pinned · max_bet 10,000 · draft 000300 self-test
f = 0.2 immediate 9,600 · delayed 10,000
f = 0.5 immediate 7,500 · delayed 8,888 · none 10,000
f = 0.75 immediate 4,375 · delayed 5,555
// betCeiling.test.ts still pins the superseded immediate values (6,400 and 2,500) until the client half lands

Worked example, live: “Should New York expand congestion pricing in Manhattan?” was created 9 July 2026 at 03:59 with a duration of 525,600 minutes (one year) and a max_bet of 10,000. On 28 September 2026 it was 0.2237 of the way through — inside the flat quarter — so bet_ceiling and stake_ceiling both returned 10,000, and the chart in the app drew its dashed line flat at 10,000 at “now”. Expected ticks: 7 November (33%) → 9,876; 9 March (67%) → 6,913; close → 0. Its pool: option 0 held 1,000 ✦ from 3 bettors, option 1 held 650 ✦ from 2 — the 1,650 ✦ on the card.

What exists today

The honest ledger

Measured against production on 26 and 28 September 2026, each row dated. Nothing on this page should be read as shipped unless it is in this table.

Every settlement to date · 34 of them · measured 28 September 2026

all 34 settlements · 0 decided by a human · all by the cron path 15 refunded · exact credit tie 19 distributed · a fee was booked shape 11 uncontested · no losing pot 8 contested crowd 7 with < 3 bettors 1 a crowd of three 10 of the 34 verdicts were decided by a single bettor · largest 1-vs-1: 1,000 ✦ against 5 ✦ in 5 of the 8 contested pools, money broke an exact human tie
The market has not yet had a crowd. Of 34 settlements, one contested pool ever had three people in it. Fifteen refunded on an exact credit tie; of the nineteen that paid out, eleven had every stake on one side and paid a fee against unanimity — the shape R9's draft would refund. Every rule above is written for a crowd that has not arrived, and the numbers here are why the drafts are conservative.
ThingStateDetail
Smart Polls73 · live114 posts in production, 73 of them Smart Polls (counted 26 September 2026). 3 of the 73 carry any resolution_criteria text.
Stakes ever placed81 · 10 bettors81 rows in pool_bets from 10 distinct bettors (26 September 2026).
Settlements34 · 0 by a human15 refunded on an exact credit tie; 19 distributed; 11 of the 19 uncontested; 8 contested; 7 of the 8 with fewer than 3 distinct bettors; in 5 of the 8 money broke an exact human tie; 10 verdicts decided by a single bettor; largest 1-vs-1 1,000 ✦ against 5 ✦; 1 contested pool ever had a crowd of three (28 September 2026).
Settle pathcron · liveJob 19, every five minutes, active. Flag autoSettleSmartPolls true, and true when the key is missing. The manual settle_poll has been used 0 times.
Decay curvebuilt · delayedProduction is unaffected by decision 95: it runs the delayed curve, whose shape did not change. quadraticDecay = false, quadraticDecayDelayed = true in production. Cumulative across options since 20260910000100. Client twin src/utils/betCeiling.ts; the in-app chart (DecayChartModal.tsx) verified identical to the server on shape, flag order, max_bet source, time bounds and copy — rounding aside, the dashed line is continuous where the server floors (28 September 2026).
A live pollceiling 10,000“Should New York expand congestion pricing in Manhattan?” — created 9 July 2026 03:59, 525,600 minutes, max_bet 10,000, elapsed 0.2237 → bet_ceiling 10,000, stake_ceiling 10,000. Pool 1,000 ✦ / 3 bettors against 650 ✦ / 2 = 1,650 ✦. Expected: 7 Nov (33%) → 9,876; 9 Mar (67%) → 6,913; close → 0.
Concentration capbuilt · inertstake_seed_floor NULL on 73 of 73 polls. Binds only on governance grades (share cap 0.10; seed floors 100 / 50 / 25).
One bet per personnot enforcedUnique per (post, user, option). 21 user-poll pairs hold more than one bet, all 21 on both sides of one poll (28 September 2026).
people%never collected3 free votes from 2 voters across 73 smart-market posts. PollCard.tsx (1,171 lines) never reads poll_votes; its shares are pool shares.
Fees booked22 ✦ · 0 paidThe notes fund accrued 22 credits over 34 settlements and paid out 0. The Investigator fund paid out 0. Credits ever transferred to anyone for producing information: 0. No function credits a note author.
Draft 000100on disk · not appliedUncontested → refund. Quorum dropped. Would have returned the fee on 11 of 19. Signature unchanged.
Draft 000200on disk · not appliedposts.bet_windows 1–4; pool_bets.window_no; partial unique (post_id, user_id, window_no); no accumulate; old per-option index kept as a plain lookup.
Draft 000300on disk · not appliedposts.decay_mode; bet_ceiling_for_mode; the corrected 1 − f² immediate curve and the renamed mode value; self-test pins 7,500 / 8,888 / 10,000, 9,600 / 10,000 and 4,375 / 5,555. Client half unbuilt (Q2).
On chainnothingSmart Polls run in Postgres. The 7 contracts on the Base Sepolia testnet include a poll factory and a poll pool; no mainnet deploy exists, and the wallet path is switched off in the app (0 of 36 users).
Still open

Where we have not decided

Numbered so you can refer to one. Tell us which way, and why.

Q1
The default for bet_windows. The draft defaults every poll to 1 — one bet for its whole life. His own example was 2, one per half. Which default for new polls, and does the picker live where max_bet is set today?
Q2
The client half of the decay mode. Six files read the two global flags and must read post.decay_mode instead (swept 28 September 2026): usePool.ts 122–123, the number the Bet sheet offers; DecayChartModal.tsx 267–269, the curve the chart draws; BetModal.tsx 284, the “(decay)” label; bubbles.ts 93, the explainer; AdminFeatureFlags.tsx 112–113 and 231–232, where the two toggles become the default for new polls rather than the rule for open ones; featureFlags.ts 62–63 and 194–195, the type and the code defaults. Plus a selector at creation in the same places that set max_bet (the admin draft queue, the draft, Investigator and local-issue composers, and the two service-role publishers), a decay_mode column on poll_drafts, and the three SQL publish paths. The arithmetic already takes a mode, so mostly only its source moves — with one exception since decision 95: betCeiling.ts's quadratic branch and DecayChartModal.tsx's third copy (calcDecayWeight, mode standard) still compute the superseded (1 − f)² and must become 1 − f² in the same commit. betCeiling.test.ts pins the old numbers and will fail until it is updated; that failure is the reminder. Unbuilt.
Q3
Say what happened. The refund path records an uncontested pool as is_tied = true, winning_option = 0. A settlement_reason column — tied, uncontested, frozen — would make the ledger say which (decision 62). Low priority; the money is right.
Q4
“42 of 101”. Three comments say the two multiplication orders diverge on 42 of 101 sampled fractions; a re-run measured 9. Drop the number and keep the rule, or correct it (decision 63)?
Q5
Flag or migration. Draft 000100's own header says the cheaper, reversible move is autoSettleSmartPolls = false until a resolution source exists, and to apply the migration only if auto-settle stays on. Which?
Q6
The three documents. north-star.md, mission-roadmap-milestones.md lines 63–72, and the live outertalk.com copy all say money can never buy the verdict. The design says it does. Decide before the site gets traffic (decision 55); this page is the first replacement, and the other two still need to change.
Q7
Sybil. See R11. Every rule here counts accounts, and accounts are free.

Tell us where this is wrong

This is not open source. It is open to suggestions, from people who take it seriously. If a rule is gameable, contradictory, or illegal, we would rather hear it now than after it is built.