@bongos/core 1.21.154 → 1.21.155
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 +16 -16
- package/docs/copy-inventory.md +18 -5
- package/docs/copy-registry.json +122 -5
- package/docs/module-api-changelog.md +2 -0
- package/modules/lifecycle/criterion-uat.js +7 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +10 -0
- package/scripts/gds/copy-inventory.js +7 -3
- package/src/module-api.js +1 -1
- package/tests/copy_inventory.mjs +21 -5
- package/tests/criterion_uat.mjs +19 -0
package/.bongos-core.json
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.21.
|
|
6
|
-
"core_contract": "1.21.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.21.155",
|
|
6
|
+
"core_contract": "1.21.155",
|
|
7
|
+
"source_commit": "52dca2e93875584dd158bf10e45f5ada2e514f5d",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-10-
|
|
9
|
+
"built_at": "2026-10-22T15:30:40.144Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 608,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 3808,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "20b6a1ac82282fb2440342571c00fa8e0d05ceedf5a7e5a18f18b477e8aa50d0",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -2412,12 +2412,12 @@
|
|
|
2412
2412
|
{
|
|
2413
2413
|
"path": "docs/copy-inventory.md",
|
|
2414
2414
|
"mode": "0000644",
|
|
2415
|
-
"sha256": "
|
|
2415
|
+
"sha256": "7af2be903aaae34204963c5bb83ee7cefa31b85569ee46def97749519f08cc86"
|
|
2416
2416
|
},
|
|
2417
2417
|
{
|
|
2418
2418
|
"path": "docs/copy-registry.json",
|
|
2419
2419
|
"mode": "0000644",
|
|
2420
|
-
"sha256": "
|
|
2420
|
+
"sha256": "df33993ea06f5d5cee24402e3768c17ac2cec08252dcc0e25a058a4bf2eeb1eb"
|
|
2421
2421
|
},
|
|
2422
2422
|
{
|
|
2423
2423
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2927,7 +2927,7 @@
|
|
|
2927
2927
|
{
|
|
2928
2928
|
"path": "docs/module-api-changelog.md",
|
|
2929
2929
|
"mode": "0000644",
|
|
2930
|
-
"sha256": "
|
|
2930
|
+
"sha256": "1e26586f1e872e4c3717b12d21c62b2412d41152b89259a7629e1eb62e2dc827"
|
|
2931
2931
|
},
|
|
2932
2932
|
{
|
|
2933
2933
|
"path": "docs/modules-contract.md",
|
|
@@ -7187,7 +7187,7 @@
|
|
|
7187
7187
|
{
|
|
7188
7188
|
"path": "modules/lifecycle/criterion-uat.js",
|
|
7189
7189
|
"mode": "0000644",
|
|
7190
|
-
"sha256": "
|
|
7190
|
+
"sha256": "096c77513ded2056c09d40c7743d1a0e0f4e1e01c16f9f3cb5da80b897489433"
|
|
7191
7191
|
},
|
|
7192
7192
|
{
|
|
7193
7193
|
"path": "modules/lifecycle/db-analytics.js",
|
|
@@ -10557,12 +10557,12 @@
|
|
|
10557
10557
|
{
|
|
10558
10558
|
"path": "package-lock.json",
|
|
10559
10559
|
"mode": "0000644",
|
|
10560
|
-
"sha256": "
|
|
10560
|
+
"sha256": "33f1d7e3960bd0b4954fdece29a8c35764e99f00fbd57d701b44d5f652b3fa9c"
|
|
10561
10561
|
},
|
|
10562
10562
|
{
|
|
10563
10563
|
"path": "package.json",
|
|
10564
10564
|
"mode": "0000644",
|
|
10565
|
-
"sha256": "
|
|
10565
|
+
"sha256": "7143a612dd45e63e65244c8d5f56f1a253f9dbb392c07f1965d4a2d02ebc315d"
|
|
10566
10566
|
},
|
|
10567
10567
|
{
|
|
10568
10568
|
"path": "public-docs/index.html",
|
|
@@ -10582,7 +10582,7 @@
|
|
|
10582
10582
|
{
|
|
10583
10583
|
"path": "release-notes.json",
|
|
10584
10584
|
"mode": "0000644",
|
|
10585
|
-
"sha256": "
|
|
10585
|
+
"sha256": "9117c7df1bc5d28ae11e4a99b168949db3684bb4eb08d5f1c328bbe5ee461786"
|
|
10586
10586
|
},
|
|
10587
10587
|
{
|
|
10588
10588
|
"path": "scripts/cron/style_guide_audit.sh",
|
|
@@ -10957,7 +10957,7 @@
|
|
|
10957
10957
|
{
|
|
10958
10958
|
"path": "scripts/gds/copy-inventory.js",
|
|
10959
10959
|
"mode": "0000644",
|
|
10960
|
-
"sha256": "
|
|
10960
|
+
"sha256": "18e08203b33af87b4d5e7d52e76fed2b5c6c8838c15a4f644d7b0b4b686a14d1"
|
|
10961
10961
|
},
|
|
10962
10962
|
{
|
|
10963
10963
|
"path": "scripts/gds/core-origin-follow.js",
|
|
@@ -12962,7 +12962,7 @@
|
|
|
12962
12962
|
{
|
|
12963
12963
|
"path": "src/module-api.js",
|
|
12964
12964
|
"mode": "0000644",
|
|
12965
|
-
"sha256": "
|
|
12965
|
+
"sha256": "d36ae4917f2bb33204869e2ea14e9dc383dde6347bd881b147b6c13fd76730b0"
|
|
12966
12966
|
},
|
|
12967
12967
|
{
|
|
12968
12968
|
"path": "src/module-loader/catalog.js",
|
|
@@ -13962,7 +13962,7 @@
|
|
|
13962
13962
|
{
|
|
13963
13963
|
"path": "tests/copy_inventory.mjs",
|
|
13964
13964
|
"mode": "0000644",
|
|
13965
|
-
"sha256": "
|
|
13965
|
+
"sha256": "d62fb2e59647d14586851bd1c14c215fb2f086cfcf06f33fa763e9d2eec86f47"
|
|
13966
13966
|
},
|
|
13967
13967
|
{
|
|
13968
13968
|
"path": "tests/core_258_box_session_claims_db.mjs",
|
|
@@ -14137,7 +14137,7 @@
|
|
|
14137
14137
|
{
|
|
14138
14138
|
"path": "tests/criterion_uat.mjs",
|
|
14139
14139
|
"mode": "0000644",
|
|
14140
|
-
"sha256": "
|
|
14140
|
+
"sha256": "c1c906829e7a3b572a8f751dd658a6fa91bf34d21529c1a9ffb36d6ab459267c"
|
|
14141
14141
|
},
|
|
14142
14142
|
{
|
|
14143
14143
|
"path": "tests/criterion_uat_routes.mjs",
|
package/docs/copy-inventory.md
CHANGED
|
@@ -4,15 +4,15 @@
|
|
|
4
4
|
> Deterministic on a given tree — regenerate and commit rather than hand-editing.
|
|
5
5
|
> Machine-readable twin: [`copy-registry.json`](copy-registry.json).
|
|
6
6
|
|
|
7
|
-
**
|
|
7
|
+
**2784 strings** across 3 surfaces · 2363 distinct pieces of copy · 2784 certain, 0 heuristic · 241 shown in more than one place.
|
|
8
8
|
|
|
9
9
|
## Surfaces
|
|
10
10
|
|
|
11
11
|
| surface | lives at | files | strings |
|
|
12
12
|
|---|---|---|---|
|
|
13
|
-
| `builders-hall` | `modules/hall-ui/public` | 148 |
|
|
13
|
+
| `builders-hall` | `modules/hall-ui/public` | 148 | 1964 |
|
|
14
14
|
| `status-dashboard` | `modules/status-ui/public` | 4 | 100 |
|
|
15
|
-
| `landing` | `modules/public-landing/public` | 9 |
|
|
15
|
+
| `landing` | `modules/public-landing/public` | 9 | 720 |
|
|
16
16
|
|
|
17
17
|
## Confidence, and why it is on every row
|
|
18
18
|
|
|
@@ -78,7 +78,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
78
78
|
| `8226c979db4d` | 3x | Not now | modules/hall-ui/public/collab.js:668, modules/hall-ui/public/paintbrush.js:119, modules/hall-ui/public/paintbrush.js:183 |
|
|
79
79
|
| … | | _201 more in the JSON registry_ | |
|
|
80
80
|
|
|
81
|
-
## `builders-hall` —
|
|
81
|
+
## `builders-hall` — 1964 strings
|
|
82
82
|
|
|
83
83
|
| id | conf | text | where |
|
|
84
84
|
|---|---|---|---|
|
|
@@ -1456,6 +1456,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1456
1456
|
| `7a29c910cc5b` | certain | Tweak {…} — {…} | `modules/hall-ui/public/tweak-editor.js:286` |
|
|
1457
1457
|
| `18801fb6845f` | certain | Tweak/CopyWrite Flow | `modules/hall-ui/public/studio.html:123` |
|
|
1458
1458
|
| `18801fb6845f` | certain | Tweak/CopyWrite Flow | `modules/hall-ui/public/studio.html:153` |
|
|
1459
|
+
| `2850b51235fd` | certain | Two different bills, one column each. The first is what a project costs this platform. The second is an estima | `modules/hall-ui/public/fleet.html:39` |
|
|
1459
1460
|
| `4a25dba3ef56` | certain | Type it yourself | `modules/hall-ui/public/commands-lib.js:93` |
|
|
1460
1461
|
| `4a25dba3ef56` | certain | Type it yourself | `modules/hall-ui/public/commands.html:37` |
|
|
1461
1462
|
| `348507a25334` | certain | Type these in a Claude Code session on this project. Most also start when you simply say what you want in plai | `modules/hall-ui/public/commands.html:34` |
|
|
@@ -2151,7 +2152,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
2151
2152
|
| `7667eb552781` | certain | {…}: {…}% ({…}/{…} checks) | `modules/status-ui/public/status.js:468` |
|
|
2152
2153
|
| `6d0d64f10bd9` | certain | ‹ earlier page | `modules/status-ui/public/index.html:321` |
|
|
2153
2154
|
|
|
2154
|
-
## `landing` —
|
|
2155
|
+
## `landing` — 720 strings
|
|
2155
2156
|
|
|
2156
2157
|
| id | conf | text | where |
|
|
2157
2158
|
|---|---|---|---|
|
|
@@ -2194,6 +2195,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
2194
2195
|
| `d7e8b03c25ce` | certain | A note (optional): how you know each other. | `modules/public-landing/public/connections.html:166` |
|
|
2195
2196
|
| `c209b53693c0` | certain | A note for the owner (optional) — what you’d like to work on, who you are. | `modules/public-landing/public/invitations.html:175` |
|
|
2196
2197
|
| `407982c3d4ff` | certain | A project as a codebase, regardless of function. | `modules/public-landing/public/index.html:779` |
|
|
2198
|
+
| `437ddce8e760` | certain | A project is a record here and a database of its own. The record holds its name, the GitHub repository it ship | `modules/public-landing/public/privacy.html:108` |
|
|
2197
2199
|
| `c3504a900b0f` | certain | A project stood up from the hub runs on the platform's servers at your request. Any cost is shown before you c | `modules/public-landing/public/terms.html:111` |
|
|
2198
2200
|
| `6cb796f01882` | certain | A project you create | `modules/public-landing/public/privacy.html:107` |
|
|
2199
2201
|
| `167a256eeca5` | certain | A repo I already have | `modules/public-landing/public/projects.html:1731` |
|
|
@@ -2294,6 +2296,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
2294
2296
|
| `d919980d2ca5` | certain | Download our core code and protocols, and build instantly with your team. | `modules/public-landing/public/index.html:879` |
|
|
2295
2297
|
| `41c49e22002d` | certain | Download the CLI | `modules/public-landing/public/index.html:912` |
|
|
2296
2298
|
| `18b6b56edc93` | certain | Each sign-in creates a session: a random token, whether it came from the browser or the command line, the brow | `modules/public-landing/public/privacy.html:104` |
|
|
2299
|
+
| `032693d19430` | certain | Each {{productName}} project you build in reports a summary of your work there to the platform: the {{currency | `modules/public-landing/public/terms.html:116` |
|
|
2297
2300
|
| `9a4a940d2a56` | certain | Emersonian Circles | `modules/public-landing/public/index.html:768` |
|
|
2298
2301
|
| `9150fa905ba4` | certain | Enough for a small version. Trim it to one shared list, voting and a winner reveal; accounts and notifications | `modules/public-landing/public/projects.html:1580` |
|
|
2299
2302
|
| `05fed739a9e1` | certain | Enter Genesis | `modules/public-landing/public/projects.html:2129` |
|
|
@@ -2306,6 +2309,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
2306
2309
|
| `654dfc6855b5` | certain | Everything, for you | `modules/public-landing/public/projects.html:1970` |
|
|
2307
2310
|
| `1b5a6cfc494c` | certain | Example World | `modules/public-landing/public/index.html:758` |
|
|
2308
2311
|
| `70e3e447cf7c` | certain | Expert consulting | `modules/public-landing/public/projects.html:1987` |
|
|
2312
|
+
| `e14fd6120fc6` | certain | Extras are the optional parts a project can run — extra AI agents, a Discord mirror, and the rest. You picked | `modules/public-landing/public/projects.html:1334` |
|
|
2309
2313
|
| `7c8dcf228e70` | certain | Extras for this project | `modules/public-landing/public/projects.html:1864` |
|
|
2310
2314
|
| `2585087f4873` | certain | Fair use | `modules/public-landing/public/terms.html:123` |
|
|
2311
2315
|
| `b6a70459e3f7` | certain | Fill these in from my last project | `modules/public-landing/public/projects.html:1553` |
|
|
@@ -2342,6 +2346,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
2342
2346
|
| `97c0329fc07b` | certain | How much is run for you | `modules/public-landing/public/projects.html:1969` |
|
|
2343
2347
|
| `485c565b5745` | certain | How people join | `modules/public-landing/public/projects.html:1269` |
|
|
2344
2348
|
| `4b542b000afa` | certain | How this project is drawn: on the sky, in your list, at the top of this page and on its card. A planet is a | `modules/public-landing/public/projects.html:1402` |
|
|
2349
|
+
| `5a2650d439ce` | certain | How this project is listed — the kind shown beside its name on the map, in the table and on its card. It is a | `modules/public-landing/public/projects.html:1314` |
|
|
2345
2350
|
| `a86a02b0ded9` | certain | How your project’s own hall looks: its colours in light and dark mode, whether its dark mode takes a tint of y | `modules/public-landing/public/projects.html:1432` |
|
|
2346
2351
|
| `23febbbd53e2` | certain | I can sign for this project, and I accept the | `modules/public-landing/public/projects.html:2043` |
|
|
2347
2352
|
| `9f31eaed8252` | certain | If you grant repository access while creating a project, that permission is used to create or adopt your repos | `modules/public-landing/public/privacy.html:105` |
|
|
@@ -2606,7 +2611,9 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
2606
2611
|
| `e37a1cf49d98` | certain | The builders you know, across every project. A connection is a way to find each other again; it grants no rank | `modules/public-landing/public/connections.html:113` |
|
|
2607
2612
|
| `183c89fecb58` | certain | The code is open | `modules/public-landing/public/privacy.html:124` |
|
|
2608
2613
|
| `a954f0dce9a3` | certain | The platform | `modules/public-landing/public/contact.html:115` |
|
|
2614
|
+
| `82d751a27370` | certain | The platform first gives this project its own read-only deploy key and switches its deploys over to it, and on | `modules/public-landing/public/projects.html:1242` |
|
|
2609
2615
|
| `4fd8f5746cc5` | certain | The platform is run as a non-profit, capture-resistant commons. | `modules/public-landing/public/terms.html:100` |
|
|
2616
|
+
| `768a6990ebfc` | certain | The platform stores the date you accepted these terms, and which version, on your account. It is written when | `modules/public-landing/public/terms.html:120` |
|
|
2610
2617
|
| `20fcebaa85c4` | certain | The project hub needs JavaScript — the map, your projects, and starting a new one all live here. You can read | `modules/public-landing/public/projects.html:873` |
|
|
2611
2618
|
| `4a740b5afe73` | certain | The project map | `modules/public-landing/public/projects.html:883` |
|
|
2612
2619
|
| `d4e91fc9e8ce` | certain | The projects you build on, and leaving one, are on your account page. | `modules/public-landing/public/projects.html:1075` |
|
|
@@ -2624,6 +2631,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
2624
2631
|
| `e6c859147ba4` | certain | This cannot be undone. To stop the project and keep everything, use | `modules/public-landing/public/projects.html:1467` |
|
|
2625
2632
|
| `b5ec30734473` | certain | This can’t be built | `modules/public-landing/public/projects.html:1693` |
|
|
2626
2633
|
| `886326f70c38` | certain | This guild is public, and you’re a member who isn’t on its public page. Nobody is listed there until they say | `modules/public-landing/public/guild.html:202` |
|
|
2634
|
+
| `a1aa7835abce` | certain | This is a list of which variables your project needs and what each one is for — not the secrets themselves. Th | `modules/public-landing/public/projects.html:1349` |
|
|
2627
2635
|
| `d83b739afb1e` | certain | This is a project’s management page — it answers only to the person who owns it. Sign in with GitHub to open y | `modules/public-landing/public/projects.html:1111` |
|
|
2628
2636
|
| `637ca6a1649a` | certain | This project,{{productName}}has two environments a code & user one respectively (or a Repo & Builders hall) | `modules/public-landing/public/contact.html:97` |
|
|
2629
2637
|
| `11c244aec5c3` | certain | This statement describes the software as it ships and changes when the software does. Revised August 2026. | `modules/public-landing/public/privacy.html:126` |
|
|
@@ -2634,6 +2642,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
2634
2642
|
| `64e08f62d974` | certain | Try a demo. | `modules/public-landing/public/projects.html:1559` |
|
|
2635
2643
|
| `3672d2e5f619` | certain | Try a small demo instead | `modules/public-landing/public/projects.html:1546` |
|
|
2636
2644
|
| `b1dd149424ea` | certain | Turn the filter off to see what everyone else is building — or start your own. | `modules/public-landing/public/projects.html:909` |
|
|
2645
|
+
| `50f764cf1229` | certain | Two things, and only two: a name — this project already has one — and a description of what it is. Modules, ar | `modules/public-landing/public/projects.html:1214` |
|
|
2637
2646
|
| `b0c3729108be` | certain | Type a country | `modules/public-landing/public/projects.html:1631` |
|
|
2638
2647
|
| `a165999f36a9` | certain | Types of projects | `modules/public-landing/public/index.html:877` |
|
|
2639
2648
|
| `2f740afee113` | certain | US and EU | `modules/public-landing/public/projects.html:1655` |
|
|
@@ -2642,6 +2651,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
2642
2651
|
| `11416e2b83fa` | certain | Use these | `modules/public-landing/public/projects.html:1591` |
|
|
2643
2652
|
| `52e9981a4a49` | certain | Used once to create your app on your Render account, then thrown away — not kept, not even in this browser. A | `modules/public-landing/public/projects.html:1916` |
|
|
2644
2653
|
| `6e1001190059` | certain | VERRO LABS | `modules/public-landing/public/index.html:863` |
|
|
2654
|
+
| `f68a38de7e1b` | certain | Visitors who aren’t signed in meet a sign-in door instead of the project’s pages — its front page, its status | `modules/public-landing/public/projects.html:1258` |
|
|
2645
2655
|
| `3d6b0bf6c2db` | certain | Waiting on you | `modules/public-landing/public/invitations.html:145` |
|
|
2646
2656
|
| `5370dd2d0e62` | certain | Ways to get paid | `modules/public-landing/public/index.html:893` |
|
|
2647
2657
|
| `5361539434e0` | certain | We already have a legal entity | `modules/public-landing/public/projects.html:1667` |
|
|
@@ -2708,6 +2718,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
2708
2718
|
| `cfce77d01e59` | certain | Your code lives in your GitHub repository and stays yours. The platform holds a working copy on the project's | `modules/public-landing/public/terms.html:106` |
|
|
2709
2719
|
| `7ce5ac1d34d4` | certain | Your connections | `modules/public-landing/public/connections.html:144` |
|
|
2710
2720
|
| `cd008ecb2887` | certain | Your connections could not be read. Reload the page to try again. | `modules/public-landing/public/connections.html:130` |
|
|
2721
|
+
| `1e6d91f484e4` | certain | Your cross-project record is descriptive analytics and never authority. What you may do inside any project is | `modules/public-landing/public/terms.html:117` |
|
|
2711
2722
|
| `63535be9eb75` | certain | Your hybrid suite | `modules/public-landing/public/projects.html:1977` |
|
|
2712
2723
|
| `69d41637ccf0` | certain | Your idea | `modules/public-landing/public/projects.html:1577` |
|
|
2713
2724
|
| `acebb426377e` | certain | Your legal entity | `modules/public-landing/public/projects.html:1669` |
|
|
@@ -2857,8 +2868,10 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
2857
2868
|
| `2609873e46a5` | certain | — Render needs one; the usual one is filled in | `modules/public-landing/public/projects.html:1940` |
|
|
2858
2869
|
| `5ee1b494eec3` | certain | — for signing in, and for the repositories your projects ship to. | `modules/public-landing/public/privacy.html:113` |
|
|
2859
2870
|
| `39b7e60d327e` | certain | — it is on the map under its name, but nobody joins on their own: people ask, and you decide. | `modules/public-landing/public/projects.html:1292` |
|
|
2871
|
+
| `a5319c33053a` | certain | — no one can apply: the project’s hall and its sign-in say so, and you invite people by GitHub username from t | `modules/public-landing/public/projects.html:1273` |
|
|
2860
2872
|
| `5becfcad07c3` | certain | — people ask from the project’s hall, you approve each one from the hall’s Watch page, and then they sign in. | `modules/public-landing/public/projects.html:1273` |
|
|
2861
2873
|
| `9ac56aa4e540` | certain | — projects hosted by the platform run on servers rented from DigitalOcean, with their web address and traffic | `modules/public-landing/public/privacy.html:115` |
|
|
2874
|
+
| `013f0e214b89` | certain | — the map shows only that something is there; its name, and everything else about it, stay yours, and nobody c | `modules/public-landing/public/projects.html:1292` |
|
|
2862
2875
|
| `b5bac008ba11` | certain | — the project is on the map under its name, and anyone who finds it can join. | `modules/public-landing/public/projects.html:1292` |
|
|
2863
2876
|
| `728661ec4c4a` | certain | — when a shipped task is graded, the change it made (the code diff) is sent to the model the grader runs on, A | `modules/public-landing/public/privacy.html:114` |
|
|
2864
2877
|
| `ff1318762145` | certain | — whoever signs in with GitHub becomes a member at once, at the newcomer rank. | `modules/public-landing/public/projects.html:1273` |
|
package/docs/copy-registry.json
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
"generator": "scripts/gds/copy-inventory.js",
|
|
4
4
|
"goal": 1000074,
|
|
5
5
|
"counts": {
|
|
6
|
-
"strings":
|
|
7
|
-
"unique_ids":
|
|
8
|
-
"certain":
|
|
6
|
+
"strings": 2784,
|
|
7
|
+
"unique_ids": 2363,
|
|
8
|
+
"certain": 2784,
|
|
9
9
|
"heuristic": 0,
|
|
10
10
|
"duplicate_ids": 241
|
|
11
11
|
},
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"builders-hall": {
|
|
14
14
|
"at": "modules/hall-ui/public",
|
|
15
15
|
"files": 148,
|
|
16
|
-
"strings":
|
|
16
|
+
"strings": 1964
|
|
17
17
|
},
|
|
18
18
|
"status-dashboard": {
|
|
19
19
|
"at": "modules/status-ui/public",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"landing": {
|
|
24
24
|
"at": "modules/public-landing/public",
|
|
25
25
|
"files": 9,
|
|
26
|
-
"strings":
|
|
26
|
+
"strings": 720
|
|
27
27
|
}
|
|
28
28
|
},
|
|
29
29
|
"blind_spots": [
|
|
@@ -14996,6 +14996,15 @@
|
|
|
14996
14996
|
"origin": "html-text",
|
|
14997
14997
|
"confidence": "certain"
|
|
14998
14998
|
},
|
|
14999
|
+
{
|
|
15000
|
+
"id": "2850b51235fd",
|
|
15001
|
+
"surface": "builders-hall",
|
|
15002
|
+
"text": "Two different bills, one column each. The first is what a project costs this platform. The second is an estimate of what its owner pays their own hosting provider, which bills them directly. A project with no recorded plan reads \"not priced yet\", never $0, and is left out of the total. A self-hosted project runs on its owner's own machine, so its bill is not visible to us.",
|
|
15003
|
+
"file": "modules/hall-ui/public/fleet.html",
|
|
15004
|
+
"line": 39,
|
|
15005
|
+
"origin": "html-text",
|
|
15006
|
+
"confidence": "certain"
|
|
15007
|
+
},
|
|
14999
15008
|
{
|
|
15000
15009
|
"id": "4a25dba3ef56",
|
|
15001
15010
|
"surface": "builders-hall",
|
|
@@ -20648,6 +20657,15 @@
|
|
|
20648
20657
|
"origin": "html-text",
|
|
20649
20658
|
"confidence": "certain"
|
|
20650
20659
|
},
|
|
20660
|
+
{
|
|
20661
|
+
"id": "437ddce8e760",
|
|
20662
|
+
"surface": "landing",
|
|
20663
|
+
"text": "A project is a record here and a database of its own. The record holds its name, the GitHub repository it ships to, its web address, how it is hosted, who owns it, when it was created, what state it is in, and its settings — who can see it and how people join. The project's own database holds the same kinds of records as above for the people who build on it: accounts, sessions, tasks, grades, {{currency}}.",
|
|
20664
|
+
"file": "modules/public-landing/public/privacy.html",
|
|
20665
|
+
"line": 108,
|
|
20666
|
+
"origin": "html-text",
|
|
20667
|
+
"confidence": "certain"
|
|
20668
|
+
},
|
|
20651
20669
|
{
|
|
20652
20670
|
"id": "c3504a900b0f",
|
|
20653
20671
|
"surface": "landing",
|
|
@@ -21548,6 +21566,15 @@
|
|
|
21548
21566
|
"origin": "html-text",
|
|
21549
21567
|
"confidence": "certain"
|
|
21550
21568
|
},
|
|
21569
|
+
{
|
|
21570
|
+
"id": "032693d19430",
|
|
21571
|
+
"surface": "landing",
|
|
21572
|
+
"text": "Each {{productName}} project you build in reports a summary of your work there to the platform: the {{currency}} you earned, the works you shipped, your karma, the rank that project gave you, the roles you worked in, and when you were last active. The platform adds these up across every project into one cross-project record. Projects report this themselves — the platform does not read their databases.",
|
|
21573
|
+
"file": "modules/public-landing/public/terms.html",
|
|
21574
|
+
"line": 116,
|
|
21575
|
+
"origin": "html-text",
|
|
21576
|
+
"confidence": "certain"
|
|
21577
|
+
},
|
|
21551
21578
|
{
|
|
21552
21579
|
"id": "9a4a940d2a56",
|
|
21553
21580
|
"surface": "landing",
|
|
@@ -21656,6 +21683,15 @@
|
|
|
21656
21683
|
"origin": "html-text",
|
|
21657
21684
|
"confidence": "certain"
|
|
21658
21685
|
},
|
|
21686
|
+
{
|
|
21687
|
+
"id": "e14fd6120fc6",
|
|
21688
|
+
"surface": "landing",
|
|
21689
|
+
"text": "Extras are the optional parts a project can run — extra AI agents, a Discord mirror, and the rest. You picked a set when you created the project, or took the suggested set by skipping that step; this is where you change your mind. Switching one on or off saves straight away and changes nothing that is already running: nothing restarts, and no work is lost either way. The parts every project runs — the platform itself, the way it tracks work, the builders’ hall — were never part of the choice, so they are not listed here and cannot be switched off.",
|
|
21690
|
+
"file": "modules/public-landing/public/projects.html",
|
|
21691
|
+
"line": 1334,
|
|
21692
|
+
"origin": "html-text",
|
|
21693
|
+
"confidence": "certain"
|
|
21694
|
+
},
|
|
21659
21695
|
{
|
|
21660
21696
|
"id": "7c8dcf228e70",
|
|
21661
21697
|
"surface": "landing",
|
|
@@ -21980,6 +22016,15 @@
|
|
|
21980
22016
|
"origin": "html-text",
|
|
21981
22017
|
"confidence": "certain"
|
|
21982
22018
|
},
|
|
22019
|
+
{
|
|
22020
|
+
"id": "5a2650d439ce",
|
|
22021
|
+
"surface": "landing",
|
|
22022
|
+
"text": "How this project is listed — the kind shown beside its name on the map, in the table and on its card. It is a declaration about the project, not a setting the project obeys: nothing is pushed to it and nothing restarts. One thing does follow the kind: if you never picked your extras yourself, they are the set this kind suggests, so changing the kind changes them too — you will be told when that happens. Extras you picked for yourself are stored and never move. Not Sure is a real answer, and it is the way back if you would rather not say.",
|
|
22023
|
+
"file": "modules/public-landing/public/projects.html",
|
|
22024
|
+
"line": 1314,
|
|
22025
|
+
"origin": "html-text",
|
|
22026
|
+
"confidence": "certain"
|
|
22027
|
+
},
|
|
21983
22028
|
{
|
|
21984
22029
|
"id": "a86a02b0ded9",
|
|
21985
22030
|
"surface": "landing",
|
|
@@ -24356,6 +24401,15 @@
|
|
|
24356
24401
|
"origin": "html-text",
|
|
24357
24402
|
"confidence": "certain"
|
|
24358
24403
|
},
|
|
24404
|
+
{
|
|
24405
|
+
"id": "82d751a27370",
|
|
24406
|
+
"surface": "landing",
|
|
24407
|
+
"text": "The platform first gives this project its own read-only deploy key and switches its deploys over to it, and only then makes the repository private — in that order, so no deploy ever tries to read a private repository with a key that can’t. The change is made with your connected GitHub account, so that account needs admin rights on the repository. It works for a project on a Cloud host; a project on your own host is yours to change on GitHub directly. You can make it public again from here at any time.",
|
|
24408
|
+
"file": "modules/public-landing/public/projects.html",
|
|
24409
|
+
"line": 1242,
|
|
24410
|
+
"origin": "html-text",
|
|
24411
|
+
"confidence": "certain"
|
|
24412
|
+
},
|
|
24359
24413
|
{
|
|
24360
24414
|
"id": "4fd8f5746cc5",
|
|
24361
24415
|
"surface": "landing",
|
|
@@ -24365,6 +24419,15 @@
|
|
|
24365
24419
|
"origin": "html-text",
|
|
24366
24420
|
"confidence": "certain"
|
|
24367
24421
|
},
|
|
24422
|
+
{
|
|
24423
|
+
"id": "768a6990ebfc",
|
|
24424
|
+
"surface": "landing",
|
|
24425
|
+
"text": "The platform stores the date you accepted these terms, and which version, on your account. It is written when you sign in to a project in your browser with your platform account, and only once — signing in again does not change the date you accepted. Signing in from the command line does not record it: you approve that sign-in on GitHub’s page, where these terms are not shown, so an account that has only signed in that way stays unpublished until you sign in to a project in your browser once. This is version",
|
|
24426
|
+
"file": "modules/public-landing/public/terms.html",
|
|
24427
|
+
"line": 120,
|
|
24428
|
+
"origin": "html-text",
|
|
24429
|
+
"confidence": "certain"
|
|
24430
|
+
},
|
|
24368
24431
|
{
|
|
24369
24432
|
"id": "20fcebaa85c4",
|
|
24370
24433
|
"surface": "landing",
|
|
@@ -24518,6 +24581,15 @@
|
|
|
24518
24581
|
"origin": "html-text",
|
|
24519
24582
|
"confidence": "certain"
|
|
24520
24583
|
},
|
|
24584
|
+
{
|
|
24585
|
+
"id": "a1aa7835abce",
|
|
24586
|
+
"surface": "landing",
|
|
24587
|
+
"text": "This is a list of which variables your project needs and what each one is for — not the secrets themselves. The values belong wherever your project actually runs (Vercel, Netlify, Render, or your own machine): that is where the running app reads them, and it already keeps them encrypted, logs who touched them and lets you rotate them. Keeping a second copy here would make this platform the keeper of your credentials and buy you nothing.",
|
|
24588
|
+
"file": "modules/public-landing/public/projects.html",
|
|
24589
|
+
"line": 1349,
|
|
24590
|
+
"origin": "html-text",
|
|
24591
|
+
"confidence": "certain"
|
|
24592
|
+
},
|
|
24521
24593
|
{
|
|
24522
24594
|
"id": "d83b739afb1e",
|
|
24523
24595
|
"surface": "landing",
|
|
@@ -24608,6 +24680,15 @@
|
|
|
24608
24680
|
"origin": "html-text",
|
|
24609
24681
|
"confidence": "certain"
|
|
24610
24682
|
},
|
|
24683
|
+
{
|
|
24684
|
+
"id": "50f764cf1229",
|
|
24685
|
+
"surface": "landing",
|
|
24686
|
+
"text": "Two things, and only two: a name — this project already has one — and a description of what it is. Modules, artwork, a finished setup interview: none of them are required, because the bar is there to keep empty shells off the map, not to make you finish anything. Until it is met the project is not listed publicly and nobody can ask to join it; the project itself runs exactly the same either way. Adding a description puts it on the map, and clearing one takes it back off.",
|
|
24687
|
+
"file": "modules/public-landing/public/projects.html",
|
|
24688
|
+
"line": 1214,
|
|
24689
|
+
"origin": "html-text",
|
|
24690
|
+
"confidence": "certain"
|
|
24691
|
+
},
|
|
24611
24692
|
{
|
|
24612
24693
|
"id": "b0c3729108be",
|
|
24613
24694
|
"surface": "landing",
|
|
@@ -24680,6 +24761,15 @@
|
|
|
24680
24761
|
"origin": "html-text",
|
|
24681
24762
|
"confidence": "certain"
|
|
24682
24763
|
},
|
|
24764
|
+
{
|
|
24765
|
+
"id": "f68a38de7e1b",
|
|
24766
|
+
"surface": "landing",
|
|
24767
|
+
"text": "Visitors who aren’t signed in meet a sign-in door instead of the project’s pages — its front page, its status page, and its hall. The door itself stays open, so members can always get in, and members see everything either way. It is separate from the repository’s visibility above: the code on GitHub is its own setting. Changing it restarts the project to pick it up — the line under the choice says what the project is running right now.",
|
|
24768
|
+
"file": "modules/public-landing/public/projects.html",
|
|
24769
|
+
"line": 1258,
|
|
24770
|
+
"origin": "html-text",
|
|
24771
|
+
"confidence": "certain"
|
|
24772
|
+
},
|
|
24683
24773
|
{
|
|
24684
24774
|
"id": "3d6b0bf6c2db",
|
|
24685
24775
|
"surface": "landing",
|
|
@@ -25274,6 +25364,15 @@
|
|
|
25274
25364
|
"origin": "html-text",
|
|
25275
25365
|
"confidence": "certain"
|
|
25276
25366
|
},
|
|
25367
|
+
{
|
|
25368
|
+
"id": "1e6d91f484e4",
|
|
25369
|
+
"surface": "landing",
|
|
25370
|
+
"text": "Your cross-project record is descriptive analytics and never authority. What you may do inside any project is decided by that project alone, from its own records, at the moment you ask. A large record grants nothing and a hidden one takes nothing away; no project is required to read it, and none may treat it as permission. A rank shown here is that project’s own standing for you, as that project reported it — the platform holds no rank of its own.",
|
|
25371
|
+
"file": "modules/public-landing/public/terms.html",
|
|
25372
|
+
"line": 117,
|
|
25373
|
+
"origin": "html-text",
|
|
25374
|
+
"confidence": "certain"
|
|
25375
|
+
},
|
|
25277
25376
|
{
|
|
25278
25377
|
"id": "63535be9eb75",
|
|
25279
25378
|
"surface": "landing",
|
|
@@ -26615,6 +26714,15 @@
|
|
|
26615
26714
|
"origin": "html-text",
|
|
26616
26715
|
"confidence": "certain"
|
|
26617
26716
|
},
|
|
26717
|
+
{
|
|
26718
|
+
"id": "a5319c33053a",
|
|
26719
|
+
"surface": "landing",
|
|
26720
|
+
"text": "— no one can apply: the project’s hall and its sign-in say so, and you invite people by GitHub username from the hall’s Watch page; only an invited person’s sign-in gets in — and people who asked before you switched stay in your queue, to approve or dismiss. Whichever you pick, people who are already members stay members. Changing it restarts the project to pick it up — the line under the choice says what the project is running right now.",
|
|
26721
|
+
"file": "modules/public-landing/public/projects.html",
|
|
26722
|
+
"line": 1273,
|
|
26723
|
+
"origin": "html-text",
|
|
26724
|
+
"confidence": "certain"
|
|
26725
|
+
},
|
|
26618
26726
|
{
|
|
26619
26727
|
"id": "5becfcad07c3",
|
|
26620
26728
|
"surface": "landing",
|
|
@@ -26633,6 +26741,15 @@
|
|
|
26633
26741
|
"origin": "html-text",
|
|
26634
26742
|
"confidence": "certain"
|
|
26635
26743
|
},
|
|
26744
|
+
{
|
|
26745
|
+
"id": "013f0e214b89",
|
|
26746
|
+
"surface": "landing",
|
|
26747
|
+
"text": "— the map shows only that something is there; its name, and everything else about it, stay yours, and nobody can ask to join. Switching to Stealth is itself visible: someone comparing the map before and after can tell which project went quiet. Whichever you pick, a project reaches the map only once it has a name and a description. This is separate from “Who can see it” above — that one is the door on the project’s own pages. Changing it restarts the project to pick it up.",
|
|
26748
|
+
"file": "modules/public-landing/public/projects.html",
|
|
26749
|
+
"line": 1292,
|
|
26750
|
+
"origin": "html-text",
|
|
26751
|
+
"confidence": "certain"
|
|
26752
|
+
},
|
|
26636
26753
|
{
|
|
26637
26754
|
"id": "b5bac008ba11",
|
|
26638
26755
|
"surface": "landing",
|
|
@@ -3145,5 +3145,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
3145
3145
|
landed since 1.21.152 with no explicit bump. run 39675693737. (task 1002620)
|
|
3146
3146
|
1.21.154 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3147
3147
|
landed since 1.21.153 with no explicit bump. run 39800316919. (task 1002620)
|
|
3148
|
+
1.21.155 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3149
|
+
landed since 1.21.154 with no explicit bump. run 39805364072. (task 1002620)
|
|
3148
3150
|
---------------------------------------------------------------------------
|
|
3149
3151
|
```
|
|
@@ -122,6 +122,12 @@ function foldLiveReadings(readings) {
|
|
|
122
122
|
|
|
123
123
|
// ── the sign-off refusal ladder ─────────────────────────────────────────────
|
|
124
124
|
|
|
125
|
+
// PAUSED (owner, 2026-10-22): the "someone else signs it off" rule below is off,
|
|
126
|
+
// so the person who shipped the work may sign off its UAT/review themselves.
|
|
127
|
+
// Delete this flag to restore the rule. UAT_SELF_SIGNOFF=off turns it back on
|
|
128
|
+
// (the tests do, so the paused rule stays proven while it waits).
|
|
129
|
+
const SELF_SIGNOFF_ALLOWED = process.env.UAT_SELF_SIGNOFF !== 'off';
|
|
130
|
+
|
|
125
131
|
// PURE — may this person sign this criterion off now? Returns null (allowed) or
|
|
126
132
|
// { code, status, message, ...detail }. The ORDER is the order a person would
|
|
127
133
|
// want to be told: is there anything to sign, is it the right kind of sign-off,
|
|
@@ -163,7 +169,7 @@ function signoffRefusal({ criterion, counts, remaining = [], backendOnly, kind,
|
|
|
163
169
|
}
|
|
164
170
|
const signer = String(signerId);
|
|
165
171
|
const isOwner = signerIsOwner === true || (ownerId != null && String(ownerId) === signer);
|
|
166
|
-
if (!isOwner && shipperIds.map(String).includes(signer)) {
|
|
172
|
+
if (!SELF_SIGNOFF_ALLOWED && !isOwner && shipperIds.map(String).includes(signer)) {
|
|
167
173
|
return { code: 'signer_shipped_this_work', status: 403, message: 'You shipped work linked to this criterion, so someone else has to sign it off. Any other reviewer, or the project owner, can.' };
|
|
168
174
|
}
|
|
169
175
|
if (kind === 'uat' && !recording) {
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.21.
|
|
3
|
+
"version": "1.21.155",
|
|
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.155",
|
|
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.155",
|
|
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
|
@@ -9946,5 +9946,15 @@
|
|
|
9946
9946
|
"id": "1003800",
|
|
9947
9947
|
"text": "In the module store, a buyer can now sort by the score that matters to them, like reliability or tests, so the module strongest at that comes first."
|
|
9948
9948
|
}
|
|
9949
|
+
],
|
|
9950
|
+
"1.21.155": [
|
|
9951
|
+
{
|
|
9952
|
+
"id": "1004769",
|
|
9953
|
+
"text": "The person who built something can now sign off its UAT themselves, not only the project owner. The old rule is paused, not deleted, so it can come back with one change."
|
|
9954
|
+
},
|
|
9955
|
+
{
|
|
9956
|
+
"id": "1004768",
|
|
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
|
+
}
|
|
9949
9959
|
]
|
|
9950
9960
|
}
|
|
@@ -66,7 +66,11 @@ const SURFACES = [
|
|
|
66
66
|
// Attributes whose value is COPY a person reads (not wiring). The matchers are
|
|
67
67
|
// built ONCE — the first cut re-created all seven per markup literal.
|
|
68
68
|
const COPY_ATTRS = ['title', 'aria-label', 'placeholder', 'alt', 'data-page-title', 'aria-description'];
|
|
69
|
-
|
|
69
|
+
// The longest string the registry lists. A page tweak may rewrite a paragraph
|
|
70
|
+
// past the old 400, and the applier then could not find its own words in the
|
|
71
|
+
// registry it regenerates (task 1004768, the privacy page's round).
|
|
72
|
+
const MAX_COPY_LEN = 2000;
|
|
73
|
+
const COPY_ATTR_RES = COPY_ATTRS.map((attr) => ({ attr, re: new RegExp(`\\b${attr}\\s*=\\s*"([^"]{4,${MAX_COPY_LEN}})"`, 'gi') }));
|
|
70
74
|
|
|
71
75
|
// What this tool knowingly does not see. Printed in the report — an inventory that
|
|
72
76
|
// implies completeness it does not have is worse than a short one.
|
|
@@ -125,7 +129,7 @@ function lineAt(starts, index) {
|
|
|
125
129
|
// by platform (task 1004545 — a 396-char run was 403 under CRLF and vanished).
|
|
126
130
|
function looksLikeCopy(raw) {
|
|
127
131
|
const s = String(raw).replace(/\r\n/g, '\n').trim();
|
|
128
|
-
if (s.length < 4 || s.length >
|
|
132
|
+
if (s.length < 4 || s.length > MAX_COPY_LEN) return false;
|
|
129
133
|
if (!/[A-Za-z]{2}/.test(s)) return false; // needs actual letters
|
|
130
134
|
if (!/\s/.test(s) && !/[.!?]$/.test(s)) return false; // one bare word is a token
|
|
131
135
|
if (/^[/.#]/.test(s)) return false; // paths, selectors
|
|
@@ -561,7 +565,7 @@ if (require.main === module) {
|
|
|
561
565
|
}
|
|
562
566
|
|
|
563
567
|
module.exports = {
|
|
564
|
-
SURFACES, COPY_ATTRS, BLIND_SPOTS, REGISTRY_REL, REPORT_REL,
|
|
568
|
+
SURFACES, COPY_ATTRS, BLIND_SPOTS, MAX_COPY_LEN, REGISTRY_REL, REPORT_REL,
|
|
565
569
|
cmp, stableId, looksLikeCopy, lineIndex, lineAt, stripEmbedded, fromHtml, fromJs, filesFor,
|
|
566
570
|
buildRegistry, renderReport, write, matchesGenerated,
|
|
567
571
|
};
|
package/src/module-api.js
CHANGED
|
@@ -75,7 +75,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
|
|
|
75
75
|
// MAJOR (see allowBoxScope below): passes the request through untouched.
|
|
76
76
|
function deprecatedNoopMiddleware(_req, _res, next) { next(); }
|
|
77
77
|
|
|
78
|
-
const CORE_VERSION = '1.21.
|
|
78
|
+
const CORE_VERSION = '1.21.155'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
79
79
|
|
|
80
80
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
81
81
|
// Usage: const log = api.logger('discord'); log.info('mounted');
|
package/tests/copy_inventory.mjs
CHANGED
|
@@ -103,15 +103,18 @@ test('stripEmbedded keeps line numbers truthful', () => {
|
|
|
103
103
|
// Windows regen dropped a row CI kept and redded "the committed artifacts match".
|
|
104
104
|
// The fixture rebuilds both halves: a tag inside a comment, and a run sized to
|
|
105
105
|
// straddle the cap.
|
|
106
|
-
//
|
|
107
|
-
|
|
106
|
+
// 45-char lines under a 28-char head, as many as fit under the cap on LF; each
|
|
107
|
+
// CRLF adds one, which pushes it over. Sized from MAX_COPY_LEN (task 1004768).
|
|
108
|
+
const NEAR_CAP_HEAD = 'A real sentence on the page,';
|
|
109
|
+
const NEAR_CAP_LINE = ` ${'word '.repeat(8)}s.`;
|
|
110
|
+
const NEAR_CAP_LINES = Array.from({ length: Math.floor((inv.MAX_COPY_LEN - NEAR_CAP_HEAD.length) / (NEAR_CAP_LINE.length + 1)) }, () => NEAR_CAP_LINE);
|
|
108
111
|
const EOL_FIXTURE = [
|
|
109
112
|
'<!doctype html>',
|
|
110
113
|
'<!-- Author note: a building is a door (an <a>) to its interior.',
|
|
111
114
|
' The template is street.css, the <style> on the tokens.',
|
|
112
115
|
'-->',
|
|
113
116
|
'<style>.x { color: red; }</style>',
|
|
114
|
-
|
|
117
|
+
`<p>${NEAR_CAP_HEAD}`,
|
|
115
118
|
...NEAR_CAP_LINES.slice(0, -1),
|
|
116
119
|
`${NEAR_CAP_LINES.at(-1)}</p>`,
|
|
117
120
|
'<p title="A tooltip a person reads">Second real line.</p>',
|
|
@@ -123,13 +126,26 @@ test('LF and CRLF checkouts extract identical rows (task 1004545)', () => {
|
|
|
123
126
|
const strip = (rows) => rows.map(({ text, line, origin }) => ({ text, line, origin }));
|
|
124
127
|
assert.deepEqual(strip(crlf), strip(lf), 'the registry must not depend on the checkout\'s line endings');
|
|
125
128
|
const run = EOL_FIXTURE.slice(EOL_FIXTURE.indexOf('A real'), EOL_FIXTURE.indexOf('</p>'));
|
|
126
|
-
assert.ok(run.length <=
|
|
129
|
+
assert.ok(run.length <= inv.MAX_COPY_LEN && run.replace(/\n/g, '\r\n').length > inv.MAX_COPY_LEN, 'the fixture must straddle the cap, or this test proves nothing');
|
|
127
130
|
// The multi-line sentence sits under the cap only when CRLF counts as one
|
|
128
131
|
// character — so this is the case that reds if the length rule regresses.
|
|
129
132
|
assert.ok(lf.some((r) => r.text.startsWith('A real sentence on the page')), 'a multi-line run under the cap is copy on LF');
|
|
130
133
|
assert.ok(crlf.some((r) => r.text.startsWith('A real sentence on the page')), 'and the same run is copy on CRLF');
|
|
131
134
|
});
|
|
132
135
|
|
|
136
|
+
// The privacy page's round rewrote one paragraph past 400 characters, and the
|
|
137
|
+
// registry dropped it, so the applier could not find its own words (task 1004768).
|
|
138
|
+
test('a long paragraph a page tweak writes is still listed', () => {
|
|
139
|
+
const para = `We keep only what we need to run your account. ${'Nothing else is stored or sold, and you can ask for it to be removed. '.repeat(14)}`.trim();
|
|
140
|
+
assert.ok(para.length > 1000 && para.length <= inv.MAX_COPY_LEN, 'the fixture must sit well past the old 400 cap');
|
|
141
|
+
const rows = inv.fromHtml({ source: `<p>${para}</p>\n<p title="${para}">x y</p>`, rel: 'p.html' });
|
|
142
|
+
assert.equal(rows.filter((r) => r.text === para).length, 2, 'listed as text and as an attribute');
|
|
143
|
+
const at = (n) => `${'ab '.repeat(n)}`.slice(0, n - 1) + '.';
|
|
144
|
+
assert.equal(at(inv.MAX_COPY_LEN).length, inv.MAX_COPY_LEN);
|
|
145
|
+
assert.equal(inv.looksLikeCopy(at(inv.MAX_COPY_LEN)), true, 'exactly at the cap is listed');
|
|
146
|
+
assert.equal(inv.looksLikeCopy(at(inv.MAX_COPY_LEN + 1)), false, 'one past the cap is refused');
|
|
147
|
+
});
|
|
148
|
+
|
|
133
149
|
test('HTML comments are never copy, and a tag named inside one swallows nothing', () => {
|
|
134
150
|
const rows = inv.fromHtml({ source: EOL_FIXTURE, rel: 'p.html' });
|
|
135
151
|
const texts = rows.map((r) => r.text);
|
|
@@ -140,7 +156,7 @@ test('HTML comments are never copy, and a tag named inside one swallows nothing'
|
|
|
140
156
|
assert.ok(texts.includes('Second real line.'));
|
|
141
157
|
assert.ok(texts.includes('A tooltip a person reads'));
|
|
142
158
|
const real = rows.find((r) => r.text === 'Second real line.');
|
|
143
|
-
assert.equal(real.line,
|
|
159
|
+
assert.equal(real.line, 7 + NEAR_CAP_LINES.length, 'a stripped comment must not shift the lines after it');
|
|
144
160
|
// A span still addresses the file's own characters (copy-apply writes through it).
|
|
145
161
|
assert.equal(EOL_FIXTURE.slice(real.start, real.end), 'Second real line.');
|
|
146
162
|
});
|
package/tests/criterion_uat.mjs
CHANGED
|
@@ -29,6 +29,8 @@ import { makeRunner } from './helpers.mjs';
|
|
|
29
29
|
|
|
30
30
|
process.env.NODE_ENV = 'test';
|
|
31
31
|
const require = createRequire(import.meta.url);
|
|
32
|
+
// The shipper rule is paused in production (owner, 2026-10-22); prove it still works.
|
|
33
|
+
process.env.UAT_SELF_SIGNOFF = 'off';
|
|
32
34
|
const uat = require('../modules/lifecycle/criterion-uat.js');
|
|
33
35
|
const uatDb = require('../modules/lifecycle/criterion-uat-db.js');
|
|
34
36
|
const doneWhen = require('../modules/lifecycle/done-when.js');
|
|
@@ -115,6 +117,23 @@ await test('LADDER: whoever shipped linked work is refused — ids compare as st
|
|
|
115
117
|
assert.equal(code({ signerId: '8' }), 'signer_shipped_this_work');
|
|
116
118
|
});
|
|
117
119
|
|
|
120
|
+
await test('PAUSE (task 1004769): at the production default a shipper is let through, and only the shipper rung moves', () => {
|
|
121
|
+
const modPath = require.resolve('../modules/lifecycle/criterion-uat.js');
|
|
122
|
+
delete process.env.UAT_SELF_SIGNOFF;
|
|
123
|
+
delete require.cache[modPath];
|
|
124
|
+
try {
|
|
125
|
+
const paused = require(modPath);
|
|
126
|
+
const pcode = (over) => { const r = paused.signoffRefusal({ ...base, ...over }); return r && r.code; };
|
|
127
|
+
assert.equal(pcode({ signerId: 7 }), null);
|
|
128
|
+
assert.equal(pcode({ signerId: '8' }), null);
|
|
129
|
+
assert.equal(pcode({ signerId: 7, recording: null }), 'uat_recording_required');
|
|
130
|
+
} finally {
|
|
131
|
+
process.env.UAT_SELF_SIGNOFF = 'off';
|
|
132
|
+
delete require.cache[modPath];
|
|
133
|
+
require(modPath);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
|
|
118
137
|
await test('LADDER: the project owner may sign off work they shipped (solo projects)', () => {
|
|
119
138
|
assert.equal(code({ signerId: 3, shipperIds: ['3'] }), null);
|
|
120
139
|
});
|