@rpgm-tools/neo-angband-mod-sdk 1.21.0 → 1.22.0

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.
@@ -328,6 +328,12 @@ export type ParsedCapability = {
328
328
  } | {
329
329
  kind: "profiles";
330
330
  action: "manage";
331
+ } | {
332
+ kind: "session";
333
+ action: "control";
334
+ } | {
335
+ kind: "shared";
336
+ action: "read" | "publish";
331
337
  };
332
338
  /**
333
339
  * Parse and validate a capability string against the vocabulary above,
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8PG;AAEH,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAE5D,qBAAa,eAAgB,SAAQ,KAAK;CAAG;AAE7C,2DAA2D;AAC3D,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,KAAK,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAA;CAAE,GACtE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,KAAK,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,CAAC;AA8E3C;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAqI7D;AAoHD;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAE1C,OAAO;IAUP;;;;;;;OAOG;IACH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,aAAa;IAgB1D;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAKzB;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOxB;;;;OAIG;IACH,aAAa,IAAI,SAAS,MAAM,EAAE;IAIlC,0EAA0E;IAC1E,kBAAkB,IAAI,OAAO;IAI7B,6DAA6D;IAC7D,iBAAiB,IAAI,OAAO;CAG7B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAUlF;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAoBxD;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUnE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAIlF"}
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8PG;AAEH,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAE5D,qBAAa,eAAgB,SAAQ,KAAK;CAAG;AAE7C,2DAA2D;AAC3D,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,KAAK,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAA;CAAE,GACtE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,KAAK,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AA8EnD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAiJ7D;AAwHD;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAE1C,OAAO;IAUP;;;;;;;OAOG;IACH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,aAAa;IAgB1D;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAKzB;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOxB;;;;OAIG;IACH,aAAa,IAAI,SAAS,MAAM,EAAE;IAIlC,0EAA0E;IAC1E,kBAAkB,IAAI,OAAO;IAI7B,6DAA6D;IAC7D,iBAAiB,IAAI,OAAO;CAG7B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAUlF;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAoBxD;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUnE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAIlF"}
@@ -352,6 +352,19 @@ export function parseCapability(cap) {
352
352
  return { kind: "title", action: "add" };
353
353
  if (cap === "profiles:manage")
354
354
  return { kind: "profiles", action: "manage" };
355
+ /* "session:control": save the game, leave it for the title screen, or quit, the
356
+ * same three acts the game menu offers. Its own kind so `saves:manage` (the
357
+ * roster) does not carry it: managing characters and ending this one are two
358
+ * different things to agree to. */
359
+ if (cap === "session:control")
360
+ return { kind: "session", action: "control" };
361
+ /* "shared:read" and "shared:publish": read the named JSON values other mods
362
+ * publish through `ctx.shared`, or publish this mod's own. Two actions so the
363
+ * Mods screen can show both sides of the exchange, and compared exactly, so
364
+ * neither grant carries the other. */
365
+ if (cap === "shared:read" || cap === "shared:publish") {
366
+ return { kind: "shared", action: cap === "shared:read" ? "read" : "publish" };
367
+ }
355
368
  /* NOT a registry domain, deliberately. A registry:* grant means "override
356
369
  * one named game system among many"; this one means "everything the player
357
370
  * sees of the dungeon is drawn by this mod." It is the display OWNER, so it
@@ -500,6 +513,10 @@ function grantCovers(grant, request) {
500
513
  return grant.kind === "title";
501
514
  case "profiles":
502
515
  return grant.kind === "profiles";
516
+ case "session":
517
+ return grant.kind === "session";
518
+ case "shared":
519
+ return grant.kind === "shared" && grant.action === request.action;
503
520
  case "event":
504
521
  return grant.kind === "event" && grant.name === request.name;
505
522
  case "state":
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"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"}
package/dist/loader.d.ts CHANGED
@@ -36,7 +36,9 @@
36
36
  * The identity those files really use was already declared in record-key.ts and
37
37
  * already proved unique over the shipped pack; recordsComposable now asks it.
38
38
  * What is left in phase 2 is `constants` and `visuals` (config singletons, where
39
- * whole-file IS the meaning) and `history` (no per-record identity at all).
39
+ * whole-file IS the meaning) and `history` (keyed by chart and roll since
40
+ * 2026-10-03, but its record order is what a chart's rolls mean, so a pack's
41
+ * records still replace the file and only the per-record ops use the key).
40
42
  *
41
43
  * NOTHING IS DROPPED IN SILENCE. This is the invariant the whole file exists to
42
44
  * hold. Until 2026-07-29 phase 2 did not exist: a `patches` / `replaces` /
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAWlD,OAAO,KAAK,EAAmB,gBAAgB,EAA2B,MAAM,cAAc,CAAC;AAG/F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AASjD;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,YAAY,CAAC;IACvB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAC;CACb;AAED,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC9B,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACnC,uEAAuE;IACvE,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iFAAiF;IACjF,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;;OAIG;IACH,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB;;;;;;OAMG;IACH,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC;;;;;;;;;;;;;;OAcG;IACH,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAqED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;CACxE;AAuSD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,OAAO,GAAE,cAAmB,GAC3B,eAAe,CAgLjB;AAED,4DAA4D;AAC5D,MAAM,WAAW,WAAW;IAC1B,qBAAqB;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,OAAO,GAAE,cAAmB,GAC3B;IACD,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;CAC1C,CAwCA"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqFG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAWlD,OAAO,KAAK,EAAmB,gBAAgB,EAA2B,MAAM,cAAc,CAAC;AAG/F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AASjD;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,YAAY,CAAC;IACvB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAC;CACb;AAED,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC9B,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACnC,uEAAuE;IACvE,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iFAAiF;IACjF,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;;OAIG;IACH,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB;;;;;;OAMG;IACH,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC;;;;;;;;;;;;;;OAcG;IACH,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAqED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;CACxE;AAuSD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,OAAO,GAAE,cAAmB,GAC3B,eAAe,CAgLjB;AAED,4DAA4D;AAC5D,MAAM,WAAW,WAAW;IAC1B,qBAAqB;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,OAAO,GAAE,cAAmB,GAC3B;IACD,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;CAC1C,CAwCA"}
package/dist/loader.js CHANGED
@@ -36,7 +36,9 @@
36
36
  * The identity those files really use was already declared in record-key.ts and
37
37
  * already proved unique over the shipped pack; recordsComposable now asks it.
38
38
  * What is left in phase 2 is `constants` and `visuals` (config singletons, where
39
- * whole-file IS the meaning) and `history` (no per-record identity at all).
39
+ * whole-file IS the meaning) and `history` (keyed by chart and roll since
40
+ * 2026-10-03, but its record order is what a chart's rolls mean, so a pack's
41
+ * records still replace the file and only the per-record ops use the key).
40
42
  *
41
43
  * NOTHING IS DROPPED IN SILENCE. This is the invariant the whole file exists to
42
44
  * hold. Until 2026-07-29 phase 2 did not exist: a `patches` / `replaces` /
@@ -134,7 +136,7 @@ function isNamedRecord(r) {
134
136
  */
