@bongos/core 1.19.427 → 1.19.429
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 +75 -35
- package/clients/bongos-client/index.d.ts +1 -1
- package/docs/adr/0213-platform-terms-acceptance-is-the-hubs-own-witness.md +71 -0
- package/docs/adr/0214-canonical-profile-url-one-resolver-dark-until-the-page-exists.md +90 -0
- package/docs/adr/README.md +2 -0
- package/docs/api/openapi.json +3 -2
- package/docs/copy-inventory.md +45 -36
- package/docs/copy-registry.json +127 -46
- package/docs/file-map.md +3 -1
- package/docs/module-api-changelog.md +4 -0
- package/modules/hall-ui/public/profile-canonical.js +137 -0
- package/modules/hall-ui/public/profile-connections.js +20 -9
- package/modules/hall-ui/public/profile.html +9 -0
- package/modules/hall-ui/public/profile.js +5 -0
- package/modules/platform-identity/account-visibility.js +31 -12
- package/modules/platform-identity/canonical-profile.js +143 -0
- package/modules/platform-identity/connections.js +4 -3
- package/modules/platform-identity/migrations/platform_identity_019_terms_acceptance.sql +47 -0
- package/modules/platform-identity/platform-identity.js +12 -10
- package/modules/platform-identity/routes/connections.js +4 -3
- package/modules/platform-identity/routes/sso.js +7 -0
- package/modules/platform-identity/terms-acceptance.js +97 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/public-landing/terms.html +8 -0
- package/src/bongos/routes/builders.js +24 -2
- package/src/bongos/serve-internal.js +28 -2
- package/src/module-api.js +1 -1
- package/tests/canonical_profile_url.mjs +628 -0
- package/tests/connections_api.mjs +13 -8
- package/tests/connections_ownership.mjs +6 -1
- package/tests/effective_visibility_predicate.mjs +89 -14
- package/tests/profile_connections_ui.mjs +60 -7
- package/tests/profile_privacy_owner_view.mjs +31 -4
- package/tests/profile_route.mjs +45 -13
- package/tests/terms_acceptance.mjs +573 -0
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": 1589,
|
|
7
|
+
"unique_ids": 1383,
|
|
8
|
+
"certain": 1589,
|
|
9
9
|
"heuristic": 0,
|
|
10
10
|
"duplicate_ids": 157
|
|
11
11
|
},
|
|
12
12
|
"surfaces": {
|
|
13
13
|
"builders-hall": {
|
|
14
14
|
"at": "modules/hall-ui/public",
|
|
15
|
-
"files":
|
|
16
|
-
"strings":
|
|
15
|
+
"files": 74,
|
|
16
|
+
"strings": 1165
|
|
17
17
|
},
|
|
18
18
|
"status-dashboard": {
|
|
19
19
|
"at": "modules/status-ui/public",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"landing": {
|
|
24
24
|
"at": "public-landing",
|
|
25
25
|
"files": 5,
|
|
26
|
-
"strings":
|
|
26
|
+
"strings": 326
|
|
27
27
|
}
|
|
28
28
|
},
|
|
29
29
|
"blind_spots": [
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
"public-landing/index.html:900",
|
|
93
93
|
"public-landing/privacy.html:80",
|
|
94
94
|
"public-landing/projects.html:1115",
|
|
95
|
-
"public-landing/terms.html:
|
|
95
|
+
"public-landing/terms.html:84"
|
|
96
96
|
]
|
|
97
97
|
},
|
|
98
98
|
{
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
"public-landing/index.html:900",
|
|
106
106
|
"public-landing/privacy.html:80",
|
|
107
107
|
"public-landing/projects.html:1115",
|
|
108
|
-
"public-landing/terms.html:
|
|
108
|
+
"public-landing/terms.html:84"
|
|
109
109
|
]
|
|
110
110
|
},
|
|
111
111
|
{
|
|
@@ -142,7 +142,7 @@
|
|
|
142
142
|
"public-landing/contact.html:71",
|
|
143
143
|
"public-landing/index.html:900",
|
|
144
144
|
"public-landing/privacy.html:80",
|
|
145
|
-
"public-landing/terms.html:
|
|
145
|
+
"public-landing/terms.html:84"
|
|
146
146
|
]
|
|
147
147
|
},
|
|
148
148
|
{
|
|
@@ -623,7 +623,7 @@
|
|
|
623
623
|
"text": "Cross-project record",
|
|
624
624
|
"occurrences": 2,
|
|
625
625
|
"at": [
|
|
626
|
-
"modules/hall-ui/public/profile.html:
|
|
626
|
+
"modules/hall-ui/public/profile.html:52",
|
|
627
627
|
"modules/hall-ui/public/settings.html:86"
|
|
628
628
|
]
|
|
629
629
|
},
|
|
@@ -1104,7 +1104,7 @@
|
|
|
1104
1104
|
"occurrences": 2,
|
|
1105
1105
|
"at": [
|
|
1106
1106
|
"public-landing/privacy.html:75",
|
|
1107
|
-
"public-landing/terms.html:
|
|
1107
|
+
"public-landing/terms.html:79"
|
|
1108
1108
|
]
|
|
1109
1109
|
},
|
|
1110
1110
|
{
|
|
@@ -1183,8 +1183,8 @@
|
|
|
1183
1183
|
"text": "Request sent",
|
|
1184
1184
|
"occurrences": 2,
|
|
1185
1185
|
"at": [
|
|
1186
|
-
"modules/hall-ui/public/profile-connections.js:
|
|
1187
|
-
"modules/hall-ui/public/profile-connections.js:
|
|
1186
|
+
"modules/hall-ui/public/profile-connections.js:86",
|
|
1187
|
+
"modules/hall-ui/public/profile-connections.js:134"
|
|
1188
1188
|
]
|
|
1189
1189
|
},
|
|
1190
1190
|
{
|
|
@@ -1414,7 +1414,7 @@
|
|
|
1414
1414
|
"occurrences": 2,
|
|
1415
1415
|
"at": [
|
|
1416
1416
|
"public-landing/privacy.html:72",
|
|
1417
|
-
"public-landing/terms.html:
|
|
1417
|
+
"public-landing/terms.html:80"
|
|
1418
1418
|
]
|
|
1419
1419
|
},
|
|
1420
1420
|
{
|
|
@@ -1484,7 +1484,7 @@
|
|
|
1484
1484
|
"occurrences": 2,
|
|
1485
1485
|
"at": [
|
|
1486
1486
|
"public-landing/contact.html:59",
|
|
1487
|
-
"public-landing/terms.html:
|
|
1487
|
+
"public-landing/terms.html:80"
|
|
1488
1488
|
]
|
|
1489
1489
|
},
|
|
1490
1490
|
{
|
|
@@ -2141,7 +2141,7 @@
|
|
|
2141
2141
|
"surface": "builders-hall",
|
|
2142
2142
|
"text": "Activity, by craft",
|
|
2143
2143
|
"file": "modules/hall-ui/public/profile.html",
|
|
2144
|
-
"line":
|
|
2144
|
+
"line": 89,
|
|
2145
2145
|
"origin": "html-text",
|
|
2146
2146
|
"confidence": "certain"
|
|
2147
2147
|
},
|
|
@@ -2663,7 +2663,7 @@
|
|
|
2663
2663
|
"surface": "builders-hall",
|
|
2664
2664
|
"text": "By the numbers",
|
|
2665
2665
|
"file": "modules/hall-ui/public/profile.html",
|
|
2666
|
-
"line":
|
|
2666
|
+
"line": 42,
|
|
2667
2667
|
"origin": "html-text",
|
|
2668
2668
|
"confidence": "certain"
|
|
2669
2669
|
},
|
|
@@ -3599,7 +3599,7 @@
|
|
|
3599
3599
|
"surface": "builders-hall",
|
|
3600
3600
|
"text": "Could not load the profile.",
|
|
3601
3601
|
"file": "modules/hall-ui/public/profile.js",
|
|
3602
|
-
"line":
|
|
3602
|
+
"line": 625,
|
|
3603
3603
|
"origin": "js-notice",
|
|
3604
3604
|
"confidence": "certain"
|
|
3605
3605
|
},
|
|
@@ -4112,7 +4112,7 @@
|
|
|
4112
4112
|
"surface": "builders-hall",
|
|
4113
4113
|
"text": "Cross-project record",
|
|
4114
4114
|
"file": "modules/hall-ui/public/profile.html",
|
|
4115
|
-
"line":
|
|
4115
|
+
"line": 52,
|
|
4116
4116
|
"origin": "html-text",
|
|
4117
4117
|
"confidence": "certain"
|
|
4118
4118
|
},
|
|
@@ -4517,7 +4517,7 @@
|
|
|
4517
4517
|
"surface": "builders-hall",
|
|
4518
4518
|
"text": "Every idea this builder captured — promoted, discarded, merged, or still open.",
|
|
4519
4519
|
"file": "modules/hall-ui/public/profile.html",
|
|
4520
|
-
"line":
|
|
4520
|
+
"line": 109,
|
|
4521
4521
|
"origin": "html-text",
|
|
4522
4522
|
"confidence": "certain"
|
|
4523
4523
|
},
|
|
@@ -4895,7 +4895,7 @@
|
|
|
4895
4895
|
"surface": "builders-hall",
|
|
4896
4896
|
"text": "Goals created",
|
|
4897
4897
|
"file": "modules/hall-ui/public/profile.html",
|
|
4898
|
-
"line":
|
|
4898
|
+
"line": 101,
|
|
4899
4899
|
"origin": "html-text",
|
|
4900
4900
|
"confidence": "certain"
|
|
4901
4901
|
},
|
|
@@ -5201,7 +5201,7 @@
|
|
|
5201
5201
|
"surface": "builders-hall",
|
|
5202
5202
|
"text": "Ideas filed, and what became of them",
|
|
5203
5203
|
"file": "modules/hall-ui/public/profile.html",
|
|
5204
|
-
"line":
|
|
5204
|
+
"line": 108,
|
|
5205
5205
|
"origin": "html-text",
|
|
5206
5206
|
"confidence": "certain"
|
|
5207
5207
|
},
|
|
@@ -5678,7 +5678,7 @@
|
|
|
5678
5678
|
"surface": "builders-hall",
|
|
5679
5679
|
"text": "Loading profile…",
|
|
5680
5680
|
"file": "modules/hall-ui/public/profile.html",
|
|
5681
|
-
"line":
|
|
5681
|
+
"line": 28,
|
|
5682
5682
|
"origin": "html-text",
|
|
5683
5683
|
"confidence": "certain"
|
|
5684
5684
|
},
|
|
@@ -7334,7 +7334,7 @@
|
|
|
7334
7334
|
"surface": "builders-hall",
|
|
7335
7335
|
"text": "Recent works",
|
|
7336
7336
|
"file": "modules/hall-ui/public/profile.html",
|
|
7337
|
-
"line":
|
|
7337
|
+
"line": 66,
|
|
7338
7338
|
"origin": "html-text",
|
|
7339
7339
|
"confidence": "certain"
|
|
7340
7340
|
},
|
|
@@ -7577,7 +7577,7 @@
|
|
|
7577
7577
|
"surface": "builders-hall",
|
|
7578
7578
|
"text": "Request sent",
|
|
7579
7579
|
"file": "modules/hall-ui/public/profile-connections.js",
|
|
7580
|
-
"line":
|
|
7580
|
+
"line": 86,
|
|
7581
7581
|
"origin": "js-markup",
|
|
7582
7582
|
"confidence": "certain"
|
|
7583
7583
|
},
|
|
@@ -7586,7 +7586,7 @@
|
|
|
7586
7586
|
"surface": "builders-hall",
|
|
7587
7587
|
"text": "Request sent",
|
|
7588
7588
|
"file": "modules/hall-ui/public/profile-connections.js",
|
|
7589
|
-
"line":
|
|
7589
|
+
"line": 134,
|
|
7590
7590
|
"origin": "js-markup",
|
|
7591
7591
|
"confidence": "certain"
|
|
7592
7592
|
},
|
|
@@ -7905,6 +7905,15 @@
|
|
|
7905
7905
|
"origin": "html-text",
|
|
7906
7906
|
"confidence": "certain"
|
|
7907
7907
|
},
|
|
7908
|
+
{
|
|
7909
|
+
"id": "a9c398651862",
|
|
7910
|
+
"surface": "builders-hall",
|
|
7911
|
+
"text": "See the cross-project record",
|
|
7912
|
+
"file": "modules/hall-ui/public/profile-canonical.js",
|
|
7913
|
+
"line": 114,
|
|
7914
|
+
"origin": "js-markup",
|
|
7915
|
+
"confidence": "certain"
|
|
7916
|
+
},
|
|
7908
7917
|
{
|
|
7909
7918
|
"id": "17d5b5739f46",
|
|
7910
7919
|
"surface": "builders-hall",
|
|
@@ -8162,7 +8171,7 @@
|
|
|
8162
8171
|
"surface": "builders-hall",
|
|
8163
8172
|
"text": "Sign in to the platform once to activate your profile before connecting.",
|
|
8164
8173
|
"file": "modules/hall-ui/public/profile-connections.js",
|
|
8165
|
-
"line":
|
|
8174
|
+
"line": 220,
|
|
8166
8175
|
"origin": "js-markup",
|
|
8167
8176
|
"confidence": "certain"
|
|
8168
8177
|
},
|
|
@@ -8288,7 +8297,7 @@
|
|
|
8288
8297
|
"surface": "builders-hall",
|
|
8289
8298
|
"text": "Something went wrong. Try again.",
|
|
8290
8299
|
"file": "modules/hall-ui/public/profile-connections.js",
|
|
8291
|
-
"line":
|
|
8300
|
+
"line": 275,
|
|
8292
8301
|
"origin": "js-notice",
|
|
8293
8302
|
"confidence": "certain"
|
|
8294
8303
|
},
|
|
@@ -8594,7 +8603,7 @@
|
|
|
8594
8603
|
"surface": "builders-hall",
|
|
8595
8604
|
"text": "That request is no longer available.",
|
|
8596
8605
|
"file": "modules/hall-ui/public/profile-connections.js",
|
|
8597
|
-
"line":
|
|
8606
|
+
"line": 270,
|
|
8598
8607
|
"origin": "js-notice",
|
|
8599
8608
|
"confidence": "certain"
|
|
8600
8609
|
},
|
|
@@ -8729,7 +8738,7 @@
|
|
|
8729
8738
|
"surface": "builders-hall",
|
|
8730
8739
|
"text": "The most recent works this builder has shipped.",
|
|
8731
8740
|
"file": "modules/hall-ui/public/profile.html",
|
|
8732
|
-
"line":
|
|
8741
|
+
"line": 67,
|
|
8733
8742
|
"origin": "html-text",
|
|
8734
8743
|
"confidence": "certain"
|
|
8735
8744
|
},
|
|
@@ -8954,7 +8963,7 @@
|
|
|
8954
8963
|
"surface": "builders-hall",
|
|
8955
8964
|
"text": "They have asked to connect.",
|
|
8956
8965
|
"file": "modules/hall-ui/public/profile-connections.js",
|
|
8957
|
-
"line":
|
|
8966
|
+
"line": 203,
|
|
8958
8967
|
"origin": "js-markup",
|
|
8959
8968
|
"confidence": "certain"
|
|
8960
8969
|
},
|
|
@@ -9458,7 +9467,7 @@
|
|
|
9458
9467
|
"surface": "builders-hall",
|
|
9459
9468
|
"text": "What this builder has done, seen one craft at a time.",
|
|
9460
9469
|
"file": "modules/hall-ui/public/profile.html",
|
|
9461
|
-
"line":
|
|
9470
|
+
"line": 90,
|
|
9462
9471
|
"origin": "html-text",
|
|
9463
9472
|
"confidence": "certain"
|
|
9464
9473
|
},
|
|
@@ -9638,7 +9647,7 @@
|
|
|
9638
9647
|
"surface": "builders-hall",
|
|
9639
9648
|
"text": "Works completed",
|
|
9640
9649
|
"file": "modules/hall-ui/public/profile.html",
|
|
9641
|
-
"line":
|
|
9650
|
+
"line": 96,
|
|
9642
9651
|
"origin": "html-text",
|
|
9643
9652
|
"confidence": "certain"
|
|
9644
9653
|
},
|
|
@@ -11420,7 +11429,7 @@
|
|
|
11420
11429
|
"surface": "builders-hall",
|
|
11421
11430
|
"text": "{…} asking to connect",
|
|
11422
11431
|
"file": "modules/hall-ui/public/profile-connections.js",
|
|
11423
|
-
"line":
|
|
11432
|
+
"line": 136,
|
|
11424
11433
|
"origin": "js-markup",
|
|
11425
11434
|
"confidence": "certain"
|
|
11426
11435
|
},
|
|
@@ -11663,7 +11672,7 @@
|
|
|
11663
11672
|
"surface": "builders-hall",
|
|
11664
11673
|
"text": "{…} you have sent",
|
|
11665
11674
|
"file": "modules/hall-ui/public/profile-connections.js",
|
|
11666
|
-
"line":
|
|
11675
|
+
"line": 137,
|
|
11667
11676
|
"origin": "js-markup",
|
|
11668
11677
|
"confidence": "certain"
|
|
11669
11678
|
},
|
|
@@ -12257,7 +12266,7 @@
|
|
|
12257
12266
|
"surface": "landing",
|
|
12258
12267
|
"text": "A non-profit, capture-resistant commons.",
|
|
12259
12268
|
"file": "public-landing/terms.html",
|
|
12260
|
-
"line":
|
|
12269
|
+
"line": 84,
|
|
12261
12270
|
"origin": "html-text",
|
|
12262
12271
|
"confidence": "certain"
|
|
12263
12272
|
},
|
|
@@ -12518,7 +12527,7 @@
|
|
|
12518
12527
|
"surface": "landing",
|
|
12519
12528
|
"text": "Built by agents, on Cloud Bongos.",
|
|
12520
12529
|
"file": "public-landing/terms.html",
|
|
12521
|
-
"line":
|
|
12530
|
+
"line": 84,
|
|
12522
12531
|
"origin": "html-text",
|
|
12523
12532
|
"confidence": "certain"
|
|
12524
12533
|
},
|
|
@@ -12698,7 +12707,7 @@
|
|
|
12698
12707
|
"surface": "landing",
|
|
12699
12708
|
"text": "Don't use {{productName}} to break the law, to attack this site or other people's projects, to mine, spam or otherwise abuse hosted resources, or to harass other builders. The owner may deactivate a builder or take a project offline for breaking these, and may set further house rules inside the hall.",
|
|
12700
12709
|
"file": "public-landing/terms.html",
|
|
12701
|
-
"line":
|
|
12710
|
+
"line": 73,
|
|
12702
12711
|
"origin": "html-text",
|
|
12703
12712
|
"confidence": "certain"
|
|
12704
12713
|
},
|
|
@@ -12779,7 +12788,7 @@
|
|
|
12779
12788
|
"surface": "landing",
|
|
12780
12789
|
"text": "Fair use",
|
|
12781
12790
|
"file": "public-landing/terms.html",
|
|
12782
|
-
"line":
|
|
12791
|
+
"line": 72,
|
|
12783
12792
|
"origin": "html-text",
|
|
12784
12793
|
"confidence": "certain"
|
|
12785
12794
|
},
|
|
@@ -12882,6 +12891,15 @@
|
|
|
12882
12891
|
"origin": "html-text",
|
|
12883
12892
|
"confidence": "certain"
|
|
12884
12893
|
},
|
|
12894
|
+
{
|
|
12895
|
+
"id": "0808df6e434c",
|
|
12896
|
+
"surface": "landing",
|
|
12897
|
+
"text": "From your settings you can hide your statistics, drop out of the recruiting directory, or make your account private. Each takes effect immediately, everywhere, including on a page someone already has open. Hiding removes the platform’s combined view; it does not retract the per-project numbers each project publishes itself, so a determined reader could still add them up the hard way.",
|
|
12898
|
+
"file": "public-landing/terms.html",
|
|
12899
|
+
"line": 69,
|
|
12900
|
+
"origin": "html-text",
|
|
12901
|
+
"confidence": "certain"
|
|
12902
|
+
},
|
|
12885
12903
|
{
|
|
12886
12904
|
"id": "8bb1f00b1558",
|
|
12887
12905
|
"surface": "landing",
|
|
@@ -13170,6 +13188,15 @@
|
|
|
13170
13188
|
"origin": "html-text",
|
|
13171
13189
|
"confidence": "certain"
|
|
13172
13190
|
},
|
|
13191
|
+
{
|
|
13192
|
+
"id": "69400ca12477",
|
|
13193
|
+
"surface": "landing",
|
|
13194
|
+
"text": "Once you have signed in here and accepted these terms, your profile and that record are public by default: at your handle’s page, in the people directory, to project owners looking for people to work with, and to search engines. An account that has never signed in here stays provisional and is published nowhere.",
|
|
13195
|
+
"file": "public-landing/terms.html",
|
|
13196
|
+
"line": 68,
|
|
13197
|
+
"origin": "html-text",
|
|
13198
|
+
"confidence": "certain"
|
|
13199
|
+
},
|
|
13173
13200
|
{
|
|
13174
13201
|
"id": "8329bb1a3693",
|
|
13175
13202
|
"surface": "landing",
|
|
@@ -13238,7 +13265,7 @@
|
|
|
13238
13265
|
"surface": "landing",
|
|
13239
13266
|
"text": "Open source (AGPL-3.0)",
|
|
13240
13267
|
"file": "public-landing/terms.html",
|
|
13241
|
-
"line":
|
|
13268
|
+
"line": 84,
|
|
13242
13269
|
"origin": "html-text",
|
|
13243
13270
|
"confidence": "certain"
|
|
13244
13271
|
},
|
|
@@ -13382,7 +13409,7 @@
|
|
|
13382
13409
|
"surface": "landing",
|
|
13383
13410
|
"text": "Questions go through the",
|
|
13384
13411
|
"file": "public-landing/terms.html",
|
|
13385
|
-
"line":
|
|
13412
|
+
"line": 80,
|
|
13386
13413
|
"origin": "html-text",
|
|
13387
13414
|
"confidence": "certain"
|
|
13388
13415
|
},
|
|
@@ -13400,7 +13427,7 @@
|
|
|
13400
13427
|
"surface": "landing",
|
|
13401
13428
|
"text": "Read the source.",
|
|
13402
13429
|
"file": "public-landing/terms.html",
|
|
13403
|
-
"line":
|
|
13430
|
+
"line": 79,
|
|
13404
13431
|
"origin": "html-text",
|
|
13405
13432
|
"confidence": "certain"
|
|
13406
13433
|
},
|
|
@@ -13881,6 +13908,15 @@
|
|
|
13881
13908
|
"origin": "html-text",
|
|
13882
13909
|
"confidence": "certain"
|
|
13883
13910
|
},
|
|
13911
|
+
{
|
|
13912
|
+
"id": "198f1eac5a95",
|
|
13913
|
+
"surface": "landing",
|
|
13914
|
+
"text": "The platform stores the date you accepted these terms, and which version, on your account. It is written only by signing in here, and only once — signing in again does not change the original date. This is version",
|
|
13915
|
+
"file": "public-landing/terms.html",
|
|
13916
|
+
"line": 70,
|
|
13917
|
+
"origin": "html-text",
|
|
13918
|
+
"confidence": "certain"
|
|
13919
|
+
},
|
|
13884
13920
|
{
|
|
13885
13921
|
"id": "20fcebaa85c4",
|
|
13886
13922
|
"surface": "landing",
|
|
@@ -13944,12 +13980,21 @@
|
|
|
13944
13980
|
"origin": "html-text",
|
|
13945
13981
|
"confidence": "certain"
|
|
13946
13982
|
},
|
|
13983
|
+
{
|
|
13984
|
+
"id": "02e596cc4569",
|
|
13985
|
+
"surface": "landing",
|
|
13986
|
+
"text": "These numbers describe; they do not govern.",
|
|
13987
|
+
"file": "public-landing/terms.html",
|
|
13988
|
+
"line": 67,
|
|
13989
|
+
"origin": "html-text",
|
|
13990
|
+
"confidence": "certain"
|
|
13991
|
+
},
|
|
13947
13992
|
{
|
|
13948
13993
|
"id": "ea7de26ce2f0",
|
|
13949
13994
|
"surface": "landing",
|
|
13950
13995
|
"text": "These terms ship with the software and change with it. The version served on this page is the one that applies; the repository keeps the history.",
|
|
13951
13996
|
"file": "public-landing/terms.html",
|
|
13952
|
-
"line":
|
|
13997
|
+
"line": 79,
|
|
13953
13998
|
"origin": "html-text",
|
|
13954
13999
|
"confidence": "certain"
|
|
13955
14000
|
},
|
|
@@ -14003,7 +14048,7 @@
|
|
|
14003
14048
|
"surface": "landing",
|
|
14004
14049
|
"text": "To the extent the law allows, the people running {{productName}} are not liable for loss arising from its use. It is free software, offered without warranty, as the AGPL-3.0 states.",
|
|
14005
14050
|
"file": "public-landing/terms.html",
|
|
14006
|
-
"line":
|
|
14051
|
+
"line": 76,
|
|
14007
14052
|
"origin": "html-text",
|
|
14008
14053
|
"confidence": "certain"
|
|
14009
14054
|
},
|
|
@@ -14106,6 +14151,15 @@
|
|
|
14106
14151
|
"origin": "html-text",
|
|
14107
14152
|
"confidence": "certain"
|
|
14108
14153
|
},
|
|
14154
|
+
{
|
|
14155
|
+
"id": "9b3312899fb1",
|
|
14156
|
+
"surface": "landing",
|
|
14157
|
+
"text": "What is public.",
|
|
14158
|
+
"file": "public-landing/terms.html",
|
|
14159
|
+
"line": 68,
|
|
14160
|
+
"origin": "html-text",
|
|
14161
|
+
"confidence": "certain"
|
|
14162
|
+
},
|
|
14109
14163
|
{
|
|
14110
14164
|
"id": "b19e6b7ddc42",
|
|
14111
14165
|
"surface": "landing",
|
|
@@ -14142,6 +14196,15 @@
|
|
|
14142
14196
|
"origin": "html-text",
|
|
14143
14197
|
"confidence": "certain"
|
|
14144
14198
|
},
|
|
14199
|
+
{
|
|
14200
|
+
"id": "6130dcb60532",
|
|
14201
|
+
"surface": "landing",
|
|
14202
|
+
"text": "What you control.",
|
|
14203
|
+
"file": "public-landing/terms.html",
|
|
14204
|
+
"line": 69,
|
|
14205
|
+
"origin": "html-text",
|
|
14206
|
+
"confidence": "certain"
|
|
14207
|
+
},
|
|
14145
14208
|
{
|
|
14146
14209
|
"id": "b938baf0f723",
|
|
14147
14210
|
"surface": "landing",
|
|
@@ -14250,6 +14313,15 @@
|
|
|
14250
14313
|
"origin": "html-text",
|
|
14251
14314
|
"confidence": "certain"
|
|
14252
14315
|
},
|
|
14316
|
+
{
|
|
14317
|
+
"id": "0f06f7e72ea7",
|
|
14318
|
+
"surface": "landing",
|
|
14319
|
+
"text": "Your acceptance is recorded.",
|
|
14320
|
+
"file": "public-landing/terms.html",
|
|
14321
|
+
"line": 70,
|
|
14322
|
+
"origin": "html-text",
|
|
14323
|
+
"confidence": "certain"
|
|
14324
|
+
},
|
|
14253
14325
|
{
|
|
14254
14326
|
"id": "a4d2357d486b",
|
|
14255
14327
|
"surface": "landing",
|
|
@@ -14358,6 +14430,15 @@
|
|
|
14358
14430
|
"origin": "html-text",
|
|
14359
14431
|
"confidence": "certain"
|
|
14360
14432
|
},
|
|
14433
|
+
{
|
|
14434
|
+
"id": "cd379e3e0111",
|
|
14435
|
+
"surface": "landing",
|
|
14436
|
+
"text": "Your work across projects",
|
|
14437
|
+
"file": "public-landing/terms.html",
|
|
14438
|
+
"line": 65,
|
|
14439
|
+
"origin": "html-text",
|
|
14440
|
+
"confidence": "certain"
|
|
14441
|
+
},
|
|
14361
14442
|
{
|
|
14362
14443
|
"id": "bb158e10340b",
|
|
14363
14444
|
"surface": "landing",
|
|
@@ -14444,7 +14525,7 @@
|
|
|
14444
14525
|
"surface": "landing",
|
|
14445
14526
|
"text": "contact page",
|
|
14446
14527
|
"file": "public-landing/terms.html",
|
|
14447
|
-
"line":
|
|
14528
|
+
"line": 80,
|
|
14448
14529
|
"origin": "html-text",
|
|
14449
14530
|
"confidence": "certain"
|
|
14450
14531
|
},
|
|
@@ -14606,7 +14687,7 @@
|
|
|
14606
14687
|
"surface": "landing",
|
|
14607
14688
|
"text": "privacy page",
|
|
14608
14689
|
"file": "public-landing/terms.html",
|
|
14609
|
-
"line":
|
|
14690
|
+
"line": 80,
|
|
14610
14691
|
"origin": "html-text",
|
|
14611
14692
|
"confidence": "certain"
|
|
14612
14693
|
},
|
package/docs/file-map.md
CHANGED
|
@@ -244,7 +244,7 @@
|
|
|
244
244
|
│ ├── terrain.js ← (Phase D + ADR 0012, CJS): TERRAIN + OBJECT enums + BLOCKING_TERRAINS + BLOCKING_OBJECTS (server twin of public/game/world/terrain.js)
|
|
245
245
|
│ └── map.js ← (Phase D + ADR 0012): two-grid INITIAL_MAP {ground, objects}; isBlocked checks both layers (mirrors public/game/world/{terrain,map}.js)
|
|
246
246
|
│ (public-status/ moved to modules/status-ui/public/ in BV1.R84 — see the modules/ block above)
|
|
247
|
-
│ (public-builders/ moved to modules/hall-ui/public/ in BV1.R85 — the authenticated builders' hall; see the modules/ block above. It keeps its DEDICATED serving block in src/bongos/serve-internal.js: the builders.<apex> + apex /builders/* shim, canonical redirects, the citizen/Archon page gates, asset-stamping, and the module hall-widget injection — partitioned out of the generic web-surface loop. index.html=the hall dashboard; work/board/roadmap/goals/watch/harbor/gate/pair/settings/ranks/sessions/primer/diagrams/atlas pages; ideas.{html,js,css}=the Full Idea composer (task 1002928 / R152 of goal 1000062 — the five R141 fields with a live R142 completeness meter, both fetched from the server so the page carries no copy of the rules; drafts in localStorage so navigation costs nothing. Task 1002930 / R154 added the SPARK QUEUE above it and a second mode: `?develop=<id>` reuses the same form to develop a spark — the spark's words shown above the fields, its title read-only, and the file routed to POST /inbox/:id/develop instead of POST /inbox, under its own per-idea draft key); idea.html/idea.js=the idea-detail PAGE (/idea/:id, task 1002929 / R153 — the SECOND two-segment hall page after /task/:id: grade, the five answers in template order, the score, and both attributions. The GRADE decides what the page contains — a quick idea gets no five-field skeleton. task-detail.js keeps the #/idea/N overlay because ~320 of its lines are the Metic+ triage panel; the overlay now links here); profile.html/profile.js=the public, shareable builder profile page (/profile?id=N — rank, works, credits, karma, achievements; task 1467); profile-connections.js=section 6 of that page, the hub-only connections block (task 1002296 / R20 of goal 1000045 — the viewer-relative 1st/2nd/3rd/out-of-network label, the mutuals it was computed from, the connect button, and on your own profile both request queues plus your connections ledger. Loaded BEFORE profile.js, which calls window.OTBConnections.render behind a guard, so a page that omits the script simply has no section; the section reveals only when the hub's /connections routes answer, exactly as the cross-project record does. ADR 0212 records why it is on this page rather than the not-yet-built /u/<handle>, and why it addresses a builder by github_login and then uses the canonical handle the API echoes back); task.html/task.js=the task-detail page (/task/:id, task 751 — replaced the old #/task/N overlay); builders.js=the controller; dom-utils.js/hall-widgets.js=the widget+settings-panel registries.)
|
|
247
|
+
│ (public-builders/ moved to modules/hall-ui/public/ in BV1.R85 — the authenticated builders' hall; see the modules/ block above. It keeps its DEDICATED serving block in src/bongos/serve-internal.js: the builders.<apex> + apex /builders/* shim, canonical redirects, the citizen/Archon page gates, asset-stamping, and the module hall-widget injection — partitioned out of the generic web-surface loop. index.html=the hall dashboard; work/board/roadmap/goals/watch/harbor/gate/pair/settings/ranks/sessions/primer/diagrams/atlas pages; ideas.{html,js,css}=the Full Idea composer (task 1002928 / R152 of goal 1000062 — the five R141 fields with a live R142 completeness meter, both fetched from the server so the page carries no copy of the rules; drafts in localStorage so navigation costs nothing. Task 1002930 / R154 added the SPARK QUEUE above it and a second mode: `?develop=<id>` reuses the same form to develop a spark — the spark's words shown above the fields, its title read-only, and the file routed to POST /inbox/:id/develop instead of POST /inbox, under its own per-idea draft key); idea.html/idea.js=the idea-detail PAGE (/idea/:id, task 1002929 / R153 — the SECOND two-segment hall page after /task/:id: grade, the five answers in template order, the score, and both attributions. The GRADE decides what the page contains — a quick idea gets no five-field skeleton. task-detail.js keeps the #/idea/N overlay because ~320 of its lines are the Metic+ triage panel; the overlay now links here); profile.html/profile.js=the public, shareable builder profile page (/profile?id=N — rank, works, credits, karma, achievements; task 1467); profile-connections.js=section 6 of that page, the hub-only connections block (task 1002296 / R20 of goal 1000045 — the viewer-relative 1st/2nd/3rd/out-of-network label, the mutuals it was computed from, the connect button, and on your own profile both request queues plus your connections ledger. Loaded BEFORE profile.js, which calls window.OTBConnections.render behind a guard, so a page that omits the script simply has no section; the section reveals only when the hub's /connections routes answer, exactly as the cross-project record does. ADR 0212 records why it is on this page rather than the not-yet-built /u/<handle>, and why it addresses a builder by github_login and then uses the canonical handle the API echoes back); profile-canonical.js=the canonical-profile wiring for that page (task 1002804 / P08, ADR 0214 — on a FEDERATED instance the rel=canonical plus the visible "see the cross-project record" link-out ADR 0171 D1 asks for; on the HUB the numeric ?id= form redirects to the handle URL instead, because a page cannot both redirect to a URL and declare it canonical. All three read ONE resolver, modules/platform-identity/canonical-profile.js, which answers null while /u/<handle> does not exist — so everything is dark today and one boolean turns it all on together); task.html/task.js=the task-detail page (/task/:id, task 751 — replaced the old #/task/N overlay); builders.js=the controller; dom-utils.js/hall-widgets.js=the widget+settings-panel registries.)
|
|
248
248
|
│
|
|
249
249
|
├── infra/ ← ON-BOX scripts (task 1002699): the four reporter/heartbeat crons every dev box runs from its /workspace clone — box-heartbeat.sh (idle-sweep activity signal), box-report-version.sh (HEAD → POST /box/version), box-report-host-keys.sh (SSH host keys → POST /box/host-keys), box-report-terminal.sh (ttyd URL+credential → POST /box/terminal). Delivered by the workspace clone itself (modules/dev-box/box-access.js sparse scope includes infra/); crons self-installed by box-source-fetch.sh's per-tick bring-up. API base resolves GDS_BASE env → session-file api_base → skip (no hardcoded host in the neutral core).
|
|
250
250
|
├── devbox-app/ ← OTB Dev Box — Electron menu-bar/tray switch for the builder's box (#904, ADR 0045; internal). SELF-CONTAINED: own package.json (never feeds the droplet's npm ci); built by .github/workflows/build-devbox-app.yml; published to the public releases repo per config/devbox-app.json; release recipe docs/recipes/devbox-app-release.md
|
|
@@ -351,10 +351,12 @@ tests/
|
|
|
351
351
|
├── own_scope_guard.mjs ← (task 1003343, goal 1000045 criterion own-scope-held-by-a-test): the OWN-SCOPE structural guard, generalised out of memory_isolation.mjs. An explicit inventory of own-scoped route files; inside them the route's declared PATH decides — a path naming no builder must never read a subject from the request (direct, optional-chained, destructured, aliased, computed-key or header), a path that DOES name one needs a per-route exemption whose gate the guard verifies is present. Repo-wide backstop: any file mounting a `/me` route must be in the inventory. Source-grepping, so it runs in the DB-free `unit` lane.
|
|
352
352
|
├── account_existence_rate_limit.mjs ← (task 1003339, goal 1000045, ADR 0209): the two PUBLIC account-existence probes (onboarding GET /access-requests/status + core GET /auth/web/admission-status) share ONE per-IP budget. Counts to the limit on each route, proves the budget is shared in both directions and when alternated, moves Date.now to prove the window slides on the real mounted route, and proves a refused probe issues no query. DB-free; mutation-checked three ways.
|
|
353
353
|
├── effective_visibility_predicate.mjs ← (task 1002967, goal 1000045): the EFFECTIVE-VISIBILITY structural guard over `modules/platform-identity/account-visibility.js` (the file task 1002295 landed and this task ADOPTED rather than duplicating). Three layers — SQL and JS agree row-for-row over the privacy-spec D2 matrix; that file is the only one allowed to compare `profile_state`/`account_visibility`/`hide_stats` to a literal (per-occurrence exemptions, each with a reason and a checked obligation); and every `SELECT` on `platform_identity_accounts` is enumerated FROM SOURCE and must join a shared predicate, be declared non-public, or be a checked deferral to a named caller — so a read that does not exist yet (hub search, the sitemap) fails the build until its author classifies it. Behavioural half runs the real `/profiles/:handle` route over an in-memory accounts table filtered by each statement's own WHERE clause: private → 404 (never 403), byte-identical to stranger and owner alike. DB-free `unit` lane.
|
|
354
|
+
├── canonical_profile_url.mjs ← (task 1002804, goal 1000045 criterion C1, ADR 0214): the P08 proof — the canonical profile URL is resolved in ONE place, `handle` reaches `GET /builders/:id/profile` under the EXISTENCE predicate (so a hidden builder keeps their address), absent/provisional/private are BYTE-IDENTICAL so the numeric-id redirect cannot become an existence oracle, and the widened response still leaks no private column. Real core router over a WHERE-derived fake pool on a real socket; the real browser script in a vm above a stub DOM, run twice — as shipped (every surface dark, because `/u/<handle>` still 404s) and with the liveness constant flipped, so the three live behaviours are proved rather than deferred. Asserts its own DB-free lane membership. DB-free `unit` lane.
|
|
354
355
|
├── application_lifecycle.mjs ← (task 1002284, goal 1000045, ADR 0201 D1/D3.2/D4 + ADR 0208): the application lifecycle EXECUTED — apply, list-pending, approve, decline, RESCIND (`invited → dismissed`), idempotency on the state already held, and the two things that must never happen: a builder without `access_request.review` moving the queue, and a VOUCH buying admission. Real router, REAL `requirePermission` resolving against the real government catalog's rank seed, and the REAL `hasInvitedAccessRequest` from `src/bongos/db-kernel.js` pointed at the same in-memory `access_requests` table (a stubbed `./pool`), whose filter is built from each statement's own WHERE clause and which refuses a predicate it cannot read. The no-authority proof seeds a vouched row and asserts the approve path and the admission read are byte-identical to the unvouched twin, and that no statement on either path names `applicant_github_id`/`vouched_at`. DB-free `unit` lane.
|
|
355
356
|
├── application_echo.mjs ← (task 1002284, goal 1000045, ADR 0201 D1.3/D1.4): the hub's STATUSLESS echo of an application. Part A pins the domain functions — the read binds `APPLICATION_ECHO_WINDOW_DAYS` itself (one 30, not three), the write is an upsert on the pair, neither statement mentions a status, and a non-numeric principal is refused before any query (ADR 0171 D2). Part B runs the real `POST /my-projects/join` and `GET /my-projects` over an in-memory `platform_identity_application_echoes` table with the relay's answer scripted: only an accepted application leaves a trace — a standing membership, either door refusal, a members-only project and an unreachable project leave none — and best-effort is asserted in both directions (a failed echo write still reports the filed application; a failed echo read still lands the memberships listing). DB-free `unit` lane.
|
|
356
357
|
├── scouting_owner_access_and_reach.mjs ← (task 1002290, goal 1000045 C5, ADR 0210): the R14 proof — WHO may read the cross-project recruiting directory, and WHO appears in it. A project owner (an instance-asserted, hub-witnessed `membership_kind='owner'`) reads `GET /scouting` with no rank at all; a builder who is neither owner nor `project.curate` holder gets the unchanged 403; an un-witnessed owner claim is refused; a broken ownership read falls closed onto the permission gate rather than admitting or 500ing. And the recruiting opt-out finally bites: a public, unhidden, active account that opted out is absent from `/scouting` and the hall's `/people` (the same endpoint), returns when it opts back in, and the opt-out grants and denies no permission — an opted-out owner still reads the directory while being absent from their own copy of it. Fake pool filtered by each statement's own WHERE clause, real route, real `requirePermission` over the real government catalog, real HTTP. Mutation-checked three ways. DB-free `unit` lane.
|
|
357
358
|
├── scouting_page_gate.mjs ← (task 1002290, goal 1000045 C5, ADR 0210 D3): the OTHER half of R14 — the `/builders/people` SHELL must admit exactly the two audiences `GET /scouting` admits. A project owner holding no permission reaches it; everyone the route refuses gets the byte-identical `?denied=project.curate` redirect; and each of six ways the `alsoAdmits` door can fail (module absent, function absent, throw, reject, non-boolean, prototype-only) fails CLOSED. Also pins that the other four page gates never consult the seam at all, and that exactly ONE gate declares a second door. Its own file because the route proof's ESM imports pull `auth.js` in before a session double could be installed — this one installs it first, the `government_page_gates.mjs` pattern. DB-free `unit` lane.
|
|
359
|
+
├── terms_acceptance.mjs ← (task 1002913, goal 1000045, ADR 0213): the platform T&C acceptance record. Proves the four properties that make it evidence rather than a claim — the /terms page carries the cross-project consent ADR 0141 §4 deferred to it and it is apex-only; acceptance is written ONLY by the hub's own /sso/authorize (driven over the real router with an attacker-controlled query string, so a forged timestamp/version/activate flag reaches nothing); it is written ONCE (the fake pool interprets the upsert's own column assignments, so COALESCE is executed, not string-matched, and an assignment shape it cannot read throws instead of reading as "unchanged"); and consent is two columns in the shared predicate, so an account the hub witnessed before the terms existed publishes nothing. Plus the projection rule — every read whose row a JS twin judges must select both consent columns, or the twin denies everyone silently. DB-free `unit` lane, asserts its own lane membership.
|
|
358
360
|
└── public_task_resolver.mjs ← (#604): the public `/public/tasks/:id` projection — title/value_summary exposed only for shipped|confirmed; withheld for in-flight so unshipped/security task names can't leak.
|
|
359
361
|
```
|
|
360
362
|
|
|
@@ -1291,5 +1291,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
1291
1291
|
landed since 1.19.425 with no explicit bump. run 33270772607. (task 1002620)
|
|
1292
1292
|
1.19.427 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1293
1293
|
landed since 1.19.426 with no explicit bump. run 33271340372. (task 1002620)
|
|
1294
|
+
1.19.428 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1295
|
+
landed since 1.19.427 with no explicit bump. run 33274315388. (task 1002620)
|
|
1296
|
+
1.19.429 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1297
|
+
landed since 1.19.428 with no explicit bump. run 33274860035. (task 1002620)
|
|
1294
1298
|
---------------------------------------------------------------------------
|
|
1295
1299
|
```
|