@bongos/core 1.21.155 → 1.21.157
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 +43 -33
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +6 -0
- package/clients/bongos-client/index.cjs +6 -0
- package/clients/bongos-client/index.d.ts +8 -0
- package/clients/bongos-client/index.mjs +6 -0
- package/docs/api/openapi.json +159 -2
- package/docs/api-reference.md +5 -2
- package/docs/copy-inventory.md +31 -25
- package/docs/copy-registry.json +104 -50
- package/docs/module-api-changelog.md +4 -0
- package/docs/modules-contract.md +1 -0
- package/docs/page-readings.json +82 -77
- package/modules/government/catalog.js +1 -1
- package/modules/hall-ui/public/hall-widgets.js +1 -1
- package/modules/hall-ui/public/modules.html +11 -0
- package/modules/hall-ui/public/modules.js +104 -0
- package/modules/hall-ui/public/profile.html +1 -1
- package/modules/hall-ui/public/studio.html +1 -1
- package/modules/hall-ui/records/catalog.md +2 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +20 -0
- package/src/bongos/module-testing.js +73 -0
- package/src/bongos/project-settings.js +3 -0
- package/src/bongos/routes/modules.js +43 -0
- package/src/module-api.js +1 -1
- package/tests/hall_catalog_world.mjs +18 -2
- package/tests/module_testing.mjs +171 -0
|
@@ -3147,5 +3147,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
3147
3147
|
landed since 1.21.153 with no explicit bump. run 39800316919. (task 1002620)
|
|
3148
3148
|
1.21.155 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3149
3149
|
landed since 1.21.154 with no explicit bump. run 39805364072. (task 1002620)
|
|
3150
|
+
1.21.156 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3151
|
+
landed since 1.21.155 with no explicit bump. run 39808834444. (task 1002620)
|
|
3152
|
+
1.21.157 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3153
|
+
landed since 1.21.156 with no explicit bump. run 39861648960. (task 1002620)
|
|
3150
3154
|
---------------------------------------------------------------------------
|
|
3151
3155
|
```
|
package/docs/modules-contract.md
CHANGED
|
@@ -394,6 +394,7 @@ Run `bongos upgrade` to confirm coreVersion compatibility, then `node scripts/gd
|
|
|
394
394
|
- **Getting listed** (task 1003807, [ADR 0343](adr/0343-a-module-score-is-a-security-gate-then-an-average-of-visible-parts.md)). Publishing a version does not by itself put it in the store's catalog, `GET /store/modules`. The catalog shows each module's newest version, judged by its current score. It must pass the Security gate first; a version that failed it, or has not been checked yet, is not listed. A new version with no install or reliability data yet is listed with a **New** label and is not ranked; the floor does not apply to it until it has a real score. Every other version is listed only if its overall score is **at least 50 out of 100**. Below that it is not listed at all. The floor is fixed in Bongos itself (`QUALITY_FLOOR` in `src/bongos/module-listing.js`) and returned in the catalog response; no author or instance setting moves it, and changing it is an owner-approved, reviewed task.
|
|
395
395
|
- **What a module is strong and weak at** (task 1003799, ADR 0343 D4). Each catalog entry also carries `parts` (the current result of Tests, Clean installs, Reliability, Tester feedback and How-to) and a reading of them: `strengths` (a part scored **80 or more**), `weaknesses` (a part scored **below the floor**) and `unmeasured` (a part with no score yet, which is never counted as weak). Each strength and weakness has a one-sentence `detail` saying what the number rests on. Security is not among them: every listed version has passed it. The reading is `readParts` in `src/bongos/module-listing.js`; the hall's Modules tab shows it in its "In the store" group, so two modules with the same overall score can be told apart.
|
|
396
396
|
- **Sorting by a part** (task 1003800). `GET /store/modules?sort=<part>` orders the listed modules by one part a buyer cares about: `tests`, `install`, `reliability`, `tester_feedback` or `docs` (the response lists them as `sort_parts`, and says which one it applied as `sort`). Modules with a score for that part come first, highest first; a tie goes to the higher overall score, then the module key. A module with no score for that part goes last, so missing data never wins or loses a place on its own. New modules are not sorted: they are never ranked. Any other `sort` value is refused with a 400. Without `sort`, both lists are in key order. The rule is `sortByPart` in `src/bongos/module-listing.js`.
|
|
397
|
+
- **Testing new versions first** (task 1003802, [ADR 0344](adr/0344-a-tester-is-a-project-that-opts-in-once.md) D1). A project can choose to get each new version of its modules before everyone else. It is the project that opts in, never one builder for someone else's project, and never by default. `GET /modules/testing` returns `{ tester, general_only, updated_at, updated_by }` to anyone signed in. `POST /modules/testing { tester: true|false }` switches it, and `POST /modules/:key/general-only { general_only: true|false }` keeps one module on the versions everyone gets while the rest are tested. Both writes take the `module.enable` permission, the same one that turns modules on and off. Both are reversible: switching testing off puts the project back on general versions from its next update, and a module's "general only" mark is kept if testing is switched off and on again. The choice is stored in the project's own settings (`modules.tester`, `modules.general_only`); anything that cannot be read counts as not testing. `testsVersionsOf` in `src/bongos/module-testing.js` is the one answer to "does this project get the tester version of this module", which installs and updates use (task 1003805). The hall's Modules tab has the switch in its "Testing new versions" group, and the general-only control in each module's details.
|
|
397
398
|
|
|
398
399
|
### 7. Install from the store
|
|
399
400
|
|
package/docs/page-readings.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"adr": "0341 D3",
|
|
6
6
|
"reread": "node scripts/gds/page-reader.js --stale",
|
|
7
7
|
"how": ["Generated by node scripts/gds/page-reader.js (BV2.TW04, task 1004315; ADR 0341 D3). Do not hand-edit.","One entry per page of docs/page-inventory.json. Lines are in page order: the default state first, and a line only another state shows sits where that state shows it, with its state named.","placement: placed = a docs/copy-registry.json row renders it (file, line, string_id); shared = shell text every page of the surface carries (top bar, sidebar, footer), with its row when the registry has one; unplaced = the registry cannot place it (a rewrite becomes an engineer task, ADR 0341 D4).","text keeps {…} where the registry row has a hole, or where a value the page read from its API was filled in. A string that is only such data is counted under omitted.data, not listed.","reading_hash is over the non-shared lines (key, section, text); files_hash is over the page's inventory files. --check compares files_hash only and never opens a browser.","Rendered through the hall-preview harness (hall) and the ui-design kit stub (landing, status), at 1280x800 with the clock pinned, so a reading is the fixture world's page."],
|
|
8
|
-
"counts": {"pages":46,"lines":
|
|
8
|
+
"counts": {"pages":46,"lines":5568,"placed":1711,"shared":398,"unplaced":3459,"omitted_data":3606},
|
|
9
9
|
"pages": [
|
|
10
10
|
{
|
|
11
11
|
"id": "builders:atlas",
|
|
@@ -1439,8 +1439,8 @@
|
|
|
1439
1439
|
"surface": "builders",
|
|
1440
1440
|
"title": "Builders' Hall",
|
|
1441
1441
|
"states_read": ["home","standing","standing-karma","out","founding","genesis","decide","demo"],
|
|
1442
|
-
"files_hash": "
|
|
1443
|
-
"reading_hash": "
|
|
1442
|
+
"files_hash": "9214b2eda0281dec",
|
|
1443
|
+
"reading_hash": "3118df54ccbc936c",
|
|
1444
1444
|
"counts": {"lines":283,"placed":77,"shared":10,"unplaced":196},
|
|
1445
1445
|
"omitted": {"data":216},
|
|
1446
1446
|
"notes": ["founding: an action failed (page.focus: Timeout 6000ms exceeded.); read as it stood"],
|
|
@@ -1476,7 +1476,7 @@
|
|
|
1476
1476
|
{"key":"L0029","section":"Standing","text":"On the board","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":633,"string_id":"11a1905c76b2"},
|
|
1477
1477
|
{"key":"L0030","section":"Standing","text":"Preferred work","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":633,"string_id":"f03d68e60416"},
|
|
1478
1478
|
{"key":"L0031","section":"Standing","text":"{…}, {…}, {…}, ui","placement":"unplaced"},
|
|
1479
|
-
{"key":"L0032","section":"Standing","text":"
|
|
1479
|
+
{"key":"L0032","section":"Standing","text":"See your Full Account. →","placement":"placed","file":"modules/hall-ui/public/hall-widgets.js","line":86,"string_id":"90fb2fb1de63"},
|
|
1480
1480
|
{"key":"L0033","section":"Goals","text":"Goals","placement":"unplaced"},
|
|
1481
1481
|
{"key":"L0034","section":"Goals","text":"The open goals you’ve joined, and the work you can claim in each. Browse, join, and leave goals — and read their criteria — on the","placement":"placed","file":"modules/hall-ui/public/goals.js","line":111,"string_id":"0a98e249b324"},
|
|
1482
1482
|
{"key":"L0035","section":"Goals","text":"Goals page","placement":"placed","file":"modules/hall-ui/public/goals.js","line":111,"string_id":"2ed2cb8fbffd"},
|
|
@@ -1885,10 +1885,10 @@
|
|
|
1885
1885
|
"surface": "builders",
|
|
1886
1886
|
"title": "Modules",
|
|
1887
1887
|
"states_read": ["browse","search-empty","lens","details","out"],
|
|
1888
|
-
"files_hash": "
|
|
1889
|
-
"reading_hash": "
|
|
1890
|
-
"counts": {"lines":
|
|
1891
|
-
"omitted": {"data":
|
|
1888
|
+
"files_hash": "50ce60ad3dac0401",
|
|
1889
|
+
"reading_hash": "a17f501b72321b7b",
|
|
1890
|
+
"counts": {"lines":62,"placed":29,"shared":8,"unplaced":25},
|
|
1891
|
+
"omitted": {"data":106},
|
|
1892
1892
|
"notes": ["details: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood"],
|
|
1893
1893
|
"lines": [
|
|
1894
1894
|
{"key":"L0001","section":"skip link","text":"Skip to content","placement":"shared","file":"modules/hall-ui/public/shell.js","line":872,"string_id":"87cee78ca134"},
|
|
@@ -1928,26 +1928,31 @@
|
|
|
1928
1928
|
{"key":"L0035","section":"Module catalog","text":"{…} file{…}","placement":"placed","file":"modules/hall-ui/public/gate.js","line":151,"string_id":"3efa67dc6e07"},
|
|
1929
1929
|
{"key":"L0036","section":"Module catalog","text":"sessions","placement":"placed","file":"modules/hall-ui/public/task.js","line":467,"string_id":"732b4c935e36"},
|
|
1930
1930
|
{"key":"L0037","section":"Module catalog","text":"Built by this project","placement":"placed","file":"modules/hall-ui/public/modules.html","line":70,"string_id":"b51edc826cbe"},
|
|
1931
|
-
{"key":"L0038","section":"Module catalog","text":"submit for review","placement":"placed","file":"modules/hall-ui/public/modules.js","line":
|
|
1931
|
+
{"key":"L0038","section":"Module catalog","text":"submit for review","placement":"placed","file":"modules/hall-ui/public/modules.js","line":286,"string_id":"0215b2cdca8c"},
|
|
1932
1932
|
{"key":"L0039","section":"Module catalog","text":"A module built here can be submitted upstream for review, so it can join the shared catalog with your name and this project credited.","placement":"placed","file":"modules/hall-ui/public/modules.html","line":74,"string_id":"2e17d7e236d9"},
|
|
1933
|
-
{"key":"L0040","section":"Module catalog","text":"
|
|
1934
|
-
{"key":"L0041","section":"Module catalog","text":"
|
|
1935
|
-
{"key":"L0042","section":"Module catalog","text":"
|
|
1936
|
-
{"key":"L0043","section":"Module catalog","text":"
|
|
1937
|
-
{"key":"L0044","section":"Module catalog","text":"
|
|
1938
|
-
{"key":"L0045","section":"Module catalog","text":"
|
|
1939
|
-
{"key":"L0046","section":"Module catalog","text":"
|
|
1940
|
-
{"key":"L0047","section":"Module catalog","text":"
|
|
1941
|
-
{"key":"L0048","section":"
|
|
1942
|
-
{"key":"L0049","section":"Module catalog","text":"
|
|
1943
|
-
{"key":"L0050","section":"
|
|
1944
|
-
{"key":"L0051","section":"
|
|
1945
|
-
{"key":"L0052","section":"
|
|
1946
|
-
{"key":"L0053","section":"
|
|
1947
|
-
{"key":"L0054","section":"
|
|
1948
|
-
{"key":"L0055","section":"What are you doing now?","text":"
|
|
1949
|
-
{"key":"L0056","section":"What are you doing now?","text":"
|
|
1950
|
-
{"key":"L0057","section":"What are you doing now?","text":"
|
|
1933
|
+
{"key":"L0040","section":"Module catalog","text":"Testing new versions","placement":"placed","file":"modules/hall-ui/public/modules.html","line":82,"string_id":"d52c87fba7da"},
|
|
1934
|
+
{"key":"L0041","section":"Module catalog","text":"This project tests new versions first","placement":"placed","file":"modules/hall-ui/public/modules.js","line":211,"string_id":"1116d2cad470"},
|
|
1935
|
+
{"key":"L0042","section":"Module catalog","text":"testing","placement":"unplaced"},
|
|
1936
|
+
{"key":"L0043","section":"Module catalog","text":"kept on general: {…}","placement":"placed","file":"modules/hall-ui/public/modules.js","line":207,"string_id":"cf5047ea06d8"},
|
|
1937
|
+
{"key":"L0044","section":"Module catalog","text":"A testing project gets each new version of its modules before everyone else, and what it finds feeds the module's score. It is never switched on for you. To keep one module on the versions everyone gets, open its details.","placement":"placed","file":"modules/hall-ui/public/modules.html","line":85,"string_id":"c68c7532aa78"},
|
|
1938
|
+
{"key":"L0045","section":"Module catalog","text":"In the store","placement":"placed","file":"modules/hall-ui/public/modules.html","line":94,"string_id":"ecfebcd52894"},
|
|
1939
|
+
{"key":"L0046","section":"Module catalog","text":"Sort by","placement":"placed","file":"modules/hall-ui/public/modules.html","line":98,"string_id":"70383b194ec0"},
|
|
1940
|
+
{"key":"L0047","section":"Module catalog","text":"Name","placement":"unplaced"},
|
|
1941
|
+
{"key":"L0048","section":"Module catalog","text":"No store module matches that {…}.","placement":"unplaced","state":"search-empty"},
|
|
1942
|
+
{"key":"L0049","section":"Module catalog","text":"scores","placement":"unplaced","occurrences":2},
|
|
1943
|
+
{"key":"L0050","section":"Module catalog","text":"strong at {…}","placement":"placed","file":"modules/hall-ui/public/modules.js","line":340,"string_id":"e294c3429c2e","occurrences":3},
|
|
1944
|
+
{"key":"L0051","section":"Module catalog","text":"weak at {…}","placement":"placed","file":"modules/hall-ui/public/modules.js","line":342,"string_id":"20318b6da94e"},
|
|
1945
|
+
{"key":"L0052","section":"Module catalog","text":"A part is strong at 80 out of 100 or more, and weak below the listing floor. A part with no data yet is not counted against a module. Sort by a part to see the modules strongest at it first; a module with no score for that part goes last, and a new module is never ranked.","placement":"placed","file":"modules/hall-ui/public/modules.html","line":101,"string_id":"e395cd11edab"},
|
|
1946
|
+
{"key":"L0053","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":520,"string_id":"1883ad7f07fc"},
|
|
1947
|
+
{"key":"L0054","section":"Module catalog","text":"Builders hall · this session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":810,"string_id":"fd1903586e8e"},
|
|
1948
|
+
{"key":"L0055","section":"What are you doing now?","text":"What are you doing now?","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":811,"string_id":"60853319f290"},
|
|
1949
|
+
{"key":"L0056","section":"What are you doing now?","text":"Pick one. You can switch any time from the top bar.","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":812,"string_id":"4f87d5b17b54"},
|
|
1950
|
+
{"key":"L0057","section":"What are you doing now?","text":"Building","placement":"unplaced"},
|
|
1951
|
+
{"key":"L0058","section":"What are you doing now?","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","occurrences":3},
|
|
1952
|
+
{"key":"L0059","section":"What are you doing now?","text":"Artistry","placement":"unplaced"},
|
|
1953
|
+
{"key":"L0060","section":"What are you doing now?","text":"Ideating","placement":"unplaced"},
|
|
1954
|
+
{"key":"L0061","section":"What are you doing now?","text":"Turn thoughts into {…}.","placement":"unplaced"},
|
|
1955
|
+
{"key":"L0062","section":"What are you doing now?","text":"Ask me again next session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":815,"string_id":"fa86bf403775"}
|
|
1951
1956
|
]
|
|
1952
1957
|
},
|
|
1953
1958
|
{
|
|
@@ -2486,8 +2491,8 @@
|
|
|
2486
2491
|
"surface": "builders",
|
|
2487
2492
|
"title": "Profile",
|
|
2488
2493
|
"states_read": ["own","works","activity","activity-artist","activity-ideator","other","artist","ideator","out"],
|
|
2489
|
-
"files_hash": "
|
|
2490
|
-
"reading_hash": "
|
|
2494
|
+
"files_hash": "d278d0e01b7e8d72",
|
|
2495
|
+
"reading_hash": "8088d60a4e93bb91",
|
|
2491
2496
|
"counts": {"lines":196,"placed":70,"shared":8,"unplaced":118},
|
|
2492
2497
|
"omitted": {"data":197},
|
|
2493
2498
|
"notes": [],
|
|
@@ -2511,52 +2516,52 @@
|
|
|
2511
2516
|
{"key":"L0017","section":"profile","text":"Member since {…}","placement":"placed","file":"modules/hall-ui/public/profile.js","line":118,"string_id":"df335a1224ae","state":"ideator","occurrences":3},
|
|
2512
2517
|
{"key":"L0018","section":"profile","text":"Ideator, {…} role","placement":"unplaced","state":"ideator"},
|
|
2513
2518
|
{"key":"L0019","section":"profile","text":"Artist, {…} role","placement":"unplaced","state":"artist"},
|
|
2514
|
-
{"key":"L0020","section":"
|
|
2515
|
-
{"key":"L0021","section":"
|
|
2516
|
-
{"key":"L0022","section":"
|
|
2517
|
-
{"key":"L0023","section":"
|
|
2518
|
-
{"key":"L0024","section":"
|
|
2519
|
-
{"key":"L0025","section":"
|
|
2520
|
-
{"key":"L0026","section":"
|
|
2521
|
-
{"key":"L0027","section":"
|
|
2522
|
-
{"key":"L0028","section":"
|
|
2523
|
-
{"key":"L0029","section":"
|
|
2524
|
-
{"key":"L0030","section":"
|
|
2525
|
-
{"key":"L0031","section":"
|
|
2526
|
-
{"key":"L0032","section":"
|
|
2527
|
-
{"key":"L0033","section":"
|
|
2528
|
-
{"key":"L0034","section":"
|
|
2529
|
-
{"key":"L0035","section":"
|
|
2530
|
-
{"key":"L0036","section":"
|
|
2531
|
-
{"key":"L0037","section":"
|
|
2532
|
-
{"key":"L0038","section":"
|
|
2533
|
-
{"key":"L0039","section":"
|
|
2534
|
-
{"key":"L0040","section":"
|
|
2535
|
-
{"key":"L0041","section":"
|
|
2536
|
-
{"key":"L0042","section":"
|
|
2537
|
-
{"key":"L0043","section":"
|
|
2538
|
-
{"key":"L0044","section":"
|
|
2539
|
-
{"key":"L0045","section":"
|
|
2540
|
-
{"key":"L0046","section":"
|
|
2541
|
-
{"key":"L0047","section":"
|
|
2542
|
-
{"key":"L0048","section":"
|
|
2543
|
-
{"key":"L0049","section":"
|
|
2544
|
-
{"key":"L0050","section":"
|
|
2545
|
-
{"key":"L0051","section":"
|
|
2546
|
-
{"key":"L0052","section":"
|
|
2547
|
-
{"key":"L0053","section":"
|
|
2548
|
-
{"key":"L0054","section":"
|
|
2549
|
-
{"key":"L0055","section":"
|
|
2550
|
-
{"key":"L0056","section":"
|
|
2551
|
-
{"key":"L0057","section":"
|
|
2552
|
-
{"key":"L0058","section":"
|
|
2553
|
-
{"key":"L0059","section":"
|
|
2554
|
-
{"key":"L0060","section":"
|
|
2555
|
-
{"key":"L0061","section":"
|
|
2556
|
-
{"key":"L0062","section":"
|
|
2557
|
-
{"key":"L0063","section":"
|
|
2519
|
+
{"key":"L0020","section":"Your Bongoing.","text":"Your Bongoing.","placement":"placed","file":"modules/hall-ui/public/profile.html","line":138,"string_id":"4565c5611294","state":"activity"},
|
|
2520
|
+
{"key":"L0021","section":"Your Bongoing.","text":"What this builder has done, seen one role at a time.","placement":"placed","file":"modules/hall-ui/public/profile.html","line":139,"string_id":"a444ad812e4f","state":"activity"},
|
|
2521
|
+
{"key":"L0022","section":"Your Bongoing.","text":"Artist","placement":"unplaced","state":"activity-artist"},
|
|
2522
|
+
{"key":"L0023","section":"Your Bongoing.","text":"Ideator","placement":"unplaced","state":"activity"},
|
|
2523
|
+
{"key":"L0024","section":"Your Bongoing.","text":"{…} file{…}","placement":"placed","file":"modules/hall-ui/public/gate.js","line":151,"string_id":"3efa67dc6e07","state":"activity-ideator","occurrences":3},
|
|
2524
|
+
{"key":"L0025","section":"Your Bongoing.","text":"Aug","placement":"unplaced","state":"activity-ideator"},
|
|
2525
|
+
{"key":"L0026","section":"Your Bongoing.","text":"Sep","placement":"unplaced","state":"activity-ideator"},
|
|
2526
|
+
{"key":"L0027","section":"Your Bongoing.","text":"burning","placement":"unplaced","state":"activity-ideator","occurrences":6},
|
|
2527
|
+
{"key":"L0028","section":"Your Bongoing.","text":"waiting","placement":"placed","file":"modules/hall-ui/public/work.js","line":420,"string_id":"8186b562553a","state":"activity-ideator","occurrences":3},
|
|
2528
|
+
{"key":"L0029","section":"Your Bongoing.","text":"folded in","placement":"unplaced","state":"activity-ideator","occurrences":2},
|
|
2529
|
+
{"key":"L0030","section":"Your Bongoing.","text":"burned out","placement":"unplaced","state":"activity-ideator","occurrences":2},
|
|
2530
|
+
{"key":"L0031","section":"Your Bongoing.","text":"declined","placement":"unplaced","state":"activity-ideator","occurrences":2},
|
|
2531
|
+
{"key":"L0032","section":"Your Bongoing.","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","state":"activity-ideator","occurrences":6},
|
|
2532
|
+
{"key":"L0033","section":"Your Bongoing.","text":"Thought","placement":"unplaced","state":"activity-ideator"},
|
|
2533
|
+
{"key":"L0034","section":"Your Bongoing.","text":"State","placement":"unplaced","state":"activity-ideator"},
|
|
2534
|
+
{"key":"L0035","section":"Your Bongoing.","text":"Size","placement":"unplaced","state":"activity-ideator"},
|
|
2535
|
+
{"key":"L0036","section":"Your Bongoing.","text":"Still alive","placement":"unplaced","state":"activity-ideator"},
|
|
2536
|
+
{"key":"L0037","section":"Your Bongoing.","text":"64 cr","placement":"unplaced","state":"activity-ideator"},
|
|
2537
|
+
{"key":"L0038","section":"Your Bongoing.","text":"Became a {…}","placement":"unplaced","state":"activity-ideator","occurrences":6},
|
|
2538
|
+
{"key":"L0039","section":"Your Bongoing.","text":"Earned 64 {…} so far","placement":"unplaced","state":"activity-ideator"},
|
|
2539
|
+
{"key":"L0040","section":"Your Bongoing.","text":"42 cr","placement":"unplaced","state":"activity-ideator"},
|
|
2540
|
+
{"key":"L0041","section":"Your Bongoing.","text":"Earned 42 {…} so far","placement":"unplaced","state":"activity-ideator"},
|
|
2541
|
+
{"key":"L0042","section":"Your Bongoing.","text":"no size","placement":"placed","file":"modules/hall-ui/public/profile-crafts.js","line":156,"string_id":"8769ce8ea030","state":"activity-ideator","occurrences":4},
|
|
2542
|
+
{"key":"L0043","section":"Your Bongoing.","text":"Still open","placement":"placed","file":"modules/hall-ui/public/profile.js","line":568,"string_id":"efe530c0e3a7","state":"activity-ideator","occurrences":2},
|
|
2543
|
+
{"key":"L0044","section":"Your Bongoing.","text":"18 cr","placement":"unplaced","state":"activity-ideator"},
|
|
2544
|
+
{"key":"L0045","section":"Your Bongoing.","text":"Earned 18 {…} so far","placement":"unplaced","state":"activity-ideator"},
|
|
2545
|
+
{"key":"L0046","section":"Your Bongoing.","text":"22 cr","placement":"unplaced","state":"activity-ideator"},
|
|
2546
|
+
{"key":"L0047","section":"Your Bongoing.","text":"Merged into","placement":"placed","file":"modules/hall-ui/public/profile.js","line":563,"string_id":"c7a670e9552d","state":"activity-ideator"},
|
|
2547
|
+
{"key":"L0048","section":"Your Bongoing.","text":"Discarded","placement":"unplaced","state":"activity-ideator"},
|
|
2548
|
+
{"key":"L0049","section":"Your Bongoing.","text":"26 cr","placement":"unplaced","state":"activity-ideator"},
|
|
2549
|
+
{"key":"L0050","section":"Your Bongoing.","text":"Earned 26 {…} so far","placement":"unplaced","state":"activity-ideator"},
|
|
2550
|
+
{"key":"L0051","section":"Your Bongoing.","text":"10 cr","placement":"unplaced","state":"activity-ideator"},
|
|
2551
|
+
{"key":"L0052","section":"Your Bongoing.","text":"Earned 10 {…} so far","placement":"unplaced","state":"activity-ideator"},
|
|
2552
|
+
{"key":"L0053","section":"Your Bongoing.","text":"Per page","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":74,"string_id":"4a46b478edaf","state":"activity-ideator"},
|
|
2553
|
+
{"key":"L0054","section":"Your Bongoing.","text":"‹ Prev","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":74,"string_id":"de8fa5223aee","state":"activity-ideator"},
|
|
2554
|
+
{"key":"L0055","section":"Your Bongoing.","text":"Page {…} of {…}","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":112,"string_id":"15a49bf15007","state":"activity-ideator"},
|
|
2555
|
+
{"key":"L0056","section":"Your Bongoing.","text":"Next ›","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":74,"string_id":"f52ba261d930","state":"activity-ideator"},
|
|
2556
|
+
{"key":"L0057","section":"Your Bongoing.","text":"~ marks a size that includes a historical estimate.","placement":"unplaced","state":"activity-ideator"},
|
|
2557
|
+
{"key":"L0058","section":"Your Bongoing.","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","state":"activity-artist"},
|
|
2558
|
+
{"key":"L0059","section":"Your Bongoing.","text":"{…} · approved {…}","placement":"unplaced","state":"activity-artist","occurrences":4},
|
|
2559
|
+
{"key":"L0060","section":"Your Bongoing.","text":"{…} {…} changed","placement":"placed","file":"modules/hall-ui/public/profile-crafts.js","line":218,"string_id":"2f75f69cdb2f","state":"activity-artist","occurrences":4},
|
|
2560
|
+
{"key":"L0061","section":"Your Bongoing.","text":"before","placement":"unplaced","state":"activity-artist","occurrences":4},
|
|
2561
|
+
{"key":"L0062","section":"Your Bongoing.","text":"{…} project{…}","placement":"placed","file":"modules/hall-ui/public/fleet.js","line":39,"string_id":"771bef3d31b5","state":"activity-artist","occurrences":3},
|
|
2562
|
+
{"key":"L0063","section":"Your Bongoing.","text":"after","placement":"unplaced","state":"activity-artist","occurrences":4},
|
|
2558
2563
|
{"key":"L0064","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":520,"string_id":"1883ad7f07fc","state":"activity-artist","occurrences":4},
|
|
2559
|
-
{"key":"L0065","section":"
|
|
2564
|
+
{"key":"L0065","section":"Your Bongoing.","text":"Builders hall · this session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":810,"string_id":"fd1903586e8e","state":"activity-artist"},
|
|
2560
2565
|
{"key":"L0066","section":"Works completed","text":"Works completed","placement":"placed","file":"modules/hall-ui/public/profile.html","line":149,"string_id":"0e6b8e8f26cc","state":"activity"},
|
|
2561
2566
|
{"key":"L0067","section":"Works completed","text":"Role","placement":"unplaced","state":"activity"},
|
|
2562
2567
|
{"key":"L0068","section":"Works completed","text":"Shipped","placement":"placed","file":"modules/hall-ui/public/task.js","line":677,"string_id":"0c0a50ba1666","state":"activity"},
|
|
@@ -4139,8 +4144,8 @@
|
|
|
4139
4144
|
"surface": "builders",
|
|
4140
4145
|
"title": "Studio",
|
|
4141
4146
|
"states_read": ["home","out","flow","flow-pick","status","words-offer","words-edit","reviews","full","full-back","approvals","approvals-before","approvals-phone","approvals-note","approved","sent-back"],
|
|
4142
|
-
"files_hash": "
|
|
4143
|
-
"reading_hash": "
|
|
4147
|
+
"files_hash": "f42a86b0e9a89704",
|
|
4148
|
+
"reading_hash": "55e9090fdd96a979",
|
|
4144
4149
|
"counts": {"lines":30,"placed":16,"shared":6,"unplaced":8},
|
|
4145
4150
|
"omitted": {"data":4},
|
|
4146
4151
|
"notes": ["flow: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","flow-pick: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","status: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","words-offer: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","words-edit: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","reviews: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","full: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","full-back: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","approvals: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","approvals-before: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","approvals-phone: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","approvals-note: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","approved: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","sent-back: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood"],
|
|
@@ -4161,7 +4166,7 @@
|
|
|
4161
4166
|
{"key":"L0014","section":"Good evening.","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","occurrences":2},
|
|
4162
4167
|
{"key":"L0015","section":"Good evening.","text":"Tweak/CopyWrite Flow","placement":"placed","file":"modules/hall-ui/public/studio.html","line":123,"string_id":"18801fb6845f"},
|
|
4163
4168
|
{"key":"L0016","section":"Good evening.","text":"next up: {…} — {…}","placement":"unplaced"},
|
|
4164
|
-
{"key":"L0017","section":"Good evening.","text":"Approval queue","placement":"placed","file":"modules/hall-ui/public/studio.html","line":127,"string_id":"
|
|
4169
|
+
{"key":"L0017","section":"Good evening.","text":"Copy-write Approval queue","placement":"placed","file":"modules/hall-ui/public/studio.html","line":127,"string_id":"f770588750ef"},
|
|
4165
4170
|
{"key":"L0018","section":"Good evening.","text":"2 pages applied, waiting for you","placement":"unplaced"},
|
|
4166
4171
|
{"key":"L0019","section":"Good evening.","text":"Artist Review Status","placement":"placed","file":"modules/hall-ui/public/studio.html","line":131,"string_id":"4d3b1bcae3eb"},
|
|
4167
4172
|
{"key":"L0020","section":"Good evening.","text":"From the live site","placement":"placed","file":"modules/hall-ui/public/studio.html","line":137,"string_id":"edced5d528c3"},
|
|
@@ -223,7 +223,7 @@ const PERMISSIONS = [
|
|
|
223
223
|
{ key: 'goal.create', system: false, floor: 'metic', guards: 'POST /goals (protected scope → Archon in-handler; ADR 0086)' },
|
|
224
224
|
{ key: 'goal.archive', system: false, floor: 'metic', guards: 'POST /goals/:id/{archive,reopen}' },
|
|
225
225
|
{ key: 'goal.scope.widen', system: false, floor: 'metic', guards: 'POST /goals/:id/scope (same-tier; cross-tier = goal.scope.manage, system)' },
|
|
226
|
-
{ key: 'module.enable', system: false, floor: 'metic', guards: 'POST /modules/:key/enable' },
|
|
226
|
+
{ key: 'module.enable', system: false, floor: 'metic', guards: 'POST /modules/:key/enable, POST /modules/testing and POST /modules/:key/general-only (whether this project tests new module versions first, and which modules it keeps on general — task 1003802, ADR 0344 D1)' },
|
|
227
227
|
{ key: 'module.submit', system: false, floor: 'metic', guards: 'POST /modules/:key/submit, GET /modules/submissions' },
|
|
228
228
|
// Re-run a store version's automatic assessment (task 1003796, ADR 0359). Never a
|
|
229
229
|
// hand-set score: the owner ruled a person may ask for a re-check, not change the number.
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
w('home-standing', 'Standing', 18,
|
|
84
84
|
'<h2 id="home-standing-h" class="scroll__h">Standing</h2>' +
|
|
85
85
|
'<div id="home-standing-body"><div class="profile__placeholder">…</div></div>' +
|
|
86
|
-
'<p class="card-foot"><a href="#standing">
|
|
86
|
+
'<p class="card-foot"><a href="#standing">See your Full Account. →</a></p>',
|
|
87
87
|
{ view: 'home', zone: 'home-band', labelledby: 'home-standing-h', hiddenByDefault: true });
|
|
88
88
|
|
|
89
89
|
// (Goals — goals.js registers itself into the other half of the Home band.)
|
|
@@ -74,6 +74,17 @@
|
|
|
74
74
|
<p class="ov-foot" id="submit-lede">A module built here can be submitted upstream for review, so it can join the shared catalog with your name and this project credited.</p>
|
|
75
75
|
</div>
|
|
76
76
|
|
|
77
|
+
<!-- Testing new versions (task 1003802, ADR 0344 D1): the PROJECT opts in,
|
|
78
|
+
once, by its admin; a module can be kept on general versions from its
|
|
79
|
+
own details. Hidden until GET /modules/testing answers. -->
|
|
80
|
+
<div class="ov-group" id="testing-group" hidden>
|
|
81
|
+
<div class="ov-group__head">
|
|
82
|
+
<span class="ov-group__name">Testing new versions</span>
|
|
83
|
+
</div>
|
|
84
|
+
<ul class="ov-rows" id="testing-grid"></ul>
|
|
85
|
+
<p class="ov-foot" id="testing-lede">A testing project gets each new version of its modules before everyone else, and what it finds feeds the module's score. It is never switched on for you. To keep one module on the versions everyone gets, open its details.</p>
|
|
86
|
+
</div>
|
|
87
|
+
|
|
77
88
|
<!-- In the store — what GET /store/modules lists, each with what it is
|
|
78
89
|
strong and weak at (task 1003799, ADR 0343 D4), so two modules with
|
|
79
90
|
the same score can be told apart. Hidden until the store answers
|
|
@@ -171,9 +171,108 @@
|
|
|
171
171
|
if (mt.removeAfter) line('removable after core', `<span class="ov-mono">${escapeHtml(String(mt.removeAfter))}</span>`);
|
|
172
172
|
if (mt.note) line('note', escapeHtml(String(mt.note)));
|
|
173
173
|
if (m.default != null) line('ships', m.default ? 'default on' : 'default off');
|
|
174
|
+
const versions = testingLine(m);
|
|
175
|
+
if (versions) line('new versions', versions);
|
|
174
176
|
return lines.length ? `<ul class="ov-lines">${lines.join('')}</ul>` : '';
|
|
175
177
|
}
|
|
176
178
|
|
|
179
|
+
// ---- testing new versions (task 1003802, ADR 0344 D1) ----
|
|
180
|
+
//
|
|
181
|
+
// GET /modules/testing says whether this project tests new versions first and
|
|
182
|
+
// which modules it keeps on general. The server owns the answer; the page shows
|
|
183
|
+
// it and sends the two switches, which take the same permission as the
|
|
184
|
+
// enable toggle (canToggle mirrors it, the server decides).
|
|
185
|
+
let testing = null;
|
|
186
|
+
|
|
187
|
+
function generalOnly(key) {
|
|
188
|
+
return !!(testing && Array.isArray(testing.general_only) && testing.general_only.includes(key));
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// One module's line in its details: only while the project is testing.
|
|
192
|
+
function testingLine(m) {
|
|
193
|
+
if (!testing || !testing.tester) return '';
|
|
194
|
+
const kept = generalOnly(m.key);
|
|
195
|
+
const says = kept ? 'kept on the versions everyone gets' : 'gets new versions first';
|
|
196
|
+
if (!canToggle) return escapeHtml(says);
|
|
197
|
+
return `${escapeHtml(says)} <button type="button" class="btn-ghost btn--sm mod-general-only" data-key="${escapeHtml(m.key)}" data-on="${kept ? 'false' : 'true'}">${kept ? 'test new versions' : 'keep on general versions'}</button>`;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function testingRowHTML() {
|
|
201
|
+
const on = !!testing.tester;
|
|
202
|
+
const kept = (testing.general_only || [])
|
|
203
|
+
.map((k) => (allModules.find((m) => m.key === k) || {}).title || k);
|
|
204
|
+
const facts = [on
|
|
205
|
+
? '<span class="fact-pill fact-pill--info">testing</span>'
|
|
206
|
+
: '<span class="ov-fact">not testing</span>'];
|
|
207
|
+
if (on && kept.length) facts.push(`<span class="ov-fact">kept on general: ${kept.map((t) => escapeHtml(t)).join(', ')}</span>`);
|
|
208
|
+
const control = canToggle
|
|
209
|
+
? `<button type="button" class="ov-toggle mod-testing" aria-pressed="${on ? 'true' : 'false'}">${on ? 'on' : 'off'}</button>`
|
|
210
|
+
: `<span class="fact-pill ${on ? 'fact-pill--ok' : ''}" title="${escapeHtml(floor())} and above can switch this">${on ? 'on' : 'off'}</span>`;
|
|
211
|
+
return `
|
|
212
|
+
<li class="ov-row mod-row" data-key="testing">
|
|
213
|
+
<div class="ov-row__main">
|
|
214
|
+
<span class="ov-row__title">This project tests new versions first</span>
|
|
215
|
+
<div class="ov-row__facts">${facts.join('')}</div>
|
|
216
|
+
</div>
|
|
217
|
+
<div class="ov-row__right mod-row__right">${control}</div>
|
|
218
|
+
</li>`;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function renderTesting() {
|
|
222
|
+
const group = $('#testing-group');
|
|
223
|
+
const grid = $('#testing-grid');
|
|
224
|
+
if (!group || !grid || !testing) return;
|
|
225
|
+
group.hidden = false;
|
|
226
|
+
grid.innerHTML = testingRowHTML();
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Best-effort, like the store: a switch that cannot be read hides its group
|
|
230
|
+
// and costs nothing else on the page.
|
|
231
|
+
async function loadTesting() {
|
|
232
|
+
try {
|
|
233
|
+
const res = await api.request('GET', `${API}/modules/testing`);
|
|
234
|
+
if (!res.ok) return;
|
|
235
|
+
testing = res.data || null;
|
|
236
|
+
renderTesting();
|
|
237
|
+
renderRows();
|
|
238
|
+
} catch (err) {
|
|
239
|
+
console.error('[modules] testing switch failed to load', err);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
async function postTesting(url, body, btn) {
|
|
244
|
+
btn.disabled = true;
|
|
245
|
+
try {
|
|
246
|
+
const res = await api.request('POST', url, { body });
|
|
247
|
+
const out = res.data || {};
|
|
248
|
+
if (!res.ok) throw new Error(out.message || `testing → ${res.status}`);
|
|
249
|
+
testing = { tester: !!out.tester, general_only: out.general_only || [] };
|
|
250
|
+
renderTesting();
|
|
251
|
+
renderRows();
|
|
252
|
+
return out;
|
|
253
|
+
} catch (err) {
|
|
254
|
+
console.error('[modules] testing change failed', err);
|
|
255
|
+
toast(err.message || 'Could not change that.', { duration: 3200 });
|
|
256
|
+
return null;
|
|
257
|
+
} finally {
|
|
258
|
+
btn.disabled = false;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
async function onTesterToggle(btn) {
|
|
263
|
+
const next = btn.getAttribute('aria-pressed') !== 'true';
|
|
264
|
+
const out = await postTesting(`${API}/modules/testing`, { tester: next }, btn);
|
|
265
|
+
if (out) toast(out.note || (next ? 'Testing is on.' : 'Testing is off.'), { duration: 4200 });
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
async function onGeneralOnly(btn) {
|
|
269
|
+
const key = btn.dataset.key;
|
|
270
|
+
if (!key) return;
|
|
271
|
+
const on = btn.dataset.on === 'true';
|
|
272
|
+
const out = await postTesting(`${API}/modules/${encodeURIComponent(key)}/general-only`, { general_only: on }, btn);
|
|
273
|
+
if (out) toast(on ? `${key} stays on the versions everyone gets.` : `${key} gets new versions first again.`, { duration: 3200 });
|
|
274
|
+
}
|
|
275
|
+
|
|
177
276
|
// The right column: ONE control. The family's grant toggle when the viewer
|
|
178
277
|
// can flip it (enabled in ink, disabled faint, the accent on hover); the
|
|
179
278
|
// state as a pill when they cannot. A module built here also carries its
|
|
@@ -386,6 +485,10 @@
|
|
|
386
485
|
panel.addEventListener('click', (ev) => {
|
|
387
486
|
const toggle = ev.target.closest('.mod-toggle');
|
|
388
487
|
if (toggle) { onToggle(toggle); return; }
|
|
488
|
+
const tester = ev.target.closest('.mod-testing');
|
|
489
|
+
if (tester) { onTesterToggle(tester); return; }
|
|
490
|
+
const keep = ev.target.closest('.mod-general-only');
|
|
491
|
+
if (keep) { onGeneralOnly(keep); return; }
|
|
389
492
|
const submit = ev.target.closest('.mod-submit');
|
|
390
493
|
if (submit) onSubmit(submit);
|
|
391
494
|
});
|
|
@@ -481,6 +584,7 @@
|
|
|
481
584
|
if (res.status === 401) { window.location.assign(`${API}/auth/web/start`); return; }
|
|
482
585
|
if (!res.ok) throw new Error(`modules → ${res.status}`);
|
|
483
586
|
render(res.data);
|
|
587
|
+
loadTesting();
|
|
484
588
|
loadStore();
|
|
485
589
|
} catch (err) {
|
|
486
590
|
console.error('[modules] failed to load', err);
|
|
@@ -135,7 +135,7 @@
|
|
|
135
135
|
the ideator view) every idea they filed with what became of it.
|
|
136
136
|
All three ledgers page server-side; profile.js fills them. -->
|
|
137
137
|
<section class="scroll" id="activity-scroll" aria-labelledby="activity-h" data-group="activity">
|
|
138
|
-
<h2 id="activity-h" class="scroll__h">
|
|
138
|
+
<h2 id="activity-h" class="scroll__h">Your Bongoing.</h2>
|
|
139
139
|
<p class="scroll__lede" id="activity-lede">What this builder has done, seen one role at a time.</p>
|
|
140
140
|
<div id="activity-tabs"></div>
|
|
141
141
|
<div id="activity-body">
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
<span class="st-action__detail" id="st-flow-detail">the next page to tweak</span>
|
|
125
125
|
</button>
|
|
126
126
|
<button type="button" class="st-action" id="studio-approvals" data-approvals aria-haspopup="dialog">
|
|
127
|
-
<span class="st-action__label">Approval queue</span>
|
|
127
|
+
<span class="st-action__label">Copy-write Approval queue</span>
|
|
128
128
|
<span class="st-action__detail" id="studio-approvals-detail">the pages /tweak has applied</span>
|
|
129
129
|
</button>
|
|
130
130
|
<button type="button" class="st-action" id="st-status" aria-haspopup="dialog">
|
|
@@ -14,3 +14,5 @@ Also gone, and the one rule in that list: `.ab-caption` takes the lede's `--meas
|
|
|
14
14
|
**The store's modules are a third group on the same panel, read as strengths and weaknesses (task 1003799, ADR 0343 D4).** `#store-group` ("In the store") lists what `GET /store/modules` lists, hidden until that read answers with something; it loads after the modules on disk and best-effort, so a store that cannot be read costs this group and nothing else. A row is the same `.ov-row`: the overall score as a plain fact (or the `new` info pill), `strong at Tests 96, How-to 88` as a plain fact, and `weak at …` as the warn pill, because a weakness is the exception a buyer must not miss. The sentence behind each part ("Tests scored 96 out of 100, from 40 test cases.") and the parts with no data yet sit in the row's `<details class="mod-more">`, the `splitCriterion` idea: short label in the list, the detail one click away. The reading is the server's (`readParts` in `src/bongos/module-listing.js`: strong at 80 or more, weak below the listing floor, unmeasured never weak); the page re-derives nothing. Harness fixture: `store__modules.json`.
|
|
15
15
|
|
|
16
16
|
**The buyer sorts the store by the part that matters to them (task 1003800, owner decision 2026-10-22).** A "Sort by" menu sits in the store group's head (`#store-sort`, `.ov-group__note`): Name, then the parts the server lists in `sort_parts`. Picking one re-reads `GET /store/modules?sort=<part>`, and the server orders the listed modules (`sortByPart` in `src/bongos/module-listing.js`: highest for that part first, a tie to the overall score then the key, a module with no score for the part last). The page never sorts the rows itself, and New modules keep name order because they are never ranked. While a part is picked, each listed row carries that part's score as a plain fact (`Reliability 91`, or `Reliability not measured yet`), so the order explains itself. The owner chose the buyer over a per-category "key part" because nothing records what a category is for, and a hidden weighting would break the score an author can check (ADR 0343 D3).
|
|
17
|
+
|
|
18
|
+
**Testing new versions is a fourth group, between this project's modules and the store (task 1003802, ADR 0344 D1).** `#testing-group` holds one `.ov-row`, "This project tests new versions first": a `testing` info pill (or the plain fact `not testing`), the modules kept on general as a plain fact, and on the right the family grant toggle (`.ov-toggle.mod-testing`) for a builder holding `module.enable`, a state pill for everyone else. It is hidden until `GET /modules/testing` answers and loads best-effort, like the store. The per-module control is not a second toggle on every row: while testing is on, each module's details gain a "new versions" line (`gets new versions first` / `kept on the versions everyone gets`) with a ghost button that flips it, so the one-control-per-row rule holds and a project that is not testing sees nothing new. The lede says it is never switched on for you, because the criterion turns on the tester having chosen it. Harness fixture: `modules__testing.json` (testing on, `economy` kept on general).
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.21.
|
|
3
|
+
"version": "1.21.157",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.21.
|
|
9
|
+
"version": "1.21.157",
|
|
10
10
|
"license": "AGPL-3.0-or-later",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"express": "^4.21.2",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.21.
|
|
3
|
+
"version": "1.21.157",
|
|
4
4
|
"description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"main": "src/platform-server.js",
|
package/release-notes.json
CHANGED
|
@@ -9956,5 +9956,25 @@
|
|
|
9956
9956
|
"id": "1004768",
|
|
9957
9957
|
"text": "A page rewrite can now include a long paragraph. Before, any paragraph over 400 characters was dropped from the site's text list, so the privacy page's changes could not be applied."
|
|
9958
9958
|
}
|
|
9959
|
+
],
|
|
9960
|
+
"1.21.156": [
|
|
9961
|
+
{
|
|
9962
|
+
"id": "1004725",
|
|
9963
|
+
"text": "The hall home's standing card link now carries the artist's new wording, ready for the artist to approve before it goes live."
|
|
9964
|
+
},
|
|
9965
|
+
{
|
|
9966
|
+
"id": "1004688",
|
|
9967
|
+
"text": "The profile page's activity heading now carries the artist's new wording, ready for the artist to approve before it goes live."
|
|
9968
|
+
},
|
|
9969
|
+
{
|
|
9970
|
+
"id": "1004387",
|
|
9971
|
+
"text": "The Studio's approval-queue button now carries the artist's new label, ready for the artist to approve before it goes live."
|
|
9972
|
+
}
|
|
9973
|
+
],
|
|
9974
|
+
"1.21.157": [
|
|
9975
|
+
{
|
|
9976
|
+
"id": "1003802",
|
|
9977
|
+
"text": "A project can now volunteer to try new versions of its modules before everyone else, and keep any single module on the normal versions."
|
|
9978
|
+
}
|
|
9959
9979
|
]
|
|
9960
9980
|
}
|