@bongos/core 1.19.430 → 1.19.432
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 +64 -44
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +2 -0
- package/clients/bongos-client/index.cjs +2 -0
- package/clients/bongos-client/index.d.ts +3 -0
- package/clients/bongos-client/index.mjs +2 -0
- package/docs/adr/0215-the-recruiter-sliver-is-a-ceiling-not-a-step.md +116 -0
- package/docs/adr/0216-a-fake-pool-interpreter-must-fail-loudly-not-silently-ignore.md +102 -0
- package/docs/adr/README.md +2 -0
- package/docs/api/openapi.json +64 -3
- package/docs/api-reference.md +3 -2
- package/docs/copy-inventory.md +48 -48
- package/docs/copy-registry.json +57 -57
- package/docs/file-map.md +1 -0
- package/docs/module-api-changelog.md +4 -0
- package/modules/dev-box/app/src/vendor/bongos-client.cjs +2 -0
- package/modules/hall-ui/public/settings.html +1 -1
- package/modules/hall-ui/public/settings.js +17 -8
- package/modules/platform-identity/account-visibility.js +47 -0
- package/modules/platform-identity/platform-identity.js +4 -4
- package/modules/platform-identity/recruiter-sliver.js +197 -0
- package/modules/platform-identity/routes/scouting.js +58 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/module-api.js +1 -1
- package/tests/account_privacy_flags.mjs +115 -9
- package/tests/application_echo.mjs +43 -9
- package/tests/application_lifecycle.mjs +18 -7
- package/tests/connections_ownership.mjs +44 -4
- package/tests/effective_visibility_predicate.mjs +137 -50
- package/tests/government_require_permission.mjs +22 -0
- package/tests/handle_machinery.mjs +15 -1
- package/tests/hub_profile_leak.mjs +18 -4
- package/tests/own_session_revoke.mjs +77 -9
- package/tests/profile_connections_ui.mjs +49 -10
- package/tests/profile_privacy_owner_view.mjs +68 -37
- package/tests/profile_rollup_consent.mjs +46 -14
- package/tests/profile_route.mjs +6 -0
- package/tests/recruiter_sliver_boundary.mjs +841 -0
- package/tests/scouting_owner_access_and_reach.mjs +175 -39
- package/tests/scouting_rollup_fanout.mjs +15 -4
package/docs/copy-registry.json
CHANGED
|
@@ -62,10 +62,10 @@
|
|
|
62
62
|
"modules/hall-ui/public/settings.js:103",
|
|
63
63
|
"modules/hall-ui/public/settings.js:455",
|
|
64
64
|
"modules/hall-ui/public/settings.js:524",
|
|
65
|
-
"modules/hall-ui/public/settings.js:
|
|
66
|
-
"modules/hall-ui/public/settings.js:
|
|
67
|
-
"modules/hall-ui/public/settings.js:
|
|
68
|
-
"modules/hall-ui/public/settings.js:
|
|
65
|
+
"modules/hall-ui/public/settings.js:678",
|
|
66
|
+
"modules/hall-ui/public/settings.js:776",
|
|
67
|
+
"modules/hall-ui/public/settings.js:856",
|
|
68
|
+
"modules/hall-ui/public/settings.js:1131"
|
|
69
69
|
]
|
|
70
70
|
},
|
|
71
71
|
{
|
|
@@ -535,7 +535,7 @@
|
|
|
535
535
|
"occurrences": 2,
|
|
536
536
|
"at": [
|
|
537
537
|
"modules/hall-ui/public/hall-render.js:855",
|
|
538
|
-
"modules/hall-ui/public/settings.js:
|
|
538
|
+
"modules/hall-ui/public/settings.js:921"
|
|
539
539
|
]
|
|
540
540
|
},
|
|
541
541
|
{
|
|
@@ -615,7 +615,7 @@
|
|
|
615
615
|
"occurrences": 2,
|
|
616
616
|
"at": [
|
|
617
617
|
"modules/hall-ui/public/builders.js:356",
|
|
618
|
-
"modules/hall-ui/public/settings.js:
|
|
618
|
+
"modules/hall-ui/public/settings.js:777"
|
|
619
619
|
]
|
|
620
620
|
},
|
|
621
621
|
{
|
|
@@ -1364,8 +1364,8 @@
|
|
|
1364
1364
|
"text": "Your preferences, {…}.",
|
|
1365
1365
|
"occurrences": 2,
|
|
1366
1366
|
"at": [
|
|
1367
|
-
"modules/hall-ui/public/settings.js:
|
|
1368
|
-
"modules/hall-ui/public/settings.js:
|
|
1367
|
+
"modules/hall-ui/public/settings.js:850",
|
|
1368
|
+
"modules/hall-ui/public/settings.js:1383"
|
|
1369
1369
|
]
|
|
1370
1370
|
},
|
|
1371
1371
|
{
|
|
@@ -2781,7 +2781,7 @@
|
|
|
2781
2781
|
"surface": "builders-hall",
|
|
2782
2782
|
"text": "Checking your key…",
|
|
2783
2783
|
"file": "modules/hall-ui/public/settings.js",
|
|
2784
|
-
"line":
|
|
2784
|
+
"line": 1108,
|
|
2785
2785
|
"origin": "js-text-assign",
|
|
2786
2786
|
"confidence": "certain"
|
|
2787
2787
|
},
|
|
@@ -3114,7 +3114,7 @@
|
|
|
3114
3114
|
"surface": "builders-hall",
|
|
3115
3115
|
"text": "Connect Discord & join the server",
|
|
3116
3116
|
"file": "modules/hall-ui/public/settings.js",
|
|
3117
|
-
"line":
|
|
3117
|
+
"line": 921,
|
|
3118
3118
|
"origin": "js-markup",
|
|
3119
3119
|
"confidence": "certain"
|
|
3120
3120
|
},
|
|
@@ -3384,7 +3384,7 @@
|
|
|
3384
3384
|
"surface": "builders-hall",
|
|
3385
3385
|
"text": "Could not copy automatically — select and copy manually. ({…})",
|
|
3386
3386
|
"file": "modules/hall-ui/public/settings.js",
|
|
3387
|
-
"line":
|
|
3387
|
+
"line": 988,
|
|
3388
3388
|
"origin": "js-notice",
|
|
3389
3389
|
"confidence": "certain"
|
|
3390
3390
|
},
|
|
@@ -3645,7 +3645,7 @@
|
|
|
3645
3645
|
"surface": "builders-hall",
|
|
3646
3646
|
"text": "Could not load your account. Reload the page to try again.",
|
|
3647
3647
|
"file": "modules/hall-ui/public/settings.js",
|
|
3648
|
-
"line":
|
|
3648
|
+
"line": 1366,
|
|
3649
3649
|
"origin": "js-text-assign",
|
|
3650
3650
|
"confidence": "certain"
|
|
3651
3651
|
},
|
|
@@ -3672,7 +3672,7 @@
|
|
|
3672
3672
|
"surface": "builders-hall",
|
|
3673
3673
|
"text": "Could not load your settings.",
|
|
3674
3674
|
"file": "modules/hall-ui/public/settings.js",
|
|
3675
|
-
"line":
|
|
3675
|
+
"line": 1369,
|
|
3676
3676
|
"origin": "js-notice",
|
|
3677
3677
|
"confidence": "certain"
|
|
3678
3678
|
},
|
|
@@ -3708,7 +3708,7 @@
|
|
|
3708
3708
|
"surface": "builders-hall",
|
|
3709
3709
|
"text": "Could not remove your key. Try again.",
|
|
3710
3710
|
"file": "modules/hall-ui/public/settings.js",
|
|
3711
|
-
"line":
|
|
3711
|
+
"line": 1188,
|
|
3712
3712
|
"origin": "js-notice",
|
|
3713
3713
|
"confidence": "certain"
|
|
3714
3714
|
},
|
|
@@ -3717,7 +3717,7 @@
|
|
|
3717
3717
|
"surface": "builders-hall",
|
|
3718
3718
|
"text": "Could not remove. Try again.",
|
|
3719
3719
|
"file": "modules/hall-ui/public/settings.js",
|
|
3720
|
-
"line":
|
|
3720
|
+
"line": 1187,
|
|
3721
3721
|
"origin": "js-text-assign",
|
|
3722
3722
|
"confidence": "certain"
|
|
3723
3723
|
},
|
|
@@ -3789,7 +3789,7 @@
|
|
|
3789
3789
|
"surface": "builders-hall",
|
|
3790
3790
|
"text": "Could not save your key. Try again.",
|
|
3791
3791
|
"file": "modules/hall-ui/public/settings.js",
|
|
3792
|
-
"line":
|
|
3792
|
+
"line": 1132,
|
|
3793
3793
|
"origin": "js-notice",
|
|
3794
3794
|
"confidence": "certain"
|
|
3795
3795
|
},
|
|
@@ -3798,7 +3798,7 @@
|
|
|
3798
3798
|
"surface": "builders-hall",
|
|
3799
3799
|
"text": "Could not save your name. Try again.",
|
|
3800
3800
|
"file": "modules/hall-ui/public/settings.js",
|
|
3801
|
-
"line":
|
|
3801
|
+
"line": 857,
|
|
3802
3802
|
"origin": "js-notice",
|
|
3803
3803
|
"confidence": "certain"
|
|
3804
3804
|
},
|
|
@@ -3816,7 +3816,7 @@
|
|
|
3816
3816
|
"surface": "builders-hall",
|
|
3817
3817
|
"text": "Could not save your preference. Try again.",
|
|
3818
3818
|
"file": "modules/hall-ui/public/settings.js",
|
|
3819
|
-
"line":
|
|
3819
|
+
"line": 777,
|
|
3820
3820
|
"origin": "js-notice",
|
|
3821
3821
|
"confidence": "certain"
|
|
3822
3822
|
},
|
|
@@ -3825,7 +3825,7 @@
|
|
|
3825
3825
|
"surface": "builders-hall",
|
|
3826
3826
|
"text": "Could not save your privacy preference. Try again.",
|
|
3827
3827
|
"file": "modules/hall-ui/public/settings.js",
|
|
3828
|
-
"line":
|
|
3828
|
+
"line": 679,
|
|
3829
3829
|
"origin": "js-notice",
|
|
3830
3830
|
"confidence": "certain"
|
|
3831
3831
|
},
|
|
@@ -3897,7 +3897,7 @@
|
|
|
3897
3897
|
"surface": "builders-hall",
|
|
3898
3898
|
"text": "Could not save. Try again.",
|
|
3899
3899
|
"file": "modules/hall-ui/public/settings.js",
|
|
3900
|
-
"line":
|
|
3900
|
+
"line": 678,
|
|
3901
3901
|
"origin": "js-text-assign",
|
|
3902
3902
|
"confidence": "certain"
|
|
3903
3903
|
},
|
|
@@ -3906,7 +3906,7 @@
|
|
|
3906
3906
|
"surface": "builders-hall",
|
|
3907
3907
|
"text": "Could not save. Try again.",
|
|
3908
3908
|
"file": "modules/hall-ui/public/settings.js",
|
|
3909
|
-
"line":
|
|
3909
|
+
"line": 776,
|
|
3910
3910
|
"origin": "js-text-assign",
|
|
3911
3911
|
"confidence": "certain"
|
|
3912
3912
|
},
|
|
@@ -3915,7 +3915,7 @@
|
|
|
3915
3915
|
"surface": "builders-hall",
|
|
3916
3916
|
"text": "Could not save. Try again.",
|
|
3917
3917
|
"file": "modules/hall-ui/public/settings.js",
|
|
3918
|
-
"line":
|
|
3918
|
+
"line": 856,
|
|
3919
3919
|
"origin": "js-text-assign",
|
|
3920
3920
|
"confidence": "certain"
|
|
3921
3921
|
},
|
|
@@ -3924,7 +3924,7 @@
|
|
|
3924
3924
|
"surface": "builders-hall",
|
|
3925
3925
|
"text": "Could not save. Try again.",
|
|
3926
3926
|
"file": "modules/hall-ui/public/settings.js",
|
|
3927
|
-
"line":
|
|
3927
|
+
"line": 1131,
|
|
3928
3928
|
"origin": "js-text-assign",
|
|
3929
3929
|
"confidence": "certain"
|
|
3930
3930
|
},
|
|
@@ -3942,7 +3942,7 @@
|
|
|
3942
3942
|
"surface": "builders-hall",
|
|
3943
3943
|
"text": "Could not set up key storage. Try again.",
|
|
3944
3944
|
"file": "modules/hall-ui/public/settings.js",
|
|
3945
|
-
"line":
|
|
3945
|
+
"line": 1168,
|
|
3946
3946
|
"origin": "js-notice",
|
|
3947
3947
|
"confidence": "certain"
|
|
3948
3948
|
},
|
|
@@ -3951,7 +3951,7 @@
|
|
|
3951
3951
|
"surface": "builders-hall",
|
|
3952
3952
|
"text": "Could not set up storage. Try again.",
|
|
3953
3953
|
"file": "modules/hall-ui/public/settings.js",
|
|
3954
|
-
"line":
|
|
3954
|
+
"line": 1167,
|
|
3955
3955
|
"origin": "js-text-assign",
|
|
3956
3956
|
"confidence": "certain"
|
|
3957
3957
|
},
|
|
@@ -4230,7 +4230,7 @@
|
|
|
4230
4230
|
"surface": "builders-hall",
|
|
4231
4231
|
"text": "Discord connected ✓",
|
|
4232
4232
|
"file": "modules/hall-ui/public/settings.js",
|
|
4233
|
-
"line":
|
|
4233
|
+
"line": 914,
|
|
4234
4234
|
"origin": "js-markup",
|
|
4235
4235
|
"confidence": "certain"
|
|
4236
4236
|
},
|
|
@@ -4239,7 +4239,7 @@
|
|
|
4239
4239
|
"surface": "builders-hall",
|
|
4240
4240
|
"text": "Discord unlinked.",
|
|
4241
4241
|
"file": "modules/hall-ui/public/settings.js",
|
|
4242
|
-
"line":
|
|
4242
|
+
"line": 933,
|
|
4243
4243
|
"origin": "js-notice",
|
|
4244
4244
|
"confidence": "certain"
|
|
4245
4245
|
},
|
|
@@ -4581,7 +4581,7 @@
|
|
|
4581
4581
|
"surface": "builders-hall",
|
|
4582
4582
|
"text": "Expires {…} · refreshes on use.",
|
|
4583
4583
|
"file": "modules/hall-ui/public/settings.js",
|
|
4584
|
-
"line":
|
|
4584
|
+
"line": 983,
|
|
4585
4585
|
"origin": "js-markup",
|
|
4586
4586
|
"confidence": "certain"
|
|
4587
4587
|
},
|
|
@@ -4725,7 +4725,7 @@
|
|
|
4725
4725
|
"surface": "builders-hall",
|
|
4726
4726
|
"text": "Fresh CLI token issued. Paste it in your terminal:",
|
|
4727
4727
|
"file": "modules/hall-ui/public/settings.js",
|
|
4728
|
-
"line":
|
|
4728
|
+
"line": 980,
|
|
4729
4729
|
"origin": "js-markup",
|
|
4730
4730
|
"confidence": "certain"
|
|
4731
4731
|
},
|
|
@@ -4788,7 +4788,7 @@
|
|
|
4788
4788
|
"surface": "builders-hall",
|
|
4789
4789
|
"text": "Get a free key ↗",
|
|
4790
4790
|
"file": "modules/hall-ui/public/settings.js",
|
|
4791
|
-
"line":
|
|
4791
|
+
"line": 1012,
|
|
4792
4792
|
"origin": "js-markup",
|
|
4793
4793
|
"confidence": "certain"
|
|
4794
4794
|
},
|
|
@@ -5247,7 +5247,7 @@
|
|
|
5247
5247
|
"surface": "builders-hall",
|
|
5248
5248
|
"text": "Image key removed.",
|
|
5249
5249
|
"file": "modules/hall-ui/public/settings.js",
|
|
5250
|
-
"line":
|
|
5250
|
+
"line": 1184,
|
|
5251
5251
|
"origin": "js-notice",
|
|
5252
5252
|
"confidence": "certain"
|
|
5253
5253
|
},
|
|
@@ -5463,7 +5463,7 @@
|
|
|
5463
5463
|
"surface": "builders-hall",
|
|
5464
5464
|
"text": "Key removed.",
|
|
5465
5465
|
"file": "modules/hall-ui/public/settings.js",
|
|
5466
|
-
"line":
|
|
5466
|
+
"line": 1183,
|
|
5467
5467
|
"origin": "js-text-assign",
|
|
5468
5468
|
"confidence": "certain"
|
|
5469
5469
|
},
|
|
@@ -5472,7 +5472,7 @@
|
|
|
5472
5472
|
"surface": "builders-hall",
|
|
5473
5473
|
"text": "Key storage is being set up by an Archon — check back shortly. {…}",
|
|
5474
5474
|
"file": "modules/hall-ui/public/settings.js",
|
|
5475
|
-
"line":
|
|
5475
|
+
"line": 1062,
|
|
5476
5476
|
"origin": "js-markup",
|
|
5477
5477
|
"confidence": "certain"
|
|
5478
5478
|
},
|
|
@@ -5481,7 +5481,7 @@
|
|
|
5481
5481
|
"surface": "builders-hall",
|
|
5482
5482
|
"text": "Key storage isn't set up yet. As an Archon you can turn it on now — the server generates and safely stores the master key (no terminal needed).",
|
|
5483
5483
|
"file": "modules/hall-ui/public/settings.js",
|
|
5484
|
-
"line":
|
|
5484
|
+
"line": 1058,
|
|
5485
5485
|
"origin": "js-markup",
|
|
5486
5486
|
"confidence": "certain"
|
|
5487
5487
|
},
|
|
@@ -5553,7 +5553,7 @@
|
|
|
5553
5553
|
"surface": "builders-hall",
|
|
5554
5554
|
"text": "Latest version: v{…}.",
|
|
5555
5555
|
"file": "modules/hall-ui/public/settings.js",
|
|
5556
|
-
"line":
|
|
5556
|
+
"line": 1452,
|
|
5557
5557
|
"origin": "js-text-assign",
|
|
5558
5558
|
"confidence": "certain"
|
|
5559
5559
|
},
|
|
@@ -5598,7 +5598,7 @@
|
|
|
5598
5598
|
"surface": "builders-hall",
|
|
5599
5599
|
"text": "Link first — your rank role is set the moment you join.",
|
|
5600
5600
|
"file": "modules/hall-ui/public/settings.js",
|
|
5601
|
-
"line":
|
|
5601
|
+
"line": 922,
|
|
5602
5602
|
"origin": "js-markup",
|
|
5603
5603
|
"confidence": "certain"
|
|
5604
5604
|
},
|
|
@@ -6048,7 +6048,7 @@
|
|
|
6048
6048
|
"surface": "builders-hall",
|
|
6049
6049
|
"text": "Name cannot be blank.",
|
|
6050
6050
|
"file": "modules/hall-ui/public/settings.js",
|
|
6051
|
-
"line":
|
|
6051
|
+
"line": 825,
|
|
6052
6052
|
"origin": "js-text-assign",
|
|
6053
6053
|
"confidence": "certain"
|
|
6054
6054
|
},
|
|
@@ -6057,7 +6057,7 @@
|
|
|
6057
6057
|
"surface": "builders-hall",
|
|
6058
6058
|
"text": "Name must be {…} characters or fewer.",
|
|
6059
6059
|
"file": "modules/hall-ui/public/settings.js",
|
|
6060
|
-
"line":
|
|
6060
|
+
"line": 830,
|
|
6061
6061
|
"origin": "js-text-assign",
|
|
6062
6062
|
"confidence": "certain"
|
|
6063
6063
|
},
|
|
@@ -6165,7 +6165,7 @@
|
|
|
6165
6165
|
"surface": "builders-hall",
|
|
6166
6166
|
"text": "No builder account found for this sign-in.",
|
|
6167
6167
|
"file": "modules/hall-ui/public/settings.js",
|
|
6168
|
-
"line":
|
|
6168
|
+
"line": 1374,
|
|
6169
6169
|
"origin": "js-text-assign",
|
|
6170
6170
|
"confidence": "certain"
|
|
6171
6171
|
},
|
|
@@ -6903,7 +6903,7 @@
|
|
|
6903
6903
|
"surface": "builders-hall",
|
|
6904
6904
|
"text": "Paste command copied.",
|
|
6905
6905
|
"file": "modules/hall-ui/public/settings.js",
|
|
6906
|
-
"line":
|
|
6906
|
+
"line": 987,
|
|
6907
6907
|
"origin": "js-notice",
|
|
6908
6908
|
"confidence": "certain"
|
|
6909
6909
|
},
|
|
@@ -6912,7 +6912,7 @@
|
|
|
6912
6912
|
"surface": "builders-hall",
|
|
6913
6913
|
"text": "Paste your key first.",
|
|
6914
6914
|
"file": "modules/hall-ui/public/settings.js",
|
|
6915
|
-
"line":
|
|
6915
|
+
"line": 1107,
|
|
6916
6916
|
"origin": "js-notice",
|
|
6917
6917
|
"confidence": "certain"
|
|
6918
6918
|
},
|
|
@@ -7236,7 +7236,7 @@
|
|
|
7236
7236
|
"surface": "builders-hall",
|
|
7237
7237
|
"text": "Re-issue failed: {…}",
|
|
7238
7238
|
"file": "modules/hall-ui/public/settings.js",
|
|
7239
|
-
"line":
|
|
7239
|
+
"line": 992,
|
|
7240
7240
|
"origin": "js-notice",
|
|
7241
7241
|
"confidence": "certain"
|
|
7242
7242
|
},
|
|
@@ -7461,7 +7461,7 @@
|
|
|
7461
7461
|
"surface": "builders-hall",
|
|
7462
7462
|
"text": "Remove your image-generation key? Art generation will stop until you add one again.",
|
|
7463
7463
|
"file": "modules/hall-ui/public/settings.js",
|
|
7464
|
-
"line":
|
|
7464
|
+
"line": 1175,
|
|
7465
7465
|
"origin": "js-notice",
|
|
7466
7466
|
"confidence": "certain"
|
|
7467
7467
|
},
|
|
@@ -7749,7 +7749,7 @@
|
|
|
7749
7749
|
"surface": "builders-hall",
|
|
7750
7750
|
"text": "Save key",
|
|
7751
7751
|
"file": "modules/hall-ui/public/settings.js",
|
|
7752
|
-
"line":
|
|
7752
|
+
"line": 1043,
|
|
7753
7753
|
"origin": "js-markup",
|
|
7754
7754
|
"confidence": "certain"
|
|
7755
7755
|
},
|
|
@@ -8028,7 +8028,7 @@
|
|
|
8028
8028
|
"surface": "builders-hall",
|
|
8029
8029
|
"text": "Set up key storage",
|
|
8030
8030
|
"file": "modules/hall-ui/public/settings.js",
|
|
8031
|
-
"line":
|
|
8031
|
+
"line": 1059,
|
|
8032
8032
|
"origin": "js-markup",
|
|
8033
8033
|
"confidence": "certain"
|
|
8034
8034
|
},
|
|
@@ -8046,7 +8046,7 @@
|
|
|
8046
8046
|
"surface": "builders-hall",
|
|
8047
8047
|
"text": "Setting up key storage…",
|
|
8048
8048
|
"file": "modules/hall-ui/public/settings.js",
|
|
8049
|
-
"line":
|
|
8049
|
+
"line": 1143,
|
|
8050
8050
|
"origin": "js-text-assign",
|
|
8051
8051
|
"confidence": "certain"
|
|
8052
8052
|
},
|
|
@@ -9243,7 +9243,7 @@
|
|
|
9243
9243
|
"surface": "builders-hall",
|
|
9244
9244
|
"text": "Unlink failed: {…}",
|
|
9245
9245
|
"file": "modules/hall-ui/public/settings.js",
|
|
9246
|
-
"line":
|
|
9246
|
+
"line": 938,
|
|
9247
9247
|
"origin": "js-notice",
|
|
9248
9248
|
"confidence": "certain"
|
|
9249
9249
|
},
|
|
@@ -9783,7 +9783,7 @@
|
|
|
9783
9783
|
"surface": "builders-hall",
|
|
9784
9784
|
"text": "You're in the {…} server with your rank role.",
|
|
9785
9785
|
"file": "modules/hall-ui/public/settings.js",
|
|
9786
|
-
"line":
|
|
9786
|
+
"line": 915,
|
|
9787
9787
|
"origin": "js-markup",
|
|
9788
9788
|
"confidence": "certain"
|
|
9789
9789
|
},
|
|
@@ -9891,7 +9891,7 @@
|
|
|
9891
9891
|
"surface": "builders-hall",
|
|
9892
9892
|
"text": "Your image-generation key settings could not be loaded. Reload the page to try again.",
|
|
9893
9893
|
"file": "modules/hall-ui/public/settings.js",
|
|
9894
|
-
"line":
|
|
9894
|
+
"line": 1210,
|
|
9895
9895
|
"origin": "js-markup",
|
|
9896
9896
|
"confidence": "certain"
|
|
9897
9897
|
},
|
|
@@ -9909,7 +9909,7 @@
|
|
|
9909
9909
|
"surface": "builders-hall",
|
|
9910
9910
|
"text": "Your name cannot be blank.",
|
|
9911
9911
|
"file": "modules/hall-ui/public/settings.js",
|
|
9912
|
-
"line":
|
|
9912
|
+
"line": 826,
|
|
9913
9913
|
"origin": "js-notice",
|
|
9914
9914
|
"confidence": "certain"
|
|
9915
9915
|
},
|
|
@@ -9918,7 +9918,7 @@
|
|
|
9918
9918
|
"surface": "builders-hall",
|
|
9919
9919
|
"text": "Your name must be {…} characters or fewer.",
|
|
9920
9920
|
"file": "modules/hall-ui/public/settings.js",
|
|
9921
|
-
"line":
|
|
9921
|
+
"line": 831,
|
|
9922
9922
|
"origin": "js-notice",
|
|
9923
9923
|
"confidence": "certain"
|
|
9924
9924
|
},
|
|
@@ -9945,7 +9945,7 @@
|
|
|
9945
9945
|
"surface": "builders-hall",
|
|
9946
9946
|
"text": "Your preferences, {…}.",
|
|
9947
9947
|
"file": "modules/hall-ui/public/settings.js",
|
|
9948
|
-
"line":
|
|
9948
|
+
"line": 850,
|
|
9949
9949
|
"origin": "js-text-assign",
|
|
9950
9950
|
"confidence": "certain"
|
|
9951
9951
|
},
|
|
@@ -9954,14 +9954,14 @@
|
|
|
9954
9954
|
"surface": "builders-hall",
|
|
9955
9955
|
"text": "Your preferences, {…}.",
|
|
9956
9956
|
"file": "modules/hall-ui/public/settings.js",
|
|
9957
|
-
"line":
|
|
9957
|
+
"line": 1383,
|
|
9958
9958
|
"origin": "js-text-assign",
|
|
9959
9959
|
"confidence": "certain"
|
|
9960
9960
|
},
|
|
9961
9961
|
{
|
|
9962
|
-
"id": "
|
|
9962
|
+
"id": "b6dceaace783",
|
|
9963
9963
|
"surface": "builders-hall",
|
|
9964
|
-
"text": "Your profile page setting applies now — private already answers \"not found\" everywhere your profile is read. Recruiter discoverability applies now too — switching it off
|
|
9964
|
+
"text": "Your profile page setting applies now — private already answers \"not found\" everywhere your profile is read. Recruiter discoverability applies now too — switching it off removes you from both recruiting surfaces immediately, and back on puts you there again.",
|
|
9965
9965
|
"file": "modules/hall-ui/public/settings.html",
|
|
9966
9966
|
"line": 110,
|
|
9967
9967
|
"origin": "html-text",
|
|
@@ -11700,7 +11700,7 @@
|
|
|
11700
11700
|
"surface": "builders-hall",
|
|
11701
11701
|
"text": "{…} · Stored encrypted; never shown again after saving.",
|
|
11702
11702
|
"file": "modules/hall-ui/public/settings.js",
|
|
11703
|
-
"line":
|
|
11703
|
+
"line": 1045,
|
|
11704
11704
|
"origin": "js-markup",
|
|
11705
11705
|
"confidence": "certain"
|
|
11706
11706
|
},
|
|
@@ -11799,7 +11799,7 @@
|
|
|
11799
11799
|
"surface": "builders-hall",
|
|
11800
11800
|
"text": "· follows your profile setting",
|
|
11801
11801
|
"file": "modules/hall-ui/public/settings.js",
|
|
11802
|
-
"line":
|
|
11802
|
+
"line": 631,
|
|
11803
11803
|
"origin": "js-markup",
|
|
11804
11804
|
"confidence": "certain"
|
|
11805
11805
|
},
|
package/docs/file-map.md
CHANGED
|
@@ -357,6 +357,7 @@ tests/
|
|
|
357
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.
|
|
358
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
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.
|
|
360
|
+
├── recruiter_sliver_boundary.mjs ← (task 1002968, goal 1000045 C2/C5, privacy spec D3, ADR 0215): THE PRE-ACCEPT BOUNDARY proof for the D3 recruiter sliver. A WHITELIST over the module's own exported key list (a sixth key fails whether or not this file was told about it), planted improbable sentinels asserted absent from the WHOLE response body with two controls against vacuity, the ceiling assertion (the handle a recruiter is handed 404s at `GET /profiles/:handle`, with a 200 control) and the gate (both recruiting routes admit the same two audiences and refuse byte-identically). Real router + real HTTP over an in-memory table filtered by each statement's own WHERE clause. DB-free `unit` lane, asserted in the file itself.
|
|
360
361
|
└── 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.
|
|
361
362
|
```
|
|
362
363
|
|
|
@@ -1297,5 +1297,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
1297
1297
|
landed since 1.19.428 with no explicit bump. run 33274860035. (task 1002620)
|
|
1298
1298
|
1.19.430 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1299
1299
|
landed since 1.19.429 with no explicit bump. run 33275468532. (task 1002620)
|
|
1300
|
+
1.19.431 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1301
|
+
landed since 1.19.430 with no explicit bump. run 33277001235. (task 1002620)
|
|
1302
|
+
1.19.432 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1303
|
+
landed since 1.19.431 with no explicit bump. run 33279328366. (task 1002620)
|
|
1300
1304
|
---------------------------------------------------------------------------
|
|
1301
1305
|
```
|
|
@@ -704,6 +704,8 @@ function createClient(opts = {}) {
|
|
|
704
704
|
"scouting": {
|
|
705
705
|
// GET /scouting — rank: metic+archon — GET /scouting
|
|
706
706
|
getScouting: (args) => request("GET", "/scouting", { hasBody: false }, args),
|
|
707
|
+
// GET /scouting/{handle} — rank: archon — GET /scouting/:handle
|
|
708
|
+
getScoutingHandle: (args) => request("GET", "/scouting/{handle}", { hasBody: false }, args),
|
|
707
709
|
},
|
|
708
710
|
"search": {
|
|
709
711
|
// POST /search — rank: any-builder — POST /search
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
<p class="settings-status" id="privacy-status" role="status" aria-live="polite"></p>
|
|
110
110
|
<p class="section-note">Your profile page setting applies now — private already answers "not found"
|
|
111
111
|
everywhere your profile is read. Recruiter discoverability applies now too — switching
|
|
112
|
-
it off
|
|
112
|
+
it off removes you from both recruiting surfaces immediately, and back on puts you there again.</p>
|
|
113
113
|
</section>
|
|
114
114
|
|
|
115
115
|
<!-- CRAFT — discipline preferences (GET /me, PATCH /me/disciplines). -->
|
|
@@ -601,10 +601,15 @@
|
|
|
601
601
|
// read joins the shared effective-visibility predicate, so private really does
|
|
602
602
|
// 404 — including to the owner, which the row must say out loud: a page that
|
|
603
603
|
// vanishes for you too is surprising unless you are told where your record went
|
|
604
|
-
// (here, Settings). DISCOVERABILITY went live
|
|
605
|
-
//
|
|
606
|
-
// the
|
|
607
|
-
//
|
|
604
|
+
// (here, Settings). DISCOVERABILITY went live in two halves: task 1002290 (the People directory)
|
|
605
|
+
// and task 1002968 (the D3 pre-accept sliver). BOTH recruiting reads now join
|
|
606
|
+
// the reach axis — listScoutingRollup via scoutingListableSql, the sliver via
|
|
607
|
+
// recruiterSliverVisibleSql — so the row may finally name both, which is exactly
|
|
608
|
+
// what 1002290 narrowed it away from while the second surface was unbuilt. The
|
|
609
|
+
// wider claim is CHECKABLE rather than open-ended: account_privacy_flags.mjs
|
|
610
|
+
// pins that the recruiting surface has exactly those two reads and that each one
|
|
611
|
+
// joins reach, so a third would red the guard before this sentence could quietly
|
|
612
|
+
// become false.
|
|
608
613
|
function renderPrivacy(data) {
|
|
609
614
|
const wrap = $('#privacy-rows');
|
|
610
615
|
if (!wrap) return;
|
|
@@ -612,13 +617,17 @@
|
|
|
612
617
|
const discoverable = !!(data && data.recruiter_discoverable_effective);
|
|
613
618
|
const follows = !data || data.recruiter_discoverable == null;
|
|
614
619
|
const grant = data && data.hide_stats
|
|
615
|
-
? 'Because your cross-project record is hidden, they will see your name and nothing else.'
|
|
616
|
-
: 'They will see your name, your disciplines, and whether you have been active in the last 30 days — never your credits, works shipped, karma, or the projects you build on.';
|
|
620
|
+
? 'Because your cross-project record is hidden, they will see your name and your picture, and nothing else.'
|
|
621
|
+
: 'They will see your name, your picture, your disciplines, and whether you have been active in the last 30 days — never your credits, works shipped, karma, or the projects you build on.';
|
|
622
|
+
// The surprising half, and only where it applies: a private profile answers
|
|
623
|
+
// "not found" to every visitor, and this one switch is the exception.
|
|
624
|
+
const despitePrivate = isPublic ? ''
|
|
625
|
+
: ' This is the one thing a recruiter can see while your profile page is private.';
|
|
617
626
|
wrap.innerHTML =
|
|
618
627
|
privacyRow('visibility', 'Public profile page', isPublic ? 'Public' : 'Private', isPublic,
|
|
619
628
|
'Public means anyone can open your profile page and find you by name. Private hides the page from everyone — including you: it answers "not found" to every visitor, and you read your own record here in Settings instead.', '') +
|
|
620
629
|
privacyRow('discoverable', 'Discoverable by recruiters', discoverable ? 'On' : 'Off', discoverable,
|
|
621
|
-
`Recruiters looking for builders can find you. ${grant} Turning this off
|
|
630
|
+
`Recruiters looking for builders can find you. ${grant}${despitePrivate} Turning this off removes you from both recruiting surfaces — the People directory, and a recruiter's look-up of one builder — straight away.`,
|
|
622
631
|
follows ? ' <span class="voices__default">· follows your profile setting</span>' : '');
|
|
623
632
|
}
|
|
624
633
|
|
|
@@ -646,7 +655,7 @@
|
|
|
646
655
|
}
|
|
647
656
|
return on
|
|
648
657
|
? 'Saved — recruiters can find you.'
|
|
649
|
-
: 'Saved — you are out of the
|
|
658
|
+
: 'Saved — you are out of the recruiting surfaces.';
|
|
650
659
|
}
|
|
651
660
|
|
|
652
661
|
// PATCH any own-scoped privacy flag (routes/profile.js): { hide_stats } and/or
|
|
@@ -34,6 +34,11 @@
|
|
|
34
34
|
// scoutingListableSql THE DIRECTORY — numbers AND reach,
|
|
35
35
|
// the ONE predicate the recruiting directory joins (ADR 0210, task
|
|
36
36
|
// 1002290). Composed, never restated.
|
|
37
|
+
// recruiterSliverVisibleSql / isRecruiterSliverVisible THE PRE-ACCEPT
|
|
38
|
+
// SLIVER — consent AND reach, WITHOUT the existence axis (ADR 0215, task
|
|
39
|
+
// 1002968; privacy spec D3). The one predicate that deliberately does not
|
|
40
|
+
// floor on accountVisibleSql, because a PRIVATE, discoverable account is
|
|
41
|
+
// precisely its subject. Composed, never restated.
|
|
37
42
|
//
|
|
38
43
|
// The rollup pair was originally left to "the rollup readers" to apply. Task
|
|
39
44
|
// 1002967 moved it here for the reason this file exists: there are two such
|
|
@@ -200,6 +205,46 @@ function scoutingListableSql(alias) {
|
|
|
200
205
|
return `(${rollupVisibleSql(alias)} AND ${recruiterReachSql(alias)})`;
|
|
201
206
|
}
|
|
202
207
|
|
|
208
|
+
// recruiterSliverVisibleSql — THE predicate the PRE-ACCEPT recruiter sliver
|
|
209
|
+
// joins: the CONSENT floor AND the reach axis (ADR 0215, privacy spec D3; task
|
|
210
|
+
// 1002968). modules/platform-identity/recruiter-sliver.js is its one reader.
|
|
211
|
+
//
|
|
212
|
+
// WHY IT FLOORS ON CONSENT AND NOT ON EXISTENCE — the one deliberate difference
|
|
213
|
+
// in this file. Every other public answer here ANDs accountVisibleSql, which
|
|
214
|
+
// carries account_visibility = 'public'. This one must not, because the account
|
|
215
|
+
// the D3 sliver EXISTS to serve is the private, explicitly-discoverable one —
|
|
216
|
+
// the privacy spec's D2 "private, discoverable" row. Flooring on the existence
|
|
217
|
+
// axis would empty the sliver of exactly its subject and leave it a redundant,
|
|
218
|
+
// poorer copy of the directory.
|
|
219
|
+
//
|
|
220
|
+
// THAT IS SAFE ONLY BECAUSE THE REACH HALF IS AN EXPLICIT OPT-IN FOR A PRIVATE
|
|
221
|
+
// ACCOUNT. recruiterReachSql is COALESCE(recruiter_discoverable, visibility =
|
|
222
|
+
// 'public'): for a private account the NULL default resolves to FALSE, so a
|
|
223
|
+
// private account reaches this surface only when its owner set the flag to true
|
|
224
|
+
// by hand. Dropping the existence axis therefore widens nothing on its own — it
|
|
225
|
+
// hands the decision to the account, which is what consent means.
|
|
226
|
+
//
|
|
227
|
+
// profile_state = 'active' still floors it, so a PROVISIONAL account is never
|
|
228
|
+
// recruiter-visible (spec D3, said out loud). And this predicate answers only
|
|
229
|
+
// WHO may appear; WHAT appears is the whitelist in recruiter-sliver.js, which
|
|
230
|
+
// shrinks to name-only under hide_stats. Never authority (ADR 0016): being
|
|
231
|
+
// reachable by a recruiter grants the account nothing and costs it nothing.
|
|
232
|
+
function recruiterSliverVisibleSql(alias) {
|
|
233
|
+
// Validated here as well as in both delegates, for the scoutingListableSql
|
|
234
|
+
// reason: a security property must not rest on template evaluation order, and
|
|
235
|
+
// the error should name the function the caller actually called.
|
|
236
|
+
if (alias && !/^[A-Za-z_][A-Za-z0-9_]*$/.test(String(alias))) {
|
|
237
|
+
throw new Error('recruiterSliverVisibleSql: alias must be a bare SQL identifier');
|
|
238
|
+
}
|
|
239
|
+
return `(${accountActiveSql(alias)} AND ${recruiterReachSql(alias)})`;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// The JS twin of recruiterSliverVisibleSql, for a reader that already holds the
|
|
243
|
+
// row. Fail-closed on an absent account, like every port above it.
|
|
244
|
+
function isRecruiterSliverVisible(account) {
|
|
245
|
+
return isAccountActive(account) && isRecruiterDiscoverable(account);
|
|
246
|
+
}
|
|
247
|
+
|
|
203
248
|
module.exports = {
|
|
204
249
|
isAccountVisible,
|
|
205
250
|
accountVisibleSql,
|
|
@@ -211,4 +256,6 @@ module.exports = {
|
|
|
211
256
|
isRecruiterDiscoverable,
|
|
212
257
|
recruiterReachSql,
|
|
213
258
|
scoutingListableSql,
|
|
259
|
+
recruiterSliverVisibleSql,
|
|
260
|
+
isRecruiterSliverVisible,
|
|
214
261
|
};
|
|
@@ -947,9 +947,9 @@ async function setAccountHideStats({ githubId, githubLogin, displayName, avatarU
|
|
|
947
947
|
// touches ONLY the flags the caller sent — never identity re-sync, never
|
|
948
948
|
// profile_state (activation stays /sso/authorize's alone, D3), never hide_stats
|
|
949
949
|
// (which keeps its own writer, setAccountHideStats).
|
|
950
|
-
//
|
|
951
|
-
//
|
|
952
|
-
//
|
|
950
|
+
// recruiter_discoverable accepts null on purpose (the caller RESETTING it to
|
|
951
|
+
// "follow visibility"), and GOING PRIVATE resets it too unless the PATCH names
|
|
952
|
+
// it — a true set while PUBLIC is not consent to be seen once private (ADR 0215).
|
|
953
953
|
async function setAccountPrivacy({ githubId, githubLogin, displayName, avatarUrl, fields = {} }, { pool = defaultPool } = {}) {
|
|
954
954
|
if (!isNumericGithubId(githubId)) return { error: 'no_account' };
|
|
955
955
|
const setVisibility = 'account_visibility' in fields;
|
|
@@ -970,7 +970,7 @@ async function setAccountPrivacy({ githubId, githubLogin, displayName, avatarUrl
|
|
|
970
970
|
account_visibility = CASE WHEN $7::boolean THEN EXCLUDED.account_visibility
|
|
971
971
|
ELSE platform_identity_accounts.account_visibility END,
|
|
972
972
|
recruiter_discoverable = CASE WHEN $8::boolean THEN EXCLUDED.recruiter_discoverable
|
|
973
|
-
ELSE platform_identity_accounts.recruiter_discoverable END,
|
|
973
|
+
WHEN $7::boolean AND EXCLUDED.account_visibility = 'private' THEN NULL ELSE platform_identity_accounts.recruiter_discoverable END,
|
|
974
974
|
updated_at = now()
|
|
975
975
|
RETURNING github_id, github_login, profile_state, hide_stats,
|
|
976
976
|
account_visibility, recruiter_discoverable, handle`,
|