@bongos/core 1.21.178 → 1.21.180

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.
@@ -519,7 +519,7 @@
519
519
  "at": [
520
520
  "modules/hall-ui/public/builders.js:911",
521
521
  "modules/hall-ui/public/goals-render.js:369",
522
- "modules/hall-ui/public/work.js:482"
522
+ "modules/hall-ui/public/work.js:493"
523
523
  ]
524
524
  },
525
525
  {
@@ -541,7 +541,7 @@
541
541
  "at": [
542
542
  "modules/hall-ui/public/task.js:820",
543
543
  "modules/hall-ui/public/task.js:843",
544
- "modules/hall-ui/public/work.js:634"
544
+ "modules/hall-ui/public/work.js:645"
545
545
  ]
546
546
  },
547
547
  {
@@ -1038,7 +1038,7 @@
1038
1038
  "occurrences": 2,
1039
1039
  "at": [
1040
1040
  "modules/hall-ui/public/goals-render.js:370",
1041
- "modules/hall-ui/public/work.js:482"
1041
+ "modules/hall-ui/public/work.js:493"
1042
1042
  ]
1043
1043
  },
1044
1044
  {
@@ -1058,7 +1058,7 @@
1058
1058
  "occurrences": 2,
1059
1059
  "at": [
1060
1060
  "modules/hall-ui/public/goals-render.js:370",
1061
- "modules/hall-ui/public/work.js:482"
1061
+ "modules/hall-ui/public/work.js:493"
1062
1062
  ]
1063
1063
  },
1064
1064
  {
@@ -1068,7 +1068,7 @@
1068
1068
  "occurrences": 2,
1069
1069
  "at": [
1070
1070
  "modules/hall-ui/public/goals-page.js:435",
1071
- "modules/hall-ui/public/work.js:649"
1071
+ "modules/hall-ui/public/work.js:660"
1072
1072
  ]
1073
1073
  },
1074
1074
  {
@@ -1598,7 +1598,7 @@
1598
1598
  "occurrences": 2,
1599
1599
  "at": [
1600
1600
  "modules/hall-ui/public/goals-render.js:435",
1601
- "modules/hall-ui/public/work.js:855"
1601
+ "modules/hall-ui/public/work.js:866"
1602
1602
  ]
1603
1603
  },
1604
1604
  {
@@ -1678,7 +1678,7 @@
1678
1678
  "occurrences": 2,
1679
1679
  "at": [
1680
1680
  "modules/hall-ui/public/goals-page.js:428",
1681
- "modules/hall-ui/public/work.js:636"
1681
+ "modules/hall-ui/public/work.js:647"
1682
1682
  ]
1683
1683
  },
1684
1684
  {
@@ -1688,7 +1688,7 @@
1688
1688
  "occurrences": 2,
1689
1689
  "at": [
1690
1690
  "modules/hall-ui/public/goals-page.js:434",
1691
- "modules/hall-ui/public/work.js:647"
1691
+ "modules/hall-ui/public/work.js:658"
1692
1692
  ]
1693
1693
  },
1694
1694
  {
@@ -1738,7 +1738,7 @@
1738
1738
  "occurrences": 2,
1739
1739
  "at": [
1740
1740
  "modules/hall-ui/public/goals-page.js:543",
1741
- "modules/hall-ui/public/work.js:741"
1741
+ "modules/hall-ui/public/work.js:752"
1742
1742
  ]
1743
1743
  },
1744
1744
  {
@@ -1838,7 +1838,7 @@
1838
1838
  "occurrences": 2,
1839
1839
  "at": [
1840
1840
  "modules/hall-ui/public/goals-render.js:363",
1841
- "modules/hall-ui/public/work.js:258"
1841
+ "modules/hall-ui/public/work.js:269"
1842
1842
  ]
1843
1843
  },
1844
1844
  {
@@ -2328,7 +2328,7 @@
2328
2328
  "occurrences": 2,
2329
2329
  "at": [
2330
2330
  "modules/hall-ui/public/goals-page.js:284",
2331
- "modules/hall-ui/public/work.js:581"
2331
+ "modules/hall-ui/public/work.js:592"
2332
2332
  ]
2333
2333
  },
2334
2334
  {
@@ -2568,7 +2568,7 @@
2568
2568
  "occurrences": 2,
2569
2569
  "at": [
2570
2570
  "modules/hall-ui/public/watch.js:514",
2571
- "modules/hall-ui/public/work.js:265"
2571
+ "modules/hall-ui/public/work.js:276"
2572
2572
  ]
2573
2573
  },
