@bongos/core 1.19.535 → 1.19.536

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.
@@ -3,17 +3,17 @@
3
3
  "generator": "scripts/gds/copy-inventory.js",
4
4
  "goal": 1000074,
5
5
  "counts": {
6
- "strings": 1654,
7
- "unique_ids": 1434,
8
- "certain": 1654,
6
+ "strings": 1673,
7
+ "unique_ids": 1448,
8
+ "certain": 1673,
9
9
  "heuristic": 0,
10
- "duplicate_ids": 155
10
+ "duplicate_ids": 158
11
11
  },
12
12
  "surfaces": {
13
13
  "builders-hall": {
14
14
  "at": "modules/hall-ui/public",
15
- "files": 74,
16
- "strings": 1189
15
+ "files": 76,
16
+ "strings": 1208
17
17
  },
18
18
  "status-dashboard": {
19
19
  "at": "modules/status-ui/public",
@@ -136,6 +136,19 @@
136
136
  "modules/public-landing/public/terms.html:84"
137
137
  ]
138
138
  },
139
+ {
140
+ "id": "9a685b01e2c6",
141
+ "surface": "builders-hall",
142
+ "text": "This page opens at a higher rank.",
143
+ "occurrences": 5,
144
+ "at": [
145
+ "modules/hall-ui/public/gate.html:37",
146
+ "modules/hall-ui/public/government.html:37",
147
+ "modules/hall-ui/public/harbor.html:37",
148
+ "modules/hall-ui/public/project-settings.html:36",
149
+ "modules/hall-ui/public/watch.html:40"
150
+ ]
151
+ },
139
152
  {
140
153
  "id": "4d8ee7d68974",
141
154
  "surface": "builders-hall",
@@ -230,7 +243,7 @@
230
243
  "modules/hall-ui/public/hall-render.js:265",
231
244
  "modules/hall-ui/public/hall-render.js:336",
232
245
  "modules/hall-ui/public/hall-render.js:405",
233
- "modules/hall-ui/public/shell.js:324"
246
+ "modules/hall-ui/public/shell.js:327"
234
247
  ]
235
248
  },
236
249
  {
@@ -257,18 +270,6 @@
257
270
  "modules/hall-ui/public/task.js:703"
258
271
  ]
259
272
  },
260
- {
261
- "id": "9a685b01e2c6",
262
- "surface": "builders-hall",
263
- "text": "This page opens at a higher rank.",
264
- "occurrences": 4,
265
- "at": [
266
- "modules/hall-ui/public/gate.html:37",
267
- "modules/hall-ui/public/government.html:37",
268
- "modules/hall-ui/public/harbor.html:37",
269
- "modules/hall-ui/public/watch.html:40"
270
- ]
271
- },
272
273
  {
273
274
  "id": "b31fc908c962",
274
275
  "surface": "builders-hall",
@@ -347,6 +348,17 @@
347
348
  "modules/hall-ui/public/goals.js:67"
348
349
  ]
349
350
  },
351
+ {
352
+ "id": "e08628967f2f",
353
+ "surface": "builders-hall",
354
+ "text": "Project settings",
355
+ "occurrences": 3,
356
+ "at": [
357
+ "modules/hall-ui/public/project-settings.html:15",
358
+ "modules/hall-ui/public/project-settings.html:15",
359
+ "modules/hall-ui/public/project-settings.html:26"
360
+ ]
361
+ },
350
362
  {
351
363
  "id": "45f7bea67776",
352
364
  "surface": "landing",
@@ -613,6 +625,16 @@
613
625
  "modules/hall-ui/public/work.js:563"
614
626
  ]
615
627
  },
