Ledger
A public record of contributions. No token. Nothing to trade. This is a database.
This is an example chain, not the real record. The real record cannot be opened until the rule's parameter values are final, so every figure below is computed by the published rule over ledger/example/chain.jsonl — real arithmetic, example entries, and no number typed in by hand.
Who contributed what
Founder share of epoch 0, which is closed and audited: 100%. There is 1 contributor. That contributor is the founder, and this record is his own hours, itemised — 5 separate entries, never one lump.
Epoch 1 is open, so it has no final share. If epoch 1 closed on this record, the founder share would be 100% — an upper bound, and it can only fall, because the numerator is fixed at entry and the denominator only grows.
Every entry below is an individual observation with its own evidence digest, valued at the same flat rate that applies to anyone: one contributor-hour is one valuation unit, in every category, for every contributor. The rate the founder's hours are priced at is that rate, because it is the only rate the schedule has. Nothing here is a currency, a balance or a stake: an epoch share is a fraction of a closed epoch, and amounts exist only if money is ever declared against the record, which it has not been.
Is this a pre-mine?
- There is nothing to trade. No unit here is transferable, and no transfer operation exists in the rule code to be called. You cannot buy in, so there is nothing to buy in ahead of.
- Nothing was allocated. Every entry is hours worked, logged against a rate table published before the entry was recorded, with an evidence digest attached. A grant is handed out; this is a timesheet.
- The founder's entries are the easiest ones on the record to attack, not the hardest: the same challenge affordance sits on every row, the rate is attested in public before an epoch opens, and a correction to the founder's own entries has to run through the same public challenge machinery — there is no quiet amendment path, because nothing on the record is edited.
- Epochs are separate pools. Epoch 0's 100% cannot touch any epoch you contribute to: an epoch's denominator is the sum of that epoch's own entries and nothing else. Run the rule over epoch 2 and the founder share it returns is 0%.
- What this page cannot prove yet: that the mechanism works with more than one participant. That is an open problem, and it is the point of the last line on this page.
What is an example on this page, and what is real
Real: the arithmetic. Every figure is produced at build time by rule/distribute.py, rule/valuation.py and rule/params.py. Real too: the chain is replayed and every signature on it re-verified by the validator each time this page is built, and the rule version, parameter-set and attestation digests it names are the digests of the files in this repository.
Example: the entries. ledger/example/chain.jsonl holds 24 events, head a2f1681dbac2, signed by an example key whose secret is printed in ledger/example/seed.py. Its hours are example hours; its evidence digests are digests of the label strings in that script, not of merged work; its audit event is an example audit.
Why it exists: the rule refuses to open epoch 1 under a parameter set that still carries placeholders, and those values are not fixed yet. A page that hand-wrote its numbers in the meantime would be the one thing this page is for refusing. There is no external contributor on this chain because there is no external contributor. When the real chain opens, this page renders that one instead and nothing else about the page changes.
Epoch 0 — closed and audited
Denominator D0 = 50 vu, the sum of every included entry in this epoch — computed by rule/distribute.py. Epoch weight P0 = 1. Contributors: 1.
| Entry | Contributor | What | Hours × rate | vu | Share of epoch 0 |
|---|---|---|---|---|---|
24126144a8bb |
z6MkhUif…aNSL founder |
work logged · governance week 2026-W33 · mode E · evidence 636a92162ad9 |
12 h × 1 vu/h | 12 | 24% |
confirmedchallenge window closed at the epoch 0 audit · 0 challenges
Recompute this entrypython3 tools/render/generators/ledger.py entry 24126144a8bb 12 h × 1 vu per hour (from the published rate table) = 12 vu; 12 ÷ 50 vu (D0, from the rule) = 24%. Full entry id | |||||
5b7fcfed2f42 |
z6MkhUif…aNSL founder |
work logged · design week 2026-W33 · mode E · evidence 4de96ed23b82 |
8 h × 1 vu/h | 8 | 16% |
confirmedchallenge window closed at the epoch 0 audit · 0 challenges
Recompute this entrypython3 tools/render/generators/ledger.py entry 5b7fcfed2f42 8 h × 1 vu per hour (from the published rate table) = 8 vu; 8 ÷ 50 vu (D0, from the rule) = 16%. Full entry id | |||||
d9b972ece67f |
z6MkhUif…aNSL founder |
work logged · docs week 2026-W33 · mode E · evidence e58a24ed150b |
6 h × 1 vu/h | 6 | 12% |
confirmedchallenge window closed at the epoch 0 audit · 0 challenges
Recompute this entrypython3 tools/render/generators/ledger.py entry d9b972ece67f 6 h × 1 vu per hour (from the published rate table) = 6 vu; 6 ÷ 50 vu (D0, from the rule) = 12%. Full entry id | |||||
418dd007020a |
z6MkhUif…aNSL founder |
work logged · code week 2026-W33 · mode E · evidence f07b0ca94cb6 |
20 h × 1 vu/h | 20 | 40% |
confirmedchallenge window closed at the epoch 0 audit · 0 challenges
Recompute this entrypython3 tools/render/generators/ledger.py entry 418dd007020a 20 h × 1 vu per hour (from the published rate table) = 20 vu; 20 ÷ 50 vu (D0, from the rule) = 40%. Full entry id | |||||
96e7d1afb951 |
z6MkhUif…aNSL founder |
work logged · review week 2026-W33 · mode E · evidence 3541b0bf81cc |
4 h × 1 vu/h | 4 | 8% |
confirmedchallenge window closed at the epoch 0 audit · 0 challenges
Recompute this entrypython3 tools/render/generators/ledger.py entry 96e7d1afb951 4 h × 1 vu per hour (from the published rate table) = 4 vu; 4 ÷ 50 vu (D0, from the rule) = 8%. Full entry id | |||||
Epoch 1 — open
Denominator D1 = 12 vu, the sum of every included entry in this epoch — computed by rule/distribute.py. Epoch weight P1 = 1. Contributors: 1.
| Entry | Contributor | What | Hours × rate | vu | Status |
|---|---|---|---|---|---|
c976fa2da12b |
z6MkhUif…aNSL founder |
work logged · code week 2026-W33 · mode E · evidence cbe0a3d102d0 |
9 h × 1 vu/h | 9 | confirmed |
challenge window open until epoch 1 closes and its audit completes · 0 challenges
If epoch 1 closed on this record: 75% of it — an upper bound, it can only fall.Recompute this entrypython3 tools/render/generators/ledger.py entry c976fa2da12b 9 h × 1 vu per hour (from the published rate table) = 9 vu; 9 ÷ 12 vu (D1, from the rule) = 75% if the epoch closed here. Full entry id | |||||
1c788040a71e |
z6MkhUif…aNSL founder |
work logged · docs week 2026-W33 · mode E · evidence 1e2bfe46696e |
3 h × 1 vu/h | 3 | confirmed |
challenge window open until epoch 1 closes and its audit completes · 0 challenges
If epoch 1 closed on this record: 25% of it — an upper bound, it can only fall.Recompute this entrypython3 tools/render/generators/ledger.py entry 1c788040a71e 3 h × 1 vu per hour (from the published rate table) = 3 vu; 3 ÷ 12 vu (D1, from the rule) = 25% if the epoch closed here. Full entry id | |||||
This epoch is open. Its share figures are not final and are never shown beside a closed epoch's: the entries above carry their status, and the "if it closed here" figure sits on its own line under each row.
Concentration
Figures below are the published rule run over the example chain, not the real record, which has not opened.
Contributors on this record: 1.
50 of 50 vu
= 100% founder share of epoch 0
Tripwire
State: escalated. The tripwire adopted in socaity-19p escalates entries once the founder share of an epoch rises above a published threshold. No threshold value is published in the parameter set yet — and the founder share is 50 of the 50 vu in epoch 0, or 100% of it, which is above any threshold a value could be set to. So the state is escalated by construction, and it stays escalated until the number falls, which requires somebody else's entry.
Your epoch
0 of 1 vu
= 0% founder share of epoch 2
Epoch 2 has not opened. Founder hours recorded in it: 0 vu. Epochs are separate pools — an epoch's denominator sums that epoch's entries and no others — so a hypothetical entry run through the published rule in epoch 2 returns a founder share of 0%. Epoch 0's concentration is arithmetically incapable of reaching it. The founder's share of the epoch you contribute to starts at 0% and rises only if he logs work in that epoch too, on the same rate table, with the same evidence bar.
Computed the same way as the calculator below: one hypothetical entry, the published rule, nothing recorded. Recompute: python3 tools/render/generators/ledger.py your-epoch
This entry is unwritten.
The first external entry does not exist yet, and the concentration figure above stays where it is until someone else does priced, evidenced work. Same rate table, same evidence bar, same challenge exposure as every founder row above.
The rule that converts a contribution into a share
One screen, whole. The conversion schedule V is a table keyed by category and native unit; a contributor does not declare a rate and cannot propose one.
| Category | Native unit | Rate |
|---|---|---|
| code | hours | 1 vu per hour |
| design | hours | 1 vu per hour |
| docs | hours | 1 vu per hour |
| governance | hours | 1 vu per hour |
| ops | hours | 1 vu per hour |
| review | hours | 1 vu per hour |
Then, for an epoch that has closed and been audited: the weight of an entry is its quantity times its rate; the denominator De is the sum of the weights of every included entry of that epoch, counted the same way whichever mode was elected; the epoch share of an entry is its weight over De, as an exact fraction. That is the whole conversion. It is rule/distribute.py, rule/valuation.py and rule/params.py, published as code, pinned by hash on the record at the event marked "the rule is published": rule version 308296bd81fc, parameter set 5633b6fcaebb, both resolvable in rule/RULE_VERSION.json.
An epoch weight is not money and confers no right to any. There is no transfer operation in the code, in either mode, and there is no per-unit price. Whether an amount is ever declared against this record is discretionary and remains so.
The parameter values above are the development placeholder set. That is why the real record has not opened: the rule refuses to open epoch 1 under a parameter set that still carries placeholders.
Recompute the whole page
git clone https://github.com/socaity/socaity.dev cd socaity.dev python3 tools/render/generators/ledger.py
That command prints every figure on this page. It is the same file that renders the page, calling the same functions: there is one implementation, not a page and a copy of the page's arithmetic.
The attestation statement
The record carries a signed attestation before an epoch may open. It is reproduced whole; its digest 9b38fdeb8762 is the statement_hash on the "the attestation statement is signed" event.
ATTESTATION ACCOMPANYING THE OPENING OF AN EPOCH socaity.dev — example artifact (ledger/example/seed.py) This statement is the artifact behind the statement_hash carried by the rule.attested event that precedes epoch.opened(1) in the example chain. It is an example instance of the attestation gate adopted in socaity-19p: an epoch may not open until the person signing the record has said, in public and in their own name, the four things below. I attest, as the person who signs the events in this record: 1. The conversion schedule V that this epoch opens under was published before any observation it prices was recorded. Its exact bytes are committed, and the hash of the parameter set is on the record ahead of every entry it values. 2. The same table applies to my hours and to everyone else's. It prices one contributor-hour as one valuation unit, in every category, for every contributor, including me. There is no founder column, no multiplier, and no discretionary adjustment available to me at entry time. My own rate is therefore at or below the referent this schedule is pinned to, because it is the only rate the schedule has. 3. I have no interest that a change to V would advance and no one else's does not. I am not a beneficiary of the rate I set beyond being one of the people it prices, and I gain nothing from this schedule that a later contributor recording the same hours does not gain identically. 4. When I find an error in my own entries — and I will — I will correct it through the public challenge machinery on the record, not by quietly amending anything. Nothing on this record is edited; corrections are new events with their own signatures. An epoch weight is not money and confers no right to any. Whether anything is ever distributed against this record is discretionary and remains so; this statement binds how the record is kept, not what anyone receives.
Source: ledger/example/attestation.txt.
What would a contribution of mine be worth?
Two inputs, because the rule takes two: a category and a number of hours. There is no rate field — the rate is published, not declared. There is no mode field — accepted contributions are recorded in the epoch-share mode as a published constant. There is no epoch field — an entry's epoch is its position on the record, not a choice.
8 vu
8 h × 1 vu per hour; denominator D1 would be 20 vu
The vu figure is final at entry: it is fixed by the hours and the published rate, and nothing later changes it. The percentage is an upper bound, quoted only as "if epoch 1 closed on this record" — the numerator is fixed and the denominator only grows, so the only direction it can move is down. That is the honest version of the answer, and it is the reason the next line of this record is worth writing: entry two does not exist yet.
How this works, exactly: the page is static, so there is no rule engine running in your browser and this page does not contain a second implementation of the rule. All 48 combinations below were computed when the page was built, by calling rule/distribute.py and rule/valuation.py — once per combination, over the chain, with one hypothetical entry appended and the epoch flipped to closed. The script on the page does a table lookup and no arithmetic. Recompute any cell yourself: python3 tools/render/generators/ledger.py hypothetical code 8
Every precomputed combination (48)
| Category | Hours | Rate | vu | D1 would be | If epoch 1 closed on this record |
|---|---|---|---|---|---|
| code | 0.5 | 1 vu/h | 0.5 | 12.5 vu | 4% |
| code | 1 | 1 vu/h | 1 | 13 vu | 7.69% |
| code | 2 | 1 vu/h | 2 | 14 vu | 14.29% |
| code | 4 | 1 vu/h | 4 | 16 vu | 25% |
| code | 8 | 1 vu/h | 8 | 20 vu | 40% |
| code | 20 | 1 vu/h | 20 | 32 vu | 62.5% |
| code | 40 | 1 vu/h | 40 | 52 vu | 76.92% |
| code | 80 | 1 vu/h | 80 | 92 vu | 86.96% |
| design | 0.5 | 1 vu/h | 0.5 | 12.5 vu | 4% |
| design | 1 | 1 vu/h | 1 | 13 vu | 7.69% |
| design | 2 | 1 vu/h | 2 | 14 vu | 14.29% |
| design | 4 | 1 vu/h | 4 | 16 vu | 25% |
| design | 8 | 1 vu/h | 8 | 20 vu | 40% |
| design | 20 | 1 vu/h | 20 | 32 vu | 62.5% |
| design | 40 | 1 vu/h | 40 | 52 vu | 76.92% |
| design | 80 | 1 vu/h | 80 | 92 vu | 86.96% |
| docs | 0.5 | 1 vu/h | 0.5 | 12.5 vu | 4% |
| docs | 1 | 1 vu/h | 1 | 13 vu | 7.69% |
| docs | 2 | 1 vu/h | 2 | 14 vu | 14.29% |
| docs | 4 | 1 vu/h | 4 | 16 vu | 25% |
| docs | 8 | 1 vu/h | 8 | 20 vu | 40% |
| docs | 20 | 1 vu/h | 20 | 32 vu | 62.5% |
| docs | 40 | 1 vu/h | 40 | 52 vu | 76.92% |
| docs | 80 | 1 vu/h | 80 | 92 vu | 86.96% |
| governance | 0.5 | 1 vu/h | 0.5 | 12.5 vu | 4% |
| governance | 1 | 1 vu/h | 1 | 13 vu | 7.69% |
| governance | 2 | 1 vu/h | 2 | 14 vu | 14.29% |
| governance | 4 | 1 vu/h | 4 | 16 vu | 25% |
| governance | 8 | 1 vu/h | 8 | 20 vu | 40% |
| governance | 20 | 1 vu/h | 20 | 32 vu | 62.5% |
| governance | 40 | 1 vu/h | 40 | 52 vu | 76.92% |
| governance | 80 | 1 vu/h | 80 | 92 vu | 86.96% |
| ops | 0.5 | 1 vu/h | 0.5 | 12.5 vu | 4% |
| ops | 1 | 1 vu/h | 1 | 13 vu | 7.69% |
| ops | 2 | 1 vu/h | 2 | 14 vu | 14.29% |
| ops | 4 | 1 vu/h | 4 | 16 vu | 25% |
| ops | 8 | 1 vu/h | 8 | 20 vu | 40% |
| ops | 20 | 1 vu/h | 20 | 32 vu | 62.5% |
| ops | 40 | 1 vu/h | 40 | 52 vu | 76.92% |
| ops | 80 | 1 vu/h | 80 | 92 vu | 86.96% |
| review | 0.5 | 1 vu/h | 0.5 | 12.5 vu | 4% |
| review | 1 | 1 vu/h | 1 | 13 vu | 7.69% |
| review | 2 | 1 vu/h | 2 | 14 vu | 14.29% |
| review | 4 | 1 vu/h | 4 | 16 vu | 25% |
| review | 8 | 1 vu/h | 8 | 20 vu | 40% |
| review | 20 | 1 vu/h | 20 | 32 vu | 62.5% |
| review | 40 | 1 vu/h | 40 | 52 vu | 76.92% |
| review | 80 | 1 vu/h | 80 | 92 vu | 86.96% |
How the record was opened
The validator refuses an external entry before this sequence is complete, in this order. That is not a courtesy; it is the reason the founder went first — the rule and the rate table had to be published, and the founder's own position itemised and closed, before anybody else's entry could be admitted at all.
- the record begins
76677d5ee397 - the rule is published, as code, by its hash — rule version 308296bd81fc
1f48599b26b5 - the amendment rule is published
76ef3836596b - the conversion schedule V is published — V 5633b6fcaebb
db486c73859a - epoch opened — epoch 0
189cc6e1350b - epoch closed — epoch 0
98f5bdf5eb70 - the attestation statement is signed — statement 9b38fdeb8762
83e9eee2f604 - epoch opened — epoch 1
9c6ff6b94444
The next event on this record is the first entry that is not the founder's.