2574
2574
  {
@@ -2598,7 +2598,7 @@
2598
2598
  "occurrences": 2,
2599
2599
  "at": [
2600
2600
  "modules/hall-ui/public/goals-render.js:343",
2601
- "modules/hall-ui/public/work.js:456"
2601
+ "modules/hall-ui/public/work.js:467"
2602
2602
  ]
2603
2603
  }
2604
2604
  ],
@@ -4498,7 +4498,7 @@
4498
4498
  "surface": "builders-hall",
4499
4499
  "text": "Claim task {…}",
4500
4500
  "file": "modules/hall-ui/public/work.js",
4501
- "line": 482,
4501
+ "line": 493,
4502
4502
  "origin": "js-markup",
4503
4503
  "confidence": "certain"
4504
4504
  },
@@ -4876,7 +4876,7 @@
4876
4876
  "surface": "builders-hall",
4877
4877
  "text": "Copy prompt",
4878
4878
  "file": "modules/hall-ui/public/work.js",
4879
- "line": 634,
4879
+ "line": 645,
4880
4880
  "origin": "js-text-assign",
4881
4881
  "confidence": "certain"
4882
4882
  },
@@ -4894,7 +4894,7 @@
4894
4894
  "surface": "builders-hall",
4895
4895
  "text": "Copy prompt for task {…}",
4896
4896
  "file": "modules/hall-ui/public/work.js",
4897
- "line": 482,
4897
+ "line": 493,
4898
4898
  "origin": "js-markup",
4899
4899
  "confidence": "certain"
4900
4900
  },
@@ -4939,7 +4939,7 @@
4939
4939
  "surface": "builders-hall",
4940
4940
  "text": "Copy the task prompt to your clipboard",
4941
4941
  "file": "modules/hall-ui/public/work.js",
4942
- "line": 482,
4942
+ "line": 493,
4943
4943
  "origin": "js-markup",
4944
4944
  "confidence": "certain"
4945
4945
  },
@@ -5065,7 +5065,7 @@
5065
5065
  "surface": "builders-hall",
5066
5066
  "text": "Could not copy to the clipboard. Try again.",
5067
5067
  "file": "modules/hall-ui/public/work.js",
5068
- "line": 649,
5068
+ "line": 660,
5069
5069
  "origin": "js-notice",
5070
5070
  "confidence": "certain"
5071
5071
  },
@@ -8962,7 +8962,7 @@
8962
8962
  "surface": "builders-hall",
8963
8963
  "text": "No backlog tasks match these filters. Try widening them.",
8964
8964
  "file": "modules/hall-ui/public/work.js",
8965
- "line": 832,
8965
+ "line": 843,
8966
8966
  "origin": "js-markup",
8967
8967
  "confidence": "certain"
8968
8968
  },
@@ -9034,7 +9034,7 @@
9034
9034
  "surface": "builders-hall",
9035
9035
  "text": "No goal",
9036
9036
  "file": "modules/hall-ui/public/work.js",
9037
- "line": 609,
9037
+ "line": 620,
9038
9038
  "origin": "js-text-assign",
9039
9039
  "confidence": "certain"
9040
9040
  },
@@ -9295,7 +9295,7 @@
9295
9295
  "surface": "builders-hall",
9296
9296
  "text": "No tasks match these filters. Try widening them.",
9297
9297
  "file": "modules/hall-ui/public/work.js",
9298
- "line": 427,
9298
+ "line": 438,
9299
9299
  "origin": "js-markup",
9300
9300
  "confidence": "certain"
9301
9301
  },
@@ -9763,7 +9763,7 @@
9763
9763
  "surface": "builders-hall",
9764
9764
  "text": "Nothing in the backlog right now.",
9765
9765
  "file": "modules/hall-ui/public/work.js",
9766
- "line": 818,
9766
+ "line": 829,
9767
9767
  "origin": "js-markup",
9768
9768
  "confidence": "certain"
9769
9769
  },
@@ -10159,7 +10159,7 @@
10159
10159
  "surface": "builders-hall",
10160
10160
  "text": "Open task #{…}",
10161
10161
  "file": "modules/hall-ui/public/work.js",
10162
- "line": 855,
10162
+ "line": 866,
10163
10163
  "origin": "js-markup",
10164
10164
  "confidence": "certain"