628
+ {
629
+ "id": "90691bceaf68",
630
+ "surface": "builders-hall",
631
+ "text": "Could not load",
632
+ "occurrences": 2,
633
+ "at": [
634
+ "modules/hall-ui/public/project-settings.js:242",
635
+ "modules/hall-ui/public/task.js:710"
636
+ ]
637
+ },
616
638
  {
617
639
  "id": "7775fec0fa85",
618
640
  "surface": "builders-hall",
@@ -1043,6 +1065,16 @@
1043
1065
  "modules/public-landing/public/projects.html:960"
1044
1066
  ]
1045
1067
  },
1068
+ {
1069
+ "id": "1fe749ae5677",
1070
+ "surface": "builders-hall",
1071
+ "text": "Project settings — {{worldName}}",
1072
+ "occurrences": 2,
1073
+ "at": [
1074
+ "modules/hall-ui/public/project-settings.html:6",
1075
+ "modules/hall-ui/public/project-settings.html:6"
1076
+ ]
1077
+ },
1046
1078
  {
1047
1079
  "id": "dd4bc23c7759",
1048
1080
  "surface": "builders-hall",
@@ -1229,8 +1261,8 @@
1229
1261
  "text": "Sign out",
1230
1262
  "occurrences": 2,
1231
1263
  "at": [
1232
- "modules/hall-ui/public/shell.js:342",
1233
- "modules/hall-ui/public/shell.js:499"
1264
+ "modules/hall-ui/public/shell.js:345",
1265
+ "modules/hall-ui/public/shell.js:502"
1234
1266
  ]
1235
1267
  },
1236
1268
  {
@@ -1952,6 +1984,15 @@
1952
1984
  "origin": "js-notice",
1953
1985
  "confidence": "certain"
1954
1986
  },
1987
+ {
1988
+ "id": "568d58fd26cc",
1989
+ "surface": "builders-hall",
1990
+ "text": "A configured value could not be used:",
1991
+ "file": "modules/hall-ui/public/project-settings.js",
1992
+ "line": 103,
1993
+ "origin": "js-markup",
1994
+ "confidence": "certain"
1995
+ },
1955
1996
  {
1956
1997
  "id": "2c23271d5d71",
1957
1998
  "surface": "builders-hall",
@@ -2699,6 +2740,15 @@
2699
2740
  "origin": "html-attr:aria-label",
2700
2741
  "confidence": "certain"
2701
2742
  },
2743
+ {
2744
+ "id": "c1c7158e0a43",
2745
+ "surface": "builders-hall",
2746
+ "text": "Category saved.",
2747
+ "file": "modules/hall-ui/public/project-settings.js",
2748
+ "line": 214,
2749
+ "origin": "js-notice",
2750
+ "confidence": "certain"
2751
+ },
2702
2752
  {
2703
2753
  "id": "0279db21e29a",
2704
2754
  "surface": "builders-hall",
@@ -3446,6 +3496,15 @@
3446
3496
  "origin": "js-notice",
3447
3497
  "confidence": "certain"
3448
3498
  },
3499
+ {
3500
+ "id": "90691bceaf68",
3501
+ "surface": "builders-hall",
3502
+ "text": "Could not load",
3503
+ "file": "modules/hall-ui/public/project-settings.js",
3504
+ "line": 242,
3505
+ "origin": "js-text-assign",
3506
+ "confidence": "certain"
3507
+ },
3449
3508
  {
3450
3509
  "id": "90691bceaf68",
3451
3510
  "surface": "builders-hall",
@@ -4643,6 +4702,15 @@
4643
4702
  "origin": "js-text-assign",
4644
4703
  "confidence": "certain"
4645
4704
  },
4705
+ {
4706
+ "id": "c6c9d3129ab2",
4707
+ "surface": "builders-hall",
4708
+ "text": "Five things every project settles. Two of them are knobs you can turn here; the other three are decided in committed configuration, and each says which file decides it.",
4709
+ "file": "modules/hall-ui/public/project-settings.html",
4710
+ "line": 41,
4711
+ "origin": "html-text",
4712
+ "confidence": "certain"
4713
+ },
4646
4714
  {
4647
4715
  "id": "b9267033b1f1",
4648
4716
  "surface": "builders-hall",
@@ -4796,6 +4864,15 @@
4796
4864
  "origin": "js-markup",
4797
4865
  "confidence": "certain"
4798
4866
  },
