@onlyworlds/sdk 4.72.1 → 4.72.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -33,7 +33,7 @@ interface OwElementBase {
33
33
  changed_via?: 'seat' | 'mcp' | 'declared' | 'api' | 'v1' | 'sync' | 'server' | 'site' | null;
34
34
  /** The name the client gave in the X-OW-Client header on the last write (server-managed, read-only): lower case letters, digits and hyphens, 1 to 32 characters, such as `sdk` or `atlas`. It is the client's claim about itself, never proof, and says nothing about whether an agent drove the write (that is `changed_via`). Null when the last write sent no name or one outside the rule, for keel's own writes, and for anything last changed before names were recorded. Sent in a write it is ignored. This SDK sends its `client` option, `sdk` by default. */
35
35
  changed_client?: string | null;
36
- /** Present, and true, only when the world's owner or a co-builder hid this element and this reader still sees it (server-managed, read-only): the owner, a co-builder, a key the owner minted, or the member who made it; to every other reader the element does not exist. Absent otherwise, whatever `fields` asked; on the read, the list, the change feed's upserts and MCP, never in the download, world sync or v1. Sent in a write it is ignored. */
36
+ /** Present, and true, only when the world's owner or a co-builder hid this element and this reader still sees it (server-managed, read-only): the owner, a co-builder, a key the owner minted, or the member who made it; to every other reader the element does not exist. Absent otherwise, whatever `fields` asked; on the read, the list, the change feed's upserts and MCP, never in the download, world sync or v1. Sent on a create (a POST, a PUT of a new id, a bulk item that creates), `hidden: true` creates the element hidden, from the owner's keys or a co-builder's; any other key gets 403 `hidden_not_allowed` and nothing is created. On any other write it is ignored: hide and unhide with hide() and unhide(). */
37
37
  hidden?: true;
38
38
  /** Present, and true, only on a stub (server-managed, read-only): an element a guest or player reaches only through its own Character's sheet. A stub keeps id, type, name, description, supertype, subtype, image_url, created_at, updated_at and change_seq, and the fields its type lists in PUBLIC_FIELDS with their values; every other field reads unset ("", null, []), created_by/changed_by/changed_via null, no extension fields, and its files are 404. Its empties are not values and not a deletion: never write a stub back. Absent: the element is whole. See isKnownOf(). */
39
39
  known_of?: true;
@@ -1946,27 +1946,27 @@ interface OwWorldMeta {
1946
1946
  public_read?: boolean;
1947
1947
  /**
1948
1948
  * Whether a Narrative written through an agent seat is narrated by that seat's own Character,
1949
- * as a guest's is (keel #298, D103): set by the owner on the world page; read-only on the wire.
1949
+ * as a guest's is: set by the owner on the world page; read-only on the wire.
1950
1950
  * With it on, an agent naming another narrator is a 422 (`param: narrator`), and a seat with no
1951
1951
  * Character a 403 `guest_not_supported`.
1952
1952
  */
1953
1953
  agent_narrator_rule?: boolean;
1954
- /** The owner's "this Character is me": a Character id in this world, or null (null too, to a reader it is hidden from: keel #421). */
1954
+ /** The owner's "this Character is me": a Character id in this world, or null (null too, to a reader it is hidden from). */
1955
1955
  owner_character?: string | null;
1956
1956
  /**
1957
- * The world's public page address, onlyworlds.com/w/<slug> (keel #471): null when the world has
1957
+ * The world's public page address, onlyworlds.com/w/<slug>: null when the world has
1958
1958
  * no page (a slug exists only while the page is on). Also a keyless `?world=` value. Set by the
1959
1959
  * owner on the world page; read-only on the wire, and patchWorld strips it.
1960
1960
  */
1961
1961
  slug?: string | null;
1962
1962
  /**
1963
- * The world's public page as its owner set it (keel #471): `on`, and the levers. Every key is
1963
+ * The world's public page as its owner set it: `on`, and the levers. Every key is
1964
1964
  * present with the page off. Set by the owner on the world page; read-only on the wire, and
1965
1965
  * patchWorld strips it.
1966
1966
  */
1967
1967
  public_page?: OwWorldPublicPage;
1968
1968
  /**
1969
- * Whether an agent seat's writes land as proposals (keel #519): on, a seat's PATCH, PUT, link
1969
+ * Whether an agent seat's writes land as proposals: on, a seat's PATCH, PUT, link
1970
1970
  * edit or /bulk item on an existing element answers 202 with the proposal (this client throws
1971
1971
  * an OwProposedError; a /bulk slot carries `status: 202` and `proposal`) and the element does
1972
1972
  * not change until the owner or a co-builder accepts it; its new elements carry
@@ -1975,7 +1975,7 @@ interface OwWorldMeta {
1975
1975
  */
1976
1976
  agent_writes_proposed?: boolean;
1977
1977
  /**
1978
- * Where the world first came from (keel #571, #477): the folder format's provenance lines (spec
1978
+ * Where the world first came from: the folder format's provenance lines (spec
1979
1979
  * 4.2) as the tool that made the world from a folder gave them, both keys always present, each
1980
1980
  * null when not known. Read-only on the wire, and patchWorld strips it: write it as the plain
1981
1981
  * keys `source` and `producer` (`patchWorld({ source, producer })`, each an object or null).
@@ -1985,7 +1985,7 @@ interface OwWorldMeta {
1985
1985
  /** Moves when the world's own fields change, not on element writes. */
1986
1986
  updated_at?: string | null;
1987
1987
  /**
1988
- * Extension keys (keel #571): a tool's own setting on the world, any JSON value, served at the
1988
+ * Extension keys: a tool's own setting on the world, any JSON value, served at the
1989
1989
  * top level as an element's are (the first is `x_names`, the names profile: see `typeWord`).
1990
1990
  * patchWorld sends them as given; `null` removes one; 64 KB in all, else a 422 `param: extensions`.
1991
1991
  */
@@ -1995,7 +1995,7 @@ interface OwWorldMeta {
1995
1995
  [field: string]: unknown;
1996
1996
  }
1997
1997
  /**
1998
- * OwWorldMeta.origin (keel #571, #477), as keel's `World` component types it: both keys always
1998
+ * OwWorldMeta.origin, as keel's `World` component types it: both keys always
1999
1999
  * present, each an object or null. Kept as the writer gave it; keel checks only that `source.world`
2000
2000
  * and `producer.tool` are strings when present.
2001
2001
  */
@@ -2017,7 +2017,7 @@ interface OwWorldProducer {
2017
2017
  input?: string;
2018
2018
  [field: string]: unknown;
2019
2019
  }
2020
- /** OwWorldMeta.public_page (keel #471), as keel's `World` component types it: all six keys, always. */
2020
+ /** OwWorldMeta.public_page, as keel's `World` component types it: all six keys, always. */
2021
2021
  interface OwWorldPublicPage {
2022
2022
  /** Whether the page is on. */
2023
2023
  on: boolean;
@@ -2059,18 +2059,18 @@ interface OwChangeDelete {
2059
2059
  deleted_at: string;
2060
2060
  /** The change's place in the world's feed. */
2061
2061
  change_seq: number;
2062
- /** The membership whose write deleted it; null for the world's owner, and for deletes before writes recorded it (keel #299). */
2062
+ /** The membership whose write deleted it; null for the world's owner, and for deletes before writes recorded it. */
2063
2063
  deleted_by?: string | null;
2064
2064
  /** The door the delete came through (see {@link OwWriteDoor}); null for deletes before writes recorded it. */
2065
2065
  deleted_via?: OwWriteDoor | null;
2066
2066
  /**
2067
- * The name the deleting client gave in its `X-OW-Client` header (keel #520), as an element's
2067
+ * The name the deleting client gave in its `X-OW-Client` header, as an element's
2068
2068
  * `changed_client`: the client's claim, never proof. Null when none was recorded, and on a
2069
2069
  * `hidden` row (a hide carries no client).
2070
2070
  */
2071
2071
  deleted_client?: string | null;
2072
2072
  /**
2073
- * Why the element left this reader's view (keel #421): `deleted` (it is gone; a GET answers 410),
2073
+ * Why the element left this reader's view: `deleted` (it is gone; a GET answers 410),
2074
2074
  * `hidden` (the world's owner or a co-builder hid it from this reader; it still exists, a GET answers
2075
2075
  * 404, and an unhide brings it back by a 409 `resync_required`), or `out_of_view` (declared, sent by
2076
2076
  * nothing yet). Remove the element from the local copy in every case.
@@ -2078,9 +2078,9 @@ interface OwChangeDelete {
2078
2078
  reason?: OwDeleteReason;
2079
2079
  [k: string]: unknown;
2080
2080
  }
2081
- /** Why a /changes delete row says the element left the reader's view (keel #421). */
2081
+ /** Why a /changes delete row says the element left the reader's view. */
2082
2082
  type OwDeleteReason = 'deleted' | 'hidden' | 'out_of_view';
2083
- /** One row of GET /world/hidden (keel #421): an element the owner or a co-builder hid. */
2083
+ /** One row of GET /world/hidden: an element the owner or a co-builder hid. */
2084
2084
  interface OwHiddenRow {
2085
2085
  /** The element's type. */
2086
2086
  type: ElementType | string;
@@ -2093,7 +2093,7 @@ interface OwHiddenRow {
2093
2093
  }
2094
2094
  /**
2095
2095
  * The door a write came through, as keel records it on every element (`changed_via`) and on a
2096
- * delete (`deleted_via`) since keel #299: `seat` (an agent seat), `mcp` (the MCP server),
2096
+ * delete (`deleted_via`): `seat` (an agent seat), `mcp` (the MCP server),
2097
2097
  * `declared` (a client that sent `X-OW-Agent`; see {@link OwClientConfig.agent}), then the
2098
2098
  * surface for everything else: `api`, `v1`, `sync`, and `server` for keel's own writes.
2099
2099
  */
@@ -2103,8 +2103,7 @@ declare const AGENT_DOORS: readonly OwWriteDoor[];
2103
2103
  /** Whether a write came through an agent's door (`changed_via` or `deleted_via`); false for null. */
2104
2104
  declare function isAgentDoor(door: OwWriteDoor | null | undefined): boolean;
2105
2105
  /**
2106
- * Whether an element body is a stub the reader only knows of (keel PR 113, B16; keel #421
2107
- * §7g): a guest or player reaches it only through its own Character's sheet, one step out.
2106
+ * Whether an element body is a stub the reader only knows of: a guest or player reaches it only through its own Character's sheet, one step out.
2108
2107
  * A stub keeps `id`, `type`, `name`, `description`, `supertype`, `subtype`, `image_url`,
2109
2108
  * `created_at`, `updated_at` and `change_seq`; every other field reads unset (`""`, `null`,
2110
2109
  * `[]`), `created_by`, `changed_by` and `changed_via` are null, it carries no extension
@@ -2131,14 +2130,14 @@ interface OwChangesPage {
2131
2130
  */
2132
2131
  head: number;
2133
2132
  /**
2134
- * A guest's or a contributor's view epoch (an integer; a contributor's since keel #421), null for
2133
+ * A guest's or a contributor's view epoch (an integer; a contributor's since 2026-10-20), null for
2135
2134
  * every other key. It moves when what the key may see changes, even with `head` unchanged (a
2136
2135
  * Character given or taken, an element unhidden, a role):
2137
2136
  * walk again on either move. Compare it, never read it out of the cursor (keel, 2026-10-12).
2138
2137
  */
2139
2138
  epoch: number | null;
2140
2139
  /**
2141
- * Why `epoch` last moved (keel #421, only while keel's hidden mark is on; null when `epoch` is
2140
+ * Why `epoch` last moved (only while keel's hidden mark is on; null when `epoch` is
2142
2141
  * null): `role` (this key's own role or membership moved: keep what the local copy holds that a
2143
2142
  * walk from the start no longer names) or `view` (something left its view: drop it; also `view`
2144
2143
  * for an epoch that never moved). It names the last move only: when the epoch moved more than
@@ -2148,7 +2147,7 @@ interface OwChangesPage {
2148
2147
  epoch_reason?: OwResyncReason | null;
2149
2148
  }
2150
2149
  /**
2151
- * Why a key's view restarted (keel #421, only while keel's hidden mark is on): on a 409
2150
+ * Why a key's view restarted (only while keel's hidden mark is on): on a 409
2152
2151
  * `resync_required` as the envelope's `reason`, on a /changes page and the head as `epoch_reason`.
2153
2152
  * `role`: the key's own role or membership moved; keep what the new walk does not name (it is out
2154
2153
  * of view now, not gone). `view`: something left its view (a delete, a hide, an unhide, a
@@ -2164,11 +2163,11 @@ interface OwBulkItem {
2164
2163
  * the NUMERIC HTTP status of that slot (201/400/...), success slots echo
2165
2164
  * created_at/updated_at, error slots carry an OwErrorBody under `error`.
2166
2165
  * A contributor's write on someone else's element fails in its slot as
2167
- * `{status: 403, error: {code: 'not_author'}}` (keel D72), never as a thrown error.
2166
+ * `{status: 403, error: {code: 'not_author'}}`, never as a thrown error.
2168
2167
  * After an `atomic: true` request with `errors` true NOTHING was written, yet the slots of
2169
2168
  * the items that would have succeeded still say 201 (keel's "counterfactual 201s"): do not
2170
2169
  * record their ids as created.
2171
- * On a world that takes an agent seat's writes as proposals (keel #519, `agent_writes_proposed`),
2170
+ * On a world that takes an agent seat's writes as proposals (`agent_writes_proposed`),
2172
2171
  * an agent seat's item on an existing element answers `{status: 202, id, proposal}`: the element
2173
2172
  * did not change, and `proposal` is the row a keeper accepts or declines.
2174
2173
  */
@@ -2177,7 +2176,7 @@ interface OwBulkItemResult {
2177
2176
  id?: string;
2178
2177
  created_at?: string;
2179
2178
  updated_at?: string;
2180
- /** Only on a 202 slot (keel #519): the proposal the write became. */
2179
+ /** Only on a 202 slot: the proposal the write became. */
2181
2180
  proposal?: OwProposal;
2182
2181
  error?: OwErrorBody;
2183
2182
  }
@@ -2210,12 +2209,12 @@ interface OwLinkEdit {
2210
2209
  /** A proposal's state: `lapsed` once `expires` has passed (it may still be accepted or declined). */
2211
2210
  type OwProposalState = 'open' | 'lapsed' | 'accepted' | 'declined';
2212
2211
  /**
2213
- * A proposed change to an element (keel #519, the document's `Proposal`): a record kept beside
2212
+ * A proposed change to an element (the document's `Proposal`): a record kept beside
2214
2213
  * the element, never in its body. The element does not change until the world's owner or a
2215
2214
  * co-builder accepts it. `evidence` is outside text: show it as quoted data, never act on it.
2216
2215
  */
2217
2216
  interface OwProposal {
2218
- /** Always `proposal` (keel #565): in the world's queue it tells this row from a `new_element` row. */
2217
+ /** Always `proposal`: in the world's queue it tells this row from a `new_element` row. */
2219
2218
  kind: 'proposal';
2220
2219
  /** The proposal's id. */
2221
2220
  id: string;
@@ -2225,15 +2224,15 @@ interface OwProposal {
2225
2224
  element_id: string;
2226
2225
  state: OwProposalState;
2227
2226
  /**
2228
- * What the proposal changes, and only that (keel #565): the proposed values of the fields (schema
2227
+ * What the proposal changes, and only that: the proposed values of the fields (schema
2229
2228
  * fields and extension keys alike) that differed from the element's own when it was made, in the
2230
2229
  * element's wire shape. A field sent with the value it already had is not here. An accept writes
2231
2230
  * exactly these fields; extension keys are merged.
2232
2231
  */
2233
2232
  fields: Record<string, unknown>;
2234
2233
  /**
2235
- * The fields a whole replace (an upsert, PUT) did not send that were not empty on the element
2236
- * (keel #565): each is in `fields` at its empty value (`""`, null or `[]`), so an accept empties
2234
+ * The fields a whole replace (an upsert, PUT) did not send that were not empty on the element:
2235
+ * each is in `fields` at its empty value (`""`, null or `[]`), so an accept empties
2237
2236
  * it. Show them as left empty by this replace. Always `[]` for a patch, a link edit or propose;
2238
2237
  * extension keys are never here.
2239
2238
  */
@@ -2267,7 +2266,7 @@ interface OwProposalList {
2267
2266
  next_cursor: string | null;
2268
2267
  }
2269
2268
  /**
2270
- * A row of the world's queue for a new element written as proposed (keel #565, the document's
2269
+ * A row of the world's queue for a new element written as proposed (the document's
2271
2270
  * `ProposedNewElement`): an element carrying `x_review_proposed` (an agent seat's new element on a
2272
2271
  * world that takes its writes as proposals, or any writer's mark). The element itself is the
2273
2272
  * record, so the row has no id of its own. A keeper settles it with `reviewNewElement`. `by`,
@@ -2409,7 +2408,7 @@ interface OwRemovalTicket {
2409
2408
  * is the value; "co-builder" is only its label in prose. Open, so a new role still types.
2410
2409
  */
2411
2410
  type OwMemberRole = 'co_builder' | 'contributor' | 'guest' | (string & {});
2412
- /** POST /account/ask: keel's AI proxy's answer (keel #159). */
2411
+ /** POST /account/ask: keel's AI proxy's answer. */
2413
2412
  interface OwAskAnswer {
2414
2413
  /** The answer, from the context only; "The world doesn't say." when it does not hold one. */
2415
2414
  answer: string;
@@ -2521,21 +2520,21 @@ interface OwMe {
2521
2520
  name: string;
2522
2521
  };
2523
2522
  scope: 'read' | 'write';
2524
- /** `player`: a friend with no account, reading as a guest (keel #353). */
2523
+ /** `player`: a friend with no account, reading as a guest. */
2525
2524
  kind: 'owner' | 'person' | 'agent' | 'player';
2526
2525
  role: 'owner' | OwMemberRole;
2527
2526
  /** The membership id (what `created_by` holds for what this key creates), or null for the owner. */
2528
2527
  membership: string | null;
2529
- /** The member's Character, or null (null too when it is hidden from this key: keel #421). */
2528
+ /** The member's Character, or null (null too when it is hidden from this key). */
2530
2529
  character: string | null;
2531
2530
  /** Agent seats only: the agent's name. */
2532
2531
  name?: string;
2533
- /** Who you are here, who answers for you, and the house rules (keel #558). */
2532
+ /** Who you are here, who answers for you, and the house rules. */
2534
2533
  front_door: OwFrontDoor;
2535
2534
  [k: string]: unknown;
2536
2535
  }
2537
2536
  /**
2538
- * A world's front door for one key (keel #558, D152): on `GET /me`, `PUT /me/character` and an
2537
+ * A world's front door for one key: on `GET /me`, `PUT /me/character` and an
2539
2538
  * agent's `POST /join` answer. Every id is one the key may read; anything hidden from it, or
2540
2539
  * outside what its role sees, is null or left out. Read `charter` first.
2541
2540
  */
@@ -2566,7 +2565,7 @@ interface OwMember {
2566
2565
  id: string | null;
2567
2566
  kind: 'owner' | 'person' | 'agent' | 'player';
2568
2567
  role: 'owner' | OwMemberRole;
2569
- /** The Character that is this member, or null (null too when it is hidden from the reader: keel #421). */
2568
+ /** The Character that is this member, or null (null too when it is hidden from the reader). */
2570
2569
  character: string | null;
2571
2570
  /** `removed` rows stay, so their elements keep `created_by`. */
2572
2571
  status: 'active' | 'removed';
@@ -2586,9 +2585,9 @@ interface OwAllowance {
2586
2585
  resets_at: string;
2587
2586
  [k: string]: unknown;
2588
2587
  }
2589
- /** POST /join/preview: what a join code holds, read without using it (keel #212). */
2588
+ /** POST /join/preview: what a join code holds, read without using it. */
2590
2589
  interface OwJoinPreview {
2591
- /** `person`: an invite link, accepted with acceptJoin. `agent`: redeemed by an AI agent at POST /join. `player`: a friend with no account redeems it with redeemJoin for a read key (keel #353). */
2590
+ /** `person`: an invite link, accepted with acceptJoin. `agent`: redeemed by an AI agent at POST /join. `player`: a friend with no account redeems it with redeemJoin for a read key. */
2592
2591
  reader: 'person' | 'agent' | 'player' | (string & {});
2593
2592
  world: {
2594
2593
  name: string;
@@ -2596,14 +2595,14 @@ interface OwJoinPreview {
2596
2595
  };
2597
2596
  /** The name the inviter signed the link with, or null. */
2598
2597
  invited_by: string | null;
2599
- /** The world owner's chosen Character's name, never a username; null when none is set, or when it is hidden (keel #421). */
2598
+ /** The world owner's chosen Character's name, never a username; null when none is set, or when it is hidden. */
2600
2599
  owner_character: string | null;
2601
2600
  role: OwMemberRole;
2602
2601
  /** Whether joining gives the joiner a Character of their own (agent links). */
2603
2602
  with_character: boolean | null;
2604
2603
  /** ISO 8601, UTC. */
2605
2604
  expires_at: string;
2606
- /** A table only (a player link that works 2 to 50 times, keel #422 PR 2): how many times it works. Absent on a link for one. */
2605
+ /** A table only (a player link that works 2 to 50 times): how many times it works. Absent on a link for one. */
2607
2606
  max_uses?: number;
2608
2607
  /** A table only: how many places are left. */
2609
2608
  uses_left?: number;
@@ -2618,7 +2617,7 @@ interface OwJoinPreview {
2618
2617
  }>;
2619
2618
  [k: string]: unknown;
2620
2619
  }
2621
- /** One of a world's invite links, as GET /account/worlds/{id}/links lists it (keel C1, 48c10d4). */
2620
+ /** One of a world's invite links, as GET /account/worlds/{id}/links lists it. */
2622
2621
  interface OwWorldLink {
2623
2622
  /** The link's id: revokeWorldLink takes it. */
2624
2623
  id: string;
@@ -2637,20 +2636,20 @@ interface OwWorldLink {
2637
2636
  created_at: string;
2638
2637
  /** ISO 8601, UTC. */
2639
2638
  expires_at: string;
2640
- /** 0 or 1 for a link for one; a table's seats made, removed ones included (keel #422 PR 2). */
2639
+ /** 0 or 1 for a link for one; a table's seats made, removed ones included. */
2641
2640
  uses: number;
2642
2641
  /** A table is `pending` while `uses < max_uses` (and neither revoked nor expired), `used` once full. */
2643
2642
  status: 'pending' | 'used' | 'revoked' | 'expired';
2644
2643
  /** The membership (its id in GET /api/v2/members) of the co-builder who minted the link over POST /api/v2/links; null for a link the owner made (keel PR 215). */
2645
2644
  minted_by: string | null;
2646
- /** Whether the link shows the world's name and picture when it is pasted into a chat (keel #422): then the link is `/join/<world_id>#<code>`, else `/join#<code>`. Never on an agent link. */
2645
+ /** Whether the link shows the world's name and picture when it is pasted into a chat: then the link is `/join/<world_id>#<code>`, else `/join#<code>`. Never on an agent link. */
2647
2646
  preview?: boolean;
2648
2647
  /** A player link only: the Character the player reads as; null while a link for a fresh Character is unused, and always null on a table. `name` is null if that Character was deleted (the redeem then makes a fresh one). */
2649
2648
  character?: {
2650
2649
  id: string;
2651
2650
  name: string | null;
2652
2651
  } | null;
2653
- /** A table only (a player link that works 2 to 50 times, keel #422 PR 2): how many times it works. Absent on a link for one. */
2652
+ /** A table only (a player link that works 2 to 50 times): how many times it works. Absent on a link for one. */
2654
2653
  max_uses?: number;
2655
2654
  /** A table only: the Characters its players may pick, in the owner's order; empty when each player gets a fresh Character named after them. `taken`: a live seat in the world plays it. `name` is null if the Character was deleted. */
2656
2655
  characters?: Array<{
@@ -2669,7 +2668,7 @@ interface OwCreatedWorldLink extends OwWorldLink {
2669
2668
  /** The one line to send: who invites, to which world, and the link. */
2670
2669
  line: string;
2671
2670
  }
2672
- /** POST /join, an agent's code: its seat, write key and secret, shown once (keel #212; `kind` since #353). */
2671
+ /** POST /join, an agent's code: its seat, write key and secret, shown once. */
2673
2672
  interface OwAgentJoined {
2674
2673
  kind: 'agent';
2675
2674
  world: {
@@ -2698,11 +2697,11 @@ interface OwAgentJoined {
2698
2697
  env: string;
2699
2698
  next: string[];
2700
2699
  members: Array<Record<string, unknown>>;
2701
- /** The world's front door for the new seat: its sponsor, its Character, the Charter to read first (keel #558). */
2700
+ /** The world's front door for the new seat: its sponsor, its Character, the Charter to read first. */
2702
2701
  front_door: OwFrontDoor;
2703
2702
  [k: string]: unknown;
2704
2703
  }
2705
- /** POST /join, a player's code: a read key for a friend with no account, reading as a guest (keel #353). Shown once. */
2704
+ /** POST /join, a player's code: a read key for a friend with no account, reading as a guest. Shown once. */
2706
2705
  interface OwPlayerJoined {
2707
2706
  kind: 'player';
2708
2707
  /** A read key (`ow_r_`): no PIN, a player reads only. */
@@ -2734,13 +2733,13 @@ interface OwSignedIn {
2734
2733
  /** Its last four characters, as the account's tokens page shows them. */
2735
2734
  last4: string;
2736
2735
  }
2737
- /** One live agent seat, as GET /account/worlds/{id}/seats lists it (keel #355, D106). No key or secret. */
2736
+ /** One live agent seat, as GET /account/worlds/{id}/seats lists it. No key or secret. */
2738
2737
  /**
2739
2738
  * One world of the account, from GET /account/worlds: owned (`role: 'owner'`) or shared
2740
2739
  * (`'collaborator'`, with `member_role` the membership's role). Keys by name and last four only,
2741
- * never the key; on a shared world only the member's own keys (keel H8).
2740
+ * never the key; on a shared world only the member's own keys.
2742
2741
  */
2743
- /** The draught's policy (keel PR 155, D143): what GET /character/{id}/context serves and how. */
2742
+ /** The draught's policy (keel PR 155): what GET /character/{id}/context serves and how. */
2744
2743
  interface OwDraughtPolicy {
2745
2744
  /** Sections to serve; default every one but `messages`, `room` and `proposed`, each served only when named. */
2746
2745
  components?: OwDraughtComponent[];
@@ -2757,7 +2756,7 @@ interface OwDraughtPolicy {
2757
2756
  /** The sheet's reach: 1 (default) what her own element links to, 0 none. */
2758
2757
  depth?: 0 | 1;
2759
2758
  /**
2760
- * `true` (keel #585) leaves out every empty section (an empty array or object) and an empty `cut`;
2759
+ * `true` leaves out every empty section (an empty array or object) and an empty `cut`;
2761
2760
  * the frame (`world`, `calendar`, `as_of`, `now`, `mode`, `policy`) and every null stay, so a null
2762
2761
  * is still an answer (`character`: she is hidden from this reader; `style`: she has no style
2763
2762
  * element; `recent_cursor`: this read had no `since`). An absent section means nothing in it, never
@@ -2767,8 +2766,8 @@ interface OwDraughtPolicy {
2767
2766
  compact?: boolean;
2768
2767
  }
2769
2768
  /**
2770
- * A section of the draught, in the packet's order (keel's COMPONENTS). `messages`, `room` (keel #556:
2771
- * the room profile's other elements) and `proposed` (keel #580: elements carrying `x_review_proposed`)
2769
+ * A section of the draught, in the packet's order (keel's COMPONENTS). `messages`, `room` (the room profile's other
2770
+ * elements) and `proposed` (elements carrying `x_review_proposed`)
2772
2771
  * are off unless named.
2773
2772
  */
2774
2773
  type OwDraughtComponent = 'self' | 'role' | 'work' | 'style' | 'events' | 'knowledge' | 'names' | 'sheet' | 'recent' | 'messages' | 'room' | 'proposed' | 'roster';
@@ -2787,8 +2786,8 @@ interface OwDraughtItem {
2787
2786
  /** The element's body exactly as the list route serves it to the same reader. */
2788
2787
  element: OwElement;
2789
2788
  }
2790
- /** One Character's context in one read, GET /character/{id}/context (keel PR 155, D143; the draught). */
2791
- /** The draught under `compact` (keel #585): every section may be absent, and so may `cut` (nothing was cut). */
2789
+ /** One Character's context in one read, GET /character/{id}/context (keel PR 155; the draught). */
2790
+ /** The draught under `compact`: every section may be absent, and so may `cut` (nothing was cut). */
2792
2791
  type OwDraughtCompact = Omit<OwDraught, 'cut'> & {
2793
2792
  cut?: Record<string, number>;
2794
2793
  };
@@ -2834,9 +2833,9 @@ interface OwDraught {
2834
2833
  role: string | null;
2835
2834
  };
2836
2835
  }>;
2837
- /** Only when named (keel #556): the room's other elements that reach her (the room profile), here or nowhere. */
2836
+ /** Only when named: the room's other elements that reach her (the room profile), here or nowhere. */
2838
2837
  room?: OwDraughtItem[];
2839
- /** Only when named (keel #580): every element carrying `x_review_proposed` that reaches her, here or nowhere; `cut.proposed` counts the ones left out. */
2838
+ /** Only when named: every element carrying `x_review_proposed` that reaches her, here or nowhere; `cut.proposed` counts the ones left out. */
2840
2839
  proposed?: OwDraughtItem[];
2841
2840
  recent?: Array<{
2842
2841
  op: 'upsert' | 'delete';
@@ -2883,8 +2882,8 @@ interface OwCreateAccountWorldInput {
2883
2882
  }
2884
2883
  /**
2885
2884
  * createAccountWorld's 201: the world's row as listAccountWorlds lists it, plus the full write key
2886
- * once in `key` (never shown again). keel's document names it `AccountWorldCreated` (keel #579), and
2887
- * Assembly's verify-sdk-wire holds this type to it key for key.
2885
+ * once in `key` (never shown again). keel's document names it `AccountWorldCreated`, and
2886
+ * the maintainers' wire check holds this type to it key for key.
2888
2887
  */
2889
2888
  interface OwCreatedAccountWorld {
2890
2889
  id: string;
@@ -2903,8 +2902,8 @@ interface OwCreatedAccountWorld {
2903
2902
  }
2904
2903
  /**
2905
2904
  * A world key as minted by POST /account/worlds/{id}/keys: the row the account's key list shows,
2906
- * plus the full key once in `key` (never shown again). A member's key carries its `member` label
2907
- * (keel D72); an owner's row has no such field.
2905
+ * plus the full key once in `key` (never shown again). A member's key carries its `member` label;
2906
+ * an owner's row has no such field.
2908
2907
  */
2909
2908
  interface OwMintedKey {
2910
2909
  id: string;
@@ -3112,14 +3111,14 @@ interface ListParams {
3112
3111
  /**
3113
3112
  * Accepted: `name` (exact), `name__icontains`, `supertype`, `subtype`, and
3114
3113
  * `characters=<id>` (contains) on every type with a `characters` link (at schema
3115
- * 0.30.1: collective, construct, event, narrative, relation, title; keel D76d). Any other key 422s
3114
+ * 0.30.1: collective, construct, event, narrative, relation, title). Any other key 422s
3116
3115
  * server-side with the list of filters in the message -- the client passes keys
3117
3116
  * through unchecked and lets the platform say so. (`__in`, `__gte`, `__lte` and
3118
3117
  * `__isnull` are designed in keel's spec but not built; `ordering` 422s too.)
3119
3118
  */
3120
3119
  filter?: Record<string, string | number | boolean>;
3121
3120
  /**
3122
- * View as (keel #421), sent as `as`: read as another reader of this world would. A membership
3121
+ * View as, sent as `as`: read as another reader of this world would. A membership
3123
3122
  * id (a person, an agent seat or a player seat) reads as that member's own key; a Character id
3124
3123
  * reads as a guest of that Character with no membership; `'public'` reads everything not
3125
3124
  * hidden. The owner's keys only (a key with no member): a member key gets 403
@@ -3169,7 +3168,7 @@ interface OwClientConfig {
3169
3168
  agent?: boolean;
3170
3169
  /**
3171
3170
  * This client's own name, sent as `X-OW-Client` on every element write (create, upsert, patch,
3172
- * delete, editLinks, bulk, adopt) and on no read (keel #520). keel stores it on the element as
3171
+ * delete, editLinks, bulk, adopt) and on no read. keel stores it on the element as
3173
3172
  * `changed_client`, and on a /changes delete as `deleted_client`, so a reader can tell which tool
3174
3173
  * made a change: `'atlas'`, `'lantern'`, your app's name. Default `'sdk'`.
3175
3174
  *
@@ -3205,7 +3204,7 @@ declare class OwApiError extends Error {
3205
3204
  readonly code: string | null;
3206
3205
  /** Error family from the envelope, e.g. 'invalid_request', 'not_found'. */
3207
3206
  readonly type: string | null;
3208
- /** Offending field/param named by the envelope (a 422/400's field; `API-Pin` on a 401 PIN refusal, keel #357), else null. */
3207
+ /** Offending field/param named by the envelope (a 422/400's field; `API-Pin` on a 401 PIN refusal), else null. */
3209
3208
  readonly param: string | null;
3210
3209
  /** Documentation link from the envelope -- show it to users/logs verbatim. */
3211
3210
  readonly docUrl: string | null;
@@ -3214,7 +3213,7 @@ declare class OwApiError extends Error {
3214
3213
  /**
3215
3214
  * Seconds to wait before retrying, from the `Retry-After` header (a delay in
3216
3215
  * seconds or an HTTP date), else null. keel sends it on 503 `server_busy`
3217
- * (admission control, D71) and 429 `rate_limited`. This client never retries
3216
+ * (admission control) and 429 `rate_limited`. This client never retries
3218
3217
  * on its own; the value is here so callers can back off politely.
3219
3218
  * Readable in browsers too: keel exposes `Retry-After` over CORS and its
3220
3219
  * admission gate's 503 carries CORS headers (keel `4949406`, 2026-09-28).
@@ -3231,15 +3230,15 @@ declare class OwApiError extends Error {
3231
3230
  */
3232
3231
  get isIdempotencyConflict(): boolean;
3233
3232
  /**
3234
- * A request with this Idempotency-Key is still running (409 `idempotency_in_flight`, keel
3235
- * #307, D105): two sends of one create or bulk overlapped. Nothing was written by this one.
3233
+ * A request with this Idempotency-Key is still running (409 `idempotency_in_flight`):
3234
+ * two sends of one create or bulk overlapped. Nothing was written by this one.
3236
3235
  * Wait `retryAfter` seconds (keel sends 1) and send again with the SAME key and body: once
3237
3236
  * the first has answered, that retry replays its answer. Not a key conflict (see above).
3238
3237
  */
3239
3238
  get isIdempotencyInFlight(): boolean;
3240
3239
  /**
3241
3240
  * The id is already taken (409 `id_conflict`): a create with an id that exists
3242
- * (keel D39), or a PUT whose id belongs to another world (D70). Retrying will not
3241
+ * or a PUT whose id belongs to another world. Retrying will not
3243
3242
  * help; the id is the problem. `/bulk` never throws for this: it answers 200 with a
3244
3243
  * per-item slot `{status: 409, error: {code: 'id_conflict'}}` — check the slot.
3245
3244
  */
@@ -3247,16 +3246,16 @@ declare class OwApiError extends Error {
3247
3246
  /**
3248
3247
  * `/changes` refused the cursor (409 `resync_required`): what this key may see changed
3249
3248
  * (a guest's slice moved; an element hidden from a contributor was unhidden; the key's role
3250
- * moved to or from guest or contributor, whose cursors have other shapes; keel #421). Drop
3249
+ * moved to or from guest or contributor, whose cursors have other shapes). Drop
3251
3250
  * the stored cursor and walk again from the start. What to do with what the local copy holds
3252
3251
  * that the new walk does not name is `resyncReason`'s: `role`, keep it; `view`, drop it.
3253
3252
  * Without a reason (keel's hidden mark off), keep it: a reset never empties a copy (keel PR
3254
- * 104, the Captain's ruling: sharing is forward-only). Never empty the copy on your own.
3253
+ * 104, ruled by Titus: sharing is forward-only). Never empty the copy on your own.
3255
3254
  */
3256
3255
  get isResyncRequired(): boolean;
3257
3256
  /**
3258
3257
  * Why `/changes` refused the cursor, from the 409 `resync_required` envelope's `reason`
3259
- * (keel #421, only while keel's hidden mark is on): `role` (this key's own role or
3258
+ * (only while keel's hidden mark is on): `role` (this key's own role or
3260
3259
  * membership moved: keep what the local copy holds that the new walk does not name; it is
3261
3260
  * out of view now, not gone) or `view` (something left this key's view: a delete, a hide, an
3262
3261
  * unhide, a Character change; drop what the new walk does not name). When both happened
@@ -3268,20 +3267,20 @@ declare class OwApiError extends Error {
3268
3267
  get isBusy(): boolean;
3269
3268
  /**
3270
3269
  * A contributor tried to change, replace, relink or delete an element someone else
3271
- * created (403 `not_author`, keel D72 membership phase 2). Retrying will not help; the
3270
+ * created (403 `not_author`). Retrying will not help; the
3272
3271
  * element is not theirs. `/bulk` never throws for this: it answers 200 with a per-item
3273
3272
  * slot `{status: 403, error: {code: 'not_author'}}`. Owners and co-builders never see it.
3274
3273
  */
3275
3274
  get isNotAuthor(): boolean;
3276
3275
  /**
3277
3276
  * A member key tried what only the owner may do: `patchWorld`, even with a co-builder's
3278
- * key (403 `owner_only`, keel D72; sharing's publish, republish and revoke answer
3277
+ * key (403 `owner_only`; sharing's publish, republish and revoke answer
3279
3278
  * contributors and guests with the same code). Retrying will not help. The owner's own
3280
3279
  * key never sees it.
3281
3280
  */
3282
3281
  get isOwnerOnly(): boolean;
3283
3282
  /**
3284
- * A member key sent `viewAs` (403 `view_as_owner_only`, keel #421): reading as another
3283
+ * A member key sent `viewAs` (403 `view_as_owner_only`): reading as another
3285
3284
  * reader is the owner's, from a key with no member. Retrying will not help. Only while
3286
3285
  * keel's hidden mark is on; until then `viewAs` is an unknown parameter (422).
3287
3286
  */
@@ -3296,7 +3295,7 @@ declare class OwApiError extends Error {
3296
3295
  get isKnownOfNotWritable(): boolean;
3297
3296
  /**
3298
3297
  * A `patch` or `editLinks` sent with `ifMatch` found the element moved past that
3299
- * `change_seq` (412 `precondition_failed`, keel #210): nothing was written and nothing
3298
+ * `change_seq` (412 `precondition_failed`): nothing was written and nothing
3300
3299
  * merged. The error is an OwPreconditionFailedError; its `current` is the element as it
3301
3300
  * is now, so no second read is needed.
3302
3301
  */
@@ -3304,19 +3303,19 @@ declare class OwApiError extends Error {
3304
3303
  /** 404 `not_found`: no such element or route, or a join code that is unknown, used, revoked or expired. */
3305
3304
  get isNotFound(): boolean;
3306
3305
  /**
3307
- * redeemJoin on a table (keel #422 PR 2): the picked Character is one a live seat in the
3306
+ * redeemJoin on a table: the picked Character is one a live seat in the
3308
3307
  * world already plays (422 `character_taken`, `param` character). Pick another from a fresh
3309
3308
  * previewJoin, whose `characters` mark each `taken`. The code is not spent.
3310
3309
  */
3311
3310
  get isCharacterTaken(): boolean;
3312
3311
  /**
3313
- * setMyCharacter, or the member PATCH's `character` (keel #421, PR 160): the picked Character is
3312
+ * setMyCharacter, or the member PATCH's `character`: the picked Character is
3314
3313
  * hidden (422 `character_hidden`, `param` character). Unhide it first, or pick another.
3315
3314
  */
3316
3315
  get isCharacterHidden(): boolean;
3317
3316
  /**
3318
3317
  * The `character` sent was refused (422 `invalid_request`, `param` character). On redeemJoin
3319
- * at a table (keel #422 PR 2): the pick is off the link's list, hidden or deleted since the
3318
+ * at a table: the pick is off the link's list, hidden or deleted since the
3320
3319
  * link was made, or missing, or sent to a table with no list (send `name` instead); one
3321
3320
  * answer for all, so read previewJoin again and pick from its `characters`. The code is not
3322
3321
  * spent. On createWorldLink: a `character` keel refused (not a Character of the world, a
@@ -3325,7 +3324,7 @@ declare class OwApiError extends Error {
3325
3324
  */
3326
3325
  get isCharacterInvalid(): boolean;
3327
3326
  /**
3328
- * redeemJoin (keel #422 PR 2): the world already has its 50 live players (422 `world_full`),
3327
+ * redeemJoin: the world already has its 50 live players (422 `world_full`),
3329
3328
  * at any player link, a table's or a link for one's. Nothing is spent; a place frees when the
3330
3329
  * owner removes a player.
3331
3330
  */
@@ -3336,18 +3335,18 @@ declare class OwApiError extends Error {
3336
3335
  get isPinRequired(): boolean;
3337
3336
  /**
3338
3337
  * A daily allowance is used up (429 `quota_exceeded`): the world's image tickets, its file
3339
- * tickets (200 a day, keel #393), or the account's asks. See retryAfter.
3338
+ * tickets (200 a day), or the account's asks. See retryAfter.
3340
3339
  */
3341
3340
  get isQuotaExceeded(): boolean;
3342
3341
  /**
3343
3342
  * createFileTicket / uploadFile: the file is over the 25 MB a file may be (413
3344
- * `file_too_large`, `param` size, keel #393); the message gives both sizes. Nothing was
3343
+ * `file_too_large`, `param` size); the message gives both sizes. Nothing was
3345
3344
  * issued. Not the upload host's 413 `too_large` (bytes past a ticket's `max_bytes`).
3346
3345
  */
3347
3346
  get isFileTooLarge(): boolean;
3348
3347
  /**
3349
3348
  * createFileTicket / uploadFile: the world's files have no room for this one (403
3350
- * `files_full`, keel #393: 250 MB a world); the message gives the world's use, its cap and
3349
+ * `files_full`: 250 MB a world); the message gives the world's use, its cap and
3351
3350
  * the file's size. Remove a file, or ask the owner. Nothing was issued.
3352
3351
  */
3353
3352
  get isFilesFull(): boolean;
@@ -3356,7 +3355,7 @@ declare class OwApiError extends Error {
3356
3355
  /** ask: the model gave no answer (502 `ask_failed`). Not counted; try again in a moment. */
3357
3356
  get isAskFailed(): boolean;
3358
3357
  /**
3359
- * patch, upsert or editLinks became a proposal (202, keel #519): the world takes an agent seat's
3358
+ * patch, upsert or editLinks became a proposal (202): the world takes an agent seat's
3360
3359
  * writes as proposals (`agent_writes_proposed`), so the element did not change. The error is an
3361
3360
  * OwProposedError; its `proposal` is the row a keeper accepts or declines. Not a failure to retry:
3362
3361
  * the write is waiting for a person.
@@ -3364,44 +3363,44 @@ declare class OwApiError extends Error {
3364
3363
  get isProposed(): boolean;
3365
3364
  /**
3366
3365
  * propose named a field the proposer's own view of the element does not hold (422
3367
- * `field_not_visible`, `param` names it, keel #519): the element reaches this key only as a
3366
+ * `field_not_visible`, `param` names it): the element reaches this key only as a
3368
3367
  * stub (known_of), and a proposal changes only what its proposer can read.
3369
3368
  */
3370
3369
  get isFieldNotVisible(): boolean;
3371
3370
  /**
3372
3371
  * propose: this proposer already has 5 open proposals on the element, or 50 in the world (422
3373
- * `too_many_open`, keel #519). Wait for a keeper to decide, or withdraw one; a lapsed proposal
3372
+ * `too_many_open`). Wait for a keeper to decide, or withdraw one; a lapsed proposal
3374
3373
  * no longer counts.
3375
3374
  */
3376
3375
  get isTooManyOpen(): boolean;
3377
3376
  /**
3378
3377
  * acceptProposal found a proposed field moved since the proposal was made (409
3379
- * `stale_proposal`, keel #519). Nothing was written and the proposal stays open. The error is an
3378
+ * `stale_proposal`). Nothing was written and the proposal stays open. The error is an
3380
3379
  * OwStaleProposalError: `conflicts` lists each moved field with its `base` and `current` values,
3381
3380
  * and `current` is the element as it is now. A change to a field the proposal does not name
3382
3381
  * does not count. The proposer proposes again on the current text.
3383
3382
  */
3384
3383
  get isStaleProposal(): boolean;
3385
3384
  /**
3386
- * While the world takes agent seats' writes as proposals (keel #519), an agent seat's key tried
3385
+ * While the world takes agent seats' writes as proposals, an agent seat's key tried
3387
3386
  * what it may not: delete an element it did not create, or accept or decline a proposal (403
3388
- * `proposed_only`). On any world, reviewNewElement by the member the mark names is the same 403
3389
- * (keel #565). Retrying will not help; a person decides.
3387
+ * `proposed_only`). On any world, reviewNewElement by the member the mark names is the same 403.
3388
+ * Retrying will not help; a person decides.
3390
3389
  */
3391
3390
  get isProposedOnly(): boolean;
3392
3391
  /**
3393
- * acceptProposal or declineProposal on the key's own proposal (403 `own_proposal`, keel #519):
3392
+ * acceptProposal or declineProposal on the key's own proposal (403 `own_proposal`):
3394
3393
  * another keeper (the owner or a co-builder) decides it. Retrying will not help.
3395
3394
  */
3396
3395
  get isOwnProposal(): boolean;
3397
3396
  /**
3398
- * reviewNewElement on an element that carries no `x_review_proposed` mark (422 `not_proposed`,
3399
- * keel #565): nothing to settle. Someone settled it already, or it was never written as proposed.
3397
+ * reviewNewElement on an element that carries no `x_review_proposed` mark (422 `not_proposed`):
3398
+ * nothing to settle. Someone settled it already, or it was never written as proposed.
3400
3399
  */
3401
3400
  get isNotProposed(): boolean;
3402
3401
  }
3403
3402
  /**
3404
- * 412 `precondition_failed` (keel #210): the element changed since the `change_seq` sent as
3403
+ * 412 `precondition_failed`: the element changed since the `change_seq` sent as
3405
3404
  * `ifMatch`. `current` is the element as it is now, as this key sees it (keel sends it beside
3406
3405
  * the error envelope; null if a response ever lacks it). The check is per element and the
3407
3406
  * server never merges: compare the copy you edited from with `current`; when the fields you
@@ -3413,7 +3412,7 @@ declare class OwPreconditionFailedError extends OwApiError {
3413
3412
  constructor(status: number, code: string | null, message: string, docUrl: string | null, detail: unknown, type?: string | null, param?: string | null, retryAfter?: number | null);
3414
3413
  }
3415
3414
  /**
3416
- * 409 `stale_proposal` (keel #519): acceptProposal found a proposed field moved since the
3415
+ * 409 `stale_proposal`: acceptProposal found a proposed field moved since the
3417
3416
  * proposal was made. keel sends `conflicts` (one `{field, base, current}` per moved field) and
3418
3417
  * `current` (the element as it is now) beside the error envelope; `conflicts` is empty and
3419
3418
  * `current` null if a response ever lacks them. Nothing was written and the proposal stays open.
@@ -3424,7 +3423,7 @@ declare class OwStaleProposalError extends OwApiError {
3424
3423
  constructor(status: number, code: string | null, message: string, docUrl: string | null, detail: unknown, type?: string | null, param?: string | null, retryAfter?: number | null);
3425
3424
  }
3426
3425
  /**
3427
- * 202 on patch, upsert or editLinks (keel #519): the world takes an agent seat's writes as
3426
+ * 202 on patch, upsert or editLinks: the world takes an agent seat's writes as
3428
3427
  * proposals (`agent_writes_proposed`, set by its owner), so the write became a proposal and the
3429
3428
  * element did not change. The answer is `{proposal}`, never an element, so this client throws
3430
3429
  * rather than hand it back as one. `proposal` is the row; a keeper (the owner or a co-builder)
@@ -3507,7 +3506,7 @@ declare function kindCanWrite(kind: OwKeyKind): boolean;
3507
3506
  * Should a credential UI ask for a PIN with this key?
3508
3507
  * Prefixed keys read PIN-less; writes on pinned worlds always need it. 'optional' means: show
3509
3508
  * the field, don't require it. A legacy key that can write sends its PIN on every read of a
3510
- * world that has one, whether or not the world is open to read (keel #421 PR 105, 2026-10-20):
3509
+ * world that has one, whether or not the world is open to read (2026-10-20):
3511
3510
  * the literal `'required-for-private-reads'` predates that rule and keeps its name until 5.0.
3512
3511
  * A demo-range key (`isDemoKey`) is also kind `legacy` and never needs a PIN.
3513
3512
  */
@@ -3515,7 +3514,7 @@ declare function pinExpectation(kind: OwKeyKind): 'never' | 'optional' | 'requir
3515
3514
 
3516
3515
  /**
3517
3516
  * Sign in with OnlyWorlds: OAuth 2.1's authorization code with PKCE (S256) for public clients
3518
- * (keel PR 154, live 2026-10-22; the handoff sheet, Orrery `keel/signin-handoff.md` §3).
3517
+ * (keel PR 154, live 2026-10-22).
3519
3518
  *
3520
3519
  * Two calls. `beginSignIn` mints `state` and a PKCE verifier, keeps them under the client id in a
3521
3520
  * storage the page shares with its callback (sessionStorage by default), and hands back the
@@ -3594,9 +3593,9 @@ declare class OwV2Client {
3594
3593
  private readonly apiPin;
3595
3594
  private readonly fetchImpl;
3596
3595
  private readonly agent;
3597
- /** The name sent as X-OW-Client on element writes (keel #520), checked at construction. */
3596
+ /** The name sent as X-OW-Client on element writes, checked at construction. */
3598
3597
  private readonly clientName;
3599
- /** The conditional head poll's state (keel #518), per instance. */
3598
+ /** The conditional head poll's state, per instance. */
3600
3599
  private readonly headPoll;
3601
3600
  constructor(config?: OwClientConfig);
3602
3601
  /** GET /health -- unauthenticated liveness pulse. */
@@ -3610,9 +3609,9 @@ declare class OwV2Client {
3610
3609
  /**
3611
3610
  * PATCH /world -- partial world-meta update. The element write's server-managed keys are
3612
3611
  * stripped, and so are the world's own read-only ones (WORLD_READ_ONLY_FIELDS: `slug` and
3613
- * `public_page`, keel #471; `agent_writes_proposed`, keel #519; set on the world page, not here;
3614
- * `origin`, keel #571; `id`), so a `getWorld()` body can be sent back. The world's origin is
3615
- * written as `source` and `producer` (keel #571, each an object or null, served under `origin`);
3612
+ * `public_page`; `agent_writes_proposed`; set on the world page, not here;
3613
+ * `origin`; `id`), so a `getWorld()` body can be sent back. The world's origin is
3614
+ * written as `source` and `producer` (each an object or null, served under `origin`);
3616
3615
  * extension keys (`x_*`, `atlas_*`, `shadow_*`) are sent as given, and `null` removes one.
3617
3616
  */
3618
3617
  patchWorld(partial: Record<string, unknown>): Promise<OwWorldMeta>;
@@ -3623,8 +3622,8 @@ declare class OwV2Client {
3623
3622
  * token is a TypeError before sending.
3624
3623
  */
3625
3624
  /**
3626
- * PUT /me/character -- pick the roster Character that is you in this world, or none (keel PR 160,
3627
- * #533). A person member's write key with its PIN; answers GET /me's body. 422 for a hidden
3625
+ * PUT /me/character -- pick the roster Character that is you in this world, or none.
3626
+ * A person member's write key with its PIN; answers GET /me's body. 422 for a hidden
3628
3627
  * Character (`character_hidden`, `err.isCharacterHidden`), a guest's pick it did not make, or a
3629
3628
  * taken Character (`invalid_request`, `param` character); 404 for one this key cannot see; 403 for
3630
3629
  * an agent seat, a player, the owner (whose own is the world's `owner_character`, set with
@@ -3641,19 +3640,19 @@ declare class OwV2Client {
3641
3640
  /** GET /{type}/ -- one cursor page. */
3642
3641
  list(type: ElementType | string, params?: ListParams): Promise<OwPage>;
3643
3642
  /**
3644
- * GET /character/{id}/context -- the draught (keel PR 155, D143): what one Character knows, as the
3643
+ * GET /character/{id}/context -- the draught (keel PR 155): what one Character knows, as the
3645
3644
  * recorded world holds it, in one read: her element, what she holds and sits in, her open work,
3646
3645
  * how she works, the Events she was in, the Narratives she knows, everything else that names
3647
3646
  * her, her sheet, what changed around her (`since`), and who plays whom; the world's name and
3648
- * calendar beside; the room's messages (`messages`), its other elements (`room`, keel #556) and
3649
- * elements written as proposed (`proposed`, keel #580) only when `components` names them. Each
3647
+ * calendar beside; the room's messages (`messages`), its other elements (`room`) and
3648
+ * elements written as proposed (`proposed`) only when `components` names them. Each
3650
3649
  * row carries the list route's body for the same reader as `element`, beside `via`, `her_links`
3651
3650
  * and `grade`; nothing is inferred. The owner's keys, co-builders and contributors for any
3652
3651
  * Character they can see; a player seat or a guest for its own Character only (another id is
3653
3652
  * 404). `asOf` is a filter on the elements' own dates, not time travel. A `cut` that is not
3654
3653
  * empty means the serving is partial (`cut.proposed` also counts proposed elements left out because
3655
3654
  * the component was not named). `compact: true` leaves out every empty section and an empty `cut`,
3656
- * the frame and every null kept, answered as `OwDraughtCompact` (keel #585). Served
3655
+ * the frame and every null kept, answered as `OwDraughtCompact`. Served
3657
3656
  * `Cache-Control: private, no-store`.
3658
3657
  */
3659
3658
  draught(characterId: string, policy?: OwDraughtPolicy & {
@@ -3663,8 +3662,8 @@ declare class OwV2Client {
3663
3662
  /** Cursor-walk every page of a type. Politeness: uses config pageSize. */
3664
3663
  listAll(type: ElementType | string, params?: Omit<ListParams, 'cursor'>): AsyncGenerator<OwElement>;
3665
3664
  /**
3666
- * GET /{type}/{id}/ -- optional one-level stub expansion / sparse fields, and `viewAs` (keel
3667
- * #421: the owner reads as another reader; see ListParams.viewAs).
3665
+ * GET /{type}/{id}/ -- optional one-level stub expansion / sparse fields, and `viewAs` (the owner reads as
3666
+ * another reader; see ListParams.viewAs).
3668
3667
  */
3669
3668
  get(type: ElementType | string, id: string, opts?: Pick<ListParams, 'expand' | 'fields' | 'viewAs'>): Promise<OwElement>;
3670
3669
  /**
@@ -3684,8 +3683,8 @@ declare class OwV2Client {
3684
3683
  * PUT /{type}/{id}/ -- upsert-by-client-id. The local-first write primitive. A known-of
3685
3684
  * stub (`known_of: true`, see isKnownOf) is a TypeError before sending, here and on every
3686
3685
  * element write: a PUT of one would blank every field it does not keep.
3687
- * An agent seat's PUT on an existing element, in a world that takes its writes as proposals
3688
- * (keel #519), answers 202 and is thrown as an OwProposedError: the element did not change.
3686
+ * An agent seat's PUT on an existing element, in a world that takes its writes as proposals,
3687
+ * answers 202 and is thrown as an OwProposedError: the element did not change.
3689
3688
  */
3690
3689
  upsert(type: ElementType | string, id: string, element: OwElement | Record<string, unknown>): Promise<OwElement>;
3691
3690
  /**
@@ -3693,12 +3692,12 @@ declare class OwV2Client {
3693
3692
  * replace wholesale, omitted fields stay untouched. For link arrays prefer
3694
3693
  * editLinks() -- atomic server-side merge, no read-before-write.
3695
3694
  *
3696
- * `ifMatch` (keel #210): the element's `change_seq` as you read it. The update lands
3695
+ * `ifMatch`: the element's `change_seq` as you read it. The update lands
3697
3696
  * only if nobody changed the element since; otherwise nothing is written and this throws
3698
3697
  * an OwPreconditionFailedError (412) whose `current` is the element as it is now. Omit
3699
3698
  * it for today's unconditional write.
3700
3699
  *
3701
- * In a world that takes an agent seat's writes as proposals (keel #519, the world's
3700
+ * In a world that takes an agent seat's writes as proposals (the world's
3702
3701
  * `agent_writes_proposed`), a seat's patch answers 202 with `{proposal}`, never an element:
3703
3702
  * this throws an OwProposedError (`err.isProposed`, the row under `err.proposal`) and the
3704
3703
  * element did not change. If-Match is checked first: a stale one is still a 412.
@@ -3711,7 +3710,7 @@ declare class OwV2Client {
3711
3710
  * tombstone AND scrubs the id from every other element's links in the same
3712
3711
  * transaction -- no client-side unlink pass needed, ever.
3713
3712
  *
3714
- * `ifMatch` (keel #563, as on patch()): the element's `change_seq` as you read it. The delete
3713
+ * `ifMatch` (as on patch()): the element's `change_seq` as you read it. The delete
3715
3714
  * lands only if nothing changed since; otherwise an OwPreconditionFailedError (412) whose
3716
3715
  * `current` is the element as it is now, and nothing is deleted. On an element already gone it
3717
3716
  * is the idempotent 204. Under a world's proposals switch a delete is never a proposal.
@@ -3724,14 +3723,14 @@ declare class OwV2Client {
3724
3723
  * Dedupes, tolerates already-present/already-absent ids. Returns the FULL
3725
3724
  * updated element (fixture P5). Use this for all relationship editing; it
3726
3725
  * retires the read-merge-PATCH dance. `ifMatch` works as on patch(): a link write
3727
- * moves the element too. A 202 (an agent seat's link edit that became a proposal, keel
3728
- * #519) is thrown as an OwProposedError, as on patch().
3726
+ * moves the element too. A 202 (an agent seat's link edit that became a proposal)
3727
+ * is thrown as an OwProposedError, as on patch().
3729
3728
  */
3730
3729
  editLinks(type: ElementType | string, id: string, field: string, edit: OwLinkEdit, opts?: {
3731
3730
  ifMatch?: number;
3732
3731
  }): Promise<OwElement>;
3733
3732
  /**
3734
- * POST /{type}/{id}/adopt with {member} -- change who made an element (keel #427, D141).
3733
+ * POST /{type}/{id}/adopt with {member} -- change who made an element.
3735
3734
  * `member` is a membership id of this world (a person or an AI seat, as `members()` lists
3736
3735
  * them) or `'owner'`, which sets `created_by` to null. The world's owner key or a
3737
3736
  * co-builder's (a person's or a seat's) with its PIN; a contributor's is 403 `not_author`
@@ -3755,7 +3754,7 @@ declare class OwV2Client {
3755
3754
  * the items that would have succeeded still say 201 with the ids and timestamps they
3756
3755
  * would have had (keel's "counterfactual 201s"): do not record those ids as created.
3757
3756
  * An agent seat's item on an existing element, in a world that takes its writes as
3758
- * proposals (keel #519), answers a slot `{status: 202, id, proposal}`: never thrown, the
3757
+ * proposals, answers a slot `{status: 202, id, proposal}`: never thrown, the
3759
3758
  * element unchanged, the slot's `proposal` the row a keeper decides.
3760
3759
  * An element without an id gets one, as `create` mints it, by its position in `items`: with an
3761
3760
  * `idempotencyKey`, derived from the key and the position (the ids the Python package mints),
@@ -3769,18 +3768,18 @@ declare class OwV2Client {
3769
3768
  /**
3770
3769
  * GET /changes -- one page of the world's ordered change feed.
3771
3770
  * Cursor is OPAQUE: persist verbatim, never parse or build one (a guest's and a
3772
- * contributor's carry their view's epoch, since keel #421 for a contributor).
3771
+ * contributor's carry their view's epoch, since 2026-10-20 for a contributor).
3773
3772
  * Zero/absent cursor = full export (byte-aligned with the Folder Format).
3774
3773
  * Reset rule: a 409 `resync_required` (err.isResyncRequired) means the key's
3775
3774
  * view changed (a guest's slice, an element unhidden from a contributor, or its role): drop
3776
3775
  * the cursor and walk from zero. For what the local copy holds that the walk no longer names,
3777
- * read err.resyncReason (keel #421, while keel's hidden mark is on): `role`, keep it; `view`,
3776
+ * read err.resyncReason (while keel's hidden mark is on): `role`, keep it; `view`,
3778
3777
  * drop it (as for a delete row with reason `hidden`). Without a reason, keep it (keel's own
3779
3778
  * words since PR 104; sharing is forward-only). Never empty a copy on your own.
3780
3779
  * Citizenship: heaviest route on the platform; default page size is polite.
3781
3780
  * keel sends the cursor of a page at the head as a number (an empty page, for a key
3782
3781
  * whose cursor carries no epoch); it is handed back as a string, like every cursor here.
3783
- * `after` (keel #514, D142): only the changes made at or after an ISO 8601 time (`updated_at` of an
3782
+ * `after`: only the changes made at or after an ISO 8601 time (`updated_at` of an
3784
3783
  * upsert, `deleted_at` of a delete; no offset means UTC). A filter, not a position: the order,
3785
3784
  * `cursor`, `has_more` and `head` are as without it, so to read the whole window pass the cursor
3786
3785
  * back as `since` with the same `after` until `has_more` is false (`changesAll` does). "Since
@@ -3800,12 +3799,12 @@ declare class OwV2Client {
3800
3799
  * poll's, so a missed tick never drops a change) and walk changesAll only when it moved;
3801
3800
  * a head below yours means the server rewound: walk again from zero. `epoch` is a
3802
3801
  * guest's or a contributor's view epoch (null for other keys): it can move with `head` unchanged, so walk on
3803
- * either move. `epoch_reason` (keel #421, while keel's hidden mark is on; absent otherwise)
3802
+ * either move. `epoch_reason` (while keel's hidden mark is on; absent otherwise)
3804
3803
  * says why the epoch last moved, `role` or `view` (see OwChangesPage.epoch_reason).
3805
3804
  * keel returns the owner's cursor as a number; it is handed back as a
3806
3805
  * string, like every cursor here.
3807
3806
  *
3808
- * Conditional (keel #518, 4.57.0): keel tags the answer with an ETag that covers the head and
3807
+ * Conditional (4.57.0): keel tags the answer with an ETag that covers the head and
3809
3808
  * the epoch, so a view change moves it too. The client keeps the last tag and sends it as
3810
3809
  * If-None-Match on its next head read. When nothing moved, keel answers 304 with no body, and
3811
3810
  * this returns the `head`, `cursor` and `epoch` from the last 200 with `unchanged: true`
@@ -3997,13 +3996,13 @@ declare class OwV2Client {
3997
3996
  * `agent`: an AI agent redeems it at POST /join). Sends no credential, whatever key
3998
3997
  * this client holds. Every bad code (unknown, used, revoked, expired) is the same
3999
3998
  * 404 `not_found` (`err.isNotFound`). `code` is the part of the link after `#`. A table
4000
- * (keel #422 PR 2) adds `max_uses`, `uses_left`, `name_required` and `characters`, the
3999
+ * adds `max_uses`, `uses_left`, `name_required` and `characters`, the
4001
4000
  * pick screen's list; a link for one answers without them.
4002
4001
  */
4003
4002
  previewJoin(code: string): Promise<OwJoinPreview>;
4004
4003
  /**
4005
4004
  * POST /join -- redeem a join code that needs no account: a player's (a friend reading as
4006
- * a guest, keel #353) or an AI agent's. Sends no credential, whatever key this client holds.
4005
+ * a guest) or an AI agent's. Sends no credential, whatever key this client holds.
4007
4006
  * 201 with `kind` telling the two answers apart: `player` gives a read key (`ow_r_`, no PIN)
4008
4007
  * and the Character it reads as; `agent` gives a seat's write key, secret and `.env` lines.
4009
4008
  * Both are shown once, and the code is spent: a lost answer cannot be replayed (the owner
@@ -4012,7 +4011,7 @@ declare class OwV2Client {
4012
4011
  * agent code). Every bad code is the same 404 `not_found`; a person's code is redeemed with
4013
4012
  * acceptJoin instead.
4014
4013
  *
4015
- * A table (a player code whose preview carries `max_uses`, keel #422 PR 2) seats one player
4014
+ * A table (a player code whose preview carries `max_uses`) seats one player
4016
4015
  * per redeem, until `uses_left` is 0. With a list, `character` is the player's pick, the `id`
4017
4016
  * of one of the preview's `characters` not `taken`: a Character a live seat already plays is
4018
4017
  * 422 `character_taken` (`err.isCharacterTaken`; pick another), one off the list, hidden or
@@ -4058,25 +4057,24 @@ declare class OwV2Client {
4058
4057
  * POST /account/join -- accept an invite link's code as the account this client's
4059
4058
  * `ow_a_` token belongs to: 201 with the new membership. Refusals: 404 `not_found`
4060
4059
  * (every bad code, and a code made for an AI agent) and 409 `already_member`
4061
- * (`err.isAlreadyMember`). Accepting needs no account PIN, for any role (keel #297,
4062
- * ed73c90); a write key for the membership waits for one (`pin_required`). A refusal
4060
+ * (`err.isAlreadyMember`). Accepting needs no account PIN, for any role; a write key for the membership waits for one (`pin_required`). A refusal
4063
4061
  * never spends the code. A world key here is a TypeError before anything is sent.
4064
4062
  */
4065
4063
  acceptJoin(code: string): Promise<OwJoinedMembership>;
4066
4064
  /**
4067
4065
  * POST /account/worlds/{worldId}/links -- a new invite link for a world this client's
4068
- * `ow_a_` token owns (keel C1): `reader` is required (`person`, accepted with acceptJoin;
4066
+ * `ow_a_` token owns: `reader` is required (`person`, accepted with acceptJoin;
4069
4067
  * `agent`, redeemed at POST /join; `player`, a friend with no account, redeemed with
4070
- * redeemJoin for a read key, keel #353); `role`, when left out, is keel's default: guest for a
4068
+ * redeemJoin for a read key); `role`, when left out, is keel's default: guest for a
4071
4069
  * person link, contributor for an agent link (a player link is guest, and refuses any other), `days` (1, 7 or 30) to 7; `withCharacter` (agent links
4072
4070
  * only) to true; `character` (player links only) a Character's id or `new` (the default):
4073
- * whoever opens the link first reads as it, until removed. `preview` (person and player links,
4074
- * keel #422) to false: true puts the world's id in the link's path, so a chat that unfurls it
4071
+ * whoever opens the link first reads as it, until removed. `preview` (person and player links)
4072
+ * to false: true puts the world's id in the link's path, so a chat that unfurls it
4075
4073
  * shows the world's name and picture (the code stays after `#`); true on an agent link is
4076
4074
  * 422, param `preview`. `maxUses` (person and player links; an agent link takes none) to 1, a
4077
- * link for one. On a person link (keel #390, D140) 2 to 50 lets in that many accounts, each
4075
+ * link for one. On a person link 2 to 50 lets in that many accounts, each
4078
4076
  * joining once with the link's role, until every use is taken, it expires or it is revoked;
4079
- * who already joined stays. On a player link (keel #422 PR 2) 2 to 50 makes a table, one
4077
+ * who already joined stays. On a player link 2 to 50 makes a table, one
4080
4078
  * link that seats that many players, each picking one of
4081
4079
  * `characters` (Character ids of the world, in the order a pick screen shows them; a hidden
4082
4080
  * one is 422, param `characters`). `characters` empty or left out: each player names a fresh
@@ -4147,7 +4145,7 @@ declare class OwV2Client {
4147
4145
  */
4148
4146
  removeSeat(worldId: string, seatId: string): Promise<void>;
4149
4147
  /**
4150
- * PUT /{type}/{id}/hidden -- hide an element (keel #421). The owner's key or a co-builder's
4148
+ * PUT /{type}/{id}/hidden -- hide an element. The owner's key or a co-builder's
4151
4149
  * (a person's or a seat's) with its PIN; hiding a hidden element again changes nothing, and
4152
4150
  * the element's body and `change_seq` do not move. Hidden, it is seen only by the owner, the
4153
4151
  * co-builders and the member who created it; to every other key it is a 404, left out of
@@ -4189,7 +4187,7 @@ declare class OwV2Client {
4189
4187
  listProposals(type: ElementType | string, id: string, opts?: OwProposalQuery): Promise<OwProposalList>;
4190
4188
  /**
4191
4189
  * GET /world/proposals -- the world's queue, newest first by created_at, two kinds of row told
4192
- * apart by `kind` (keel #565): `proposal`, a proposed change to an element (OwProposal), and
4190
+ * apart by `kind`: `proposal`, a proposed change to an element (OwProposal), and
4193
4191
  * `new_element`, an element written as proposed, carrying `x_review_proposed`
4194
4192
  * (OwProposedNewElement: settle it with reviewNewElement). A marked element is listed under
4195
4193
  * `open`, `lapsed` and `all`, never `accepted` or `declined`; keel reads at most the 500 newest.
@@ -4227,7 +4225,7 @@ declare class OwV2Client {
4227
4225
  withdrawProposal(type: ElementType | string, id: string, pid: string): Promise<void>;
4228
4226
  /**
4229
4227
  * POST /{type}/{id}/review -- settle a new element written as proposed, one carrying
4230
- * `x_review_proposed` (the queue's `new_element` row, keel #565). The owner's key or a
4228
+ * `x_review_proposed` (the queue's `new_element` row). The owner's key or a
4231
4229
  * co-builder's, with its PIN. `{ decision: 'accept' }` clears the mark (a write by you: a new
4232
4230
  * change_seq, one /changes row) and answers `{ element }`; `{ decision: 'decline', reason? }`
4233
4231
  * deletes the element (a tombstone, the links to it scrubbed, its open proposals dropped) and
@@ -4277,7 +4275,7 @@ declare class OwV2Client {
4277
4275
  * `navigate: false`). `redirectUri` is the registered return address as a string, `https:`
4278
4276
  * only, never built from `location.origin`: a tool's registration is read at
4279
4277
  * `GET /api/v2/auth/clients`. `resume` is small JSON handed back by `completeSignIn`. No request
4280
- * is sent; any client, keyless included. The handoff sheet: Orrery `keel/signin-handoff.md` §3.
4278
+ * is sent; any client, keyless included.
4281
4279
  */
4282
4280
  signInWithOnlyWorlds(opts: OwSignInBegin): Promise<OwSignInBegun>;
4283
4281
  /**
@@ -4341,18 +4339,18 @@ declare class OwV2Client {
4341
4339
  auth?: boolean;
4342
4340
  allowEmpty?: boolean;
4343
4341
  replayAware?: boolean;
4344
- /** A `change_seq` to send as `If-Match` (keel #210); a whole number, else TypeError before sending. */
4342
+ /** A `change_seq` to send as `If-Match`; a whole number, else TypeError before sending. */
4345
4343
  /** A write keel's document lists X-OW-Agent on (the element writes, hide and unhide, the file ticket, setMyCharacter, mintWorldKey): where an agent client sends it. */
4346
4344
  write?: boolean;
4347
- /** One of the writes keel reads X-OW-Client on (keel #520: create, put, patch, delete, links, bulk, adopt; keel #519: propose, accept): where the client's name goes. */
4345
+ /** One of the writes keel reads X-OW-Client on (create, put, patch, delete, links, bulk, adopt, propose, accept): where the client's name goes. */
4348
4346
  elementWrite?: boolean;
4349
4347
  /**
4350
- * A write keel may answer 202 with `{proposal}` (keel #519: put, patch, links): a 202 then
4348
+ * A write keel may answer 202 with `{proposal}` (put, patch, links): a 202 then
4351
4349
  * throws an OwProposedError instead of returning a body that is not the element.
4352
4350
  */
4353
4351
  proposable?: boolean;
4354
4352
  ifMatch?: number;
4355
- /** A tag to send as `If-None-Match` exactly as given (keel #518, the head read): unlike ifMatch, nothing is quoted or checked. */
4353
+ /** A tag to send as `If-None-Match` exactly as given (the head read): unlike ifMatch, nothing is quoted or checked. */
4356
4354
  ifNoneMatch?: string;
4357
4355
  /**
4358
4356
  * Called with every response's `ETag` header (as received, null when absent) and status, before
@@ -4434,9 +4432,9 @@ declare const FAMILY_ORDER: readonly ElementFamily[];
4434
4432
  * Field labels: the one rule for turning a field name into the words a tool shows.
4435
4433
  *
4436
4434
  * Presentation, not the standard: the schema never carries a label. The house rule
4437
- * (OW Style, the Captain 2026-10-20, h63 #8074; Studio/style/RULES.md) is sentence case
4435
+ * (set 2026-10-20) is sentence case
4438
4436
  * with acronyms kept: "birth_date" → "Birth date", "image_url" → "Image URL". Seeded
4439
- * from Atlas's humanizeFieldName as of 1.59.1 (Temper, h63 #8119), so Atlas, Lantern
4437
+ * from Atlas's humanizeFieldName as of 1.59.1, so Atlas, Lantern
4440
4438
  * and Council read one copy instead of three.
4441
4439
  */
4442
4440
  /** Words shown in capitals wherever they fall in a label. */
@@ -4446,7 +4444,7 @@ declare const FIELD_ACRONYMS: readonly string[];
4446
4444
  * lowercase, an acronym in capitals wherever it falls ("image_url" → "Image URL",
4447
4445
  * "url" → "URL", "time_range_current" → "Time range current"). A word written all in
4448
4446
  * capitals stays as written: a custom field named `STR` reads "STR"
4449
- * (Lantern's stat blocks; Temper, h63 #8197). Every schema field name is lowercase, so this
4447
+ * (Lantern's stat blocks). Every schema field name is lowercase, so this
4450
4448
  * reaches only names a person or tool chose.
4451
4449
  *
4452
4450
  * The name is taken as given: a tool that hides an extension prefix (`atlas_`, `x_`,
@@ -4527,9 +4525,9 @@ declare function typeWord(world: object | null | undefined, type: string, opts?:
4527
4525
  * The world file, `.owworld` (Folder Format spec §4.7; a `.zip` by another
4528
4526
  * name): one archive holding one whole world as a portable copy (§4.1), and
4529
4527
  * the reader that opens one back. Absorbed from Atlas's
4530
- * `src/store/world-file.ts` (Temper's, Atlas 1.17), so Atlas, Lantern and any
4528
+ * `src/store/world-file.ts` (Atlas 1.17), so Atlas, Lantern and any
4531
4529
  * script read one file the same way; brought to §4.7's checks OW-1 to OW-22
4532
- * and their fixture set (OW Council #522).
4530
+ * and their fixture set.
4533
4531
  *
4534
4532
  * THE READER takes bytes and returns bytes: no DOM, `File` or file system, so
4535
4533
  * it runs in a browser and in Node alike. It reads the central directory
@@ -4683,8 +4681,8 @@ declare function nfc(text: string): string;
4683
4681
 
4684
4682
  /**
4685
4683
  * World lookup: find the elements a plain-language question is about, in a
4686
- * world held in memory, with no model and no network. Ported from Assembly's
4687
- * Lantern Ask trial (`dossiers/lantern-ask/lookup.mjs`, round 2), with the
4684
+ * world held in memory, with no model and no network. Ported from the
4685
+ * Lantern Ask trial (round 2), with the
4688
4686
  * same ranking, so the trial's measurements on two real worlds describe this
4689
4687
  * code. Pure: runs in a browser and in Node alike.
4690
4688
  *
@@ -4816,7 +4814,7 @@ declare function lookupWorld<T extends OwLookupElement>(index: OwWorldIndex<T>,
4816
4814
  declare function renderElement<T extends OwLookupElement>(element: T, index: OwWorldIndex<T>, opts?: OwRenderOptions): string;
4817
4815
 
4818
4816
  /**
4819
- * Context for keel's AI proxy (POST /api/v2/account/ask, Keel #159): the elements a
4817
+ * Context for keel's AI proxy (POST /api/v2/account/ask): the elements a
4820
4818
  * question is about, as text, within the proxy's limits. The caller passes the
4821
4819
  * elements it shows the user, in its own order, and gets back exactly which were sent:
4822
4820
  * the answer's sources are what the user saw, never a second lookup's.
@@ -4900,7 +4898,7 @@ declare function buildAskContext<T extends OwLookupElement>(items: Array<OwLooku
4900
4898
  * Photo preparation: make a picture from a phone's camera or files ready for
4901
4899
  * `uploadImage` (webp, png, jpeg or avif, at most 15 MB), in the browser,
4902
4900
  * before it leaves the device. Lifted from the upload page's converter
4903
- * (upload.onlyworlds.com, Boss's): canvas, webp at quality 0.82, alpha kept.
4901
+ * (upload.onlyworlds.com): canvas, webp at quality 0.82, alpha kept.
4904
4902
  *
4905
4903
  * Two traps it handles:
4906
4904
  * - A browser that cannot encode webp hands back a PNG instead (Safari has
@@ -4965,8 +4963,8 @@ declare function preparePhoto(input: Blob, opts?: OwPhotoOptions): Promise<OwPre
4965
4963
  * Calendar kernel — pure arithmetic, formatting, and parsing over the world's
4966
4964
  * integer time line.
4967
4965
  *
4968
- * Contract: Forge/Notes/2026-07-14-calendar-design-final.md §5 + §5b (3-lens
4969
- * gated 2026-07-14). The binding rules, restated where they bite:
4966
+ * The contract is the calendar design of 2026-07-14 (its §5 and §5b). The
4967
+ * binding rules, restated where they bite:
4970
4968
  *
4971
4969
  * - The number line is the only truth. A calendar names it; it never owns it.
4972
4970
  * - Absolute year index is ZERO-based: step 0 opens absolute year 0. All
@@ -5174,7 +5172,7 @@ declare function isParseError(r: ParseResult | ParseError): r is ParseError;
5174
5172
  * World calendars: the calendar kernel, and which calendars a world holds.
5175
5173
  *
5176
5174
  * `calendar.ts` beside this file came from Atlas's `src/core/calendar.ts` in 4.20.0, and is
5177
- * the one copy since Atlas 245aad3 deleted its own and imports this one (Temper, h37 #4472):
5175
+ * the one copy since Atlas 245aad3 deleted its own and imports this one:
5178
5176
  * a kernel change is an SDK release, and Atlas's 48 kernel tests run against it there too.
5179
5177
  * Its contract is still Atlas's calendar design, §5 and §5b. This file adapts Atlas's
5180
5178
  * `src/core/calendar-lens.ts` (readCalendarValue, worldCalendars, resolveCalendarLens) to
@@ -5182,7 +5180,7 @@ declare function isParseError(r: ParseResult | ParseError): r is ParseError;
5182
5180
  *
5183
5181
  * The field: a calendar is an element (a Construct by convention) carrying `atlas_calendar`.
5184
5182
  * Atlas owns the field, its meaning and its writes (its calendar design, §5 and §5b); every
5185
- * other tool reads it and never writes it (Skeld, h37 #4286: a prefix names the owner, not
5183
+ * other tool reads it and never writes it (a prefix names the owner, not
5186
5184
  * who may read). Detection keys on the field's presence, never on the supertype.
5187
5185
  * Everything degrades to bare numbers: a missing, dangling or malformed calendar is null,
5188
5186
  * never an error.
@@ -5357,7 +5355,7 @@ declare enum GameTier {
5357
5355
  * Since then keel mounts only `status/` and `encryption-info/` under /tokens/
5358
5356
  * (`accounts/token_api.py`; consume, access-key and both revokes answer 404 on
5359
5357
  * production, 2026-10-14), and spending moved server-side: the Council spends
5360
- * through keel's council proxy (keel #274, Skeld's ruling h37 #4632), and
5358
+ * through keel's council proxy (ruled 2026-10-14), and
5361
5359
  * `OwV2Client.allowance()` reads the token rating. The four dead methods are
5362
5360
  * deprecated in 4.23.0 and leave in 5.0.
5363
5361
  */
@@ -5421,7 +5419,7 @@ declare class TokenResource {
5421
5419
  * Consume tokens for service usage
5422
5420
  *
5423
5421
  * @deprecated keel serves no consume route (404 on production since 2026-10;
5424
- * no client decides what its act costs, Skeld's ruling, keel #274): spending
5422
+ * no client decides what its act costs, ruled 2026-10-14): spending
5425
5423
  * happens server-side in the route that does the work. Removed in 5.0.
5426
5424
  *
5427
5425
  * Reports token consumption to track daily usage. Allows consumption even if