10165
10165
  },
@@ -10780,7 +10780,7 @@
10780
10780
  "surface": "builders-hall",
10781
10781
  "text": "Prompt for #{…} copied to your clipboard.",
10782
10782
  "file": "modules/hall-ui/public/work.js",
10783
- "line": 636,
10783
+ "line": 647,
10784
10784
  "origin": "js-notice",
10785
10785
  "confidence": "certain"
10786
10786
  },
@@ -10798,7 +10798,7 @@
10798
10798
  "surface": "builders-hall",
10799
10799
  "text": "Prompt for #{…} copied.",
10800
10800
  "file": "modules/hall-ui/public/work.js",
10801
- "line": 647,
10801
+ "line": 658,
10802
10802
  "origin": "js-notice",
10803
10803
  "confidence": "certain"
10804
10804
  },
@@ -11068,7 +11068,7 @@
11068
11068
  "surface": "builders-hall",
11069
11069
  "text": "Recent history could not be loaded right now.",
11070
11070
  "file": "modules/hall-ui/public/work.js",
11071
- "line": 951,
11071
+ "line": 1004,
11072
11072
  "origin": "js-markup",
11073
11073
  "confidence": "certain"
11074
11074
  },
@@ -11167,7 +11167,7 @@
11167
11167
  "surface": "builders-hall",
11168
11168
  "text": "Release your claim on #{…}? It returns to the queue and no {…} are earned.",
11169
11169
  "file": "modules/hall-ui/public/work.js",
11170
- "line": 741,
11170
+ "line": 752,
11171
11171
  "origin": "js-notice",
11172
11172
  "confidence": "certain"
11173
11173
  },
@@ -11959,7 +11959,7 @@
11959
11959
  "surface": "builders-hall",
11960
11960
  "text": "Select task {…} for bulk actions",
11961
11961
  "file": "modules/hall-ui/public/work.js",
11962
- "line": 468,
11962
+ "line": 479,
11963
11963
  "origin": "js-markup",
11964
11964
  "confidence": "certain"
11965
11965
  },
@@ -11986,7 +11986,7 @@
11986
11986
  "surface": "builders-hall",
11987
11987
  "text": "Select task {…} for bulk release",
11988
11988
  "file": "modules/hall-ui/public/work.js",
11989
- "line": 258,
11989
+ "line": 269,
11990
11990
  "origin": "js-markup",
11991
11991
  "confidence": "certain"
11992
11992
  },
@@ -14083,7 +14083,7 @@
14083
14083
  "surface": "builders-hall",
14084
14084
  "text": "The task list could not be loaded right now.",
14085
14085
  "file": "modules/hall-ui/public/work.js",
14086
- "line": 1027,
14086
+ "line": 1080,
14087
14087
  "origin": "js-markup",
14088
14088
  "confidence": "certain"
14089
14089
  },
@@ -14119,7 +14119,7 @@
14119
14119
  "surface": "builders-hall",
14120
14120
  "text": "The work board failed to load. Reload to try again.",
14121
14121
  "file": "modules/hall-ui/public/work.js",
14122
- "line": 1215,
14122
+ "line": 1268,
14123
14123
  "origin": "js-notice",
14124
14124
  "confidence": "certain"
14125
14125
  },
@@ -15064,7 +15064,7 @@
15064
15064
  "surface": "builders-hall",
15065
15065
  "text": "Welcome, {…}. Pick up work, or follow what is moving.",
15066
15066
  "file": "modules/hall-ui/public/work.js",
15067
- "line": 942,
15067
+ "line": 995,
15068
15068
  "origin": "js-text-assign",
15069
15069
  "confidence": "certain"
15070
15070
  },
@@ -18061,7 +18061,7 @@
18061
18061
  "surface": "builders-hall",
18062
18062
  "text": "system / unattributed",
18063
18063
  "file": "modules/hall-ui/public/work.js",
18064
- "line": 581,
18064
+ "line": 592,
18065
18065
  "origin": "js-text-assign",
18066
18066
  "confidence": "certain"
18067
18067
  },
@@ -19222,7 +19222,7 @@
19222
19222
  "surface": "builders-hall",
19223
19223
  "text": "{…} {…} waiting",
19224
19224
  "file": "modules/hall-ui/public/work.js",
19225
- "line": 420,
19225
+ "line": 431,
19226
19226
  "origin": "js-text-assign",
19227
19227
  "confidence": "certain"