4867
+ {
4868
+ "id": "8e52f0649662",
4869
+ "surface": "builders-hall",
4870
+ "text": "Give the category a label.",
4871
+ "file": "modules/hall-ui/public/project-settings.js",
4872
+ "line": 189,
4873
+ "origin": "js-notice",
4874
+ "confidence": "certain"
4875
+ },
4799
4876
  {
4800
4877
  "id": "79934b879a12",
4801
4878
  "surface": "builders-hall",
@@ -5422,7 +5499,7 @@
5422
5499
  "surface": "builders-hall",
5423
5500
  "text": "Jump to a page or record",
5424
5501
  "file": "modules/hall-ui/public/shell.js",
5425
- "line": 363,
5502
+ "line": 366,
5426
5503
  "origin": "js-markup",
5427
5504
  "confidence": "certain"
5428
5505
  },
@@ -5431,7 +5508,7 @@
5431
5508
  "surface": "builders-hall",
5432
5509
  "text": "Jump to…",
5433
5510
  "file": "modules/hall-ui/public/shell.js",
5434
- "line": 365,
5511
+ "line": 368,
5435
5512
  "origin": "js-markup",
5436
5513
  "confidence": "certain"
5437
5514
  },
@@ -6038,6 +6115,15 @@
6038
6115
  "origin": "js-markup",
6039
6116
  "confidence": "certain"
6040
6117
  },
6118
+ {
6119
+ "id": "87f09d983f6c",
6120
+ "surface": "builders-hall",
6121
+ "text": "New category label",
6122
+ "file": "modules/hall-ui/public/project-settings.js",
6123
+ "line": 138,
6124
+ "origin": "js-markup",
6125
+ "confidence": "certain"
6126
+ },
6041
6127
  {
6042
6128
  "id": "d427d9dab01c",
6043
6129
  "surface": "builders-hall",
@@ -6673,7 +6759,7 @@
6673
6759
  "surface": "builders-hall",
6674
6760
  "text": "Open navigation",
6675
6761
  "file": "modules/hall-ui/public/shell.js",
6676
- "line": 354,
6762
+ "line": 357,
6677
6763
  "origin": "js-markup",
6678
6764
  "confidence": "certain"
6679
6765
  },
@@ -7073,6 +7159,51 @@
7073
7159
  "origin": "html-title",
7074
7160
  "confidence": "certain"
7075
7161
  },
7162
+ {
7163
+ "id": "e08628967f2f",
7164
+ "surface": "builders-hall",
7165
+ "text": "Project settings",
7166
+ "file": "modules/hall-ui/public/project-settings.html",
7167
+ "line": 15,
7168
+ "origin": "html-attr:title",
7169
+ "confidence": "certain"
7170
+ },
7171
+ {
7172
+ "id": "e08628967f2f",
7173
+ "surface": "builders-hall",
7174
+ "text": "Project settings",
7175
+ "file": "modules/hall-ui/public/project-settings.html",
7176
+ "line": 15,
7177
+ "origin": "html-attr:data-page-title",
7178
+ "confidence": "certain"
7179
+ },
7180
+ {
7181
+ "id": "e08628967f2f",
7182
+ "surface": "builders-hall",
7183
+ "text": "Project settings",
7184
+ "file": "modules/hall-ui/public/project-settings.html",
7185
+ "line": 26,
7186
+ "origin": "html-text",
7187
+ "confidence": "certain"
7188
+ },
7189
+ {
7190
+ "id": "1fe749ae5677",
7191
+ "surface": "builders-hall",
7192
+ "text": "Project settings — {{worldName}}",
7193
+ "file": "modules/hall-ui/public/project-settings.html",
7194
+ "line": 6,
7195
+ "origin": "html-text",
7196
+ "confidence": "certain"
7197
+ },
7198
+ {
7199
+ "id": "1fe749ae5677",
7200
+ "surface": "builders-hall",
7201
+ "text": "Project settings — {{worldName}}",
7202
+ "file": "modules/hall-ui/public/project-settings.html",
7203
+ "line": 6,
7204
+ "origin": "html-title",
7205
+ "confidence": "certain"
7206
+ },
7076
7207
  {
7077
7208
  "id": "dd4bc23c7759",
7078
7209
  "surface": "builders-hall",
@@ -7145,6 +7276,15 @@
7145
7276
  "origin": "js-markup",
7146
7277
  "confidence": "certain"
7147
7278
  },
