@bongos/core 1.25.30 → 1.25.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.bongos-core.json +29 -24
- package/clients/bongos-client/index.d.ts +1 -1
- package/docs/api/openapi.json +3 -6
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-readings.json +30 -31
- package/modules/government/docket.js +37 -6
- package/modules/hall-ui/public/city.js +1 -1
- package/modules/hall-ui/public/gov-feeds.js +2 -2
- package/modules/lifecycle/routes/tasks.js +1 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/src/module-api.js +1 -1
- package/tests/docket_load_speed.mjs +99 -0
- package/tests/hall_city_living.mjs +1 -1
- package/tests/hall_gov_counts.mjs +1 -1
- package/tests/hall_gov_real_site.mjs +1 -1
- package/tests/hall_street_deck.mjs +1 -1
- package/tests/hall_street_depth.mjs +2 -2
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.25.
|
|
6
|
-
"core_contract": "1.25.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.25.31",
|
|
6
|
+
"core_contract": "1.25.31",
|
|
7
|
+
"source_commit": "a1d1f604c62e353753a7d7344d6edf3bc408f94b",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-11-
|
|
9
|
+
"built_at": "2026-11-14T14:05:26.634Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 659,
|
|
13
13
|
"agent_docs_stubbed": 34,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 4093,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 4787,
|
|
20
|
+
"tree_sha256": "e2e0e7143622fd8e9a63676adbed944fc076df36c989d83b9bb712bf998e148b",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -352,7 +352,7 @@
|
|
|
352
352
|
{
|
|
353
353
|
"path": "clients/bongos-client/index.d.ts",
|
|
354
354
|
"mode": "0000644",
|
|
355
|
-
"sha256": "
|
|
355
|
+
"sha256": "f51ab63209b5775f32eeec740cee5620f83a67e5fb9bb3639e00802fda26513a"
|
|
356
356
|
},
|
|
357
357
|
{
|
|
358
358
|
"path": "clients/bongos-client/index.mjs",
|
|
@@ -2517,7 +2517,7 @@
|
|
|
2517
2517
|
{
|
|
2518
2518
|
"path": "docs/api/openapi.json",
|
|
2519
2519
|
"mode": "0000644",
|
|
2520
|
-
"sha256": "
|
|
2520
|
+
"sha256": "8ac1c69a4069c20755d65fb1269fb0d20a38a0a927abb11fecd542d22d9fac7a"
|
|
2521
2521
|
},
|
|
2522
2522
|
{
|
|
2523
2523
|
"path": "docs/architecture.md",
|
|
@@ -3102,7 +3102,7 @@
|
|
|
3102
3102
|
{
|
|
3103
3103
|
"path": "docs/module-api-changelog.md",
|
|
3104
3104
|
"mode": "0000644",
|
|
3105
|
-
"sha256": "
|
|
3105
|
+
"sha256": "6de528c95dfe94cebb2c1817e1e62e025468857ce810ff28fca95fc7d3e669b2"
|
|
3106
3106
|
},
|
|
3107
3107
|
{
|
|
3108
3108
|
"path": "docs/modules-contract.md",
|
|
@@ -3187,7 +3187,7 @@
|
|
|
3187
3187
|
{
|
|
3188
3188
|
"path": "docs/page-readings.json",
|
|
3189
3189
|
"mode": "0000644",
|
|
3190
|
-
"sha256": "
|
|
3190
|
+
"sha256": "9bad81941658f514d1ffddefb94730460019a873b7ce020c483ac5ff9e97033d"
|
|
3191
3191
|
},
|
|
3192
3192
|
{
|
|
3193
3193
|
"path": "docs/project-context.template.md",
|
|
@@ -5752,7 +5752,7 @@
|
|
|
5752
5752
|
{
|
|
5753
5753
|
"path": "modules/government/docket.js",
|
|
5754
5754
|
"mode": "0000644",
|
|
5755
|
-
"sha256": "
|
|
5755
|
+
"sha256": "7564af6d250c7ff7c65ded77d0ed2a0206f1b8432ad739fa4c2c8d18ecbf7eb5"
|
|
5756
5756
|
},
|
|
5757
5757
|
{
|
|
5758
5758
|
"path": "modules/government/genesis-close.js",
|
|
@@ -6467,7 +6467,7 @@
|
|
|
6467
6467
|
{
|
|
6468
6468
|
"path": "modules/hall-ui/public/city.js",
|
|
6469
6469
|
"mode": "0000644",
|
|
6470
|
-
"sha256": "
|
|
6470
|
+
"sha256": "e6548ec5dd612fb57470ddcb30e7e3d2e6a75b7a99dfdda7796e74e495d1cb39"
|
|
6471
6471
|
},
|
|
6472
6472
|
{
|
|
6473
6473
|
"path": "modules/hall-ui/public/city.states.json",
|
|
@@ -6797,7 +6797,7 @@
|
|
|
6797
6797
|
{
|
|
6798
6798
|
"path": "modules/hall-ui/public/gov-feeds.js",
|
|
6799
6799
|
"mode": "0000644",
|
|
6800
|
-
"sha256": "
|
|
6800
|
+
"sha256": "9f649943f6a1f0f9ef49a1c0c9f9735a058b9a457923657c8cf6e138090514ae"
|
|
6801
6801
|
},
|
|
6802
6802
|
{
|
|
6803
6803
|
"path": "modules/hall-ui/public/gov-living.js",
|
|
@@ -9007,7 +9007,7 @@
|
|
|
9007
9007
|
{
|
|
9008
9008
|
"path": "modules/lifecycle/routes/tasks.js",
|
|
9009
9009
|
"mode": "0000644",
|
|
9010
|
-
"sha256": "
|
|
9010
|
+
"sha256": "c65859b03ebe365305bfbb1bca01a2c00dee62c315ccadee86cab71205059877"
|
|
9011
9011
|
},
|
|
9012
9012
|
{
|
|
9013
9013
|
"path": "modules/lifecycle/routes/version-route-authz.js",
|
|
@@ -12527,12 +12527,12 @@
|
|
|
12527
12527
|
{
|
|
12528
12528
|
"path": "package-lock.json",
|
|
12529
12529
|
"mode": "0000644",
|
|
12530
|
-
"sha256": "
|
|
12530
|
+
"sha256": "3c05e149dbe2560e88a0ce725c11200db207896b03fbd076fa39dbf7a2f0e449"
|
|
12531
12531
|
},
|
|
12532
12532
|
{
|
|
12533
12533
|
"path": "package.json",
|
|
12534
12534
|
"mode": "0000644",
|
|
12535
|
-
"sha256": "
|
|
12535
|
+
"sha256": "406d3cd96f120c4ea1af0095d2984b8515cd35ecbdbc33fe8bb146664effd4e9"
|
|
12536
12536
|
},
|
|
12537
12537
|
{
|
|
12538
12538
|
"path": "public-docs/index.html",
|
|
@@ -12552,7 +12552,7 @@
|
|
|
12552
12552
|
{
|
|
12553
12553
|
"path": "release-notes.json",
|
|
12554
12554
|
"mode": "0000644",
|
|
12555
|
-
"sha256": "
|
|
12555
|
+
"sha256": "55cb954964b326e615ef6414613a588b45afa07fae13e3ec5a1c86ed4996a73c"
|
|
12556
12556
|
},
|
|
12557
12557
|
{
|
|
12558
12558
|
"path": "scripts/bongos/CLAUDE.md",
|
|
@@ -16632,7 +16632,7 @@
|
|
|
16632
16632
|
{
|
|
16633
16633
|
"path": "src/module-api.js",
|
|
16634
16634
|
"mode": "0000644",
|
|
16635
|
-
"sha256": "
|
|
16635
|
+
"sha256": "1c64492e39cb8231996c9ef045429afaa34a5bce20026b945f31791b3ab44034"
|
|
16636
16636
|
},
|
|
16637
16637
|
{
|
|
16638
16638
|
"path": "src/module-loader/catalog.js",
|
|
@@ -18389,6 +18389,11 @@
|
|
|
18389
18389
|
"mode": "0000644",
|
|
18390
18390
|
"sha256": "486def3d8e74ffb72eb9bd74a3d56ab3ceb80b4555a1e0f833a1065abd56bae1"
|
|
18391
18391
|
},
|
|
18392
|
+
{
|
|
18393
|
+
"path": "tests/docket_load_speed.mjs",
|
|
18394
|
+
"mode": "0000644",
|
|
18395
|
+
"sha256": "3ee853f04097933d6b504f09f9ec0d470773045731c07ccbf6535778bb3d5049"
|
|
18396
|
+
},
|
|
18392
18397
|
{
|
|
18393
18398
|
"path": "tests/docs_entropy.mjs",
|
|
18394
18399
|
"mode": "0000644",
|
|
@@ -19637,7 +19642,7 @@
|
|
|
19637
19642
|
{
|
|
19638
19643
|
"path": "tests/hall_city_living.mjs",
|
|
19639
19644
|
"mode": "0000644",
|
|
19640
|
-
"sha256": "
|
|
19645
|
+
"sha256": "f8cf1cd88077ff8887e7fbcac188de0f1fcd5a5ab3824b9b3044ca72bd939d18"
|
|
19641
19646
|
},
|
|
19642
19647
|
{
|
|
19643
19648
|
"path": "tests/hall_city_rewording.mjs",
|
|
@@ -19707,7 +19712,7 @@
|
|
|
19707
19712
|
{
|
|
19708
19713
|
"path": "tests/hall_gov_counts.mjs",
|
|
19709
19714
|
"mode": "0000644",
|
|
19710
|
-
"sha256": "
|
|
19715
|
+
"sha256": "12570b9e8cda2ea6a6be7ae00740a2512e957a1e78c1ff486d8d810e120e8f45"
|
|
19711
19716
|
},
|
|
19712
19717
|
{
|
|
19713
19718
|
"path": "tests/hall_gov_living.mjs",
|
|
@@ -19717,7 +19722,7 @@
|
|
|
19717
19722
|
{
|
|
19718
19723
|
"path": "tests/hall_gov_real_site.mjs",
|
|
19719
19724
|
"mode": "0000644",
|
|
19720
|
-
"sha256": "
|
|
19725
|
+
"sha256": "9979d651101341e00610a436a20e2348e61796a9863873ecf5e0dc5c71e5844c"
|
|
19721
19726
|
},
|
|
19722
19727
|
{
|
|
19723
19728
|
"path": "tests/hall_helm.mjs",
|
|
@@ -19947,12 +19952,12 @@
|
|
|
19947
19952
|
{
|
|
19948
19953
|
"path": "tests/hall_street_deck.mjs",
|
|
19949
19954
|
"mode": "0000644",
|
|
19950
|
-
"sha256": "
|
|
19955
|
+
"sha256": "43dcbabbd8d015e64f2e6707eb172e1823a266735c737efbdfd9caec06584119"
|
|
19951
19956
|
},
|
|
19952
19957
|
{
|
|
19953
19958
|
"path": "tests/hall_street_depth.mjs",
|
|
19954
19959
|
"mode": "0000644",
|
|
19955
|
-
"sha256": "
|
|
19960
|
+
"sha256": "2398740d2e8b05108441aa0639674d8b78272350317d1e702a95f5f68fb04e8d"
|
|
19956
19961
|
},
|
|
19957
19962
|
{
|
|
19958
19963
|
"path": "tests/hall_street_desk.mjs",
|
|
@@ -213,7 +213,7 @@ export interface GetStoreModulesLatestResponse { latest: unknown; withdrawn: unk
|
|
|
213
213
|
export interface GetStoreUsageReportingResponse { enabled: unknown }
|
|
214
214
|
export interface GetTaskRecommendationsForMeResponse { recommendations: unknown; count: unknown }
|
|
215
215
|
export interface GetTaskRecommendationsMineResponse { recommendations: unknown; count: unknown }
|
|
216
|
-
export interface GetTasksClaimableResponse {
|
|
216
|
+
export interface GetTasksClaimableResponse { active_claims?: unknown; by_goal?: unknown; claimable_total?: unknown; claimable?: unknown }
|
|
217
217
|
export interface GetTasksIdCriteriaResponse { criteria: unknown }
|
|
218
218
|
export interface GetTasksIdDependenciesResponse { dependencies: unknown; dependents: unknown }
|
|
219
219
|
export interface GetTasksIdRecommendationsResponse { recommendations: unknown; count: unknown }
|
package/docs/api/openapi.json
CHANGED
|
@@ -37110,14 +37110,11 @@
|
|
|
37110
37110
|
"GetTasksClaimableResponse": {
|
|
37111
37111
|
"type": "object",
|
|
37112
37112
|
"properties": {
|
|
37113
|
+
"active_claims": {},
|
|
37113
37114
|
"by_goal": {},
|
|
37114
37115
|
"claimable_total": {},
|
|
37115
|
-
"claimable": {}
|
|
37116
|
-
|
|
37117
|
-
},
|
|
37118
|
-
"required": [
|
|
37119
|
-
"claimable_total"
|
|
37120
|
-
]
|
|
37116
|
+
"claimable": {}
|
|
37117
|
+
}
|
|
37121
37118
|
},
|
|
37122
37119
|
"GetTasksIdCriteriaResponse": {
|
|
37123
37120
|
"type": "object",
|
|
@@ -3498,5 +3498,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
3498
3498
|
landed since 1.25.28 with no explicit bump. run 43600053549. (task 1002620)
|
|
3499
3499
|
1.25.30 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3500
3500
|
landed since 1.25.29 with no explicit bump. run 43601650862. (task 1002620)
|
|
3501
|
+
1.25.31 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3502
|
+
landed since 1.25.30 with no explicit bump. run 43602884082. (task 1002620)
|
|
3501
3503
|
---------------------------------------------------------------------------
|
|
3502
3504
|
```
|
package/docs/page-readings.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"adr": "0341 D3",
|
|
6
6
|
"reread": "node scripts/bongos/page-reader.js --stale",
|
|
7
7
|
"how": ["Generated by node scripts/bongos/page-reader.js (BV2.TW04, task 1004315; ADR 0341 D3). Do not hand-edit.","One entry per page of docs/page-inventory.json. Lines are in page order: the default state first, and a line only another state shows sits where that state shows it, with its state named.","placement: placed = a docs/copy-registry.json row renders it (file, line, string_id); shared = shell text every page of the surface carries (top bar, sidebar, footer), with its row when the registry has one; unplaced = the registry cannot place it (a rewrite becomes an engineer task, ADR 0341 D4).","text keeps {…} where the registry row has a hole, or where a value the page read from its API was filled in. A string that is only such data is counted under omitted.data, not listed.","reading_hash is over the non-shared lines (key, section, text); files_hash is over the page's inventory files. --check compares files_hash only and never opens a browser.","Rendered through the hall-preview harness (hall) and the ui-design kit stub (landing, status), at 1280x800 with the clock pinned, so a reading is the fixture world's page."],
|
|
8
|
-
"counts": {"pages":45,"lines":
|
|
8
|
+
"counts": {"pages":45,"lines":4394,"placed":1638,"shared":369,"unplaced":2387,"omitted_data":2926},
|
|
9
9
|
"pages": [
|
|
10
10
|
{
|
|
11
11
|
"id": "builders:ai-studio",
|
|
@@ -283,39 +283,38 @@
|
|
|
283
283
|
"surface": "builders",
|
|
284
284
|
"title": "The city",
|
|
285
285
|
"states_read": ["city","fullscreen","focus","pins","living","card","card-ask"],
|
|
286
|
-
"files_hash": "
|
|
287
|
-
"reading_hash": "
|
|
288
|
-
"counts": {"lines":
|
|
286
|
+
"files_hash": "b2f0e7c10bd64127",
|
|
287
|
+
"reading_hash": "277096d903879a57",
|
|
288
|
+
"counts": {"lines":26,"placed":9,"shared":6,"unplaced":11},
|
|
289
289
|
"omitted": {"data":7},
|
|
290
|
-
"notes": ["fullscreen: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","pins: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","living: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","card-ask:
|
|
290
|
+
"notes": ["fullscreen: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","pins: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","living: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","card: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","card-ask: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood"],
|
|
291
291
|
"lines": [
|
|
292
292
|
{"key":"L0001","section":"skip link","text":"Skip to content","placement":"shared","file":"modules/hall-ui/public/shell.js","line":824,"string_id":"87cee78ca134"},
|
|
293
293
|
{"key":"L0002","section":"top bar","text":"The city","placement":"shared","file":"modules/hall-ui/public/city.html","line":62,"string_id":"a335af65398d"},
|
|
294
|
-
{"key":"L0003","section":"top bar","text":"
|
|
295
|
-
{"key":"L0004","section":"top bar","text":"
|
|
296
|
-
{"key":"L0005","section":"top bar","text":"
|
|
297
|
-
{"key":"L0006","section":"top bar","text":"
|
|
298
|
-
{"key":"L0007","section":"top
|
|
299
|
-
{"key":"L0008","section":"page top","text":"
|
|
300
|
-
{"key":"L0009","section":"page top","text":"
|
|
301
|
-
{"key":"L0010","section":"page top","text":"
|
|
302
|
-
{"key":"L0011","section":"
|
|
303
|
-
{"key":"L0012","section":"37 to do · 5 {…} working","text":"
|
|
304
|
-
{"key":"L0013","section":"37 to do · 5 {…} working","text":"
|
|
305
|
-
{"key":"L0014","section":"37 to do · 5 {…} working","text":"
|
|
306
|
-
{"key":"L0015","section":"37 to do · 5 {…} working","text":"
|
|
307
|
-
{"key":"L0016","section":"
|
|
308
|
-
{"key":"L0017","section":"What are you doing now?","text":"
|
|
309
|
-
{"key":"L0018","section":"What are you doing now?","text":"
|
|
310
|
-
{"key":"L0019","section":"What are you doing now?","text":"
|
|
311
|
-
{"key":"L0020","section":"What are you doing now?","text":"
|
|
312
|
-
{"key":"L0021","section":"
|
|
313
|
-
{"key":"L0022","section":"Update the builders hall?","text":"
|
|
314
|
-
{"key":"L0023","section":"Update the builders hall?","text":"
|
|
315
|
-
{"key":"L0024","section":"Update the builders hall?","text":"{…}
|
|
316
|
-
{"key":"L0025","section":"Update the builders hall?","text":"
|
|
317
|
-
{"key":"L0026","section":"Update the builders hall?","text":"
|
|
318
|
-
{"key":"L0027","section":"Update the builders hall?","text":"Update now","placement":"placed","file":"modules/hall-ui/public/update-pill.js","line":288,"string_id":"5fe7d2d395be"}
|
|
294
|
+
{"key":"L0003","section":"top bar","text":"Update","placement":"shared"},
|
|
295
|
+
{"key":"L0004","section":"top bar","text":"Jump to…","placement":"shared","file":"modules/hall-ui/public/shell.js","line":536,"string_id":"eba610d25523"},
|
|
296
|
+
{"key":"L0005","section":"top bar","text":"Ctrl K","placement":"shared"},
|
|
297
|
+
{"key":"L0006","section":"top bar","text":"Artist","placement":"shared"},
|
|
298
|
+
{"key":"L0007","section":"page top","text":"law","placement":"unplaced"},
|
|
299
|
+
{"key":"L0008","section":"page top","text":"to do","placement":"unplaced"},
|
|
300
|
+
{"key":"L0009","section":"page top","text":"this month","placement":"unplaced"},
|
|
301
|
+
{"key":"L0010","section":"page top","text":"{…} 37 in a row","placement":"unplaced"},
|
|
302
|
+
{"key":"L0011","section":"37 to do · 5 {…} working","text":"37 to do · 5 {…} working","placement":"unplaced"},
|
|
303
|
+
{"key":"L0012","section":"37 to do · 5 {…} working","text":"Archived:","placement":"unplaced"},
|
|
304
|
+
{"key":"L0013","section":"37 to do · 5 {…} working","text":"Street","placement":"unplaced"},
|
|
305
|
+
{"key":"L0014","section":"37 to do · 5 {…} working","text":"Building Level Views","placement":"placed","file":"modules/hall-ui/public/city.html","line":110,"string_id":"5df2aa54f042"},
|
|
306
|
+
{"key":"L0015","section":"37 to do · 5 {…} working","text":"Builders hall · this session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":750,"string_id":"fd1903586e8e"},
|
|
307
|
+
{"key":"L0016","section":"What are you doing now?","text":"What are you doing now?","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":751,"string_id":"60853319f290"},
|
|
308
|
+
{"key":"L0017","section":"What are you doing now?","text":"Pick one. You can switch any time from the top bar.","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":752,"string_id":"4f87d5b17b54"},
|
|
309
|
+
{"key":"L0018","section":"What are you doing now?","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","occurrences":3},
|
|
310
|
+
{"key":"L0019","section":"What are you doing now?","text":"Artist","placement":"unplaced"},
|
|
311
|
+
{"key":"L0020","section":"What are you doing now?","text":"Ask me again next session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":755,"string_id":"fa86bf403775"},
|
|
312
|
+
{"key":"L0021","section":"Update the builders hall?","text":"Update the builders hall?","placement":"unplaced"},
|
|
313
|
+
{"key":"L0022","section":"Update the builders hall?","text":"A newer version of Bongos is ready, with the latest changes and bug fixes.","placement":"placed","file":"modules/hall-ui/public/update-pill.js","line":604,"string_id":"105876fd9038"},
|
|
314
|
+
{"key":"L0023","section":"Update the builders hall?","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","occurrences":3},
|
|
315
|
+
{"key":"L0024","section":"Update the builders hall?","text":"Closed a {…} hole where a {…}'s branch could choose the program the server runs while auto-resolving merge…","placement":"unplaced"},
|
|
316
|
+
{"key":"L0025","section":"Update the builders hall?","text":"Later","placement":"unplaced"},
|
|
317
|
+
{"key":"L0026","section":"Update the builders hall?","text":"Update now","placement":"placed","file":"modules/hall-ui/public/update-pill.js","line":288,"string_id":"5fe7d2d395be"}
|
|
319
318
|
]
|
|
320
319
|
},
|
|
321
320
|
{
|
|
@@ -2565,7 +2564,7 @@
|
|
|
2565
2564
|
"surface": "builders",
|
|
2566
2565
|
"title": "The street",
|
|
2567
2566
|
"states_read": ["street","fullscreen","card","focus","here","inside-rules","inside-disputes","inside-people","inside-planning","inside-automation","inside-review","inside-release","inside-treasury","floor","amend","district","desk","desk-facts","desk-quiet","desk-people-builders","desk-people-tier","desk-disputes","desk-automation-goals","desk-release-core","desk-rules","desk-rules-category","desk-planning-priorities","desk-planning-ideas","desk-planning-blockers","pins","pins-pager","living","deck","deck-treasury","sitting","object","voted","admission","settled","blocker","blocker-more","report","report-more","core","core-more","recheck","recheck-more","idea","idea-more","queue","queue-more","automation","automation-more"],
|
|
2568
|
-
"files_hash": "
|
|
2567
|
+
"files_hash": "473bdfece6517b8b",
|
|
2569
2568
|
"reading_hash": "84dc42e85d9e23a3",
|
|
2570
2569
|
"counts": {"lines":325,"placed":54,"shared":6,"unplaced":265},
|
|
2571
2570
|
"omitted": {"data":241},
|
|
@@ -631,6 +631,12 @@ async function attachAsks(matters, readAsks, timeoutMs) {
|
|
|
631
631
|
// task 1004705) and the docket says `routed: true`. null routes nothing.
|
|
632
632
|
async function buildDocket({ viewer, permissions, contributions = registeredContributions(), now = Date.now(), timeoutMs = SOURCE_TIMEOUT_MS, decisions = null, government = null, readAsks = null, readFlags = null, seats = null } = {}) {
|
|
633
633
|
const held = new Set(permissions || []);
|
|
634
|
+
// `decisions`, `government` and `seats` may arrive as promises (docketFor starts
|
|
635
|
+
// those reads alongside the sources, task 1005310); they are awaited once the
|
|
636
|
+
// sources have answered. The handler is attached here, before anything waits, so
|
|
637
|
+
// a failure is never an unhandled rejection while the sources are reading.
|
|
638
|
+
const governmentReads = Promise.all([decisions, government, seats]);
|
|
639
|
+
governmentReads.catch(() => {});
|
|
634
640
|
const ctx = Object.freeze({
|
|
635
641
|
builderId: String(viewer.id),
|
|
636
642
|
rank: viewer.rank || null,
|
|
@@ -681,8 +687,11 @@ async function buildDocket({ viewer, permissions, contributions = registeredCont
|
|
|
681
687
|
const order = declared.map((d) => d.source);
|
|
682
688
|
sourceStatus.sort((a, b) => order.indexOf(a.source) - order.indexOf(b.source));
|
|
683
689
|
matters.sort(compareMatters);
|
|
684
|
-
|
|
685
|
-
|
|
690
|
+
// Asks and reword flags are two independent reads on the same matters, each
|
|
691
|
+
// writing its own field: read together (task 1005310), alongside the
|
|
692
|
+
// government reads started above.
|
|
693
|
+
await Promise.all([attachAsks(matters, readAsks, timeoutMs), attachFlags(matters, readFlags, timeoutMs)]);
|
|
694
|
+
[decisions, government, seats] = await governmentReads;
|
|
686
695
|
// THE DIRECTION DESK (task 1004705): who each matter waits on, from real seats.
|
|
687
696
|
const yours = seats ? routing.routeAll(matters, ctx.builderId, seats, now) : null;
|
|
688
697
|
|
|
@@ -872,16 +881,38 @@ async function findMatterFor(builder, matterId) {
|
|
|
872
881
|
|
|
873
882
|
// The route's entry point: resolve the viewer's permissions server-side (fresh,
|
|
874
883
|
// uncached — ADR 0016), then build.
|
|
875
|
-
|
|
884
|
+
//
|
|
885
|
+
// ONE BUILD PER VIEWER AT A TIME (task 1005310). The street asks for the docket
|
|
886
|
+
// and for GET /government/counts in the same breath, and counts is built from
|
|
887
|
+
// this same docket, so every street load built it twice, side by side, and each
|
|
888
|
+
// slowed the other. A second ask for the SAME viewer that arrives while a build
|
|
889
|
+
// is running shares that build; the moment it finishes nothing is kept, so the
|
|
890
|
+
// next ask builds afresh. Nothing is cached: no answer is older than the request
|
|
891
|
+
// that receives it, and permissions are still resolved inside every build.
|
|
892
|
+
const building = new Map();
|
|
893
|
+
function docketFor(builder) {
|
|
894
|
+
const key = String(builder && builder.id);
|
|
895
|
+
const running = building.get(key);
|
|
896
|
+
if (running) return running;
|
|
897
|
+
const p = buildDocketFor(builder).finally(() => { building.delete(key); });
|
|
898
|
+
building.set(key, p);
|
|
899
|
+
return p;
|
|
900
|
+
}
|
|
901
|
+
async function buildDocketFor(builder) {
|
|
876
902
|
const permissions = await resolver.resolveBuilderPermissions(builder.id);
|
|
877
903
|
// The table is read per request, uncached (ADR 0016). A failed read leaves
|
|
878
904
|
// every building's decision null; it never fails the city.
|
|
879
|
-
|
|
905
|
+
// The government reads (decision rules → the government → its seats) run
|
|
906
|
+
// ALONGSIDE the sources (task 1005310): buildDocket waits for them only once
|
|
907
|
+
// its sources have answered. Every step below catches its own failure.
|
|
908
|
+
const decisions = board.decisionRulesView().catch((err) => {
|
|
880
909
|
log.warn({ err: err && err.message }, 'governor docket: decision rules unreadable');
|
|
881
910
|
return null;
|
|
882
911
|
});
|
|
883
|
-
const government = permissions.includes(GOVERNMENT_GATE.permission)
|
|
884
|
-
|
|
912
|
+
const government = permissions.includes(GOVERNMENT_GATE.permission)
|
|
913
|
+
? decisions.then((d) => loadGovernment({ decisions: d }))
|
|
914
|
+
: Promise.resolve(null);
|
|
915
|
+
const seats = government.then((g) => (g ? loadSeats(g) : null));
|
|
885
916
|
return buildDocket({ viewer: builder, permissions, decisions, government, readAsks: asksDb.asksFor, readFlags: asksDb.unclearFor, seats });
|
|
886
917
|
}
|
|
887
918
|
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
leads: '/api/bongos/government/leads',
|
|
57
57
|
// the pots each goal draws from, the reserve, the spend cap (task 1004712)
|
|
58
58
|
treasury: '/api/bongos/government/treasury',
|
|
59
|
-
claims: '/api/bongos/tasks/claimable?
|
|
59
|
+
claims: '/api/bongos/tasks/claimable?view=claims',
|
|
60
60
|
tasks: '/api/bongos/tasks?status=active&limit=200',
|
|
61
61
|
cost: '/api/bongos/public/cost-summary',
|
|
62
62
|
roster: '/api/bongos/builders/roster',
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
presets: '/government/presets',
|
|
43
43
|
goals: '/goals',
|
|
44
44
|
rollups: '/goals/rollups',
|
|
45
|
-
// the
|
|
46
|
-
claims: '/tasks/claimable?
|
|
45
|
+
// the open claims alone (?view=claims, task 1005310): the claimable feed is not built
|
|
46
|
+
claims: '/tasks/claimable?view=claims',
|
|
47
47
|
tasks: '/tasks?status=active&limit=200',
|
|
48
48
|
cost: '/public/cost-summary',
|
|
49
49
|
roster: '/builders/roster',
|
|
@@ -219,7 +219,7 @@ module.exports = function buildTasksRouter() {
|
|
|
219
219
|
// RETURNED feed, never the query — lifecycle/CLAUDE.md has the why.
|
|
220
220
|
const claimNeeds = parseNeedsFilter(req.query.needs); if (claimNeeds && claimNeeds.bad) return badNeedsFilter(res); // task 1004950
|
|
221
221
|
const claimLimit = posInt(req.query.limit, 'bad_limit', 1000);
|
|
222
|
-
if (claimLimit && claimLimit.bad) return res.fail('bad_limit', { status: 400, message: 'limit must be a positive integer (max 1000).' });
|
|
222
|
+
if (claimLimit && claimLimit.bad) return res.fail('bad_limit', { status: 400, message: 'limit must be a positive integer (max 1000).' }); if (req.query.view === 'claims') return res.json({ active_claims: await db.listActiveClaims() }); // open claims only, no claimable feed: the street needs just these (task 1005310)
|
|
223
223
|
const [feed, active] = await Promise.all([
|
|
224
224
|
db.listClaimableTasks({
|
|
225
225
|
versionId: version || null, builderId: req.builder.id,
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.25.
|
|
3
|
+
"version": "1.25.31",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.25.
|
|
9
|
+
"version": "1.25.31",
|
|
10
10
|
"license": "AGPL-3.0-or-later",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"express": "^4.21.2",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.25.
|
|
3
|
+
"version": "1.25.31",
|
|
4
4
|
"description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"main": "src/platform-server.js",
|
package/release-notes.json
CHANGED
|
@@ -11955,5 +11955,11 @@
|
|
|
11955
11955
|
"id": "1005307",
|
|
11956
11956
|
"text": "Choosing Patron in game mode no longer reloads the hall endlessly; it settles on the city."
|
|
11957
11957
|
}
|
|
11958
|
+
],
|
|
11959
|
+
"1.25.31": [
|
|
11960
|
+
{
|
|
11961
|
+
"id": "1005310",
|
|
11962
|
+
"text": "The governor's street asks the server for less and gets its answers sooner."
|
|
11963
|
+
}
|
|
11958
11964
|
]
|
|
11959
11965
|
}
|
package/src/module-api.js
CHANGED
|
@@ -81,7 +81,7 @@ const { sleep } = require('./sleep');
|
|
|
81
81
|
// MAJOR (see allowBoxScope below): passes the request through untouched.
|
|
82
82
|
function deprecatedNoopMiddleware(_req, _res, next) { next(); }
|
|
83
83
|
|
|
84
|
-
const CORE_VERSION = '1.25.
|
|
84
|
+
const CORE_VERSION = '1.25.31'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
85
85
|
|
|
86
86
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
87
87
|
// Usage: const log = api.logger('discord'); log.info('mounted');
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// tests/docket_load_speed.mjs — the governor's street loads faster (task 1005310).
|
|
2
|
+
//
|
|
3
|
+
// Measured on the live hub: the street asked for GET /government/docket and
|
|
4
|
+
// GET /government/counts together, counts rebuilt the same docket, and each build
|
|
5
|
+
// waited for the government reads before it even started its sources. Three
|
|
6
|
+
// properties now hold, and each is driven here against the real docket.js:
|
|
7
|
+
// 1. two asks for the SAME viewer while a build runs share that one build, and
|
|
8
|
+
// nothing is kept once it finishes (no cache: the next ask builds afresh);
|
|
9
|
+
// 2. the sources start reading before the government reads have answered;
|
|
10
|
+
// 3. a government read that fails is never an unhandled rejection while the
|
|
11
|
+
// sources are still reading, and the docket still answers or fails as before.
|
|
12
|
+
// And the street's claims read (GET /tasks/claimable?view=claims) answers only the
|
|
13
|
+
// open claims, without building the claimable feed.
|
|
14
|
+
import { strict as assert } from 'node:assert';
|
|
15
|
+
import { test, after } from 'node:test';
|
|
16
|
+
import fs from 'node:fs';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
import { createRequire } from 'node:module';
|
|
19
|
+
import { fileURLToPath } from 'node:url';
|
|
20
|
+
|
|
21
|
+
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
22
|
+
const require = createRequire(import.meta.url);
|
|
23
|
+
const api = require(path.join(ROOT, 'src', 'module-api.js'));
|
|
24
|
+
const docket = require(path.join(ROOT, 'modules', 'government', 'docket.js'));
|
|
25
|
+
const board = require(path.join(ROOT, 'modules', 'government', 'board.js'));
|
|
26
|
+
const resolver = require(path.join(ROOT, 'modules', 'government', 'resolver.js'));
|
|
27
|
+
const read = (p) => fs.readFileSync(path.join(ROOT, p), 'utf8');
|
|
28
|
+
|
|
29
|
+
const REAL = { perms: resolver.resolveBuilderPermissions, rules: board.decisionRulesView };
|
|
30
|
+
after(() => { resolver.resolveBuilderPermissions = REAL.perms; board.decisionRulesView = REAL.rules; });
|
|
31
|
+
|
|
32
|
+
const order = [];
|
|
33
|
+
let permReads = 0;
|
|
34
|
+
// The docket's own atom only: no government gate, so no government tables are read.
|
|
35
|
+
resolver.resolveBuilderPermissions = async () => { permReads += 1; return ['board.vote.cast']; };
|
|
36
|
+
board.decisionRulesView = () => new Promise((r) => setTimeout(() => { order.push('decisions'); r(null); }, 40));
|
|
37
|
+
api.contribute(docket.CONTRIBUTION_POINT, {
|
|
38
|
+
source: 'blockers', building: 'planning', gate: { anyBuilder: true },
|
|
39
|
+
read: async () => { order.push('source'); return []; },
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('two asks for one viewer while a build runs share it; the next ask builds afresh', async () => {
|
|
43
|
+
permReads = 0;
|
|
44
|
+
const viewer = { id: 7001, rank: 'metic' };
|
|
45
|
+
const [a, b] = await Promise.all([docket.docketFor(viewer), docket.docketFor({ ...viewer })]);
|
|
46
|
+
assert.equal(permReads, 1, 'one build for both asks');
|
|
47
|
+
assert.equal(a, b, 'both asks receive the same answer');
|
|
48
|
+
await docket.docketFor(viewer);
|
|
49
|
+
assert.equal(permReads, 2, 'a finished build is not kept: the next ask builds again');
|
|
50
|
+
await Promise.all([docket.docketFor({ id: 7002 }), docket.docketFor({ id: 7003 })]);
|
|
51
|
+
assert.equal(permReads, 4, 'different viewers never share a build');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test('the sources start reading before the government reads answer', async () => {
|
|
55
|
+
order.length = 0;
|
|
56
|
+
await docket.docketFor({ id: 7004, rank: 'metic' });
|
|
57
|
+
assert.deepEqual(order, ['source', 'decisions']);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const VIEWER = { id: 42, rank: 'metic' };
|
|
61
|
+
const NOW = Date.parse('2026-11-14T12:00:00Z');
|
|
62
|
+
const slowSource = (ms) => ({
|
|
63
|
+
sources: new Map([['blockers', { source: 'blockers', building: 'planning', gate: { anyBuilder: true },
|
|
64
|
+
read: () => new Promise((r) => setTimeout(() => r([{ id: 1, title: 'Pick a host', state: 'needs', rule: 'decide' }]), ms)) }]]),
|
|
65
|
+
readings: new Map(), floors: new Map(), histories: new Map(), desks: new Map(),
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('a government read handed in as a promise answers exactly as its value does', async () => {
|
|
69
|
+
const plain = await docket.buildDocket({ viewer: VIEWER, permissions: ['board.vote.cast'], contributions: slowSource(1), now: NOW, decisions: [], government: null, seats: null });
|
|
70
|
+
const later = await docket.buildDocket({ viewer: VIEWER, permissions: ['board.vote.cast'], contributions: slowSource(1), now: NOW,
|
|
71
|
+
decisions: Promise.resolve([]), government: Promise.resolve(null), seats: Promise.resolve(null) });
|
|
72
|
+
assert.deepEqual(later, plain);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test('a failed government read is never an unhandled rejection while the sources read', async () => {
|
|
76
|
+
const unhandled = [];
|
|
77
|
+
const onUnhandled = (e) => unhandled.push(e);
|
|
78
|
+
process.on('unhandledRejection', onUnhandled);
|
|
79
|
+
try {
|
|
80
|
+
const boom = new Error('government unreadable');
|
|
81
|
+
await assert.rejects(docket.buildDocket({ viewer: VIEWER, permissions: ['board.vote.cast'], contributions: slowSource(30), now: NOW,
|
|
82
|
+
decisions: Promise.resolve(null), government: Promise.reject(boom), seats: Promise.resolve(null) }), /government unreadable/);
|
|
83
|
+
await new Promise((r) => setTimeout(r, 20));
|
|
84
|
+
assert.deepEqual(unhandled, []);
|
|
85
|
+
} finally {
|
|
86
|
+
process.off('unhandledRejection', onUnhandled);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test('the claims read answers the open claims without building the claimable feed', () => {
|
|
91
|
+
const src = read('modules/lifecycle/routes/tasks.js');
|
|
92
|
+
const at = src.indexOf("req.query.view === 'claims'");
|
|
93
|
+
assert.ok(at > 0, 'GET /tasks/claimable has a claims-only view');
|
|
94
|
+
assert.ok(at < src.indexOf('db.listClaimableTasks({', at - 2000), 'it answers before the claimable feed is built');
|
|
95
|
+
assert.match(src.slice(at, at + 200), /active_claims: await db\.listActiveClaims\(\)/);
|
|
96
|
+
for (const f of ['modules/hall-ui/public/gov-feeds.js', 'modules/hall-ui/public/city.js']) {
|
|
97
|
+
assert.match(read(f), /tasks\/claimable\?view=claims/, `${f} asks for the claims alone`);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
@@ -488,7 +488,7 @@ async function bootLiving({ asks = false, answer = null } = {}) {
|
|
|
488
488
|
const feeds = {
|
|
489
489
|
'/api/bongos/government/docket': asks ? withAsks(docketRouted()) : docketRouted(), '/api/bongos/goals': fx('goals'), '/api/bongos/goals/rollups': fx('goals__rollups'),
|
|
490
490
|
'/api/bongos/government/leads': leadsRead(), '/api/bongos/government/treasury': fx('government__treasury'),
|
|
491
|
-
'/api/bongos/government/constitution': fx('government__constitution'), '/api/bongos/tasks/claimable?
|
|
491
|
+
'/api/bongos/government/constitution': fx('government__constitution'), '/api/bongos/tasks/claimable?view=claims': fx('tasks__claimable'),
|
|
492
492
|
'/api/bongos/tasks?status=active&limit=200': fx('tasks__status-active'), '/api/bongos/public/cost-summary': fx('public__cost-summary'),
|
|
493
493
|
'/api/bongos/builders/roster': fx('builders__roster'), '/api/bongos/me': fx('me'), '/api/bongos/blockers?limit=100': fx('blockers'),
|
|
494
494
|
'/api/bongos/autonomy/fence': fx('autonomy__fence'), '/api/bongos/moving': fx('moving'),
|
|
@@ -172,7 +172,7 @@ test('in the harness COUNT_FEEDS, with the docket the page already read, give th
|
|
|
172
172
|
assert.equal(L.countsOf(m, s).on_others, L.countsOf(m).on_others - 1);
|
|
173
173
|
// and nothing the shell reads is a task list
|
|
174
174
|
assert.ok(!F.COUNT_FEEDS.includes('tasks') && !F.COUNT_FEEDS.includes('goals'), 'the tally reads no task or goal list');
|
|
175
|
-
assert.match(F.FEEDS.claims, /
|
|
175
|
+
assert.match(F.FEEDS.claims, /[?&]view=claims\b/, 'the claims ride the claims-only view of the claimable route (task 1005310)');
|
|
176
176
|
});
|
|
177
177
|
|
|
178
178
|
// ── 3. every surface prints the same numbers ────────────────────────────────
|
|
@@ -197,7 +197,7 @@ const FEED = {
|
|
|
197
197
|
'/api/bongos/government/docket': 'government__docket', '/api/bongos/government/counts': 'government__counts', '/api/bongos/goals': 'goals', '/api/bongos/goals/rollups': 'goals__rollups',
|
|
198
198
|
'/api/bongos/me': 'me', '/api/bongos/builders/roster': 'builders__roster', '/api/bongos/blockers': 'blockers',
|
|
199
199
|
'/api/bongos/public/cost-summary': 'public__cost-summary', '/api/bongos/tasks/claimable': 'tasks__claimable',
|
|
200
|
-
'/api/bongos/tasks/claimable?
|
|
200
|
+
'/api/bongos/tasks/claimable?view=claims': 'tasks__claimable', '/api/bongos/tasks?status=active&limit=200': 'tasks__status-active',
|
|
201
201
|
'/api/bongos/blockers?limit=100': 'blockers', '/api/bongos/moving': 'moving', '/api/bongos/autonomy/fence': 'autonomy__fence',
|
|
202
202
|
'/api/bongos/government/constitution': 'government__constitution',
|
|
203
203
|
// the hub's law book, as the route answers it (no law passed yet)
|
|
@@ -411,7 +411,7 @@ const FEED = {
|
|
|
411
411
|
'/api/bongos/me': 'me', '/api/bongos/builders/roster': 'builders__roster',
|
|
412
412
|
'/api/bongos/blockers': 'blockers', '/api/bongos/public/cost-summary': 'public__cost-summary',
|
|
413
413
|
// the living model's reads, as gov-feeds.js names them (one read each per page)
|
|
414
|
-
'/api/bongos/tasks/claimable?
|
|
414
|
+
'/api/bongos/tasks/claimable?view=claims': 'tasks__claimable', '/api/bongos/tasks?status=active&limit=200': 'tasks__status-active',
|
|
415
415
|
'/api/bongos/blockers?limit=100': 'blockers', '/api/bongos/moving': 'moving', '/api/bongos/autonomy/fence': 'autonomy__fence',
|
|
416
416
|
'/api/bongos/government/constitution': 'government__constitution', '/api/bongos/government/leads': 'government__leads',
|
|
417
417
|
};
|
|
@@ -471,7 +471,7 @@ async function bootPage({ withLiving = true } = {}) {
|
|
|
471
471
|
const F = {
|
|
472
472
|
'/api/bongos/government/docket': docketRouted(), '/api/bongos/goals': fx('goals'), '/api/bongos/goals/rollups': fx('goals__rollups'),
|
|
473
473
|
'/api/bongos/government/leads': leadsRead(),
|
|
474
|
-
'/api/bongos/tasks/claimable?
|
|
474
|
+
'/api/bongos/tasks/claimable?view=claims': fx('tasks__claimable'), '/api/bongos/tasks?status=active': fx('tasks__status-active'),
|
|
475
475
|
'/api/bongos/public/cost-summary': fx('public__cost-summary'), '/api/bongos/builders/roster': fx('builders__roster'), '/api/bongos/me': fx('me'),
|
|
476
476
|
// the living model's reads, as gov-feeds.js names them
|
|
477
477
|
'/api/bongos/tasks?status=active&limit=200': fx('tasks__status-active'), '/api/bongos/blockers?limit=100': fx('blockers'),
|
|
@@ -493,7 +493,7 @@ test('the page draws the living street: the skyline, a pod per claim, the plates
|
|
|
493
493
|
const p = await bootPage();
|
|
494
494
|
const all = (id) => walk(p.byId.get(id));
|
|
495
495
|
const cls = (id, c) => all(id).filter((e) => (e.className || '').split(' ').includes(c));
|
|
496
|
-
for (const u of ['/api/bongos/tasks/claimable?
|
|
496
|
+
for (const u of ['/api/bongos/tasks/claimable?view=claims', '/api/bongos/government/leads']) assert.ok(p.calls.includes(u), u);
|
|
497
497
|
assert.ok(!p.calls.some((u) => /governor-overlay/.test(u)), 'no overlay is read');
|
|
498
498
|
assert.equal(p.calls.filter((u) => u === '/api/bongos/me').length, 1, 'the living feeds are read once');
|
|
499
499
|
assert.equal(cls('streetDepthNear', 'street-depth-sil__face').length, 1);
|