@bongos/core 1.24.29 → 1.24.30

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 (39) hide show
  1. package/.bongos-core.json +78 -38
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +4 -0
  4. package/clients/bongos-client/index.cjs +4 -0
  5. package/clients/bongos-client/index.d.ts +4 -0
  6. package/clients/bongos-client/index.mjs +4 -0
  7. package/docs/api/openapi.json +36 -1
  8. package/docs/api-reference.md +7 -1
  9. package/docs/copy-inventory.md +86 -89
  10. package/docs/copy-registry.json +137 -175
  11. package/docs/module-api-changelog.md +2 -0
  12. package/docs/page-inventory.json +3 -2
  13. package/docs/page-readings.json +89 -107
  14. package/modules/government/db.js +29 -0
  15. package/modules/government/docket.js +61 -4
  16. package/modules/government/routes/government.js +2 -0
  17. package/modules/hall-ui/public/builders.js +3 -79
  18. package/modules/hall-ui/public/hall-render.js +6 -81
  19. package/modules/hall-ui/public/hall-widgets.js +4 -45
  20. package/modules/hall-ui/public/home-city-draw.js +275 -0
  21. package/modules/hall-ui/public/home-city.css +66 -0
  22. package/modules/hall-ui/public/home-city.js +223 -0
  23. package/modules/hall-ui/public/index.html +5 -6
  24. package/modules/hall-ui/public/index.states.json +73 -8
  25. package/modules/hall-ui/records/home-city.md +66 -0
  26. package/modules/lifecycle/home-city.js +340 -0
  27. package/modules/lifecycle/module.json +1 -0
  28. package/modules/lifecycle/routes/home-city.js +29 -0
  29. package/package-lock.json +2 -2
  30. package/package.json +1 -1
  31. package/release-notes.json +10 -0
  32. package/src/module-api.js +1 -1
  33. package/tests/claim_from_task_and_home.mjs +8 -43
  34. package/tests/hall_board_world.mjs +10 -12
  35. package/tests/hall_home_ships_bounded.mjs +4 -3
  36. package/tests/home_bounded_reads.mjs +16 -31
  37. package/tests/home_city.mjs +385 -0
  38. package/tests/home_city_widget.mjs +120 -0
  39. package/tests/leaderboard_roles.mjs +3 -2
@@ -3314,5 +3314,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
3314
3314
  landed since 1.24.27 with no explicit bump. run 41744557940. (task 1002620)
3315
3315
  1.24.29 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3316
3316
  landed since 1.24.28 with no explicit bump. run 41749478213. (task 1002620)
3317
+ 1.24.30 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3318
+ landed since 1.24.29 with no explicit bump. run 41816394820. (task 1002620)
3317
3319
  ---------------------------------------------------------------------------