7279
+ {
7280
+ "id": "4de232a05888",
7281
+ "surface": "builders-hall",
7282
+ "text": "Raise after",
7283
+ "file": "modules/hall-ui/public/project-settings.js",
7284
+ "line": 113,
7285
+ "origin": "js-markup",
7286
+ "confidence": "certain"
7287
+ },
7148
7288
  {
7149
7289
  "id": "b9c6def6b120",
7150
7290
  "surface": "builders-hall",
@@ -8203,7 +8343,7 @@
8203
8343
  "surface": "builders-hall",
8204
8344
  "text": "Sign in with GitHub",
8205
8345
  "file": "modules/hall-ui/public/shell.js",
8206
- "line": 324,
8346
+ "line": 327,
8207
8347
  "origin": "js-markup",
8208
8348
  "confidence": "certain"
8209
8349
  },
@@ -8212,7 +8352,7 @@
8212
8352
  "surface": "builders-hall",
8213
8353
  "text": "Sign out",
8214
8354
  "file": "modules/hall-ui/public/shell.js",
8215
- "line": 342,
8355
+ "line": 345,
8216
8356
  "origin": "js-markup",
8217
8357
  "confidence": "certain"
8218
8358
  },
@@ -8221,7 +8361,7 @@
8221
8361
  "surface": "builders-hall",
8222
8362
  "text": "Sign out",
8223
8363
  "file": "modules/hall-ui/public/shell.js",
8224
- "line": 499,
8364
+ "line": 502,
8225
8365
  "origin": "js-markup",
8226
8366
  "confidence": "certain"
8227
8367
  },
@@ -8248,7 +8388,7 @@
8248
8388
  "surface": "builders-hall",
8249
8389
  "text": "Skip to content",
8250
8390
  "file": "modules/hall-ui/public/shell.js",
8251
- "line": 490,
8391
+ "line": 493,
8252
8392
  "origin": "js-text-assign",
8253
8393
  "confidence": "certain"
8254
8394
  },
@@ -8324,6 +8464,15 @@
8324
8464
  "origin": "html-text",
8325
8465
  "confidence": "certain"
8326
8466
  },
8467
+ {
8468
+ "id": "6d4a7bf5ab0e",
8469
+ "surface": "builders-hall",
8470
+ "text": "Stale timer is now {…} days.",
8471
+ "file": "modules/hall-ui/public/project-settings.js",
8472
+ "line": 176,
8473
+ "origin": "js-notice",
8474
+ "confidence": "certain"
8475
+ },
8327
8476
  {
8328
8477
  "id": "98d037e427b8",
8329
8478
  "surface": "builders-hall",
@@ -8392,7 +8541,7 @@
8392
8541
  "surface": "builders-hall",
8393
8542
  "text": "Switch theme",
8394
8543
  "file": "modules/hall-ui/public/shell.js",
8395
- "line": 369,
8544
+ "line": 372,
8396
8545
  "origin": "js-markup",
8397
8546
  "confidence": "certain"
8398
8547
  },
@@ -8554,7 +8703,7 @@
8554
8703
  "surface": "builders-hall",
8555
8704
  "text": "Text size",
