@bongos/core 1.21.65 → 1.21.66
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 +19 -24
- package/docs/copy-inventory.md +19 -20
- package/docs/copy-registry.json +22 -31
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-inventory.json +0 -1
- package/docs/page-readings.json +10 -10
- package/modules/hall-ui/public/profile.html +4 -7
- package/modules/hall-ui/public/profile.js +0 -5
- 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/canonical_profile_url.mjs +23 -157
- package/modules/hall-ui/public/profile-canonical.js +0 -137
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.66",
|
|
6
|
+
"core_contract": "1.21.66",
|
|
7
|
+
"source_commit": "7d5fb4a32c7bde51ddbc429756639ecba23c987f",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-10-
|
|
9
|
+
"built_at": "2026-10-06T15:22:33.015Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 587,
|
|
13
13
|
"agent_docs_stubbed": 28,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 2953,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 3569,
|
|
20
|
+
"tree_sha256": "5267240f0d28ca05c97ca9e9911fb79f57f5027e6d0434e2c9a1c1f1b45bd600",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -2332,12 +2332,12 @@
|
|
|
2332
2332
|
{
|
|
2333
2333
|
"path": "docs/copy-inventory.md",
|
|
2334
2334
|
"mode": "0000644",
|
|
2335
|
-
"sha256": "
|
|
2335
|
+
"sha256": "deee182912a3b4f6827af242e28d903b85ab53fc563d122a8c1c842739413ae3"
|
|
2336
2336
|
},
|
|
2337
2337
|
{
|
|
2338
2338
|
"path": "docs/copy-registry.json",
|
|
2339
2339
|
"mode": "0000644",
|
|
2340
|
-
"sha256": "
|
|
2340
|
+
"sha256": "55481321c3bbf249cff8cf69935f95b2ca8901239310ea1093d6d58d45f81c08"
|
|
2341
2341
|
},
|
|
2342
2342
|
{
|
|
2343
2343
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2847,7 +2847,7 @@
|
|
|
2847
2847
|
{
|
|
2848
2848
|
"path": "docs/module-api-changelog.md",
|
|
2849
2849
|
"mode": "0000644",
|
|
2850
|
-
"sha256": "
|
|
2850
|
+
"sha256": "243f9810e7be9a77ae9e4aa5f0fbcf084ea2e261f521053aba2beb2d57667af9"
|
|
2851
2851
|
},
|
|
2852
2852
|
{
|
|
2853
2853
|
"path": "docs/modules-contract.md",
|
|
@@ -2932,12 +2932,12 @@
|
|
|
2932
2932
|
{
|
|
2933
2933
|
"path": "docs/page-inventory.json",
|
|
2934
2934
|
"mode": "0000644",
|
|
2935
|
-
"sha256": "
|
|
2935
|
+
"sha256": "9ac8290512a1b7dee3b6b2ab836473beea4589d6ed9407d884659c3bd973c78b"
|
|
2936
2936
|
},
|
|
2937
2937
|
{
|
|
2938
2938
|
"path": "docs/page-readings.json",
|
|
2939
2939
|
"mode": "0000644",
|
|
2940
|
-
"sha256": "
|
|
2940
|
+
"sha256": "79c99779b57ad095968f0173411caa5a521b4ad4ffd76c7a54a8a93682854573"
|
|
2941
2941
|
},
|
|
2942
2942
|
{
|
|
2943
2943
|
"path": "docs/project-context.template.md",
|
|
@@ -5964,11 +5964,6 @@
|
|
|
5964
5964
|
"mode": "0000644",
|
|
5965
5965
|
"sha256": "ade6ff2b23d9b7e7b01f893148c53733f1c9bd11c50d0f01c662b9726239fd98"
|
|
5966
5966
|
},
|
|
5967
|
-
{
|
|
5968
|
-
"path": "modules/hall-ui/public/profile-canonical.js",
|
|
5969
|
-
"mode": "0000644",
|
|
5970
|
-
"sha256": "4f010fd2a4e77447839eb77f5e294ea62c525fc47f392e916790f37078a92726"
|
|
5971
|
-
},
|
|
5972
5967
|
{
|
|
5973
5968
|
"path": "modules/hall-ui/public/profile-charts.js",
|
|
5974
5969
|
"mode": "0000644",
|
|
@@ -6002,12 +5997,12 @@
|
|
|
6002
5997
|
{
|
|
6003
5998
|
"path": "modules/hall-ui/public/profile.html",
|
|
6004
5999
|
"mode": "0000644",
|
|
6005
|
-
"sha256": "
|
|
6000
|
+
"sha256": "a43f55145547d63da5c38e9173d227853904b508caa3282f34585c2cd4bf678e"
|
|
6006
6001
|
},
|
|
6007
6002
|
{
|
|
6008
6003
|
"path": "modules/hall-ui/public/profile.js",
|
|
6009
6004
|
"mode": "0000644",
|
|
6010
|
-
"sha256": "
|
|
6005
|
+
"sha256": "4a16a4b2a5bb5e444f514723656a3775bf65aef9180d4d25ed0a6693101060fb"
|
|
6011
6006
|
},
|
|
6012
6007
|
{
|
|
6013
6008
|
"path": "modules/hall-ui/public/profile.states.json",
|
|
@@ -9977,12 +9972,12 @@
|
|
|
9977
9972
|
{
|
|
9978
9973
|
"path": "package-lock.json",
|
|
9979
9974
|
"mode": "0000644",
|
|
9980
|
-
"sha256": "
|
|
9975
|
+
"sha256": "6c64398d62e13b46e7372422ead03873bc142124c89e02e92ed923cec360e9e8"
|
|
9981
9976
|
},
|
|
9982
9977
|
{
|
|
9983
9978
|
"path": "package.json",
|
|
9984
9979
|
"mode": "0000644",
|
|
9985
|
-
"sha256": "
|
|
9980
|
+
"sha256": "a6a8fcb855c7bc3af08820abdee41c3a9aecdb1b0f368429edf413e17106c9d7"
|
|
9986
9981
|
},
|
|
9987
9982
|
{
|
|
9988
9983
|
"path": "public-docs/index.html",
|
|
@@ -10002,7 +9997,7 @@
|
|
|
10002
9997
|
{
|
|
10003
9998
|
"path": "release-notes.json",
|
|
10004
9999
|
"mode": "0000644",
|
|
10005
|
-
"sha256": "
|
|
10000
|
+
"sha256": "5849cac3f0e8260822d39216ad50c17560c8ef4cbed7a48d760a3b2f8247b38f"
|
|
10006
10001
|
},
|
|
10007
10002
|
{
|
|
10008
10003
|
"path": "scripts/cron/style_guide_audit.sh",
|
|
@@ -12222,7 +12217,7 @@
|
|
|
12222
12217
|
{
|
|
12223
12218
|
"path": "src/module-api.js",
|
|
12224
12219
|
"mode": "0000644",
|
|
12225
|
-
"sha256": "
|
|
12220
|
+
"sha256": "476059af8acd597e4ecfc9d3beb9447f6473475d15fc93ed16339d42f5c3ffa2"
|
|
12226
12221
|
},
|
|
12227
12222
|
{
|
|
12228
12223
|
"path": "src/module-loader/catalog.js",
|
|
@@ -12907,7 +12902,7 @@
|
|
|
12907
12902
|
{
|
|
12908
12903
|
"path": "tests/canonical_profile_url.mjs",
|
|
12909
12904
|
"mode": "0000644",
|
|
12910
|
-
"sha256": "
|
|
12905
|
+
"sha256": "328e949ff0c675cdf1f54f445f36517e740454fe57f1a4ab5fd10edbc20a2f8f"
|
|
12911
12906
|
},
|
|
12912
12907
|
{
|
|
12913
12908
|
"path": "tests/cap_newcomer_tasks.mjs",
|
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
|
+
**2556 strings** across 3 surfaces · 2183 distinct pieces of copy · 2556 certain, 0 heuristic · 227 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` |
|
|
13
|
+
| `builders-hall` | `modules/hall-ui/public` | 133 | 1828 |
|
|
14
14
|
| `status-dashboard` | `modules/status-ui/public` | 4 | 100 |
|
|
15
15
|
| `landing` | `modules/public-landing/public` | 7 | 628 |
|
|
16
16
|
|
|
@@ -78,7 +78,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
78
78
|
| `f6f68ba322be` | 3x | Open {…} | modules/hall-ui/public/goal-inbox.js:53, modules/hall-ui/public/goal-inbox.js:69, modules/hall-ui/public/goals.js:67 |
|
|
79
79
|
| … | | _187 more in the JSON registry_ | |
|
|
80
80
|
|
|
81
|
-
## `builders-hall` —
|
|
81
|
+
## `builders-hall` — 1828 strings
|
|
82
82
|
|
|
83
83
|
| id | conf | text | where |
|
|
84
84
|
|---|---|---|---|
|
|
@@ -104,7 +104,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
104
104
|
| `ac57fe1ccd6e` | certain | , follow its acceptance criteria, stay within touches[], /builder-ship | `modules/hall-ui/public/bulk-toolbar.js:78` |
|
|
105
105
|
| `574acf2f93bb` | certain | , never quietly ratified — so a clock is worth proposing. The recommended sitting is | `modules/hall-ui/public/government.js:605` |
|
|
106
106
|
| `741e355954ac` | certain | , not at ship). | `modules/hall-ui/public/diagrams.html:52` |
|
|
107
|
-
| `b31a6bd7edc5` | certain | , or | `modules/hall-ui/public/profile.js:
|
|
107
|
+
| `b31a6bd7edc5` | certain | , or | `modules/hall-ui/public/profile.js:977` |
|
|
108
108
|
| `c7c9b0afc38e` | certain | , then mark it as read on the Home page. | `modules/hall-ui/public/work.html:45` |
|
|
109
109
|
| `7627d5c3aa29` | certain | 0 decided | `modules/hall-ui/public/street.html:73` |
|
|
110
110
|
| `24174ce79df3` | certain | 1 · Task lifecycle | `modules/hall-ui/public/diagrams.html:49` |
|
|
@@ -146,7 +146,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
146
146
|
| `6ca31dd5eb91` | certain | Acknowledge the primer | `modules/hall-ui/public/primer.html:99` |
|
|
147
147
|
| `74cc57f76b42` | certain | Active recently | `modules/hall-ui/public/watch.js:458` |
|
|
148
148
|
| `524188fe0078` | certain | Active sessions | `modules/hall-ui/public/settings.html:159` |
|
|
149
|
-
| `d628b36ec58e` | certain | Activity, by role | `modules/hall-ui/public/profile.html:
|
|
149
|
+
| `d628b36ec58e` | certain | Activity, by role | `modules/hall-ui/public/profile.html:138` |
|
|
150
150
|
| `2b94171ce525` | certain | Add dependency | `modules/hall-ui/public/task.js:592` |
|
|
151
151
|
| `a70b72ec4dcc` | certain | Add images | `modules/hall-ui/public/page-notes.js:97` |
|
|
152
152
|
| `da8659b0099b` | certain | Add something you wrote — notes, a standard, a worked example. It is indexed for recall, not pasted into every | `modules/hall-ui/public/settings-specialities.js:354` |
|
|
@@ -240,7 +240,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
240
240
|
| `46b33550d52b` | certain | Bulk claim | `modules/hall-ui/public/work.html:164` |
|
|
241
241
|
| `6d6d626fc518` | certain | Bulk release | `modules/hall-ui/public/goals.html:183` |
|
|
242
242
|
| `6d6d626fc518` | certain | Bulk release | `modules/hall-ui/public/work.html:165` |
|
|
243
|
-
| `181cfa50b127` | certain | By the numbers | `modules/hall-ui/public/profile.html:
|
|
243
|
+
| `181cfa50b127` | certain | By the numbers | `modules/hall-ui/public/profile.html:65` |
|
|
244
244
|
| `a015a43bfc7f` | certain | CLI access | `modules/hall-ui/public/settings.html:141` |
|
|
245
245
|
| `09e863eb90af` | certain | Can: {…} | `modules/hall-ui/public/government.js:873` |
|
|
246
246
|
| `084eb64bce72` | certain | Capabilities held by a machine identity, never by a person or a rank. Shown for completeness; nothing here can | `modules/hall-ui/public/government.html:123` |
|
|
@@ -353,7 +353,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
353
353
|
| `a2f2e8babef5` | certain | Could not load that page. Try again. | `modules/hall-ui/public/blockers.js:276` |
|
|
354
354
|
| `9d8192ac9098` | certain | Could not load the earnings. | `modules/hall-ui/public/profile-charts.js:546` |
|
|
355
355
|
| `b2147cc90e36` | certain | Could not load the idea template. Reload, or file from the terminal with capture.js. | `modules/hall-ui/public/ideas.js:1000` |
|
|
356
|
-
| `7604af13c40e` | certain | Could not load the profile. | `modules/hall-ui/public/profile.js:
|
|
356
|
+
| `7604af13c40e` | certain | Could not load the profile. | `modules/hall-ui/public/profile.js:1054` |
|
|
357
357
|
| `8b69e445592a` | certain | Could not load the question labels; showing the answers as stored. | `modules/hall-ui/public/idea.js:458` |
|
|
358
358
|
| `edd5bafbe075` | certain | Could not load the queue just now. | `modules/hall-ui/public/ideas.js:885` |
|
|
359
359
|
| `02bb0570996a` | certain | Could not load the ranks. | `modules/hall-ui/public/ranks.js:197` |
|
|
@@ -415,7 +415,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
415
415
|
| `af21de422c14` | certain | Create speciality | `modules/hall-ui/public/settings.html:292` |
|
|
416
416
|
| `d7beb841395e` | certain | Create task | `modules/hall-ui/public/task-detail.js:465` |
|
|
417
417
|
| `e91a4d2e3e1c` | certain | Created rank {…}. | `modules/hall-ui/public/government.js:442` |
|
|
418
|
-
| `a55e423263f0` | certain | Cross-project record | `modules/hall-ui/public/profile.html:
|
|
418
|
+
| `a55e423263f0` | certain | Cross-project record | `modules/hall-ui/public/profile.html:99` |
|
|
419
419
|
| `24013a074724` | certain | Custom rank | `modules/hall-ui/public/government.html:113` |
|
|
420
420
|
| `13b22e48d9fb` | certain | Danger zone | `modules/hall-ui/public/project-settings.html:57` |
|
|
421
421
|
| `cf7d7d5d5e83` | certain | Database behind. | `modules/hall-ui/public/deploy.js:582` |
|
|
@@ -477,7 +477,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
477
477
|
| `6604d63c2fb4` | certain | Everyone who joined while this project was being founded, in the order they arrived. The mark is for good. | `modules/hall-ui/public/hall-widgets.js:124` |
|
|
478
478
|
| `04bbccfe7465` | certain | Everything a new builder needs before claiming their first task. About a ten-minute read. | `modules/hall-ui/public/primer.html:42` |
|
|
479
479
|
| `89d9c0962048` | certain | Everything that fell out of it | `modules/hall-ui/public/idea.js:420` |
|
|
480
|
-
| `37110f7e2b27` | certain | Everything this builder has shipped. Seen one role at a time, with goals and ideas, under | `modules/hall-ui/public/profile.html:
|
|
480
|
+
| `37110f7e2b27` | certain | Everything this builder has shipped. Seen one role at a time, with goals and ideas, under | `modules/hall-ui/public/profile.html:113` |
|
|
481
481
|
| `efdb46f76b02` | certain | Everything this instance can run: what the core ships, what this project built, and who keeps each one true as | `modules/hall-ui/public/modules.html:35` |
|
|
482
482
|
| `57d5ba0fdefb` | certain | Exit full screen | `modules/hall-ui/public/shell.js:581` |
|
|
483
483
|
| `94339ddaeeea` | certain | Explore: the sky reveals itself as you follow routes from where you begin. | `modules/hall-ui/public/goal-map.html:74` |
|
|
@@ -550,7 +550,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
550
550
|
| `8a421ae268e6` | certain | Goal {…} removed. | `modules/hall-ui/public/gate.js:504` |
|
|
551
551
|
| `e0bc28d10785` | certain | Goals could not be loaded. Refresh to try again. | `modules/hall-ui/public/goals-page.js:883` |
|
|
552
552
|
| `4517f2253d0f` | certain | Goals couldn’t be loaded just now. Refresh to try again. | `modules/hall-ui/public/goals.js:121` |
|
|
553
|
-
| `6a85997bda21` | certain | Goals created | `modules/hall-ui/public/profile.html:
|
|
553
|
+
| `6a85997bda21` | certain | Goals created | `modules/hall-ui/public/profile.html:154` |
|
|
554
554
|
| `6bbd703b5aad` | certain | Goals it can work on | `modules/hall-ui/public/gate.js:376` |
|
|
555
555
|
| `2ed2cb8fbffd` | certain | Goals page | `modules/hall-ui/public/goals.js:94` |
|
|
556
556
|
| `320a0516a33e` | certain | Goals seeded — awaiting kickoff | `modules/hall-ui/public/roadmap.js:271` |
|
|
@@ -680,7 +680,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
680
680
|
| `3b49f0fcd19c` | certain | Load more turns | `modules/hall-ui/public/sessions.html:101` |
|
|
681
681
|
| `daf84bba41b1` | certain | Loading goals… | `modules/hall-ui/public/goals.html:36` |
|
|
682
682
|
| `93ceeaa4e226` | certain | Loading idea | `modules/hall-ui/public/idea.html:30` |
|
|
683
|
-
| `2b5826012538` | certain | Loading profile… | `modules/hall-ui/public/profile.html:
|
|
683
|
+
| `2b5826012538` | certain | Loading profile… | `modules/hall-ui/public/profile.html:36` |
|
|
684
684
|
| `554b156a08d6` | certain | Loading sessions… | `modules/hall-ui/public/sessions.html:32` |
|
|
685
685
|
| `a0c18cece568` | certain | Loading sittings… | `modules/hall-ui/public/board-room.js:553` |
|
|
686
686
|
| `7ca55f9ba183` | certain | Loading task | `modules/hall-ui/public/task.html:32` |
|
|
@@ -756,7 +756,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
756
756
|
| `c255749ec989` | certain | No achievements earned yet. | `modules/hall-ui/public/profile.js:199` |
|
|
757
757
|
| `479c1a45f39d` | certain | No backlog tasks match these filters. Try widening them. | `modules/hall-ui/public/work.js:831` |
|
|
758
758
|
| `83f62fc94271` | certain | No builder account found for this sign-in. | `modules/hall-ui/public/settings.js:1204` |
|
|
759
|
-
| `2e9c154c09cd` | certain | No builder selected. Open a builder from the | `modules/hall-ui/public/profile.js:
|
|
759
|
+
| `2e9c154c09cd` | certain | No builder selected. Open a builder from the | `modules/hall-ui/public/profile.js:977` |
|
|
760
760
|
| `449db2ead464` | certain | No changes are listed for this version. | `modules/hall-ui/public/settings-software-update.js:103` |
|
|
761
761
|
| `6d6fd2314248` | certain | No cross-project activity reported yet. | `modules/hall-ui/public/profile.js:402` |
|
|
762
762
|
| `b1ada579483c` | certain | No custom ranks yet | `modules/hall-ui/public/government.js:358` |
|
|
@@ -885,7 +885,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
885
885
|
| `569980a263ae` | certain | Optional. This is the ledger link — a copy change ships as a task like every other change. | `modules/hall-ui/public/copy-desk.html:130` |
|
|
886
886
|
| `f2e9e8f21e8e` | certain | Or add someone without asking… | `modules/hall-ui/public/goals-render.js:1264` |
|
|
887
887
|
| `d89d1923ecf9` | certain | Over the last {…} days | `modules/hall-ui/public/watch.js:1274` |
|
|
888
|
-
| `695ffff13730` | certain | Over time | `modules/hall-ui/public/profile.html:
|
|
888
|
+
| `695ffff13730` | certain | Over time | `modules/hall-ui/public/profile.html:77` |
|
|
889
889
|
| `5ded44da0cc5` | certain | Override requests | `modules/hall-ui/public/watch.html:139` |
|
|
890
890
|
| `0046e08db06a` | certain | Owner’s bill / month (est.) | `modules/hall-ui/public/fleet-costs.js:70` |
|
|
891
891
|
| `15a49bf15007` | certain | Page {…} of {…} | `modules/hall-ui/public/hall-kit.js:112` |
|
|
@@ -919,7 +919,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
919
919
|
| `92d8fad6dc91` | certain | Private account — this is all they share by applying. | `modules/hall-ui/public/watch.js:459` |
|
|
920
920
|
| `2b88c01d1697` | certain | Private — join is by invitation or an approved request | `modules/hall-ui/public/goals-render.js:877` |
|
|
921
921
|
| `a5cd9cbfe82a` | certain | Profile and privacy | `modules/hall-ui/public/settings.html:103` |
|
|
922
|
-
| `f796836eac4e` | certain | Profile sections | `modules/hall-ui/public/profile.html:
|
|
922
|
+
| `f796836eac4e` | certain | Profile sections | `modules/hall-ui/public/profile.html:46` |
|
|
923
923
|
| `935b317ce2d8` | certain | Profile — {{worldName}} | `modules/hall-ui/public/profile.html:6` |
|
|
924
924
|
| `935b317ce2d8` | certain | Profile — {{worldName}} | `modules/hall-ui/public/profile.html:6` |
|
|
925
925
|
| `cf8d14410264` | certain | Project founding mode | `modules/hall-ui/public/shell.js:950` |
|
|
@@ -1048,7 +1048,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1048
1048
|
| `324af64c8b6e` | certain | See all {…} goals {…} | `modules/hall-ui/public/roadmap.js:128` |
|
|
1049
1049
|
| `324af64c8b6e` | certain | See all {…} goals {…} | `modules/hall-ui/public/roadmap.js:260` |
|
|
1050
1050
|
| `00473a773fd7` | certain | See the UAT | `modules/hall-ui/public/criterion-uat-ui.js:80` |
|
|
1051
|
-
| `a9c398651862` | certain | See the cross-project record | `modules/hall-ui/public/profile-canonical.js:114` |
|
|
1052
1051
|
| `17d5b5739f46` | certain | See the work board → | `modules/hall-ui/public/hall-render.js:948` |
|
|
1053
1052
|
| `55cde0774831` | certain | See what would change | `modules/hall-ui/public/deploy.js:425` |
|
|
1054
1053
|
| `292761c89fae` | certain | See which goals wait on each other → | `modules/hall-ui/public/goals.html:39` |
|
|
@@ -1417,7 +1416,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1417
1416
|
| `e179870922a3` | certain | What the session did, derived from its own transcript: whether it wrote files, used tools, and how many prompt | `modules/hall-ui/public/sessions.html:74` |
|
|
1418
1417
|
| `868cf4bbe616` | certain | What the start-it markers mean | `modules/hall-ui/public/commands.html:35` |
|
|
1419
1418
|
| `5a58392783fd` | certain | What this brings in | `modules/hall-ui/public/deploy.js:553` |
|
|
1420
|
-
| `a444ad812e4f` | certain | What this builder has done, seen one role at a time. | `modules/hall-ui/public/profile.html:
|
|
1419
|
+
| `a444ad812e4f` | certain | What this builder has done, seen one role at a time. | `modules/hall-ui/public/profile.html:139` |
|
|
1421
1420
|
| `32d675a2b022` | certain | What this rank is for (optional) | `modules/hall-ui/public/government.html:90` |
|
|
1422
1421
|
| `04b3ff4c4f4c` | certain | What users can see | `modules/hall-ui/public/deploy.html:47` |
|
|
1423
1422
|
| `1d5bfd09068c` | certain | What you saw | `modules/hall-ui/public/studio.js:191` |
|
|
@@ -1453,7 +1452,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1453
1452
|
| `c5fd76a9e03d` | certain | Won {…} | `modules/hall-ui/public/profile.js:206` |
|
|
1454
1453
|
| `986514f35589` | certain | Work board | `modules/hall-ui/public/work.html:31` |
|
|
1455
1454
|
| `520d139df9eb` | certain | Work is complete but the version is held — no tasks are being claimed here right now. | `modules/hall-ui/public/roadmap.js:289` |
|
|
1456
|
-
| `0e6b8e8f26cc` | certain | Works completed | `modules/hall-ui/public/profile.html:
|
|
1455
|
+
| `0e6b8e8f26cc` | certain | Works completed | `modules/hall-ui/public/profile.html:149` |
|
|
1457
1456
|
| `52e5fe3c6075` | certain | Write a Full Idea | `modules/hall-ui/public/ideas.html:145` |
|
|
1458
1457
|
| `ad1e1ab1ecac` | certain | Write a reply… | `modules/hall-ui/public/collab.js:175` |
|
|
1459
1458
|
| `a79ca1e2463b` | certain | Write another | `modules/hall-ui/public/page-notes.js:143` |
|
|
@@ -1703,7 +1702,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1703
1702
|
| `b250b5c4eb03` | certain | shuttle · {…} | `modules/hall-ui/public/sky-interaction.js:45` |
|
|
1704
1703
|
| `ec6d8c900bc8` | certain | sign in | `modules/hall-ui/public/profile-charts.js:605` |
|
|
1705
1704
|
| `ec6d8c900bc8` | certain | sign in | `modules/hall-ui/public/profile.js:841` |
|
|
1706
|
-
| `ec6d8c900bc8` | certain | sign in | `modules/hall-ui/public/profile.js:
|
|
1705
|
+
| `ec6d8c900bc8` | certain | sign in | `modules/hall-ui/public/profile.js:977` |
|
|
1707
1706
|
| `c8c2551006dc` | certain | skip the tour | `modules/hall-ui/public/goal-map.html:121` |
|
|
1708
1707
|
| `c8c2551006dc` | certain | skip the tour | `modules/hall-ui/public/thinking.html:122` |
|
|
1709
1708
|
| `1e737a57eb20` | certain | start governing | `modules/hall-ui/public/city.html:79` |
|
|
@@ -1737,7 +1736,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1737
1736
|
| `abddfb2b1022` | certain | the newest {…} only | `modules/hall-ui/public/sky-interaction.js:124` |
|
|
1738
1737
|
| `4ad74172c874` | certain | the next page to tweak | `modules/hall-ui/public/studio.html:118` |
|
|
1739
1738
|
| `2be732b11690` | certain | the owner’s blockers | `modules/hall-ui/public/deploy.js:229` |
|
|
1740
|
-
| `95854f8315ca` | certain | the page everyone else reads | `modules/hall-ui/public/profile.html:
|
|
1739
|
+
| `95854f8315ca` | certain | the page everyone else reads | `modules/hall-ui/public/profile.html:34` |
|
|
1741
1740
|
| `2f48995206d4` | certain | the pages /tweak has applied | `modules/hall-ui/public/studio.html:122` |
|
|
1742
1741
|
| `4bde7b562cf4` | certain | the record | `modules/hall-ui/public/sky-panel.js:51` |
|
|
1743
1742
|
| `4bde7b562cf4` | certain | the record | `modules/hall-ui/public/street.html:173` |
|
|
@@ -1755,7 +1754,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1755
1754
|
| `94735a2353aa` | certain | to run it. | `modules/hall-ui/public/commands.html:37` |
|
|
1756
1755
|
| `7d54a818850d` | certain | to see the full record. | `modules/hall-ui/public/profile.js:263` |
|
|
1757
1756
|
| `3c9ba5dc851d` | certain | to see this list there. | `modules/hall-ui/public/commands.html:45` |
|
|
1758
|
-
| `47204e5f11de` | certain | to see your own profile. | `modules/hall-ui/public/profile.js:
|
|
1757
|
+
| `47204e5f11de` | certain | to see your own profile. | `modules/hall-ui/public/profile.js:977` |
|
|
1759
1758
|
| `23488ca48320` | certain | to take a task right here — no terminal needed. Then click | `modules/hall-ui/public/work.html:103` |
|
|
1760
1759
|
| `1b88ce51fd84` | certain | to tend now · {…} | `modules/hall-ui/public/studio.js:233` |
|
|
1761
1760
|
| `1b88ce51fd84` | certain | to tend now · {…} | `modules/hall-ui/public/studio.js:248` |
|
package/docs/copy-registry.json
CHANGED
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
"generator": "scripts/gds/copy-inventory.js",
|
|
4
4
|
"goal": 1000074,
|
|
5
5
|
"counts": {
|
|
6
|
-
"strings":
|
|
7
|
-
"unique_ids":
|
|
8
|
-
"certain":
|
|
6
|
+
"strings": 2556,
|
|
7
|
+
"unique_ids": 2183,
|
|
8
|
+
"certain": 2556,
|
|
9
9
|
"heuristic": 0,
|
|
10
10
|
"duplicate_ids": 227
|
|
11
11
|
},
|
|
12
12
|
"surfaces": {
|
|
13
13
|
"builders-hall": {
|
|
14
14
|
"at": "modules/hall-ui/public",
|
|
15
|
-
"files":
|
|
16
|
-
"strings":
|
|
15
|
+
"files": 133,
|
|
16
|
+
"strings": 1828
|
|
17
17
|
},
|
|
18
18
|
"status-dashboard": {
|
|
19
19
|
"at": "modules/status-ui/public",
|
|
@@ -669,7 +669,7 @@
|
|
|
669
669
|
"at": [
|
|
670
670
|
"modules/hall-ui/public/profile-charts.js:605",
|
|
671
671
|
"modules/hall-ui/public/profile.js:841",
|
|
672
|
-
"modules/hall-ui/public/profile.js:
|
|
672
|
+
"modules/hall-ui/public/profile.js:977"
|
|
673
673
|
]
|
|
674
674
|
},
|
|
675
675
|
{
|
|
@@ -2659,7 +2659,7 @@
|
|
|
2659
2659
|
"surface": "builders-hall",
|
|
2660
2660
|
"text": ", or",
|
|
2661
2661
|
"file": "modules/hall-ui/public/profile.js",
|
|
2662
|
-
"line":
|
|
2662
|
+
"line": 977,
|
|
2663
2663
|
"origin": "js-markup",
|
|
2664
2664
|
"confidence": "certain"
|
|
2665
2665
|
},
|
|
@@ -3037,7 +3037,7 @@
|
|
|
3037
3037
|
"surface": "builders-hall",
|
|
3038
3038
|
"text": "Activity, by role",
|
|
3039
3039
|
"file": "modules/hall-ui/public/profile.html",
|
|
3040
|
-
"line":
|
|
3040
|
+
"line": 138,
|
|
3041
3041
|
"origin": "html-text",
|
|
3042
3042
|
"confidence": "certain"
|
|
3043
3043
|
},
|
|
@@ -3883,7 +3883,7 @@
|
|
|
3883
3883
|
"surface": "builders-hall",
|
|
3884
3884
|
"text": "By the numbers",
|
|
3885
3885
|
"file": "modules/hall-ui/public/profile.html",
|
|
3886
|
-
"line":
|
|
3886
|
+
"line": 65,
|
|
3887
3887
|
"origin": "html-text",
|
|
3888
3888
|
"confidence": "certain"
|
|
3889
3889
|
},
|
|
@@ -4900,7 +4900,7 @@
|
|
|
4900
4900
|
"surface": "builders-hall",
|
|
4901
4901
|
"text": "Could not load the profile.",
|
|
4902
4902
|
"file": "modules/hall-ui/public/profile.js",
|
|
4903
|
-
"line":
|
|
4903
|
+
"line": 1054,
|
|
4904
4904
|
"origin": "js-notice",
|
|
4905
4905
|
"confidence": "certain"
|
|
4906
4906
|
},
|
|
@@ -5458,7 +5458,7 @@
|
|
|
5458
5458
|
"surface": "builders-hall",
|
|
5459
5459
|
"text": "Cross-project record",
|
|
5460
5460
|
"file": "modules/hall-ui/public/profile.html",
|
|
5461
|
-
"line":
|
|
5461
|
+
"line": 99,
|
|
5462
5462
|
"origin": "html-text",
|
|
5463
5463
|
"confidence": "certain"
|
|
5464
5464
|
},
|
|
@@ -6016,7 +6016,7 @@
|
|
|
6016
6016
|
"surface": "builders-hall",
|
|
6017
6017
|
"text": "Everything this builder has shipped. Seen one role at a time, with goals and ideas, under",
|
|
6018
6018
|
"file": "modules/hall-ui/public/profile.html",
|
|
6019
|
-
"line":
|
|
6019
|
+
"line": 113,
|
|
6020
6020
|
"origin": "html-text",
|
|
6021
6021
|
"confidence": "certain"
|
|
6022
6022
|
},
|
|
@@ -6673,7 +6673,7 @@
|
|
|
6673
6673
|
"surface": "builders-hall",
|
|
6674
6674
|
"text": "Goals created",
|
|
6675
6675
|
"file": "modules/hall-ui/public/profile.html",
|
|
6676
|
-
"line":
|
|
6676
|
+
"line": 154,
|
|
6677
6677
|
"origin": "html-text",
|
|
6678
6678
|
"confidence": "certain"
|
|
6679
6679
|
},
|
|
@@ -7843,7 +7843,7 @@
|
|
|
7843
7843
|
"surface": "builders-hall",
|
|
7844
7844
|
"text": "Loading profile…",
|
|
7845
7845
|
"file": "modules/hall-ui/public/profile.html",
|
|
7846
|
-
"line":
|
|
7846
|
+
"line": 36,
|
|
7847
7847
|
"origin": "html-text",
|
|
7848
7848
|
"confidence": "certain"
|
|
7849
7849
|
},
|
|
@@ -8527,7 +8527,7 @@
|
|
|
8527
8527
|
"surface": "builders-hall",
|
|
8528
8528
|
"text": "No builder selected. Open a builder from the",
|
|
8529
8529
|
"file": "modules/hall-ui/public/profile.js",
|
|
8530
|
-
"line":
|
|
8530
|
+
"line": 977,
|
|
8531
8531
|
"origin": "js-markup",
|
|
8532
8532
|
"confidence": "certain"
|
|
8533
8533
|
},
|
|
@@ -9688,7 +9688,7 @@
|
|
|
9688
9688
|
"surface": "builders-hall",
|
|
9689
9689
|
"text": "Over time",
|
|
9690
9690
|
"file": "modules/hall-ui/public/profile.html",
|
|
9691
|
-
"line":
|
|
9691
|
+
"line": 77,
|
|
9692
9692
|
"origin": "html-text",
|
|
9693
9693
|
"confidence": "certain"
|
|
9694
9694
|
},
|
|
@@ -9994,7 +9994,7 @@
|
|
|
9994
9994
|
"surface": "builders-hall",
|
|
9995
9995
|
"text": "Profile sections",
|
|
9996
9996
|
"file": "modules/hall-ui/public/profile.html",
|
|
9997
|
-
"line":
|
|
9997
|
+
"line": 46,
|
|
9998
9998
|
"origin": "html-attr:aria-label",
|
|
9999
9999
|
"confidence": "certain"
|
|
10000
10000
|
},
|
|
@@ -11150,15 +11150,6 @@
|
|
|
11150
11150
|
"origin": "js-markup",
|
|
11151
11151
|
"confidence": "certain"
|
|
11152
11152
|
},
|
|
11153
|
-
{
|
|
11154
|
-
"id": "a9c398651862",
|
|
11155
|
-
"surface": "builders-hall",
|
|
11156
|
-
"text": "See the cross-project record",
|
|
11157
|
-
"file": "modules/hall-ui/public/profile-canonical.js",
|
|
11158
|
-
"line": 114,
|
|
11159
|
-
"origin": "js-markup",
|
|
11160
|
-
"confidence": "certain"
|
|
11161
|
-
},
|
|
11162
11153
|
{
|
|
11163
11154
|
"id": "17d5b5739f46",
|
|
11164
11155
|
"surface": "builders-hall",
|
|
@@ -14476,7 +14467,7 @@
|
|
|
14476
14467
|
"surface": "builders-hall",
|
|
14477
14468
|
"text": "What this builder has done, seen one role at a time.",
|
|
14478
14469
|
"file": "modules/hall-ui/public/profile.html",
|
|
14479
|
-
"line":
|
|
14470
|
+
"line": 139,
|
|
14480
14471
|
"origin": "html-text",
|
|
14481
14472
|
"confidence": "certain"
|
|
14482
14473
|
},
|
|
@@ -14800,7 +14791,7 @@
|
|
|
14800
14791
|
"surface": "builders-hall",
|
|
14801
14792
|
"text": "Works completed",
|
|
14802
14793
|
"file": "modules/hall-ui/public/profile.html",
|
|
14803
|
-
"line":
|
|
14794
|
+
"line": 149,
|
|
14804
14795
|
"origin": "html-text",
|
|
14805
14796
|
"confidence": "certain"
|
|
14806
14797
|
},
|
|
@@ -17050,7 +17041,7 @@
|
|
|
17050
17041
|
"surface": "builders-hall",
|
|
17051
17042
|
"text": "sign in",
|
|
17052
17043
|
"file": "modules/hall-ui/public/profile.js",
|
|
17053
|
-
"line":
|
|
17044
|
+
"line": 977,
|
|
17054
17045
|
"origin": "js-markup",
|
|
17055
17046
|
"confidence": "certain"
|
|
17056
17047
|
},
|
|
@@ -17356,7 +17347,7 @@
|
|
|
17356
17347
|
"surface": "builders-hall",
|
|
17357
17348
|
"text": "the page everyone else reads",
|
|
17358
17349
|
"file": "modules/hall-ui/public/profile.html",
|
|
17359
|
-
"line":
|
|
17350
|
+
"line": 34,
|
|
17360
17351
|
"origin": "html-text",
|
|
17361
17352
|
"confidence": "certain"
|
|
17362
17353
|
},
|
|
@@ -17518,7 +17509,7 @@
|
|
|
17518
17509
|
"surface": "builders-hall",
|
|
17519
17510
|
"text": "to see your own profile.",
|
|
17520
17511
|
"file": "modules/hall-ui/public/profile.js",
|
|
17521
|
-
"line":
|
|
17512
|
+
"line": 977,
|
|
17522
17513
|
"origin": "js-markup",
|
|
17523
17514
|
"confidence": "certain"
|
|
17524
17515
|
},
|
|
@@ -2962,5 +2962,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
2962
2962
|
landed since 1.21.63 with no explicit bump. run 37477390735. (task 1002620)
|
|
2963
2963
|
1.21.65 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2964
2964
|
landed since 1.21.64 with no explicit bump. run 37482378254. (task 1002620)
|
|
2965
|
+
1.21.66 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2966
|
+
landed since 1.21.65 with no explicit bump. run 37486828045. (task 1002620)
|
|
2965
2967
|
---------------------------------------------------------------------------
|
|
2966
2968
|
```
|
package/docs/page-inventory.json
CHANGED
|
@@ -758,7 +758,6 @@
|
|
|
758
758
|
"modules/hall-ui/public/hall-visual.js",
|
|
759
759
|
"modules/hall-ui/public/hall-kit.js",
|
|
760
760
|
"modules/hall-ui/public/profile-connections.js",
|
|
761
|
-
"modules/hall-ui/public/profile-canonical.js",
|
|
762
761
|
"modules/hall-ui/public/profile-charts.js",
|
|
763
762
|
"modules/hall-ui/public/founding-mark.js",
|
|
764
763
|
"modules/hall-ui/public/profile-roles.js",
|
package/docs/page-readings.json
CHANGED
|
@@ -2374,7 +2374,7 @@
|
|
|
2374
2374
|
"surface": "builders",
|
|
2375
2375
|
"title": "Profile",
|
|
2376
2376
|
"states_read": ["own","works","activity","activity-artist","activity-ideator","other","artist","ideator","out"],
|
|
2377
|
-
"files_hash": "
|
|
2377
|
+
"files_hash": "47ded1e58ca035ec",
|
|
2378
2378
|
"reading_hash": "8d48fe73a48c9fc3",
|
|
2379
2379
|
"counts": {"lines":200,"placed":72,"shared":9,"unplaced":119},
|
|
2380
2380
|
"omitted": {"data":195},
|
|
@@ -2388,7 +2388,7 @@
|
|
|
2388
2388
|
{"key":"L0006","section":"top bar","text":"Artistry","placement":"shared"},
|
|
2389
2389
|
{"key":"L0007","section":"top bar","text":"Ideating","placement":"shared"},
|
|
2390
2390
|
{"key":"L0008","section":"top bar","text":"Governing","placement":"shared"},
|
|
2391
|
-
{"key":"L0009","section":"page top","text":"the page everyone else reads","placement":"placed","file":"modules/hall-ui/public/profile.html","line":
|
|
2391
|
+
{"key":"L0009","section":"page top","text":"the page everyone else reads","placement":"placed","file":"modules/hall-ui/public/profile.html","line":34,"string_id":"95854f8315ca"},
|
|
2392
2392
|
{"key":"L0010","section":"profile","text":"profile","placement":"unplaced"},
|
|
2393
2393
|
{"key":"L0011","section":"profile","text":"{…} file{…}","placement":"placed","file":"modules/hall-ui/public/gate.js","line":151,"string_id":"3efa67dc6e07","state":"activity-ideator","occurrences":2},
|
|
2394
2394
|
{"key":"L0012","section":"profile","text":"{…} — {…} · 9 pages approved","placement":"unplaced","state":"activity-artist"},
|
|
@@ -2400,8 +2400,8 @@
|
|
|
2400
2400
|
{"key":"L0018","section":"profile","text":"Member since {…}","placement":"placed","file":"modules/hall-ui/public/profile.js","line":118,"string_id":"df335a1224ae","state":"ideator","occurrences":3},
|
|
2401
2401
|
{"key":"L0019","section":"profile","text":"Ideator, {…} role","placement":"unplaced","state":"ideator"},
|
|
2402
2402
|
{"key":"L0020","section":"profile","text":"Artist, {…} role","placement":"unplaced","state":"artist"},
|
|
2403
|
-
{"key":"L0021","section":"Activity, by role","text":"Activity, by role","placement":"placed","file":"modules/hall-ui/public/profile.html","line":
|
|
2404
|
-
{"key":"L0022","section":"Activity, by role","text":"What this builder has done, seen one role at a time.","placement":"placed","file":"modules/hall-ui/public/profile.html","line":
|
|
2403
|
+
{"key":"L0021","section":"Activity, by role","text":"Activity, by role","placement":"placed","file":"modules/hall-ui/public/profile.html","line":138,"string_id":"d628b36ec58e","state":"activity"},
|
|
2404
|
+
{"key":"L0022","section":"Activity, by role","text":"What this builder has done, seen one role at a time.","placement":"placed","file":"modules/hall-ui/public/profile.html","line":139,"string_id":"a444ad812e4f","state":"activity"},
|
|
2405
2405
|
{"key":"L0023","section":"Activity, by role","text":"Artist","placement":"unplaced","state":"activity-artist"},
|
|
2406
2406
|
{"key":"L0024","section":"Activity, by role","text":"Ideator","placement":"unplaced","state":"activity"},
|
|
2407
2407
|
{"key":"L0025","section":"Activity, by role","text":"{…} file{…}","placement":"placed","file":"modules/hall-ui/public/gate.js","line":151,"string_id":"3efa67dc6e07","state":"activity-ideator","occurrences":3},
|
|
@@ -2446,7 +2446,7 @@
|
|
|
2446
2446
|
{"key":"L0064","section":"Activity, by role","text":"after","placement":"unplaced","state":"activity-artist","occurrences":4},
|
|
2447
2447
|
{"key":"L0065","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":471,"string_id":"1883ad7f07fc","state":"activity-artist","occurrences":4},
|
|
2448
2448
|
{"key":"L0066","section":"Activity, by role","text":"Builders hall · this session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":352,"string_id":"fd1903586e8e","state":"activity-artist"},
|
|
2449
|
-
{"key":"L0067","section":"Works completed","text":"Works completed","placement":"placed","file":"modules/hall-ui/public/profile.html","line":
|
|
2449
|
+
{"key":"L0067","section":"Works completed","text":"Works completed","placement":"placed","file":"modules/hall-ui/public/profile.html","line":149,"string_id":"0e6b8e8f26cc","state":"activity"},
|
|
2450
2450
|
{"key":"L0068","section":"Works completed","text":"Role","placement":"unplaced","state":"activity"},
|
|
2451
2451
|
{"key":"L0069","section":"Works completed","text":"Shipped","placement":"placed","file":"modules/hall-ui/public/task.js","line":677,"string_id":"0c0a50ba1666","state":"activity"},
|
|
2452
2452
|
{"key":"L0070","section":"Works completed","text":"{…} file{…}","placement":"placed","file":"modules/hall-ui/public/gate.js","line":151,"string_id":"3efa67dc6e07","state":"activity","occurrences":3},
|
|
@@ -2459,7 +2459,7 @@
|
|
|
2459
2459
|
{"key":"L0077","section":"Works completed","text":"‹ Prev","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":74,"string_id":"de8fa5223aee","state":"activity"},
|
|
2460
2460
|
{"key":"L0078","section":"Works completed","text":"Page {…} of {…}","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":112,"string_id":"15a49bf15007","state":"activity"},
|
|
2461
2461
|
{"key":"L0079","section":"Works completed","text":"Next ›","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":74,"string_id":"f52ba261d930","state":"activity"},
|
|
2462
|
-
{"key":"L0080","section":"Goals created","text":"Goals created","placement":"placed","file":"modules/hall-ui/public/profile.html","line":
|
|
2462
|
+
{"key":"L0080","section":"Goals created","text":"Goals created","placement":"placed","file":"modules/hall-ui/public/profile.html","line":154,"string_id":"6a85997bda21","state":"activity"},
|
|
2463
2463
|
{"key":"L0081","section":"Goals created","text":"Goal","placement":"placed","file":"modules/hall-ui/public/gate.js","line":360,"string_id":"ec88b946ad16","state":"activity"},
|
|
2464
2464
|
{"key":"L0082","section":"Goals created","text":"Roles","placement":"unplaced","state":"activity"},
|
|
2465
2465
|
{"key":"L0083","section":"Goals created","text":"Progress","placement":"unplaced","state":"activity"},
|
|
@@ -2467,7 +2467,7 @@
|
|
|
2467
2467
|
{"key":"L0085","section":"Goals created","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","state":"activity"},
|
|
2468
2468
|
{"key":"L0086","section":"Goals created","text":"Builders hall · this session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":352,"string_id":"fd1903586e8e","state":"activity"},
|
|
2469
2469
|
{"key":"L0087","section":"Works","text":"Works","placement":"unplaced","state":"works"},
|
|
2470
|
-
{"key":"L0088","section":"Works","text":"Everything this builder has shipped. Seen one role at a time, with goals and ideas, under","placement":"placed","file":"modules/hall-ui/public/profile.html","line":
|
|
2470
|
+
{"key":"L0088","section":"Works","text":"Everything this builder has shipped. Seen one role at a time, with goals and ideas, under","placement":"placed","file":"modules/hall-ui/public/profile.html","line":113,"string_id":"37110f7e2b27","state":"works"},
|
|
2471
2471
|
{"key":"L0089","section":"Works","text":"activity","placement":"unplaced","state":"works"},
|
|
2472
2472
|
{"key":"L0090","section":"Works","text":"Credits","placement":"unplaced","state":"works"},
|
|
2473
2473
|
{"key":"L0091","section":"Works","text":"Shipped","placement":"placed","file":"modules/hall-ui/public/task.js","line":677,"string_id":"0c0a50ba1666","state":"works"},
|
|
@@ -2485,7 +2485,7 @@
|
|
|
2485
2485
|
{"key":"L0103","section":"profile","text":"this week","placement":"unplaced","state":"artist"},
|
|
2486
2486
|
{"key":"L0104","section":"profile","text":"works {…}","placement":"unplaced"},
|
|
2487
2487
|
{"key":"L0105","section":"profile","text":"karma","placement":"unplaced"},
|
|
2488
|
-
{"key":"L0106","section":"By the numbers","text":"By the numbers","placement":"placed","file":"modules/hall-ui/public/profile.html","line":
|
|
2488
|
+
{"key":"L0106","section":"By the numbers","text":"By the numbers","placement":"placed","file":"modules/hall-ui/public/profile.html","line":65,"string_id":"181cfa50b127"},
|
|
2489
2489
|
{"key":"L0107","section":"By the numbers","text":"works {…}","placement":"unplaced"},
|
|
2490
2490
|
{"key":"L0108","section":"By the numbers","text":"all kinds, see below","placement":"unplaced"},
|
|
2491
2491
|
{"key":"L0109","section":"By the numbers","text":"karma","placement":"unplaced"},
|
|
@@ -2508,7 +2508,7 @@
|
|
|
2508
2508
|
{"key":"L0126","section":"pages tweaked, per surface","text":"pages tweaked, per surface","placement":"placed","file":"modules/hall-ui/public/profile.js","line":183,"string_id":"356573640ce1","state":"artist"},
|
|
2509
2509
|
{"key":"L0127","section":"pages tweaked, per surface","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","state":"artist","occurrences":3},
|
|
2510
2510
|
{"key":"L0128","section":"By the numbers","text":"2 ignited","placement":"unplaced"},
|
|
2511
|
-
{"key":"L0129","section":"Over time","text":"Over time","placement":"placed","file":"modules/hall-ui/public/profile.html","line":
|
|
2511
|
+
{"key":"L0129","section":"Over time","text":"Over time","placement":"placed","file":"modules/hall-ui/public/profile.html","line":77,"string_id":"695ffff13730"},
|
|
2512
2512
|
{"key":"L0130","section":"Over time","text":"30 days","placement":"unplaced"},
|
|
2513
2513
|
{"key":"L0131","section":"Over time","text":"90 days","placement":"unplaced"},
|
|
2514
2514
|
{"key":"L0132","section":"Over time","text":"1 year","placement":"unplaced"},
|
|
@@ -2548,7 +2548,7 @@
|
|
|
2548
2548
|
{"key":"L0166","section":"Achievements","text":"Achievements","placement":"unplaced"},
|
|
2549
2549
|
{"key":"L0167","section":"Achievements","text":"No achievements earned yet.","placement":"placed","file":"modules/hall-ui/public/profile.js","line":199,"string_id":"c255749ec989","state":"ideator"},
|
|
2550
2550
|
{"key":"L0168","section":"Achievements","text":"Won {…}","placement":"placed","file":"modules/hall-ui/public/profile.js","line":206,"string_id":"c5fd76a9e03d","occurrences":2},
|
|
2551
|
-
{"key":"L0169","section":"Cross-project record","text":"Cross-project record","placement":"placed","file":"modules/hall-ui/public/profile.html","line":
|
|
2551
|
+
{"key":"L0169","section":"Cross-project record","text":"Cross-project record","placement":"placed","file":"modules/hall-ui/public/profile.html","line":99,"string_id":"a55e423263f0"},
|
|
2552
2552
|
{"key":"L0170","section":"Cross-project record","text":"Works {…}","placement":"unplaced"},
|
|
2553
2553
|
{"key":"L0171","section":"Cross-project record","text":"Credits","placement":"unplaced"},
|
|
2554
2554
|
{"key":"L0172","section":"Cross-project record","text":"Karma","placement":"unplaced"},
|
|
@@ -6,9 +6,10 @@
|
|
|
6
6
|
<title>Profile — {{worldName}}</title>
|
|
7
7
|
<meta name="description" content="A builder of {{worldName}} — rank, works shipped, standing, and achievements.">
|
|
8
8
|
<!-- The platform hub's apex, stamped server-side (P08, task 1002804; ADR 0214
|
|
9
|
-
D2).
|
|
10
|
-
|
|
11
|
-
same-host URL claiming
|
|
9
|
+
D2), read through OTB.hubOrigin() (the profile nudge's link to the hub).
|
|
10
|
+
Empty on a vanilla instance, and then no hub link renders — a meta, never
|
|
11
|
+
an href, so an empty value cannot degrade into a same-host URL claiming
|
|
12
|
+
to be the hub. -->
|
|
12
13
|
<meta name="hub-origin" content="{{hubOrigin}}">
|
|
13
14
|
<link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
|
|
14
15
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
@@ -223,10 +224,6 @@
|
|
|
223
224
|
exists by the time renderProfile runs; profile.js guards on it anyway, so a
|
|
224
225
|
page that omits this script simply has no connections section. -->
|
|
225
226
|
<script src="/builders/profile-connections.js?v=2026-08-29-r20"></script>
|
|
226
|
-
<!-- Canonical-profile wiring (P08). Loaded BEFORE profile.js so
|
|
227
|
-
window.OTBCanonical exists when renderProfile runs; profile.js guards on it,
|
|
228
|
-
so a page that omits this script simply declares no canonical. -->
|
|
229
|
-
<script src="/builders/profile-canonical.js?v=2026-08-29-p08"></script>
|
|
230
227
|
<!-- The charts (task 1003489). Loaded BEFORE profile.js so window.OTBProfileCharts
|
|
231
228
|
exists when renderProfile runs; profile.js guards on it, so a page that
|
|
232
229
|
omits this script simply has no charts section content. -->
|
|
@@ -965,11 +965,6 @@
|
|
|
965
965
|
// reveals its own section or leaves it hidden. Optional by design: a page
|
|
966
966
|
// that does not load it simply has no connections section.
|
|
967
967
|
if (window.OTBConnections) window.OTBConnections.render(data, selfId);
|
|
968
|
-
// Canonical-profile wiring (P08, task 1002804) — the rel=canonical + the
|
|
969
|
-
// link-out to the cross-project record on a federated instance, and the
|
|
970
|
-
// numeric-id redirect on the hub. Optional the same way: a page without the
|
|
971
|
-
// script declares no canonical rather than breaking.
|
|
972
|
-
if (window.OTBCanonical) window.OTBCanonical.render(data);
|
|
973
968
|
}
|
|
974
969
|
|
|
975
970
|
// Render the friendly "no builder chosen" empty state for a signed-out visitor
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.21.
|
|
3
|
+
"version": "1.21.66",
|
|
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.66",
|
|
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.66",
|
|
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
|
@@ -9166,5 +9166,11 @@
|
|
|
9166
9166
|
"id": "1002534",
|
|
9167
9167
|
"text": "The Discord bot can now answer questions in #support when someone @-mentions it, using only the project's public newcomer docs. It ships switched off: it starts answering once the owner adds an Anthropic key and turns it on, a"
|
|
9168
9168
|
}
|
|
9169
|
+
],
|
|
9170
|
+
"1.21.66": [
|
|
9171
|
+
{
|
|
9172
|
+
"id": "1003451",
|
|
9173
|
+
"text": "The builder profile page no longer downloads a script that could never run; nothing on the page changes for anyone."
|
|
9174
|
+
}
|
|
9169
9175
|
]
|
|
9170
9176
|
}
|
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.66'; // 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');
|
|
@@ -9,14 +9,15 @@
|
|
|
9
9
|
// OWN WHERE CLAUSE and throws on a placeholder or a literal comparison it did
|
|
10
10
|
// not consume, so a predicate this file cannot read can never degrade into "no
|
|
11
11
|
// constraint" and quietly pass. The REAL core router runs above it over a REAL
|
|
12
|
-
// loopback socket
|
|
13
|
-
// Nothing here asserts against a canned response.
|
|
12
|
+
// loopback socket. Nothing here asserts against a canned response.
|
|
14
13
|
//
|
|
15
|
-
// THE FLAG IS FALSE
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
14
|
+
// THE FLAG IS FALSE (ADR 0214 D1), and the page that would flip it (goal
|
|
15
|
+
// 1000048 R14, task 1002365) was abandoned. So the browser half that would have
|
|
16
|
+
// rendered rel=canonical, the link-out and the numeric-id redirect was removed
|
|
17
|
+
// (task 1003451): it shipped 137 lines of permanently dead branches to every
|
|
18
|
+
// /profile reader. The server half stays — getPublicHandle is live, and the
|
|
19
|
+
// resolver is what a rebuilt page will call. The test below pins the absence,
|
|
20
|
+
// and fails the moment the flag flips without the browser half coming back.
|
|
20
21
|
//
|
|
21
22
|
// LANE: DB-free. It must run on every PR, where there is no Postgres. The last
|
|
22
23
|
// test asserts that membership from the runner's own source (learning 1000218 —
|
|
@@ -26,7 +27,6 @@
|
|
|
26
27
|
import { test } from 'node:test';
|
|
27
28
|
import assert from 'node:assert/strict';
|
|
28
29
|
import http from 'node:http';
|
|
29
|
-
import vm from 'node:vm';
|
|
30
30
|
import express from 'express';
|
|
31
31
|
import { createRequire } from 'node:module';
|
|
32
32
|
import { readFileSync } from 'node:fs';
|
|
@@ -48,7 +48,6 @@ const require = createRequire(import.meta.url);
|
|
|
48
48
|
const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
|
|
49
49
|
const read = (...p) => readFileSync(join(ROOT, ...p), 'utf8');
|
|
50
50
|
|
|
51
|
-
const CLIENT_SRC = read('modules', 'hall-ui', 'public', 'profile-canonical.js');
|
|
52
51
|
const MODULE_SRC = read('modules', 'platform-identity', 'canonical-profile.js');
|
|
53
52
|
const PROFILE_JS = read('modules', 'hall-ui', 'public', 'profile.js');
|
|
54
53
|
const PROFILE_HTML = read('modules', 'hall-ui', 'public', 'profile.html');
|
|
@@ -429,154 +428,21 @@ test('an older hub provider without getPublicHandle degrades to null instead of
|
|
|
429
428
|
test.after(() => server.close());
|
|
430
429
|
|
|
431
430
|
// ===========================================================================
|
|
432
|
-
// The
|
|
431
|
+
// The wiring: the page and the stamp
|
|
433
432
|
// ===========================================================================
|
|
434
433
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
function boot(src, { hubOriginMeta, modules, search } = {}) {
|
|
444
|
-
const head = { children: [], appendChild(el) { this.children.push(el); } };
|
|
445
|
-
const els = new Map();
|
|
446
|
-
const el = (id) => {
|
|
447
|
-
if (!els.has(id)) els.set(id, { id, hidden: true, _html: '', attrs: {}, setAttribute(k, v) { this.attrs[k] = v; }, getAttribute(k) { return this.attrs[k] ?? null; }, set innerHTML(v) { this._html = String(v); }, get innerHTML() { return this._html; } });
|
|
448
|
-
return els.get(id);
|
|
449
|
-
};
|
|
450
|
-
const meta = hubOriginMeta === undefined ? null : { getAttribute: () => hubOriginMeta };
|
|
451
|
-
const replaced = [];
|
|
452
|
-
const assigned = [];
|
|
453
|
-
const sandbox = {
|
|
454
|
-
console: { error() {}, warn() {}, log() {} },
|
|
455
|
-
URL,
|
|
456
|
-
URLSearchParams,
|
|
457
|
-
document: {
|
|
458
|
-
head,
|
|
459
|
-
querySelector: (sel) => (sel === 'meta[name="hub-origin"]' ? meta : (head.children.find((c) => c.attrs.rel === 'canonical') || null)),
|
|
460
|
-
getElementById: (id) => (id === 'xp-scroll' || id === 'xp-body' ? el(id) : null),
|
|
461
|
-
createElement: () => ({ attrs: {}, setAttribute(k, v) { this.attrs[k] = v; }, getAttribute(k) { return this.attrs[k] ?? null; } }),
|
|
462
|
-
},
|
|
463
|
-
// `assign` is stubbed too, and deliberately records into a SEPARATE list:
|
|
464
|
-
// swapping replace→assign must fail on the assertion (the numeric URL would
|
|
465
|
-
// stay in history as a place Back returns to), not crash on an undefined
|
|
466
|
-
// method, which would "pass" the mutation check for the wrong reason.
|
|
467
|
-
location: { search: search || '', replace: (u) => replaced.push(u), assign: (u) => assigned.push(u), href: '' },
|
|
468
|
-
window: { OTB: { escapeHtml: (s) => String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"') }, __MODULES__: modules || [] },
|
|
469
|
-
};
|
|
470
|
-
sandbox.globalThis = sandbox;
|
|
471
|
-
vm.createContext(sandbox);
|
|
472
|
-
vm.runInContext(src, sandbox, { filename: 'profile-canonical.js' });
|
|
473
|
-
return {
|
|
474
|
-
api: sandbox.window.OTBCanonical,
|
|
475
|
-
canonicalHref: () => { const l = head.children.find((c) => c.attrs.rel === 'canonical'); return l ? l.attrs.href : null; },
|
|
476
|
-
xp: () => el('xp-scroll'),
|
|
477
|
-
xpHtml: () => el('xp-body').innerHTML,
|
|
478
|
-
replaced,
|
|
479
|
-
assigned,
|
|
480
|
-
};
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
const FEDERATED = { hubOriginMeta: 'https://cloudbongos.com', modules: ['lifecycle', 'hall-ui'] };
|
|
484
|
-
const HUB = { hubOriginMeta: 'https://cloudbongos.com', modules: ['platform-identity', 'hall-ui'] };
|
|
485
|
-
|
|
486
|
-
test('DARK today: with the shipped source nothing is emitted, anywhere', () => {
|
|
487
|
-
const fed = boot(CLIENT_SRC, FEDERATED);
|
|
488
|
-
fed.api.render({ handle: 'ada' });
|
|
489
|
-
assert.equal(fed.canonicalHref(), null, 'a canonical must not name a URL that 404s');
|
|
490
|
-
assert.equal(fed.xp().hidden, true);
|
|
491
|
-
const hub = boot(CLIENT_SRC, { ...HUB, search: '?id=7' });
|
|
492
|
-
hub.api.render({ handle: 'ada' });
|
|
493
|
-
assert.deepEqual(hub.replaced, [], 'redirecting a working page to a 404 would be the worst of the three');
|
|
494
|
-
});
|
|
495
|
-
|
|
496
|
-
test('LIVE, federated: rel=canonical points at the hub and the link-out is visible', () => {
|
|
497
|
-
const page = boot(LIVE_SRC, FEDERATED);
|
|
498
|
-
page.api.render({ handle: 'ada' });
|
|
499
|
-
assert.equal(page.canonicalHref(), 'https://cloudbongos.com/u/ada');
|
|
500
|
-
assert.equal(page.xp().hidden, false);
|
|
501
|
-
assert.match(page.xpHtml(), /href="https:\/\/cloudbongos\.com\/u\/ada"/);
|
|
502
|
-
assert.match(page.xpHtml(), /See the cross-project record/,
|
|
503
|
-
'the link-out is what ADR 0171 D1 asks a federated instance to render instead of inlining numbers');
|
|
504
|
-
assert.deepEqual(page.replaced, [], 'a federated instance shows its OWN record — it must never redirect away from it');
|
|
505
|
-
});
|
|
506
|
-
|
|
507
|
-
test('LIVE, hub: the numeric ?id= form redirects to the canonical handle URL', () => {
|
|
508
|
-
const page = boot(LIVE_SRC, { ...HUB, search: '?id=7' });
|
|
509
|
-
page.api.render({ handle: 'ada' });
|
|
510
|
-
assert.deepEqual(page.replaced, ['https://cloudbongos.com/u/ada']);
|
|
511
|
-
assert.equal(page.canonicalHref(), null, 'a page that redirects must not also declare a canonical');
|
|
512
|
-
});
|
|
513
|
-
|
|
514
|
-
test('LIVE, hub without ?id=: the self view is not redirected', () => {
|
|
515
|
-
const page = boot(LIVE_SRC, { ...HUB, search: '' });
|
|
516
|
-
page.api.render({ handle: 'ada' });
|
|
517
|
-
assert.deepEqual(page.replaced, [], 'the handle-less /profile is the viewer\'s own page, not a numeric address');
|
|
518
|
-
});
|
|
519
|
-
|
|
520
|
-
test('LIVE: no handle means no canonical, no link-out and NO REDIRECT — the fallback is a working page', () => {
|
|
521
|
-
for (const data of [{}, { handle: null }, { handle: '' }]) {
|
|
522
|
-
const fed = boot(LIVE_SRC, FEDERATED);
|
|
523
|
-
fed.api.render(data);
|
|
524
|
-
assert.equal(fed.canonicalHref(), null);
|
|
525
|
-
assert.equal(fed.xp().hidden, true);
|
|
526
|
-
|
|
527
|
-
const hub = boot(LIVE_SRC, { ...HUB, search: '?id=7' });
|
|
528
|
-
hub.api.render(data);
|
|
529
|
-
assert.deepEqual(hub.replaced, [],
|
|
530
|
-
'absent, provisional and private all arrive here as a missing handle and all get the ordinary local page — there is no error shape to read a signal off');
|
|
531
|
-
}
|
|
532
|
-
});
|
|
533
|
-
|
|
534
|
-
test('LIVE: a vanilla instance with no hub origin emits nothing', () => {
|
|
535
|
-
for (const meta of [undefined, '', ' ', 'http://cloudbongos.com', 'https://cloudbongos.com/u']) {
|
|
536
|
-
const page = boot(LIVE_SRC, { hubOriginMeta: meta, modules: [] });
|
|
537
|
-
page.api.render({ handle: 'ada' });
|
|
538
|
-
assert.equal(page.canonicalHref(), null, `an unusable hub-origin meta (${JSON.stringify(meta)}) must produce no canonical, never a relative one`);
|
|
539
|
-
assert.equal(page.xp().hidden, true);
|
|
540
|
-
}
|
|
541
|
-
});
|
|
542
|
-
|
|
543
|
-
test('LIVE: a hostile handle from the wire never reaches an href', () => {
|
|
544
|
-
for (const handle of ['ada/../../admin', 'ada"onload=x', '../evil', 'a b']) {
|
|
545
|
-
const page = boot(LIVE_SRC, FEDERATED);
|
|
546
|
-
page.api.render({ handle });
|
|
547
|
-
assert.equal(page.canonicalHref(), null, `handle ${JSON.stringify(handle)} must be refused, not encoded`);
|
|
548
|
-
}
|
|
549
|
-
});
|
|
550
|
-
|
|
551
|
-
// ===========================================================================
|
|
552
|
-
// The wiring: the mirror, the page, and the stamp
|
|
553
|
-
// ===========================================================================
|
|
554
|
-
|
|
555
|
-
test('the client mirror and the module agree on both constants', () => {
|
|
556
|
-
const liveInModule = /const CANONICAL_PROFILE_PAGE_LIVE = (true|false);/.exec(MODULE_SRC);
|
|
557
|
-
const liveInClient = /const CANONICAL_PROFILE_PAGE_LIVE = (true|false);/.exec(CLIENT_SRC);
|
|
558
|
-
assert.ok(liveInModule && liveInClient, 'both files must spell the flag as a plain const so this guard can read it');
|
|
559
|
-
assert.equal(liveInClient[1], liveInModule[1],
|
|
560
|
-
'the browser mirror has drifted from modules/platform-identity/canonical-profile.js — flip both or neither');
|
|
561
|
-
assert.equal(String(CANONICAL_PROFILE_PAGE_LIVE), liveInModule[1], 'the module export disagrees with its own source');
|
|
562
|
-
|
|
563
|
-
const prefixInClient = /const CANONICAL_PROFILE_PREFIX = '([^']+)';/.exec(CLIENT_SRC);
|
|
564
|
-
assert.ok(prefixInClient, 'the client must spell the prefix as a plain const');
|
|
565
|
-
assert.equal(prefixInClient[1], CANONICAL_PROFILE_PREFIX, 'the two canonical namespaces have drifted apart');
|
|
566
|
-
});
|
|
567
|
-
|
|
568
|
-
test('the profile page loads the script BEFORE profile.js, and profile.js calls it', () => {
|
|
569
|
-
// Match the <script> TAGS, not the filenames: both names also appear in the
|
|
570
|
-
// page's prose, and an ordering assertion that reads a comment proves nothing.
|
|
434
|
+
test('while the page is dark, /profile ships no canonical wiring at all (task 1003451)', () => {
|
|
435
|
+
// The browser half (profile-canonical.js) was removed when R14 — the
|
|
436
|
+
// /u/<handle> page that would have turned it on — was abandoned: 137 lines
|
|
437
|
+
// whose every branch sat behind a false flag, shipped to every /profile
|
|
438
|
+
// reader. Rebuild it with the page. Until then the module's flag is the one
|
|
439
|
+
// statement of "dark", and nothing in the hall may branch on it.
|
|
440
|
+
assert.equal(CANONICAL_PROFILE_PAGE_LIVE, false,
|
|
441
|
+
'the flag flipped: the /u/<handle> page now resolves, so the browser half (rel=canonical, link-out, numeric-id redirect) has to be rebuilt in this same change');
|
|
571
442
|
const tags = [...PROFILE_HTML.matchAll(/<script\s+src="\/builders\/([a-z-]+\.js)/g)].map((m) => m[1]);
|
|
572
|
-
assert.ok(tags.includes('profile
|
|
573
|
-
|
|
574
|
-
assert.
|
|
575
|
-
tags.indexOf('profile-canonical.js') < tags.indexOf('profile.js'),
|
|
576
|
-
`profile.js must load AFTER profile-canonical.js so window.OTBCanonical exists when renderProfile runs — got ${tags.join(', ')}`,
|
|
577
|
-
);
|
|
578
|
-
assert.match(PROFILE_JS, /window\.OTBCanonical\.render\(data\)/,
|
|
579
|
-
'profile.js must hand the profile response to the canonical wiring');
|
|
443
|
+
assert.ok(tags.includes('profile.js'), 'the tag reader matched nothing, so the next assertion would pass vacuously');
|
|
444
|
+
assert.ok(!tags.includes('profile-canonical.js'), 'the page loads a canonical script whose every branch is dead');
|
|
445
|
+
assert.doesNotMatch(PROFILE_JS, /OTBCanonical/, 'profile.js branches on a canonical wiring that does not exist');
|
|
580
446
|
});
|
|
581
447
|
|
|
582
448
|
test('the hub origin is stamped as a meta, and never straight into an href', () => {
|
|
@@ -593,9 +459,9 @@ test('the hub origin is stamped as a meta, and never straight into an href', ()
|
|
|
593
459
|
});
|
|
594
460
|
|
|
595
461
|
test('the resolver is the ONLY place that spells the canonical namespace', () => {
|
|
596
|
-
//
|
|
597
|
-
//
|
|
598
|
-
const owners = ['modules/platform-identity/canonical-profile.js'
|
|
462
|
+
// One file carries it: the module. A second would be a second opinion
|
|
463
|
+
// about where a profile lives.
|
|
464
|
+
const owners = ['modules/platform-identity/canonical-profile.js'];
|
|
599
465
|
const offenders = [];
|
|
600
466
|
const walk = (rel) => {
|
|
601
467
|
for (const e of require('node:fs').readdirSync(join(ROOT, rel), { withFileTypes: true })) {
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
// modules/hall-ui/public/profile-canonical.js — the canonical-profile wiring on
|
|
2
|
-
// the hall's profile page (P08, task 1002804; ADR 0214, ADR 0171 D1,
|
|
3
|
-
// profile-page spec Decision 1).
|
|
4
|
-
//
|
|
5
|
-
// ONE ANSWER, THREE BEHAVIOURS. A builder has exactly one canonical public
|
|
6
|
-
// profile, at <hub>/u/<handle>. What this page does about that depends on which
|
|
7
|
-
// instance is serving it, and the two cases are opposites:
|
|
8
|
-
//
|
|
9
|
-
// * THE HUB serves the same person's canonical page itself, from the same
|
|
10
|
-
// database. Two URLs for one page on one host is the duplication Decision 1
|
|
11
|
-
// exists to end, so the numeric ?id= form REDIRECTS to the handle URL.
|
|
12
|
-
// * A FEDERATED INSTANCE shows its OWN rank, works and achievements here —
|
|
13
|
-
// genuinely different content — so it must not redirect. It stays the local
|
|
14
|
-
// view, declares the hub page canonical, and LINKS OUT to the cross-project
|
|
15
|
-
// record rather than inlining numbers it would have to keep fresh
|
|
16
|
-
// (ADR 0171 D1: an instance-side copy is stale the moment a builder hides).
|
|
17
|
-
// * A VANILLA INSTANCE has no hub. Nothing here does anything.
|
|
18
|
-
//
|
|
19
|
-
// A page cannot both redirect to a URL and declare it canonical, and it does not
|
|
20
|
-
// have to: those are two different instances.
|
|
21
|
-
//
|
|
22
|
-
// IT IS ALL DARK TODAY, ON PURPOSE. `/u/<handle>` does not exist yet — the page
|
|
23
|
-
// is goal 1000048 R14, and the ADR that fixes its PATH (R01) is unwritten. A
|
|
24
|
-
// rel=canonical naming a 404 consolidates nothing and risks the one page that
|
|
25
|
-
// works, so CANONICAL_PROFILE_PAGE_LIVE is false and every branch below is a
|
|
26
|
-
// no-op. ADR 0214 D1 carries the argument.
|
|
27
|
-
//
|
|
28
|
-
// NOTHING HERE IS AUTHORITY (ADR 0016): a canonical URL is an address, never a
|
|
29
|
-
// grant. And nothing here decides who is visible — the server already did that
|
|
30
|
-
// by omitting `handle` for an account that is absent, provisional or private,
|
|
31
|
-
// identically in all three cases (ADR 0214 D5).
|
|
32
|
-
|
|
33
|
-
(() => {
|
|
34
|
-
'use strict';
|
|
35
|
-
|
|
36
|
-
// BOUNDARY-FORCED DUPLICATION (the ADR 0091 §2 pattern, as
|
|
37
|
-
// platform-identity.js already does for the display-name cap): a browser
|
|
38
|
-
// script cannot require modules/platform-identity/canonical-profile.js, so the
|
|
39
|
-
// two constants below MIRROR it. tests/canonical_profile_url.mjs reads both
|
|
40
|
-
// files and fails if they ever disagree, which is what keeps this a mirror
|
|
41
|
-
// rather than a second opinion. Flip the module's copy and this one together.
|
|
42
|
-
const CANONICAL_PROFILE_PAGE_LIVE = false;
|
|
43
|
-
const CANONICAL_PROFILE_PREFIX = '/u/';
|
|
44
|
-
|
|
45
|
-
// Same charset the module re-checks: a handle is about to be interpolated into
|
|
46
|
-
// an href and a <link rel=canonical>, so it is validated here too rather than
|
|
47
|
-
// trusted because it arrived over the wire.
|
|
48
|
-
const HANDLE_RE = /^[a-z0-9-]{1,39}$/;
|
|
49
|
-
|
|
50
|
-
// The hub apex, stamped server-side into a <meta> (never a script global, and
|
|
51
|
-
// never straight into an href — an empty value in an href would silently
|
|
52
|
-
// become a same-host relative URL claiming to be the hub). Absent or empty
|
|
53
|
-
// means "no hub", and every branch below then does nothing.
|
|
54
|
-
function hubOrigin() {
|
|
55
|
-
const meta = document.querySelector('meta[name="hub-origin"]');
|
|
56
|
-
const raw = ((meta && meta.getAttribute('content')) || '').trim().replace(/\/+$/, '');
|
|
57
|
-
if (!raw) return null;
|
|
58
|
-
// Bare https origin only — a canonical must never name a downgraded scheme,
|
|
59
|
-
// and a value carrying a path is not an origin.
|
|
60
|
-
try {
|
|
61
|
-
const url = new URL(raw);
|
|
62
|
-
if (url.protocol !== 'https:' || url.username || url.password) return null;
|
|
63
|
-
if (url.pathname !== '/' || url.search || url.hash) return null;
|
|
64
|
-
return url.origin;
|
|
65
|
-
} catch (err) { return null; }
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// The canonical public profile URL, or null when we must not point anywhere:
|
|
69
|
-
// the page is not live, no hub is known, or the account has no public handle
|
|
70
|
-
// (absent / provisional / private — indistinguishable by design).
|
|
71
|
-
function canonicalProfileUrl(handle) {
|
|
72
|
-
if (!CANONICAL_PROFILE_PAGE_LIVE) return null;
|
|
73
|
-
const origin = hubOrigin();
|
|
74
|
-
if (!origin) return null;
|
|
75
|
-
const h = String(handle == null ? '' : handle).trim().toLowerCase();
|
|
76
|
-
if (!HANDLE_RE.test(h)) return null;
|
|
77
|
-
return `${origin}${CANONICAL_PROFILE_PREFIX}${h}`;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// "Am I the hub?" — the enabled-module set the server injects. `platform-
|
|
81
|
-
// identity` IS the hub flag rather than a proxy for it (src/platform-server.js
|
|
82
|
-
// says so), so this asks the instance what it is and nothing has to know the
|
|
83
|
-
// platform's hostname.
|
|
84
|
-
function isHub() {
|
|
85
|
-
const mods = window.__MODULES__;
|
|
86
|
-
return Array.isArray(mods) ? mods.includes('platform-identity') : !!(mods && mods['platform-identity']);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function setCanonicalLink(url) {
|
|
90
|
-
let link = document.querySelector('link[rel="canonical"]');
|
|
91
|
-
if (!link) {
|
|
92
|
-
link = document.createElement('link');
|
|
93
|
-
link.setAttribute('rel', 'canonical');
|
|
94
|
-
document.head.appendChild(link);
|
|
95
|
-
}
|
|
96
|
-
link.setAttribute('href', url);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// The visible link-out — ADR 0171 D1's federated render path. It reuses the
|
|
100
|
-
// page's existing cross-project section, which on a federated instance is
|
|
101
|
-
// empty and hidden (the response carries no cross_project key there), so the
|
|
102
|
-
// heading a reader already understands gets the link instead of numbers.
|
|
103
|
-
function renderLinkOut(url) {
|
|
104
|
-
const section = document.getElementById('xp-scroll');
|
|
105
|
-
const body = document.getElementById('xp-body');
|
|
106
|
-
if (!section || !body) return;
|
|
107
|
-
// Defence in depth, and honestly UNOBSERVABLE today: canonicalProfileUrl has
|
|
108
|
-
// already refused anything outside `https://<bare origin>/u/[a-z0-9-]{1,39}`,
|
|
109
|
-
// so no value reaching here can contain a character this changes. It is the
|
|
110
|
-
// second wall for the day someone loosens the handle charset — a mutation
|
|
111
|
-
// test cannot make it bite, and that is the point rather than a gap.
|
|
112
|
-
const escapeHtml = (window.OTB && window.OTB.escapeHtml) || ((s) => String(s));
|
|
113
|
-
body.innerHTML = `<p class="scroll__lede">This builder's work spans more than this project. `
|
|
114
|
-
+ `<a href="${escapeHtml(url)}" rel="noopener">See the cross-project record</a>.</p>`;
|
|
115
|
-
section.hidden = false;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// render(data) — called by profile.js once the profile response is in hand.
|
|
119
|
-
// `data.handle` is present iff the builder has a PUBLICLY VISIBLE platform
|
|
120
|
-
// account; absent for no account, provisional and private alike, so nothing
|
|
121
|
-
// here can tell those apart and neither can a visitor watching it.
|
|
122
|
-
function render(data) {
|
|
123
|
-
const url = canonicalProfileUrl(data && data.handle);
|
|
124
|
-
if (!url) return;
|
|
125
|
-
if (isHub()) {
|
|
126
|
-
// The hub's numeric form is an address for a page the hub also serves at
|
|
127
|
-
// the canonical URL. `replace`, not `assign`: the numeric URL should not
|
|
128
|
-
// sit in history as a place Back returns to.
|
|
129
|
-
if (new URLSearchParams(location.search).get('id')) location.replace(url);
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
setCanonicalLink(url);
|
|
133
|
-
renderLinkOut(url);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
window.OTBCanonical = { render, canonicalProfileUrl, hubOrigin, isHub };
|
|
137
|
-
})();
|