@bongos/core 1.24.93 → 1.24.95

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.
Files changed (44) hide show
  1. package/.bongos-core.json +123 -33
  2. package/docs/adr/0404-a-party-is-a-room-and-rooms-register-as-kinds.md +118 -0
  3. package/docs/adr/0405-each-character-has-one-colour-and-the-visor-wears-it.md +31 -0
  4. package/docs/adr/README.md +2 -0
  5. package/docs/copy-inventory.md +7 -7
  6. package/docs/copy-registry.json +7 -7
  7. package/docs/design/characters/v2/artisan-visor.png +0 -0
  8. package/docs/design/characters/v2/artisan.png +0 -0
  9. package/docs/design/characters/v2/artist-visor.png +0 -0
  10. package/docs/design/characters/v2/artist.png +0 -0
  11. package/docs/design/characters/v2/draw-characters.js +465 -0
  12. package/docs/design/characters/v2/patron-visor.png +0 -0
  13. package/docs/design/characters/v2/patron.png +0 -0
  14. package/docs/design/characters/v2/sheet.html +114 -0
  15. package/docs/module-api-changelog.md +4 -0
  16. package/docs/modules-contract.md +2 -0
  17. package/docs/page-readings.json +35 -35
  18. package/modules/hall-ui/public/characters/artisan-face.png +0 -0
  19. package/modules/hall-ui/public/characters/artisan-visor.png +0 -0
  20. package/modules/hall-ui/public/characters/artisan.png +0 -0
  21. package/modules/hall-ui/public/characters/artist-face.png +0 -0
  22. package/modules/hall-ui/public/characters/artist-visor.png +0 -0
  23. package/modules/hall-ui/public/characters/artist.png +0 -0
  24. package/modules/hall-ui/public/characters/patron-face.png +0 -0
  25. package/modules/hall-ui/public/characters/patron-visor.png +0 -0
  26. package/modules/hall-ui/public/characters/patron.png +0 -0
  27. package/modules/hall-ui/public/craft-mode.js +15 -4
  28. package/modules/hall-ui/public/home-city.js +14 -3
  29. package/modules/hall-ui/public/home-gallery.css +6 -0
  30. package/modules/hall-ui/public/home-gallery.js +30 -0
  31. package/modules/hall-ui/public/style.css +18 -5
  32. package/modules/hall-ui/public/visor.css +20 -5
  33. package/modules/hall-ui/public/visor.js +6 -3
  34. package/modules/hall-ui/records/characters.md +19 -0
  35. package/modules/hall-ui/records/visor.md +10 -1
  36. package/package-lock.json +2 -2
  37. package/package.json +1 -1
  38. package/release-notes.json +20 -0
  39. package/src/module-api.js +1 -1
  40. package/src/module-seams.js +3 -0
  41. package/tests/character_creation.mjs +44 -7
  42. package/tests/hall_visor.mjs +28 -2
  43. package/tests/home_gallery_widget.mjs +43 -0
  44. package/tests/room_kinds_seam.mjs +68 -0
package/.bongos-core.json CHANGED
@@ -2,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/bongos/package-core.js",
5
- "core_version": "1.24.93",
6
- "core_contract": "1.24.93",
7
- "source_commit": "8071fd2502f713c6b549097cfd5d79d606f32867",
5
+ "core_version": "1.24.95",
6
+ "core_contract": "1.24.95",
7
+ "source_commit": "998afb92495c4be1e9a57fbf18ae033d1affd5ae",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-11-12T20:21:01.886Z",
9
+ "built_at": "2026-11-12T20:56:00.733Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 650,
12
+ "docs_redacted": 653,
13
13
  "agent_docs_stubbed": 32,
14
- "functional_verbatim": 3967,
14
+ "functional_verbatim": 3982,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 4650,
20
- "tree_sha256": "14cce51acfe462e49a4caaa95f39316299e9da4b7eaad55df49bd1082d03adaf",
19
+ "file_count": 4668,
20
+ "tree_sha256": "464b0075caaaab9588613ed13a60f795c81c1fff326ba3bfe484d15149bf69fa",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -2479,10 +2479,20 @@
2479
2479
  "mode": "0000644",
2480
2480
  "sha256": "d98e0ea9a8a9b541bb58361bb124a4884c8165758aa8e3243e743368467e79ed"
2481
2481
  },
2482
+ {
2483
+ "path": "docs/adr/0404-a-party-is-a-room-and-rooms-register-as-kinds.md",
2484
+ "mode": "0000644",
2485
+ "sha256": "b383c189cf0069b724ee895d984592ec5bc04aded9deef32ea7129f7ce3381da"
2486
+ },
2487
+ {
2488
+ "path": "docs/adr/0405-each-character-has-one-colour-and-the-visor-wears-it.md",
2489
+ "mode": "0000644",
2490
+ "sha256": "1d8b8c6782ca394e6f85072355140136eff97e1a26ace0fcf392f1206b7a77ec"
2491
+ },
2482
2492
  {
2483
2493
  "path": "docs/adr/README.md",
2484
2494
  "mode": "0000644",
2485
- "sha256": "ca848f718bbc048e492417b7b92b00359d691473891950302d5d7d232da2a1ad"
2495
+ "sha256": "567b8b3dcf30ff69de7c484aa84e142bccd2753c9c89fd1c1ab941c9519a0560"
2486
2496
  },