19228
19228
  },
@@ -19249,7 +19249,7 @@
19249
19249
  "surface": "builders-hall",
19250
19250
  "text": "{…} {…}{…}",
19251
19251
  "file": "modules/hall-ui/public/work.js",
19252
- "line": 265,
19252
+ "line": 276,
19253
19253
  "origin": "js-markup",
19254
19254
  "confidence": "certain"
19255
19255
  },
@@ -19807,7 +19807,7 @@
19807
19807
  "surface": "builders-hall",
19808
19808
  "text": "✎ {…} file{…}",
19809
19809
  "file": "modules/hall-ui/public/work.js",
19810
- "line": 456,
19810
+ "line": 467,
19811
19811
  "origin": "js-markup",
19812
19812
  "confidence": "certain"
19813
19813
  },
package/docs/file-map.md CHANGED
@@ -14,6 +14,7 @@
14
14
  ├── .impeccable/ ← impeccable skill artifacts: config.json (buildPath: code), surfaces/<route>.md (per-route briefs), mocks/world-assets/ (Higgsfield renders + prompt sidecars; the SOURCE of modules/public-landing/public/assets/world/), mocks/decision/ (A1 comps), design.json (DESIGN.md sidecar), review/ (finish captures)
15
15
  ├── .gitignore
16
16
  ├── package.json / package-lock.json
17
+ ├── knip.config.js ← dead-code scanner config (task 1004875): modules/ entries GENERATED from each module.json + #! CLIs; scored by scripts/bongos/fitness-ratchets.js --knip
17
18
  ├── CODEOWNERS ← owner review on the merge-gate surfaces (real since task 1002611, ADR 0159); inert until branch protection is on (scripts/bongos/gating.js) — keep aligned with scripts/bongos/hard-floor.js HARD_FLOOR_GLOBS
18
19
  ├── server.js ← game boot: Express + Colyseus + the shared internal surface (mountInternalSurfaces), binds 127.0.0.1:3000
19
20
  │
@@ -3193,5 +3193,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
3193
3193
  landed since 1.21.176 with no explicit bump. run 40241825861. (task 1002620)
3194
3194
  1.21.178 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3195
3195
  landed since 1.21.177 with no explicit bump. run 40249608959. (task 1002620)
3196
+ 1.21.179 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3197
+ landed since 1.21.178 with no explicit bump. run 40250732318. (task 1002620)
3198
+ 1.21.180 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3199
+ landed since 1.21.179 with no explicit bump. run 40251859318. (task 1002620)
3196
3200
  ---------------------------------------------------------------------------