135
137
  function recordsComposable(file, records) {
136
138
  const spec = keySpecFor(file);
137
- if (spec.kind === "singleton")
139
+ if (spec.kind === "singleton" || spec.wholeFile === true)
138
140
  return false;
139
141
  const claimants = new Map();
140
142
  const keysOf = [];
@@ -218,8 +220,8 @@ function applyPassthroughOps(file, records, ordered, providerId, baseId, refused
218
220
  const hasOps = ordered.some((p) => p.files[file] !== undefined && perRecordOps(p.files[file]).length > 0);
219
221
  if (!hasOps)
220
222
  return unmodified();
221
- /* No declared identity (history: chart/next/roll/phrase are all values a mod
222
- * would change). Every op is reported and none is applied - the one honest
223
+ /* No declared identity (a mod-only file with no `name` and no entry in
224
+ * record-key.ts). Every op is reported and none is applied - the one honest
223
225
  * answer, because inventing a key here would mis-merge instead of dropping. */
224
226
  if (RECORD_KEY_SPECS[file] === undefined && !recordsKeyedByName(records)) {
225
227
  for (const pack of ordered) {
@@ -444,7 +446,7 @@ export function composeContentPacks(packs, options = {}) {
444
446
  if (providerId !== "") {
445
447
  /* Whole-file replacement is destructive and used to be invisible: the
446
448
  * previous provider's records simply vanished. Say so. */
447
- refused.refuse(p.manifest.id, `${f} replaces the whole file, discarding ${out[f].length} record(s) from ${providerId} - ${f} records have no ref of their own, so a whole file is the only thing that can be added to it`);
449
+ refused.refuse(p.manifest.id, `${f} replaces the whole file, discarding ${out[f].length} record(s) from ${providerId} - ${f} records cannot be added one at a time, so a whole file is the only thing that can be added to it`);
448
450
  }
449
451
  out[f] = [...contrib.records];
450
452
  providerId = p.manifest.id;
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,8CAA8C;AAC9C,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,iFAAiF;AACjF,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,sCAAsC;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC/C,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC;;;;;;;;;OASG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC;IACjE;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,UAAU;;IAQrB,2DAA2D;gBAC/C,QAAQ,EAAE,OAAO;IAK7B,uEAAuE;IACvE,IAAI,EAAE,IAAI,MAAM,CAEf;IAED;;;;;;OAMG;IACH,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAKpC,0EAA0E;IAC1E,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI7B,mCAAmC;IACnC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI;IAOjD,4DAA4D;IAC5D,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI;IAOrE,oDAAoD;IACpD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAO5D,yCAAyC;IACzC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAKvC,qEAAqE;IACrE,QAAQ,IAAI,YAAY;IAMxB,uEAAuE;IACvE,MAAM,IAAI,UAAU;IAcpB;;;OAGG;IACH,IAAI,IAAI,WAAW,EAAE;IAgBrB;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY;CAsGvC;AAED,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,QAAQ,EAAE,OAAO,GAAG,UAAU,CAExD"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,8CAA8C;AAC9C,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,iFAAiF;AACjF,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,sCAAsC;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC/C,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC;;;;;;;;;OASG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC;IACjE;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,UAAU;;IAQrB,2DAA2D;gBAC/C,QAAQ,EAAE,OAAO;IAK7B,uEAAuE;IACvE,IAAI,EAAE,IAAI,MAAM,CAEf;IAED;;;;;;OAMG;IACH,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAKpC,0EAA0E;IAC1E,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI7B,mCAAmC;IACnC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI;IAOjD,4DAA4D;IAC5D,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI;IAOrE,oDAAoD;IACpD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAO5D,yCAAyC;IACzC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAKvC,qEAAqE;IACrE,QAAQ,IAAI,YAAY;IAMxB,uEAAuE;IACvE,MAAM,IAAI,UAAU;IAcpB;;;OAGG;IACH,IAAI,IAAI,WAAW,EAAE;IAgBrB;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY;CAuGvC;AAED,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,QAAQ,EAAE,OAAO,GAAG,UAAU,CAExD"}
package/dist/project.js CHANGED
@@ -192,7 +192,7 @@ export class ModProject {
192
192
  * reason. */
193
193
  const findings = checkPacks([mine], all);
194
194
  /* THE ONE THAT COSTS THE WHOLE GAME, PROMOTED TO AN ERROR. A file whose
195
- * records have no ref of their own can only be contributed WHOLE, so a mod
195
+ * records cannot be added one at a time can only be contributed WHOLE, so a mod
196
196
  * that ships one discards whatever the previous provider put there. The
197
197
  * loader already says so in `problems`, but a line in a list is not
198
198
  * proportionate to replacing the base game's copy of a file, and a builder
@@ -205,7 +205,8 @@ export class ModProject {
205
205
  * Since 2026-08-08 composition keys by recordRefKeys and all three merge per
206
206
  * record, so what is left here is `constants` and `visuals` - config
207
207
  * singletons, where "use mine" is what shipping the file MEANS - and
208
- * `history`, which has no per-record identity to key on. */
208
+ * `history`, whose records have a key for patching but whose order is
209
+ * what a chart's rolls mean, so a record cannot be added on its own. */
209
210
  const mineId = this.#manifest.id;
210
211
  for (const problem of composed.problems) {
211
212
  if (!problem.startsWith(`${mineId}: `) || !problem.includes("replaces the whole file")) {
@@ -216,9 +217,9 @@ export class ModProject {
216
217
  file: problem.slice(mineId.length + 2).split(" ")[0] ?? "(unknown)",
217
218
  record: mineId,
218
219
  rule: "file/whole-file-replacement",
219
- message: `${problem}. Records in this file have no ref of their own, so there is ` +
220
- "nothing to add one to: use `patchFields` or `replace` to change what is " +
221
- "already there, rather than shipping a mod that deletes the base game's copy.",
220
+ message: `${problem}. Records in this file cannot be added one at a time, so ` +
221
+ "shipping them replaces the file: use `patchFields` or `replace` to change " +
222
+ "what is already there, rather than shipping a mod that deletes the base game's copy.",
222
223
  });
223
224
  }
224
225
  if (core === undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,9 @@
3
3
  * string `name`.
4
4
  *
5
5
  * CURRENT STATE, FIRST, BECAUSE THIS COMMENT USED TO MISLEAD. Every record file
6
- * but ONE is addressable per record today: 24 by a unique `name`, 19 by the
7
- * explicit specs in this file, and `history` by nothing - and an op against
8
- * `history` is REPORTED, never silently dropped. Two independent reviewers read
6
+ * is addressable per record today: 24 by a unique `name` and 20 by the explicit
7
+ * specs in this file. `history` was the one exception until 2026-10-03, when it
8
+ * gained its (chart, roll) key below. Two independent reviewers read
9
9
  * the older wording, took the "the other 20 files do not fit it" paragraph below
10
10
  * for the present tense, and filed the same non-existent P1 ("20 files silently
11
11
  * discard patch/replace/remove, including object, ego_item, vault, trap, store,
@@ -98,10 +98,17 @@
98
98
  * verified unique over the shipped core pack (see record-key.test.ts, which
99
99
  * reads the real pack and fails if a declared key stops being unique).
100
100
  *
101
- * `history` is deliberately absent: a history record is
102
- * `{chart:{chart,next,roll}, phrase}` and every part of that is a value a mod
103
- * would legitimately change, so it has no identity to key on. An op against it
104
- * is REPORTED, not applied - see loader.ts.
101
+ * `history` was absent until 2026-10-03, on the reasoning that a record is
102
+ * `{chart:{chart,next,roll}, phrase}` and a mod could change any part of it.
103
+ * That left history.txt's phrases the one piece of gamedata no content patch
104
+ * could correct. The identity upstream itself uses is (chart, roll): get_history
105
+ * walks one chart's entries and takes the first whose cumulative `roll` reaches
106
+ * the die, so a roll threshold appears once per chart (a repeat could never be
107
+ * chosen), and `chart` is the node every `next` link names. Neither is the
108
+ * phrase or the link, which are what a correction or a rewiring changes. The key
109
+ * is declared `wholeFile`, because a chart's meaning is its records' ORDER: an
110
+ * added record appended after core's would sit past the roll-100 entry where
111
+ * get_history can never reach it.
105
112
  *
106
113
  * AMBIGUITY IS NAMED, NEVER GUESSED. A key that two records in the same file
107
114
  * claim (object's 5 pairs, ego_item's 25) makes that one ref unaddressable; the
@@ -135,6 +142,14 @@ export type RecordKeySpec = {
135
142
  * stringified: a JSON blob in a ref is not something an author can type.
136
143
  */
137
144
  readonly discriminator?: readonly string[];
145
+ /**
146
+ * The records keep whole-file semantics even though each has a key: a
147
+ * pack's `records` still replace the file, and only the per-record ops
148
+ * (patch, replace, fieldPatch, remove) use the key. For a file whose
149
+ * record ORDER carries meaning, where composition appending a new record
150
+ * at the end would change what the file says.
151
+ */
152
+ readonly wholeFile?: true;
138
153
  } | {
139
154
  readonly kind: "singleton";
140
155
  };
@@ -1 +1 @@
1
- {"version":3,"file":"record-key.d.ts","sourceRoot":"","sources":["../src/record-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6GG;AAKH;;;;;;;;;;GAUG;AACH,MAAM,MAAM,aAAa,GACrB;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC;AAEnC;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAgDpE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EACV,CAAC;AAEvC,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAEtD;AA6DD;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,IAAI,GAAE,aAAgC,GACrC,MAAM,GAAG,IAAI,CAEf;AA2CD;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,IAAI,GAAE,aAAgC,GACrC,SAAS,MAAM,EAAE,CAKnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,IAAI,GAAE,aAAgC,GACrC,MAAM,GAAG,IAAI,CAIf;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASnD"}
1
+ {"version":3,"file":"record-key.d.ts","sourceRoot":"","sources":["../src/record-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoHG;AAKH;;;;;;;;;;GAUG;AACH,MAAM,MAAM,aAAa,GACrB;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;CAC3B,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC;AAEnC;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAqDpE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EACV,CAAC;AAEvC,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAEtD;AA6DD;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,IAAI,GAAE,aAAgC,GACrC,MAAM,GAAG,IAAI,CAEf;AA2CD;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,IAAI,GAAE,aAAgC,GACrC,SAAS,MAAM,EAAE,CAKnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,IAAI,GAAE,aAAgC,GACrC,MAAM,GAAG,IAAI,CAIf;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASnD"}
@@ -3,9 +3,9 @@
3
3
  * string `name`.
4
4
  *
5
5
  * CURRENT STATE, FIRST, BECAUSE THIS COMMENT USED TO MISLEAD. Every record file
6
- * but ONE is addressable per record today: 24 by a unique `name`, 19 by the
7
- * explicit specs in this file, and `history` by nothing - and an op against
8
- * `history` is REPORTED, never silently dropped. Two independent reviewers read
6
+ * is addressable per record today: 24 by a unique `name` and 20 by the explicit
7
+ * specs in this file. `history` was the one exception until 2026-10-03, when it
8
+ * gained its (chart, roll) key below. Two independent reviewers read
9
9
  * the older wording, took the "the other 20 files do not fit it" paragraph below
10
10
  * for the present tense, and filed the same non-existent P1 ("20 files silently
11
11
  * discard patch/replace/remove, including object, ego_item, vault, trap, store,
@@ -98,10 +98,17 @@
98
98
  * verified unique over the shipped core pack (see record-key.test.ts, which
99
99
  * reads the real pack and fails if a declared key stops being unique).
100
100
  *
101
- * `history` is deliberately absent: a history record is
102
- * `{chart:{chart,next,roll}, phrase}` and every part of that is a value a mod
103
- * would legitimately change, so it has no identity to key on. An op against it
104
- * is REPORTED, not applied - see loader.ts.
101
+ * `history` was absent until 2026-10-03, on the reasoning that a record is
102
+ * `{chart:{chart,next,roll}, phrase}` and a mod could change any part of it.
103
+ * That left history.txt's phrases the one piece of gamedata no content patch
104
+ * could correct. The identity upstream itself uses is (chart, roll): get_history
105
+ * walks one chart's entries and takes the first whose cumulative `roll` reaches
106
+ * the die, so a roll threshold appears once per chart (a repeat could never be
107
+ * chosen), and `chart` is the node every `next` link names. Neither is the
108
+ * phrase or the link, which are what a correction or a rewiring changes. The key
109
+ * is declared `wholeFile`, because a chart's meaning is its records' ORDER: an
110
+ * added record appended after core's would sit past the roll-100 entry where
111
+ * get_history can never reach it.
105
112
  *
106
113
  * AMBIGUITY IS NAMED, NEVER GUESSED. A key that two records in the same file
107
114
  * claim (object's 5 pairs, ego_item's 25) makes that one ref unaddressable; the
@@ -164,6 +171,11 @@ export const RECORD_KEY_SPECS = {
164
171
  paths: ["name"],
165
172
  discriminator: ["type", "item.tval"],
166
173
  },
174
+ /* history: the chart a record belongs to and its cumulative roll threshold,
175
+ * which is how get_history (player-birth.c) picks it. `core:50--100` is
176
+ * "You have blue-gray eyes, ". Whole-file, because order within a chart is
177
+ * what the rolls mean (see the header). */
178
+ history: { kind: "fields", paths: ["chart.chart", "chart.roll"], wholeFile: true },
167
179
  };
168
180
  /**
169
181
  * Files with a declared key spec, sorted. Exported so a test can assert the set
@@ -1 +1 @@
1
- {"version":3,"file":"record-key.js","sourceRoot":"","sources":["../src/record-key.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"record-key.js","sourceRoot":"","sources":["../src/record-key.ts"],"names":[],"mappings":"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"}
package/docs/AUTHORING.md CHANGED
@@ -245,7 +245,7 @@ Until 2026-08-08 the test was "a unique `name`", and three files failed it on co
245
245
  | `vault` | 162 | adds one, 163 |
246
246
  | `store`, `flavor`, `brand`, `slay`, `object_base`, `trap`, `names`, ... | - | adds one, keyed by whatever upstream keys it by |
247
247
 
248
- `constants`, `visuals` and `history` still take a whole file. `constants` and `visuals` are config singletons: the file is their identity, the host binds exactly one, and shipping `constants.json` means "use mine". `history` has no per-record identity at all: a history record is `{chart:{chart,next,roll}, phrase}`, and a mod could legitimately change any part of it. For those three, `ModProject.build` still raises `file/whole-file-replacement` as an `error`, so an author cannot replace the base game's copy of a file without noticing.
248
+ `constants`, `visuals` and `history` still take a whole file. `constants` and `visuals` are config singletons: the file is their identity, the host binds exactly one, and shipping `constants.json` means "use mine". `history` records have refs, so a mod can patch, replace or remove a single phrase, but it cannot add a record on its own. The game walks a chart's records in file order and takes the first whose `roll` reaches the die, so a record added after core's last one would never be picked. For those three, `ModProject.build` still raises `file/whole-file-replacement` as an `error`, so an author cannot replace the base game's copy of a file without noticing.
249
249
 
250
250
  ### What a record is called
251
251
 
@@ -253,6 +253,7 @@ Refs did not change. `patchFields`, `replace` and `remove` already used the per-
253
253
 
254
254
  - `object` is `type + name`, so the Dagger is `core:sword--dagger`;
255
255
  - `ego_item` is `name`, plus a `#` discriminator where core ships a name twice, as in `core:of-acid#shot-arrow`;
256
+ - `history` is `chart + roll`, the numbers on the record's `chart:` line in history.txt, so `chart:50:51:100` ("You have blue-gray eyes, ") is `core:50--100`;
256
257
  - `store` is its `STORE_*` code, `brand` and `slay` their `code`, `flavor` its base tval, and so on.
257
258
 
258
259
  A record answers to several refs: its base key, its discriminated form, and, as an alias, the lossy slug used before 2026-08-08, so refs written against an older engine keep working. An alias is dropped where it would shadow a *different* record's real name. `*Healing*`'s old ref, for example, is plain `Healing`'s current one, and an old alias must not take a name away from another record.
@@ -200,7 +200,7 @@ Outside the guaranteed subset, `ctx.core` can change in any release; the ratchet
200
200
 
201
201
  ## Who finds out first
202
202
 
203
- The **mod canary** (`.github/workflows/mod-canary.yml`) runs the curated list against this build daily and whenever the list changes: every repository in `mods/registry.json` is discovered the way the game discovers it, and its manifest is put through this build's gates. An engine release that would strand a curated mod shows up in the canary rather than in a player's install. It does the job of SMAPI's compatibility list automatically, and it lets a release be held back before it ships.
203
+ The **mod canary** (`.github/workflows/mod-canary.yml`) checks the Recommended mods list against this build daily and whenever the list changes. Every repository in `mods/registry.json`, community mods included, is discovered the way the game discovers it, and its manifest goes through the same checks this build applies at install and load time. An engine release that would strand a listed mod shows up in the canary rather than in a player's install. It does the job of SMAPI's compatibility list automatically, and it lets a release be held back before it ships.
204
204
 
205
205
  That covers curated mods only. A mod nobody has listed finds out the same way every mod always has, which is why the gates above degrade instead of refusing.
206
206
 
package/docs/MOD_REACH.md CHANGED
@@ -20,13 +20,13 @@ The target is a game built for modding throughout: a mod can override code, reso
20
20
  | `registry:*` capabilities with real, wired, tested code | **18** (`blow`, `command`, `effect`, `effect-info`, `glyph`, `menu`, `message`, `monster`, `profile`, `projection`, `randart`, `room`, `rune`, `store`, `tiles`, `tval`, `ui-entry`, `vocab`), and the list is `REGISTRY_CAPABILITIES` in `mod/registry-host.ts`, which is the one source the vocabulary has |
21
21
  | Non-test callers of that registry host in a RELEASE build | **2**, both in `packages/web/src/main.ts`: `createModRegistryHost` is called for every loaded mod plugin, which is the disk path |
22
22
  | Gamedata record files a mod can contribute to | **44** of upstream's 45 |
23
- | ...of those, addressable PER RECORD (patch / replace / remove) | **43** of 44: 24 by a unique `name`, 19 by a declared key (`record-key.ts`); since 2026-08-08 the same key also decides what a record ADDED to those files is called |
24
- | ...whole-file-replacement only | **1** (`history`, whose records hold no field that is not a value a mod would change; an op against it is REPORTED) |
23
+ | ...of those, addressable PER RECORD (patch / replace / remove) | **44** of 44: 24 by a unique `name`, 20 by a declared key (`record-key.ts`); since 2026-08-08 the same key also decides what a record ADDED to those files is called |
24
+ | ...whole-file-replacement only | **0** since 2026-10-03, was 1: `history` is keyed by chart and roll (`core:50--100`) |
25
25
  | Individual records of the shipped pack that NO ref can name | **0**, was 73 before 2026-08-08, 61 of them in `ego_item` |
26
26
  | A mod can ADD a field core has never heard of, and read it at runtime | **YES** (2026-08-08): on **15** bound record types, not 2; was silently dropped by every binder before |
27
27
  | ...bound record types that carry a mod's own fields | **15** of the 44 files; the other 29 have no bound counterpart a plugin can hold, or bind into a structure keyed by something other than the record; `mod/extension.test.ts` lists them by name |
28
28
  | A mod's added field is NAMESPACED and DECLARED, so two mods cannot collide | **YES** (2026-08-08): `"gore:bleed"`, declared in the manifest under `fields`; undeclared is stripped and reported |
29
- | Gamedata record files a mod can ADD a record to without replacing the file | **41** of 44 (2026-08-08), was 24. `object` (375 records), `ego_item` (107) and `vault` (162) joined the other 38 when composition stopped keying on `slugify(name)` and started keying on `recordRefKeys`. The 3 left are `constants` and `visuals` (config singletons, where whole-file IS the meaning) and `history` (no per-record identity). `ModProject.build` raises a whole-file replacement as an `error` rather than a line in a list |
29
+ | Gamedata record files a mod can ADD a record to without replacing the file | **41** of 44 (2026-08-08), was 24. `object` (375 records), `ego_item` (107) and `vault` (162) joined the other 38 when composition stopped keying on `slugify(name)` and started keying on `recordRefKeys`. The 3 left are `constants` and `visuals` (config singletons, where whole-file IS the meaning) and `history` (keyed by chart and roll, but a chart's record order decides which phrase a roll picks). `ModProject.build` raises a whole-file replacement as an `error` rather than a line in a list |
30
30
  | An author is TOLD what a new record needs, and what core's comparable records do | **YES** (2026-08-08): `draftRecord` / `checkRecords` / `ModProject`, measured from core's 3,279 records; **37** declared reference edges, each run over the shipped pack (`docs/modding/AUTHORING.md`) |
31
31
  | Resource categories a non-bundled mod can supply or override | **7** of 7 (2026-08-09) - tiles (gap 8), then sounds, fonts, pref files, help pages and art (gap 7), then UI strings, which needed an i18n layer to be supplied INTO before the field could honestly exist (gap 14) |
32
32
 
@@ -64,7 +64,7 @@ Game behaviour living in `switch` statements with nothing to register into is no
64
64
  | `messageText` | `packages/web/src/main.ts` (host, not core) | Restate message text | What a message MEANS - restating only, by contract |
65
65
  | `screenText` | `packages/web/src/overlay.ts` (host, not core): screens shown through `showTextScreen`, and the row-0 prompt functions | Restate help-page lines, table cells, legends, titles, footers and prompts, matched by screen id, part and row | What the text means; art blocks; menus, which have their own `ui:menu.replace` seam; text drawn by other means than those two paths |
66
66
  | `characterBackground` | `packages/web/src/screens.ts` (host, not core): the character sheet, birth screen and character dump | Restate the whole background paragraph before it is wrapped | The stored `player.history` or the save |
67
- | `objectInfoText` | `obj/object-info.ts`, `objectInfo` | Restate each fragment of an item description | What the item does or what the player knows about it |
67
+ | `objectInfoText` | `obj/object-info.ts`, `objectInfo` | Restate each fragment of an item description, given the section that wrote it, the item's tval, and its kind as the player knows it (the flavour until the kind is learned) | What the item does or what the player knows about it |
68
68
  | `effectIntro` | `obj/object-info.ts`, `describeEffect` | Restate the introduction to an effect description, given whether the effect is known, the item class and whether it is aimed or activated | The effect description that follows the introduction |
69
69
  | `optionsChanged` | the options pages, through `GameState.modHooks` | Observe the option state after a change. Folded `all-observe`: every mod's handler runs, none can veto | The option values themselves; it is notification, not interception |
70
70
 
@@ -440,7 +440,7 @@ Composition happens in two phases. A file composes per record only when every co
440
440
 
441
441
  Over the shipped core pack the split is 41 composable and 3 passthrough. The "the shipped pack" test in `loader.test.ts` reads `packages/content/pack` and asserts the split by name.
442
442
 
443
- Every record file composes except three, which are whole-file only for two different reasons. `constants` and `visuals` are config singletons: the file is the identity and the host binds one, so shipping the file means "use mine". `history` has no per-record identity at all, because a history record is `{chart:{chart,next,roll}, phrase}` and a mod could want to change any part of it. An op against `history` is reported rather than dropped.
443
+ Every record file composes except three, which are whole-file only for two different reasons. `constants` and `visuals` are config singletons: the file is the identity and the host binds one, so shipping the file means "use mine". `history` records each have a ref, their chart and roll, but the order of a chart's records decides which phrase a roll picks, so a pack's `history` records still replace the file and only the per-record ops use the ref.
444
444
 
445
445
  Before 2026-08-08 the split was 24 and 20, because the composability test asked for a unique `name`. That one condition made `object` (375 records), `ego_item` (107) and `vault` (162) unmergeable. All three carry a `name`, and core's own data repeats names: Angband marks a greater form by reusing the name with a mark (`Acquirement` / `*Acquirement*`), and `ego_item` ships 23 names twice. A mod adding one object therefore replaced all 375, so the three files most worth adding to were the three a mod could only take over wholesale. Composition now keys by `recordRefKeys`, the identity `record-key.ts` already declared and had already shown to be unique over the shipped pack, and all three merge per record.
446
446
 
@@ -455,7 +455,7 @@ An earlier version of this paragraph said "a `patches` entry aimed at a passthro
455
455
  - Whole-file `records` semantics still apply to a config singleton: a mod that ships `constants.json` means "use mine", and the host binds one. `ModProject.build` raises that as an `error`, so an author learns about replacing the base game's copy of the file up front rather than from a line in a list.
456
456
  - Per-record ops apply on top, in load order, keyed by the per-file identity declared in `record-key.ts` (`store` by its `STORE_*` code, `object_base` by tval, `trap` by the `{name,desc}` pair, `constants` by the file). `composePacks` applies them for the 41 composable files and `applyPassthroughOps` (`loader.ts`) for the 3 passthrough ones.
457
457
  - Duplicate slugs, which the old note correctly said nothing handled, are handled in two pieces. `keySlug` keeps the `*` and `+` that `slugify` dropped, which was all of `object`'s and `vault`'s problem and 16 of `ego_item`'s. A declared discriminator separates the names core really does repeat (`core:of-acid#shot-arrow-bolt`). Over the shipped pack, no record is left that a ref cannot name, down from 73.
458
- - `history` is the one file with no per-record identity, for the reason given above, and an op against it is reported rather than dropped.
458
+ - `history` is keyed by chart and roll (`core:50--100`) since 2026-10-03, so a mod can correct one phrase with a patch. It stays whole-file for added records, for the reason given above.
459
459
 
460
460
  A mod can now patch a single object, ego item, vault, trap, store, brand, slay, object base, projection or constant. Where a ref is ambiguous, the refusal lists the refs that are not.
461
461
 
package/docs/MOD_SEAMS.md CHANGED
@@ -100,7 +100,7 @@ The `Fold` column uses the code's own vocabulary. `MOD_HOOK_FOLDS` (`packages/co
100
100
  | `messageText(raw)` | `chained` | `packages/web/src/main.ts` (the HOST's single message sink, not core) | `?? raw` - show what core was given, warts and all |
101
101
  | `screenText(raw, site)` | `chained` | `packages/web/src/overlay.ts` (the HOST's `showTextScreen`, through `restateView` in `screen-view.ts`, and its row-0 prompt functions) | `?? raw` - show the screen text or prompt as built |
102
102
  | `characterBackground(text)` | `chained` | `packages/web/src/screens.ts` (the HOST's `historyTextBlock`, which feeds the character sheet, the birth screen and the character dump) | `?? text` - show the background get_history stored |
103
- | `objectInfoText(text)` | `chained` | `obj/object-info.ts` (`objectInfo`, once per fragment of the finished textblock) | `?? text` - write the fragment unchanged |
103
+ | `objectInfoText(text, site)` | `chained` | `obj/object-info.ts` (`objectInfo`, once per fragment of the finished textblock) | `?? text` - write the fragment unchanged |
104
104
  | `effectIntro(intro)` | `chained` | `obj/object-info.ts` (`describeEffect`, for the unknown-effect sentence and the known-effect lead-in) | `?? intro.text` - write 4.2.6's introduction |
105
105
  | `optionsChanged(snapshot)` | `all-observe` | `packages/web/src/options.ts` (`notifyOptionsChanged`, at the end of `runOptionsMenu`) | nothing happens; core reads no answer |
106
106
  | `monsterBecameVisible(mon)` | `all-observe` | `game/known.ts` (`updateMon`'s "it was previously unseen" branch, reached from `updateMonsters`, `monsterSwap`, and every other `updateMon` call site) | nothing: the visibility flag was already set with no mod loaded |
@@ -128,9 +128,9 @@ Five hooks let a mod reword text that 4.2.6 writes: `messageText`, `screenText`,
128
128
 
129
129
  `screenText` gets the text of any screen opened with `showTextScreen`, a help page for example, and the prompt drawn by `getString`, `getCheck` and the other row-0 prompt functions in `overlay.ts`. Each piece arrives once, when the screen opens or the prompt appears. The second argument is a `ScreenTextSite` with the screen id and the part; for a table cell it adds the column key and the rest of the row. A mod needs the row in `core:equip-cmp-select-help`, where two rows read "move selection one page up" and only the `"n, PgDn"` row is a typo. Prompts use the site `{ screen: "core:prompt", part: "prompt" }` and arrive before "[y/n] " is appended; the typing field then starts right after the reworded prompt.
130
130
 
131
- `characterBackground` gets the background paragraph built from `history.txt` in one piece, before the 72-column wrap, so a phrase split across two screen lines still arrives whole. Content patches cannot reach these phrases because history records have no record key.
131
+ `characterBackground` gets the background paragraph built from `history.txt` in one piece, before the 72-column wrap, so a phrase split across two screen lines still arrives whole. A content patch can correct a phrase too, through the history record's `core:<chart>--<roll>` ref. The two reach different characters: the patch changes the text a new character is born with, while `characterBackground` also rewords the background of a character that already exists.
132
132
 
133
- `objectInfoText` gets an item description one fragment at a time, in the pieces `obj-info.c` appends, so `"Affects your stealth\n"` comes as one string. Item inspection, object recall, the character dump and spoiler files all pass through it.
133
+ `objectInfoText` gets an item description one fragment at a time, in the pieces `obj-info.c` appends, so `"Affects your stealth\n"` comes as one string. Its second argument, an `ObjectInfoTextSite`, says which section wrote the fragment, which item it describes and whether the player knows that item's kind. The section is `stats` for the "Affects your" lines, `effect` for everything describe_effect writes, `break` for the blank line between two sections, and so on through `ObjectInfoSection`. The item is given as its `tval`, spelled as in object.txt, and its `kind`, which holds only what the player knows. Once the player knows the kind, `kind` is its object.txt name, such as `"Cure Light Wounds"`, and `aware` is true. Until then `kind` is the flavour the player sees, such as `"Light Blue"` or a scroll's title, as the knowledge menu lists it. A section only ever arrives with a line the player can read, so a slay or curse whose rune is still unknown sends no `slays` or `curses` fragment. Item inspection, store examine, object recall, the character dump, spoiler files and a plugin's `inspectItem` all pass through it.
134
134
 
135
135
  `effectIntro` gets the words that open an effect description, such as 4.2.6's "It can be aimed.\n" or "When activated, it ". The `EffectIntro` it receives also says whether the effect is known, the item class, whether it is aimed, and whether it comes from an activation. From those a mod can write the later upstream wording, "It requires a target." or "When used, it ". The item class is what tells a mod when to say "It may require a target.", because 4.2.6 marks every unknown wand and rod as aimed.
136
136
 
@@ -244,16 +244,22 @@ if (sim) {
244
244
  sim.delta.ac; // armour class difference
245
245
  sim.delta.maxSp; // what it costs a caster
246
246
  sim.delta.resists; // per element, ELEM order
247
+ sim.delta.unknownRunes; // an item put on or taken off may have unlearned runes
247
248
  sim.after.player.blows; // the frozen PlayerView for that loadout
248
249
  sim.after.stats; // every field of upstream's player_state
249
250
  }
250
251
  ```
251
252
 
252
- - **It runs the real derive.** `state.derivedFor`, installed by `wireGame`, is `calc_bonuses` with `update: false` over the same options bag the live refresh uses, so the bound timed table and the curse registry come with it. That is the only source. A derive assembled by a caller would have to guess at both, and a hypothetical loadout measured with a thinner bag than the live one gives a wrong answer that looks like a right one. Where no session installed the accessor (the worldless harness), it is absent and the function returns `null`.
253
+ - **It runs the engine's own derive.** `state.derivedFor`, installed by `wireGame`, is `calc_bonuses` with `update: false` over the same options bag the live refresh uses, so the bound timed table and the curse registry come with it. That is the only source. A derive assembled by a caller would have to guess at both, and a hypothetical loadout measured with a thinner bag than the live one gives a wrong answer that looks like a right one. Where no session installed the accessor (the worldless harness), it is absent and the function returns `null`.
254
+ - **It counts only what the player knows.** The derive is the `known_only` pass behind the character sheet, so a resist, flag or armour bonus from a rune the player has not learned changes none of the numbers, just as it shows nowhere in the `ItemView`s. `before` and `after` both use it, and no call returns the real numbers. `delta.unknownRunes` is true when an item put on or taken off may have runes the player has not learned: it carries the `{??}` marker, or it has only been seen from a distance and has not been assessed, in which case it can turn out to have none. One flag covers the whole change without saying which item set it; `compareLoadoutSlots` gives one per slot. A mod can use it to tell the player an item may do more than its numbers rather than report a zero. The live view's `player()` reads the same known state, so it matches `before.player` in everything but `light`: in a daytime town the live derive gives no light radius and a simulated one counts the torch. Compare an `after` with its own `before`, not with `player()`.
253
255
  - **It writes nothing**: not the state, the player, the gear or any object. `update: false` keeps `calc_bonuses`' own two faithful side effects (zeroing `TMD_FASTCAST` on a stun grade, and the town-light redraw flag) out of it. A test asserts that the live `PlayerState` object is the same object afterwards, not just an equal one.
254
- - **Changes are expressed as slots and gear references, not equipment arrays.** `wield` routes each item through the engine's own `wield_slot`, so the second of a pair of rings lands in the second ring slot as it would in play. `carry` takes something into the pack, `remove` empties a slot into the pack, and `release` gives a stack up entirely, emptying its slot when the handle names worn gear. A reference is a gear handle, a shop plus a stock index for a ware (which is not in the gear and so has no handle), or a `GameObject` for a caller inside the engine. A reference that names nothing is skipped and listed in `unresolved`, so a decision ladder evaluating a hundred candidates does not fail on one stale handle.
256
+ - **Changes are expressed as slots and gear references, not equipment arrays.** `wield` routes each item through the engine's own `wield_slot`, so the second of a pair of rings lands in the second ring slot as it would in play. `carry` takes something into the pack, `remove` empties a slot into the pack, and `release` gives a stack up entirely, emptying its slot when the handle names worn gear. A reference is a gear handle, a shop plus a stock index for a ware (which is not in the gear and so has no handle), a grid plus a pile index for an item on the floor, or a `GameObject` for a caller inside the engine. A reference that names nothing is skipped and listed in `unresolved`, so a decision ladder evaluating a hundred candidates does not fail on one stale handle.
255
257
  - **The answer is every derived field, not a score.** An autoplayer reduces it to one number, while a player comparing two items wants to see which resist was traded for which. A scalar serves the first and not the second, and the two should never disagree about the underlying derive, so `before`, `after` and `delta` carry every field of `player_state` plus max hitpoints, max mana, the armour encumbrance and the carried weight. `neo-angband-mod-borg` uses a fraction of it today.
256
258
 
259
+ An item on the floor is named as `{ from: "floor", x, y, index }`: the grid it lies on and its index in the pile there, the same numbers `inspectItem`'s floor form takes and `floorItems()` reports as `floorIndex`. The reference is a position. It names whatever lies at that index when the call runs, and only if the player remembers it on that grid, so once the pile changes a reference kept from an earlier turn can name a different object, as `inspectItem`'s floor form can. Read `floorItems()` again before reusing one. An object on a square the player has never seen, or one only sensed, lands in `unresolved` like a stale handle, and so does a grid off the map or an index that is not a whole number from zero up to the end of the pile. Wearing a floor item adds its weight to the carried total, since the character has to pick it up first. `compareLoadoutSlots` takes the same reference (section 4k).
260
+
261
+ The answer lists the pack and everything worn, so a call needs `state:inventory.read` on top of `state:player.read`, even with an empty change. A shop ware in `wield`, `wieldAt` or `carry` also needs `state:stores.read`, and a floor item needs `state:floor.read`. Without one of these the call throws `AgentCapabilityError`. `state:*.read` grants them all. A `GameObject` reference throws `AgentCapabilityError` from any view built with capabilities, `state:*.read` included, because only trusted code inside the engine holds one; a mod names the item by gear handle, shop ware or floor position instead.
262
+
257
263
  The accessor lives on `AgentView`, so the `ItemView`s in the answer are built with the same `AgentViewDeps` as the live view's. That matters for correctness: an object that carried `value` in one read and not the other would change what an agent decides about the same object depending on which read produced it. The exported `simulateLoadout(state, change, opts)` is the same function, for callers inside the engine.
258
264
 
259
265
  ## 4b. `ctx.ui.openPanel` - a piece of web page above the game
@@ -394,7 +400,7 @@ if (snap && snap.phase === "play") {
394
400
 
395
401
  The map cells and the agent's message buffer are not in the core capture. The map has its own bulk read, and `messages()` drains a per-decision buffer. The host snapshot adds `messages` under `state:messages.read` from the message history without draining that buffer. Its frozen entries and token can be kept across input waits. The open question is in `prompt` when `state:interaction.read` is granted.
396
402
 
397
- The core capture adds `quiver`, `equipmentSlots`, and `floorHere`. The first two need `state:inventory.read`; the local floor pile needs `state:floor.read`. Each `ItemView` carries `kindKey` and `nameColor`, the colour the inventory draws its name in, given as a colour name such as `"light umber"`. `label` is the kind's raw name, such as `& Dagger~`. `name` is the name the inventory shows, such as `a Potion of Cure Light Wounds`, and `ignored` is true while the game ignores the object. A carried object's `itemKey` is `gear:<handle>`. A floor object has handle 0, a `floorIndex` for its place in the pile, and an `itemKey` of `floor:<x>,<y>:<index>`, which changes whenever the pile does. `equipmentSlots` follows body.txt slot order and names both slots of a pair. The player part reports `learnableSpells` from the current upkeep count. The spellbook rows report `studyEligible` and `infoLine` from the game's spell checks and menu info function.
403
+ The core capture adds `quiver`, `equipmentSlots`, and `floorHere`. The first two need `state:inventory.read`; the local floor pile needs `state:floor.read`. Each `ItemView` carries `kindKey` and `nameColor`, the colour the inventory draws its name in, given as a colour name such as `"light umber"`. `label` is the kind's raw name, such as `& Dagger~`, or the flavour for an item the player has not identified. `name` is the name the inventory shows, such as `a Potion of Cure Light Wounds`, and `ignored` is true while the game ignores the object. A carried object's `itemKey` is `gear:<handle>`. A floor object has handle 0, a `floorIndex` for its place in the pile, and an `itemKey` of `floor:<x>,<y>:<index>`, which changes whenever the pile does. `equipmentSlots` follows body.txt slot order and names both slots of a pair. The player part reports `learnableSpells` from the current upkeep count. The spellbook rows report `studyEligible` and `infoLine` from the game's spell checks and menu info function.
398
404
 
399
405
  ## 4h. `ctx.knownLevel()` - the player's whole remembered level
400
406
 
@@ -493,11 +499,13 @@ const rules = ctx.inspect?.itemRules();
493
499
 
494
500
  `inspectItem` accepts a carried or worn handle, `{ floor: { x, y, index } }`, or `{ store, index }` for a stock entry. Store stock also requires `state:stores.read`. It returns the existing title and text plus frozen `sections`: a title entry, the first object_info paragraph as a description entry, and later paragraphs as separate info entries. A store entry uses object_info's store mode, so a book on a shelf can be inspected. A floor object answers only when the player remembers that object; a grid the player has merely sensed returns null. Inspecting a floor object needs `state:inventory.read`, as a carried one does, while `floorHere` in the snapshot needs `state:floor.read`. `monsterRecall` returns existing lore under `state:monsters.read`, or null for a race the player has not seen. Neither read learns a kind or ego or creates lore.
495
501
 
502
+ An item result also carries `combat`, the numbers behind its Combat info lines, or null for an item that has none. `blows` is melee blows per round to the tenth the description shows. `damage` is the average damage per round for a melee weapon, or for ammunition the current launcher fires, and `thrownDamage` is the average per throw for a throwing weapon or a sling stone. Each holds `normal`, the damage against a creature no brand or slay affects; `vs`, one `{ kind, name, damage }` line per known brand or slay, highest first, in the order the description lists them; and `offWeapon`, true when other equipment or a timed effect adds a brand or slay. `multiplier` is the shooting power a launcher shows in its name, or the current launcher's for ammunition it fires. `range` is how far that ammunition reaches in feet, and `breakageChance` is the percent chance that fired ammunition breaks. `tooHeavy` is true when the character is too weak to wield the weapon well. Every value comes from the same calculation as the text and counts only what the character knows of the item. A monster recall has no `combat`. (neostryder/neo-angband#360)
503
+
496
504
  `spellInfo` returns the spell's description, required level, mana cost, live failure chance, and `canCastNow` under `state:spells.read`. Low mana raises the failure chance but still permits the game's over-exertion cast path. `itemTester` lists carried, worn, quivered, and local floor references accepted by the named item command under `state:inventory.read`. Its command codes are `inspect`, `wield`, `takeoff`, `drop`, `inscribe`, `uninscribe`, `activate`, `use-staff`, `aim-wand`, `zap-rod`, `eat`, `quaff`, `read`, `refill`, `cast`, `study`, `browse`, `fire`, `throw`, `use`, and `ignore`.
497
505
 
498
506
  `projectionPath` and `blastArea` return ordered grids under `state:map.read`. They use the game's projection geometry with remembered terrain and visible monsters. Unknown terrain is treated as open for the preview. `blastArea(to, radius, arc)` previews a ball, or the cone of a breath when `arc` gives its width in degrees. Without `arc`, it takes the arc of the effect being aimed. A blast also reports its requested `radius`, its `arc` (null for a ball), the active effect's `element` when one is being aimed, and `wallsStop`. It gives no damage estimate. While a ball or breath direction or targeting prompt is open, `ctx.snapshot().activeBlast` reports the pending effect's radius, element, and arc for a breath, under both `state:map.read` and `state:interaction.read`. Repeating these reads does not change the saved game, knowledge, turn, command queue, or RNG state.
499
507
 
500
- `bookForItem(handle)` maps a carried spellbook to its class book index and spell indices under both `state:spells.read` and `state:inventory.read`. `compareLoadoutSlots({ from: "gear", handle })` or a store reference returns one `simulateLoadout` comparison for each compatible body slot under `state:player.read` and the matching item domain. It includes the second ring slot when that slot can hold the item. The result is token-stamped and frozen.
508
+ `bookForItem(handle)` maps a carried spellbook to its class book index and spell indices under both `state:spells.read` and `state:inventory.read`. `compareLoadoutSlots` takes a gear, store or floor reference (section 4a) and returns one `simulateLoadout` comparison for each compatible body slot, including the second ring slot when that slot can hold the item. It checks the same capabilities as `simulateLoadout` (section 4a) for the one item it is given. Each comparison counts only the runes the player knows, and its `delta.unknownRunes` marks a slot whose item may have runes the player has not learned (section 4a). A floor reference the player does not remember returns no slots. The result is token-stamped and frozen.
501
509
 
502
510
  `travelPath` uses the travel command's `findPath` over remembered terrain and returns steps in walking order, excluding the player's grid. It returns null for an unknown or unreachable destination and while the player is confused. `tileActions` returns accepted command codes in `codes` for a remembered grid under `state:map.read`. Adjacent terrain may offer `tunnel`, `open`, `close`, `disarm`, or `walk`; the player's grid may offer `ascend`, `descend`, or `pickup`. The host accepts `ascend` and `descend` for stairs. Melee uses `walk` toward an adjacent monster because there is no separate `attack` command code. An action still needs the appropriate direction or other arguments when passed to `ctx.intent.submit()`.
503
511
 
@@ -515,6 +523,8 @@ These events contain copied coordinates and scalar values. They do not carry a l
515
523
 
516
524
  `player-command` reports each command the player issues, whether it came from a key, a keymap, the mouse or a mod's `ctx.intent.submit()`. Declare `event:player-command` to receive it. The payload has the command's `code`, its `dir` and a copy of its `args`, `phase` (`play`, or `store` for an item command given inside a shop), and `token`, the input token of the wait the command answered. A `repeat` also carries `repeats`, the command it repeats. The event fires as the game loop takes the command and before it runs, so `ctx.snapshot()` in the handler still describes that wait, and a mod can compare its own choice with the player's. Commands from an installed controller, and the follow-up steps of a run or a repeat count, do not fire it. Buying and selling in a shop are store screen actions rather than commands, so they do not fire it either. A handler that throws is logged, and the command still runs. (neostryder/neo-angband#300)
517
525
 
526
+ `dungeonlevel` reports each arrival on a level, the town included. Declare `event:dungeonlevel` to receive it. It fires once for each level the character arrives on, by stairs, a trapdoor, Word of Recall, deep descent, teleport level or a debug jump, and on entering or leaving the single-combat arena, which Angband also handles as a level change. It also fires once for the level a session starts on, for a new character and for a loaded save alike, because Angband runs the same arrival steps for both. That first event waits until every mod's `register()` has run and the map is on screen, so a mod that subscribes in `register()` hears it. Walking, resting and redrawing the same level never fire it. The payload has `depth`, where 0 is the town; `levelId`, the value `ctx.knownLevel()` reports for that level, counting up from 0 in each session; `cause`, which is `new-game` or `load` for the session's first level and `change` after that; and `arena`, true in the arena. The event comes after the stair or recall message and before the level feeling. A handler that throws is logged, and the arrival still completes: the level feeling, the autosave and the redraw all go ahead. (neostryder/neo-angband#363)
527
+
518
528
  ## 4m. `ctx.saves` - the host character roster
519
529
 
520
530
  A plugin with `saves:manage` receives `ctx.saves` at the title and during play. `list()` reads the character picker's roster in the same order. Its frozen entries contain the slot id, name, race, class, level, depth, death status and last-save time in epoch milliseconds. Every call returns `ok` or a refusal with a `reason`.
@@ -525,6 +535,8 @@ The facade uses the roster's configured storage in the browser and Electron. Its
525
535
 
526
536
  `ctx.character.key()` is present with `state:player.read` while a character is attached. It returns the roster lineage, which survives saves and renames. Under `saves:manage`, `ctx.saves.onChange(listener)` receives frozen `rename` and `delete` events after the host writes the roster; each event carries the slot id and lineage key, and a rename also carries the new name. The subscription returns an unsubscribe function.
527
537
 
538
+ A plugin with `session:control` receives `ctx.session`, the game menu's Save, Save and exit, and Quit for a mod's own save dialog. `save()` writes the save and shows the game's "Saving game... done." message. `exitToTitle()` saves and then reloads to the title screen. `quit()` saves and then runs Ctrl-X: the game's "Press Return (or Escape)." pause, then the desktop app closes, while a browser tab goes to the title screen. Each one saves first and returns a refusal with a `reason` instead of leaving when no living character is in play or the save fails. None of them confirm, so ask the player in your own dialog first. `saves:manage` does not grant this seam. (#361)
539
+
528
540
  ## Player profiles and title actions
529
541
 
530
542
  `ctx.profiles.list()` returns `ProfileResult<readonly ModProfile[]>`, where each profile has `id: string | null`, `name: string` and `active: boolean`. The default profile has a null id. `ProfileResult<T>` is `{ ok: true, value: T } | { ok: false, reason: string }`; calls without the capability throw a capability error.
@@ -593,12 +605,18 @@ Typing in a focused editable field inside the panel goes to that field through t
593
605
 
594
606
  Each mod's display setters keep its own last request. The most recent live request controls the grid, camera, full map view, tile scaling, map overview, sidebar extent, map margin, or visual filter. Clearing a nullable request removes that mod's value; `setTileScaling(null)` restores the default automatic sampler and `setFullMapOverview(null)` restores the default overview when no earlier request remains. `getGrid()`, `getCamera()`, `getMapView()`, `getTileScaling()`, `getFullMapOverview()`, `getSidebarExtent()`, `getMapMargin()`, and `getVisualFilter()` report the value in force. Mod teardown removes every request from that mod and restores the next most recent request for each setter.
595
607
 
596
- `controller()` may return `{ controller, nondeterministic, onDeath }` instead of a bare controller. `nondeterministic: true` marks the save nondeterministic when the controller installs, for a mod whose manifest is deterministic but whose controller this time draws on a model, a clock or the network. The manifest's own `nondeterministic` flag still marks the save when the mod is enabled. `ctx.controller.markNondeterministic()` does the same while the mod owns the keyboard, for a controller that switches to such a source after install. The mark is permanent and is saved at once. `onDeath` chooses what the character's death does while the controller holds the keyboard. The default, `reincarnate`, starts the next character in place, as the Borg does. `end` runs the ordinary death with its tombstone, score entry and `ctx.character.onRunEnd`, and leaves the controller installed until the page reloads. (neostryder/neo-angband#300)
608
+ `controller()` may return `{ controller, nondeterministic, onDeath, onKey }` instead of a bare controller. `nondeterministic: true` marks the save nondeterministic when the controller installs, for a mod whose manifest is deterministic but whose controller this time draws on a model, a clock or the network. The manifest's own `nondeterministic` flag still marks the save when the mod is enabled. `ctx.controller.markNondeterministic()` does the same while the mod owns the keyboard, for a controller that switches to such a source after install. The mark is permanent and is saved at once. `onDeath` chooses what the character's death does while the controller holds the keyboard. The default, `reincarnate`, starts the next character in place, as the Borg does. `end` runs the ordinary death with its tombstone, score entry and `ctx.character.onRunEnd`, and leaves the controller installed until the page reloads. (neostryder/neo-angband#300)
609
+
610
+ The install can also carry `onKey(press)`, which the host calls for each key the player presses while the controller has the keyboard and the game window has focus. `press` carries the key's DOM name and its Ctrl, Alt, Shift, Meta and repeat flags. Return `{ kind: "keep", message }` to go on driving, with `message` shown on the message line if you give one, or `{ kind: "release", reason }` to give the keyboard back with `reason` shown in place of the usual line. The key never reaches the game either way. Escape and Ctrl-Z always give the keyboard back and are not passed to `onKey`. Alt-Tab, any key held with the Windows key, an input method's keys, and a modifier or lock key pressed alone are ignored and not passed either. Answer at once and do the key's work, such as starting a different errand, before returning: a promise, a throw or any other answer gives the keyboard back and is reported as a fault in the mod. Without `onKey`, any other key gives the keyboard back. Each hand-back writes an info line to the log naming its source. (neostryder/neo-angband#334)
597
611
 
598
612
  ## 4r. Floating panel positions and recovery
599
613
 
600
614
  The host's Subwindow setup can move a registered panel into a floating window inside the game viewport. The panel keeps the same slot, shadow root, controls, minimum size and input behavior. Its title bar can move it onto the same dock, swap and tab drop zones as a docked panel. Closing and showing it again restores its floating rectangle; Dock returns it to its last docked place or `preferredPlacement` if that place is unavailable. A saved float whose mod is not loaded shows the same named placeholder as a docked panel. The Floating windows switch temporarily renders floats at their remembered docked places without erasing their saved rectangles. No new capability or `ctx.ui` field is required.
601
615
 
616
+ ## 4ra. Saving and restoring the whole layout
617
+
618
+ `ctx.subwindows.layout()` returns the whole arrangement as text: which panels are open, the tiling, the floating panels and their remembered places, the map panel's graphics and every registered pref block. It is the same JSON document that Export subwindow layout writes. `ctx.subwindows.setLayout(text)` puts an arrangement back and saves it as the player's layout, as an import does. It returns false and changes nothing when the text is not a layout document. `ctx.subwindows.onLayoutChange(listener)` calls the listener with the new layout text after each change: a panel opened, closed, moved, resized, docked, floated or tabbed, or a `setLayout` call from any mod. A drag reports once, when it ends, and the saves from one action arrive as one call after it finishes. That covers undo and redo and named layouts. Keep the last text you saw, push it onto your undo stack when different text arrives, and skip a change whose text equals the one you just restored, since a layout reads back byte for byte. A panel whose mod is not loaded keeps its place and shows the usual placeholder. Like the rest of `ctx.subwindows`, these need no capability. (neostryder/neo-angband#287)
619
+
602
620
  ## 4s. Command catalogue and store panel status
603
621
 
604
622
  `ctx.intent.catalogue()` is present with `input:intent`. It returns a frozen, token-stamped list of the action registry's command codes, plus the non-command intent kinds. Each command has its play or store phase, its argument shape, and `verb`, the game's own name for it. That is `"aim"` for `aim-wand`, for example. A mod's command has the verb it set with `commands.setVerb`, and a code with no verb has null. Registered mod command codes appear in the same list. The catalogue is a read; it takes no turn, consumes no RNG, and adds nothing to the command queue.
@@ -611,11 +629,15 @@ Under `state:messages.read`, `ctx.snapshot().messages` carries the current input
611
629
 
612
630
  `MonsterView` in `ctx.snapshot().core.monsters` carries `unique` (RF_UNIQUE), `questGuardian` and `finalGuardian`. A quest guardian is the race of one of the character's quests. The final guardian guards the last quest, the one whose kill wins the game, which is Morgoth in the shipped quest.txt. Both flags follow the quest table, so a mod that changes the quests moves them too. `id` is the level-local monster index an animation can key on. The list holds only the monsters the player perceives as monsters, the ones the game's own monster list shows. That includes monsters found by detection or telepathy, and leaves out any the player cannot see and any mimic still posing as an object.
613
631
 
614
- The same rule covers cells and items in every view, a controller's included. `CellView.monster` names a square's occupant only when the player perceives it, and is 0 for an unseen creature or a mimic still posing as an object. `CellView.objectCount` counts the objects the player remembers there, and `floorItems(x, y)` lists only the ones the player has seen, each with its index in the live pile. `ItemView` describes an object as the player knows it, from its known twin: an unidentified ego has `ego: false` and a null `egoName`, an unassessed artifact has `artifact: false`, and bonuses, modifiers, flags, brands, slays, resists, curses and `value` count only what the player has learned. A controller's `monsters()` list holds only perceived monsters too.
632
+ `MonsterView.spellFlags` lists every spell flag of the race. `knownSpellFlags` lists only the ones the character has learned, the same set the monster recall names: flags it has seen the race use, or all of them once the race is fully known through probing or a cheat. Reading it creates no lore record. (neostryder/neo-angband#359)
633
+
634
+ The same rule covers cells and items in every view, a controller's included. `CellView.monster` names a square's occupant only when the player perceives it, and is 0 for an unseen creature or a mimic still posing as an object. `CellView.objectCount` counts the objects the player remembers there, and `floorItems(x, y)` lists only the ones the player has seen, each with its index in the live pile. `ItemView` describes an object as the player knows it, from its known twin: an unidentified ego has `ego: false` and a null `egoName`, an unassessed artifact has `artifact: false`, and bonuses, modifiers, flags, brands, slays, resists, curses and `value` count only what the player has learned. An item whose flavour the player has not identified is named by that flavour wherever an `ItemView` appears. `aware` is false, `label` is the flavour text (`Light Blue`, or a scroll's title), `kindKey` is `flavor:<index>`, `sval` is the flavour index made negative, `kindId` is absent, and `value` is the guess the game makes from the item's tval. Two unidentified flavours still have different keys, and none of them matches a kind's. When the player learns the flavour, all of these fields switch to the kind's. A shop's wares are named by their kind, as the shop screen names them, while the home's are named like the pack's. A controller's `monsters()` list holds only perceived monsters too.
615
635
 
616
636
  `PlayerView` carries `hpWarning`, the low hit point threshold in hit points: `trunc(maxHp * hitpoint_warn / 10)`, or 0 when the warning is off. The warning applies while `hp` is below it. `recall` and `descent` are the turns left on Word of Recall and Deep Descent, and 0 when neither is active. `dead` turns true the moment the character dies, before the fatal message is acknowledged, so a death effect can start there instead of reading hit points, which bloodlust can take below zero.
617
637
 
618
- `status.afraid` is the Fear timer alone. `status.fearful` is true whenever the character cannot fight in melee: timed fear, Terror, or fear from a curse, an item or a shape. `status.terror`, `status.amnesia` and `status.image` are the Terror, Amnesia and Hallucination timers. Amnesia stops the character reading scrolls.
638
+ `ac`, `toHit`, `toDam` and `objectFlags` come from the known state that the character sheet prints, so a rune on worn gear that the player has not learned leaves them as they were until the player learns it. Speed, blows, shots, light and infravision come from modifiers, which the game counts only once learned, and wielding an item teaches its modifiers.
639
+
640
+ `status.afraid` is the Fear timer alone. `status.fearful` is true whenever the character cannot fight in melee: timed fear, Terror, or fear from a curse, an item or a shape. Fear from an item or a curse counts once the player knows its rune, which the first refused blow teaches. `status.terror`, `status.amnesia` and `status.image` are the Terror, Amnesia and Hallucination timers. Amnesia stops the character reading scrolls.
619
641
 
620
642
  A remembered object in `ctx.knownLevel()` may carry `aura`: `cursed` for a known curse, `artifact` for an object known to be an artifact, or `rune` for an assessed object with a rune the player has not learned. These match the `{cursed}` and `{??}` markers and the artifact name that the item list already shows. An object has at most one aura, taken in that order.
621
643
 
@@ -637,10 +659,14 @@ Pass an entry's `ref` to `view.inspectKnownFloorItem(ref)`, also under `state:fl
637
659
 
638
660
  `ctx.keybindings`, under `keymap:edit`, is the player's keymap editor for the current keyset. `list()` returns every binding with the mod that created it, if any; `set()` binds or replaces a trigger and `remove()` drops one, and both save at once. A binding set here belongs to the player even when it replaces one a mod made with `ctx.keymaps`, so that mod no longer removes it. `capture()` resolves with the next key the player presses that a keymap can use, or null for Escape, and the game never acts on that key. `keymap:write` does not cover `keymap:edit`.
639
661
 
662
+ Each call works on the keyset in use unless it names the other one: `list("roguelike")`, `set(trigger, action, "original")` and `remove(trigger, keyset)` edit either set, as upstream's keymap editor can. `commands()` lists the game's commands as its command menu shows them, after any mod's menu changes, each with its name, its menu group, its plain key in each keyset (null where it has none there) and the letter of any Ctrl chord that runs it. That is what a key does when no keymap is bound to it, so an editor can warn before a binding hides a command. `cancelCapture()` stops a waiting capture as Escape would: it resolves with null, the next key reaches the game, and it returns false when nothing was waiting. Call it when your form closes. (neostryder/neo-angband#362)
663
+
640
664
  ## 4v. Knowledge browser
641
665
 
642
666
  `ctx.knowledge`, under `state:knowledge.read`, is the knowledge menu as data. `categories()` names the eight browsers (objects, runes, artifacts, egos, monsters, features, traps and shapes) with each one's title and how many entries it lists. `list(category)` returns the known members in the game's own groups and order, each with an `id`, its name, its colour and the extra fields the game prints beside it, such as a rune's note or a monster's symbol, kills and "Full" column. `recall(category, id)` returns that entry's recall page, the same `ScreenView` the game shows, or null for an entry the player does not know yet.
643
667
 
668
+ Every entry also has `known`. It is false only for an object flavour the player has seen but not identified, which the objects list shows under its flavour name, and true for everything else, since the lists hold nothing the player has not met. A known-only filter hides the entries where it is false. Such a flavour's `id` is `flavor:<index>`, and it changes to the kind's id once the player learns the flavour. (neostryder/neo-angband#362)
669
+
644
670
  Each call reads the live game, so a monster page gains lines as the character learns more about it. Read it again after the snapshot changes rather than keeping an old copy. An ego id includes its group, because an ego appears once for each kind of item it can be found on.
645
671
 
646
672
  Reading a page changes nothing. The artifact recall builds its sample object from the game's random stream, as upstream's does, so opening that page in the game's own browser moves the stream. A mod's read puts the stream back exactly as it was, so drawing a knowledge tab cannot change the next level.
@@ -649,7 +675,7 @@ Reading a page changes nothing. The artifact recall builds its sample object fro
649
675
 
650
676
  `ctx.character.history()`, under `state:player.read`, is the character's history as data, oldest first: the same entries the character history screen and the character dump show. Each entry has a `kind` (`birth`, `level`, `unique`, `artifact`, `artifact-unknown`, `note`, `import` or `other`), its text, the turn, the dungeon level and character level it was recorded at, and `lost` for an artifact the character no longer has. Regaining a drained level adds another `level` entry, as it does in Angband, so a timeline that shows each level once keeps the first.
651
677
 
652
- Angband's history has no entry for reaching a new dungeon level, and the port adds none, because that would change the character dump. A mod that wants depth milestones records them itself from the `dungeonlevel` event, stored under `ctx.character.key()`.
678
+ Angband's history has no entry for reaching a new dungeon level, and the port adds none, because that would change the character dump. A mod that wants depth milestones records them itself from the `dungeonlevel` event in section 4l, stored under `ctx.character.key()`. The event also fires with `cause: "load"` each time the game loads, so compare the depth with the milestones already stored before adding one.
653
679
 
654
680
  `ctx.character.onRunEnd(listener)` calls the listener once when a character dies or retires, after every item has been identified and the score table written, and before the tombstone. The report says whether the run ended in death, victory or retirement, and names the cause. It carries the character's name, race, class and levels, the deepest and final dungeon level, gold, the final turn, the score and whether the score table accepted it. It also has the full history, the last 40 messages, the character sheet, and every item worn, carried or left in the home, with its location, quantity and inspect text. `ctx.character.runReport()` returns the same report to a mod that loads later. It lasts until the page reloads, and starting a new character reloads it, so a mod that keeps a graveyard of past runs stores each report when `onRunEnd` fires.
655
681
 
@@ -659,6 +685,8 @@ Angband's history has no entry for reaching a new dungeon level, and the port ad
659
685
 
660
686
  The draft changes only through the game's rules. `chooseRace` and `chooseClass` reset the stats to that pair's suggested spread, as the birth menus do. `buy`, `sell`, `suggest` and `reset` are point-buy. `roll` and `previousRoll` are the standard roller. The draft also covers the name, a random name, the background, the birth options and `usePrevious`. Rolls, backgrounds and random names come from the same random stream the birth screens use. `accept()` starts the game with the same choice those screens return, and `cancel()` goes back to the title.
661
687
 
688
+ `draft().statCosts` gives point-buy per stat, STR to CON: `buyCost`, what the next point costs (null at 18); `sellRefund`, what lowering it gives back (null at 10); and `canBuy` and `canSell`, whether those calls would succeed now. With the roller every figure is null and both flags are false. `restoreHistory()` puts back the background the game generated and clears `historyEdited`, which resending the old text through `setHistory` does not. (neostryder/neo-angband#362)
689
+
662
690
  `ctx.saves.create()` starts character creation from a mod, as the title screen's new character does, and the page reloads into it. `create({ like })` sets the previous character first, so `usePrevious` and the name default start from it. A run report's `birth` field has the shape `like` takes, which is how a graveyard offers a new character like a dead one. The dead character itself stays dead.
663
691
 
664
692
  Pass `resumeAutoplayer: true` to `create()` to give the new character to your own autoplayer. This is for a roll-on setting the player turns on in your mod ahead of time: after a death, the mod calls `create({ like: report.birth, resumeAutoplayer: true })` and play carries on. The call is refused unless your controller holds the keyboard at that moment. The character born from the birth screens that follow gets your controller on its first boot, with no prompt, and is marked as autoplayed. If the player leaves the birth screens and loads a different character instead, that character is asked about as usual. Pair it with `onDeath: "end"` from section 4q, since a controller that reincarnates in place never reaches a death. (neostryder/neo-angband#300)
@@ -671,6 +699,8 @@ On the Mods screen a setting is a row under its mod's switches, such as `CRT str
671
699
 
672
700
  `ctx.settings` is present for a mod whose manifest declares at least one setting. `get(id)` and `all()` return the values clamped to the declared range and rounded to the nearest step, whatever the stored value says, so a mod that narrows a range in a later version still reads a value inside it. `onChange(listener)` calls `listener(id, value)` when the player changes a setting, and returns a function that stops it. A setting marked `requiresReload` changes nothing until the game reloads, so it fires no change and the manager offers its reload prompt. `resolveSettingValue(setting, value)` in the SDK does the same clamping for a mod's own tests.
673
701
 
702
+ `set(id, value)` moves one of the mod's own settings, as the player would on the Mods screen: the value is clamped and snapped the same way, saved, and returned. Listeners hear it unless the setting is marked `requiresReload`, in which case it takes effect after the next reload. An id the manifest does not declare, or a value that is not a number, returns undefined and saves nothing. A mod can change only its own settings. (neostryder/neo-angband#362)
703
+
674
704
  ## 4v. `ctx.display.setChromeTheme` - the window chrome's look
675
705
 
676
706
  `ctx.display.setChromeTheme(theme)` repaints the chrome around the panels: title bars, tabs, buttons, dividers and drop guides. It needs `display:filter`. Every key is optional: `font` (a family already loaded in the page, for example with the FontFace API), `fontSize` (8 to 24), the colours `page`, `titleBackground`, `text`, `textStrong`, `muted`, `border`, `divider`, `dividerHover`, `accent` and `floatBorder` (as #rgb, #rrggbb, #rrggbbaa or rgb()), `radius` (0 to 16) and `shadow` (true or false). An unknown key or a bad value throws. `null` puts back the game's own look: Angband's palette and its 8x13 dialog font. As with the other display setters, each mod's last request is kept, the most recent one is in force, and a mod's request goes away when the mod is torn down. `getChromeTheme()` reports the theme in force. It covers the chrome only; what a panel shows inside is up to whoever draws that panel.
@@ -703,6 +733,39 @@ if (net) {
703
733
 
704
734
  Code running in the page can still reach the relay without `ctx.net`, because in-process mods share the page. The host checks on each request are consent checks against what the manifest declared. The secret rules hold even so: a value is sent only to the hosts it was stored for, it never comes back to the page, and an environment variable is read only after the player agrees. Mods in the Worker tier do not get `ctx.net`. (neostryder/neo-angband#300)
705
735
 
736
+ ## 4za. `ctx.shared` - values one mod shares with others
737
+
738
+ A mod can publish named JSON values for other mods to read. A plugin that declares `shared:publish` calls `ctx.shared.publish(name, version, value)`, and one that declares `shared:read` calls `ctx.shared.read(modId, name)`. `ctx.shared` is present when the manifest declares either capability, and a method whose capability is missing throws a capability error. Both capabilities are listed on the Mods screen, so the player can see which mods share data and which mods read it.
739
+
740
+ A name is 1 to 64 characters of lower-case letters, digits, `.`, `-` and `_`. The version is a whole number the publisher picks for that name; raise it when the value's shape changes so a reader can tell the shapes apart. The value has to be plain JSON: objects, arrays, strings, finite numbers, booleans and null. A function, `undefined`, `NaN`, a `Date`, a `Map`, a class instance, an empty array slot or a value that contains itself throws a `TypeError` naming the path to the bad part. A value whose JSON text is over 256 KiB in UTF-8 throws a `RangeError`. Either way the previous value stays. The host copies the value at publish time, so editing your object afterwards changes nothing until you publish again, and each publish replaces the whole record. `withdraw(name)` removes it.
741
+
742
+ `read(modId, name)` returns `{ mod, name, version, value }`, frozen all the way down, or null when the publisher is not installed, is disabled, failed to load, or has not published that name. Values last until the page reloads. A mod whose `register()` throws loses its values at once, and so does every mod at teardown, after all the `uninstall()` calls have run. Load order does not matter, since a read returns what is published at the moment you call it, so read when you need the value instead of keeping a copy from load time. `onChange(modId, name, listener)` calls the listener after each publish or withdrawal of that name, with the new record or null, and returns a function that stops it. A listener that throws is reported against the mod that registered it.
743
+
744
+ Treat a shared value as untrusted input. Another mod wrote it, and the player may have any version of that mod installed, so check the version and the type of every field you use before drawing it or acting on it.
745
+
746
+ Two mods that both act on the same event run in an order you do not control. In the example below the recap listens with `onChange` rather than reading inside its own `onRunEnd`, which could run before the reporter has published. Worker-tier mods do not get `ctx.shared`. (#365)
747
+
748
+ ```js
749
+ // The run reporter's plugin.js (manifest: "shared:publish")
750
+ ctx.character.onRunEnd((report) => {
751
+ ctx.shared.publish("run-summary", 1, {
752
+ name: report.name,
753
+ cause: report.cause,
754
+ maxDepth: report.maxDepth,
755
+ notes: pickNotes(report), // an array of strings
756
+ });
757
+ });
758
+
759
+ // The death recap's plugin.js (manifest: "shared:read")
760
+ function summaryLines() {
761
+ const shared = ctx.shared.read("run-reporter", "run-summary");
762
+ const notes = shared?.version === 1 ? shared.value?.notes : undefined;
763
+ if (!Array.isArray(notes)) return ["The run reporter has no summary for this run."];
764
+ return notes.filter((line) => typeof line === "string").slice(0, 20);
765
+ }
766
+ ctx.shared.onChange("run-reporter", "run-summary", () => recap.redraw(summaryLines()));
767
+ ```
768
+
706
769
  ## 5. Doors that are exported but deliberately closed
707
770
 
708
771
  An exported mutable table is an extension point whether or not anyone meant it to be one. Two were found this way and are now frozen at runtime, not just typed `readonly`, because a mod folder ships plain `plugin.js` and the type binds nothing there:
package/docs/PLUGINS.md CHANGED
@@ -360,7 +360,7 @@ The core snapshot also carries quiver items, equipment slot labels, local floor
360
360
 
361
361
  ### Working beside controllers and other mods
362
362
 
363
- `ctx.snapshot().driver` and `ctx.driver()` name the current keyboard owner. A controller mod can publish a task label and reason through `ctx.controller.setStatus()`, release the keyboard through `ctx.controller.release(reason?)`, and mods with `event:driver-changed` can listen for changes. `ctx.mods()` lists enabled, loaded mods and only the rule or section flags each manifest declares in `publicFlags`. Display setters keep a value per mod, restore an earlier value when the current owner clears or unloads, and expose getters for the value in force. See [MOD_SEAMS.md section 4q](MOD_SEAMS.md#4q-controller-ownership-public-mods-and-display-requests). A controller can say more about one install by returning `{ controller, nondeterministic, onDeath }`, and a mod with `event:player-command` can watch the player's own commands while it waits; see [MOD_SEAMS.md sections 4q and 4l](MOD_SEAMS.md#4q-controller-ownership-public-mods-and-display-requests).
363
+ `ctx.snapshot().driver` and `ctx.driver()` name the current keyboard owner. A controller mod can publish a task label and reason through `ctx.controller.setStatus()`, release the keyboard through `ctx.controller.release(reason?)`, and mods with `event:driver-changed` can listen for changes. `ctx.mods()` lists enabled, loaded mods and only the rule or section flags each manifest declares in `publicFlags`. Display setters keep a value per mod, restore an earlier value when the current owner clears or unloads, and expose getters for the value in force. See [MOD_SEAMS.md section 4q](MOD_SEAMS.md#4q-controller-ownership-public-mods-and-display-requests). A controller can say more about one install by returning `{ controller, nondeterministic, onDeath, onKey }`, and a mod with `event:player-command` can watch the player's own commands while it waits; see [MOD_SEAMS.md sections 4q and 4l](MOD_SEAMS.md#4q-controller-ownership-public-mods-and-display-requests).
364
364
 
365
365
  ### Watching resolved outcomes: `ctx.events`
366
366
 
@@ -372,12 +372,18 @@ Declare `saves:manage` for a replacement title screen that lists, loads, renames
372
372
 
373
373
  `ctx.saves.onChange()` reports frozen rename and delete events after the host changes the roster, including changes made outside a mod menu. Each event carries the stable lineage key returned by `ctx.character.key()` for the attached character. See [MOD_SEAMS.md section 4m](MOD_SEAMS.md#4m-ctxsaves---the-host-character-roster).
374
374
 
375
+ Declare `session:control` for a save dialog of your own. `ctx.session` saves the game, leaves for the title screen or quits, as the game menu does, but without the menu's confirmations. Each call saves first and stays in the game when the save fails. See [MOD_SEAMS.md section 4m](MOD_SEAMS.md#4m-ctxsaves---the-host-character-roster).
376
+
375
377
  ### Title actions and player profiles
376
378
 
377
379
  Declare `ui:title` to receive `ctx.title`. `registerRow({ label, key?, run })` adds an action after the core title options. Rows keep their registration order, and the host removes a mod's rows when it uninstalls that mod. The optional key is a letter or digit; a core key or an earlier mod key keeps its existing action. `choose(title, choices)` opens a choice menu before play begins and returns the chosen index, or `null` on Escape. The first choice is selected by default.
378
380
 
379
381
  Declare `profiles:manage` to receive `ctx.profiles`. A mod can list profiles, create a fresh profile or copy configuration from another profile, replace the enabled mods in a profile it created, and switch profiles before play begins. Profile copies exclude characters and the save roster. See [MOD_SEAMS.md](MOD_SEAMS.md#player-profiles-and-title-actions) for method types and reload actions.
380
382
 
383
+ ### Sharing data with other mods: `ctx.shared`
384
+
385
+ Declare `shared:publish` to publish named JSON values with `ctx.shared.publish(name, version, value)`, and `shared:read` to read another mod's with `ctx.shared.read(modId, name)`. A read returns a frozen copy, or null when that mod is not installed, is disabled, failed to load, or has not published the name. Values must be plain JSON of at most 256 KiB, and the version is a number you raise when the value's shape changes. Treat what you read as untrusted input and check its version and fields before you use it. See [MOD_SEAMS.md section 4za](MOD_SEAMS.md#4za-ctxshared---values-one-mod-shares-with-others).
386
+
381
387
  ### Tiled panels beside `openPanel`
382
388
 
383
389
  Declare `ui:panel.mount` to offer a panel in Subwindow setup with `ctx.ui.registerPanelKind(spec)`. Its `mount` function draws into the slot's shadow root. Use the returned function during mod cleanup to unregister the kind. See [MOD_SEAMS.md section 4p](MOD_SEAMS.md#4p-ctxuiregisterpanelkind---a-mod-panel-in-the-tiled-layout) for the host handle and saved layout behavior.
@@ -962,6 +968,8 @@ A session-only load is limited in lifetime, not in privilege. A session-loaded p
962
968
 
963
969
  That lifetime is a strong convention, not an enforced boundary. The archive lives in `sessionStorage`, which survives a reload (that is what makes the tier work, since a reload is what applies a mod). A browser also restores it when it restores a closed or crashed window, and a window the page itself opens inherits a copy of it. So "gone when you close the game" is what normally happens, not a guarantee. The mitigation is visibility: a session mod is always on the list, always marked, and always droppable, so it can never sit there unnoticed.
964
970
 
971
+ `shared:` has two actions, and neither grant includes the other. A mod that reads what others share is not able to publish, and the reverse. Publishing needs its own grant so the player can see from the Mods screen which mods hand data to other mods, not only which mods take it.
972
+
965
973
  `ui:panel.mount` is not a fence around the DOM. Your `plugin.js` runs in the page's own realm, so `document` is available to it with or without any capability, and a mod that never declares this can still append an element to the body. What the grant carries is a line the player reads first, a container the host owns and can take away, and one thing a mod cannot do without it: stand the game's input door down, so a real `<input>` inside your panel can be typed into instead of the keystrokes being read as game commands.
966
974
 
967
975
  `WorldFrame` in `packages/web/src/world-view.ts` is live. `render()` calls the extracted `world-render-data.ts` with the real map-knowledge reads and passes the resulting frame to a `WorldFrameSink`. The default glyph terminal is that sink, and it consumes the frame's fallback visual projection, including the terrain-under-foreground tile inputs for a path over otherwise bare seen terrain. The frame carries semantic feature, trap, object and monster ids, visibility, ordered layers, the cursor and player placement, so a selected front end can build an isometric or 3D view without decoding terminal glyphs. As a control, the host runs the same producer `render()` uses, checks its unmodded pre-frame glyph tuples, and tees that exact frame to an independent host sink in the same call. The selected frontend receives a frozen copy of that frame; when no frontend is selected, or none exists, the glyph sink stays active unchanged.
package/docs/README.md CHANGED
@@ -274,7 +274,7 @@ Core never reads `ext`. The game does not know what "bleed" means, so data alone
274
274
 
275
275
  Which keys count as core's is derived from core's own gamedata rather than declared by hand (`packages/core/src/mod/record-keys.ts`, generated and re-derived by its test in both directions), so the boundary cannot drift as the pack grows.
276
276
 
277
- > Every record of every shipped file can now be addressed by a ref, except `history`, whose records are `{chart, phrase}` with nothing in them that is not a value a mod would change. An op against `history` is reported, never dropped. Until 2026-07-29 a per-record op aimed at any of the 20 non-name-keyed files was silently dropped, and until 2026-08-08 a further 73 individual records, 61 of `ego_item`'s 107 among them, could not be addressed by any ref at all. `MOD_REACH.md` carries the measurement.
277
+ > Every record of every shipped file can now be addressed by a ref. `history` was the last to get one, on 2026-10-03: a history record's ref is its chart and roll, as in `core:50--100`. Until 2026-07-29 a per-record op aimed at any of the 20 non-name-keyed files was silently dropped, and until 2026-08-08 a further 73 individual records, 61 of `ego_item`'s 107 among them, could not be addressed by any ref at all. `MOD_REACH.md` carries the measurement.
278
278
 
279
279
  Total conversions are the same mechanism at full throttle: depend on `core`, replace or remove what you do not want, and add your own world.
280
280
  ### Adding things that do not exist in the base game
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpgm-tools/neo-angband-mod-sdk",
3
- "version": "1.21.0",
3
+ "version": "1.22.0",
4
4
  "description": "Pack schemas, validation, and tooling for Neo Angband mods (content packs, tile packs, scripted plugins)",
5
5
  "license": "GPL-2.0-only",
6
6
  "author": "neostryder (RPGM Tools)",
@@ -282,7 +282,9 @@ export type ParsedCapability =
282
282
  | { kind: "ui-region"; action: "write" }
283
283
  | { kind: "saves"; action: "manage" }
284
284
  | { kind: "title"; action: "add" }
285
- | { kind: "profiles"; action: "manage" };
285
+ | { kind: "profiles"; action: "manage" }
286
+ | { kind: "session"; action: "control" }
287
+ | { kind: "shared"; action: "read" | "publish" };
286
288
 
287
289
  const EVENT_RE = /^event:([a-z][a-z0-9-]*)$/;
288
290
  /**
@@ -378,6 +380,18 @@ export function parseCapability(cap: string): ParsedCapability {
378
380
  if (cap === "saves:manage") return { kind: "saves", action: "manage" };
379
381
  if (cap === "ui:title") return { kind: "title", action: "add" };
380
382
  if (cap === "profiles:manage") return { kind: "profiles", action: "manage" };
383
+ /* "session:control": save the game, leave it for the title screen, or quit, the
384
+ * same three acts the game menu offers. Its own kind so `saves:manage` (the
385
+ * roster) does not carry it: managing characters and ending this one are two
386
+ * different things to agree to. */
387
+ if (cap === "session:control") return { kind: "session", action: "control" };
388
+ /* "shared:read" and "shared:publish": read the named JSON values other mods
389
+ * publish through `ctx.shared`, or publish this mod's own. Two actions so the
390
+ * Mods screen can show both sides of the exchange, and compared exactly, so
391
+ * neither grant carries the other. */
392
+ if (cap === "shared:read" || cap === "shared:publish") {
393
+ return { kind: "shared", action: cap === "shared:read" ? "read" : "publish" };
394
+ }
381
395
  /* NOT a registry domain, deliberately. A registry:* grant means "override
382
396
  * one named game system among many"; this one means "everything the player
383
397
  * sees of the dungeon is drawn by this mod." It is the display OWNER, so it
@@ -521,6 +535,10 @@ function grantCovers(grant: ParsedCapability, request: ParsedCapability): boolea
521
535
  return grant.kind === "title";
522
536
  case "profiles":
523
537
  return grant.kind === "profiles";
538
+ case "session":
539
+ return grant.kind === "session";
540
+ case "shared":
541
+ return grant.kind === "shared" && grant.action === request.action;
524
542
  case "event":
525
543
  return grant.kind === "event" && grant.name === request.name;
526
544
  case "state":
package/src/loader.ts CHANGED
@@ -36,7 +36,9 @@
36
36
  * The identity those files really use was already declared in record-key.ts and
37
37
  * already proved unique over the shipped pack; recordsComposable now asks it.
38
38
  * What is left in phase 2 is `constants` and `visuals` (config singletons, where
39
- * whole-file IS the meaning) and `history` (no per-record identity at all).
39
+ * whole-file IS the meaning) and `history` (keyed by chart and roll since
40
+ * 2026-10-03, but its record order is what a chart's rolls mean, so a pack's
41
+ * records still replace the file and only the per-record ops use the key).
40
42
  *
41
43
  * NOTHING IS DROPPED IN SILENCE. This is the invariant the whole file exists to
42
44
  * hold. Until 2026-07-29 phase 2 did not exist: a `patches` / `replaces` /
@@ -231,7 +233,7 @@ function isNamedRecord(r: unknown): r is JsonRecord {
231
233
  */
232
234
  function recordsComposable(file: string, records: readonly unknown[]): boolean {
233
235
  const spec = keySpecFor(file);
234
- if (spec.kind === "singleton") return false;
236
+ if (spec.kind === "singleton" || spec.wholeFile === true) return false;
235
237
  const claimants = new Map<string, number>();
236
238
  const keysOf: (readonly string[])[] = [];
237
239
  for (const r of records) {
@@ -364,8 +366,8 @@ function applyPassthroughOps(
364
366
  );
365
367
  if (!hasOps) return unmodified();
366
368
 
367
- /* No declared identity (history: chart/next/roll/phrase are all values a mod
368
- * would change). Every op is reported and none is applied - the one honest
369
+ /* No declared identity (a mod-only file with no `name` and no entry in
370
+ * record-key.ts). Every op is reported and none is applied - the one honest
369
371
  * answer, because inventing a key here would mis-merge instead of dropping. */
370
372
  if (RECORD_KEY_SPECS[file] === undefined && !recordsKeyedByName(records)) {
371
373
  for (const pack of ordered) {
@@ -644,7 +646,7 @@ export function composeContentPacks(
644
646
  * previous provider's records simply vanished. Say so. */
645
647
  refused.refuse(
646
648
  p.manifest.id,
647
- `${f} replaces the whole file, discarding ${(out[f] as unknown[]).length} record(s) from ${providerId} - ${f} records have no ref of their own, so a whole file is the only thing that can be added to it`,
649
+ `${f} replaces the whole file, discarding ${(out[f] as unknown[]).length} record(s) from ${providerId} - ${f} records cannot be added one at a time, so a whole file is the only thing that can be added to it`,
648
650
  );
649
651
  }
650
652
  out[f] = [...contrib.records];
package/src/project.ts CHANGED
@@ -251,7 +251,7 @@ export class ModProject {
251
251
  const findings: AuthoringFinding[] = checkPacks([mine], all);
252
252
 
253
253
  /* THE ONE THAT COSTS THE WHOLE GAME, PROMOTED TO AN ERROR. A file whose
254
- * records have no ref of their own can only be contributed WHOLE, so a mod
254
+ * records cannot be added one at a time can only be contributed WHOLE, so a mod
255
255
  * that ships one discards whatever the previous provider put there. The
256
256
  * loader already says so in `problems`, but a line in a list is not
257
257
  * proportionate to replacing the base game's copy of a file, and a builder
@@ -264,7 +264,8 @@ export class ModProject {
264
264
  * Since 2026-08-08 composition keys by recordRefKeys and all three merge per
265
265
  * record, so what is left here is `constants` and `visuals` - config
266
266
  * singletons, where "use mine" is what shipping the file MEANS - and
267
- * `history`, which has no per-record identity to key on. */
267
+ * `history`, whose records have a key for patching but whose order is
268
+ * what a chart's rolls mean, so a record cannot be added on its own. */
268
269
  const mineId = this.#manifest.id;
269
270
  for (const problem of composed.problems) {
270
271
  if (!problem.startsWith(`${mineId}: `) || !problem.includes("replaces the whole file")) {
@@ -276,9 +277,9 @@ export class ModProject {
276
277
  record: mineId,
277
278
  rule: "file/whole-file-replacement",
278
279
  message:
279
- `${problem}. Records in this file have no ref of their own, so there is ` +
280
- "nothing to add one to: use `patchFields` or `replace` to change what is " +
281
- "already there, rather than shipping a mod that deletes the base game's copy.",
280
+ `${problem}. Records in this file cannot be added one at a time, so ` +
281
+ "shipping them replaces the file: use `patchFields` or `replace` to change " +
282
+ "what is already there, rather than shipping a mod that deletes the base game's copy.",
282
283
  });
283
284
  }
284
285
 
package/src/record-key.ts CHANGED
@@ -3,9 +3,9 @@
3
3
  * string `name`.
4
4
  *
5
5
  * CURRENT STATE, FIRST, BECAUSE THIS COMMENT USED TO MISLEAD. Every record file
6
- * but ONE is addressable per record today: 24 by a unique `name`, 19 by the
7
- * explicit specs in this file, and `history` by nothing - and an op against
8
- * `history` is REPORTED, never silently dropped. Two independent reviewers read
6
+ * is addressable per record today: 24 by a unique `name` and 20 by the explicit
7
+ * specs in this file. `history` was the one exception until 2026-10-03, when it
8
+ * gained its (chart, roll) key below. Two independent reviewers read
9
9
  * the older wording, took the "the other 20 files do not fit it" paragraph below
10
10
  * for the present tense, and filed the same non-existent P1 ("20 files silently
11
11
  * discard patch/replace/remove, including object, ego_item, vault, trap, store,
@@ -98,10 +98,17 @@
98
98
  * verified unique over the shipped core pack (see record-key.test.ts, which
99
99
  * reads the real pack and fails if a declared key stops being unique).
100
100
  *
101
- * `history` is deliberately absent: a history record is
102
- * `{chart:{chart,next,roll}, phrase}` and every part of that is a value a mod
103
- * would legitimately change, so it has no identity to key on. An op against it
104
- * is REPORTED, not applied - see loader.ts.
101
+ * `history` was absent until 2026-10-03, on the reasoning that a record is
102
+ * `{chart:{chart,next,roll}, phrase}` and a mod could change any part of it.
103
+ * That left history.txt's phrases the one piece of gamedata no content patch
104
+ * could correct. The identity upstream itself uses is (chart, roll): get_history
105
+ * walks one chart's entries and takes the first whose cumulative `roll` reaches
106
+ * the die, so a roll threshold appears once per chart (a repeat could never be
107
+ * chosen), and `chart` is the node every `next` link names. Neither is the
108
+ * phrase or the link, which are what a correction or a rewiring changes. The key
109
+ * is declared `wholeFile`, because a chart's meaning is its records' ORDER: an
110
+ * added record appended after core's would sit past the roll-100 entry where
111
+ * get_history can never reach it.
105
112
  *
106
113
  * AMBIGUITY IS NAMED, NEVER GUESSED. A key that two records in the same file
107
114
  * claim (object's 5 pairs, ego_item's 25) makes that one ref unaddressable; the
@@ -140,6 +147,14 @@ export type RecordKeySpec =
140
147
  * stringified: a JSON blob in a ref is not something an author can type.
141
148
  */
142
149
  readonly discriminator?: readonly string[];
150
+ /**
151
+ * The records keep whole-file semantics even though each has a key: a
152
+ * pack's `records` still replace the file, and only the per-record ops
153
+ * (patch, replace, fieldPatch, remove) use the key. For a file whose
154
+ * record ORDER carries meaning, where composition appending a new record
155
+ * at the end would change what the file says.
156
+ */
157
+ readonly wholeFile?: true;
143
158
  }
144
159
  | { readonly kind: "singleton" };
145
160
 
@@ -198,6 +213,11 @@ export const RECORD_KEY_SPECS: Readonly<Record<string, RecordKeySpec>> = {
198
213
  paths: ["name"],
199
214
  discriminator: ["type", "item.tval"],
200
215
  },
216
+ /* history: the chart a record belongs to and its cumulative roll threshold,
217
+ * which is how get_history (player-birth.c) picks it. `core:50--100` is
218
+ * "You have blue-gray eyes, ". Whole-file, because order within a chart is
219
+ * what the rolls mean (see the header). */
220
+ history: { kind: "fields", paths: ["chart.chart", "chart.roll"], wholeFile: true },
201
221
  };
202
222
 
203
223
  /**