@bongos/core 1.19.903 → 1.19.904
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 +14 -14
- package/docs/copy-inventory.md +6 -7
- package/docs/copy-registry.json +9 -18
- package/docs/module-api-changelog.md +2 -0
- package/modules/hall-ui/public/collab-lib.js +22 -0
- package/modules/hall-ui/public/collab.js +17 -2
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/module-api.js +1 -1
- package/tests/collab_page.mjs +44 -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.19.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.904",
|
|
6
|
+
"core_contract": "1.19.904",
|
|
7
|
+
"source_commit": "a20b94f5efe38b09072d0456c5e352a2cf7bba1c",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-20T12:
|
|
9
|
+
"built_at": "2026-09-20T12:45:09.857Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 502,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 2806,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "e03f442cd778ef6dd35a6c2f47a07e0f4d7c72a8d86882256367239d4b87989b",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -2097,12 +2097,12 @@
|
|
|
2097
2097
|
{
|
|
2098
2098
|
"path": "docs/copy-inventory.md",
|
|
2099
2099
|
"mode": "0000644",
|
|
2100
|
-
"sha256": "
|
|
2100
|
+
"sha256": "3f1539c0050241b9dd7200170d664fc193c977958c2fee57e4bf5309591ccae6"
|
|
2101
2101
|
},
|
|
2102
2102
|
{
|
|
2103
2103
|
"path": "docs/copy-registry.json",
|
|
2104
2104
|
"mode": "0000644",
|
|
2105
|
-
"sha256": "
|
|
2105
|
+
"sha256": "1be015a58b02240690be5a2c5fcad56b42074500dcc7ebb8255ffa5156063748"
|
|
2106
2106
|
},
|
|
2107
2107
|
{
|
|
2108
2108
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2632,7 +2632,7 @@
|
|
|
2632
2632
|
{
|
|
2633
2633
|
"path": "docs/module-api-changelog.md",
|
|
2634
2634
|
"mode": "0000644",
|
|
2635
|
-
"sha256": "
|
|
2635
|
+
"sha256": "25f3aef34d52ca5c8a93b25fa0cd79aeba0e2395e2f66d2e192ca57464d71b65"
|
|
2636
2636
|
},
|
|
2637
2637
|
{
|
|
2638
2638
|
"path": "docs/modules-contract.md",
|
|
@@ -4647,7 +4647,7 @@
|
|
|
4647
4647
|
{
|
|
4648
4648
|
"path": "modules/hall-ui/public/collab-lib.js",
|
|
4649
4649
|
"mode": "0000644",
|
|
4650
|
-
"sha256": "
|
|
4650
|
+
"sha256": "bfadae8700cc22ea13f8bc39a3e2a1876b58da6151032e9a973402bc9bd0aaa7"
|
|
4651
4651
|
},
|
|
4652
4652
|
{
|
|
4653
4653
|
"path": "modules/hall-ui/public/collab.css",
|
|
@@ -4662,7 +4662,7 @@
|
|
|
4662
4662
|
{
|
|
4663
4663
|
"path": "modules/hall-ui/public/collab.js",
|
|
4664
4664
|
"mode": "0000644",
|
|
4665
|
-
"sha256": "
|
|
4665
|
+
"sha256": "91a0751cebcbc179f28ad1cac7a6c447f90369ae40f29e5f60c1bd934ac68f85"
|
|
4666
4666
|
},
|
|
4667
4667
|
{
|
|
4668
4668
|
"path": "modules/hall-ui/public/collab.states.json",
|
|
@@ -7762,12 +7762,12 @@
|
|
|
7762
7762
|
{
|
|
7763
7763
|
"path": "package-lock.json",
|
|
7764
7764
|
"mode": "0000644",
|
|
7765
|
-
"sha256": "
|
|
7765
|
+
"sha256": "f6623c9d73536e00c2c9a3d44dc68f3e8bdbe44e47543c32aaa22f3059efa410"
|
|
7766
7766
|
},
|
|
7767
7767
|
{
|
|
7768
7768
|
"path": "package.json",
|
|
7769
7769
|
"mode": "0000644",
|
|
7770
|
-
"sha256": "
|
|
7770
|
+
"sha256": "f092d5149aa7e2518d2ddd4b940e92c4d61f8c553afedd810d97752efa9a207e"
|
|
7771
7771
|
},
|
|
7772
7772
|
{
|
|
7773
7773
|
"path": "public-docs/index.html",
|
|
@@ -9762,7 +9762,7 @@
|
|
|
9762
9762
|
{
|
|
9763
9763
|
"path": "src/module-api.js",
|
|
9764
9764
|
"mode": "0000644",
|
|
9765
|
-
"sha256": "
|
|
9765
|
+
"sha256": "f15a6c9c7458ce744ffbe72c8997b25e0098a2a26b2f6f41e7e3513fc073110d"
|
|
9766
9766
|
},
|
|
9767
9767
|
{
|
|
9768
9768
|
"path": "src/module-loader/catalog.js",
|
|
@@ -10602,7 +10602,7 @@
|
|
|
10602
10602
|
{
|
|
10603
10603
|
"path": "tests/collab_page.mjs",
|
|
10604
10604
|
"mode": "0000644",
|
|
10605
|
-
"sha256": "
|
|
10605
|
+
"sha256": "b710669fabe9e747fe37abf429356e80c1f7a36cd63ac308dda2a933243e2e6d"
|
|
10606
10606
|
},
|
|
10607
10607
|
{
|
|
10608
10608
|
"path": "tests/compose_demo_credentials.mjs",
|
package/docs/copy-inventory.md
CHANGED
|
@@ -4,13 +4,13 @@
|
|
|
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
|
+
**1826 strings** across 3 surfaces · 1584 distinct pieces of copy · 1826 certain, 0 heuristic · 166 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` | 84 |
|
|
13
|
+
| `builders-hall` | `modules/hall-ui/public` | 84 | 1336 |
|
|
14
14
|
| `status-dashboard` | `modules/status-ui/public` | 4 | 100 |
|
|
15
15
|
| `landing` | `modules/public-landing/public` | 5 | 390 |
|
|
16
16
|
|
|
@@ -78,7 +78,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
78
78
|
| `996edffc1966` | 2x | Access requests | modules/hall-ui/public/watch.html:46, modules/hall-ui/public/watch.html:61 |
|
|
79
79
|
| … | | _126 more in the JSON registry_ | |
|
|
80
80
|
|
|
81
|
-
## `builders-hall` —
|
|
81
|
+
## `builders-hall` — 1336 strings
|
|
82
82
|
|
|
83
83
|
| id | conf | text | where |
|
|
84
84
|
|---|---|---|---|
|
|
@@ -135,7 +135,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
135
135
|
| `0b9adf029094` | certain | A task cannot wait for itself. | `modules/hall-ui/public/task.js:890` |
|
|
136
136
|
| `0aaa0f2c4bdc` | certain | A title is required. | `modules/hall-ui/public/blockers.js:345` |
|
|
137
137
|
| `daf73127afff` | certain | A word on why | `modules/hall-ui/public/hall-render.js:294` |
|
|
138
|
-
| `9fe51a2e1e71` | certain | A {…} — you are a {…}. Mingle pairs across roles. | `modules/hall-ui/public/collab.js:421` |
|
|
139
138
|
| `996edffc1966` | certain | Access requests | `modules/hall-ui/public/watch.html:46` |
|
|
140
139
|
| `996edffc1966` | certain | Access requests | `modules/hall-ui/public/watch.html:61` |
|
|
141
140
|
| `303f8d90266f` | certain | Achievements could not be loaded. | `modules/hall-ui/public/builders.js:1196` |
|
|
@@ -304,7 +303,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
304
303
|
| `90691bceaf68` | certain | Could not load | `modules/hall-ui/public/task.js:982` |
|
|
305
304
|
| `589a4cfc5442` | certain | Could not load idea {…}. | `modules/hall-ui/public/ideas.js:644` |
|
|
306
305
|
| `192c893fc64e` | certain | Could not load modules. | `modules/hall-ui/public/modules.js:318` |
|
|
307
|
-
| `
|
|
306
|
+
| `9912c3835136` | certain | Could not load requests — reload to try again. | `modules/hall-ui/public/collab.js:529` |
|
|
308
307
|
| `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:399` |
|
|
309
308
|
| `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:437` |
|
|
310
309
|
| `a2f2e8babef5` | certain | Could not load that page. Try again. | `modules/hall-ui/public/blockers.js:274` |
|
|
@@ -669,7 +668,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
669
668
|
| `c72e0bdb834a` | certain | Not declared in module.json — this is who ships the module. | `modules/hall-ui/public/modules.js:62` |
|
|
670
669
|
| `361b353ded5e` | certain | Not enough shipped work yet to chart. | `modules/hall-ui/public/hall-widgets.js:184` |
|
|
671
670
|
| `90230572d017` | certain | Not found | `modules/hall-ui/public/task.js:970` |
|
|
672
|
-
| `8226c979db4d` | certain | Not now | `modules/hall-ui/public/collab.js:
|
|
671
|
+
| `8226c979db4d` | certain | Not now | `modules/hall-ui/public/collab.js:435` |
|
|
673
672
|
| `5ffcdc1a0176` | certain | Not scored — this builder’s own profile waived every signal, or the session predates this measure. | `modules/hall-ui/public/sessions.js:100` |
|
|
674
673
|
| `61250b49a90b` | certain | Not scored. | `modules/hall-ui/public/idea.js:84` |
|
|
675
674
|
| `8d6afe6def47` | certain | Not signed in | `modules/hall-ui/public/settings.html:40` |
|
|
@@ -847,7 +846,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
847
846
|
| `42cbc20a6ec8` | certain | Saves when you press Save; your next | `modules/hall-ui/public/settings.html:136` |
|
|
848
847
|
| `645dd8117cf3` | certain | Say why it is being retired — the reason goes in the record. | `modules/hall-ui/public/task.js:924` |
|
|
849
848
|
| `fc9d783ed0f5` | certain | Say why it is better. Whoever reviews this decides it from your reason, without asking you. | `modules/hall-ui/public/copy-desk.js:446` |
|
|
850
|
-
| `12c1ec21a2c6` | certain | Say yes | `modules/hall-ui/public/collab.js:
|
|
849
|
+
| `12c1ec21a2c6` | certain | Say yes | `modules/hall-ui/public/collab.js:435` |
|
|
851
850
|
| `46711f7bc3df` | certain | Search every string the product shows a person, by what it says or the file it lives in. | `modules/hall-ui/public/copy-desk.html:65` |
|
|
852
851
|
| `5d2ba8e72fa1` | certain | Search failed. | `modules/hall-ui/public/copy-desk.js:343` |
|
|
853
852
|
| `373a7639bcb9` | certain | Sections in this primer | `modules/hall-ui/public/primer.html:52` |
|
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": 1826,
|
|
7
|
+
"unique_ids": 1584,
|
|
8
|
+
"certain": 1826,
|
|
9
9
|
"heuristic": 0,
|
|
10
10
|
"duplicate_ids": 166
|
|
11
11
|
},
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"builders-hall": {
|
|
14
14
|
"at": "modules/hall-ui/public",
|
|
15
15
|
"files": 84,
|
|
16
|
-
"strings":
|
|
16
|
+
"strings": 1336
|
|
17
17
|
},
|
|
18
18
|
"status-dashboard": {
|
|
19
19
|
"at": "modules/status-ui/public",
|
|
@@ -2253,15 +2253,6 @@
|
|
|
2253
2253
|
"origin": "js-markup",
|
|
2254
2254
|
"confidence": "certain"
|
|
2255
2255
|
},
|
|
2256
|
-
{
|
|
2257
|
-
"id": "9fe51a2e1e71",
|
|
2258
|
-
"surface": "builders-hall",
|
|
2259
|
-
"text": "A {…} — you are a {…}. Mingle pairs across roles.",
|
|
2260
|
-
"file": "modules/hall-ui/public/collab.js",
|
|
2261
|
-
"line": 421,
|
|
2262
|
-
"origin": "js-markup",
|
|
2263
|
-
"confidence": "certain"
|
|
2264
|
-
},
|
|
2265
2256
|
{
|
|
2266
2257
|
"id": "996edffc1966",
|
|
2267
2258
|
"surface": "builders-hall",
|
|
@@ -3775,11 +3766,11 @@
|
|
|
3775
3766
|
"confidence": "certain"
|
|
3776
3767
|
},
|
|
3777
3768
|
{
|
|
3778
|
-
"id": "
|
|
3769
|
+
"id": "9912c3835136",
|
|
3779
3770
|
"surface": "builders-hall",
|
|
3780
|
-
"text": "Could not load requests.",
|
|
3771
|
+
"text": "Could not load requests — reload to try again.",
|
|
3781
3772
|
"file": "modules/hall-ui/public/collab.js",
|
|
3782
|
-
"line":
|
|
3773
|
+
"line": 529,
|
|
3783
3774
|
"origin": "js-text-assign",
|
|
3784
3775
|
"confidence": "certain"
|
|
3785
3776
|
},
|
|
@@ -7064,7 +7055,7 @@
|
|
|
7064
7055
|
"surface": "builders-hall",
|
|
7065
7056
|
"text": "Not now",
|
|
7066
7057
|
"file": "modules/hall-ui/public/collab.js",
|
|
7067
|
-
"line":
|
|
7058
|
+
"line": 435,
|
|
7068
7059
|
"origin": "js-markup",
|
|
7069
7060
|
"confidence": "certain"
|
|
7070
7061
|
},
|
|
@@ -8666,7 +8657,7 @@
|
|
|
8666
8657
|
"surface": "builders-hall",
|
|
8667
8658
|
"text": "Say yes",
|
|
8668
8659
|
"file": "modules/hall-ui/public/collab.js",
|
|
8669
|
-
"line":
|
|
8660
|
+
"line": 435,
|
|
8670
8661
|
"origin": "js-markup",
|
|
8671
8662
|
"confidence": "certain"
|
|
8672
8663
|
},
|
|
@@ -2280,5 +2280,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
2280
2280
|
landed since 1.19.901 with no explicit bump. run 35497860558. (task 1002620)
|
|
2281
2281
|
1.19.903 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2282
2282
|
landed since 1.19.902 with no explicit bump. run 35510679104. (task 1002620)
|
|
2283
|
+
1.19.904 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2284
|
+
landed since 1.19.903 with no explicit bump. run 35511494246. (task 1002620)
|
|
2283
2285
|
---------------------------------------------------------------------------
|
|
2284
2286
|
```
|
|
@@ -313,6 +313,27 @@
|
|
|
313
313
|
return req.needs_craft ? who + ' asked ' + req.needs_craft + 's' : who + ' asked';
|
|
314
314
|
}
|
|
315
315
|
|
|
316
|
+
// "an engineer", "an artist", "an ideator" — but "a UI", which is why this cannot be a
|
|
317
|
+
// plain vowel test. roleWord() carries the same acronym exception one file over.
|
|
318
|
+
function aOrAn(word) {
|
|
319
|
+
const w = String(word || '');
|
|
320
|
+
if (/^ui$/i.test(w)) return 'a';
|
|
321
|
+
return /^[aeiou]/i.test(w) ? 'an' : 'a';
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// The mingle row's sub-line (task 1003967, artist review of 1003960). Takes the two
|
|
325
|
+
// roles ALREADY RESOLVED to their sentence words, so this stays pure and the caller
|
|
326
|
+
// owns the vocabulary — and so this can be RUN in a test rather than grepped, which is
|
|
327
|
+
// the only way a swapped article gets caught. An empty side means the pair has a role
|
|
328
|
+
// nobody set: the comparison then has nothing to compare, so it is dropped rather than
|
|
329
|
+
// rendered with the database's own word in it.
|
|
330
|
+
function pairSentence(theirWord, myWord) {
|
|
331
|
+
if (!theirWord || !myWord) return 'Mingle pairs across roles.';
|
|
332
|
+
const lead = `${aOrAn(theirWord)} ${theirWord}`;
|
|
333
|
+
return `${lead.charAt(0).toUpperCase()}${lead.slice(1)} — you are ${aOrAn(myWord)} ${myWord}. `
|
|
334
|
+
+ 'Mingle pairs across roles.';
|
|
335
|
+
}
|
|
336
|
+
|
|
316
337
|
window.OTBCollabLib = {
|
|
317
338
|
BANDS: BANDS, ageBand: ageBand, ageLabel: ageLabel,
|
|
318
339
|
byAgeOldestFirst: byAgeOldestFirst, byNewestFirst: byNewestFirst,
|
|
@@ -320,5 +341,6 @@
|
|
|
320
341
|
directionLine: directionLine, boardLine: boardLine,
|
|
321
342
|
titleOf: titleOf, summaryOf: summaryOf, clipWords: clipWords, LEAD_MAX: LEAD_MAX, groupOf: groupOf,
|
|
322
343
|
httpUrl: httpUrl, initialOf: initialOf, faceOf: faceOf, askers: askers, splitShown: splitShown,
|
|
344
|
+
aOrAn: aOrAn, pairSentence: pairSentence,
|
|
323
345
|
};
|
|
324
346
|
})();
|
|
@@ -418,11 +418,25 @@
|
|
|
418
418
|
const whoName = o.name || o.login || `builder ${o.id}`;
|
|
419
419
|
const who = escapeHtml(whoName);
|
|
420
420
|
const face = { kind: 'person', id: o.id, name: whoName, avatar: null, initial: L.initialOf(whoName) };
|
|
421
|
+
|
|
422
|
+
// A SENTENCE TAKES roleWord() — the rule dom-utils.js writes down beside the helper
|
|
423
|
+
// (task 1004041). This row took neither helper and interpolated the raw column, so a
|
|
424
|
+
// pair whose role was unset rendered the database's own word: "A unclassified — you
|
|
425
|
+
// are a engineer", which is V2's named failure and a wrong article in the same line.
|
|
426
|
+
// Where a role is missing the comparison has nothing to compare, so the row says the
|
|
427
|
+
// one thing that is still true rather than naming a value nobody chose.
|
|
428
|
+
// roleIsUnset() is how a caller asks (dom-utils.js:198). Spelling 'unclassified' here
|
|
429
|
+
// would be a second definition of the axis in a third file — the drift V1 forbids, and
|
|
430
|
+
// the exact shape this review was filed to remove.
|
|
431
|
+
const theirs = window.OTB.roleIsUnset(o.craft) ? '' : window.OTB.roleWord(o.craft);
|
|
432
|
+
const mine = window.OTB.roleIsUnset(o.myCraft) ? '' : window.OTB.roleWord(o.myCraft);
|
|
433
|
+
const pairLine = L.pairSentence(theirs, mine);
|
|
434
|
+
|
|
421
435
|
return `<li class="ov-row ov-row--lead cb-row">
|
|
422
436
|
${faceHtml(face)}
|
|
423
437
|
<div class="ov-row__main">
|
|
424
438
|
<a class="ov-row__title" href="/builders/profile?id=${escapeHtml(String(o.id))}">${who}</a>
|
|
425
|
-
<p class="ov-row__sub"
|
|
439
|
+
<p class="ov-row__sub">${escapeHtml(pairLine)}</p>
|
|
426
440
|
</div>
|
|
427
441
|
<div class="ov-row__right">
|
|
428
442
|
<div class="ov-row__actions">
|
|
@@ -511,6 +525,7 @@
|
|
|
511
525
|
|
|
512
526
|
load().catch(() => {
|
|
513
527
|
const sub = $('#cb-sub');
|
|
514
|
-
|
|
528
|
+
// V6: a message that stops someone points at the next move in the same breath.
|
|
529
|
+
if (sub) sub.textContent = 'Could not load requests — reload to try again.';
|
|
515
530
|
});
|
|
516
531
|
})();
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.904",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.19.
|
|
9
|
+
"version": "1.19.904",
|
|
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.19.
|
|
3
|
+
"version": "1.19.904",
|
|
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/src/module-api.js
CHANGED
|
@@ -71,7 +71,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
|
|
|
71
71
|
// there. scripts/gds/bump-version.js still rewrites the literal below; it appends
|
|
72
72
|
// the entry to that file. Look for a version's history there, not here.
|
|
73
73
|
// ---------------------------------------------------------------------------
|
|
74
|
-
const CORE_VERSION = '1.19.
|
|
74
|
+
const CORE_VERSION = '1.19.904'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
75
75
|
|
|
76
76
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
77
77
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|
package/tests/collab_page.mjs
CHANGED
|
@@ -421,6 +421,50 @@ test('the SIDEBAR badge: the Collab item declares the help_requests count', () =
|
|
|
421
421
|
assert.match(fn, /href: '\/collab'/, 'pointing at the page, not the retired hash view');
|
|
422
422
|
});
|
|
423
423
|
|
|
424
|
+
// ---- THE MINGLE ROW SPEAKS THE ROLE ---------------------------------------
|
|
425
|
+
// task 1003967 (artist review of 1003960). Run, not grepped: the first version of this
|
|
426
|
+
// guard matched identifier names in the source, which would have agreed with a swapped
|
|
427
|
+
// article just as happily as with a correct one. The sentence is pure, so execute it.
|
|
428
|
+
|
|
429
|
+
test('the mingle sub-line reads as English for every pair, and never shows the column', () => {
|
|
430
|
+
const L = lib();
|
|
431
|
+
const OTB = domUtils();
|
|
432
|
+
const word = (d) => (OTB.roleIsUnset(d) ? '' : OTB.roleWord(d));
|
|
433
|
+
const line = (a, b) => L.pairSentence(word(a), word(b));
|
|
434
|
+
|
|
435
|
+
assert.equal(line('engineer', 'artist'), 'An engineer — you are an artist. Mingle pairs across roles.');
|
|
436
|
+
assert.equal(line('artist', 'ideator'), 'An artist — you are an ideator. Mingle pairs across roles.');
|
|
437
|
+
|
|
438
|
+
// 'ui' is the acronym exception roleWord() already makes, and it is why the article
|
|
439
|
+
// cannot be a plain vowel test — "an UI" is how that shortcut fails.
|
|
440
|
+
assert.equal(line('ui', 'engineer'), 'A UI — you are an engineer. Mingle pairs across roles.');
|
|
441
|
+
assert.equal(line('engineer', 'ui'), 'An engineer — you are a UI. Mingle pairs across roles.');
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
test('a pair with an unset role drops the comparison rather than naming the default', () => {
|
|
445
|
+
const L = lib();
|
|
446
|
+
const OTB = domUtils();
|
|
447
|
+
const word = (d) => (OTB.roleIsUnset(d) ? '' : OTB.roleWord(d));
|
|
448
|
+
|
|
449
|
+
// The defect this replaced rendered the database's own word — "A unclassified — you are
|
|
450
|
+
// a engineer" — which is the example V2 names. Nothing a person did not choose may reach
|
|
451
|
+
// the sentence, whichever side is missing.
|
|
452
|
+
for (const pair of [[OTB.ROLE_UNSET, 'engineer'], ['engineer', OTB.ROLE_UNSET], [null, 'artist'], ['', '']]) {
|
|
453
|
+
const out = L.pairSentence(word(pair[0]), word(pair[1]));
|
|
454
|
+
assert.equal(out, 'Mingle pairs across roles.', `pair ${JSON.stringify(pair)}`);
|
|
455
|
+
assert.doesNotMatch(out, /unclassified/);
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
test('aOrAn is the article rule, stated once', () => {
|
|
460
|
+
const L = lib();
|
|
461
|
+
assert.equal(L.aOrAn('engineer'), 'an');
|
|
462
|
+
assert.equal(L.aOrAn('artist'), 'an');
|
|
463
|
+
assert.equal(L.aOrAn('ideator'), 'an');
|
|
464
|
+
assert.equal(L.aOrAn('UI'), 'a', 'the acronym is spoken "you-eye", so it takes "a"');
|
|
465
|
+
assert.equal(L.aOrAn('ui'), 'a');
|
|
466
|
+
});
|
|
467
|
+
|
|
424
468
|
// ---- THE ANSWERABLE CLAUSE ------------------------------------------------
|
|
425
469
|
test('the asker can settle in place, with both outcomes', () => {
|
|
426
470
|
const js = read('modules', 'hall-ui', 'public', 'collab.js');
|