3318
3320
  ```
@@ -641,6 +641,7 @@
641
641
  "modules/hall-ui/public/style.css",
642
642
  "modules/hall-ui/public/welcome-boot.css",
643
643
  "modules/hall-ui/public/hall-ask.css",
644
+ "modules/hall-ui/public/home-city.css",
644
645
  "modules/hall-ui/public/dom-utils.js",
645
646
  "modules/hall-ui/public/task-detail.js",
646
647
  "modules/hall-ui/public/brand-apply.js",
@@ -654,13 +655,13 @@
654
655
  "modules/hall-ui/public/founding-mark.js",
655
656
  "modules/hall-ui/public/hall-widgets.js",
656
657
  "modules/hall-ui/public/genesis-home.js",
657
- "modules/hall-ui/public/goals.js",
658
+ "modules/hall-ui/public/home-city-draw.js",
659
+ "modules/hall-ui/public/home-city.js",
658
660
  "modules/hall-ui/public/hall-ask.js",
659
661
  "modules/hall-ui/public/blockers-lib.js",
660
662
  "modules/hall-ui/public/goal-inbox.js",
661
663
  "modules/hall-ui/public/hall-render.js",
662
664
  "modules/hall-ui/public/profile-nudge.js",
663
- "modules/hall-ui/public/claim-action.js",
664
665
  "modules/hall-ui/public/builders.js",
665
666
  "modules/hall-ui/public/vote-control.js",
666
667
  "modules/hall-ui/public/copy-on-click.js"
@@ -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":52,"lines":5690,"placed":1764,"shared":500,"unplaced":3426,"omitted_data":3853},
8
+ "counts": {"pages":52,"lines":5672,"placed":1755,"shared":500,"unplaced":3417,"omitted_data":3839},
9
9
  "pages": [
10
10
  {
11
11
  "id": "builders:ai-studio",
@@ -1553,10 +1553,10 @@
1553
1553
  "surface": "builders",
1554
1554
  "title": "Builders' Hall",
1555
1555
  "states_read": ["home","standing","standing-karma","out","founding","genesis","decide","demo"],
1556
- "files_hash": "4bc5eebb7ffd69cf",
1557
- "reading_hash": "6ebceea080f7aeac",
1558
- "counts": {"lines":114,"placed":57,"shared":11,"unplaced":46},
1559
- "omitted": {"data":104},
1556
+ "files_hash": "8be65d46c21e667b",
1557
+ "reading_hash": "3a91ae47851292f2",
1558
+ "counts": {"lines":96,"placed":48,"shared":11,"unplaced":37},
1559
+ "omitted": {"data":90},
1560
1560
  "notes": ["founding: an action failed (page.focus: Timeout 6000ms exceeded.); read as it stood"],
1561
1561
  "lines": [
1562
1562
  {"key":"L0001","section":"skip link","text":"Skip to content","placement":"shared","file":"modules/hall-ui/public/shell.js","line":833,"string_id":"87cee78ca134"},
@@ -1571,108 +1571,90 @@
1571
1571
  {"key":"L0010","section":"top bar","text":"Ideating","placement":"shared"},
1572
1572
  {"key":"L0011","section":"Good morning, {…}","text":"Good morning, {…}","placement":"unplaced","occurrences":2},
1573
1573
  {"key":"L0012","section":"Good morning, {…}","text":"Work","placement":"unplaced","state":"standing"},
1574
- {"key":"L0013","section":"Good morning, {…}","text":"Credits","placement":"unplaced"},
1575
- {"key":"L0014","section":"Good morning, {…}","text":"Shipped","placement":"placed","file":"modules/hall-ui/public/task.js","line":718,"string_id":"0c0a50ba1666"},
1576
- {"key":"L0015","section":"Good morning, {…}","text":"Karma","placement":"unplaced"},
1577
- {"key":"L0016","section":"Good morning, {…}","text":"Achievements","placement":"unplaced","state":"standing"},
1578
- {"key":"L0017","section":"Good morning, {…}","text":"+11 in 30d","placement":"unplaced"},
1579
- {"key":"L0018","section":"Good morning, {…}","text":"Rank","placement":"unplaced"},
1580
- {"key":"L0019","section":"Good morning, {…}","text":"Member since {…}","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":565,"string_id":"df335a1224ae","state":"standing"},
1581
- {"key":"L0020","section":"Good morning, {…}","text":"+11 karma in 30d","placement":"unplaced","state":"standing"},
1582
- {"key":"L0021","section":"Good morning, {…}","text":"Preferred work:","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":577,"string_id":"ed8edd684547","state":"standing"},
1583
- {"key":"L0022","section":"Good morning, {…}","text":"{…}, {…}, {…}, ui","placement":"unplaced","state":"standing"},
1584
- {"key":"L0023","section":"Good morning, {…}","text":"Change in Settings →","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":577,"string_id":"0279db21e29a","state":"standing"},
1585
- {"key":"L0024","section":"Good morning, {…}","text":"karma","placement":"unplaced","state":"standing"},
1586
- {"key":"L0025","section":"Good morning, {…}","text":"{…}% complete","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":741,"string_id":"7609b97aec22"},
1587
- {"key":"L0026","section":"Goals","text":"Goals","placement":"unplaced"},
1588
- {"key":"L0027","section":"Goals","text":"You haven’t joined any open goals.","placement":"placed","file":"modules/hall-ui/public/goals.js","line":100,"string_id":"044387a6f90c"},
1589
- {"key":"L0028","section":"Goals","text":"Browse goals →","placement":"placed","file":"modules/hall-ui/public/goals.js","line":100,"string_id":"da910fee01d7"},
1590
- {"key":"L0029","section":"Needs your attention13","text":"Needs your attention","placement":"placed","file":"modules/hall-ui/public/goal-inbox.js","line":580,"string_id":"7def635421ea"},
1591
- {"key":"L0030","section":"Needs your attention13","text":"From the system","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":714,"string_id":"d32c5e058d1e"},
1592
- {"key":"L0031","section":"Needs your attention13","text":"Ideas awaiting triage","placement":"placed","file":"modules/hall-ui/public/builders.js","line":844,"string_id":"e181637c5a5e"},
1593
- {"key":"L0032","section":"Needs your attention13","text":"Requires project {…} fix","placement":"unplaced"},
1594
- {"key":"L0033","section":"Your work","text":"Your work","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":105,"string_id":"60550f388cc9"},
1595
- {"key":"L0034","section":"Your work","text":"Window","placement":"unplaced","state":"standing"},
1596
- {"key":"L0035","section":"Your work","text":"Last 7 days","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":170,"string_id":"9be8b839eff8","state":"standing"},
1597
- {"key":"L0036","section":"Your work","text":"Last 30 days","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":170,"string_id":"35a15eb0a117","state":"standing"},
1598
- {"key":"L0037","section":"Your work","text":"Last 90 days","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":171,"string_id":"59f0bc78a28f","state":"standing"},
1599
- {"key":"L0038","section":"Your work","text":"All time","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":171,"string_id":"627c683a5e5d","state":"standing"},
1600
- {"key":"L0039","section":"Your work","text":"Version","placement":"unplaced","state":"standing"},
1601
- {"key":"L0040","section":"Your work","text":"— any —","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":173,"string_id":"729d4ce22b99","state":"standing"},
1602
- {"key":"L0041","section":"Your work","text":"Sort","placement":"unplaced","state":"standing"},
1603
- {"key":"L0042","section":"Your work","text":"most recent first","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":175,"string_id":"70c234985d42","state":"standing"},
1604
- {"key":"L0043","section":"Your work","text":"oldest first","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":175,"string_id":"759c12b5f983","state":"standing"},
1605
- {"key":"L0044","section":"Your work","text":"highest credits","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":176,"string_id":"55d673a5f0ec","state":"standing"},
1606
- {"key":"L0045","section":"Your work","text":"lowest credits","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":177,"string_id":"754bdec368ed","state":"standing"},
1607
- {"key":"L0046","section":"Your work","text":"30 works {…}","placement":"unplaced","state":"standing"},
1608
- {"key":"L0047","section":"Your work","text":"Work","placement":"unplaced","state":"standing"},
1609
- {"key":"L0048","section":"Your work","text":"Credits","placement":"unplaced","state":"standing"},
1610
- {"key":"L0049","section":"Your work","text":"Shipped","placement":"placed","file":"modules/hall-ui/public/task.js","line":718,"string_id":"0c0a50ba1666","state":"standing"},
1611
- {"key":"L0050","section":"Your work","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","state":"standing","occurrences":10},
1612
- {"key":"L0051","section":"Your work","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","state":"standing","occurrences":2},
1613
- {"key":"L0052","section":"Your work","text":"Per page","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":72,"string_id":"4a46b478edaf","state":"standing"},
1614
- {"key":"L0053","section":"Your work","text":"‹ Prev","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":72,"string_id":"de8fa5223aee","state":"standing"},
1615
- {"key":"L0054","section":"Your work","text":"Page {…} of {…}","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":110,"string_id":"15a49bf15007","state":"standing"},
1616
- {"key":"L0055","section":"Your work","text":"Next ›","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":72,"string_id":"f52ba261d930","state":"standing"},
1617
- {"key":"L0056","section":"Reviews","text":"Reviews","placement":"unplaced","state":"standing"},
1618
- {"key":"L0057","section":"Reviews","text":"Work","placement":"unplaced","state":"standing"},
1619
- {"key":"L0058","section":"Reviews","text":"Score","placement":"unplaced","state":"standing"},
1620
- {"key":"L0059","section":"Reviews","text":"Verdict","placement":"unplaced","state":"standing"},
1621
- {"key":"L0060","section":"Reviews","text":"Reviewed","placement":"unplaced","state":"standing"},
1622
- {"key":"L0061","section":"Reviews","text":"passed","placement":"placed","file":"modules/hall-ui/public/government.js","line":671,"string_id":"da5368d10f85","state":"standing","occurrences":5},
1623
- {"key":"L0062","section":"Reviews","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","state":"standing","occurrences":2},
1624
- {"key":"L0063","section":"Reviews","text":"Last 14 days: {…} / 10 average across {…} graded work{…} ({…} passed).","placement":"placed","file":"modules/hall-ui/public/builders.js","line":572,"string_id":"81f62e066dbf","state":"standing"},
1625
- {"key":"L0064","section":"Karma","text":"Karma","placement":"unplaced","state":"standing"},
1626
- {"key":"L0065","section":"Karma","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","state":"standing"},
1627
- {"key":"L0066","section":"Karma","text":"When","placement":"unplaced","state":"standing"},
1628
- {"key":"L0067","section":"Karma","text":"Delta","placement":"unplaced","state":"standing"},
1629
- {"key":"L0068","section":"Karma","text":"Reason","placement":"unplaced","state":"standing"},
1630
- {"key":"L0069","section":"Karma","text":"Granted by","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":203,"string_id":"721fe281f993","state":"standing"},
1631
- {"key":"L0070","section":"Karma","text":"— all builders —","placement":"placed","file":"modules/hall-ui/public/builders.js","line":698,"string_id":"a6ae9cbdee30","state":"standing","occurrences":10},
1632
- {"key":"L0071","section":"Peer recognition","text":"Peer recognition","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":209,"string_id":"54fa47e421a5","state":"standing"},
1633
- {"key":"L0072","section":"Peer recognition","text":"Vote on others’ finished work. A vote counts toward their karma after a week.","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":210,"string_id":"2a982c1af5df","state":"standing"},
1634
- {"key":"L0073","section":"Peer recognition","text":"Work","placement":"unplaced","state":"standing"},
1635
- {"key":"L0074","section":"Peer recognition","text":"By","placement":"unplaced","state":"standing"},
1636
- {"key":"L0075","section":"Peer recognition","text":"Votes","placement":"unplaced","state":"standing"},
1637
- {"key":"L0076","section":"Peer recognition","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","state":"standing","occurrences":6},
1638
- {"key":"L0077","section":"Peer recognition","text":"Goal {…}","placement":"placed","file":"modules/hall-ui/public/gate.js","line":194,"string_id":"ec88b946ad16","state":"standing"},
1639
- {"key":"L0078","section":"Peer recognition","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","state":"standing"},
1640
- {"key":"L0079","section":"Peer recognition","text":"Per page","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":72,"string_id":"4a46b478edaf","state":"standing"},
1641
- {"key":"L0080","section":"Peer recognition","text":"‹ Prev","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":72,"string_id":"de8fa5223aee","state":"standing"},
1642
- {"key":"L0081","section":"Peer recognition","text":"Page {…} of {…}","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":110,"string_id":"15a49bf15007","state":"standing"},
1643
- {"key":"L0082","section":"Peer recognition","text":"Next ›","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":72,"string_id":"f52ba261d930","state":"standing"},
1644
- {"key":"L0083","section":"Achievements","text":"Achievements","placement":"unplaced","state":"standing"},
1645
- {"key":"L0084","section":"Achievements","text":"Earned ones are lit; the rest show what is left.","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":238,"string_id":"f025c58dbf0a","state":"standing"},
1646
- {"key":"L0085","section":"Achievements","text":"Won {…}","placement":"placed","file":"modules/hall-ui/public/builders.js","line":481,"string_id":"c5fd76a9e03d","state":"standing","occurrences":10},
1647
- {"key":"L0086","section":"Achievements","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","state":"standing"},
1648
- {"key":"L0087","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":520,"string_id":"1883ad7f07fc","state":"standing","occurrences":2},
1649
- {"key":"L0088","section":"Achievements","text":"core 1.24.27","placement":"unplaced","state":"standing"},
1650
- {"key":"L0089","section":"Achievements","text":"Skip","placement":"unplaced","state":"standing"},
1651
- {"key":"L0090","section":"Achievements","text":"Built on","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":179,"string_id":"fef59346ffee","state":"standing"},
1652
- {"key":"L0091","section":"Achievements","text":"cloudbongos.com","placement":"unplaced","state":"standing"},
1653
- {"key":"L0092","section":"Next up — ready to claim","text":"Next up — ready to claim","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":110,"string_id":"659d8256139c"},
1654
- {"key":"L0093","section":"Next up — ready to claim","text":"#1003412 · ~60m · 51 {…} est.","placement":"unplaced"},
1655
- {"key":"L0094","section":"Next up — ready to claim","text":"Claim","placement":"unplaced","occurrences":5},
1656
- {"key":"L0095","section":"Next up — ready to claim","text":"#1004380 · 38 {…} est.","placement":"unplaced"},
1657
- {"key":"L0096","section":"Next up — ready to claim","text":"#1004382 · 38 {…} est.","placement":"unplaced"},
1658
- {"key":"L0097","section":"Next up — ready to claim","text":"#1004383 · 38 {…} est.","placement":"unplaced"},
1659
- {"key":"L0098","section":"Next up — ready to claim","text":"#1004546 · 38 {…} est.","placement":"unplaced"},
1660
- {"key":"L0099","section":"Next up — ready to claim","text":"See all 150 {…} work →","placement":"unplaced"},
1661
- {"key":"L0100","section":"Recently shipped","text":"Recently shipped","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":115,"string_id":"0b2d1327608f"},
1662
- {"key":"L0101","section":"Recently shipped","text":"Work","placement":"unplaced"},
1663
- {"key":"L0102","section":"Recently shipped","text":"Credits","placement":"unplaced"},
1664
- {"key":"L0103","section":"Recently shipped","text":"Shipped","placement":"placed","file":"modules/hall-ui/public/task.js","line":718,"string_id":"0c0a50ba1666"},
1665
- {"key":"L0104","section":"Recently shipped","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","occurrences":2},
1666
- {"key":"L0105","section":"Recently shipped","text":"All your work →","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":118,"string_id":"b38c01691857"},
1667
- {"key":"L0106","section":"Recently shipped","text":"core 1.24.27","placement":"unplaced"},
1668
- {"key":"L0107","section":"Recently shipped","text":"Skip","placement":"unplaced"},
1669
- {"key":"L0108","section":"Recently shipped","text":"Built on","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":179,"string_id":"fef59346ffee"},
1670
- {"key":"L0109","section":"Recently shipped","text":"cloudbongos.com","placement":"unplaced"},
1671
- {"key":"L0110","section":"Good morning, {…}","text":"Where do you want to start the day?","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":184,"string_id":"0ec8d133f878","state":"founding"},
1672
- {"key":"L0111","section":"Good morning, {…}","text":"Start with your role","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":186,"string_id":"58cef7963b6c","state":"founding"},
1673
- {"key":"L0112","section":"Good morning, {…}","text":"Pick today’s craft and go straight to its room.","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":186,"string_id":"100e4665514d","state":"founding"},
1674
- {"key":"L0113","section":"Good morning, {…}","text":"Your home page","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":187,"string_id":"2e6866532113","state":"founding"},
1675
- {"key":"L0114","section":"Good morning, {…}","text":"Your work, what needs you, and what shipped.","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":187,"string_id":"e8d92c773db0","state":"founding"}
1574
+ {"key":"L0013","section":"Good morning, {…}","text":"Karma","placement":"unplaced","state":"standing"},
1575
+ {"key":"L0014","section":"Good morning, {…}","text":"Achievements","placement":"unplaced","state":"standing"},
1576
+ {"key":"L0015","section":"Good morning, {…}","text":"Member since {…}","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":565,"string_id":"df335a1224ae","state":"standing"},
1577
+ {"key":"L0016","section":"Good morning, {…}","text":"+11 karma in 30d","placement":"unplaced","state":"standing"},
1578
+ {"key":"L0017","section":"Good morning, {…}","text":"Preferred work:","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":577,"string_id":"ed8edd684547","state":"standing"},
1579
+ {"key":"L0018","section":"Good morning, {…}","text":"{…}, {…}, {…}, ui","placement":"unplaced","state":"standing"},
1580
+ {"key":"L0019","section":"Good morning, {…}","text":"Change in Settings →","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":577,"string_id":"0279db21e29a","state":"standing"},
1581
+ {"key":"L0020","section":"Good morning, {…}","text":"karma","placement":"unplaced","state":"standing"},
1582
+ {"key":"L0021","section":"Your work","text":"Your work","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":126,"string_id":"60550f388cc9","state":"standing"},
1583
+ {"key":"L0022","section":"Your work","text":"Window","placement":"unplaced","state":"standing"},
1584
+ {"key":"L0023","section":"Your work","text":"Last 7 days","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":129,"string_id":"9be8b839eff8","state":"standing"},
1585
+ {"key":"L0024","section":"Your work","text":"Last 30 days","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":129,"string_id":"35a15eb0a117","state":"standing"},
1586
+ {"key":"L0025","section":"Your work","text":"Last 90 days","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":130,"string_id":"59f0bc78a28f","state":"standing"},
1587
+ {"key":"L0026","section":"Your work","text":"All time","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":130,"string_id":"627c683a5e5d","state":"standing"},
1588
+ {"key":"L0027","section":"Your work","text":"Version","placement":"unplaced","state":"standing"},
1589
+ {"key":"L0028","section":"Your work","text":"— any —","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":132,"string_id":"729d4ce22b99","state":"standing"},
1590
+ {"key":"L0029","section":"Your work","text":"Sort","placement":"unplaced","state":"standing"},
1591
+ {"key":"L0030","section":"Your work","text":"most recent first","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":134,"string_id":"70c234985d42","state":"standing"},
1592
+ {"key":"L0031","section":"Your work","text":"oldest first","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":134,"string_id":"759c12b5f983","state":"standing"},
1593
+ {"key":"L0032","section":"Your work","text":"highest credits","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":135,"string_id":"55d673a5f0ec","state":"standing"},
1594
+ {"key":"L0033","section":"Your work","text":"lowest credits","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":136,"string_id":"754bdec368ed","state":"standing"},
1595
+ {"key":"L0034","section":"Your work","text":"30 works {…}","placement":"unplaced","state":"standing"},
1596
+ {"key":"L0035","section":"Your work","text":"Work","placement":"unplaced","state":"standing"},
1597
+ {"key":"L0036","section":"Your work","text":"Credits","placement":"unplaced","state":"standing"},
1598
+ {"key":"L0037","section":"Your work","text":"Shipped","placement":"placed","file":"modules/hall-ui/public/task.js","line":718,"string_id":"0c0a50ba1666","state":"standing"},
1599
+ {"key":"L0038","section":"Your work","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","state":"standing","occurrences":10},
1600
+ {"key":"L0039","section":"Your work","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","state":"standing","occurrences":2},
1601
+ {"key":"L0040","section":"Your work","text":"Per page","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":72,"string_id":"4a46b478edaf","state":"standing"},
1602
+ {"key":"L0041","section":"Your work","text":"‹ Prev","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":72,"string_id":"de8fa5223aee","state":"standing"},
1603
+ {"key":"L0042","section":"Your work","text":"Page {…} of {…}","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":110,"string_id":"15a49bf15007","state":"standing"},
1604
+ {"key":"L0043","section":"Your work","text":"Next ›","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":72,"string_id":"f52ba261d930","state":"standing"},
1605
+ {"key":"L0044","section":"Reviews","text":"Reviews","placement":"unplaced","state":"standing"},
1606
+ {"key":"L0045","section":"Reviews","text":"Work","placement":"unplaced","state":"standing"},
1607
+ {"key":"L0046","section":"Reviews","text":"Score","placement":"unplaced","state":"standing"},
1608
+ {"key":"L0047","section":"Reviews","text":"Verdict","placement":"unplaced","state":"standing"},
1609
+ {"key":"L0048","section":"Reviews","text":"Reviewed","placement":"unplaced","state":"standing"},
1610
+ {"key":"L0049","section":"Reviews","text":"passed","placement":"placed","file":"modules/hall-ui/public/government.js","line":671,"string_id":"da5368d10f85","state":"standing","occurrences":5},
1611
+ {"key":"L0050","section":"Reviews","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","state":"standing","occurrences":2},
1612
+ {"key":"L0051","section":"Reviews","text":"Last 14 days: {…} / 10 average across {…} graded work{…} ({…} passed).","placement":"placed","file":"modules/hall-ui/public/builders.js","line":569,"string_id":"81f62e066dbf","state":"standing"},
1613
+ {"key":"L0052","section":"Karma","text":"Karma","placement":"unplaced","state":"standing"},
1614
+ {"key":"L0053","section":"Karma","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","state":"standing"},
1615
+ {"key":"L0054","section":"Karma","text":"When","placement":"unplaced","state":"standing"},
1616
+ {"key":"L0055","section":"Karma","text":"Delta","placement":"unplaced","state":"standing"},
1617
+ {"key":"L0056","section":"Karma","text":"Reason","placement":"unplaced","state":"standing"},
1618
+ {"key":"L0057","section":"Karma","text":"Granted by","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":162,"string_id":"721fe281f993","state":"standing"},
1619
+ {"key":"L0058","section":"Karma","text":"— all builders —","placement":"placed","file":"modules/hall-ui/public/builders.js","line":695,"string_id":"a6ae9cbdee30","state":"standing","occurrences":10},
1620
+ {"key":"L0059","section":"Peer recognition","text":"Peer recognition","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":168,"string_id":"54fa47e421a5","state":"standing"},
1621
+ {"key":"L0060","section":"Peer recognition","text":"Vote on others’ finished work. A vote counts toward their karma after a week.","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":169,"string_id":"2a982c1af5df","state":"standing"},
1622
+ {"key":"L0061","section":"Peer recognition","text":"Work","placement":"unplaced","state":"standing"},
1623
+ {"key":"L0062","section":"Peer recognition","text":"By","placement":"unplaced","state":"standing"},
1624
+ {"key":"L0063","section":"Peer recognition","text":"Votes","placement":"unplaced","state":"standing"},
1625
+ {"key":"L0064","section":"Peer recognition","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","state":"standing","occurrences":6},
1626
+ {"key":"L0065","section":"Peer recognition","text":"Goal {…}","placement":"placed","file":"modules/hall-ui/public/gate.js","line":194,"string_id":"ec88b946ad16","state":"standing"},
1627
+ {"key":"L0066","section":"Peer recognition","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","state":"standing"},
1628
+ {"key":"L0067","section":"Peer recognition","text":"Per page","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":72,"string_id":"4a46b478edaf","state":"standing"},
1629
+ {"key":"L0068","section":"Peer recognition","text":"‹ Prev","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":72,"string_id":"de8fa5223aee","state":"standing"},
1630
+ {"key":"L0069","section":"Peer recognition","text":"Page {…} of {…}","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":110,"string_id":"15a49bf15007","state":"standing"},
1631
+ {"key":"L0070","section":"Peer recognition","text":"Next ›","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":72,"string_id":"f52ba261d930","state":"standing"},
1632
+ {"key":"L0071","section":"Achievements","text":"Achievements","placement":"unplaced","state":"standing"},
1633
+ {"key":"L0072","section":"Achievements","text":"Earned ones are lit; the rest show what is left.","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":197,"string_id":"f025c58dbf0a","state":"standing"},
1634
+ {"key":"L0073","section":"Achievements","text":"Won {…}","placement":"placed","file":"modules/hall-ui/public/builders.js","line":478,"string_id":"c5fd76a9e03d","state":"standing","occurrences":10},
1635
+ {"key":"L0074","section":"Achievements","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","state":"standing"},
1636
+ {"key":"L0075","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":520,"string_id":"1883ad7f07fc","state":"standing","occurrences":2},
1637
+ {"key":"L0076","section":"Achievements","text":"core 1.24.29","placement":"unplaced","state":"standing"},
1638
+ {"key":"L0077","section":"Achievements","text":"Skip","placement":"unplaced","state":"standing"},
1639
+ {"key":"L0078","section":"Achievements","text":"Built on","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":179,"string_id":"fef59346ffee","state":"standing"},
1640
+ {"key":"L0079","section":"Achievements","text":"cloudbongos.com","placement":"unplaced","state":"standing"},
1641
+ {"key":"L0080","section":"Good morning, {…}","text":"B","placement":"unplaced","occurrences":9},
1642
+ {"key":"L0081","section":"Good morning, {…}","text":"Aug","placement":"unplaced"},
1643
+ {"key":"L0082","section":"Good morning, {…}","text":"Oct","placement":"unplaced"},
1644
+ {"key":"L0083","section":"Good morning, {…}","text":"Now","placement":"unplaced"},
1645
+ {"key":"L0084","section":"Needs your attention13","text":"Needs your attention","placement":"placed","file":"modules/hall-ui/public/goal-inbox.js","line":580,"string_id":"7def635421ea"},
1646
+ {"key":"L0085","section":"Needs your attention13","text":"From the system","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":706,"string_id":"d32c5e058d1e"},
1647
+ {"key":"L0086","section":"Needs your attention13","text":"Ideas awaiting triage","placement":"placed","file":"modules/hall-ui/public/builders.js","line":841,"string_id":"e181637c5a5e"},
1648
+ {"key":"L0087","section":"Needs your attention13","text":"Requires project {…} fix","placement":"unplaced"},
1649
+ {"key":"L0088","section":"Needs your attention13","text":"core 1.24.29","placement":"unplaced"},
1650
+ {"key":"L0089","section":"Needs your attention13","text":"Skip","placement":"unplaced"},
1651
+ {"key":"L0090","section":"Needs your attention13","text":"Built on","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":179,"string_id":"fef59346ffee"},
1652
+ {"key":"L0091","section":"Needs your attention13","text":"cloudbongos.com","placement":"unplaced"},
1653
+ {"key":"L0092","section":"Good morning, {…}","text":"Where do you want to start the day?","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":184,"string_id":"0ec8d133f878","state":"founding"},
1654
+ {"key":"L0093","section":"Good morning, {…}","text":"Start with your role","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":186,"string_id":"58cef7963b6c","state":"founding"},
1655
+ {"key":"L0094","section":"Good morning, {…}","text":"Pick today’s craft and go straight to its room.","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":186,"string_id":"100e4665514d","state":"founding"},
1656
+ {"key":"L0095","section":"Good morning, {…}","text":"Your home page","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":187,"string_id":"2e6866532113","state":"founding"},
1657
+ {"key":"L0096","section":"Good morning, {…}","text":"Your work, what needs you, and what shipped.","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":187,"string_id":"e8d92c773db0","state":"founding"}
1676
1658
  ]
1677
1659
  },
1678
1660
  {
@@ -902,6 +902,34 @@ async function listAccessHolders() {
902
902
  return rows;
903
903
  }
904
904
 
905
+ // THE GOAL OF A DOCKET MATTER (task 1005056): which goal each goal-shaped matter
906
+ // belongs to, so Home's project city can put the docket's "yours" over the right
907
+ // tower. A blocker belongs to every goal whose tasks it holds (task_blockers →
908
+ // tasks.goal_id); a criterion and a goal join request carry their goal. The
909
+ // tables are core's; this is a read across the wall in SQL, never a require.
910
+ // → [{ matter_id: 'blockers:12', goal_id: '1000095' }, …]; ids are numeric or skipped.
911
+ async function goalsOfMatters({ blockers = [], criteria = [], joinRequests = [] } = {}) {
912
+ const ids = (list) => (Array.isArray(list) ? list : []).map(String).filter((v) => /^\d{1,18}$/.test(v));
913
+ const [b, c, j] = [ids(blockers), ids(criteria), ids(joinRequests)];
914
+ if (!b.length && !c.length && !j.length) return [];
915
+ const { rows } = await pool.query(
916
+ `SELECT 'blockers:' || tb.blocker_id AS matter_id, t.goal_id::text AS goal_id
917
+ FROM task_blockers tb
918
+ JOIN tasks t ON t.id = tb.task_id
919
+ WHERE tb.blocker_id = ANY($1::bigint[]) AND t.goal_id IS NOT NULL
920
+ UNION
921
+ SELECT 'criteria_uat:' || c.id, c.goal_id::text
922
+ FROM done_when_criteria c
923
+ WHERE c.id = ANY($2::bigint[]) AND c.goal_id IS NOT NULL
924
+ UNION
925
+ SELECT 'goal_join_requests:' || r.id, r.goal_id::text
926
+ FROM goal_membership_requests r
927
+ WHERE r.id = ANY($3::bigint[])`,
928
+ [b, c, j],
929
+ );
930
+ return rows;
931
+ }
932
+
905
933
  // Record that a builder holds an access. Idempotent: an existing row is kept as it
906
934
  // was (its original granted_at/by). → true when a row was added.
907
935
  async function grantAccess(accessKey, builderId, grantedBy) {
@@ -1342,6 +1370,7 @@ module.exports = {
1342
1370
  listLeads,
1343
1371
  listActiveArchons,
1344
1372
  listAccessHolders,
1373
+ goalsOfMatters,
1345
1374
  grantAccess,
1346
1375
  revokeAccess,
1347
1376
  getActiveBuilder,
@@ -932,14 +932,69 @@ async function blockersByPerson(builder, { contributions = registeredContributio
932
932
  return { available: false, reason: 'unavailable', people: [], nobody: [], yours: waiting.forViewer(null, builder.id) };
933
933
  }
934
934
  await attachAsks(matters, asksDb.asksFor, timeoutMs);
935
+ const seats = await seatsFor(matters);
936
+ if (!seats) return { available: false, reason: 'unavailable', people: [], nobody: [], yours: waiting.forViewer(null, builder.id) };
937
+ const grouped = waiting.groupByPerson(matters, seats);
938
+ return { available: true, ...grouped, yours: waiting.forViewer(grouped, builder.id) };
939
+ }
940
+
941
+ // The seats a set of matters routes against (loadSeats), reading a board's holders
942
+ // only when some matter names a board seat. null when the seats are unreadable.
943
+ async function seatsFor(matters) {
935
944
  const boardSeat = matters.some((m) => /^board:/.test(routing.seatOf(m)));
936
945
  const government = boardSeat
937
946
  ? await loadGovernment({ decisions: await board.decisionRulesView().catch(() => null) })
938
947
  : { holders: {} };
939
- const seats = await loadSeats(government);
940
- if (!seats) return { available: false, reason: 'unavailable', people: [], nobody: [], yours: waiting.forViewer(null, builder.id) };
941
- const grouped = waiting.groupByPerson(matters, seats);
942
- return { available: true, ...grouped, yours: waiting.forViewer(grouped, builder.id) };
948
+ return loadSeats(government);
949
+ }
950
+
951
+ // WHAT IS YOURS, PER GOAL (task 1005056). Home's project city puts a salmon dot
952
+ // over a working area for each matter waiting on the viewer; this answers it the
953
+ // docket's way, so the city and the docket can never disagree. The goal-shaped
954
+ // sources are read exactly as buildDocket reads them (each under its own gate),
955
+ // carry their stored asks, and are routed against the seats with routing.js — a
956
+ // matter counts when its route is `yours`. Like docketFor, a viewer without the
957
+ // docket's own atom is routed nothing. Each matter is then placed on its goal(s)
958
+ // (db.goalsOfMatters). A source that fails is left out, as the docket leaves it
959
+ // unavailable; unreadable seats say `available: false` rather than "none".
960
+ // → { available: true, goals: { [goal_id]: count } } | { available: false, reason }
961
+ const GOAL_SOURCES = Object.freeze(['blockers', 'criteria_uat', 'goal_join_requests']);
962
+ async function yoursByGoal(builder, {
963
+ contributions = registeredContributions(), now = Date.now(), timeoutMs = SOURCE_TIMEOUT_MS,
964
+ permissions = null, readAsks = asksDb.asksFor, readSeats = seatsFor, goalsOf = db.goalsOfMatters,
965
+ } = {}) {
966
+ if (!builder || builder.id == null) return { available: true, goals: {} };
967
+ const held = new Set(permissions || await resolver.resolveBuilderPermissions(builder.id));
968
+ if (!held.has(GOVERNMENT_GATE.permission)) return { available: true, goals: {} };
969
+ const ctx = Object.freeze({ builderId: String(builder.id), rank: builder.rank || null, has: (p) => held.has(p) });
970
+ const matters = [];
971
+ await Promise.all(GOAL_SOURCES.map(async (source) => {
972
+ const c = contributions.sources.get(source);
973
+ if (!c || !gateAllows(c.gate, ctx)) return;
974
+ const decl = EXPECTED_SOURCES.find((d) => d.source === source);
975
+ try {
976
+ const raw = await withTimeout(Promise.resolve(c.read(ctx, { now })), timeoutMs);
977
+ matters.push(...(Array.isArray(raw) ? raw : []).map((m) => normalizeMatter(m, { source, building: c.building || decl.building })).filter(Boolean));
978
+ } catch (err) {
979
+ log.warn({ source, err: err && err.message }, 'yours by goal: a source could not be read');
980
+ }
981
+ }));
982
+ const needs = matters.filter((m) => m.state === 'needs');
983
+ if (!needs.length) return { available: true, goals: {} };
984
+ await attachAsks(needs, readAsks, timeoutMs);
985
+ const seats = await readSeats(needs);
986
+ if (!seats) return { available: false, reason: 'unavailable' };
987
+ routing.routeAll(needs, ctx.builderId, seats, now);
988
+ const mine = needs.filter((m) => m.route && m.route.yours);
989
+ if (!mine.length) return { available: true, goals: {} };
990
+ const tail = (m) => m.id.slice(m.source.length + 1);
991
+ const of = (source) => mine.filter((m) => m.source === source).map(tail);
992
+ const rows = await goalsOf({ blockers: of('blockers'), criteria: of('criteria_uat'), joinRequests: of('goal_join_requests') });
993
+ const goals = {};
994
+ for (const r of rows || []) {
995
+ if (r && r.goal_id != null) goals[String(r.goal_id)] = (goals[String(r.goal_id)] || 0) + 1;
996
+ }
997
+ return { available: true, goals };
943
998
  }
944
999
 
945
1000
  // One matter with its stored ask and the seats, for passing it on to `toSeat`
@@ -1024,5 +1079,7 @@ module.exports = {
1024
1079
  findMatterFor,
1025
1080
  loadSeats,
1026
1081
  blockersByPerson,
1082
+ yoursByGoal,
1083
+ GOAL_SOURCES,
1027
1084
  matterWithSeats,
1028
1085
  };
@@ -171,6 +171,8 @@ const governmentPort = {
171
171
  askRequiredMessage: asks.ASK_REQUIRED_MESSAGE,
172
172
  saveAsk: (...a) => asksDb.saveAsk(...a),
173
173
  asksFor: (...a) => asksDb.asksFor(...a),
174
+ // task 1005056: per goal, the docket matters routed to this viewer (Home's city)
175
+ yoursByGoal: (viewer) => docket.yoursByGoal(viewer),
174
176
  };
175
177
 
176
178
  // An ask arrives bare, or wrapped as { ask } (the shape POST /blockers takes it in).