@bongos/core 1.21.140 → 1.21.141
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 -19
- package/clients/bongos-client/index.d.ts +1 -1
- package/docs/api/openapi.json +3 -4
- package/docs/copy-inventory.md +13 -11
- package/docs/copy-registry.json +42 -24
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-readings.json +25 -25
- package/modules/hall-ui/public/goals.js +31 -8
- package/modules/lifecycle/claimable-counts.js +19 -0
- package/modules/lifecycle/routes/tasks.js +10 -10
- 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/hall_goals_open_first.mjs +120 -0
package/.bongos-core.json
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.21.
|
|
6
|
-
"core_contract": "1.21.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.21.141",
|
|
6
|
+
"core_contract": "1.21.141",
|
|
7
|
+
"source_commit": "1df6b5f512d4695c82c2cf8b94ff0234d721598a",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-10-
|
|
9
|
+
"built_at": "2026-10-17T04:41:31.753Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 608,
|
|
13
13
|
"agent_docs_stubbed": 28,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 3158,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 3795,
|
|
20
|
+
"tree_sha256": "8da5a6404d48fa329a19e2d6d06c7787c097c75f8641723d71c8b54fb33a9d44",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -337,7 +337,7 @@
|
|
|
337
337
|
{
|
|
338
338
|
"path": "clients/bongos-client/index.d.ts",
|
|
339
339
|
"mode": "0000644",
|
|
340
|
-
"sha256": "
|
|
340
|
+
"sha256": "32473bc4b3af9c775d902e05d2ef4a9ba5ab1b76028ca3cbe9b4589ef5e75beb"
|
|
341
341
|
},
|
|
342
342
|
{
|
|
343
343
|
"path": "clients/bongos-client/index.mjs",
|
|
@@ -2387,7 +2387,7 @@
|
|
|
2387
2387
|
{
|
|
2388
2388
|
"path": "docs/api/openapi.json",
|
|
2389
2389
|
"mode": "0000644",
|
|
2390
|
-
"sha256": "
|
|
2390
|
+
"sha256": "bcd476792cd9928a3398018992090ff5a0123750f2c87df439a346fc311945b4"
|
|
2391
2391
|
},
|
|
2392
2392
|
{
|
|
2393
2393
|
"path": "docs/architecture.md",
|
|
@@ -2412,12 +2412,12 @@
|
|
|
2412
2412
|
{
|
|
2413
2413
|
"path": "docs/copy-inventory.md",
|
|
2414
2414
|
"mode": "0000644",
|
|
2415
|
-
"sha256": "
|
|
2415
|
+
"sha256": "ee6fea80103d420481d7fa395352caf17d518a80459918575b90cc4ecb865e4b"
|
|
2416
2416
|
},
|
|
2417
2417
|
{
|
|
2418
2418
|
"path": "docs/copy-registry.json",
|
|
2419
2419
|
"mode": "0000644",
|
|
2420
|
-
"sha256": "
|
|
2420
|
+
"sha256": "115ba4452f8cbfba88bef9b9c974514e714e1af5852a2fb06f8f46dc24a457c9"
|
|
2421
2421
|
},
|
|
2422
2422
|
{
|
|
2423
2423
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2927,7 +2927,7 @@
|
|
|
2927
2927
|
{
|
|
2928
2928
|
"path": "docs/module-api-changelog.md",
|
|
2929
2929
|
"mode": "0000644",
|
|
2930
|
-
"sha256": "
|
|
2930
|
+
"sha256": "d64fdd18ff9a02daa52471cd6c719b8218b98824b2f9b0ad6cecc57ef4d044d6"
|
|
2931
2931
|
},
|
|
2932
2932
|
{
|
|
2933
2933
|
"path": "docs/modules-contract.md",
|
|
@@ -3017,7 +3017,7 @@
|
|
|
3017
3017
|
{
|
|
3018
3018
|
"path": "docs/page-readings.json",
|
|
3019
3019
|
"mode": "0000644",
|
|
3020
|
-
"sha256": "
|
|
3020
|
+
"sha256": "18e50539ef47bd75e92eedb553130ef086077264e29fa504c748169a13642191"
|
|
3021
3021
|
},
|
|
3022
3022
|
{
|
|
3023
3023
|
"path": "docs/project-context.template.md",
|
|
@@ -5992,7 +5992,7 @@
|
|
|
5992
5992
|
{
|
|
5993
5993
|
"path": "modules/hall-ui/public/goals.js",
|
|
5994
5994
|
"mode": "0000644",
|
|
5995
|
-
"sha256": "
|
|
5995
|
+
"sha256": "92178535b69db9ded040f26961adf79ed72249634c4103decc98a63593d8261c"
|
|
5996
5996
|
},
|
|
5997
5997
|
{
|
|
5998
5998
|
"path": "modules/hall-ui/public/goals.states.json",
|
|
@@ -7129,6 +7129,11 @@
|
|
|
7129
7129
|
"mode": "0000644",
|
|
7130
7130
|
"sha256": "3586cc2aa07913870ad99073c534e70ef2e2c5ff6a5ef2ddeb141cfd397269cd"
|
|
7131
7131
|
},
|
|
7132
|
+
{
|
|
7133
|
+
"path": "modules/lifecycle/claimable-counts.js",
|
|
7134
|
+
"mode": "0000644",
|
|
7135
|
+
"sha256": "e030803cd033ad2ccebe77de0aa53a6b2b214466fb72b25324197126b20f87e3"
|
|
7136
|
+
},
|
|
7132
7137
|
{
|
|
7133
7138
|
"path": "modules/lifecycle/closeness-weights.json",
|
|
7134
7139
|
"mode": "0000644",
|
|
@@ -7697,7 +7702,7 @@
|
|
|
7697
7702
|
{
|
|
7698
7703
|
"path": "modules/lifecycle/routes/tasks.js",
|
|
7699
7704
|
"mode": "0000644",
|
|
7700
|
-
"sha256": "
|
|
7705
|
+
"sha256": "bbedfd0018e793c222c09df377443bf8ddf54dcb3a06e7e19be961ea5ecf86d0"
|
|
7701
7706
|
},
|
|
7702
7707
|
{
|
|
7703
7708
|
"path": "modules/lifecycle/routes/version-route-authz.js",
|
|
@@ -10532,12 +10537,12 @@
|
|
|
10532
10537
|
{
|
|
10533
10538
|
"path": "package-lock.json",
|
|
10534
10539
|
"mode": "0000644",
|
|
10535
|
-
"sha256": "
|
|
10540
|
+
"sha256": "a17c1cac4c54a3cfe28d40724b89152ae163a6b594c259df09be108a1c731aae"
|
|
10536
10541
|
},
|
|
10537
10542
|
{
|
|
10538
10543
|
"path": "package.json",
|
|
10539
10544
|
"mode": "0000644",
|
|
10540
|
-
"sha256": "
|
|
10545
|
+
"sha256": "89edc8b83b355ce6f57b15754238190e50f97088c4c111d085c1482995fa8946"
|
|
10541
10546
|
},
|
|
10542
10547
|
{
|
|
10543
10548
|
"path": "public-docs/index.html",
|
|
@@ -10557,7 +10562,7 @@
|
|
|
10557
10562
|
{
|
|
10558
10563
|
"path": "release-notes.json",
|
|
10559
10564
|
"mode": "0000644",
|
|
10560
|
-
"sha256": "
|
|
10565
|
+
"sha256": "4ee7aaaddb122c4798467734d00de8ef8c22a3c1f00a3af5a907d969ee4b8f79"
|
|
10561
10566
|
},
|
|
10562
10567
|
{
|
|
10563
10568
|
"path": "scripts/cron/style_guide_audit.sh",
|
|
@@ -12922,7 +12927,7 @@
|
|
|
12922
12927
|
{
|
|
12923
12928
|
"path": "src/module-api.js",
|
|
12924
12929
|
"mode": "0000644",
|
|
12925
|
-
"sha256": "
|
|
12930
|
+
"sha256": "31a1c9f84de47ff566c8cf8c4c4b281b3fde6fe888e18ba1b9a1fda78673225f"
|
|
12926
12931
|
},
|
|
12927
12932
|
{
|
|
12928
12933
|
"path": "src/module-loader/catalog.js",
|
|
@@ -15439,6 +15444,11 @@
|
|
|
15439
15444
|
"mode": "0000644",
|
|
15440
15445
|
"sha256": "5fafbaf95ca562dbafa5fb370e2ef98da2a258eb8a8139d962a0b19ebf693904"
|
|
15441
15446
|
},
|
|
15447
|
+
{
|
|
15448
|
+
"path": "tests/hall_goals_open_first.mjs",
|
|
15449
|
+
"mode": "0000644",
|
|
15450
|
+
"sha256": "79eb37297318f1dfe4661d4fdee68a80c4705141ee142584609232765aaaf2d7"
|
|
15451
|
+
},
|
|
15442
15452
|
{
|
|
15443
15453
|
"path": "tests/hall_gov_counts.mjs",
|
|
15444
15454
|
"mode": "0000644",
|
|
@@ -187,7 +187,7 @@ export interface GetStoreModulesLatestResponse { latest: unknown }
|
|
|
187
187
|
export interface GetStoreUsageReportingResponse { enabled: unknown }
|
|
188
188
|
export interface GetTaskRecommendationsForMeResponse { recommendations: unknown; count: unknown }
|
|
189
189
|
export interface GetTaskRecommendationsMineResponse { recommendations: unknown; count: unknown }
|
|
190
|
-
export interface GetTasksClaimableResponse {
|
|
190
|
+
export interface GetTasksClaimableResponse { by_goal?: unknown; claimable_total: unknown; claimable?: unknown; active_claims?: unknown }
|
|
191
191
|
export interface GetTasksIdCriteriaResponse { criteria: unknown }
|
|
192
192
|
export interface GetTasksIdDependenciesResponse { dependencies: unknown; dependents: unknown }
|
|
193
193
|
export interface GetTasksIdRecommendationsResponse { recommendations: unknown; count: unknown }
|
package/docs/api/openapi.json
CHANGED
|
@@ -28773,14 +28773,13 @@
|
|
|
28773
28773
|
"GetTasksClaimableResponse": {
|
|
28774
28774
|
"type": "object",
|
|
28775
28775
|
"properties": {
|
|
28776
|
-
"
|
|
28776
|
+
"by_goal": {},
|
|
28777
28777
|
"claimable_total": {},
|
|
28778
|
+
"claimable": {},
|
|
28778
28779
|
"active_claims": {}
|
|
28779
28780
|
},
|
|
28780
28781
|
"required": [
|
|
28781
|
-
"
|
|
28782
|
-
"claimable_total",
|
|
28783
|
-
"active_claims"
|
|
28782
|
+
"claimable_total"
|
|
28784
28783
|
]
|
|
28785
28784
|
},
|
|
28786
28785
|
"GetTasksIdCriteriaResponse": {
|
package/docs/copy-inventory.md
CHANGED
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
> Deterministic on a given tree — regenerate and commit rather than hand-editing.
|
|
5
5
|
> Machine-readable twin: [`copy-registry.json`](copy-registry.json).
|
|
6
6
|
|
|
7
|
-
**
|
|
7
|
+
**2760 strings** across 3 surfaces · 2338 distinct pieces of copy · 2760 certain, 0 heuristic · 242 shown in more than one place.
|
|
8
8
|
|
|
9
9
|
## Surfaces
|
|
10
10
|
|
|
11
11
|
| surface | lives at | files | strings |
|
|
12
12
|
|---|---|---|---|
|
|
13
|
-
| `builders-hall` | `modules/hall-ui/public` | 146 |
|
|
13
|
+
| `builders-hall` | `modules/hall-ui/public` | 146 | 1952 |
|
|
14
14
|
| `status-dashboard` | `modules/status-ui/public` | 4 | 100 |
|
|
15
15
|
| `landing` | `modules/public-landing/public` | 9 | 708 |
|
|
16
16
|
|
|
@@ -78,7 +78,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
78
78
|
| `8226c979db4d` | 3x | Not now | modules/hall-ui/public/collab.js:668, modules/hall-ui/public/paintbrush.js:119, modules/hall-ui/public/paintbrush.js:183 |
|
|
79
79
|
| … | | _202 more in the JSON registry_ | |
|
|
80
80
|
|
|
81
|
-
## `builders-hall` —
|
|
81
|
+
## `builders-hall` — 1952 strings
|
|
82
82
|
|
|
83
83
|
| id | conf | text | where |
|
|
84
84
|
|---|---|---|---|
|
|
@@ -238,7 +238,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
238
238
|
| `118026595c16` | certain | Board Room | `modules/hall-ui/public/board-room.html:31` |
|
|
239
239
|
| `2b8ad43383de` | certain | Board Room — {{worldName}} | `modules/hall-ui/public/board-room.html:6` |
|
|
240
240
|
| `2b8ad43383de` | certain | Board Room — {{worldName}} | `modules/hall-ui/public/board-room.html:6` |
|
|
241
|
-
| `da910fee01d7` | certain | Browse goals → | `modules/hall-ui/public/goals.js:
|
|
241
|
+
| `da910fee01d7` | certain | Browse goals → | `modules/hall-ui/public/goals.js:100` |
|
|
242
242
|
| `25b4ab94728a` | certain | Build from your own machine — get a copy of the project, sign in once, then work in Claude. | `modules/hall-ui/public/hall-render.js:813` |
|
|
243
243
|
| `08bfcc9198ba` | certain | Builder id | `modules/hall-ui/public/government.html:109` |
|
|
244
244
|
| `fd1903586e8e` | certain | Builders hall · this session | `modules/hall-ui/public/craft-mode.js:810` |
|
|
@@ -579,10 +579,10 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
579
579
|
| `6f0deb0b667d` | certain | Goal {…} added. | `modules/hall-ui/public/gate.js:480` |
|
|
580
580
|
| `8a421ae268e6` | certain | Goal {…} removed. | `modules/hall-ui/public/gate.js:504` |
|
|
581
581
|
| `e0bc28d10785` | certain | Goals could not be loaded. Refresh to try again. | `modules/hall-ui/public/goals-page.js:895` |
|
|
582
|
-
| `4517f2253d0f` | certain | Goals couldn’t be loaded just now. Refresh to try again. | `modules/hall-ui/public/goals.js:
|
|
582
|
+
| `4517f2253d0f` | certain | Goals couldn’t be loaded just now. Refresh to try again. | `modules/hall-ui/public/goals.js:144` |
|
|
583
583
|
| `6a85997bda21` | certain | Goals created | `modules/hall-ui/public/profile.html:154` |
|
|
584
584
|
| `6bbd703b5aad` | certain | Goals it can work on | `modules/hall-ui/public/gate.js:376` |
|
|
585
|
-
| `2ed2cb8fbffd` | certain | Goals page | `modules/hall-ui/public/goals.js:
|
|
585
|
+
| `2ed2cb8fbffd` | certain | Goals page | `modules/hall-ui/public/goals.js:111` |
|
|
586
586
|
| `320a0516a33e` | certain | Goals seeded — awaiting kickoff | `modules/hall-ui/public/roadmap.js:271` |
|
|
587
587
|
| `bba4caf837e9` | certain | Goals — {{worldName}} | `modules/hall-ui/public/goals.html:6` |
|
|
588
588
|
| `bba4caf837e9` | certain | Goals — {{worldName}} | `modules/hall-ui/public/goals.html:6` |
|
|
@@ -737,7 +737,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
737
737
|
| `af8ea41cdf53` | certain | Loading the terminal commands… | `modules/hall-ui/public/commands.html:46` |
|
|
738
738
|
| `1dffb93947f2` | certain | Loading this project’s skills… | `modules/hall-ui/public/settings.html:308` |
|
|
739
739
|
| `d28d321e8a1e` | certain | Loading versions… | `modules/hall-ui/public/task-detail.js:418` |
|
|
740
|
-
| `3c43f157035e` | certain | Loading your goals… | `modules/hall-ui/public/goals.js:
|
|
740
|
+
| `3c43f157035e` | certain | Loading your goals… | `modules/hall-ui/public/goals.js:112` |
|
|
741
741
|
| `7a239a17afc8` | certain | Loading your preferences… | `modules/hall-ui/public/settings.html:35` |
|
|
742
742
|
| `04df1bd30129` | certain | Loading your rank… | `modules/hall-ui/public/ranks.html:30` |
|
|
743
743
|
| `c27711f9eb4d` | certain | Locked until you reach the end of the article above. | `modules/hall-ui/public/primer.html:103` |
|
|
@@ -888,6 +888,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
888
888
|
| `c404f22d7892` | certain | Noted on the review — it stays open. | `modules/hall-ui/public/studio.js:423` |
|
|
889
889
|
| `1376762e97db` | certain | Nothing anyone asked of you has been settled yet. | `modules/hall-ui/public/collab.html:125` |
|
|
890
890
|
| `cd652d04d616` | certain | Nothing changes yet. This files a task carrying your wording; whoever claims it lands the diff, and it ships g | `modules/hall-ui/public/copy-desk.html:168` |
|
|
891
|
+
| `65434cfeb080` | certain | Nothing claimable right now | `modules/hall-ui/public/goals.js:71` |
|
|
891
892
|
| `b4b8ed14e704` | certain | Nothing explored yet. Pick a starting point in the sky. | `modules/hall-ui/public/sky-panel.js:134` |
|
|
892
893
|
| `fec5d78497e8` | certain | Nothing in the backlog right now. | `modules/hall-ui/public/work.js:817` |
|
|
893
894
|
| `905e99f158c2` | certain | Nothing is discarded by omission: every task needs a decision before this can be submitted. Abandoning stamps | `modules/hall-ui/public/goals-render.js:1032` |
|
|
@@ -944,7 +945,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
944
945
|
| `ec2a3a90b788` | certain | Open your account page | `modules/hall-ui/public/settings.html:110` |
|
|
945
946
|
| `f6f68ba322be` | certain | Open {…} | `modules/hall-ui/public/goal-inbox.js:53` |
|
|
946
947
|
| `f6f68ba322be` | certain | Open {…} | `modules/hall-ui/public/goal-inbox.js:69` |
|
|
947
|
-
| `f6f68ba322be` | certain | Open {…} | `modules/hall-ui/public/goals.js:
|
|
948
|
+
| `f6f68ba322be` | certain | Open {…} | `modules/hall-ui/public/goals.js:84` |
|
|
948
949
|
| `35d46f963cd1` | certain | Opening the doc… | `modules/hall-ui/public/page-notes.js:279` |
|
|
949
950
|
| `7a8dfadb7468` | certain | Opening the rendered page… | `modules/hall-ui/public/approval-queue.js:129` |
|
|
950
951
|
| `62e75a9d0af4` | certain | Opening the reviews… | `modules/hall-ui/public/studio.html:171` |
|
|
@@ -1326,6 +1327,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1326
1327
|
| `82479c539fca` | certain | The name shown beside your work — in the roster, the leaderboard, and the work feed. Your sign-in and the cred | `modules/hall-ui/public/settings.html:78` |
|
|
1327
1328
|
| `4b20ecf5528b` | certain | The next page could not be read. | `modules/hall-ui/public/tweak-editor.js:575` |
|
|
1328
1329
|
| `b88dd8b96b72` | certain | The next person to notice this sentence reads your note instead of re-litigating it. | `modules/hall-ui/public/copy-desk.html:135` |
|
|
1330
|
+
| `0a98e249b324` | certain | The open goals you’ve joined, and the work you can claim in each. Browse, join, and leave goals — and read the | `modules/hall-ui/public/goals.js:111` |
|
|
1329
1331
|
| `329a1d350f07` | certain | The page changed after your draft was saved, so the draft is not shown over its new words. Rewrite the lines a | `modules/hall-ui/public/tweak-editor.js:310` |
|
|
1330
1332
|
| `aa716f3dd551` | certain | The page could not be loaded. Try again. | `modules/hall-ui/public/builders.js:1467` |
|
|
1331
1333
|
| `28e0c1457b08` | certain | The page is in. | `modules/hall-ui/public/tweak-editor.html:96` |
|
|
@@ -1354,7 +1356,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1354
1356
|
| `e48a9b77d91b` | certain | The session log opens from a higher rank. | `modules/hall-ui/public/sessions.html:41` |
|
|
1355
1357
|
| `af664a644b13` | certain | The seven government structures, for getting a team up to speed before deciding when to flip a switch. | `modules/hall-ui/public/government.js:847` |
|
|
1356
1358
|
| `6360a5988f26` | certain | The shape and health of the codebase. | `modules/hall-ui/public/watch.html:108` |
|
|
1357
|
-
| `fc422cced9e3` | certain | The shared goals you’ve joined. Browse, join, and leave goals — and read their criteria — on the | `modules/hall-ui/public/goals.js:94` |
|
|
1358
1359
|
| `ac46dc53d95f` | certain | The shared repository the core ships and the modules this project built for itself, each credited to its autho | `modules/hall-ui/public/modules.html:50` |
|
|
1359
1360
|
| `282638f26534` | certain | The six readings | `modules/hall-ui/public/street.html:204` |
|
|
1360
1361
|
| `5f631f51f29e` | certain | The skill list could not be loaded. Reload the page to try again. | `modules/hall-ui/public/settings.js:127` |
|
|
@@ -1573,7 +1574,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1573
1574
|
| `b91183c02c63` | certain | You created this task, but someone is holding a claim on it. Once that is released you can retire it yourself. | `modules/hall-ui/public/task.js:783` |
|
|
1574
1575
|
| `da274462bb30` | certain | You have no open asks. | `modules/hall-ui/public/collab.html:72` |
|
|
1575
1576
|
| `6b759151f722` | certain | You have reached the end. The button below is now active. | `modules/hall-ui/public/primer.js:309` |
|
|
1576
|
-
| `
|
|
1577
|
+
| `044387a6f90c` | certain | You haven’t joined any open goals. | `modules/hall-ui/public/goals.js:100` |
|
|
1577
1578
|
| `8e527ab12334` | certain | You {…}. One vote per member. | `modules/hall-ui/public/board-room.js:451` |
|
|
1578
1579
|
| `8e1915b19274` | certain | You're in the {…} server with your rank role. | `modules/hall-ui/public/settings.js:716` |
|
|
1579
1580
|
| `56cfdcc60079` | certain | You're not signed in yet. Sign in to manage your connections, your keys and the way the hall behaves. | `modules/hall-ui/public/settings.html:44` |
|
|
@@ -1938,7 +1939,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1938
1939
|
| `73c1372b43d9` | certain | {…} of {…} | `modules/hall-ui/public/sky-panel.js:120` |
|
|
1939
1940
|
| `cc5106af4b35` | certain | {…} of {…} criteria satisfied | `modules/hall-ui/public/goals-lib.js:32` |
|
|
1940
1941
|
| `cc5106af4b35` | certain | {…} of {…} criteria satisfied | `modules/hall-ui/public/goals-render.js:701` |
|
|
1941
|
-
| `cc5106af4b35` | certain | {…} of {…} criteria satisfied | `modules/hall-ui/public/goals.js:
|
|
1942
|
+
| `cc5106af4b35` | certain | {…} of {…} criteria satisfied | `modules/hall-ui/public/goals.js:55` |
|
|
1942
1943
|
| `c3d9687e2375` | certain | {…} of {…} shipped | `modules/hall-ui/public/profile.js:671` |
|
|
1943
1944
|
| `f32710d0ef37` | certain | {…} of {…} steps cleared. | `modules/hall-ui/public/hall-render.js:985` |
|
|
1944
1945
|
| `f5e456c3aaf6` | certain | {…} of {…} turned on. Each one, in a line: | `modules/hall-ui/public/settings-specialities.js:152` |
|
|
@@ -1952,6 +1953,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1952
1953
|
| `e08fa22622f0` | certain | {…} shipped, {…} confirmed, {…} completed, {…} remaining of {…} | `modules/hall-ui/public/roadmap.js:351` |
|
|
1953
1954
|
| `5d79bba0d667` | certain | {…} task {…} on live work — {…}. Sequence them before two builders collide. | `modules/hall-ui/public/goal-inbox.js:112` |
|
|
1954
1955
|
| `ad27ae9f5433` | certain | {…} tasks · {…} | `modules/hall-ui/public/roadmap.js:477` |
|
|
1956
|
+
| `db8f35bfcb4f` | certain | {…} task{…} you can claim | `modules/hall-ui/public/goals.js:72` |
|
|
1955
1957
|
| `955499559f0a` | certain | {…} tokens | `modules/hall-ui/public/sessions.js:173` |
|
|
1956
1958
|
| `8e28c14b106d` | certain | {…} total | `modules/hall-ui/public/roadmap.js:120` |
|
|
1957
1959
|
| `1a8a6267e490` | certain | {…} unfinished task{…} — say what happens to each | `modules/hall-ui/public/goals-render.js:1032` |
|
package/docs/copy-registry.json
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
"generator": "scripts/gds/copy-inventory.js",
|
|
4
4
|
"goal": 1000074,
|
|
5
5
|
"counts": {
|
|
6
|
-
"strings":
|
|
7
|
-
"unique_ids":
|
|
8
|
-
"certain":
|
|
6
|
+
"strings": 2760,
|
|
7
|
+
"unique_ids": 2338,
|
|
8
|
+
"certain": 2760,
|
|
9
9
|
"heuristic": 0,
|
|
10
10
|
"duplicate_ids": 242
|
|
11
11
|
},
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"builders-hall": {
|
|
14
14
|
"at": "modules/hall-ui/public",
|
|
15
15
|
"files": 146,
|
|
16
|
-
"strings":
|
|
16
|
+
"strings": 1952
|
|
17
17
|
},
|
|
18
18
|
"status-dashboard": {
|
|
19
19
|
"at": "modules/status-ui/public",
|
|
@@ -613,7 +613,7 @@
|
|
|
613
613
|
"at": [
|
|
614
614
|
"modules/hall-ui/public/goal-inbox.js:53",
|
|
615
615
|
"modules/hall-ui/public/goal-inbox.js:69",
|
|
616
|
-
"modules/hall-ui/public/goals.js:
|
|
616
|
+
"modules/hall-ui/public/goals.js:84"
|
|
617
617
|
]
|
|
618
618
|
},
|
|
619
619
|
{
|
|
@@ -734,7 +734,7 @@
|
|
|
734
734
|
"at": [
|
|
735
735
|
"modules/hall-ui/public/goals-lib.js:32",
|
|
736
736
|
"modules/hall-ui/public/goals-render.js:701",
|
|
737
|
-
"modules/hall-ui/public/goals.js:
|
|
737
|
+
"modules/hall-ui/public/goals.js:55"
|
|
738
738
|
]
|
|
739
739
|
},
|
|
740
740
|
{
|
|
@@ -4049,7 +4049,7 @@
|
|
|
4049
4049
|
"surface": "builders-hall",
|
|
4050
4050
|
"text": "Browse goals →",
|
|
4051
4051
|
"file": "modules/hall-ui/public/goals.js",
|
|
4052
|
-
"line":
|
|
4052
|
+
"line": 100,
|
|
4053
4053
|
"origin": "js-markup",
|
|
4054
4054
|
"confidence": "certain"
|
|
4055
4055
|
},
|
|
@@ -7118,7 +7118,7 @@
|
|
|
7118
7118
|
"surface": "builders-hall",
|
|
7119
7119
|
"text": "Goals couldn’t be loaded just now. Refresh to try again.",
|
|
7120
7120
|
"file": "modules/hall-ui/public/goals.js",
|
|
7121
|
-
"line":
|
|
7121
|
+
"line": 144,
|
|
7122
7122
|
"origin": "js-markup",
|
|
7123
7123
|
"confidence": "certain"
|
|
7124
7124
|
},
|
|
@@ -7145,7 +7145,7 @@
|
|
|
7145
7145
|
"surface": "builders-hall",
|
|
7146
7146
|
"text": "Goals page",
|
|
7147
7147
|
"file": "modules/hall-ui/public/goals.js",
|
|
7148
|
-
"line":
|
|
7148
|
+
"line": 111,
|
|
7149
7149
|
"origin": "js-markup",
|
|
7150
7150
|
"confidence": "certain"
|
|
7151
7151
|
},
|
|
@@ -8540,7 +8540,7 @@
|
|
|
8540
8540
|
"surface": "builders-hall",
|
|
8541
8541
|
"text": "Loading your goals…",
|
|
8542
8542
|
"file": "modules/hall-ui/public/goals.js",
|
|
8543
|
-
"line":
|
|
8543
|
+
"line": 112,
|
|
8544
8544
|
"origin": "js-markup",
|
|
8545
8545
|
"confidence": "certain"
|
|
8546
8546
|
},
|
|
@@ -9894,6 +9894,15 @@
|
|
|
9894
9894
|
"origin": "html-text",
|
|
9895
9895
|
"confidence": "certain"
|
|
9896
9896
|
},
|
|
9897
|
+
{
|
|
9898
|
+
"id": "65434cfeb080",
|
|
9899
|
+
"surface": "builders-hall",
|
|
9900
|
+
"text": "Nothing claimable right now",
|
|
9901
|
+
"file": "modules/hall-ui/public/goals.js",
|
|
9902
|
+
"line": 71,
|
|
9903
|
+
"origin": "js-markup",
|
|
9904
|
+
"confidence": "certain"
|
|
9905
|
+
},
|
|
9897
9906
|
{
|
|
9898
9907
|
"id": "b4b8ed14e704",
|
|
9899
9908
|
"surface": "builders-hall",
|
|
@@ -10403,7 +10412,7 @@
|
|
|
10403
10412
|
"surface": "builders-hall",
|
|
10404
10413
|
"text": "Open {…}",
|
|
10405
10414
|
"file": "modules/hall-ui/public/goals.js",
|
|
10406
|
-
"line":
|
|
10415
|
+
"line": 84,
|
|
10407
10416
|
"origin": "js-markup",
|
|
10408
10417
|
"confidence": "certain"
|
|
10409
10418
|
},
|
|
@@ -13836,6 +13845,15 @@
|
|
|
13836
13845
|
"origin": "html-text",
|
|
13837
13846
|
"confidence": "certain"
|
|
13838
13847
|
},
|
|
13848
|
+
{
|
|
13849
|
+
"id": "0a98e249b324",
|
|
13850
|
+
"surface": "builders-hall",
|
|
13851
|
+
"text": "The open goals you’ve joined, and the work you can claim in each. Browse, join, and leave goals — and read their criteria — on the",
|
|
13852
|
+
"file": "modules/hall-ui/public/goals.js",
|
|
13853
|
+
"line": 111,
|
|
13854
|
+
"origin": "js-markup",
|
|
13855
|
+
"confidence": "certain"
|
|
13856
|
+
},
|
|
13839
13857
|
{
|
|
13840
13858
|
"id": "329a1d350f07",
|
|
13841
13859
|
"surface": "builders-hall",
|
|
@@ -14088,15 +14106,6 @@
|
|
|
14088
14106
|
"origin": "html-text",
|
|
14089
14107
|
"confidence": "certain"
|
|
14090
14108
|
},
|
|
14091
|
-
{
|
|
14092
|
-
"id": "fc422cced9e3",
|
|
14093
|
-
"surface": "builders-hall",
|
|
14094
|
-
"text": "The shared goals you’ve joined. Browse, join, and leave goals — and read their criteria — on the",
|
|
14095
|
-
"file": "modules/hall-ui/public/goals.js",
|
|
14096
|
-
"line": 94,
|
|
14097
|
-
"origin": "js-markup",
|
|
14098
|
-
"confidence": "certain"
|
|
14099
|
-
},
|
|
14100
14109
|
{
|
|
14101
14110
|
"id": "ac46dc53d95f",
|
|
14102
14111
|
"surface": "builders-hall",
|
|
@@ -16060,11 +16069,11 @@
|
|
|
16060
16069
|
"confidence": "certain"
|
|
16061
16070
|
},
|
|
16062
16071
|
{
|
|
16063
|
-
"id": "
|
|
16072
|
+
"id": "044387a6f90c",
|
|
16064
16073
|
"surface": "builders-hall",
|
|
16065
|
-
"text": "You haven’t joined any goals
|
|
16074
|
+
"text": "You haven’t joined any open goals.",
|
|
16066
16075
|
"file": "modules/hall-ui/public/goals.js",
|
|
16067
|
-
"line":
|
|
16076
|
+
"line": 100,
|
|
16068
16077
|
"origin": "js-markup",
|
|
16069
16078
|
"confidence": "certain"
|
|
16070
16079
|
},
|
|
@@ -19349,7 +19358,7 @@
|
|
|
19349
19358
|
"surface": "builders-hall",
|
|
19350
19359
|
"text": "{…} of {…} criteria satisfied",
|
|
19351
19360
|
"file": "modules/hall-ui/public/goals.js",
|
|
19352
|
-
"line":
|
|
19361
|
+
"line": 55,
|
|
19353
19362
|
"origin": "js-markup",
|
|
19354
19363
|
"confidence": "certain"
|
|
19355
19364
|
},
|
|
@@ -19470,6 +19479,15 @@
|
|
|
19470
19479
|
"origin": "js-markup",
|
|
19471
19480
|
"confidence": "certain"
|
|
19472
19481
|
},
|
|
19482
|
+
{
|
|
19483
|
+
"id": "db8f35bfcb4f",
|
|
19484
|
+
"surface": "builders-hall",
|
|
19485
|
+
"text": "{…} task{…} you can claim",
|
|
19486
|
+
"file": "modules/hall-ui/public/goals.js",
|
|
19487
|
+
"line": 72,
|
|
19488
|
+
"origin": "js-markup",
|
|
19489
|
+
"confidence": "certain"
|
|
19490
|
+
},
|
|
19473
19491
|
{
|
|
19474
19492
|
"id": "955499559f0a",
|
|
19475
19493
|
"surface": "builders-hall",
|
|
@@ -3117,5 +3117,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
3117
3117
|
landed since 1.21.138 with no explicit bump. run 38927010049. (task 1002620)
|
|
3118
3118
|
1.21.140 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3119
3119
|
landed since 1.21.139 with no explicit bump. run 38941756016. (task 1002620)
|
|
3120
|
+
1.21.141 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3121
|
+
landed since 1.21.140 with no explicit bump. run 39003470982. (task 1002620)
|
|
3120
3122
|
---------------------------------------------------------------------------
|
|
3121
3123
|
```
|
package/docs/page-readings.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"adr": "0341 D3",
|
|
6
6
|
"reread": "node scripts/gds/page-reader.js --stale",
|
|
7
7
|
"how": ["Generated by node scripts/gds/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":46,"lines":5551,"placed":1701,"shared":398,"unplaced":3452,"omitted_data":
|
|
8
|
+
"counts": {"pages":46,"lines":5551,"placed":1701,"shared":398,"unplaced":3452,"omitted_data":3575},
|
|
9
9
|
"pages": [
|
|
10
10
|
{
|
|
11
11
|
"id": "builders:atlas",
|
|
@@ -1439,10 +1439,10 @@
|
|
|
1439
1439
|
"surface": "builders",
|
|
1440
1440
|
"title": "Builders' Hall",
|
|
1441
1441
|
"states_read": ["home","standing","standing-karma","out","founding","genesis","decide","demo"],
|
|
1442
|
-
"files_hash": "
|
|
1443
|
-
"reading_hash": "
|
|
1442
|
+
"files_hash": "96338f028ee183da",
|
|
1443
|
+
"reading_hash": "6ba0ac4c30cc2d79",
|
|
1444
1444
|
"counts": {"lines":283,"placed":77,"shared":10,"unplaced":196},
|
|
1445
|
-
"omitted": {"data":
|
|
1445
|
+
"omitted": {"data":216},
|
|
1446
1446
|
"notes": ["founding: an action failed (page.focus: Timeout 6000ms exceeded.); read as it stood"],
|
|
1447
1447
|
"lines": [
|
|
1448
1448
|
{"key":"L0001","section":"skip link","text":"Skip to content","placement":"shared","file":"modules/hall-ui/public/shell.js","line":860,"string_id":"87cee78ca134"},
|
|
@@ -1454,23 +1454,23 @@
|
|
|
1454
1454
|
{"key":"L0007","section":"top bar","text":"Building","placement":"shared"},
|
|
1455
1455
|
{"key":"L0008","section":"top bar","text":"Artistry","placement":"shared"},
|
|
1456
1456
|
{"key":"L0009","section":"top bar","text":"Ideating","placement":"shared"},
|
|
1457
|
-
{"key":"L0010","section":"Good
|
|
1458
|
-
{"key":"L0011","section":"Good
|
|
1459
|
-
{"key":"L0012","section":"Good
|
|
1460
|
-
{"key":"L0013","section":"Good
|
|
1461
|
-
{"key":"L0014","section":"Good
|
|
1462
|
-
{"key":"L0015","section":"Good
|
|
1463
|
-
{"key":"L0016","section":"Good
|
|
1464
|
-
{"key":"L0017","section":"Good
|
|
1465
|
-
{"key":"L0018","section":"Good
|
|
1466
|
-
{"key":"L0019","section":"Good
|
|
1467
|
-
{"key":"L0020","section":"Good
|
|
1468
|
-
{"key":"L0021","section":"Good
|
|
1469
|
-
{"key":"L0022","section":"Good
|
|
1470
|
-
{"key":"L0023","section":"Good
|
|
1471
|
-
{"key":"L0024","section":"Good
|
|
1472
|
-
{"key":"L0025","section":"Good
|
|
1473
|
-
{"key":"L0026","section":"Good
|
|
1457
|
+
{"key":"L0010","section":"Good morning, {…}","text":"Good morning, {…}","placement":"unplaced"},
|
|
1458
|
+
{"key":"L0011","section":"Good morning, {…}","text":"{…} is 83 percent {…}. 150 tasks are claimable right now.","placement":"unplaced"},
|
|
1459
|
+
{"key":"L0012","section":"Good morning, {…}","text":"Work","placement":"unplaced","state":"standing"},
|
|
1460
|
+
{"key":"L0013","section":"Good morning, {…}","text":"Credits","placement":"unplaced"},
|
|
1461
|
+
{"key":"L0014","section":"Good morning, {…}","text":"Shipped","placement":"placed","file":"modules/hall-ui/public/task.js","line":677,"string_id":"0c0a50ba1666"},
|
|
1462
|
+
{"key":"L0015","section":"Good morning, {…}","text":"Karma","placement":"unplaced"},
|
|
1463
|
+
{"key":"L0016","section":"Good morning, {…}","text":"Achievements","placement":"unplaced","state":"standing"},
|
|
1464
|
+
{"key":"L0017","section":"Good morning, {…}","text":"Rebase owed — new claims paused","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":564,"string_id":"06cbba1440b1","state":"standing"},
|
|
1465
|
+
{"key":"L0018","section":"Good morning, {…}","text":"— {…} confirmed {…} can't land yet, so {…} reward is pending (it lands on ship). Rebase + re-ship or release {…}: {…}.","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":564,"string_id":"68b547166d48","state":"standing"},
|
|
1466
|
+
{"key":"L0019","section":"Good morning, {…}","text":"+11 in 30d","placement":"unplaced"},
|
|
1467
|
+
{"key":"L0020","section":"Good morning, {…}","text":"Rank","placement":"unplaced"},
|
|
1468
|
+
{"key":"L0021","section":"Good morning, {…}","text":"Member since {…}","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":569,"string_id":"df335a1224ae","state":"standing"},
|
|
1469
|
+
{"key":"L0022","section":"Good morning, {…}","text":"+11 karma in 30d","placement":"unplaced","state":"standing"},
|
|
1470
|
+
{"key":"L0023","section":"Good morning, {…}","text":"Preferred work:","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":584,"string_id":"ed8edd684547","state":"standing"},
|
|
1471
|
+
{"key":"L0024","section":"Good morning, {…}","text":"{…}, {…}, {…}, ui","placement":"unplaced","state":"standing"},
|
|
1472
|
+
{"key":"L0025","section":"Good morning, {…}","text":"Change in Settings →","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":584,"string_id":"0279db21e29a","state":"standing"},
|
|
1473
|
+
{"key":"L0026","section":"Good morning, {…}","text":"karma","placement":"unplaced","state":"standing"},
|
|
1474
1474
|
{"key":"L0027","section":"Standing","text":"Standing","placement":"unplaced"},
|
|
1475
1475
|
{"key":"L0028","section":"Standing","text":"Credits","placement":"unplaced"},
|
|
1476
1476
|
{"key":"L0029","section":"Standing","text":"On the board","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":633,"string_id":"11a1905c76b2"},
|
|
@@ -1478,10 +1478,10 @@
|
|
|
1478
1478
|
{"key":"L0031","section":"Standing","text":"{…}, {…}, {…}, ui","placement":"unplaced"},
|
|
1479
1479
|
{"key":"L0032","section":"Standing","text":"View full standing →","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":86,"string_id":"4babdfeaf27f"},
|
|
1480
1480
|
{"key":"L0033","section":"Goals","text":"Goals","placement":"unplaced"},
|
|
1481
|
-
{"key":"L0034","section":"Goals","text":"The
|
|
1482
|
-
{"key":"L0035","section":"Goals","text":"Goals page","placement":"placed","file":"modules/hall-ui/public/goals.js","line":
|
|
1483
|
-
{"key":"L0036","section":"Goals","text":"You haven’t joined any goals
|
|
1484
|
-
{"key":"L0037","section":"Goals","text":"Browse goals →","placement":"placed","file":"modules/hall-ui/public/goals.js","line":
|
|
1481
|
+
{"key":"L0034","section":"Goals","text":"The open goals you’ve joined, and the work you can claim in each. Browse, join, and leave goals — and read their criteria — on the","placement":"placed","file":"modules/hall-ui/public/goals.js","line":111,"string_id":"0a98e249b324"},
|
|
1482
|
+
{"key":"L0035","section":"Goals","text":"Goals page","placement":"placed","file":"modules/hall-ui/public/goals.js","line":111,"string_id":"2ed2cb8fbffd"},
|
|
1483
|
+
{"key":"L0036","section":"Goals","text":"You haven’t joined any open goals.","placement":"placed","file":"modules/hall-ui/public/goals.js","line":100,"string_id":"044387a6f90c"},
|
|
1484
|
+
{"key":"L0037","section":"Goals","text":"Browse goals →","placement":"placed","file":"modules/hall-ui/public/goals.js","line":100,"string_id":"da910fee01d7"},
|
|
1485
1485
|
{"key":"L0038","section":"Needs your attention13","text":"Needs your attention","placement":"placed","file":"modules/hall-ui/public/goal-inbox.js","line":597,"string_id":"7def635421ea"},
|
|
1486
1486
|
{"key":"L0039","section":"From the system","text":"From the system","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":711,"string_id":"d32c5e058d1e"},
|
|
1487
1487
|
{"key":"L0040","section":"From the system","text":"Rebase owed","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":680,"string_id":"4f619c19a8e7"},
|
|
@@ -30,6 +30,16 @@
|
|
|
30
30
|
return res.data;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
const isOpenGoal = (g) => !!g && g.status === 'open';
|
|
34
|
+
|
|
35
|
+
// goal id -> how many claimable tasks it holds. The server counts (?group=goal
|
|
36
|
+
// returns counts and no rows), so this card never downloads the feed itself.
|
|
37
|
+
function claimableByGoal(byGoal) {
|
|
38
|
+
const counts = new Map();
|
|
39
|
+
for (const [k, n] of Object.entries(byGoal || {})) counts.set(String(k), Number(n) || 0);
|
|
40
|
+
return counts;
|
|
41
|
+
}
|
|
42
|
+
|
|
33
43
|
let host = null;
|
|
34
44
|
let myId = null;
|
|
35
45
|
const sameId = (a, b) => a != null && b != null && String(a) === String(b);
|
|
@@ -55,7 +65,14 @@
|
|
|
55
65
|
return `<span class="goal-badge ${cls}">${escapeHtml(status)}</span>`;
|
|
56
66
|
}
|
|
57
67
|
|
|
58
|
-
|
|
68
|
+
// task 1004755: the claimable count rides under each open goal, so the card
|
|
69
|
+
// leads with the builder's open goals and shows the work waiting in each.
|
|
70
|
+
function claimableLine(n) {
|
|
71
|
+
if (!n) return '<span class="goal-mine__work card-foot">Nothing claimable right now</span>';
|
|
72
|
+
return `<span class="goal-mine__work card-foot">${n} task${n === 1 ? '' : 's'} you can claim</span>`;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function row(detail, counts) {
|
|
59
76
|
const g = detail.goal;
|
|
60
77
|
const crit = Array.isArray(detail.criteria) ? detail.criteria : [];
|
|
61
78
|
const sat = crit.filter((c) => c.satisfied).length;
|
|
@@ -68,7 +85,7 @@
|
|
|
68
85
|
<a class="goal-mine__link" href="${href}" title="Open ${escapeHtml(g.title || 'goal')}"
|
|
69
86
|
style="flex:1;display:flex;align-items:center;gap:12px;min-width:0;color:inherit;text-decoration:none;">
|
|
70
87
|
<span class="goal-mine__ring">${ring(sat, crit.length, achieved)}</span>
|
|
71
|
-
<span class="goal-mine__title">${escapeHtml(g.title || 'Untitled goal')}</span>
|
|
88
|
+
<span class="goal-mine__title" style="display:flex;flex-direction:column;min-width:0;">${escapeHtml(g.title || 'Untitled goal')}${claimableLine((counts && counts.get(String(g.id))) || 0)}</span>
|
|
72
89
|
<span class="goal-mine__meta"><span class="goal-mine__ver">${escapeHtml(g.version_id || '')}</span>${statusBadge(g.status)}</span>
|
|
73
90
|
</a>
|
|
74
91
|
</li>`;
|
|
@@ -77,21 +94,21 @@
|
|
|
77
94
|
// task 2184 (Home rule: a summary card never lists more than 5 rows): cap the
|
|
78
95
|
// joined-goals list; the overflow count rides the "All goals" foot link.
|
|
79
96
|
const MAX_HOME_ROWS = 5;
|
|
80
|
-
function render(joined) {
|
|
97
|
+
function render(joined, counts) {
|
|
81
98
|
const body = host.querySelector('#goals-body');
|
|
82
99
|
if (!joined.length) {
|
|
83
|
-
body.innerHTML = '<p class="goal-empty">You haven’t joined any goals
|
|
100
|
+
body.innerHTML = '<p class="goal-empty">You haven’t joined any open goals. <a href="/goals">Browse goals →</a></p>';
|
|
84
101
|
return;
|
|
85
102
|
}
|
|
86
103
|
const shown = joined.slice(0, MAX_HOME_ROWS);
|
|
87
104
|
const more = joined.length - shown.length;
|
|
88
|
-
body.innerHTML = `<ul class="goal-mine-list">${shown.map(row).join('')}</ul>` +
|
|
105
|
+
body.innerHTML = `<ul class="goal-mine-list">${shown.map((d) => row(d, counts)).join('')}</ul>` +
|
|
89
106
|
`<p class="goal-mine__foot card-foot"><a href="/goals">${more > 0 ? `All ${joined.length} goals →` : 'All goals →'}</a></p>`;
|
|
90
107
|
}
|
|
91
108
|
|
|
92
109
|
const SKELETON =
|
|
93
110
|
'<h2 id="goals-h" class="scroll__h">Goals</h2>' +
|
|
94
|
-
'<p class="scroll__lede">The
|
|
111
|
+
'<p class="scroll__lede">The open goals you’ve joined, and the work you can claim in each. Browse, join, and leave goals — and read their criteria — on the <a href="/goals">Goals page</a>.</p>' +
|
|
95
112
|
'<div id="goals-body"><div class="profile__placeholder">Loading your goals…</div></div>';
|
|
96
113
|
|
|
97
114
|
async function load() {
|
|
@@ -107,12 +124,18 @@
|
|
|
107
124
|
// paint. boot() no longer mounts widgets for a signed-out visitor; this
|
|
108
125
|
// keeps the widget itself harmless if it is ever mounted without a session
|
|
109
126
|
// (an expired cookie mid-visit), where the honest answer is to say nothing.
|
|
127
|
+
// Started now, awaited after the goal reads, so the two run side by side.
|
|
128
|
+
const feedP = getJSON(`${API}/tasks/claimable?group=goal`, { softAuth: true }).catch(() => null);
|
|
110
129
|
const gres = await getJSON(`${API}/goals`, { softAuth: true });
|
|
111
|
-
|
|
130
|
+
// task 1004755: OPEN goals only. An achieved goal has no work left in it, and
|
|
131
|
+
// listing it here (it took slots in the five-row cap) pushed the goals with
|
|
132
|
+
// work waiting off the card.
|
|
133
|
+
const candidates = (gres.goals || []).filter(isOpenGoal);
|
|
112
134
|
const details = (await Promise.all(candidates.map((g) =>
|
|
113
135
|
getJSON(`${API}/goals/${encodeURIComponent(g.id)}`).catch(() => null)))).filter(Boolean);
|
|
114
136
|
const joined = details.filter((d) => (d.members || []).some((m) => sameId(m.builder_id, myId)));
|
|
115
|
-
|
|
137
|
+
const feed = await feedP;
|
|
138
|
+
render(joined, claimableByGoal(feed && feed.by_goal));
|
|
116
139
|
} catch (err) {
|
|
117
140
|
const body = host.querySelector('#goals-body');
|
|
118
141
|
// Signed out is not a failure — it is simply nothing to show. Only a real
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// claimable-counts.js — how much claimable work sits in each goal (task 1004755).
|
|
2
|
+
//
|
|
3
|
+
// Backs `GET /tasks/claimable?group=goal`, which the hall Home goals card reads to say
|
|
4
|
+
// "N tasks you can claim" under each open goal it lists. It counts the SAME filtered
|
|
5
|
+
// feed the route returns rows from, so a count and claimable_total cannot disagree,
|
|
6
|
+
// and it returns no rows, so a Home card never downloads the feed to count it.
|
|
7
|
+
// A row with no goal is not counted.
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
function claimableCountsByGoal(rows) {
|
|
11
|
+
const out = {};
|
|
12
|
+
for (const t of Array.isArray(rows) ? rows : []) {
|
|
13
|
+
if (!t || t.goal_id == null) continue;
|
|
14
|
+
out[t.goal_id] = (out[t.goal_id] || 0) + 1;
|
|
15
|
+
}
|
|
16
|
+
return out;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
module.exports = { claimableCountsByGoal };
|
|
@@ -29,6 +29,7 @@ const api = require('../../../src/module-api');
|
|
|
29
29
|
// depRefusalRow: the ONE shape a dependency refusal carries, shared with the claim
|
|
30
30
|
// path so promote and claim describe a blocked task identically (task 1003553).
|
|
31
31
|
const { depRefusalRow } = require('../dead-deps.js');
|
|
32
|
+
const { claimableCountsByGoal } = require('../claimable-counts');
|
|
32
33
|
// gradeQualityWhere: the ONE definition of a task_grades row that is an actual
|
|
33
34
|
// quality verdict rather than an outage or an errored worker (task 1002652).
|
|
34
35
|
// The acclaim feed reads it so a grader outage never reaches a voter as 0.0.
|
|
@@ -207,16 +208,13 @@ module.exports = function buildTasksRouter() {
|
|
|
207
208
|
if (fit && !VALID_FITS.has(fit)) {
|
|
208
209
|
return res.fail('bad_fit', 400, { valid: Array.from(VALID_FITS) });
|
|
209
210
|
}
|
|
210
|
-
// task 1003278 —
|
|
211
|
-
// feed at the SOURCE instead of downloading it and reducing it in the browser.
|
|
212
|
-
// Same validators as GET /tasks: one vocabulary, two surfaces.
|
|
211
|
+
// task 1003278 — creator + staleness at the SOURCE, with GET /tasks's validators.
|
|
213
212
|
const claimCreatedBy = parseCreatedBy(req.query.created_by);
|
|
214
213
|
if (claimCreatedBy && claimCreatedBy.bad) return res.fail('bad_created_by', { status: 400, message: CREATED_BY_MSG });
|
|
215
214
|
const claimStaleDays = posInt(req.query.stale_days, 'bad_stale_days', 3650);
|
|
216
215
|
if (claimStaleDays && claimStaleDays.bad) return res.fail('bad_stale_days', { status: 400, message: 'stale_days must be a positive integer number of days.' });
|
|
217
|
-
// ?limit=N — opt-in, for a caller that renders N rows (goal 1000072
|
|
218
|
-
//
|
|
219
|
-
// the RETURNED feed, never the query — lifecycle/CLAUDE.md has the why.
|
|
216
|
+
// ?limit=N — opt-in, for a caller that renders N rows (goal 1000072). It slices the
|
|
217
|
+
// RETURNED feed, never the query — lifecycle/CLAUDE.md has the why.
|
|
220
218
|
const claimLimit = posInt(req.query.limit, 'bad_limit', 1000);
|
|
221
219
|
if (claimLimit && claimLimit.bad) return res.fail('bad_limit', { status: 400, message: 'limit must be a positive integer (max 1000).' });
|
|
222
220
|
const [feed, active] = await Promise.all([
|
|
@@ -228,8 +226,11 @@ module.exports = function buildTasksRouter() {
|
|
|
228
226
|
createdBy: claimCreatedBy ?? null,
|
|
229
227
|
staleDays: claimStaleDays ?? null,
|
|
230
228
|
}),
|
|
231
|
-
db.listActiveClaims(),
|
|
229
|
+
req.query.group === 'goal' ? [] : db.listActiveClaims(),
|
|
232
230
|
]);
|
|
231
|
+
if (req.query.group === 'goal') { // counts only, no rows (task 1004755)
|
|
232
|
+
return res.json({ by_goal: claimableCountsByGoal(feed), claimable_total: feed.length });
|
|
233
|
+
}
|
|
233
234
|
const claimable = claimLimit ? feed.slice(0, claimLimit) : feed;
|
|
234
235
|
// V3.R75 (#294): tick the onboarding state machine for first_start. Fire
|
|
235
236
|
// and forget — the response should never wait on or fail because of the
|
|
@@ -237,9 +238,8 @@ module.exports = function buildTasksRouter() {
|
|
|
237
238
|
// graduation broadcast. Through the `onboarding` kernel port (BV1.R81 / ADR
|
|
238
239
|
// 0093 §1); ?. degrades to a no-op when the module is off.
|
|
239
240
|
seams.resolveOptional('onboarding')?.safeMarkStage(pool, req.builder.id, 'first_start', req.builder);
|
|
240
|
-
// `claimable_total`
|
|
241
|
-
//
|
|
242
|
-
// a second count query (that is how a total and its own list drift apart, ADR 0197).
|
|
241
|
+
// `claimable_total` keeps the limit honest: the length of the sliced array, never a
|
|
242
|
+
// second count query (ADR 0197).
|
|
243
243
|
res.json({ claimable, claimable_total: feed.length, active_claims: active });
|
|
244
244
|
});
|
|
245
245
|
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.21.
|
|
3
|
+
"version": "1.21.141",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.21.
|
|
9
|
+
"version": "1.21.141",
|
|
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.
|
|
3
|
+
"version": "1.21.141",
|
|
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
|
@@ -9842,5 +9842,11 @@
|
|
|
9842
9842
|
"id": "1004754",
|
|
9843
9843
|
"text": "Stopped a planned change that would have let anyone who signs in to a hosted project manage it. The design record now says sharing a project needs the owner to grant access on purpose; that design is filed as its own task."
|
|
9844
9844
|
}
|
|
9845
|
+
],
|
|
9846
|
+
"1.21.141": [
|
|
9847
|
+
{
|
|
9848
|
+
"id": "1004755",
|
|
9849
|
+
"text": "Your home page now lists only the goals you have joined that are still open, and under each one says how many tasks you can pick up. Finished goals no longer crowd them out."
|
|
9850
|
+
}
|
|
9845
9851
|
]
|
|
9846
9852
|
}
|
package/src/module-api.js
CHANGED
|
@@ -75,7 +75,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
|
|
|
75
75
|
// MAJOR (see allowBoxScope below): passes the request through untouched.
|
|
76
76
|
function deprecatedNoopMiddleware(_req, _res, next) { next(); }
|
|
77
77
|
|
|
78
|
-
const CORE_VERSION = '1.21.
|
|
78
|
+
const CORE_VERSION = '1.21.141'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
79
79
|
|
|
80
80
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
81
81
|
// Usage: const log = api.logger('discord'); log.info('mounted');
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// tests/hall_goals_open_first.mjs — the hall Home goals card leads with the OPEN
|
|
2
|
+
// goals the builder has joined, with the claimable work in each (task 1004755).
|
|
3
|
+
//
|
|
4
|
+
// The owner's acceptance test of criterion wa6-noise-limited found the card
|
|
5
|
+
// listing COMPLETED goals: it kept every non-archived goal, so achieved goals took
|
|
6
|
+
// slots in the five-row cap. This boots the real goals.js in a vm against a fake
|
|
7
|
+
// API and reads what it renders.
|
|
8
|
+
//
|
|
9
|
+
// Run: node tests/hall_goals_open_first.mjs
|
|
10
|
+
|
|
11
|
+
import { strict as assert } from 'node:assert';
|
|
12
|
+
import fs from 'node:fs';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
import vm from 'node:vm';
|
|
15
|
+
import { fileURLToPath } from 'node:url';
|
|
16
|
+
import { createRequire } from 'node:module';
|
|
17
|
+
import { makeRunner } from './helpers.mjs';
|
|
18
|
+
|
|
19
|
+
const require = createRequire(import.meta.url);
|
|
20
|
+
const { claimableCountsByGoal } = require('../modules/lifecycle/claimable-counts.js');
|
|
21
|
+
|
|
22
|
+
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
23
|
+
const SRC = fs.readFileSync(path.join(ROOT, 'modules/hall-ui/public/goals.js'), 'utf8');
|
|
24
|
+
const { test, summary } = makeRunner();
|
|
25
|
+
|
|
26
|
+
async function renderCard({ goals, members, claimable }) {
|
|
27
|
+
const body = { innerHTML: '' };
|
|
28
|
+
const host = { innerHTML: '', querySelector: () => body };
|
|
29
|
+
let widget = null;
|
|
30
|
+
const routes = (p) => {
|
|
31
|
+
if (p === '/api/bongos/me') return { builder: { id: 7 } };
|
|
32
|
+
if (p === '/api/bongos/goals') return { goals };
|
|
33
|
+
if (p === '/api/bongos/tasks/claimable?group=goal') {
|
|
34
|
+
return { by_goal: claimableCountsByGoal(claimable), claimable_total: claimable.length };
|
|
35
|
+
}
|
|
36
|
+
if (p.startsWith('/api/bongos/tasks/claimable')) throw new Error('the card must not download the claimable feed: ' + p);
|
|
37
|
+
const m = p.match(/^\/api\/bongos\/goals\/(\d+)$/);
|
|
38
|
+
if (m) {
|
|
39
|
+
const g = goals.find((x) => String(x.id) === m[1]);
|
|
40
|
+
return { goal: g, criteria: [], members: members[g.id] || [] };
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
};
|
|
44
|
+
const window = {
|
|
45
|
+
OTB: {
|
|
46
|
+
escapeHtml: (s) => String(s),
|
|
47
|
+
contributeHallWidget: (w) => { widget = w; },
|
|
48
|
+
},
|
|
49
|
+
BongosClient: {
|
|
50
|
+
createClient: () => ({
|
|
51
|
+
request: async (_m, p) => { const data = routes(p); return { status: data ? 200 : 404, ok: !!data, data }; },
|
|
52
|
+
}),
|
|
53
|
+
},
|
|
54
|
+
location: { assign() {} },
|
|
55
|
+
};
|
|
56
|
+
vm.runInNewContext(SRC, { window, console, Promise, Map, String, Array, Math, encodeURIComponent });
|
|
57
|
+
widget.mount(host);
|
|
58
|
+
for (let i = 0; i < 20; i++) await new Promise((r) => setImmediate(r));
|
|
59
|
+
return body.innerHTML;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const me = [{ builder_id: 7 }];
|
|
63
|
+
|
|
64
|
+
await test('an achieved goal the builder joined is NOT listed; the open one is', async () => {
|
|
65
|
+
const html = await renderCard({
|
|
66
|
+
goals: [
|
|
67
|
+
{ id: 1, title: 'Finished goal', status: 'achieved' },
|
|
68
|
+
{ id: 2, title: 'Live goal', status: 'open' },
|
|
69
|
+
],
|
|
70
|
+
members: { 1: me, 2: me },
|
|
71
|
+
claimable: [],
|
|
72
|
+
});
|
|
73
|
+
assert.ok(html.includes('Live goal'), 'the open joined goal is shown');
|
|
74
|
+
assert.ok(!html.includes('Finished goal'), 'the completed goal is left off the card');
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
await test('achieved goals no longer take the five slots ahead of open ones', async () => {
|
|
78
|
+
const goals = [];
|
|
79
|
+
for (let i = 1; i <= 5; i++) goals.push({ id: i, title: `Done ${i}`, status: 'achieved' });
|
|
80
|
+
goals.push({ id: 9, title: 'Open nine', status: 'open' });
|
|
81
|
+
const members = Object.fromEntries(goals.map((g) => [g.id, me]));
|
|
82
|
+
const html = await renderCard({ goals, members, claimable: [] });
|
|
83
|
+
assert.ok(html.includes('Open nine'));
|
|
84
|
+
assert.ok(!/Done \d/.test(html));
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
await test('each open goal carries how much claimable work sits in it', async () => {
|
|
88
|
+
const html = await renderCard({
|
|
89
|
+
goals: [{ id: 2, title: 'Live goal', status: 'open' }, { id: 3, title: 'Quiet goal', status: 'open' }],
|
|
90
|
+
members: { 2: me, 3: me },
|
|
91
|
+
claimable: [{ id: 10, goal_id: 2 }, { id: 11, goal_id: 2 }, { id: 12, goal_id: null }],
|
|
92
|
+
});
|
|
93
|
+
assert.match(html, /Live goal[\s\S]*2 tasks you can claim/);
|
|
94
|
+
assert.match(html, /Quiet goal[\s\S]*Nothing claimable right now/);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
await test('a goal the builder has not joined is not listed', async () => {
|
|
98
|
+
const html = await renderCard({
|
|
99
|
+
goals: [{ id: 4, title: 'Someone else', status: 'open' }],
|
|
100
|
+
members: { 4: [{ builder_id: 99 }] },
|
|
101
|
+
claimable: [],
|
|
102
|
+
});
|
|
103
|
+
assert.ok(!html.includes('Someone else'));
|
|
104
|
+
assert.match(html, /joined any open goals/);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
await test('claimableCountsByGoal counts per goal and skips goal-less rows', () => {
|
|
108
|
+
assert.deepEqual(
|
|
109
|
+
JSON.parse(JSON.stringify(claimableCountsByGoal([{ goal_id: 2 }, { goal_id: '2' }, { goal_id: 5 }, { goal_id: null }, {}, null]))),
|
|
110
|
+
{ 2: 2, 5: 1 });
|
|
111
|
+
assert.deepEqual(claimableCountsByGoal(undefined), {});
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
await test('the route answers ?group=goal with counts and no rows', () => {
|
|
115
|
+
const route = fs.readFileSync(path.join(ROOT, 'modules/lifecycle/routes/tasks.js'), 'utf8');
|
|
116
|
+
const body = route.slice(route.indexOf("req.query.group === 'goal'"));
|
|
117
|
+
assert.ok(body.slice(0, 300).includes('res.json({ by_goal: claimableCountsByGoal(feed), claimable_total: feed.length })'));
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
summary();
|