2487
2497
  {
2488
2498
  "path": "docs/api-reference.md",
@@ -2517,12 +2527,12 @@
2517
2527
  {
2518
2528
  "path": "docs/copy-inventory.md",
2519
2529
  "mode": "0000644",
2520
- "sha256": "4f561c4c13b185d12c1cb4c2dce8d7f4415bf22fd3d9f6969556e21335a1f643"
2530
+ "sha256": "ee662d352052ce7cf385b005cee788a68f8e970c1a19575f259611266f784c88"
2521
2531
  },
2522
2532
  {
2523
2533
  "path": "docs/copy-registry.json",
2524
2534
  "mode": "0000644",
2525
- "sha256": "e2fd36ea4e5ba73c38737e07f3ced678d330356bd803cb52ecbb65063e85e457"
2535
+ "sha256": "4a0c854417ce7567781da0405dcbe3f96d301ef238e7facb1a16d419d543df9c"
2526
2536
  },
2527
2537
  {
2528
2538
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2534,6 +2544,46 @@
2534
2544
  "mode": "0000644",
2535
2545
  "sha256": "23b1de77bb1cfa998257fbad37b4dd64235ddd5b8e17f53bc83d77d9c6fdd6a8"
2536
2546
  },
2547
+ {
2548
+ "path": "docs/design/characters/v2/artisan-visor.png",
2549
+ "mode": "0000644",
2550
+ "sha256": "6a1ee297f0cc7ff159cc71f7c78df927999893767803d9a005a3068853167d84"
2551
+ },
2552
+ {
2553
+ "path": "docs/design/characters/v2/artisan.png",
2554
+ "mode": "0000644",
2555
+ "sha256": "75efc5fa7efca72582c3354709bbc7de8a70ac9c5b6eac04d3349dc771a267aa"
2556
+ },
2557
+ {
2558
+ "path": "docs/design/characters/v2/artist-visor.png",
2559
+ "mode": "0000644",
2560
+ "sha256": "48250f3529f8cb6644cba99c6e3faeaab0c096838ca472bc7ba5e618569421bc"
2561
+ },
2562
+ {
2563
+ "path": "docs/design/characters/v2/artist.png",
2564
+ "mode": "0000644",
2565
+ "sha256": "e33cae66d718fdc39f22dc634f4c4ac466b119685f5f5a2d8e81534f27e19d31"
2566
+ },
2567
+ {
2568
+ "path": "docs/design/characters/v2/draw-characters.js",
2569
+ "mode": "0000644",
2570
+ "sha256": "3b9a6c07f8e2261c992f3d4f5e4b28e396c146ed3881a7c57c477a1a2e8389ad"
2571
+ },
2572
+ {
2573
+ "path": "docs/design/characters/v2/patron-visor.png",
2574
+ "mode": "0000644",
2575
+ "sha256": "9f95dedffdce4358a3e4f6f97c72b88ce065e4083ae1a9b4566a4a8ea8d7dcf1"
2576
+ },
2577
+ {
2578
+ "path": "docs/design/characters/v2/patron.png",
2579
+ "mode": "0000644",
2580
+ "sha256": "6fc2e84bafe99cb0cf040166bdaeec1431d5fb7d93c3f4900462c2dc2cf9fd53"
2581
+ },
2582
+ {
2583
+ "path": "docs/design/characters/v2/sheet.html",
2584
+ "mode": "0000644",
2585
+ "sha256": "b56308d99dee2d606475bbe6a4d9ca1efc472e18a8e0293d2d70a568bff9e887"
2586
+ },
2537
2587
  {
2538
2588
  "path": "docs/design/craft-mode-direction.md",
2539
2589
  "mode": "0000644",
@@ -3037,12 +3087,12 @@
3037
3087
  {
3038
3088
  "path": "docs/module-api-changelog.md",
3039
3089
  "mode": "0000644",
3040
- "sha256": "bba6458b2c8742106eabe1e8c4646fb9a5ceea75fba0bb3a375b6ea7a986fc80"
3090
+ "sha256": "d7caaf44b5a42ed511e8f1b1b0f6e63cf73c34b17b579c39bd906af2cf5f1a3e"
3041
3091
  },
3042
3092
  {
3043
3093
  "path": "docs/modules-contract.md",
3044
3094
  "mode": "0000644",
3045
- "sha256": "d537c6d220e7ba90e46a283c6bf2f0e38699478ff0be33271eeb4e12bd9651c5"
3095
+ "sha256": "612555c173a834511820e075ec61e13b5e89494185ac85d84d6e57eed58dc0a5"
3046
3096
  },
3047
3097
  {
3048
3098
  "path": "docs/onboarding/diagrams/01-task-lifecycle.mmd",
@@ -3122,7 +3172,7 @@
3122
3172
  {
3123
3173
  "path": "docs/page-readings.json",
3124
3174
  "mode": "0000644",
3125
- "sha256": "a15df86b33d43c4b42bc9854319497d86b3671ffbda88f765bfe8ed3a9ed6fde"
3175
+ "sha256": "c7203e4d93ca91f4a550ff3c132155136e48286400ac15f65f13bd8dd6c11b9d"
3126
3176
  },
3127
3177
  {
3128
3178
  "path": "docs/project-context.template.md",
@@ -6184,20 +6234,50 @@
6184
6234
  "mode": "0000644",
6185
6235
  "sha256": "efe0b6cfb43766e6d72f416df070a170ffc4254495ddcb27c36c8d6ff63582d3"
6186
6236
  },
6237
+ {
6238
+ "path": "modules/hall-ui/public/characters/artisan-face.png",
6239
+ "mode": "0000644",
6240
+ "sha256": "8639879d7613c953cc22436d052b3b199401098b653cba98fa626d0407c0fd45"
6241
+ },
6242
+ {
6243
+ "path": "modules/hall-ui/public/characters/artisan-visor.png",
6244
+ "mode": "0000644",
6245
+ "sha256": "83b4a196eb9e92b360a7a8556fc00f3ed70ce47d8d2d06b29b7f7075ff47dfac"
6246
+ },
6187
6247
  {
6188
6248
  "path": "modules/hall-ui/public/characters/artisan.png",
6189
6249
  "mode": "0000644",
6190
- "sha256": "68fc4927c4e3addd4c0d71419cd36ce0adc9bf125946c3c1cede26ec51c91144"
6250
+ "sha256": "75efc5fa7efca72582c3354709bbc7de8a70ac9c5b6eac04d3349dc771a267aa"
6251
+ },
6252
+ {
6253
+ "path": "modules/hall-ui/public/characters/artist-face.png",
6254
+ "mode": "0000644",
6255
+ "sha256": "20dd36710c52f164ece07da65104b827472ac47df8c5eeb966e56afac143a6d8"
6256
+ },
6257
+ {
6258
+ "path": "modules/hall-ui/public/characters/artist-visor.png",
6259
+ "mode": "0000644",
6260
+ "sha256": "f1124a72857581e2b2df36600aac2c0ea4bc5a0f02e95dfa92cc2e93797b525b"
6191
6261
  },
6192
6262
  {
6193
6263
  "path": "modules/hall-ui/public/characters/artist.png",
6194
6264
  "mode": "0000644",
6195
- "sha256": "d75f3b2c0d90be3ca4d2d26ee3c8cedb34bd22015eca55c992361534fdaa1cf5"
6265
+ "sha256": "e33cae66d718fdc39f22dc634f4c4ac466b119685f5f5a2d8e81534f27e19d31"
6266
+ },
6267
+ {
6268
+ "path": "modules/hall-ui/public/characters/patron-face.png",
6269
+ "mode": "0000644",
6270
+ "sha256": "09199a2663190ce07dcd4583acd6a857b7c2f066ac630c53a08e2f25320be5b2"
6271
+ },
6272
+ {
6273
+ "path": "modules/hall-ui/public/characters/patron-visor.png",
6274
+ "mode": "0000644",
6275
+ "sha256": "22d0bea9159a1960f7237af708a0327409c630b88b40e259f22e0976ce5df81c"
6196
6276
  },
6197
6277
  {
6198
6278
  "path": "modules/hall-ui/public/characters/patron.png",
6199
6279
  "mode": "0000644",
6200
- "sha256": "88742f5047d183b74718276c83bc36a22646e58484c6cd5713459c0fdaaaf82a"
6280
+ "sha256": "6fc2e84bafe99cb0cf040166bdaeec1431d5fb7d93c3f4900462c2dc2cf9fd53"
6201
6281
  },
6202
6282
  {
6203
6283
  "path": "modules/hall-ui/public/chime.wav",
@@ -6332,7 +6412,7 @@
6332
6412
  {
6333
6413
  "path": "modules/hall-ui/public/craft-mode.js",
6334
6414
  "mode": "0000644",
6335
- "sha256": "15dc97554ec17cde2938078650290333d5d15a847654688381d5a9b218d90b9f"
6415
+ "sha256": "97673df1b505c56d8265ac49896eb96479fe81b5dfc2fa2e694364ed4614122b"
6336
6416
  },
6337
6417
  {
6338
6418
  "path": "modules/hall-ui/public/craft-review.css",
@@ -6647,17 +6727,17 @@
6647
6727
  {
6648
6728
  "path": "modules/hall-ui/public/home-city.js",
6649
6729
  "mode": "0000644",
6650
- "sha256": "438c26d63fdc11c89c219e317ded486217275fc48e3c3746f76b9565c11342a7"
6730
+ "sha256": "9a8a5b5eeae1af57285b0f352e6c01a721ea2d0b5a0310e3efd7197344eb5d05"
6651
6731
  },
6652
6732
  {
6653
6733
  "path": "modules/hall-ui/public/home-gallery.css",
6654
6734
  "mode": "0000644",
6655
- "sha256": "416059288af3503f90a6aff4ed2b8b1ce94741cd975fbc5bed3838c4d69a632c"
6735
+ "sha256": "416a9e3abf34f48f0037350cb43f9b795197ae9e004aa2b0baeeb55b89e959de"
6656
6736
  },
6657
6737
  {
6658
6738
  "path": "modules/hall-ui/public/home-gallery.js",
6659
6739
  "mode": "0000644",
6660
- "sha256": "aed701de3b07999ef86c7e5b93ac294b1e413ada1230fbb909049e8aa6bd23d0"
6740
+ "sha256": "6e56d2f9a5cbb9248e15d4a135756ceaec1b1f186c635e2f21ca091a730d964d"
6661
6741
  },
6662
6742
  {
6663
6743
  "path": "modules/hall-ui/public/home-idea-box.css",
@@ -7352,7 +7432,7 @@
7352
7432
  {
7353
7433
  "path": "modules/hall-ui/public/style.css",
7354
7434
  "mode": "0000644",
7355
- "sha256": "d42939b4e5777cd304c272caa057f6723b8cff8a372b4275a7caa6dade7200b4"
7435
+ "sha256": "ee20d5dc4b74f5d2568ae49ce1ad83ab9380d95415a0ef859056888109f4be97"
7356
7436
  },
7357
7437
  {
7358
7438
  "path": "modules/hall-ui/public/task-detail.js",
@@ -7442,12 +7522,12 @@
7442
7522
  {
7443
7523
  "path": "modules/hall-ui/public/visor.css",
7444
7524
  "mode": "0000644",
7445
- "sha256": "8c7c3088fb756d2e6fddc6d9d9df81fb67ada498628dc3a9ff67a8cbb97ab3e6"
7525
+ "sha256": "d6f65d5ac6756b323d47ad8eaa2b4a08c207cbf9424e6b07821ef29ffa42fe60"
7446
7526
  },
7447
7527
  {
7448
7528
  "path": "modules/hall-ui/public/visor.js",
7449
7529
  "mode": "0000644",
7450
- "sha256": "ce6b2a68e041a0e529fed8270405dcd15bb300e1ec5bf1d3c6afbf561ee53936"
7530
+ "sha256": "4cad8cd3de8c9cc20af4cc8c6afdecd893ee2a41b5feff02b51f4406459d1e1b"
7451
7531
  },
7452
7532
  {
7453
7533
  "path": "modules/hall-ui/public/vote-control.js",
@@ -7559,6 +7639,11 @@
7559
7639
  "mode": "0000644",
7560
7640
  "sha256": "d3911fb48be461f005561fb69af5ca1124af02db909b751fbe4c2bc98b301850"
7561
7641
  },
7642
+ {
7643
+ "path": "modules/hall-ui/records/characters.md",
7644
+ "mode": "0000644",
7645
+ "sha256": "0ed7c25438fac16e87a78aff0786792d8a54fd69d207fc52bbd12c2ed4c6fff8"
7646
+ },
7562
7647
  {
7563
7648
  "path": "modules/hall-ui/records/collaboration.md",
7564
7649
  "mode": "0000644",
@@ -7757,7 +7842,7 @@
7757
7842
  {
7758
7843
  "path": "modules/hall-ui/records/visor.md",
7759
7844
  "mode": "0000644",
7760
- "sha256": "a1e1421463d9107782c46309339510d6e5c82a38f142ccf35f17fb53effb6c97"
7845
+ "sha256": "f41c9dc1788401b4c25cab81c345fe622d6fc4725fe76993b95959b4ba2c59c8"
7761
7846
  },
7762
7847
  {
7763
7848
  "path": "modules/hall-ui/records/welcome-tower.md",
@@ -12107,12 +12192,12 @@
12107
12192
  {
12108
12193
  "path": "package-lock.json",
12109
12194
  "mode": "0000644",
12110
- "sha256": "aca584f965a5191a12f9c0547ed3bc0be72a13f8043b13a2d3a2ec65b08d8632"
12195
+ "sha256": "b9da5660886768da2f0a99dc2f2eff462cc080983515d1d9ca06374d62db70fa"
12111
12196
  },
12112
12197
  {
12113
12198
  "path": "package.json",
12114
12199
  "mode": "0000644",
12115
- "sha256": "c0cae817310174c3e98cef573263c33c9807c1c8086b050fc13f5f1a18001b4d"
12200
+ "sha256": "acaf640eb1edf032dfaa9a676b38bfec7a079c78d8962ca45963a232965be486"
12116
12201
  },
12117
12202
  {
12118
12203
  "path": "public-docs/index.html",
@@ -12132,7 +12217,7 @@
12132
12217
  {
12133
12218
  "path": "release-notes.json",
12134
12219
  "mode": "0000644",
12135
- "sha256": "6aff28036a7071c6895abc1f682477f4cd41b1fe02bf96fad15a7f42c05de7d9"
12220
+ "sha256": "df32f9a699d1cfd5239943e3e08aed1601401996748abf9a23984d52cffa2a74"
12136
12221
  },
12137
12222
  {
12138
12223
  "path": "scripts/bongos/CLAUDE.md",
@@ -16137,7 +16222,7 @@
16137
16222
  {
16138
16223
  "path": "src/module-api.js",
16139
16224
  "mode": "0000644",
16140
- "sha256": "a8399bb92d13d12c44c07cf942398f10b93590bbeb054610a5d9952cd9b044ab"
16225
+ "sha256": "244c19299fa34d2c8578e20ea64d2f1a103cf49db7d25f7203efa1dd76ee2bab"
16141
16226
  },
16142
16227
  {
16143
16228
  "path": "src/module-loader/catalog.js",
@@ -16172,7 +16257,7 @@
16172
16257
  {
16173
16258
  "path": "src/module-seams.js",
16174
16259
  "mode": "0000644",
16175
- "sha256": "e3cacfd18defeb53108e2696a14efba7012d052899620deccd4e08248f618bd2"
16260
+ "sha256": "7975a911a4bf1f42eb3fecbf5b2d4bb0d62716a58bc6ee442f71a5a155f0cf76"
16176
16261
  },
16177
16262
  {
16178
16263
  "path": "src/modules.js",
@@ -17072,7 +17157,7 @@
17072
17157
  {
17073
17158
  "path": "tests/character_creation.mjs",
17074
17159
  "mode": "0000644",
17075
- "sha256": "ce048c8ba8a60d5725feb4a9a9961b6a2a9561b16cddca54f48354644262cc51"
17160
+ "sha256": "0631568f7aea189a66537eaabeedc2edbcfca5f031c419810d44e8842293c8a7"
17076
17161
  },
17077
17162
  {
17078
17163
  "path": "tests/city_card_context.mjs",
@@ -19402,7 +19487,7 @@
19402
19487
  {
19403
19488
  "path": "tests/hall_visor.mjs",
19404
19489
  "mode": "0000644",
19405
- "sha256": "7cebc92c9a8c34eb1d11ef0316767fd0ff3fc01dfe20917f7b4194f89174830c"
19490
+ "sha256": "5c91b7d8d9b9b997c05620ea48bfdfb4209b163d10a9ef03345c883d79823bad"
19406
19491
  },
19407
19492
  {
19408
19493
  "path": "tests/hall_work_history_id.mjs",
@@ -19462,7 +19547,7 @@
19462
19547
  {
19463
19548
  "path": "tests/home_gallery_widget.mjs",
19464
19549
  "mode": "0000644",
19465
- "sha256": "c6efbc12c975d3a6ca63219dcdd3748b79d7365097d9fb8881503c9769a1db6a"
19550
+ "sha256": "60e0615ea852127d3aedfba058e50ab56957e314bd56a32dd99a8df5326662cc"
19466
19551
  },
19467
19552
  {
19468
19553
  "path": "tests/home_idea_box.mjs",
@@ -21849,6 +21934,11 @@
21849
21934
  "mode": "0000644",
21850
21935
  "sha256": "1e565de6c7587bd32d3e8c8fba7ad245776285f3a882c752e7e4ca7cfacbd063"
21851
21936
  },
21937
+ {
21938
+ "path": "tests/room_kinds_seam.mjs",
21939
+ "mode": "0000644",
21940
+ "sha256": "0bdb24f1af191a0f9b0aad33f5e8de6d01c48c9affc101049c856df5866a892e"
21941
+ },
21852
21942
  {
21853
21943
  "path": "tests/roster_government_columns.mjs",
21854
21944
  "mode": "0000644",
@@ -0,0 +1,118 @@
1
+ # ADR 0404 — A party is a room, and rooms register as kinds
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-11-12
5
+ - **Task:** [task 1005220](https://cloudbongos.com/builders#/task/1005220) — goal 1000148 "A party talks through Discord" (BONGOS-V3, criterion `a-party-talks-through-discord`)
6
+ - **Deciders:** the owner, Lars, 2026-11-12: free-form parties are in V3 as well as the game's existing groups; the chat bridge to Discord comes after the core; the party bars show in voice / muted, not a live speaker. The plan behind this ADR went through two rounds of adversarial review the same day.
7
+ - **Builds on:** [ADR 0400](0400-a-chain-reserves-work-and-each-sub-quest-is-still-claimed-alone.md) (`chain_party`), [ADR 0403](0403-in-game-mode-the-visor-is-the-control-and-the-scene-is-the-view.md) (controls live on the visor), [ADR 0083](0083-modular-architecture-strangler-build-plan.md) (modules meet only through seams), [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (rank is the only authority).
8
+ - **Gates:** every task in goal 1000148. Its sibling, the ADR on Discord room channels and chat crossing (task 1005221), decides the Discord side and amends ADR 0032, 0033 and 0037.
9
+
10
+ ## Context
11
+
12
+ The owner asked for Discord text and voice in the game "to begin party dynamics". The game already has several groups that would talk together, each planned in a different module:
13
+
14
+ - a **chain party** (`chain_party`, ADR 0400): the people holding a quest chain, with a raid quorum;
15
+ - a **scoping session** (task 1005164): a Patron's room of up to about forty;
16
+ - a **decision room** (task 1005173): a presenter, the people in the room, and pre-voters outside it;
17
+ - and, by the owner's decision, a **free-form party** a player forms on their own.
18
+
19
+ Each needs the same three things: a private Discord voice channel, a list of who is in it and whether they are in voice, and a chat. Building those three things once per group would mean four copies. Building them in a new module that reads each group's tables would break the module boundary (a module may require only `src/module-api.js`, never another module).
20
+
21
+ The obvious seam does not work. A port is single-provider: `registerProvider` throws on a second provider (`src/module-seams.js`) and `verifyPortsSatisfied` fails the boot when two enabled modules declare the same port. Four modules cannot all provide `room.members`.
22
+
23
+ ## Decision
24
+
25
+ ### D1 — A room is any group that talks together; a party is a room
26
+
27
+ "Room" is the one word for a group with a voice channel, a member list and a chat. A party in the player's sense is any room they are in. There are four **kinds** in V3, each owned by the module that already owns the group:
28
+
29
+ | Kind | What it is | Owner module | Cap |
30
+ |---|---|---|---|
31
+ | `party` | a free-form party a player forms (tasks 1005233–1005236) | `lifecycle` | 8 |
32
+ | `chain` | a chain party, an open `chain_party` row (ADR 0400) | `lifecycle` | the largest raid R21 allows; 8 until R21 sets one |
33
+ | `scoping` | a scoping session's participants (task 1005164, which had no module: it is assigned `lifecycle`, because a scope ends as goals and tasks) | `lifecycle` | 40 |
34
+ | `decision` | a decision room's attendees (task 1005173); pre-voters are not members | `government` | 40 |
35
+
36
+ A room's cap is also the `user_limit` of its Discord voice channel.
37
+
38
+ ### D2 — Rooms register through a contribution point, not a port
39
+
40
+ Each owner module contributes its kind at mount time:
41
+
42
+ ```js
43
+ api.contribute('room.kinds', {
44
+ kind: 'scoping', // unique across kinds; a duplicate is a boot error
45
+ owner: 'lifecycle', // the contributing module's key
46
+ cap: 40,
47
+ members: async (roomId) => [{ builderId, joinedAt }], // current members only
48
+ isMember: async (roomId, builderId) => true | false,
49
+ invite: async (roomId, inviterId, inviteeLogin) => {...}, // optional
50
+ accept: async (inviteId, builderId) => {...}, // optional
51
+ });
52
+ ```
53
+
54
+ A consumer (the Discord side, the chat, the party bars) finds a kind with `api.contributions('room.kinds')` and calls its functions. It never reads the owner's tables. A contribution point accepts many contributors, so four owners cause no conflict, and an instance with none of them simply has no rooms.
55
+
56
+ **Two kinds with the same `kind` value is a configuration error.** Consumers look a kind up by its name and must never have to choose between two. The room channels task (task 1005225), the first consumer, adds the boot check that refuses it, the same way a doubly-provided port is refused.
57
+
58
+ The owner fires four events through the normal event seam, each with plain ids and nothing else:
59
+
60
+ | Event | Payload |
61
+ |---|---|
62
+ | `room.opened` | `{ kind, roomId }` |
63
+ | `room.member.joined` | `{ kind, roomId, builderId }` |
64
+ | `room.member.left` | `{ kind, roomId, builderId, reason }`, where reason is `left`, `kicked`, `lapsed` or `deactivated` |
65
+ | `room.closed` | `{ kind, roomId }` |
66
+
67
+ Listeners must also be correct when they miss an event (the bot was down, the process restarted): `members()` is the truth, and every consumer that keeps its own state reconciles against it.
68
+
69
+ ### D3 — Free-form party rules
70
+
71
+ - One open party per builder at a time.
72
+ - The creator leads. When the leader leaves, the longest-standing member leads. When the last member leaves, the party disbands and fires `room.closed`.
73
+ - A party lasts until it is disbanded. It does not end when someone logs out.
74
+ - Only the leader removes a member.
75
+ - Invites go through `invite`/`accept`, with the abuse controls task 1005231 builds: a per-inviter rate limit, a cap on pending invites, silent decline, a cooldown before re-inviting, an invitee-side block, and a switch to refuse all invites.
76
+
77
+ ### D4 — A chain party's voice follows its reservation
78
+
79
+ A member of a chain room is a builder with an open `chain_party` row. This closes ADR 0400's open question 3 *for voice and chat*: a member who leaves the chain loses the voice channel and the chat at once. What the chain's remaining sub-quests do when a raid member leaves stays the chain's own question, settled where the leave door is built (task 1005238).
80
+
81
+ ### D5 — Players without a linked Discord account
82
+
83
+ They get the whole room except voice: they are members, they appear on the party bars marked **not linked**, and they can chat in the game. They are never sent a channel id or link.
84
+
85
+ ### D6 — Realtime is polling in V3
86
+
87
+ The live stream (`GET /api/bongos/live`) sends one empty nudge to every open hall, and modules cannot add their own. Pushing every chat line or voice change through it would make every builder's hall reload everything. V3 polls instead:
88
+
89
+ - **party bars:** every 3 seconds while visible;
90
+ - **chat:** every 3 seconds while the drawer is open;
91
+ - both send a cursor (`?since=`) and get **304** when nothing changed;
92
+ - both stop when the tab is hidden and slow to 15 seconds after 60 seconds idle;
93
+ - both read through a limiter keyed by the builder, tagged with a `meteredScope` like every per-surface limiter, never the shared per-IP default.
94
+
95
+ A scoped live event is the upgrade path if 40-person rooms make polling too costly. It is a core change and is not decided here.
96
+
97
+ ### D7 — With the discord module off
98
+
99
+ No Voice key and no voice state anywhere. Nothing is drawn empty (the visor rule). Rooms, members, invites, the party bars and chat all still work.
100
+
101
+ ### D8 — A room is never authority
102
+
103
+ Being in a room, leading one or inviting into one admits no claim, vote, approval, deploy or spend that rank would refuse (criterion C3, ADR 0016). Every write route the room tasks add is rank-gated like any other.
104
+
105
+ ## Consequences
106
+
107
+ - Goal 1000148's tasks build to this: the room channels (task 1005225) and access sync (task 1005226) read `members()` and listen for the four events; voice presence (task 1005227) and the party bars (task 1005205) check `isMember`; the room chat (task 1005228) keys its lines by `(kind, roomId)`; each kind's task contributes its entry.
108
+ - The `room.kinds` point and the four events are added to the live seam registry in [`docs/modules-contract.md`](../modules-contract.md), and `src/module-seams.js` lists the point among its canonical extension points.
109
+ - `tests/room_kinds_seam.mjs` pins the seam choice: two kinds from two modules register and the boot check still passes, while the same pair registered as a port is refused.
110
+
111
+ ## Rejected
112
+
113
+ - **One `room.members` port.** Ports are single-provider. Four owners would fail the boot.
114
+ - **One port per kind** (`room.members.chain`, `room.members.scoping`, …). It works, but every consumer must hard-code the list of kinds, and a new kind means editing every consumer.
115
+ - **A new `rooms` module that reads each owner's tables.** A module may not require another module, and the rooms module would end up copying each owner's rules about who counts as a member.
116
+ - **A free-form party as a second roster beside `chain_party`, kept in sync.** Two rosters drift. A free-form party is its own kind; when a party takes a chain, its members join through the chain's own door (task 1005160, R20) and the chain room is a separate room.
117
+ - **Push through `/live` now.** It reloads every hall for every message (D6).
118
+ - **Speaking indicators.** Discord gives a web page no "speaking" signal without a partner-only permission. The bars show in voice and muted only, by owner decision.
@@ -0,0 +1,31 @@
1
+ # 0405 — Each character has one colour, and the visor wears it
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-11-12
5
+ - **Decided by:** the owner, in the brief for [task 1005218](https://cloudbongos.com/builders#/task/1005218) (2026-11-11) and on the picture sheet `docs/design/characters/v2/sheet.png` (2026-11-12).
6
+ - **Goal:** [goal 1000142](https://cloudbongos.com/builders#/goal/1000142) — the V3 game conversion.
7
+ - **Builds on:** [ADR 0399](0399-the-visor-is-glass-over-the-scene-and-owns-no-camera.md) (the visor), [ADR 0402](0402-helm-is-the-halls-look-and-the-hall-is-dark-only.md) (Helm), [ADR 0403](0403-in-game-mode-the-visor-is-the-control-and-the-scene-is-the-view.md) (the visor is the control).
8
+
9
+ ## 1. The decision
10
+
11
+ The three characters each have **one colour**: the Artisan ember, the Artist violet, the Patron gold. In game mode **the visor wears the held character's colour**: the frame's lines, the sight, the character's name, the rim of your picture, and the accent on the glass (the one button, the segment being built, a hovered row). Your picture on the glass is your character **wearing the visor**, its rim in the same colour.
12
+
13
+ The characters themselves are redrawn (the "second look"): 64 by 64 pixel art, still two animals in one body, as space-faring aliens in the Helm night rather than figures from ancient Egypt. One animal gives the whole head and the other the whole body: a ram on a lizard (Artisan), an ibis on an octopus (Artist), a falcon on a lion (Patron).
14
+
15
+ ## 2. How it sits with the design rules
16
+
17
+ - **The Fifteen Rule holds.** No colour is typed in. `--char-artisan` is `--accent`; `--char-artist` is a mix of `--sea`, `--accent` and `--ink`; `--char-patron` is a mix of `--warn` and `--ink` (`modules/hall-ui/public/style.css`). A host that overrides its accent or sea moves the characters' colours with it.
18
+ - **The One Warm Thing Rule is narrowed, on the glass only.** The hall still has one accent, and it still marks only what you can act on. On the visor that accent **is** the character's colour (`visor.css` re-points `--accent` under `.visor[data-character]`), so there is still one lit colour on the glass at a time; it is yours rather than the hall's. An Artisan's glass is unchanged, because the Artisan's colour is the accent. Classic mode and every hall page outside the glass are untouched.
19
+ - **The Patron's gold is made from the status amber.** It is lighter than `--warn` and never appears as a status, but the two are neighbours. If a Patron's glass is ever read as a warning, the fix is a different mix here, not a new literal.
20
+
21
+ ## 3. What was considered and not done
22
+
23
+ - **Two new typed-in colours** (`#c59bff`, `#ffd166`, the values the pictures are drawn in). Refused by the design-count ratchet, correctly: the baseline is never raised to pass. The mixes land close to them.
24
+ - **Tinting the whole hall** by character. Not asked for; the brief names the visor.
25
+
26
+ ## 4. Consequences
27
+
28
+ - The pictures are **drawn by a script**, `docs/design/characters/v2/draw-characters.js --hall`, which writes the hall's nine files (`<id>.png`, `<id>-face.png`, `<id>-visor.png`). A change to a character is an edit there and a re-run, never a hand-edited PNG. The script's header holds the six rules the owner's feedback set.
29
+ - The pictures use their own fixed colours (they are art, not UI), so a host that re-themes its accent will see the Artisan's glass move while the Artisan's picture keeps its ember trim.
30
+ - A scene's own buttons still wear the hall's accent (the Governor City's "decide" button stays salmon under a violet or gold glass). ADR 0403 already moves those onto the visor.
31
+ - The old Egyptian sheet stays at `docs/design/characters/character-sprites-source.webp` as the record of the first look.
@@ -519,3 +519,5 @@ These 20 numbers are each shared by exactly two files. They are **accepted histo
519
519
  | 0400 | [**A chain reserves work; each sub-quest is still claimed on its own** ([task 1005158](https://cloudbongos.com/builders#/task/1005158), spike V3G.R18, goal 1000144). C5 of the game conversion: work is claimed as a chain, not picked from a flat table. Owner ruling (interview answer 3): a chain RESERVES, tasks are still claimed one at a time. **Decision:** three new tables (`chains` inside one goal, `chain_tasks` with a task in at most one open chain, `chain_party`), none of them a claim — no `claims` row, no session binding, no worktree — so `gateOneActiveClaimPerSession` (ADR 0097) and its unique index never see a chain. **Order is derived, never stored** (ADR 0153's rejection holds): the topological order of `task_dependencies` over the chain's members, ties by priority/estimate/id — `sequence.js`'s `topoOrder`, moved into one shared module. Every sub-quest claims through the unchanged `POST /claims` ladder. **The one addition** is a narrowing-only `CHAIN_RESERVED` check placed AFTER the last existing rung on both insert sites + the dry run + the feed: an outsider can't claim a reserved chain's sub-quest, while every existing refusal keeps its code, message and precedence. Party size (raid quorum vs routine) is refused at the chain's own join door, never in the claim ladder; character counts seats and is never read by a claim rung. A reservation lapses after days with no claim or ship, reported before it acts (ADR 0226). Rejected: a chain as N claims, loosening the session guard, chain = goal, a stored order, an early-ladder check (would mask rank/deps refusals), a feed-only reservation.](0400-a-chain-reserves-work-and-each-sub-quest-is-still-claimed-alone.md) | lifecycle / claims / game conversion |
520
520
  | 0402 | [**Helm is the hall's look, and the hall is dark only** ([task 1005192](https://cloudbongos.com/builders#/task/1005192)). The game (the hall, everything after sign-in) wears Helm; the landing, the hub and the status page keep the chrome world. The kit: two voices (Barlow Condensed in wide capitals names a thing, Barlow says everything else), four colours with one job each (Night the ground, Ice what you read, White names and numbers, the accent only what you can act on), three shapes (the cut corner for anything pressable, the segment for progress, the arc for the visor). The values live in the hall's token block; `src/hall-helm.js` recognises a hall page by the sheet it links, pins it dark and hands it the Helm faces unless its pack chose its own. The light/dark switch is gone; the light tier stays until its own removal. The shared button spends every Helm token with the old pill as the fallback, so the status page does not move.](0402-helm-is-the-halls-look-and-the-hall-is-dark-only.md) | design system / hall |
521
521
  | 0403 | [**In game mode the visor is the control and the scene is the view** ([task 1005203](https://cloudbongos.com/builders#/task/1005203), goal 1000142; owner 2026-11-11). Every main call to action you can see in game mode lives on the visor (the accent button, the key hints, the Actions sheet); the city, the sky and Home only show the project and can be moved through, never carry buttons of their own. A scene offers its actions to the visor through `OTBVisor.scene`. Found not yet keeping it: the city's decide button and door, the sky's top row and composer, Home's gallery links, the Artist's feedback tab.](0403-in-game-mode-the-visor-is-the-control-and-the-scene-is-the-view.md) | hall / game frame |
522
+ | 0404 | [**A party is a room, and rooms register as kinds** ([task 1005220](https://cloudbongos.com/builders#/task/1005220), goal 1000148). Any group that talks together is a room: a free-form party (cap 8), a chain party (ADR 0400), a scoping session (cap 40, owned by `lifecycle`) or a decision room (cap 40, `government`). Each owner contributes its kind to the `room.kinds` contribution point (a port is single-provider, so four owners would fail the boot) with `members`/`isMember`/optional `invite`/`accept`, and fires `room.opened`/`room.member.joined`/`room.member.left`/`room.closed`; consumers never read an owner's tables and reconcile against `members()`. Free-form party: one per builder, leader handover to the longest-standing member, disband on last leave. A chain room follows an open `chain_party` row. Unlinked players get everything but voice. V3 polls (3 s, cursor + 304, paused when hidden, per-builder limiter) rather than pushing through `/live`. With discord off, no voice key or voice state; chat still works. A room is never authority. Rejected: one port, a port per kind, a rooms module reading other modules' tables, a second party roster, push via `/live`, speaking indicators.](0404-a-party-is-a-room-and-rooms-register-as-kinds.md) | game frame / modules / Discord |
523
+ | 0405 | [**Each character has one colour, and the visor wears it** ([task 1005218](https://cloudbongos.com/builders#/task/1005218), goal 1000142; owner 2026-11-12). The Artisan is ember (the accent), the Artist violet, the Patron gold, each mixed from the hall’s tokens and none typed in. In game mode the visor’s lines, name, picture rim and accent are the held character’s colour, and your picture on the glass is your character wearing the visor. The characters are redrawn at 64 by 64 as two-animal aliens, drawn by a script.](0405-each-character-has-one-colour-and-the-visor-wears-it.md) | hall / game frame |
@@ -284,7 +284,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
284
284
  | `906c2947dfc1` | certain | Changes save at once and take effect the next time you start a session on this machine. | `modules/hall-ui/public/settings.html:362` |
285
285
  | `52384bdc035c` | certain | Changes save at once. Your new choice plays the next time that event fires. | `modules/hall-ui/public/settings.html:375` |
286
286
  | `864503935eca` | certain | Changing the rule… | `modules/hall-ui/public/deploy.js:742` |
287
- | `44f783393438` | certain | Character creation | `modules/hall-ui/public/craft-mode.js:896` |
287
+ | `44f783393438` | certain | Character creation | `modules/hall-ui/public/craft-mode.js:905` |
288
288
  | `55ad21bd03eb` | certain | Chart the routes | `modules/hall-ui/public/goal-map.html:101` |
289
289
  | `55ad21bd03eb` | certain | Chart the routes | `modules/hall-ui/public/thinking.html:109` |
290
290
  | `e6982a9ff948` | certain | Charter library | `modules/hall-ui/public/government.js:855` |
@@ -303,7 +303,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
303
303
  | `89ddfeda9566` | certain | Choose goals | `modules/hall-ui/public/gate.js:186` |
304
304
  | `6bf684ebc1c3` | certain | Choose the skills for {…} | `modules/hall-ui/public/speciality-tools.js:199` |
305
305
  | `6c88cdf417f1` | certain | Choose which sound plays for each build event — one when Claude waits for your input, another when a task ship | `modules/hall-ui/public/settings.html:368` |
306
- | `7b984c01b6a8` | certain | Choose your character | `modules/hall-ui/public/craft-mode.js:897` |
306
+ | `7b984c01b6a8` | certain | Choose your character | `modules/hall-ui/public/craft-mode.js:906` |
307
307
  | `f7d8c25af75d` | certain | Choose your mode | `modules/hall-ui/public/craft-mode.js:670` |
308
308
  | `b7d5648b66db` | certain | Claim it | `modules/hall-ui/public/task.js:766` |
309
309
  | `b7d5648b66db` | certain | Claim it | `modules/hall-ui/public/task.js:899` |
@@ -316,7 +316,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
316
316
  | `4df46e2be815` | certain | Clear the key? | `modules/hall-ui/public/market-watch-settings.js:218` |
317
317
  | `593dda3178eb` | certain | Click to copy | `modules/hall-ui/public/copy-on-click.js:137` |
318
318
  | `34624d39ff29` | certain | Clone the project to your machine and run | `modules/hall-ui/public/setup-gate.js:34` |
319
- | `3a426bad2c49` | certain | Close actions | `modules/hall-ui/public/visor.js:232` |
319
+ | `3a426bad2c49` | certain | Close actions | `modules/hall-ui/public/visor.js:235` |
320
320
  | `70f6a704d504` | certain | Close it | `modules/hall-ui/public/copy-desk.html:140` |
321
321
  | `053e576ba9a3` | certain | Close options | `modules/hall-ui/public/shell-game.js:454` |
322
322
  | `d12a2fb5730d` | certain | Close this flag | `modules/hall-ui/public/copy-desk.html:116` |
@@ -1474,7 +1474,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1474
1474
  | `604292be5554` | certain | This goal is scoped to a protected module — only an Archon may bring someone in. | `modules/hall-ui/public/goals-render.js:1309` |
1475
1475
  | `ba404d3207f7` | certain | This goal isn't taking requests right now. | `modules/hall-ui/public/goals-render.js:1395` |
1476
1476
  | `c7d2bc751184` | certain | This goal was added to {…} after it had already started building — an Archon override of the scope gate | `modules/hall-ui/public/goals-render.js:895` |
1477
- | `1ab370135bee` | certain | This is who you are in the project. To change it later, sign out and pick again. | `modules/hall-ui/public/craft-mode.js:898` |
1477
+ | `1ab370135bee` | certain | This is who you are in the project. To change it later, sign out and pick again. | `modules/hall-ui/public/craft-mode.js:907` |
1478
1478
  | `23f531302e9e` | certain | This is you — | `modules/hall-ui/public/profile.js:364` |
1479
1479
  | `d313d3dfe438` | certain | This move is decided by the project’s government, not by one person here. | `modules/hall-ui/public/deploy.js:634` |
1480
1480
  | `f303bd107422` | certain | This page has been submitted and is on its way to the site. Its words are frozen until it ships or is sent bac | `modules/hall-ui/public/tweak-editor.js:332` |
@@ -1486,7 +1486,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1486
1486
  | `9a685b01e2c6` | certain | This page opens at a higher rank. | `modules/hall-ui/public/watch.html:237` |
1487
1487
  | `e7a289134dc3` | certain | This page shows no words the reader could find. | `modules/hall-ui/public/tweak-editor.js:246` |
1488
1488
  | `d4b3b5556986` | certain | This page's reference docs | `modules/hall-ui/public/page-notes.js:166` |
1489
- | `79e4a934b434` | certain | This place | `modules/hall-ui/public/visor.js:234` |
1489
+ | `79e4a934b434` | certain | This place | `modules/hall-ui/public/visor.js:237` |
1490
1490
  | `5bdcbec770dd` | certain | This project has no slash commands yet. | `modules/hall-ui/public/commands.js:37` |
1491
1491
  | `f53b83bfbe54` | certain | This project has no watch rules yet. | `modules/hall-ui/public/market-watch-rules.js:62` |
1492
1492
  | `e97b2d549f10` | certain | This project is hosted on {…}, and that is where it is taken offline or removed. Both links below open this pr | `modules/hall-ui/public/project-settings.js:412` |
@@ -1692,8 +1692,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1692
1692
  | `a1f290d92800` | certain | Your browser kept this tab open. Close it to quit. | `modules/hall-ui/public/shell-game.js:295` |
1693
1693
  | `3812b4d8106f` | certain | Your changes to this page | `modules/hall-ui/public/paintbrush.js:150` |
1694
1694
  | `7e5697ffbfc4` | certain | Your character | `modules/hall-ui/public/craft-mode.js:660` |
1695
- | `791f72bb7b35` | certain | Your character could not be saved. Reload and try again. | `modules/hall-ui/public/craft-mode.js:928` |
1696
- | `a80d4145a438` | certain | Your character could not be saved. Try again. | `modules/hall-ui/public/craft-mode.js:940` |
1695
+ | `791f72bb7b35` | certain | Your character could not be saved. Reload and try again. | `modules/hall-ui/public/craft-mode.js:937` |
1696
+ | `a80d4145a438` | certain | Your character could not be saved. Try again. | `modules/hall-ui/public/craft-mode.js:949` |
1697
1697
  | `44a68d05519e` | certain | Your choices for {…} | `modules/hall-ui/public/speciality-tools.js:171` |
1698
1698
  | `3f67b866f24e` | certain | Your devices | `modules/hall-ui/public/settings-autobongos.js:141` |
1699
1699
  | `909b0b7c6ffa` | certain | Your display name | `modules/hall-ui/public/settings.html:93` |
@@ -4920,7 +4920,7 @@
4920
4920
  "surface": "builders-hall",
4921
4921
  "text": "Character creation",
4922
4922
  "file": "modules/hall-ui/public/craft-mode.js",
4923
- "line": 896,
4923
+ "line": 905,
4924
4924
  "origin": "js-markup",
4925
4925
  "confidence": "certain"
4926
4926
  },
@@ -5091,7 +5091,7 @@
5091
5091
  "surface": "builders-hall",
5092
5092
  "text": "Choose your character",
5093
5093
  "file": "modules/hall-ui/public/craft-mode.js",
5094
- "line": 897,
5094
+ "line": 906,
5095
5095
  "origin": "js-markup",
5096
5096
  "confidence": "certain"
5097
5097
  },
@@ -5208,7 +5208,7 @@
5208
5208
  "surface": "builders-hall",
5209
5209
  "text": "Close actions",
5210
5210
  "file": "modules/hall-ui/public/visor.js",
5211
- "line": 232,
5211
+ "line": 235,
5212
5212
  "origin": "js-markup",
5213
5213
  "confidence": "certain"
5214
5214
  },
@@ -15630,7 +15630,7 @@
15630
15630
  "surface": "builders-hall",
15631
15631
  "text": "This is who you are in the project. To change it later, sign out and pick again.",
15632
15632
  "file": "modules/hall-ui/public/craft-mode.js",
15633
- "line": 898,
15633
+ "line": 907,
15634
15634
  "origin": "js-markup",
15635
15635
  "confidence": "certain"
15636
15636
  },
@@ -15738,7 +15738,7 @@
15738
15738
  "surface": "builders-hall",
15739
15739
  "text": "This place",
15740
15740
  "file": "modules/hall-ui/public/visor.js",
15741
- "line": 234,
15741
+ "line": 237,
15742
15742
  "origin": "js-markup",
15743
15743
  "confidence": "certain"
15744
15744
  },
@@ -17592,7 +17592,7 @@
17592
17592
  "surface": "builders-hall",
17593
17593
  "text": "Your character could not be saved. Reload and try again.",
17594
17594
  "file": "modules/hall-ui/public/craft-mode.js",
17595
- "line": 928,
17595
+ "line": 937,
17596
17596
  "origin": "js-text-assign",
17597
17597
  "confidence": "certain"
17598
17598
  },
@@ -17601,7 +17601,7 @@
17601
17601
  "surface": "builders-hall",
17602
17602
  "text": "Your character could not be saved. Try again.",
17603
17603
  "file": "modules/hall-ui/public/craft-mode.js",
17604
- "line": 940,
17604
+ "line": 949,
17605
17605
  "origin": "js-text-assign",
17606
17606
  "confidence": "certain"
17607
17607
  },