8556
8705
  "file": "modules/hall-ui/public/shell.js",
8557
- "line": 368,
8706
+ "line": 371,
8558
8707
  "origin": "js-markup",
8559
8708
  "confidence": "certain"
8560
8709
  },
@@ -8684,6 +8833,15 @@
8684
8833
  "origin": "js-markup",
8685
8834
  "confidence": "certain"
8686
8835
  },
8836
+ {
8837
+ "id": "cb7c7879eeba",
8838
+ "surface": "builders-hall",
8839
+ "text": "The fundamentals",
8840
+ "file": "modules/hall-ui/public/project-settings.html",
8841
+ "line": 40,
8842
+ "origin": "html-text",
8843
+ "confidence": "certain"
8844
+ },
8687
8845
  {
8688
8846
  "id": "4dd13bc5a35b",
8689
8847
  "surface": "builders-hall",
@@ -9215,6 +9373,15 @@
9215
9373
  "origin": "html-text",
9216
9374
  "confidence": "certain"
9217
9375
  },
9376
+ {
9377
+ "id": "9a685b01e2c6",
9378
+ "surface": "builders-hall",
9379
+ "text": "This page opens at a higher rank.",
9380
+ "file": "modules/hall-ui/public/project-settings.html",
9381
+ "line": 36,
9382
+ "origin": "html-text",
9383
+ "confidence": "certain"
9384
+ },
9218
9385
  {
9219
9386
  "id": "9a685b01e2c6",
9220
9387
  "surface": "builders-hall",
@@ -10331,6 +10498,15 @@
10331
10498
  "origin": "js-markup",
10332
10499
  "confidence": "certain"
10333
10500
  },
10501
+ {
10502
+ "id": "a756e47632cd",
10503
+ "surface": "builders-hall",
10504
+ "text": "at {…} — {…}. The timer above is the fallback that is actually in force.",
10505
+ "file": "modules/hall-ui/public/project-settings.js",
10506
+ "line": 103,
10507
+ "origin": "js-markup",
10508
+ "confidence": "certain"
10509
+ },
10334
10510
  {
10335
10511
  "id": "63bd14f73960",
10336
10512
  "surface": "builders-hall",
@@ -10448,6 +10624,15 @@
10448
10624
  "origin": "js-markup",
10449
10625
  "confidence": "certain"
10450
10626
  },
10627
+ {
10628
+ "id": "0e2bef756977",
10629
+ "surface": "builders-hall",
10630
+ "text": "days ({…}–{…})",
10631
+ "file": "modules/hall-ui/public/project-settings.js",
10632
+ "line": 113,
10633
+ "origin": "js-markup",
10634
+ "confidence": "certain"
10635
+ },
10451
10636
  {
10452
10637
  "id": "2a3ff5ca33a9",
10453
10638
  "surface": "builders-hall",
@@ -11573,6 +11758,15 @@
11573
11758
  "origin": "js-markup",
11574
11759
  "confidence": "certain"
11575
11760
  },
11761
+ {
11762
+ "id": "d2bd1c3ab0f5",
11763
+ "surface": "builders-hall",
11764
+ "text": "{ if (row.key === 'rot_timer' && row.editable) return rowHtml(row, rotBodyHtml(row)); if (row.key === 'work_categories' && row.editable) return rowHtml(row, catsBodyHtml(row)); return rowHtml(row, ''); }).join('')}",
11765
+ "file": "modules/hall-ui/public/project-settings.js",
11766
+ "line": 152,
11767
+ "origin": "js-markup",
11768
+ "confidence": "certain"
11769
+ },
11576
11770
  {
11577
11771
  "id": "50d4a70a2eb2",
11578
11772
  "surface": "builders-hall",
@@ -11735,6 +11929,15 @@
11735
11929
  "origin": "js-markup",
11736
11930
  "confidence": "certain"
11737
11931
  },