3197
3201
  ```
@@ -4251,7 +4251,7 @@
4251
4251
  "surface": "builders",
4252
4252
  "title": "Tasks",
4253
4253
  "states_read": ["ready","in-progress","backlog","completed","filters-open","out","founding"],
4254
- "files_hash": "b412f1a342b5ccdc",
4254
+ "files_hash": "7e2e0fcb30d10915",
4255
4255
  "reading_hash": "e5b6e930db9ca1ad",
4256
4256
  "counts": {"lines":121,"placed":48,"shared":8,"unplaced":65},
4257
4257
  "omitted": {"data":321},
@@ -4346,7 +4346,7 @@
4346
4346
  {"key":"L0087","section":"Ready — tasks to do150","text":"Claim","placement":"unplaced","occurrences":26},
4347
4347
  {"key":"L0088","section":"Ready — tasks to do150","text":"to take a task right here — no terminal needed. Then click","placement":"placed","file":"modules/hall-ui/public/work.html","line":103,"string_id":"23488ca48320"},
4348
4348
  {"key":"L0089","section":"Ready — tasks to do150","text":"to copy the task prompt and paste it into a fresh Claude Code session to begin.","placement":"placed","file":"modules/hall-ui/public/work.html","line":103,"string_id":"5520469f2834"},
4349
- {"key":"L0090","section":"Ready — tasks to do150","text":"{…} {…} waiting","placement":"placed","file":"modules/hall-ui/public/work.js","line":420,"string_id":"8186b562553a"},
4349
+ {"key":"L0090","section":"Ready — tasks to do150","text":"{…} {…} waiting","placement":"placed","file":"modules/hall-ui/public/work.js","line":431,"string_id":"8186b562553a"},
4350
4350
  {"key":"L0091","section":"Ready — tasks to do150","text":"Archon","placement":"unplaced"},
4351
4351
  {"key":"L0092","section":"Ready — tasks to do150","text":"30m","placement":"unplaced","occurrences":5},
4352
4352
  {"key":"L0093","section":"Ready — tasks to do150","text":"1.00 d/min","placement":"unplaced","occurrences":21},
@@ -24,7 +24,6 @@
24
24
  // The longest display name we accept, in Unicode code points (so a multi-byte
25
25
  // character counts as one, matching how a human reads the limit).
26
26
  const MAX_LENGTH = 60;
27
- const MIN_LENGTH = 1; // after trimming — empty / whitespace-only is rejected
28
27
 
29
28
  // Count code points, not UTF-16 units, so an emoji or astral character is "1".
30
29
  function codePointLength(str) {
@@ -77,7 +76,6 @@ function validate(name) {
77
76
 
78
77
  module.exports = {
79
78
  MAX_LENGTH,
80
- MIN_LENGTH,
81
79
  codePointLength,
82
80
  hasControlChar,
83
81
  validate,
@@ -93,6 +93,17 @@
93
93
  return parts.length ? `?${parts.join('&')}` : '';
94
94
  }
95
95
 
96
+ // task 1004877 — the claimable read, with a ceiling. Sort, filters, search and
97
+ // paging all run here over the loaded feed, so it cannot be cut to one page;
98
+ // 1000 is the route's own maximum, far above today's queue, and the tab count
99
+ // reads claimable_total so it stays honest if the ceiling is ever reached.
100
+ const CLAIMABLE_LIMIT = 1000;
101
+ const claimableUrl = () => `${API}/tasks/claimable?limit=${CLAIMABLE_LIMIT}${serverFilterQuery().replace(/^\?/, '&')}`;
102
+ function takeClaimable(resp) {
103
+ taskState.all = resp.claimable || [];
104
+ taskState.claimableTotal = Number.isFinite(resp.claimable_total) ? resp.claimable_total : taskState.all.length;
105
+ }
106
+
96
107
  // task 1003828 — the BACKLOG's server query, deliberately NOT shared with the
97
108
  // claimable feed's. The routes differ (GET /tasks answers version/kind/
98
109
  // discipline/goal_id; /tasks/claimable answers only version+discipline), and the
@@ -421,7 +432,7 @@
421
432
  // task 1899: header count pill reflects the filtered-list length; the tab
422
433
  // pill (task 2170) carries the FULL ready count, filters notwithstanding.
423
434
  setCountPill('#ready-count', list.length);
424
- setTabCount('ready', taskState.all.length);
435
+ setTabCount('ready', taskState.claimableTotal ?? taskState.all.length);
425
436
 
426
437
  if (!list.length) {
427
438
  root.innerHTML = `<div class="profile__placeholder">No tasks match these filters. Try widening them.</div>`;
@@ -868,9 +879,9 @@
868
879
  // the same way loadAll does so a transient failure doesn't blank the board.
869
880
  async function refreshLive() {
870
881
  try {
871
- const claimResp = await getJSON(`${API}/tasks/claimable${serverFilterQuery()}`);
882
+ const claimResp = await getJSON(claimableUrl());
872
883
  renderInFlight(claimResp.active_claims || []);
873
- taskState.all = claimResp.claimable || [];
884
+ takeClaimable(claimResp);
874
885
  renderClaimable();
875
886
  pruneSelection();
876
887
  renderBulkToolbar();
@@ -880,22 +891,64 @@
880
891
  }
881
892
  }
882
893
 
894
+ // task 1004877 — refresh on the hall's live signal (GET /api/bongos/live, the
895
+ // SSE stream builders.js uses: a bare "something changed" nudge on any task,
896
+ // claim or credit write), not a fixed 20 s timer that re-read the whole feed
897
+ // 30 times per idle 10 minutes. A nudge refreshes after LIVE_DEBOUNCE_MS, and
898
+ // never sooner than LIVE_MIN_GAP_MS after the last one, so a burst of writes
899
+ // costs one read and a busy project never costs more than the old timer did.
900
+ // The slow timer is the backstop for a dropped stream, and stands down while
901
+ // live refreshes are arriving.
902
+ const FALLBACK_POLL_MS = 120000;
903
+ const LIVE_DEBOUNCE_MS = 1000;
904
+ const LIVE_MIN_GAP_MS = 20000;
905
+ let liveTimer = null;
906
+ let lastRefreshAt = 0;
907
+ let liveSource = null;
908
+
909
+ function refreshNow() {
910
+ lastRefreshAt = Date.now();
911
+ refreshLive();
912
+ }
913
+
914
+ function scheduleLiveRefresh() {
915
+ if (liveTimer || document.hidden) return; // coalescing already; a hidden tab catches up on return
916
+ const wait = Math.max(LIVE_DEBOUNCE_MS, lastRefreshAt + LIVE_MIN_GAP_MS - Date.now());
917
+ liveTimer = setTimeout(() => {
918
+ liveTimer = null;
919
+ if (!document.hidden) refreshNow();
920
+ }, wait);
921
+ }
922
+
923
+ function connectLive() {
924
+ if (liveSource || typeof EventSource === 'undefined') return;
925
+ try {
926
+ const es = new EventSource(`${API}/live`);
927
+ liveSource = es;
928
+ let opened = false;
929
+ es.addEventListener('nudge', scheduleLiveRefresh);
930
+ // A reconnect may have missed a nudge while the stream was down.
931
+ es.onopen = () => { if (opened) scheduleLiveRefresh(); opened = true; };
932
+ // CLOSED (e.g. a 401) never reconnects on its own; drop it so the
933
+ // visibility handler can open a fresh one.
934
+ es.onerror = () => { if (es.readyState === EventSource.CLOSED) liveSource = null; };
935
+ } catch (_) { /* no live stream: the fallback timer still refreshes */ }
936
+ }
937
+
883
938
  function startPolling() {
884
- // Re-render the in-flight ages every tick even without new data, and pull
885
- // fresh truth from the server. Paused while the tab is hidden to avoid
886
- // pointless background traffic.
887
- const POLL_MS = 20000;
939
+ connectLive();
888
940
  setInterval(() => {
889
- if (document.hidden) { return; }
890
- refreshLive();
891
- }, POLL_MS);
892
- // Cheap local re-render of claim ages between polls.
941
+ if (!document.hidden && Date.now() - lastRefreshAt >= FALLBACK_POLL_MS / 2) refreshNow();
942
+ }, FALLBACK_POLL_MS);
943
+ // Cheap local re-render of claim ages between refreshes.
893
944
  setInterval(() => {
894
945
  if (!document.hidden && liveState.active.length) renderInFlight();
895
946
  }, 60000);
896
947
  // Snap to fresh data the moment the tab regains focus.
897
948
  document.addEventListener('visibilitychange', () => {
898
- if (!document.hidden) refreshLive();
949
+ if (document.hidden) return;
950
+ connectLive();
951
+ refreshNow();
899
952
  });
900
953
  }
901
954
 
@@ -993,7 +1046,7 @@
993
1046
  // empty-but-honest (the gate also blocks active_claims, so say so).
994
1047
  try {
995
1048
  const [claimResp, versionsResp, focusResp] = await Promise.all([
996
- getJSON(`${API}/tasks/claimable${serverFilterQuery()}`),
1049
+ getJSON(claimableUrl()),
997
1050
  getJSON(`${API}/versions`).catch(() => ({ versions: [] })),
998
1051
  getJSON(`${API}/versions/focus`).catch(() => null),
999
1052
  ]);
@@ -1001,7 +1054,7 @@
1001
1054
  populateVersionFilter(taskState.versions);
1002
1055
  restoreUrlFilter('f-version');
1003
1056
  renderInFlight(claimResp.active_claims || []);
1004
- taskState.all = claimResp.claimable || [];
1057
+ takeClaimable(claimResp);
1005
1058
  renderClaimable();
1006
1059
  populateGoalFilter(); // task 1755
1007
1060
  populateCreatorFilter().catch(() => {}); // task 1003278 — fire-and-forget, the owner-filter posture
@@ -26,8 +26,6 @@
26
26
  const api = require('../../src/module-api');
27
27
  const { pool } = api;
28
28
 
29
- function emptyBorn() { return { goals: {}, criteria: {} }; }
30
-
31
29
  // readBornOf — the two reads, folded first-wins into plain objects keyed by the
32
30
  // born thing's id. deps.pool honours the test seam.
33
31
  async function readBornOf(deps = {}) {
@@ -52,4 +50,4 @@ async function readBornOf(deps = {}) {
52
50
  return { goals: firstWins(goals.rows, 'goal_id'), criteria: firstWins(criteria.rows, 'criterion_id') };
53
51
  }
54
52
 
55
- module.exports = { readBornOf, emptyBorn };
53
+ module.exports = { readBornOf };
@@ -71,7 +71,6 @@ function blockerVendorRule() {
71
71
  }
72
72
  return _blockerVendorRe;
73
73
  }
74
- const _resetVendorCacheForTests = () => { _blockerVendorRe = undefined; };
75
74
 
76
75
  function extractKindTag(description) {
77
76
  if (!description) return null;
@@ -549,7 +548,6 @@ module.exports = {
549
548
  classifyTaskKind,
550
549
  classifyTaskDiscipline,
551
550
  buildBlockerVendorRe,
552
- _resetVendorCacheForTests,
553
551
  VALID_KINDS,
554
552
  VALID_DISCIPLINES,
555
553
  WRITABLE_DISCIPLINES,
@@ -113,16 +113,6 @@ async function listDocuments(specialityId, executor) {
113
113
  return r.rows;
114
114
  }
115
115
 
116
- async function getDocument(specialityId, docId, executor) {
117
- const q = exec(executor);
118
- const r = await q(
119
- `SELECT id, speciality_id, title, body_md, source, content_sha, created_at
120
- FROM specialities_documents WHERE speciality_id = $1 AND id = $2`,
121
- [specialityId, docId],
122
- );
123
- return r.rows[0] || null;
124
- }
125
-
126
116
  async function deleteDocument(specialityId, docId, executor) {
127
117
  const q = exec(executor);
128
118
  const r = await q(
@@ -286,7 +276,7 @@ async function listOffered({ builderId, projectIds = [], discipline = null }, ex
286
276
  module.exports = {
287
277
  UPDATABLE, taskDiscipline, setOffered, listOffered,
288
278
  createSpeciality, getSpeciality, listVisibleTo, updateSpeciality,
289
- addDocument, listDocuments, getDocument, deleteDocument,
279
+ addDocument, listDocuments, deleteDocument,
290
280
  linkLearning, countTraining,
291
281
  adopt, abandon, deactivateCraft, activeForCraft, listAdoptions, setEnabledSkills,
292
282
  };
@@ -70,12 +70,6 @@ function readFrontmatter(skillMd) {
70
70
  try { return parseFrontmatter(fs.readFileSync(skillMd, 'utf8')); } catch { return {}; }
71
71
  }
72
72
 
73
- // The description a SKILL.md gives, for the adoption walkthrough (task 1004073).
74
- function readDescription(skillMd) {
75
- const d = readFrontmatter(skillMd).description;
76
- return typeof d === 'string' ? d : '';
77
- }
78
-
79
73
  // The optional PEOPLE-FACING fields (task 1004073). `description` is written to
80
74
  // be MATCHED by a model, so a skill's author may also say, for the person
81
75
  // deciding whether to turn it on: what it does (`plain`), when to reach for it
@@ -193,4 +187,4 @@ function installedSkillsCached(opts, now = Date.now()) {
193
187
  }
194
188
  function _resetCache() { cached = null; }
195
189
 
196
- module.exports = { SKILL_NAME_RE, installedSkills, installedSkillsCached, readDescription, parseFrontmatter, explainSkill, _resetCache };
190
+ module.exports = { SKILL_NAME_RE, installedSkills, installedSkillsCached, parseFrontmatter, explainSkill, _resetCache };
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.21.178",
3
+ "version": "1.21.180",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.21.178",
9
+ "version": "1.21.180",
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.21.178",
3
+ "version": "1.21.180",
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",
@@ -10344,5 +10344,17 @@
10344
10344
  "id": "1004863",
10345
10345
  "text": "Eight database tests that had quietly stopped working are repaired and now run on every change, including the one that proves an idea's author is never paid twice and the one that proves search never shows someone a page above"
10346
10346
  }
10347
+ ],
10348
+ "1.21.179": [
10349
+ {
10350
+ "id": "1004877",
10351
+ "text": "The Work page no longer re-downloads the whole task list every 20 seconds: it updates within about a second when something actually changes, and an idle tab now asks 5 times in 10 minutes instead of 30."
10352
+ }
10353
+ ],
10354
+ "1.21.180": [
10355
+ {
10356
+ "id": "1004875",
10357
+ "text": "The unused-code check now covers modules/, the largest part of the codebase, and fails the build when someone adds a dead file or an unused export there. Five dead exports were removed along the way."
10358
+ }
10347
10359
  ]
10348
10360
  }