{
  "schema": "https://nostr-kinds.letsbalance.life/kinds.json",
  "definitions": "0.3.0",
  "status": "draft",
  "round": 5,
  "note": "Draft. Not published as a Nostr event and not sent to any relay. Generated from the record definitions 0.3.0; where this file and the definitions differ, the definitions win. Layers: directory = kept by directories (layer 1); circle = a circle’s own ledger (layer 2); both = kept in both (directories keep only the newest 7 days of 43917 and 43918).",
  "generated": "2026-10-27",
  "site": "https://nostr-kinds.letsbalance.life/kinds/",
  "layers": {
    "directory": [
      0,
      30910,
      30915,
      30916,
      43917,
      43918
    ],
    "circle_ledger": [
      43910,
      43911,
      43916,
      43917,
      43918,
      43919,
      43921,
      43924
    ]
  },
  "kinds": [
    {
      "kind": 0,
      "title": "Profile",
      "layer": "directory",
      "replaceability": "replaceable",
      "publishers": "the person (plain Nostr, not a BSA kind)",
      "version": null,
      "status": "standard Nostr",
      "tags": {
        "required": [],
        "optional": []
      },
      "url": "https://nostr-kinds.letsbalance.life/kinds/#kind-0"
    },
    {
      "kind": 30910,
      "title": "Circle Record",
      "layer": "directory",
      "layers": [
        "directory"
      ],
      "replaceability": "addressable",
      "replaceability_text": "Parameterized Replaceable (NIP-33): d = the circle id. The address 30910:<circle key>:<circle id> changes when the circle key is replaced, so readers query #d = the circle id and take the record the ledger confirms. Every version is also carried in the ledger (genesis or roles entry), so the history of the record is never lost.",
      "canonical_address": "30910:<circle key in office>:<circle id>",
      "publishers": "The circle key in office (held by the app and the creator; replaced by circle_key_change); it signs only this mirror and, once, the found act's binding in block 1 (proposal).",
      "content": "Empty. The tags are authoritative.",
      "version": "0.3.0",
      "status": "draft",
      "description": "v0.3.0 — A mirror of one circle's governance as its ledger holds it: the circle id (d: the id of the found act, the circle's name for ever), the code, name, the one currency, time zone and morning hour, the genesis digest (the trust anchor) with the founder's signature over the circle id and it, the founder, the parent circle it grew from (every circle but the root; decided 23 Oct 2026, E-8), the circle key in office, the witnesses with their operators and the quorum, the node (proposer), the Circle Heart (the steward tags) and how many of its members a Heart change needs (k), the relays and archives, the rate source, the address of the write intake, and the definitions version. Signed by the circle key it names, which signs only this mirror and, once, the found act in block 1 (proposal). It counts only when its author is the circle key that the ledger's mirror at its mirror_of names (at the height of a key change already the new key), its tags without g equal that mirror (the genesis entry of block 1, or a later roles entry; a block books at most one roles entry, so a height names one mirror) and its g names the pinned genesis; when they differ, readers follow the ledger. The circle key can be replaced (decided 17 Oct 2026, C5): k Heart members sign circle_key_change with the new key's proof of possession, and after change_notice_s of public notice (72 h by default; a circle setting since 23 Oct 2026, E-1) a roles entry, booked by the witnesses, puts the new key in office from the next block; a record by the old key with a mirror_of at or above that change never counts, and every seal and 30915 head names the circle key of the newest mirror at or below the seal's last block. g carries the founder's signature over the circle id and the genesis digest, so no key can point the record at another chain: a reader keeps the genesis it pinned (from the circle link or QR, or the first g it saw for the circle id) and never follows another, and the root relays keep the first-seen g and founder per circle id (decided 17 Oct 2026, C6: a request in the letter to the Lana relay owner, now extra safety). Said openly: the circle key is no longer part of the record's address, so anyone can publish a 30910 that names a circle id; it counts only when the ledger shows its author in office. Readers take the witness set from the ledger, never from the newest 30910. The circle's parameters (its time values and limits; decided 23 Oct 2026, E-1) are not part of the mirror: they are in its ledger (the found act, then each params_effective; the state's g3|param lines). Operators are named by the circle itself (self-declared): a relay or witness operator is a name, not a proof of independence. The root directory checks decision E-8 from this record and the found act it mirrors: every circle but the root names its parent circle and the founder's reference from it, and a founder founds one circle, ever (the check by the root relays: proposal). There is no key for any system account and no field for a person's name or for bank data.",
      "tags": {
        "required": [
          {
            "tag": "d",
            "description": "the circle id: the 64-hex event id of the found act; never changes",
            "example": "<circle id>"
          },
          {
            "tag": "code",
            "description": "circle code: ^[a-z0-9][a-z0-9-]{2,23}$; set in the found act, never changes",
            "example": "example-circle"
          },
          {
            "tag": "name",
            "description": "the circle's name (not a person's), 1 to 80 characters, one line, no \"|\"; public for ever",
            "example": "Example Circle"
          },
          {
            "tag": "currency",
            "description": "exactly one: EUR, USD or GBP; fixed at founding (another currency is another circle)",
            "example": "EUR"
          },
          {
            "tag": "tz",
            "description": "IANA time zone of the morning; fixed at founding (decided 17 Oct 2026, C7: no act or parameter changes it in 0.3.0)",
            "example": "Europe/Ljubljana"
          },
          {
            "tag": "tzdata",
            "description": "the tz database version the morning boundaries use; fixed at founding (decided 17 Oct 2026, C7, the tzdata part confirmed that evening, 2A: no act or parameter changes it in 0.3.0; a later definitions version may say how a circle follows new clock rules)",
            "example": "2026a"
          },
          {
            "tag": "morning",
            "description": "local hour of the morning (gravity, due rules, then the seal); fixed at founding (decided C7). Inside a clock change: a local hour that occurs twice counts at its first occurrence, a skipped local hour at the first instant after the gap",
            "example": "4"
          },
          {
            "tag": "g",
            "description": "[\"g\", <genesis digest>, <the founder's BIP-340 signature over sha256(\"lb-genesis/3|\" + circle id + \"|\" + genesis digest)>]",
            "example": "[\"g\",\"<hex>\",\"<sig>\"]"
          },
          {
            "tag": "mirror_of",
            "description": "the height of the ledger entry this record mirrors (1 for the genesis mirror)",
            "example": "1"
          },
          {
            "tag": "founder",
            "description": "[\"founder\", <founder HEX>]: the author of the found act; never changes",
            "example": "<hex>"
          },
          {
            "tag": "circle_key",
            "description": "[\"circle_key\", <HEX of the circle key in office from the block after mirror_of (from block 1 for the genesis mirror)>]: the record's author must be this key; never the founder's, a witness's or a Heart member's key (proposal); changed only by circle_key_change (decided 17 Oct 2026, C5)",
            "example": "<hex>"
          },
          {
            "tag": "signer",
            "description": "[\"signer\", <hex>, <operator>, <since_h>, <until_h or \"\">], one per witness (at most 100 tags; when more would be needed the oldest retired ones are dropped, their windows stay in the ledger's roles entries); at most one current witness per operator",
            "example": "[\"signer\",\"<hex>\",\"box.example.org\",\"1\",\"\"]"
          },
          {
            "tag": "quorum",
            "description": "[\"quorum\", q, n]: n current witnesses, q > 2n/3 (4 → 3, 1 → 1)",
            "example": "[\"quorum\",\"3\",\"4\"]"
          },
          {
            "tag": "proposer",
            "description": "[\"proposer\", <hex of a current witness>, <since_h>]: the node that orders the blocks",
            "example": "[\"proposer\",\"<hex>\",\"1\"]"
          },
          {
            "tag": "stewards_required",
            "description": "k: how many Heart members a Heart change needs (proposal: 3 of 4); at most the number of Heart members and at least 2 while there are at least 2",
            "example": "3"
          },
          {
            "tag": "relay",
            "description": "[\"relay\", <wss URL>, <operator>]; at least 4 relays of at least 3 operators (decided 16 Oct 2026, A2)",
            "example": "[\"relay\",\"wss://relay.box.example.org\",\"box.example.org\"]"
          },
          {
            "tag": "rate_source",
            "description": "[\"rate_source\", <source id>, <public description, one line, no \"|\">]: any source the circle chooses itself (decided A7); ecb-daily is the start source",
            "example": "[\"rate_source\",\"ecb-daily\",\"…\"]"
          },
          {
            "tag": "api",
            "description": "https URL of the circle's write intake (notes, acts, quote requests); nothing is read from it that is not on the relays",
            "example": "https://circle.example.org"
          },
          {
            "tag": "definitions",
            "description": "the definitions version",
            "example": "0.3.0"
          },
          {
            "tag": "v",
            "description": "record version",
            "example": "3"
          }
        ],
        "optional": [
          {
            "tag": "parent",
            "description": "[\"parent\", <parent circle id>, <its genesis digest>]: the circle this one grew from, as its found act names it; every circle but the root (meta.root_circle) has one (decided 23 Oct 2026, E-8); never changes",
            "example": "[\"parent\",\"<circle id>\",\"<hex>\"]"
          },
          {
            "tag": "steward",
            "description": "[\"steward\", <hex>], one per Heart member (the Circle Heart; decided 23 Oct 2026, E-2; the live circle: four)",
            "example": "<hex>"
          },
          {
            "tag": "archive",
            "description": "[\"archive\", <wss URL>]: a relay that keeps the whole history",
            "example": "wss://archive.example.net"
          },
          {
            "tag": "bootstrap",
            "description": "[\"bootstrap\", \"Q14\"]: the circle declares the bootstrap of open question 14 (not decided); two relay operators then give a warning instead of a refusal"
          }
        ]
      },
      "tag_order": "d, code, name, currency, tz, tzdata, morning, g, mirror_of, founder, parent?, circle_key, signer…, quorum, proposer, steward…, stewards_required, relay…, archive…, bootstrap?, rate_source, api, definitions, v",
      "validation_rules": [
        "Tags in exactly the order of tag_order; no other tag.",
        "g verifies: the founder's signature over the circle id and the genesis digest. A reader pins the genesis from the circle link or the first g it sees for a circle id and never follows another; root relays keep the first-seen g and founder per circle id (decided 17 Oct 2026, C6: a request to the relay owner, extra safety), pinned only when the relay holds the circle's found act and the record's founder is its author, or for a circle configured on the relay when its configured circle key signed the record (proposal).",
        "The author is the circle key the record names (circle_key); the circle key is not the founder's key, a witness key or a Heart member's key.",
        "parent, when present, names another circle id and its genesis digest; the root circle (meta.root_circle) has none (decided 23 Oct 2026, E-8).",
        "stewards_required (k) is at most the number of steward tags and at least 2 while there are at least 2 [proposal (D4 review, round 3, 17 Oct 2026)].",
        "Exactly one currency (EUR, USD or GBP).",
        "n of quorum equals the number of current witnesses (until_h \"\"), q > 2n/3, at most one current witness per operator; the proposer is a current witness.",
        "At least 4 relays of at least 3 operators; with [\"bootstrap\",\"Q14\"] declared, 2 operators give a warning only.",
        "definitions = 0.3.0; v = 3. The record carries no time value and no number of approvals: those are the circle's parameters, in its ledger (decided 23 Oct 2026, E-1).",
        "Authority: a 30910 counts only if its author is the circle key that the ledger's mirror at its mirror_of names (the mirror in the committed genesis or roles entry at mirror_of; at the height of a key change already the new key, in office for blocks from the next height), its tags without g equal that mirror, and its g is the pinned genesis. Readers take the valid record with the highest mirror_of; a record by an old circle key with a mirror_of at or above its replacement can never match."
      ],
      "data_governance": "Public: the circle's description, founder, parent circle, witnesses and their operators, Heart members by HEX key, relays and rate source. No person's name and no bank data; the app shows \"public for ever; do not write names, personal or bank data\" at the circle name, the operator names and the rate-source description.",
      "url": "https://nostr-kinds.letsbalance.life/kinds/#kind-30910"
    },
    {
      "kind": 30915,
      "title": "Circle Head",
      "layer": "directory",
      "layers": [
        "directory"
      ],
      "replaceability": "addressable",
      "replaceability_text": "Parameterized Replaceable (NIP-33): d = the circle id.",
      "canonical_address": "30915:<node pubkey>:<circle id>",
      "publishers": "The node (a current witness) that signed the seal.",
      "content": "The seal's content (empty).",
      "version": "0.3.0",
      "status": "draft",
      "description": "v0.3.0 — The newest daily seal of a circle, mirrored on the root relays so anyone finds a circle's latest state in one query. The same author, created_at, content and tags as its 43917 Day Seal (the witnesses' qs signatures included), with [\"d\", circle id] and [\"seal\", seal digest, seal day] appended last; the seal tag must recompute as the seal's digest. Like the seal it names the circle key of the newest mirror at or below the seal's last block and the height of the circle's parameters in force (params), under the witnesses' quorum, so a reader of the root directory picks the circle's 30910 by that key in one more query. Published at a per-circle offset spread over the day (the first 4 bytes, big-endian, of sha256(the circle id) mod 86,400 seconds after the seal; test_vectors.circle_id), so heads do not bunch into one hour; created_at stays the seal's.",
      "tags": {
        "required": [
          {
            "tag": "all seal tags",
            "description": "exactly as in the 43917, in its order, ending with [\"v\",\"3\"]"
          },
          {
            "tag": "d",
            "description": "the circle id (second to last)",
            "example": "<circle id>"
          },
          {
            "tag": "seal",
            "description": "[\"seal\", <digest of the 43917 this head mirrors>, <its day>] (last)",
            "example": "[\"seal\",\"<hex>\",\"2026-10-16\"]"
          }
        ],
        "optional": []
      },
      "validation_rules": [
        "The seal tag carries the digest of [0, pubkey, created_at, 43917, the seal tags without qs, content] and the seal's day.",
        "The seal tags follow every 43917 rule, and the qs tags verify (domain \"lb-seal/3|\") with at least q current witnesses.",
        "The author is a current witness of the circle."
      ],
      "data_governance": "Public: roots, counts, the circle's world, reserve and origin numbers, its circle key and the height of its parameters in force.",
      "url": "https://nostr-kinds.letsbalance.life/kinds/#kind-30915"
    },
    {
      "kind": 30916,
      "title": "Member Home",
      "layer": "directory",
      "layers": [
        "directory"
      ],
      "replaceability": "addressable",
      "replaceability_text": "Parameterized Replaceable (NIP-33): d = \"letsbalance\". A new home replaces the old one; relays keep only the newest.",
      "canonical_address": "30916:<member pubkey>:letsbalance",
      "publishers": "The member's own key; a witness of the circle attests inside the tags.",
      "content": "Empty.",
      "version": "0.3.0",
      "status": "draft",
      "description": "v0.3.0 — Where a member lives: the circle, its genesis digest and the height of the member_join entry that admitted the key, attested by a witness of the circle who was a witness at that height. Mandatory for every member (decided). Signed by the member's own key. The name words (n) come from the member's KIND 0 name and are rewritten whenever that name changes; relays keep only the newest version and no version is ever copied into the ledger (decided 16 Oct 2026, A5). The member_join entry in the ledger is the truth; this record is a pointer. Before paying, an app checks the join (and the absence of a leave, an exclusion or a close) in the circle's ledger. [decided 23 Oct 2026, E-8 and E-9; proposal: the reading] A person is a member of one circle at a time: a key's circle is the one its newest member home names, and a new circle admits a key whose newest home names another circle only with that circle's reference (43921); a key with no member home anywhere was never a member and needs none. [review of E4x, 24 Oct 2026; proposal] A node reads the homes against the ledgers they name, never by created_at alone (the key sets it, and an old attestation can be signed again): a home counts when that circle's verified ledger books the member_join it names for the key; it is passed over when that circle has since booked the return of the key's reference (the key moved on with its step); a home naming the reading circle itself counts only while the key is a member there (coming back needs no reference). A key that only left, or was excluded or closed in a circle, still belongs to it: another circle asks for that circle's reference, and without one (a minus, an open OWN process) the key does not move. A key whose reference of this circle another circle has granted (its reference_grant read) comes back here only with that circle's reference, never as if it had not left. Root relays keep member homes (no deletion by KIND 5) [proposal]; said openly: a deleted home or a second key is not caught (that needs Lana's person check).",
      "tags": {
        "required": [
          {
            "tag": "d",
            "description": "always \"letsbalance\"",
            "example": "letsbalance"
          },
          {
            "tag": "c",
            "description": "the circle id",
            "example": "<circle id>"
          },
          {
            "tag": "g",
            "description": "the circle's genesis digest",
            "example": "<hex>"
          },
          {
            "tag": "join",
            "description": "the height of the member_join entry that admitted this key",
            "example": "2"
          },
          {
            "tag": "attest",
            "description": "[\"attest\", <witness hex>, <YYYY-MM-DD since>, <BIP-340 signature of the witness over sha256(\"lb-home/3|\" + member + \"|\" + circle id + \"|\" + genesis digest + \"|\" + join + \"|\" + since)>] (the digest is a proposal); the witness was a witness at the join height",
            "example": "[\"attest\",\"<hex>\",\"2026-10-15\",\"<sig>\"]"
          },
          {
            "tag": "v",
            "description": "record version",
            "example": "3"
          }
        ],
        "optional": [
          {
            "tag": "n",
            "description": "name words from the verified KIND 0 name: the full folded name, then up to 8 words (9 at most); folded = NFKD, marks removed, lower case, single spaces",
            "example": "test member one"
          },
          {
            "tag": "w",
            "description": "a LANA address of the member's key (one of the 4 addresses of the BSA ID; readers check it)",
            "example": "L…"
          }
        ]
      },
      "tag_order": "d, c, g, join, attest, n…, w…, v",
      "validation_rules": [
        "The attesting key was a witness of the circle at the join height and its signature verifies.",
        "At most 9 n tags, all folded; readers drop results whose n values are not in the member's KIND 0 name.",
        "The ledger's member_join entry at join admits this key.",
        "[proposal, E-8 and E-9] The newest member home of a key names its circle: a join in another circle needs that circle's reference."
      ],
      "data_governance": "Public: the member's BSA ID, circle, join height, day and name words. No balances (those are in the ledger) and nothing else.",
      "url": "https://nostr-kinds.letsbalance.life/kinds/#kind-30916"
    },
    {
      "kind": 43910,
      "title": "Payment Note",
      "layer": "circle",
      "layers": [
        "circle"
      ],
      "replaceability": "regular",
      "replaceability_text": "Regular (kind 40000+); embedded in 43911; a standalone copy only as evidence.",
      "publishers": "The payer (any member).",
      "content": "The purpose, at most 180 characters on one line, public for ever.",
      "version": "0.3.0",
      "status": "draft",
      "description": "v0.3.0 — A payment signed by the payer: receiver, amount, currency and purpose; across circles also the receiving circle and the amount it receives (the payer signs both amounts); across currencies the id of the receiving circle's 43919 quote that the payer accepted. Inside a block the note is stored in a compact form from which its exact event, id and signature are rebuilt from the template below, frozen for 0.3.0; the node rebuilds and verifies every note before booking it, and a note that does not round-trip the template is refused (bad_template), never repaired. A note is booked only at a time at from created_at − AT_TOLERANCE_S to its expires. A payment into the minus of a line that left or is excluded settles it, at most to 0, with no grow (decided 23 Oct 2026, E-9: anyone may settle a debt; the shape: proposal). A standalone copy goes to the circle's relays only as evidence when the node gives no receipt; a member's KIND 5 can remove only that copy, never the block that embeds the note. The purpose is public for ever: the app shows \"public for ever; do not write names, personal or bank data\".",
      "tags": {
        "required": [
          {
            "tag": "p",
            "description": "the receiver: a member's HEX key (or the key of a line that left or is excluded, only to settle its minus), a project wallet (a contribution naming a project) or the reserve (a contribution naming none)",
            "example": "<hex>"
          },
          {
            "tag": "c (from)",
            "description": "[\"c\", <payer circle id>, \"\", \"from\"]",
            "example": "[\"c\",\"<circle id>\",\"\",\"from\"]"
          },
          {
            "tag": "amount",
            "description": "minor units of the payer's currency, 1 to 15 digits",
            "example": "2500"
          },
          {
            "tag": "currency",
            "description": "the payer's currency",
            "example": "EUR"
          },
          {
            "tag": "n",
            "description": "the payer's own note counter in this circle: 1, 2, …",
            "example": "1"
          },
          {
            "tag": "prev",
            "description": "the payer's previous booked note id in this circle, or \"genesis\"",
            "example": "genesis"
          },
          {
            "tag": "expires",
            "description": "unix time, at most created_at + note_ttl_s (a circle parameter, 600 s by default: the payer's circle checks its own value at the xout, the receiving circle its own at the xin; meta.circle_parameters); across currencies never later than the quote's expires; after it an unbooked note can never be booked",
            "example": "<unix>"
          },
          {
            "tag": "v",
            "description": "record version",
            "example": "3"
          }
        ],
        "optional": [
          {
            "tag": "c (to)",
            "description": "[\"c\", <receiver circle id>, \"\", \"to\"], only across circles"
          },
          {
            "tag": "to_amount",
            "description": "[\"to_amount\", <minor>, <receiver currency>], only across circles; across currencies = floor(amount × r_to / r_from) under the quote, exactly; in one currency = amount"
          },
          {
            "tag": "e (quote)",
            "description": "[\"e\", <43919 id>, \"\", \"quote\"], exactly one, only across currencies"
          },
          {
            "tag": "idem",
            "description": "exactly 32 lowercase hex characters (128 random bits) made by the app, never typed by a person"
          },
          {
            "tag": "e (request)",
            "description": "[\"e\", <pay_request act id>, \"\", \"request\"]"
          },
          {
            "tag": "e (project)",
            "description": "[\"e\", <project_propose id>, \"\", \"project\"]: a contribution names its project here"
          }
        ]
      },
      "tag_order": "p, c (from), c (to)?, amount, currency, to_amount?, e (quote)?, n, prev, expires, idem?, e (request)?, e (project)?, v",
      "validation_rules": [
        "Tags exactly in tag_order, nothing else (bad_template otherwise).",
        "expires within note_ttl_s of the circle parameters in force at the booking (each circle its own: a receiving circle whose value is shorter refuses the note with src, bad_template, and the payer's circle returns the hold).",
        "Across currencies: to_amount = floor(amount × r_to / r_from) under the named quote, to_amount > 0, expires ≤ the quote's expires (refusals: bad_quote, stale_quote).",
        "One successor per (n, prev): a second note on the same prev is refused stale_prev; a note id is booked at most once (duplicate).",
        "Cover is checked by the node and every witness at the booking's place in the ledger: amount ≤ balance + wave (a give: amount ≤ max(0, balance), Open 8g; an xout of a key that left or is excluded: its plus only, max(0, balance), never the wave [proposal, E-3 and E-9]); a settlement at most −balance of the line it settles."
      ],
      "data_governance": "Public for ever: payer, receiver, amounts, purpose. No name, no bank data.",
      "url": "https://nostr-kinds.letsbalance.life/kinds/#kind-43910"
    },
    {
      "kind": 43911,
      "title": "Circle Block",
      "layer": "circle",
      "layers": [
        "circle"
      ],
      "replaceability": "regular",
      "replaceability_text": "Regular (kind 40000+); never deleted (circle relays refuse KIND 5 and expiration for it).",
      "publishers": "The node (a current witness) of the height, with at least q witness signatures inside (qs).",
      "content": "Canonical JSON {\"e\": [entries], \"l\": [lines]}; strings only.",
      "version": "0.3.0",
      "status": "draft",
      "description": "v0.3.0 — The ledger. One circle's bookings as a gap-free numbered chain of blocks from block 1 (genesis), linked by digests. A block names its circle id, its height, the previous block's digest, the genesis digest, the entry numbers and booking times it covers, three roots (its entries; the lines of the parties it touches; the whole decision state after it, which holds the circle key in office and the circle's parameters in force, so every block names both), every party it touches, and, in a block that books a grav entry, the morning header. The content is canonical JSON {\"e\": entries, \"l\": lines}. The node signs the event; every witness of the quorum signs the domain-separated digest (qs tags, sorted by witness HEX) after recomputing every line and root from its own copy, built only from blocks on the relays. [decided A1] A booking counts once its block carries the quorum and at least three of the circle's relays hold it; [consequence] every lower height must count too. The sum of all balances of the circle is 0 after every block. A block closes at the first of: the intake queue is empty, w_max_s seconds after its first entry, or 100,000 bytes (a block whose work would pass 100,000 bytes closes after its last whole step and the next block, at the same at, continues that work: the block split, booking_rules [completed 24 Oct 2026, plan step E4x]); so its at span is at most w_max_s, checked exactly with the circle parameters in force (the found act's, then each params_effective; a check without them can only use 10 s, the top of the range) [clarification, 17 Oct 2026 (D4 review)], and no block can hold a whole notice.",
      "tags": {
        "required": [
          {
            "tag": "c",
            "description": "the circle id",
            "example": "<circle id>"
          },
          {
            "tag": "h",
            "description": "\"<scope16>:<height>\", gap-free from 1 (scope16: the first 16 hex characters of the circle id)",
            "example": "<scope16>:1"
          },
          {
            "tag": "prev",
            "description": "the digest of block h-1; \"\" in block 1"
          },
          {
            "tag": "genesis",
            "description": "the genesis digest on every block; \"\" in block 1 itself (it cannot carry its own digest)"
          },
          {
            "tag": "seq",
            "description": "[\"seq\", first, last]: circle-wide entry numbers, gap-free",
            "example": "[\"seq\",\"1\",\"2\"]"
          },
          {
            "tag": "at",
            "description": "[\"at\", first, last]: booking times, never decreasing; first is its first entry's at and last its last entry's [clarification, 19 Oct 2026 (D3 review)]; created_at = last",
            "example": "[\"at\",\"<unix>\",\"<unix>\"]"
          },
          {
            "tag": "root",
            "description": "[\"root\", entries root, lines root, state root]"
          },
          {
            "tag": "qs",
            "description": "[\"qs\", <witness hex>, <BIP-340 signature over sha256(\"lb-block/3|\" + the 32 digest bytes)>], at least q, sorted by witness HEX, the node's own included"
          },
          {
            "tag": "v",
            "description": "record version",
            "example": "3"
          }
        ],
        "optional": [
          {
            "tag": "p",
            "description": "[\"p\", <party hex>], every party the block touches (keyless system accounts included), in the order the entries first name them (inside an entry: party first, then each move's from and to); lines refer to them by index"
          },
          {
            "tag": "m",
            "description": "every block that books a grav entry of the day (a morning block, or a payment block with visits): \"<scope16>:<date>\""
          },
          {
            "tag": "morning",
            "description": "with m: [\"morning\", <date>, <boundary unix>, <cutoff seq>, <params_h>, <tzdata>]; the cut-off is the last seq with at < boundary; tzdata is the version the circle pinned at founding (decided C7 and 2A; the check: proposal), and a witness computes the boundary with it, never with a newer one of its own (decided 17 Oct 2026, evening, 2A; a witness without it signs no morning block: proposal)"
          },
          {
            "tag": "more",
            "description": "[completed 24 Oct 2026 (plan step E4x): the block split, booking_rules] only on a block the size rule closed with work left: [\"more\", <trigger seq>, <work seq>, <leaver hex or \"\">, <\"leave\" | \"exclude\" | \"\">, <act id or \"\">]: the trigger the carried end-of-entry work names (a cut between whole entries, between the duties of a block's start or between the returns of a person, has none: trigger = work then [clarification, 25 Oct 2026, D4 N27]), the seq of the newest entry booked outside end-of-entry work, and the person whose receiving projects are still to be returned (with how the person went and the act); the next block starts at this block's last at and continues the work first. Block 1 never carries it"
          }
        ]
      },
      "tag_order": "c, h, prev, genesis, seq, at, root, p…, m?, morning?, more?, qs…, v",
      "validation_rules": [
        "Tags in tag_order; h, prev and genesis chain the block by digests; seq and at match the entries; created_at = at last; the block spans at most w_max_s, exactly the parameter in force (from block 1 a run reads it from the found act and every params_effective); without the parameter lines only 10 s, the top of its range, can be checked [clarification, 17 Oct 2026 (D4 review)].",
        "Content is canonical JSON with strings only; the entries root and lines root recompute; every p index is touched by an entry, in first-naming order, and has exactly one line.",
        "Every embedded note and act rebuilds to a valid signed event of the 0.3.0 template; notes and acts are booked inside their window, once, judged by the circle parameters in force at the booking.",
        "Block 1: genesis with the found act whose id is the circle id, a valid circle_sig by the circle key it names and the mirror its found act gives, then start, and no roles entry (its genesis mirror is the mirror of height 1); its digest is the pinned genesis.",
        "params_effective is the first entry of its block, at most one per block, never early (its notice end at or before the block's first at); a block books at most one roles entry, and a roles entry changes the circle key only by circle_key_change.",
        "Moves name system accounts correctly: grow, settled, grav → reserve; start and grant origin → reserve; xout and reference_out → world; xin and xundo out of world, reference_in world → reserve; reserve_move out of the reserve into the project's wallet; project_pay out of the project's wallet; close_cover reserve → the closed line, close_wave reserve → origin; each reason only in the entry it belongs to.",
        "At least q valid qs signatures of the witnesses in office at the block's height over the domain-separated digest, sorted by HEX, the node's own included; the author is such a witness (in office: the genesis mirror, then each roles entry's mirror from the next block, since_h ≤ height < until_h).",
        "A grav entry only in a block with m and the morning header, booked at or after the boundary; in a block that books anything besides grav and rule entries, every grav entry stands right before the entry that touches its account (visit before touch), or before the rej of a refused note whose accounts it visits [proposal (D3 review, 19 Oct 2026)], several in HEX order; the remaining grav entries of a morning come in HEX order; the morning header names the tzdata the circle pinned at founding. Across blocks: after the boundary no entry touches an account before that account's grav entry of the day, and an account has one grav entry per day.",
        "Across a run [clarification, 17 Oct 2026 (D4 review)]: while an earlier morning is still pending and a later boundary has passed, a block carries the earlier morning's header and books only a params_effective entry (when one is due), its grav entries and their end-of-entry work; morning headers never go back; visit before touch for a morning counts from its opening. A roles entry commits a change that is open in the state (o3|change) within its commit window and carries exactly the mirror the change gives; a rules act is followed at once by member_rules, a member's leave act by member_leave, and a vote's end by vote_pass or vote_fall as the tally gives, at the first block whose first at reaches it. The o3|change lines of a block's state or a snapshot are the ones the run gives (test_vectors.change_line).",
        "Across a run: each block is judged with the circle parameters in force (the found act's, then each params_effective; every note's and act's TTL and the refusal limit by those in force at the booking, every running deadline by the length recorded when it started). A run checked from a later height takes the office and the parameters below it from the ledger (the mirror in office and the state's g3|param lines); without them those checks are unverifiable, never passed.",
        "[proposal, round 5] A member_join that names a reference carries ref, src and g together; the old circle's block it names carries the reference entry of the key with the same wave under a valid quorum of that circle's witnesses in office at its height, and that circle is the one the key's newest member home names; a reference_grant follows its member_join at once; a reference_return names the new circle's block with that grant; account_close, reference and the admissions from the waiting list come only in end-of-entry work and only when their conditions hold.",
        "Shape only here: cover, wave growth, gravity, drain() and the sum 0 are recomputed by every witness and verifier from the whole ledger (plan steps D1 to D4)."
      ],
      "data_governance": "Public for ever: every booking with every touched account's line after it, every move into and out of project wallets and the reserve, every refusal with its reason (never the refused event's text). Keys only, never names; no bank data.",
      "entry_types": [
        "genesis",
        "pay",
        "give",
        "xout",
        "xin",
        "xdone",
        "xundo",
        "act",
        "rule",
        "roles",
        "grav",
        "rej"
      ],
      "url": "https://nostr-kinds.letsbalance.life/kinds/#kind-43911"
    },
    {
      "kind": 43916,
      "title": "Circle Act",
      "layer": "circle",
      "layers": [
        "circle"
      ],
      "replaceability": "regular",
      "replaceability_text": "Regular (kind 40000+); embedded in 43911; a standalone copy optional.",
      "publishers": "The acting person: member, invitee, recipient, proposer, Heart member (signer \"steward\"), witness, founder or guardian.",
      "content": "Text where the type has one, at most 500 characters on one line, public for ever.",
      "version": "0.3.0",
      "status": "draft",
      "description": "v0.3.0 — Everything a person decides in a circle, signed by that person: founding, membership (joining, invitations, leaving), payment requests, projects, motions and votes, the step outward, parameters, witnesses, the Circle Heart, relays, the rate source, the circle key, recovery, exclusion and readmission, closing an old account, OWN processes and member safety. The found act names no circle ([\"c\", \"\"]): its id is the circle id; every other act names its circle by [\"c\", <circle id>]. Every act carries expires, at most act_ttl_s (a circle parameter, 604800 s by default; decided 17 Oct 2026, C3) after it was signed; it has effect only once booked in a block (an act entry, the genesis, or the input of a rule or roles entry) at created_at − AT_TOLERANCE_S ≤ at ≤ expires, judged by its author's role at the booking height, and the same act id is booked at most once (duplicate). A change that needs k Heart members is one proposing act plus endorsements that name it, booked before it expires. Acts are embedded in blocks; a standalone copy is optional. Every act's text is public for ever and the app shows \"public for ever; do not write names, personal or bank data\"; no act type has a field for a person's name, and a person appears only as the author or in a p tag, by HEX key. There is no act for money from or to outside the system, no act that pays a payer back out of community money, and no act naming a holder of money (decided 16 Oct 2026). The rules each act follows (votes, notice periods, who may act, limits) are in docs/upravljanje-kroga.md (pinned in meta.normative_spec).",
      "tags": {
        "required": [
          {
            "tag": "c",
            "description": "the circle id, first; [\"c\", \"\"] in the found act, whose own id is the circle id",
            "example": "<circle id>"
          },
          {
            "tag": "t",
            "description": "the act type, second",
            "example": "project_propose"
          },
          {
            "tag": "expires",
            "description": "[\"expires\", <unix>]: after created_at and at most created_at + act_ttl_s (the circle parameter in force at the booking, 604800 s by default); the act is refused (rej expired) after it"
          },
          {
            "tag": "v",
            "description": "record version, last",
            "example": "3"
          }
        ],
        "optional": [
          {
            "tag": "the type's tags",
            "description": "as act_types lists, in that order (or, for an endorsement, only [\"e\", <proposing act id>, \"\", \"proposal\"])"
          },
          {
            "tag": "after",
            "description": "[\"after\", <height>]: valid only after this height"
          },
          {
            "tag": "idem",
            "description": "exactly 32 lowercase hex characters made by the app"
          }
        ]
      },
      "tag_order": "c, t, the type's tags in act_types order, after?, expires, idem?, v",
      "validation_rules": [
        "c first, t second, v last; the type's tags with their counts (or the endorsement form), then after, expires (required) and idem; nothing else.",
        "found and param_propose carry exactly the circle parameters of meta.circle_parameters, in that order and range (vote_min_s ≤ vote_max_s < open_lapse_s). found's relays follow the relay rule (bootstrap: see 30910). found is signed by the founder the circle record names; its id is the circle id; it names the first circle key, which is not the founder's, a witness's or a Heart member's key; for every circle but the root it names its parent circle and the founder's reference from it, together (decided 23 Oct 2026, E-8 and E-9).",
        "circle_key_change: pop is the new key's BIP-340 signature over sha256(\"lb-circle-key/3|\" + circle id + \"|\" + new key + \"|\" + created_at), created_at the act's own in decimal, so nobody names a key they do not hold and a pop is good for its own act only (an act is booked only within act_ttl_s of its created_at); the new key is not the key in office, the founder's, a witness's or a Heart member's key.",
        "Acts whose signer is \"steward\" are signed by a Heart member in office; signer_resign by a current witness; a vote on a witness change by a Heart member in office.",
        "An endorsement names a booked proposing act of the same type (never another endorsement) that has not expired; each Heart member counts once per proposal; the change is committed only with at least k distinct Heart members in office, and for member_exclude, member_readmit, account_close and the witness exceptions at least max(k, 3) (E-10; see the roles entry; member_exclude, member_readmit and account_close at the act that reaches it). The excluded key never counts toward its own exclusion.",
        "project_propose and motion carry the vote's duration, from the circle's vote_min_s to its vote_max_s (else not_allowed). A vote names a project or motion whose vote runs (vote_ended at or after its end) or a witness change; \"against\" carries its short public reason as text, \"for\" none (else bad_template). There are no approvals and no objections, and no Heart member rejects a project alone (decided 23 Oct 2026, E-5; 17 Oct 2026, C4).",
        "Heart members who propose a project or receive from it never count toward its Heart \"for\" votes.",
        "A join names, where needed, the open invitation of its key ([\"e\", <invite id>, \"\", \"invite\"], invite_only) and the reference of the circle its newest member home names ([\"e\", <43921 id>, \"\", \"reference\"], E-9).",
        "The rules act's [\"rules\", version, sha256] names the circle's own rules text; the found act names no rules version (there are no world rules; decided 23 Oct 2026, E-1)."
      ],
      "data_governance": "Public for ever: who acted (HEX key), what, when, and the text. No names, no bank data.",
      "act_types": [
        {
          "type": "found",
          "group": "Founding",
          "signed_by": "founder"
        },
        {
          "type": "invite",
          "group": "Membership",
          "signed_by": "member"
        },
        {
          "type": "vouch",
          "group": "Membership",
          "signed_by": "member"
        },
        {
          "type": "join",
          "group": "Membership",
          "signed_by": "invitee"
        },
        {
          "type": "leave",
          "group": "Membership",
          "signed_by": "member"
        },
        {
          "type": "rules",
          "group": "Membership",
          "signed_by": "member"
        },
        {
          "type": "pay_request",
          "group": "Requests",
          "signed_by": "member"
        },
        {
          "type": "project_propose",
          "group": "Projects",
          "signed_by": "member"
        },
        {
          "type": "project_consent",
          "group": "Projects",
          "signed_by": "recipient"
        },
        {
          "type": "project_decline",
          "group": "Projects",
          "signed_by": "recipient"
        },
        {
          "type": "project_withdraw",
          "group": "Projects",
          "signed_by": "proposer"
        },
        {
          "type": "project_close",
          "group": "Projects",
          "signed_by": "steward"
        },
        {
          "type": "motion",
          "group": "Votes",
          "signed_by": "steward"
        },
        {
          "type": "vote",
          "group": "Votes",
          "signed_by": "member"
        },
        {
          "type": "step_propose",
          "group": "Step outward",
          "signed_by": "member"
        },
        {
          "type": "param_propose",
          "group": "Parameters",
          "signed_by": "steward"
        },
        {
          "type": "steward_accept",
          "group": "Circle Heart",
          "signed_by": "nominee"
        },
        {
          "type": "steward_resign",
          "group": "Circle Heart",
          "signed_by": "steward"
        },
        {
          "type": "signer_propose",
          "group": "Witnesses",
          "signed_by": "steward"
        },
        {
          "type": "signer_accept",
          "group": "Witnesses",
          "signed_by": "new witness"
        },
        {
          "type": "signer_resign",
          "group": "Witnesses",
          "signed_by": "witness"
        },
        {
          "type": "signer_remove",
          "group": "Witnesses",
          "signed_by": "steward"
        },
        {
          "type": "signer_replace",
          "group": "Witnesses",
          "signed_by": "steward"
        },
        {
          "type": "steward_add",
          "group": "Circle Heart",
          "signed_by": "steward"
        },
        {
          "type": "steward_remove",
          "group": "Circle Heart",
          "signed_by": "steward"
        },
        {
          "type": "stewards_required_set",
          "group": "Circle Heart",
          "signed_by": "steward"
        },
        {
          "type": "proposer_swap",
          "group": "Witnesses",
          "signed_by": "steward"
        },
        {
          "type": "relay_change",
          "group": "Circle Heart",
          "signed_by": "steward"
        },
        {
          "type": "rate_source_set",
          "group": "Circle Heart",
          "signed_by": "steward"
        },
        {
          "type": "refusal_list_set",
          "group": "Circle Heart",
          "signed_by": "steward"
        },
        {
          "type": "circle_key_change",
          "group": "Circle Heart",
          "signed_by": "steward"
        },
        {
          "type": "recovery",
          "group": "Witnesses",
          "signed_by": "steward"
        },
        {
          "type": "member_exclude",
          "group": "Membership",
          "signed_by": "steward"
        },
        {
          "type": "member_readmit",
          "group": "Membership",
          "signed_by": "steward"
        },
        {
          "type": "account_close",
          "group": "Membership",
          "signed_by": "steward"
        },
        {
          "type": "own_open",
          "group": "OWN",
          "signed_by": "member"
        },
        {
          "type": "own_close",
          "group": "OWN",
          "signed_by": "steward"
        },
        {
          "type": "guardians_set",
          "group": "Member safety",
          "signed_by": "member"
        },
        {
          "type": "freeze",
          "group": "Member safety",
          "signed_by": "guardian"
        },
        {
          "type": "key_move",
          "group": "Member safety",
          "signed_by": "guardian"
        }
      ],
      "url": "https://nostr-kinds.letsbalance.life/kinds/#kind-43916"
    },
    {
      "kind": 43917,
      "title": "Day Seal",
      "layer": "both",
      "layers": [
        "directory",
        "circle"
      ],
      "replaceability": "regular",
      "replaceability_text": "Regular (kind 40000+); never deleted. The newest one is mirrored on root as 30915.",
      "publishers": "The node (a current witness), with at least q witness signatures inside (qs).",
      "content": "Empty.",
      "version": "0.3.0",
      "status": "draft",
      "description": "v0.3.0 — The daily checkpoint of a circle, once a day right after the morning, also on days without payments (decided) and on days without any block (then its range is empty). It names the day's morning boundary (the circle's morning hour of that day in its time zone), the seal before it (digest, day, boundary and what it covered), the last booking time it covers, its height and entry range, the digest and height of the last block (head), a root over the day's entries, the state root, the snapshot (43918 chunks), the morning's gravity totals, the sum 0, the world numbers (used, step, built), the rate quotes the day's entries named, the reserve and origin balances, the witness set and the circle key of the newest mirror at or below its last block (at the height of a key change already the new key), and the height of the circle's parameters in force (params); the witnesses sign it (qs, domain \"lb-seal/3|\") after recomputing everything. Payments never pause for the morning (decided 17 Oct 2026, C2): after the boundary, the day's morning blocks and payment blocks may interleave, and an account's grav entry is booked right before the first entry that touches it (visit before touch, 43911). The seal of day D covers every block booked before boundary(D) and, when blocks carry D's morning header (the morning blocks, and payment blocks with visits), every block up to and including the last of them (payment blocks booked during the morning among them); no block spans the boundary. So every block after its h_to books at or after boundary(D), and every block before its h_from books at or before the covers of the seal before it: this is what makes consecutive seals evidence that a note was not booked (8j). Nothing is salted and no count is withheld. A day without a seal is a public fact. A restorer that finds at least 2 independent 43924 ok statements for a seal may start from it. [clarification, 17 Oct 2026 (D4 review); proposal (D4 review, round 3, 17 Oct 2026): the complete list] A restorer from the seal of day D reads exactly: the seal; its snapshot chunks; every block whose first at is at or after boundary(D), up to h_to (none when the range ends before it: the next morning's averages need each account's balance over [boundary(D), boundary(D+1)), and the balance at boundary(D) is the snapshot balance less the moves of those blocks other than grav deducts, which count from the boundary; they also hold the current morning day's refusals; after an outage they include the catch-up blocks of earlier mornings in earlier seal ranges, and each grav deduct counts from its own morning's boundary [clarification, 19 Oct 2026 (D3 review)]); the block right before the first of them, or the seal's head block when there is none, whose last at must be before boundary(D), so no block after the boundary is left out [proposal (D3 review, 19 Oct 2026)]; the governance chain, mandatory: block 1 and every block with a roles entry up to g3|mirror_h, in height order, each signed by a quorum of the office the mirror before it puts in power, which shows from the pinned genesis on that the seal's quorum is the office in power (no block carries a pointer back to the previous roles block) [proposal (D3 review, 19 Oct 2026)]; the block at the height the state's g3|mirror_h names (its genesis or roles entry carries the mirror in office, in tag order); the blocks at the booked heights of the open o3|change lines (what each Heart change names: its relays, keys, witness, k or parameters, the key it excludes, readmits or closes, or the person an OWN process is about); and every block after h_to (the tail). Round 5 (23 Oct 2026, E-1): no rules record is read any more; the parameters are in the state. With these it judges the tail exactly as a replay from block 1 (test: circle B restored from its seal of 19 Oct, circle A from its seal of 16 Oct). Seal and tail alone cannot give the next gravity.",
      "tags": {
        "required": [
          {
            "tag": "c",
            "description": "the circle id"
          },
          {
            "tag": "m",
            "description": "\"<scope16>:<date>\""
          },
          {
            "tag": "day",
            "description": "[\"day\", <local date of the morning>, <n>]: n counts the seals from 1"
          },
          {
            "tag": "boundary",
            "description": "the unix time of the day's morning boundary (the circle's morning hour in its tz with the pinned tzdata; a local hour that occurs twice counts at its first occurrence, a skipped one at the first instant after the gap)"
          },
          {
            "tag": "prev",
            "description": "[\"prev\", <previous seal digest>, <its day>, <its boundary>, <its covers>]; [\"prev\", \"\"] for the first seal (n = 1), whose range starts at height 1 and seq 1"
          },
          {
            "tag": "covers",
            "description": "the last booking time the seal covers: the last at of block h_to; on a day without blocks, the previous seal's covers"
          },
          {
            "tag": "range",
            "description": "[\"range\", h_from, h_to, seq_from, seq_to]; a day without blocks has h_from = h_to + 1 and seq_from = seq_to + 1 (proposal)"
          },
          {
            "tag": "head",
            "description": "[\"head\", <digest of block h_to>, <h_to>]"
          },
          {
            "tag": "pay",
            "description": "[\"pay\", <RFC 6962 root over the canonical JSON bytes of the day's entries, in seq order>, <count>]"
          },
          {
            "tag": "state",
            "description": "[\"state\", <sparse Merkle root at h_to>, <line count>]"
          },
          {
            "tag": "snap",
            "description": "[\"snap\", <RFC 6962 root over the chunks' content bytes in index order>, <chunk count>, <total content bytes>]"
          },
          {
            "tag": "gravity",
            "description": "[\"gravity\", <date>, <moved, up to 20 digits>, <accounts>], always: moved = the sum of the deducts of the morning's grav entries in the range, accounts = the number of those grav entries [clarification, 17 Oct 2026 (D4 review)]"
          },
          {
            "tag": "sum",
            "description": "[\"sum\", \"0\"]"
          },
          {
            "tag": "world",
            "description": "[\"world\", <currency>, <used = balance of world>, <step = balance of world-step>, <built, up to 20 digits: Σ (balance + wave) over every account line that is not a system account or a project wallet, of any status, members who left included, since their money is still in the circle [clarification, 17 Oct 2026 (D1 review)]; the formula: proposal>]"
          },
          {
            "tag": "quotes",
            "description": "[\"quotes\", <RFC 6962 root over the distinct ids of the 43919 quotes the day's entries name, each once, as 32 raw bytes, sorted ascending>, <count of distinct ids>] [clarification, 17 Oct 2026 (D4 review)]"
          },
          {
            "tag": "reserve",
            "description": "[\"reserve\", <balance of the keyless reserve>]"
          },
          {
            "tag": "origin",
            "description": "[\"origin\", <balance of origin, signed: −start − granted + returned (decided 23 Oct 2026, E-3 and E-9 (b)); it may rise above −start, even above 0>] (the tag: proposal, 6c)"
          },
          {
            "tag": "signers",
            "description": "[\"signers\", <sha256 of the canonical JSON list of the current witnesses (until_h \"\") of the office after h_to, each [hex, operator, since_h, \"\"], sorted by hex>, q, n] [clarification, 17 Oct 2026 (D4 review)]"
          },
          {
            "tag": "circle_key",
            "description": "[\"circle_key\", <the circle key of the newest mirror at or below h_to>]: the state's g3|circle_key line at h_to; at the height of a key change already the new key, which signs the 30910 of that height (the 30915 head carries it to the root directory, so a reader picks the 30910 by it; proposal)"
          },
          {
            "tag": "params",
            "description": "[\"params\", <the height of the parameters in force at h_to: g3|params_h, 1 until the first params_effective>]"
          },
          {
            "tag": "qs",
            "description": "[\"qs\", <witness hex>, <signature over sha256(\"lb-seal/3|\" + the 32 digest bytes)>], at least q, sorted by HEX"
          },
          {
            "tag": "v",
            "description": "record version",
            "example": "3"
          }
        ],
        "optional": []
      },
      "tag_order": "c, m, day, boundary, prev, covers, range, head, pay, state, snap, gravity, sum, world, quotes, reserve, origin, signers, circle_key, params, qs…, v",
      "validation_rules": [
        "Tags in tag_order. A seal is judged with the office after its last block h_to, i.e. the newest mirror at or below h_to (the genesis mirror or the newest roles entry's, read from the ledger): the qs signatures verify over the domain-separated digest with at least q of its current witnesses; signers matches its witness set and circle_key its circle key, as the state's g3 lines at h_to do.",
        "boundary = the circle's morning hour of the day in its time zone (with the pinned tzdata; inside a clock change the first occurrence of a repeated hour, the first instant after a skipped one); prev describes the seal before exactly; covers never goes back.",
        "A circle's seal chain starts at its block 1: the first seal (n = 1, [\"prev\", \"\"]) has a range from height 1 and seq 1, never an empty one, so a second \"first\" seal for a later day is refused.",
        "[clarification, 17 Oct 2026 (D4 review)] One seal per day, no gap: the first seal is the seal of the first day whose boundary is later than block 1's at; each later seal is for the day after the seal before it, with n + 1 (after an outage the missed days are sealed in order). The day-chain checks apply to seals whose range lies on the chain a verifier replays; the seal at maximum lengths is a standalone fixture and gets only the checks that need no chain [clarification, 17 Oct 2026 (D4 review, round 3)]. A seal's completeness (no block before its boundary left out) needs block h_to + 1, or the next seal with an empty range from h_to + 1; without either it is unverifiable.",
        "Against the day's blocks: heights h_from to h_to linked by digests, head = digest and height of block h_to, covers = its last at, seq range, pay root and count, gravity totals, quotes root, state = the state root of block h_to; no block spans the boundary; with blocks that carry the day's morning header the range ends at the last of them, without them it ends before the boundary; the next block books at or after the boundary.",
        "Against its chunks: every chunk 0 … n−1, the snap root and bytes, the state root over every line, the sum of all balances 0, reserve, origin, world used and step read from the lines, circle_key and params read from the g3|circle_key and g3|params_h lines; with a params_effective in the range, params is the height of the last one.",
        "Two valid seals (two digests) for one day are a fork alarm: stop and report."
      ],
      "data_governance": "Public: roots, counts, the circle's world, reserve and origin numbers, its circle key and the height of its parameters in force.",
      "url": "https://nostr-kinds.letsbalance.life/kinds/#kind-43917"
    },
    {
      "kind": 43918,
      "title": "Snapshot Chunk",
      "layer": "both",
      "layers": [
        "directory",
        "circle"
      ],
      "replaceability": "regular",
      "replaceability_text": "Regular (kind 40000+); never deleted.",
      "publishers": "The node (a current witness); valid through the seal's roots.",
      "content": "Canonical JSON {\"l\": [state lines sorted by key]}.",
      "version": "0.3.0",
      "status": "draft",
      "description": "v0.3.0 — Part of a circle's full public snapshot at a daily seal: every line of the decision state (43911 state_lines: accounts, governance, open items such as projects and holds, booked acts and idem windows), sorted by key and cut into chunks of at most 100,000 bytes by bytes, never by a count. A chunk is valid only against its seal's snap and state roots; a reader verifies a chunk before showing anything from it. With the seal, the blocks of its range booked at or after its boundary and the blocks after it (43917), the snapshot restores a circle without replaying from genesis, including which acts were booked (a3 lines) and which Heart changes are open (o3|change lines), so a replayed act is refused the same way.",
      "tags": {
        "required": [
          {
            "tag": "c",
            "description": "the circle id"
          },
          {
            "tag": "m",
            "description": "\"<scope16>:<date>\" of the seal"
          },
          {
            "tag": "i",
            "description": "\"<scope16>:<date>:<index>\""
          },
          {
            "tag": "chunk",
            "description": "[\"chunk\", <index>, <count>]"
          },
          {
            "tag": "range",
            "description": "[\"range\", <first key>, <last key>]"
          },
          {
            "tag": "v",
            "description": "record version",
            "example": "3"
          }
        ],
        "optional": []
      },
      "tag_order": "c, m, i, chunk, range, v",
      "validation_rules": [
        "Lines are state lines of the formats in 43911 state_lines, sorted by key, each key once; range names the first and last key.",
        "All chunks of a seal together give its snap root, bytes, line count and state root, and their account lines sum to 0."
      ],
      "data_governance": "Public: every account's line by HEX key, every project and hold. No names.",
      "url": "https://nostr-kinds.letsbalance.life/kinds/#kind-43918"
    },
    {
      "kind": 43919,
      "title": "Rate Quote",
      "layer": "circle",
      "layers": [
        "circle"
      ],
      "replaceability": "regular",
      "replaceability_text": "Regular (kind 40000+); never deleted; validity is the expires tag, never NIP-40 expiration.",
      "publishers": "The node (proposer) of the quoting circle at created_at, as its ledger names it.",
      "content": "Empty.",
      "version": "0.3.0",
      "status": "draft",
      "description": "v0.3.0 — Repurposed: no longer an hourly rate of one key, but an offer of the receiving (seller's) circle (decided 16 Oct 2026, A7). Its node signs the rate of the source the circle chose itself (any source with a public description; the definitions gate no source), with the source's own time and a validity of at most the circle's quote_ttl_s (a circle parameter, 600 s by default; decided 23 Oct 2026, E-1: each circle sets its own, and both circles judge a quote by the quoting circle's value); a payer who accepts signs a note with both amounts and this quote's id, and both ledgers carry them. A quote binds only payers who sign a note naming it, and only while it is valid. A new circle also uses the old circle's quote to grant a newcomer's step across currencies (E-9 (b)). Start source (decided 16 Oct 2026): ecb-daily, the euro foreign exchange reference rates of the European Central Bank, read once a day by the node; the app always shows the rate's date. Said openly: the ECB states that its reference rates are for information only. Proposal: the node alerts the Circle Heart when its newest source rate is older than RATE_STALE_ALERT_S (120 h). The node keeps at most one live quote and publishes each quote to its circle's relays before handing it out; the payer's circle republishes every quote its blocks name.",
      "tags": {
        "required": [
          {
            "tag": "c",
            "description": "the circle id of the quoting (seller's, receiving) circle"
          },
          {
            "tag": "source",
            "description": "[\"source\", <source id = the circle's rate_source at created_at>, <the source's own time for this rate, unix>]; for ecb-daily the reference date at 00:00 UTC"
          },
          {
            "tag": "base",
            "description": "always EUR",
            "example": "EUR"
          },
          {
            "tag": "rate",
            "description": "[\"rate\", <USD|GBP>, <whole ppm: units of that currency per 1 EUR × 1,000,000>], once per currency the source gives; EUR is 1,000,000 and implicit",
            "example": "[\"rate\",\"USD\",\"1085000\"]"
          },
          {
            "tag": "expires",
            "description": "unix, at most created_at + quote_ttl_s of the quoting circle (its parameters in force; the payer's circle reads the value in that circle's ledger)"
          },
          {
            "tag": "prev",
            "description": "this circle's previous 43919 id, or \"\" on its first quote"
          },
          {
            "tag": "v",
            "description": "record version",
            "example": "3"
          }
        ],
        "optional": []
      },
      "tag_order": "c, source, base, rate…, expires, prev, v",
      "validation_rules": [
        "Valid for a booking when: signed by that circle's node at created_at (the office at a time t is that of the newest mirror booked at or before t: its genesis or roles entry's at ≤ t [clarification, 17 Oct 2026 (D4 review)]; so a quote signed in the very second of a node change is the new node's, although that block was still ordered by the old one [clarification, 17 Oct 2026 (D4 review, round 3)]); c is that circle; the source id is its rate_source at created_at; source time ≤ created_at < expires ≤ created_at + quote_ttl_s of the quoting circle; the payer circle's xout at ≤ expires (for a newcomer's grant, the new circle's join at ≤ expires); to_amount is the conversion, exactly (test_vectors.conversion). Refusals: stale_quote (expired), bad_quote (anything else).",
        "Audit checks, not booking conditions: the circle's prev chain has no gap, and for one source id the source time never goes back; a break is published as a 43924 fail.",
        "No witness and no app reads the outside source; only the quoting circle's node does. There is never a fallback to 38888 or a fixed rate."
      ],
      "data_governance": "Public: rates, times and the quoting circle.",
      "url": "https://nostr-kinds.letsbalance.life/kinds/#kind-43919"
    },
    {
      "kind": 43921,
      "title": "Reference",
      "layer": "circle",
      "layers": [
        "circle"
      ],
      "replaceability": "regular",
      "replaceability_text": "Regular (kind 40000+); never deleted. The reference entry in the ledger is the authority; this event is its findable copy.",
      "publishers": "The node (a current witness) of the issuing circle, right after the block with the reference entry has its quorum.",
      "content": "Empty.",
      "version": "0.3.0",
      "status": "draft",
      "description": "v0.3.0 — New (decided 23 Oct 2026, E-9). The findable copy of a reference. When a member says \"I want to leave\" (a booked leave act), the circle's ledger issues the reference by itself once the conditions hold (no minus; no open OWN process, E-9 (a)): the rule entry reference of the key with its wave, the step the person built. Right after the block that books it has its quorum, the circle's node signs this event and publishes it on the circle's relays. Without a reference nobody moves to another circle: a new circle admits a key whose newest member home (30916) names another circle only with a valid reference of that circle (a rule for every circle, not a setting), and the found act of a new circle names its founder's reference from the parent circle (E-8). The ledger entry is the authority, under the witnesses' quorum; this event adds the node's short report from the circle's public blocks (when the membership began and ended, the projects the person published and those paid to them), which anyone checks against those blocks. The new circle checks the reference against the old circle's block it names: that block carries the reference entry of the person with the same wave under a valid quorum of the old circle's witnesses in office at its height (the office read from the old circle's ledger, as for the 8j evidence); its member_join then names the reference (ref, src, g). With a wave above 0 the new circle opens the same step for the newcomer and pays its amount to the old circle's community (reference_grant), and the old circle closes the account and returns that amount to its origin (reference_return): both communities hold what they held before (E-9 (b)). A key with no member home anywhere was never a member and needs no reference (proposal). Said openly: one person with two keys, or a deleted member home, is not caught; that needs Lana's person check. The person appears by HEX key only: no name, no bank data, nothing of an OWN process but that none is open.",
      "tags": {
        "required": [
          {
            "tag": "c",
            "description": "the circle id of the issuing (old) circle",
            "example": "<circle id>"
          },
          {
            "tag": "p",
            "description": "the person's HEX key",
            "example": "<hex>"
          },
          {
            "tag": "block",
            "description": "[\"block\", \"<height>\", <digest>]: the block of the issuing circle that books the reference entry",
            "example": "[\"block\",\"4\",\"<hex>\"]"
          },
          {
            "tag": "g",
            "description": "the issuing circle's genesis digest",
            "example": "<hex>"
          },
          {
            "tag": "currency",
            "description": "the issuing circle's currency (the wave's)",
            "example": "EUR"
          },
          {
            "tag": "wave",
            "description": "the step (wave) the person built, in minor units of that currency, as the reference entry states it",
            "example": "300"
          },
          {
            "tag": "own",
            "description": "\"0\": a reference is issued only while no OWN process about the person is open (decided 23 Oct 2026, E-9 (a))",
            "example": "0"
          },
          {
            "tag": "joined",
            "description": "unix: the at of the newest member_join of the person in the issuing circle",
            "example": "<unix>"
          },
          {
            "tag": "left",
            "description": "unix: the at of the entry that booked the leave act; joined is not after left",
            "example": "<unix>"
          },
          {
            "tag": "published",
            "description": "[\"published\", \"<count>\"]: the projects the person published (project_propose) in the issuing circle",
            "example": "0"
          },
          {
            "tag": "took_part",
            "description": "[\"took_part\", \"<count>\"]: the projects paid to the person in the issuing circle",
            "example": "0"
          },
          {
            "tag": "v",
            "description": "record version",
            "example": "3"
          }
        ],
        "optional": [
          {
            "tag": "e (published)",
            "description": "[\"e\", <project_propose id>, \"\", \"published\"], right after published: at most min(100, count), newest first, each once"
          },
          {
            "tag": "e (took_part)",
            "description": "[\"e\", <project_propose id>, \"\", \"took_part\"], right after took_part: at most min(100, count), newest first, each once"
          }
        ]
      },
      "tag_order": "c, p, block, g, currency, wave, own, joined, left, published, e (published)…, took_part, e (took_part)…, v",
      "validation_rules": [
        "Tags in tag_order, nothing else; content empty; own is \"0\"; joined and left are unix times, joined not after left; at most min(100, count) project ids after each count, each once.",
        "Signed by a witness of the issuing circle (its node); c, g and currency are that circle's.",
        "The block it names (height and digest) is the issuing circle's and carries a rule entry reference whose party is p and whose wave is this wave; the new circle checks that block's quorum with the office in force at its height, and that the issuing circle is the one the key's newest member home names.",
        "[proposal] The report (joined, left, published, took_part and the ids) is the node's summary of the circle's public blocks, which anyone checks against them; the new circle relies only on the reference entry and its wave."
      ],
      "data_governance": "Public: the person's HEX key, the circle, the step built, the times the membership began and ended and the project ids. No name, no bank data, nothing of an OWN process but that none is open.",
      "url": "https://nostr-kinds.letsbalance.life/kinds/#kind-43921"
    },
    {
      "kind": 43924,
      "title": "Statement",
      "layer": "circle",
      "layers": [
        "circle"
      ],
      "replaceability": "regular",
      "replaceability_text": "Regular (kind 40000+); never deleted.",
      "publishers": "Any witness, verifier or auditor.",
      "content": "Short text, at most 500 characters on one line.",
      "version": "0.3.0",
      "status": "draft",
      "description": "v0.3.0 — A signed attestation or challenge about a circle's ledger: each witness's daily ok with the state root it computed and a root over every digest it signed that day (proposal Q23), the daily public restore check, or any verifier's challenge (fail, equivocation, missing, ignored) carrying its evidence. A statement pauses nothing by itself; it is public evidence every member's app can show. Its text is public for ever: the app shows \"public for ever; do not write names, personal or bank data\".",
      "tags": {
        "required": [
          {
            "tag": "c",
            "description": "the circle id"
          },
          {
            "tag": "about",
            "description": "seal, range, block, signer or restore"
          },
          {
            "tag": "target",
            "description": "exactly one: [\"target\", <digest>, \"h:<height>\" | \"d:<day>\"] for a block or seal, or [\"e\", <id>, \"\", \"target\"] for any other event"
          },
          {
            "tag": "result",
            "description": "ok, fail, equivocation, missing or ignored"
          },
          {
            "tag": "v",
            "description": "record version",
            "example": "3"
          }
        ],
        "optional": [
          {
            "tag": "range",
            "description": "[\"range\", from, to]: the heights whose blocks the author checked for this statement: from the first block it replayed (1 when it replayed from genesis; h_from of the target seal when it started from the state of a seal it had verified before) to h_to for an ok, or to the last height it could check for missing or fail [clarification, 17 Oct 2026 (D4 review)]"
          },
          {
            "tag": "state",
            "description": "[\"state\", <root the author computed>]; required for an ok about a seal or a restore"
          },
          {
            "tag": "votes",
            "description": "[\"votes\", <RFC 6962 root over the 32 raw bytes of each block digest the author signed among the blocks of the range (for a seal: the sealed day's blocks, the seal's range, also when the statement's range starts at block 1 [clarification, 17 Oct 2026 (D4 review, round 3)]; not the calendar day of signing), in height order>, <count>] (proposal Q23; the leaves: [clarification, 17 Oct 2026 (D4 review)])"
          },
          {
            "tag": "evidence",
            "description": "[\"evidence\", <digest>, \"h:<height>\" | \"d:<day>\"] for blocks and seals, [\"e\", <id>, \"\", \"evidence\"] for other events; required for fail, equivocation, missing and ignored"
          }
        ]
      },
      "tag_order": "c, about, target or e (target), range?, result, state?, votes?, evidence…, e (evidence)…, v",
      "validation_rules": [
        "Tags in tag_order; a statement other than ok names its evidence.",
        "missing also means the author could not check (the missing event as evidence); a statement is never ok about what was not checked [clarification, 17 Oct 2026 (D4 review)].",
        "A verifier checks a rej's reason only with the events that the reasons before it in refusal_reasons need (a bad_quote or stale_quote needs the quote and, across circles, the partner's xout time); without them the reason is unverifiable, never assumed [clarification, 17 Oct 2026 (D4 review, round 3)]."
      ],
      "data_governance": "Public: the author's key, the result and its evidence.",
      "url": "https://nostr-kinds.letsbalance.life/kinds/#kind-43924"
    }
  ],
  "retired": {
    "in_0_3_0": [
      {
        "kind": 43920,
        "note": "Retired (decided 23 Oct 2026, E-1): the world-wide BSA Rules record of the earlier drafts of 0.3.0 (never published; 0 events on the Lana relays). Each circle sets its own parameters now. The number stays reserved and is never reused."
      }
    ],
    "since_0_1_0": [
      30911,
      30912,
      30913,
      30914,
      43912,
      43913,
      43914,
      43915
    ],
    "unused": [
      43922,
      43923
    ],
    "not_defined": [
      43925
    ],
    "reserved_for_later": [
      30917
    ]
  },
  "fixed_values": [
    {
      "name": "XCHECK_MARGIN_S",
      "value": "60",
      "unit": "s",
      "status": "proposal",
      "meaning": "clock margin of the 8j check: the receiving circle's blocks are read from the payer circle's xout at minus this"
    },
    {
      "name": "AT_TOLERANCE_S",
      "value": "5",
      "unit": "s",
      "status": "decided practice of the design (witnesses check at within ±5 s); the value: proposal",
      "meaning": "a booking time may precede the booked note's or act's created_at by at most this, and witnesses refuse an at more than this away from their clock"
    },
    {
      "name": "QUOTE_MARGIN_S",
      "value": "120",
      "unit": "s",
      "status": "proposal",
      "meaning": "the node makes a new quote when the live one has less than this left"
    },
    {
      "name": "RATE_STALE_ALERT_S",
      "value": "432000",
      "unit": "s",
      "status": "proposal (120 h)",
      "meaning": "the node alerts the Heart when its newest source rate is older than this"
    },
    {
      "name": "GRAVITY_NOTICE_S",
      "value": "2592000",
      "unit": "s",
      "status": "decided 23 Oct 2026 (E-11 (3C): at least 30 days)",
      "meaning": "the least public notice of a parameter change that makes gravity take more (a higher band or excess rate, a shorter transition, a rest that comes sooner), whatever change_notice_s is"
    }
  ],
  "circle_parameters": [
    {
      "name": "band_ppm_day",
      "start": "330",
      "min": "0",
      "max": "330",
      "unit": "ppm of the plus within the wave, per day",
      "meaning": "gravity on the plus up to the wave (today 1 % a month: 1 − (1 − 0.01)^(1/30.4375) a day, rounded to whole ppm as today's app does)"
    },
    {
      "name": "excess_ppm_day",
      "start": "22840",
      "min": "0",
      "max": "22840",
      "unit": "ppm of the plus above the wave, per day",
      "meaning": "gravity on the plus above the wave (today a half-life of 30 days)"
    },
    {
      "name": "transition_days",
      "start": "60",
      "min": "60",
      "max": "3650",
      "unit": "days",
      "meaning": "after a first receipt the excess rate is as gentle as the band for this long"
    },
    {
      "name": "rest_after_days",
      "start": "183",
      "min": "0",
      "max": "3650",
      "unit": "days (0 = off)",
      "meaning": "a plus left unused this long flows at the excess rate"
    },
    {
      "name": "wave_cap",
      "start": "100000000",
      "min": "1",
      "max": "999999999999999",
      "unit": "minor units",
      "meaning": "the most a member's wave can grow to"
    },
    {
      "name": "w_max_s",
      "start": "1",
      "min": "1",
      "max": "10",
      "unit": "s",
      "meaning": "a block closes at the latest this long after its first entry"
    },
    {
      "name": "vote_min_s",
      "start": "259200",
      "min": "86400",
      "max": "2592000",
      "unit": "s",
      "meaning": "the shortest vote a proposer may set; a project or motion with a shorter duration is refused not_allowed"
    },
    {
      "name": "vote_max_s",
      "start": "1209600",
      "min": "86400",
      "max": "2592000",
      "unit": "s",
      "meaning": "the longest vote a proposer may set"
    },
    {
      "name": "project_approvals",
      "start": "3",
      "min": "3",
      "max": "9",
      "unit": "Heart members",
      "meaning": "Heart members in office whose newest vote is \"for\" that a project (and a motion) needs at its vote's end, with no member's \"against\"; on a project the proposer's and the recipient's \"for\" do not count; on a motion the proposer's own \"for\" counts (decided 23 Oct 2026, E-11 (2A)); a circle with fewer Heart members who may vote \"for\" opens no project, and its start stays in the reserve"
    },
    {
      "name": "close_notice_s",
      "start": "259200",
      "min": "86400",
      "max": "2592000",
      "unit": "s",
      "meaning": "public notice between the k-th project_close and the project_return"
    },
    {
      "name": "receive_lapse_s",
      "start": "7776000",
      "min": "604800",
      "max": "31536000",
      "unit": "s",
      "meaning": "a receiving project not full this long after it opened lapses and returns its money to the reserve"
    },
    {
      "name": "open_lapse_s",
      "start": "2592000",
      "min": "604800",
      "max": "31536000",
      "unit": "s",
      "meaning": "a project that has not opened this long after its publication lapses (a passed project whose consent never comes)"
    },
    {
      "name": "change_notice_s",
      "start": "259200",
      "min": "86400",
      "max": "2592000",
      "unit": "s",
      "meaning": "public notice between the k-th act of a Heart change (the circle key, witnesses, Heart members, k, relays, recovery) or a resignation and its roles entry; the least notice of a parameter change"
    },
    {
      "name": "xcheck_s",
      "start": "604800",
      "min": "86400",
      "max": "2592000",
      "unit": "s",
      "meaning": "after this long without xdone or xundo the payer's circle reads the receiving circle's sealed ledger (8j); its own value, recorded at the xout"
    },
    {
      "name": "quote_ttl_s",
      "start": "600",
      "min": "300",
      "max": "3600",
      "unit": "s",
      "meaning": "a rate quote of this circle's node is valid at most this long; both circles judge a quote by the value of the circle that signed it"
    },
    {
      "name": "note_ttl_s",
      "start": "600",
      "min": "60",
      "max": "3600",
      "unit": "s",
      "meaning": "a 43910 note's expires is at most created_at + this; each circle applies its own value to the notes it books"
    },
    {
      "name": "act_ttl_s",
      "start": "604800",
      "min": "86400",
      "max": "2592000",
      "unit": "s",
      "meaning": "every 43916 act carries expires at most created_at + this and is valid only before it"
    },
    {
      "name": "rej_per_author_per_day",
      "start": "20",
      "min": "1",
      "max": "1000",
      "unit": "refusals",
      "meaning": "refusals of one author booked per morning day; above it the intake answers 429 and books nothing"
    },
    {
      "name": "exclusion_s",
      "start": "7776000",
      "min": "86400",
      "max": "31536000",
      "unit": "s",
      "meaning": "how long an exclusion runs: the key cannot join; after it the person may apply, and only the Heart readmits"
    },
    {
      "name": "invite_ttl_s",
      "start": "604800",
      "min": "3600",
      "max": "2592000",
      "unit": "s",
      "meaning": "how long a member's invitation stays valid after its booking; one join uses it"
    },
    {
      "name": "invite_only",
      "start": "0",
      "min": "0",
      "max": "1",
      "unit": "0 open, 1 invite only",
      "meaning": "1: a join must name an open invitation of a member (an excluded key's application needs none: the Heart decides). A found act names 0: an invitation is a member's act and a new circle has no member yet, so a circle founded by invitation only could never take its first member; the Heart turns it on by param_propose once members have joined"
    },
    {
      "name": "max_members",
      "start": "0",
      "min": "0",
      "max": "999999999",
      "unit": "members (0 = no limit)",
      "meaning": "the most members (lines member or frozen); a join beyond it waits on the waiting list and comes in by rule, in booking order, when a place frees"
    }
  ]
}