11932
+ {
11933
+ "id": "00c50715f271",
11934
+ "surface": "builders-hall",
11935
+ "text": "{…} fundamentals · {…} you can change here",
11936
+ "file": "modules/hall-ui/public/project-settings.js",
11937
+ "line": 228,
11938
+ "origin": "js-text-assign",
11939
+ "confidence": "certain"
11940
+ },
11738
11941
  {
11739
11942
  "id": "511a4b6073cf",
11740
11943
  "surface": "builders-hall",
@@ -1519,5 +1519,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
1519
1519
  landed since 1.19.533 with no explicit bump. run 33885355024. (task 1002620)
1520
1520
  1.19.535 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1521
1521
  landed since 1.19.534 with no explicit bump. run 33886686350. (task 1002620)
1522
+ 1.19.536 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1523
+ landed since 1.19.535 with no explicit bump. run 33888048777. (task 1002620)
1522
1524
  ---------------------------------------------------------------------------
1523
1525
  ```
@@ -633,6 +633,12 @@ function createClient(opts = {}) {
633
633
  // GET /profiles/{handle} — rank: public — GET /profiles/:handle
634
634
  getProfilesHandle: (args) => request("GET", "/profiles/{handle}", { hasBody: false }, args),
635
635
  },
636
+ "projectSettings": {
637
+ // GET /project-settings — rank: metic+archon — GET /project-settings
638
+ getProjectSettings: (args) => request("GET", "/project-settings", { hasBody: false }, args),
639
+ // PATCH /project-settings/rot-days — rank: metic+archon — PATCH /project-settings/rot-days
640
+ patchProjectSettingsRotDays: (args) => request("PATCH", "/project-settings/rot-days", { hasBody: true }, args),
641
+ },
636
642
  "projects": {
637
643
  // GET /projects — rank: metic+archon — GET /projects
638
644
  getProjects: (args) => request("GET", "/projects", { hasBody: false }, args),
@@ -894,6 +900,8 @@ function createClient(opts = {}) {
894
900
  getWorkCategories: (args) => request("GET", "/work-categories", { hasBody: false }, args),
895
901
  // POST /work-categories — rank: metic+archon — POST /work-categories
896
902
  postWorkCategories: (args) => request("POST", "/work-categories", { hasBody: true }, args),
903
+ // PATCH /work-categories/{id} — rank: metic+archon — PATCH /work-categories/:id
904
+ patchWorkCategoriesId: (args) => request("PATCH", "/work-categories/{id}", { hasBody: true }, args),
897
905
  },
898
906
  };
899
907
  }
@@ -200,6 +200,7 @@ const PERMISSIONS = [
200
200
  // personally opted in (task 1003177, ADR 0187 §5), so this atom cannot put
201
201
  // anyone in a room with a stranger on its own.
202
202
  { key: 'mingle.manage', system: false, floor: 'metic', guards: 'PUT /mingle/project (the project half of mingle consent), POST /mingle/round (run a pairing round) — task 1003177, goal 1000075' },
203
+ { key: 'project.settings.manage', system: false, floor: 'metic', guards: "PATCH /project-settings/* — the project's own live knobs (the rot timer today) and the work-category set's shape (PATCH /work-categories/:id). Metic, matching goal.create's reasoning that extending the project's vocabulary is a planning act rather than an administrative one — task 1003280, goal 1000072" },
203
204
  { key: 'project.curate', system: false, floor: 'metic', guards: 'platform-identity: GET/POST /projects, /projects/invite, PATCH /projects/:id/featured, GET /scouting (ADR 0157, was archon)' },
204
205
  { key: 'override_request.decide', system: false, floor: 'metic', guards: 'GET /override-requests, POST .../:id/decide (ADR 0157, was archon)' },
205
206
  { key: 'claim.release.any', system: false, floor: 'metic', scope: 'any', resource: 'claim', guards: 'POST /claims/:id/release-on-behalf (ADR 0157, was archon)' },
@@ -0,0 +1,58 @@
1
+ -- government_010_project_settings_manage.sql — grant the new `project.settings.manage`
2
+ -- atom to the Metic and Archon rank-roles (task 1003280, goal 1000072, criterion
3
+ -- legibility-project-settings).
4
+ --
5
+ -- The project-settings page carries the five fundamentals of a project, and TWO of
6
+ -- them are live knobs a person may turn: the rot timer (project_settings, migration
7
+ -- core_231) and the shape of the work-category set (work_categories, core_226). Both
8
+ -- writes need a gate, and BV1.R105 says a modules/*/routes gate is a permission atom
9
+ -- and never a rank — tests/government_require_permission.mjs fails the build on a new
10
+ -- `requireRank`.
11
+ --
12
+ -- FLOOR `metic`, by the `goal.create` analogue rather than archon. `goal.create`
13
+ -- already gates POST /work-categories on the reasoning that "extending the project's
14
+ -- vocabulary is a planning act", and this atom governs the same vocabulary's SHAPE
15
+ -- (label, order, whether it is still offered) plus one reporting timer. What makes
16
+ -- that safe is the ADR 0192 wall the category set already stands behind: a category
17
+ -- is ADVISORY — no gate, route guard, rank check, feed filter or dependency rule may
18
+ -- read it (scripts/gds/category-advisory-guard.js fails the build if that changes) —
19
+ -- so this atom cannot alter who may do what. The rot timer is the reporting half of
20
+ -- ADR 0226's asymmetry: it only ever ASKS a human, and the timer that ENFORCES
21
+ -- (src/stale-timer.js, which auto-releases claims) is deliberately NOT reachable
22
+ -- from here.
23
+ --
24
+ -- A BRAND-NEW key: no rank holds it yet, so BOTH rungs the floor implies are granted
25
+ -- here. RANK_SEED is a cumulative superset — floor `metic` means {metic, archon} —
26
+ -- and the drift guard (tests/government_seed.mjs) compares the UNION of the run-once
27
+ -- seed plus every later grant migration against that floor-derived seed, per rank.
28
+ -- Minting the catalog row WITHOUT this migration is exactly what that guard caught
29
+ -- on this task, as it did on task 1003177.
30
+ --
31
+ -- COPIES government_009_mingle_manage.sql, NOT a `governance_*` file. Those predate
32
+ -- government_001_rename_from_governance, which renamed `governance_role_permissions`
33
+ -- → `government_rank_permissions` and `role_key` → `rank_key` with no compatibility
34
+ -- shim, so copying one writes to a table that no longer exists and errors at apply
35
+ -- time on any fresh install.
36
+ --
37
+ -- Additive only: one new permission key granted to two ranks; nothing is revoked.
38
+ -- Idempotent (ON CONFLICT DO NOTHING); forward-safe (INSERT only).
39
+ --
40
+ -- One block PER RANK, in the government_004/009 shape: the drift guard scans for
41
+ -- `SELECT '<rank>', unnest(ARRAY[…])` literally, so a combined
42
+ -- `unnest(ARRAY['metic','archon']), 'key'` form parses as zero grants and reds it.
43
+
44
+ BEGIN;
45
+
46
+ INSERT INTO government_rank_permissions (rank_key, permission_key)
47
+ SELECT 'metic', unnest(ARRAY[
48
+ 'project.settings.manage'
49
+ ])
50
+ ON CONFLICT (rank_key, permission_key) DO NOTHING;
51
+
52
+ INSERT INTO government_rank_permissions (rank_key, permission_key)
53
+ SELECT 'archon', unnest(ARRAY[
54
+ 'project.settings.manage'
55
+ ])
56
+ ON CONFLICT (rank_key, permission_key) DO NOTHING;
57
+
58
+ COMMIT;
@@ -0,0 +1,90 @@
1
+ /* project-settings.css — the five-fundamentals page (task 1003280, goal 1000072).
2
+ The ROW is oversight.css's .ov-row and the panel is style.css's .scroll; what
3
+ lives here is only what those two do not already say: the state pill that marks a
4
+ row unwritable, the small control cluster a knob row carries, and the provenance
5
+ foot that names the file a value resolves from. */
6
+
7
+ /* The provenance line. Every row has one — it is the point of the page — so it is
8
+ quiet by default and never competes with the value above it. */
9
+ .ps-prov {
10
+ margin: 6px 0 0;
11
+ font-size: 12px;
12
+ line-height: 1.5;
13
+ color: var(--ink-soft);
14
+ }
15
+ .ps-prov code {
16
+ font-size: 11px;
17
+ overflow-wrap: anywhere; /* a table[key] path must wrap on a phone, never widen the page */
18
+ }
19
+
20
+ /* The state pill: what kind of value this is. A reader must be able to tell "you
21
+ cannot type here" from "this is empty" at a glance, which is why absent and
22
+ not-yet-real do not share a colour with live. */
23
+ .ps-pill {
24
+ display: inline-block;
25
+ padding: 1px 8px;
26
+ border-radius: 999px;
27
+ font-size: 11px;
28
+ font-weight: 600;
29
+ letter-spacing: 0.01em;
30
+ border: 1px solid currentColor;
31
+ vertical-align: middle;
32
+ }
33
+ .ps-pill--live { color: var(--ok); }
34
+ .ps-pill--readonly { color: var(--ink-soft); }
35
+ .ps-pill--absent { color: var(--warn); }
36
+
37
+ /* A knob's controls. Wraps rather than widening: the page never scrolls sideways
38
+ (hall-ui/CLAUDE.md), and this cluster is the only thing on the page wide enough
39
+ to threaten that at 390px. */
40
+ .ps-controls {
41
+ display: flex;
42
+ flex-wrap: wrap;
43
+ align-items: center;
44
+ gap: 8px;
45
+ margin-top: 10px;
46
+ }
47
+ .ps-controls input[type="number"] { width: 7em; }
48
+ .ps-controls input[type="text"] { min-width: 0; flex: 1 1 12em; }
49
+
50
+ /* The category list inside its row. A plain list, not a nested ledger: it is edited
51
+ in place and a table would put a horizontal scrollport inside a card that already
52
+ is one. */
53
+ .ps-cats { margin: 10px 0 0; padding: 0; list-style: none; }
54
+ .ps-cat {
55
+ display: flex;
56
+ flex-wrap: wrap;
57
+ align-items: center;
58
+ gap: 8px;
59
+ padding: 8px 0;
60
+ border-top: var(--line) solid var(--rule-soft);
61
+ }
62
+ .ps-cat--off { opacity: 0.6; }
63
+ .ps-cat__slug {
64
+ font-size: 11px;
65
+ color: var(--ink-soft);
66
+ flex: 0 0 auto;
67
+ }
68
+
69
+ /* The invalid-value note: a configured value the resolver could not use. It renders
70
+ on the screen of the person who can fix it rather than 500-ing the page — the
71
+ reporting half of ADR 0226's asymmetric fail posture. */
72
+ .ps-invalid {
73
+ margin: 8px 0 0;
74
+ padding: 8px 10px;
75
+ border-radius: 6px;
76
+ font-size: 12px;
77
+ color: var(--warn);
78
+ border: 1px solid currentColor;
79
+ }
80
+
81
+ /* The sibling note on the stale-timer row — the OTHER timer, the one that enforces.
82
+ Indented and quiet: it is context that stops a misreading, not a second setting. */
83
+ .ps-sibling {
84
+ margin: 10px 0 0;
85
+ padding-left: 10px;
86
+ border-left: var(--line) solid var(--rule);
87
+ font-size: 12px;
88
+ color: var(--ink-soft);
89
+ }
90
+ .ps-sibling strong { color: inherit; font-weight: 600; }