@bongos/core 1.25.18 → 1.25.19
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 +29 -29
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +2 -0
- package/clients/bongos-client/index.cjs +2 -0
- package/clients/bongos-client/index.d.ts +2 -0
- package/clients/bongos-client/index.mjs +2 -0
- package/docs/adr/0408-a-genesis-stage-is-three-doors-onto-one-record.md +1 -1
- package/docs/api/openapi.json +46 -1
- package/docs/api-reference.md +3 -2
- package/docs/copy-inventory.md +15 -14
- package/docs/copy-registry.json +35 -26
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-readings.json +1 -1
- package/modules/hall-ui/public/genesis-home.js +28 -3
- package/modules/onboarding/genesis-home.js +68 -7
- package/modules/onboarding/genesis-work.js +68 -0
- package/modules/onboarding/routes/genesis-work.js +3 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/scripts/bongos/genesis.js +8 -1
- package/src/module-api.js +1 -1
- package/tests/genesis_home.mjs +81 -1
- package/tests/genesis_work.mjs +29 -0
- package/tests/genesis_work_routes.mjs +9 -0
package/.bongos-core.json
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/bongos/package-core.js",
|
|
5
|
-
"core_version": "1.25.
|
|
6
|
-
"core_contract": "1.25.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.25.19",
|
|
6
|
+
"core_contract": "1.25.19",
|
|
7
|
+
"source_commit": "6cfe7fe4cd7a3e054af0299fa54ad632d2cb22ba",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-11-13T22:
|
|
9
|
+
"built_at": "2026-11-13T22:34:46.056Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 658,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 4747,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "174e093f9fbae4266dde87b7575aa1e57b172e87178838ae9592e0acc4400e23",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -332,12 +332,12 @@
|
|
|
332
332
|
{
|
|
333
333
|
"path": "clients/bongos-client/README.md",
|
|
334
334
|
"mode": "0000644",
|
|
335
|
-
"sha256": "
|
|
335
|
+
"sha256": "01f1be9ea402247827f93d487f58b839db1aed3bb1f0fbc200eb529933c25932"
|
|
336
336
|
},
|
|
337
337
|
{
|
|
338
338
|
"path": "clients/bongos-client/bongos-client.global.js",
|
|
339
339
|
"mode": "0000644",
|
|
340
|
-
"sha256": "
|
|
340
|
+
"sha256": "37974fd14bb71870f9b0763de589aaf6774cb70f3de266c4e6666fe33f466050"
|
|
341
341
|
},
|
|
342
342
|
{
|
|
343
343
|
"path": "clients/bongos-client/examples/hello-world.mjs",
|
|
@@ -347,17 +347,17 @@
|
|
|
347
347
|
{
|
|
348
348
|
"path": "clients/bongos-client/index.cjs",
|
|
349
349
|
"mode": "0000644",
|
|
350
|
-
"sha256": "
|
|
350
|
+
"sha256": "a2e3c39342afc83b214e04d1bf3e58403666dfa03286580e6f254f8061952d36"
|
|
351
351
|
},
|
|
352
352
|
{
|
|
353
353
|
"path": "clients/bongos-client/index.d.ts",
|
|
354
354
|
"mode": "0000644",
|
|
355
|
-
"sha256": "
|
|
355
|
+
"sha256": "2ec2a5b7cdbd69986c22750751b660a60b73838551ed3d0f5d9ad8c42e046c60"
|
|
356
356
|
},
|
|
357
357
|
{
|
|
358
358
|
"path": "clients/bongos-client/index.mjs",
|
|
359
359
|
"mode": "0000644",
|
|
360
|
-
"sha256": "
|
|
360
|
+
"sha256": "4cb8568f3723e199fba953228e3333bf747afa2fed379f5549bb92b97bf1ca6c"
|
|
361
361
|
},
|
|
362
362
|
{
|
|
363
363
|
"path": "clients/bongos-client/package.json",
|
|
@@ -2502,7 +2502,7 @@
|
|
|
2502
2502
|
{
|
|
2503
2503
|
"path": "docs/adr/0408-a-genesis-stage-is-three-doors-onto-one-record.md",
|
|
2504
2504
|
"mode": "0000644",
|
|
2505
|
-
"sha256": "
|
|
2505
|
+
"sha256": "2cde53b913be696db46eb115bcfd73ec60a6e86b109df977a684323805403982"
|
|
2506
2506
|
},
|
|
2507
2507
|
{
|
|
2508
2508
|
"path": "docs/adr/README.md",
|
|
@@ -2512,12 +2512,12 @@
|
|
|
2512
2512
|
{
|
|
2513
2513
|
"path": "docs/api-reference.md",
|
|
2514
2514
|
"mode": "0000644",
|
|
2515
|
-
"sha256": "
|
|
2515
|
+
"sha256": "504e8c40b91fd982409ee832a2f55cedce349a24de84adf779c466cd3b761d71"
|
|
2516
2516
|
},
|
|
2517
2517
|
{
|
|
2518
2518
|
"path": "docs/api/openapi.json",
|
|
2519
2519
|
"mode": "0000644",
|
|
2520
|
-
"sha256": "
|
|
2520
|
+
"sha256": "b784b7b55963091454d70bf97147069498234f090a6b215051fd87ce10e07a08"
|
|
2521
2521
|
},
|
|
2522
2522
|
{
|
|
2523
2523
|
"path": "docs/architecture.md",
|
|
@@ -2542,12 +2542,12 @@
|
|
|
2542
2542
|
{
|
|
2543
2543
|
"path": "docs/copy-inventory.md",
|
|
2544
2544
|
"mode": "0000644",
|
|
2545
|
-
"sha256": "
|
|
2545
|
+
"sha256": "0613091e014b8ef08d48acf7f5d488403c363a51273a070c6f1732b4a72dd694"
|
|
2546
2546
|
},
|
|
2547
2547
|
{
|
|
2548
2548
|
"path": "docs/copy-registry.json",
|
|
2549
2549
|
"mode": "0000644",
|
|
2550
|
-
"sha256": "
|
|
2550
|
+
"sha256": "42916684dd98954ef7208ef5c3e458fb0c8885dda59e971fac92979a9ff68fd7"
|
|
2551
2551
|
},
|
|
2552
2552
|
{
|
|
2553
2553
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -3102,7 +3102,7 @@
|
|
|
3102
3102
|
{
|
|
3103
3103
|
"path": "docs/module-api-changelog.md",
|
|
3104
3104
|
"mode": "0000644",
|
|
3105
|
-
"sha256": "
|
|
3105
|
+
"sha256": "587c15ca53116acd7e583f77f072b37e1a85a620f8ce62e32a8428e67ae6bfb0"
|
|
3106
3106
|
},
|
|
3107
3107
|
{
|
|
3108
3108
|
"path": "docs/modules-contract.md",
|
|
@@ -3187,7 +3187,7 @@
|
|
|
3187
3187
|
{
|
|
3188
3188
|
"path": "docs/page-readings.json",
|
|
3189
3189
|
"mode": "0000644",
|
|
3190
|
-
"sha256": "
|
|
3190
|
+
"sha256": "cd6970d5087c5f11d021f21af3d91216f3f47852e3e2243ab0554cfb68500db5"
|
|
3191
3191
|
},
|
|
3192
3192
|
{
|
|
3193
3193
|
"path": "docs/project-context.template.md",
|
|
@@ -6647,7 +6647,7 @@
|
|
|
6647
6647
|
{
|
|
6648
6648
|
"path": "modules/hall-ui/public/genesis-home.js",
|
|
6649
6649
|
"mode": "0000644",
|
|
6650
|
-
"sha256": "
|
|
6650
|
+
"sha256": "1508332865feb74e2da4d39358deb2c06bda9a56abb9692b967912623667abed"
|
|
6651
6651
|
},
|
|
6652
6652
|
{
|
|
6653
6653
|
"path": "modules/hall-ui/public/genesis/r5-life-1-primordial-sea-cut.webp",
|
|
@@ -9422,12 +9422,12 @@
|
|
|
9422
9422
|
{
|
|
9423
9423
|
"path": "modules/onboarding/genesis-home.js",
|
|
9424
9424
|
"mode": "0000644",
|
|
9425
|
-
"sha256": "
|
|
9425
|
+
"sha256": "55f245234d8b4177ef24c2d78861a20d11fbc4bc1e95ffb2bbf0db68a9156f8a"
|
|
9426
9426
|
},
|
|
9427
9427
|
{
|
|
9428
9428
|
"path": "modules/onboarding/genesis-work.js",
|
|
9429
9429
|
"mode": "0000644",
|
|
9430
|
-
"sha256": "
|
|
9430
|
+
"sha256": "8e0897fc7be3206b4cc556a4ca9c60f33d18fd4d4e23e5b5bc2ce3ba5b870659"
|
|
9431
9431
|
},
|
|
9432
9432
|
{
|
|
9433
9433
|
"path": "modules/onboarding/howto-guide.js",
|
|
@@ -9487,7 +9487,7 @@
|
|
|
9487
9487
|
{
|
|
9488
9488
|
"path": "modules/onboarding/routes/genesis-work.js",
|
|
9489
9489
|
"mode": "0000644",
|
|
9490
|
-
"sha256": "
|
|
9490
|
+
"sha256": "4b63fc9e543298f3b33e3a2f3dcd5a2640e85f5f8b8cf669c496af7aef9c9277"
|
|
9491
9491
|
},
|
|
9492
9492
|
{
|
|
9493
9493
|
"path": "modules/onboarding/routes/onboarding.js",
|
|
@@ -12447,12 +12447,12 @@
|
|
|
12447
12447
|
{
|
|
12448
12448
|
"path": "package-lock.json",
|
|
12449
12449
|
"mode": "0000644",
|
|
12450
|
-
"sha256": "
|
|
12450
|
+
"sha256": "994bfb72a0c7655dd32c29d9810a65acbffc772c5aa5bb443333b127172fae6f"
|
|
12451
12451
|
},
|
|
12452
12452
|
{
|
|
12453
12453
|
"path": "package.json",
|
|
12454
12454
|
"mode": "0000644",
|
|
12455
|
-
"sha256": "
|
|
12455
|
+
"sha256": "76aacebbbbc389a5de875b1c69f4c63adcc0bb129e3741877f2ee818fa5ab94c"
|
|
12456
12456
|
},
|
|
12457
12457
|
{
|
|
12458
12458
|
"path": "public-docs/index.html",
|
|
@@ -12472,7 +12472,7 @@
|
|
|
12472
12472
|
{
|
|
12473
12473
|
"path": "release-notes.json",
|
|
12474
12474
|
"mode": "0000644",
|
|
12475
|
-
"sha256": "
|
|
12475
|
+
"sha256": "e5ff0d770345c63973f46a9610fe820506f970937d313d25b6135dbe8ba85216"
|
|
12476
12476
|
},
|
|
12477
12477
|
{
|
|
12478
12478
|
"path": "scripts/bongos/CLAUDE.md",
|
|
@@ -13142,7 +13142,7 @@
|
|
|
13142
13142
|
{
|
|
13143
13143
|
"path": "scripts/bongos/genesis.js",
|
|
13144
13144
|
"mode": "0000644",
|
|
13145
|
-
"sha256": "
|
|
13145
|
+
"sha256": "8122c13cd84361e5c000b672a751a0e9e47c3395a0b83e5e47da93b954ff2323"
|
|
13146
13146
|
},
|
|
13147
13147
|
{
|
|
13148
13148
|
"path": "scripts/bongos/git-merge-regen.js",
|
|
@@ -16512,7 +16512,7 @@
|
|
|
16512
16512
|
{
|
|
16513
16513
|
"path": "src/module-api.js",
|
|
16514
16514
|
"mode": "0000644",
|
|
16515
|
-
"sha256": "
|
|
16515
|
+
"sha256": "463f11bc824fd98fe1a4b719dfd8166d9953415b962d6cb73f850df6bb5a055c"
|
|
16516
16516
|
},
|
|
16517
16517
|
{
|
|
16518
16518
|
"path": "src/module-loader/catalog.js",
|
|
@@ -18572,7 +18572,7 @@
|
|
|
18572
18572
|
{
|
|
18573
18573
|
"path": "tests/genesis_home.mjs",
|
|
18574
18574
|
"mode": "0000644",
|
|
18575
|
-
"sha256": "
|
|
18575
|
+
"sha256": "6ed29626d5dc1125478806c431a8c52c3ee62866632693071aa6a30097be8767"
|
|
18576
18576
|
},
|
|
18577
18577
|
{
|
|
18578
18578
|
"path": "tests/genesis_life_plates.mjs",
|
|
@@ -18582,7 +18582,7 @@
|
|
|
18582
18582
|
{
|
|
18583
18583
|
"path": "tests/genesis_work.mjs",
|
|
18584
18584
|
"mode": "0000644",
|
|
18585
|
-
"sha256": "
|
|
18585
|
+
"sha256": "213e9002e83795b450dd5212712e3d69c5fd02989f01ff37039fa2e0be744b2c"
|
|
18586
18586
|
},
|
|
18587
18587
|
{
|
|
18588
18588
|
"path": "tests/genesis_work_db.mjs",
|
|
@@ -18592,7 +18592,7 @@
|
|
|
18592
18592
|
{
|
|
18593
18593
|
"path": "tests/genesis_work_routes.mjs",
|
|
18594
18594
|
"mode": "0000644",
|
|
18595
|
-
"sha256": "
|
|
18595
|
+
"sha256": "3d91108a7cb6ddb1bfc3b0ca8a10459c52658f90e50be93397fd9964caee3eb7"
|
|
18596
18596
|
},
|
|
18597
18597
|
{
|
|
18598
18598
|
"path": "tests/git_guard.mjs",
|
|
@@ -5,7 +5,7 @@ A **generated**, zero-dependency typed client for the Bongos API — produced fr
|
|
|
5
5
|
by hand; it regenerates when the spec changes, so it can never drift from the routes.
|
|
6
6
|
|
|
7
7
|
- API version: **v1** (served at `/api/bongos/v1`)
|
|
8
|
-
-
|
|
8
|
+
- 730 operations across 88 resource groups
|
|
9
9
|
|
|
10
10
|
## Use it from your project
|
|
11
11
|
|
|
@@ -519,6 +519,8 @@ function createClient(opts = {}) {
|
|
|
519
519
|
getFoundingWorkStageAnswersQuestionHistory: (args) => request("GET", "/founding/work/{stage}/answers/{question}/history", { hasBody: false }, args),
|
|
520
520
|
// GET /founding/work/{stage}/assist — rank: any-builder — GET /founding/work/:stage/assist
|
|
521
521
|
getFoundingWorkStageAssist: (args) => request("GET", "/founding/work/{stage}/assist", { hasBody: false }, args),
|
|
522
|
+
// GET /founding/work/{stage}/document — rank: any-builder — GET /founding/work/:stage/document
|
|
523
|
+
getFoundingWorkStageDocument: (args) => request("GET", "/founding/work/{stage}/document", { hasBody: false }, args),
|
|
522
524
|
// PUT /founding/work/{stage}/door — rank: any-builder — PUT /founding/work/:stage/door
|
|
523
525
|
putFoundingWorkStageDoor: (args) => request("PUT", "/founding/work/{stage}/door", { hasBody: true }, args),
|
|
524
526
|
// PUT /founding/work/{stage}/link — rank: any-builder — PUT /founding/work/:stage/link
|
|
@@ -518,6 +518,8 @@ function createClient(opts = {}) {
|
|
|
518
518
|
getFoundingWorkStageAnswersQuestionHistory: (args) => request("GET", "/founding/work/{stage}/answers/{question}/history", { hasBody: false }, args),
|
|
519
519
|
// GET /founding/work/{stage}/assist — rank: any-builder — GET /founding/work/:stage/assist
|
|
520
520
|
getFoundingWorkStageAssist: (args) => request("GET", "/founding/work/{stage}/assist", { hasBody: false }, args),
|
|
521
|
+
// GET /founding/work/{stage}/document — rank: any-builder — GET /founding/work/:stage/document
|
|
522
|
+
getFoundingWorkStageDocument: (args) => request("GET", "/founding/work/{stage}/document", { hasBody: false }, args),
|
|
521
523
|
// PUT /founding/work/{stage}/door — rank: any-builder — PUT /founding/work/:stage/door
|
|
522
524
|
putFoundingWorkStageDoor: (args) => request("PUT", "/founding/work/{stage}/door", { hasBody: true }, args),
|
|
523
525
|
// PUT /founding/work/{stage}/link — rank: any-builder — PUT /founding/work/:stage/link
|
|
@@ -1211,6 +1211,8 @@ export interface BongosClient {
|
|
|
1211
1211
|
getFoundingWorkStageAnswersQuestionHistory(args?: RequestArgs): Promise<ApiResponse>;
|
|
1212
1212
|
/** GET /founding/work/{stage}/assist — rank: any-builder */
|
|
1213
1213
|
getFoundingWorkStageAssist(args?: RequestArgs): Promise<ApiResponse>;
|
|
1214
|
+
/** GET /founding/work/{stage}/document — rank: any-builder */
|
|
1215
|
+
getFoundingWorkStageDocument(args?: RequestArgs): Promise<ApiResponse>;
|
|
1214
1216
|
/** PUT /founding/work/{stage}/door — rank: any-builder */
|
|
1215
1217
|
putFoundingWorkStageDoor(args: RequestArgs & { body: PutFoundingWorkStageDoorRequest }): Promise<ApiResponse>;
|
|
1216
1218
|
/** PUT /founding/work/{stage}/link — rank: any-builder */
|
|
@@ -515,6 +515,8 @@ export function createClient(opts = {}) {
|
|
|
515
515
|
getFoundingWorkStageAnswersQuestionHistory: (args) => request("GET", "/founding/work/{stage}/answers/{question}/history", { hasBody: false }, args),
|
|
516
516
|
// GET /founding/work/{stage}/assist — rank: any-builder — GET /founding/work/:stage/assist
|
|
517
517
|
getFoundingWorkStageAssist: (args) => request("GET", "/founding/work/{stage}/assist", { hasBody: false }, args),
|
|
518
|
+
// GET /founding/work/{stage}/document — rank: any-builder — GET /founding/work/:stage/document
|
|
519
|
+
getFoundingWorkStageDocument: (args) => request("GET", "/founding/work/{stage}/document", { hasBody: false }, args),
|
|
518
520
|
// PUT /founding/work/{stage}/door — rank: any-builder — PUT /founding/work/:stage/door
|
|
519
521
|
putFoundingWorkStageDoor: (args) => request("PUT", "/founding/work/{stage}/door", { hasBody: true }, args),
|
|
520
522
|
// PUT /founding/work/{stage}/link — rank: any-builder — PUT /founding/work/:stage/link
|
|
@@ -57,6 +57,6 @@ every stage, not a strategize feature that charter then copies.
|
|
|
57
57
|
- Presentation is left to the game frame (the founding of the government district) and
|
|
58
58
|
the hall version (task 1005285). Today a founder works a stage through their AI session
|
|
59
59
|
and `npx bongos genesis …`.
|
|
60
|
-
- Task 1005115 renders each stage's record as an editable document from this store.
|
|
60
|
+
- Task 1005115 renders each stage's record as an editable document from this store (`documentOf`, `GET /founding/work/:stage/document`), and on a project with no Board Room a stage whose tasks are finished advances by itself.
|
|
61
61
|
- Charter adopted it (task 1005119): how decisions should go and the founder's principles. A question may declare `choices` (a closed answer, stored as its key) where another module reads the answer; the charter stage's read carries the government module's recommendation built from them.
|
|
62
62
|
- Scope adopted it with the project interview (task 1005114): six questions in three groups. `/goal-create` and `/planning-session` read the answers before planning, through `genesis.js context`.
|
package/docs/api/openapi.json
CHANGED
|
@@ -8597,6 +8597,51 @@
|
|
|
8597
8597
|
]
|
|
8598
8598
|
}
|
|
8599
8599
|
},
|
|
8600
|
+
"/founding/work/{stage}/document": {
|
|
8601
|
+
"get": {
|
|
8602
|
+
"operationId": "get_founding_work_stage_document",
|
|
8603
|
+
"tags": [
|
|
8604
|
+
"founding"
|
|
8605
|
+
],
|
|
8606
|
+
"summary": "GET /founding/work/:stage/document",
|
|
8607
|
+
"description": "The stage's document (task 1005115): its record read as one named page, editable through the writes below at any time, without reopening the stage.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
8608
|
+
"x-rank": "any-builder",
|
|
8609
|
+
"x-source": "modules/onboarding/routes/genesis-work.js",
|
|
8610
|
+
"parameters": [
|
|
8611
|
+
{
|
|
8612
|
+
"name": "stage",
|
|
8613
|
+
"in": "path",
|
|
8614
|
+
"required": true,
|
|
8615
|
+
"schema": {
|
|
8616
|
+
"type": "string"
|
|
8617
|
+
},
|
|
8618
|
+
"description": "Path parameter `stage`."
|
|
8619
|
+
}
|
|
8620
|
+
],
|
|
8621
|
+
"responses": {
|
|
8622
|
+
"200": {
|
|
8623
|
+
"description": "Success."
|
|
8624
|
+
},
|
|
8625
|
+
"400": {
|
|
8626
|
+
"$ref": "#/components/responses/BadRequest"
|
|
8627
|
+
},
|
|
8628
|
+
"401": {
|
|
8629
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
8630
|
+
},
|
|
8631
|
+
"403": {
|
|
8632
|
+
"$ref": "#/components/responses/Forbidden"
|
|
8633
|
+
},
|
|
8634
|
+
"404": {
|
|
8635
|
+
"$ref": "#/components/responses/NotFound"
|
|
8636
|
+
}
|
|
8637
|
+
},
|
|
8638
|
+
"security": [
|
|
8639
|
+
{
|
|
8640
|
+
"builderSession": []
|
|
8641
|
+
}
|
|
8642
|
+
]
|
|
8643
|
+
}
|
|
8644
|
+
},
|
|
8600
8645
|
"/founding/work/{stage}/door": {
|
|
8601
8646
|
"put": {
|
|
8602
8647
|
"operationId": "put_founding_work_stage_door",
|
|
@@ -45543,7 +45588,7 @@
|
|
|
45543
45588
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
45544
45589
|
}
|
|
45545
45590
|
},
|
|
45546
|
-
"x-endpoint-count":
|
|
45591
|
+
"x-endpoint-count": 730,
|
|
45547
45592
|
"x-schema-count": 759,
|
|
45548
45593
|
"x-undocumented-bodies": 12,
|
|
45549
45594
|
"x-response-schemas": 473,
|
package/docs/api-reference.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# Bongos API reference
|
|
4
4
|
|
|
5
|
-
> **Generated from the live route files** — the route file is authoritative.
|
|
5
|
+
> **Generated from the live route files** — the route file is authoritative. 730 endpoints across 124 route files.
|
|
6
6
|
> Machine-readable spec: [`docs/api/openapi.json`](api/openapi.json) (OpenAPI 3.1). Rendered docs site: **`/docs`** (e.g. `cloudbongos.com/docs`).
|
|
7
7
|
|
|
8
8
|
Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust-boundary-server-enforced-permissions.md)): `public` < `any-builder` < `metic+archon` < `archon`.
|
|
@@ -333,7 +333,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
333
333
|
| POST | `/api/bongos/first-read/maps/:id/reject` | `metic+archon` | — | .create — the owner's no. |
|
|
334
334
|
| GET | `/api/bongos/first-read/prompt` | `any-builder` | — | the prompt and the shape are instructions, not project data. |
|
|
335
335
|
|
|
336
|
-
## `founding` (
|
|
336
|
+
## `founding` (19)
|
|
337
337
|
|
|
338
338
|
| Method | Path | Rank | Body | Description |
|
|
339
339
|
|---|---|---|---|---|
|
|
@@ -352,6 +352,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
352
352
|
| DELETE | `/api/bongos/founding/work/:stage/answers/:question` | `any-builder` | — | Un-answer: back to empty, which is not the same as skipped. |
|
|
353
353
|
| GET | `/api/bongos/founding/work/:stage/answers/:question/history` | `any-builder` | — | |
|
|
354
354
|
| GET | `/api/bongos/founding/work/:stage/assist` | `any-builder` | — | |
|
|
355
|
+
| GET | `/api/bongos/founding/work/:stage/document` | `any-builder` | — | The stage's document (task 1005115): its record read as one named page, editable through the writes below at any time, without reopening … |
|
|
355
356
|
| PUT | `/api/bongos/founding/work/:stage/door` | `any-builder` | `door` | The founder's writes. |
|
|
356
357
|
| PUT | `/api/bongos/founding/work/:stage/link` | `any-builder` | `url` | |
|
|
357
358
|
| PUT | `/api/bongos/founding/work/:stage/page` | `any-builder` | `page` | |
|
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
|
+
**3202 strings** across 3 surfaces · 2530 distinct pieces of copy · 3202 certain, 0 heuristic · 270 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` | 181 |
|
|
13
|
+
| `builders-hall` | `modules/hall-ui/public` | 181 | 2069 |
|
|
14
14
|
| `status-dashboard` | `modules/status-ui/public` | 4 | 89 |
|
|
15
15
|
| `landing` | `modules/public-landing/public` | 10 | 1044 |
|
|
16
16
|
|
|
@@ -78,7 +78,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
78
78
|
| `1883ad7f07fc` | 4x | Sign out | modules/hall-ui/public/hall-render.js:329, modules/hall-ui/public/setup-gate.js:138, modules/hall-ui/public/shell.js:514 |
|
|
79
79
|
| … | | _230 more in the JSON registry_ | |
|
|
80
80
|
|
|
81
|
-
## `builders-hall` —
|
|
81
|
+
## `builders-hall` — 2069 strings
|
|
82
82
|
|
|
83
83
|
| id | conf | text | where |
|
|
84
84
|
|---|---|---|---|
|
|
@@ -320,7 +320,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
320
320
|
| `70f6a704d504` | certain | Close it | `modules/hall-ui/public/copy-desk.html:140` |
|
|
321
321
|
| `053e576ba9a3` | certain | Close options | `modules/hall-ui/public/shell-game.js:589` |
|
|
322
322
|
| `d12a2fb5730d` | certain | Close this flag | `modules/hall-ui/public/copy-desk.html:116` |
|
|
323
|
-
| `9b9c2abeae90` | certain | Close this stage | `modules/hall-ui/public/genesis-home.js:
|
|
323
|
+
| `9b9c2abeae90` | certain | Close this stage | `modules/hall-ui/public/genesis-home.js:291` |
|
|
324
324
|
| `e6f1842afde1` | certain | Close transcript | `modules/hall-ui/public/watch.html:222` |
|
|
325
325
|
| `29e8c5e30095` | certain | Close without choosing | `modules/hall-ui/public/craft-mode.js:744` |
|
|
326
326
|
| `3d148e19e03a` | certain | Closed. | `modules/hall-ui/public/copy-desk.js:514` |
|
|
@@ -335,7 +335,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
335
335
|
| `fe4a2b04eda5` | certain | Commands — {{worldName}} | `modules/hall-ui/public/commands.html:6` |
|
|
336
336
|
| `cfc287c42263` | certain | Complete your profile | `modules/hall-ui/public/profile-nudge.js:79` |
|
|
337
337
|
| `140f2126c0a3` | certain | Confirm the cost | `modules/hall-ui/public/ai-studio.js:354` |
|
|
338
|
-
| `e74f4442c338` | certain | Confirm this stage | `modules/hall-ui/public/genesis-home.js:
|
|
338
|
+
| `e74f4442c338` | certain | Confirm this stage | `modules/hall-ui/public/genesis-home.js:282` |
|
|
339
339
|
| `9b16a22bf24c` | certain | Connect Discord & join the server | `modules/hall-ui/public/settings.js:536` |
|
|
340
340
|
| `c07898571b24` | certain | Connects to | `modules/hall-ui/public/atlas.js:293` |
|
|
341
341
|
| `999e1955bb1c` | certain | Context layer | `modules/hall-ui/public/atlas.html:45` |
|
|
@@ -494,7 +494,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
494
494
|
| `6fd9b1bf8d97` | certain | Engineering work is open on this page ({…}), so code may change around your words. You can keep writing. | `modules/hall-ui/public/tweak-editor.js:304` |
|
|
495
495
|
| `690609c8e9a9` | certain | Enter a goal number. | `modules/hall-ui/public/gate.js:323` |
|
|
496
496
|
| `8eabe3d69bf3` | certain | Enter files the idea. Shift and Enter starts a new line. | `modules/hall-ui/public/home-idea-box.js:55` |
|
|
497
|
-
| `4f776bc33d5f` | certain | Enter the builders’ hall | `modules/hall-ui/public/genesis-home.js:
|
|
497
|
+
| `4f776bc33d5f` | certain | Enter the builders’ hall | `modules/hall-ui/public/genesis-home.js:336` |
|
|
498
498
|
| `1825c9c467d8` | certain | Enter the id of the task this one should wait for. | `modules/hall-ui/public/task.js:965` |
|
|
499
499
|
| `bd7a40639a1c` | certain | Estimate (min) | `modules/hall-ui/public/task-detail.js:465` |
|
|
500
500
|
| `c15d1f0ddfb6` | certain | Estimation accuracy | `modules/hall-ui/public/watch.html:147` |
|
|
@@ -504,7 +504,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
504
504
|
| `25b6c0f9e74e` | certain | Every page is taken or on its way to the site right now. Come back soon. | `modules/hall-ui/public/studio.js:737` |
|
|
505
505
|
| `c188854da766` | certain | Every place you are currently signed in — this browser, your terminal, any other machine. A session refreshes | `modules/hall-ui/public/settings.html:191` |
|
|
506
506
|
| `8b2cd7714fa4` | certain | Every rank and what it unlocks, in the Primer → | `modules/hall-ui/public/profile-own.js:103` |
|
|
507
|
-
| `823db1913949` | certain | Every room in the hall is open now. The founding builders keep their mark for good. | `modules/hall-ui/public/genesis-home.js:
|
|
507
|
+
| `823db1913949` | certain | Every room in the hall is open now. The founding builders keep their mark for good. | `modules/hall-ui/public/genesis-home.js:335` |
|
|
508
508
|
| `47be006e5ad5` | certain | Every sitting since has been decided under the constitution below, not the ratified one. Nothing is re-applied | `modules/hall-ui/public/government.js:679` |
|
|
509
509
|
| `6604d63c2fb4` | certain | Everyone who joined while this project was being founded, in the order they arrived. The mark is for good. | `modules/hall-ui/public/hall-widgets.js:75` |
|
|
510
510
|
| `d9927beb8cb7` | certain | Everything shipped. By role, with goals and ideas: | `modules/hall-ui/public/profile.html:112` |
|
|
@@ -530,7 +530,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
530
530
|
| `e77b158b074d` | certain | Find a skill | `modules/hall-ui/public/speciality-tools.js:262` |
|
|
531
531
|
| `1def0e7c716e` | certain | Find something to flag | `modules/hall-ui/public/copy-desk.html:64` |
|
|
532
532
|
| `32b40fdae34f` | certain | Finding the next page… | `modules/hall-ui/public/tweak-editor.html:101` |
|
|
533
|
-
| `
|
|
533
|
+
| `d320e778ed17` | certain | Finish every task above and this stage moves on by itself. | `modules/hall-ui/public/genesis-home.js:294` |
|
|
534
|
+
| `f3c56ef0d809` | certain | Finish every task above, then put this stage to the board. | `modules/hall-ui/public/genesis-home.js:295` |
|
|
534
535
|
| `e8738f535783` | certain | Finish later — everything stays off until you save | `modules/hall-ui/public/speciality-tools.js:199` |
|
|
535
536
|
| `defed93e8e28` | certain | Finish these steps once and you’re in. Each one ticks itself as you go. | `modules/hall-ui/public/setup-gate.js:136` |
|
|
536
537
|
| `149d97457483` | certain | Fit the sky (0) | `modules/hall-ui/public/goal-map.html:80` |
|
|
@@ -703,7 +704,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
703
704
|
| `9e8828d602bc` | certain | Lay your thoughts over the project map. | `modules/hall-ui/public/goal-map.html:76` |
|
|
704
705
|
| `7c9b7a89353b` | certain | Leave goal | `modules/hall-ui/public/goals-render.js:961` |
|
|
705
706
|
| `6137d2679912` | certain | Leave it off | `modules/hall-ui/public/speciality-tools.js:157` |
|
|
706
|
-
| `e14ebcf3eec5` | certain | Legislation has passed. Genesis is complete. | `modules/hall-ui/public/genesis-home.js:250` |
|
|
707
707
|
| `d6a78b9e5368` | certain | Let it be for now | `modules/hall-ui/public/studio.js:238` |
|
|
708
708
|
| `d6a78b9e5368` | certain | Let it be for now | `modules/hall-ui/public/studio.js:253` |
|
|
709
709
|
| `97282f586c55` | certain | Level {…} | `modules/hall-ui/public/market-watch-item.js:41` |
|
|
@@ -980,9 +980,9 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
980
980
|
| `855277dff074` | certain | Open task #{…} | `modules/hall-ui/public/goals-render.js:438` |
|
|
981
981
|
| `855277dff074` | certain | Open task #{…} | `modules/hall-ui/public/work.js:838` |
|
|
982
982
|
| `99c630009152` | certain | Open tasks whose declared files overlap — sequence these before two builders collide. | `modules/hall-ui/public/goals.html:217` |
|
|
983
|
-
| `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:
|
|
984
|
-
| `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:
|
|
985
|
-
| `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:
|
|
983
|
+
| `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:283` |
|
|
984
|
+
| `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:288` |
|
|
985
|
+
| `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:326` |
|
|
986
986
|
| `e073aa0c3847` | certain | Open the conflicts for {…} | `modules/hall-ui/public/goal-inbox.js:111` |
|
|
987
987
|
| `676361254d92` | certain | Open the idea composer | `modules/hall-ui/public/idea.js:504` |
|
|
988
988
|
| `29e1cb2d32fc` | certain | Open the recording | `modules/hall-ui/public/criterion-uat-ui.js:124` |
|
|
@@ -1072,7 +1072,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1072
1072
|
| `995dd1ee728d` | certain | Proposed to | `modules/hall-ui/public/my-agents.js:583` |
|
|
1073
1073
|
| `3f85bdc47099` | certain | Protected module scope — join by request; an Archon admits members | `modules/hall-ui/public/goals-render.js:876` |
|
|
1074
1074
|
| `e5c292c8b361` | certain | Provides (seams) | `modules/hall-ui/public/atlas.js:291` |
|
|
1075
|
-
| `93b836382ec7` | certain | Put it to the board again | `modules/hall-ui/public/genesis-home.js:
|
|
1075
|
+
| `93b836382ec7` | certain | Put it to the board again | `modules/hall-ui/public/genesis-home.js:287` |
|
|
1076
1076
|
| `55ff5cd9f7a9` | certain | Put to a vote: | `modules/hall-ui/public/my-agents.js:603` |
|
|
1077
1077
|
| `8888a7fd45be` | certain | Put to the board | `modules/hall-ui/public/genesis-home.js:185` |
|
|
1078
1078
|
| `b3b52d7a9a40` | certain | Quiet. Nothing here is due. | `modules/hall-ui/public/home-studio.js:80` |
|
|
@@ -1350,7 +1350,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1350
1350
|
| `4462dcaaaa7d` | certain | The artist reads this instead of guessing. A pointer with no judgement costs them a look and tells them nothin | `modules/hall-ui/public/copy-desk.html:103` |
|
|
1351
1351
|
| `ca3708a6566a` | certain | The bench | `modules/hall-ui/public/home-studio.js:82` |
|
|
1352
1352
|
| `f38140e472df` | certain | The board ratified a change that is not in force. | `modules/hall-ui/public/government.js:679` |
|
|
1353
|
-
| `ecc7215524c0` | certain | The board sent this stage back. Read why in the Board Room, then put it up again. | `modules/hall-ui/public/genesis-home.js:
|
|
1353
|
+
| `ecc7215524c0` | certain | The board sent this stage back. Read why in the Board Room, then put it up again. | `modules/hall-ui/public/genesis-home.js:286` |
|
|
1354
1354
|
| `a335af65398d` | certain | The city | `modules/hall-ui/public/city.html:62` |
|
|
1355
1355
|
| `a335af65398d` | certain | The city | `modules/hall-ui/public/city.html:62` |
|
|
1356
1356
|
| `4593b431e7b7` | certain | The city — {{worldName}} | `modules/hall-ui/public/city.html:6` |
|
|
@@ -1609,6 +1609,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1609
1609
|
| `515ac3e721ee` | certain | What would help someone scope this or finish it? | `modules/hall-ui/public/notes-panel.js:68` |
|
|
1610
1610
|
| `1d5bfd09068c` | certain | What you saw | `modules/hall-ui/public/studio.js:196` |
|
|
1611
1611
|
| `470de13e9ef7` | certain | What your agent reads first | `modules/hall-ui/public/my-agents.html:70` |
|
|
1612
|
+
| `41d9ab42e41d` | certain | What your stages left behind. Edit any of them at any time; it does not reopen the stage. | `modules/hall-ui/public/genesis-home.js:264` |
|
|
1612
1613
|
| `a9e95b5fda1d` | certain | What {…} offers | `modules/hall-ui/public/speciality-tools.js:296` |
|
|
1613
1614
|
| `b8743d16eab8` | certain | What {…} unlocks | `modules/hall-ui/public/hall-render.js:83` |
|
|
1614
1615
|
| `338673475642` | certain | What's new | `modules/hall-ui/public/update-pill.js:295` |
|
package/docs/copy-registry.json
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
"generator": "scripts/bongos/copy-inventory.js",
|
|
4
4
|
"goal": 1000074,
|
|
5
5
|
"counts": {
|
|
6
|
-
"strings":
|
|
7
|
-
"unique_ids":
|
|
8
|
-
"certain":
|
|
6
|
+
"strings": 3202,
|
|
7
|
+
"unique_ids": 2530,
|
|
8
|
+
"certain": 3202,
|
|
9
9
|
"heuristic": 0,
|
|
10
10
|
"duplicate_ids": 270
|
|
11
11
|
},
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"builders-hall": {
|
|
14
14
|
"at": "modules/hall-ui/public",
|
|
15
15
|
"files": 181,
|
|
16
|
-
"strings":
|
|
16
|
+
"strings": 2069
|
|
17
17
|
},
|
|
18
18
|
"status-dashboard": {
|
|
19
19
|
"at": "modules/status-ui/public",
|
|
@@ -943,9 +943,9 @@
|
|
|
943
943
|
"text": "Open the Board Room",
|
|
944
944
|
"occurrences": 3,
|
|
945
945
|
"at": [
|
|
946
|
-
"modules/hall-ui/public/genesis-home.js:
|
|
947
|
-
"modules/hall-ui/public/genesis-home.js:
|
|
948
|
-
"modules/hall-ui/public/genesis-home.js:
|
|
946
|
+
"modules/hall-ui/public/genesis-home.js:283",
|
|
947
|
+
"modules/hall-ui/public/genesis-home.js:288",
|
|
948
|
+
"modules/hall-ui/public/genesis-home.js:326"
|
|
949
949
|
]
|
|
950
950
|
},
|
|
951
951
|
{
|
|
@@ -5289,7 +5289,7 @@
|
|
|
5289
5289
|
"surface": "builders-hall",
|
|
5290
5290
|
"text": "Close this stage",
|
|
5291
5291
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
5292
|
-
"line":
|
|
5292
|
+
"line": 291,
|
|
5293
5293
|
"origin": "js-markup",
|
|
5294
5294
|
"confidence": "certain"
|
|
5295
5295
|
},
|
|
@@ -5424,7 +5424,7 @@
|
|
|
5424
5424
|
"surface": "builders-hall",
|
|
5425
5425
|
"text": "Confirm this stage",
|
|
5426
5426
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
5427
|
-
"line":
|
|
5427
|
+
"line": 282,
|
|
5428
5428
|
"origin": "js-markup",
|
|
5429
5429
|
"confidence": "certain"
|
|
5430
5430
|
},
|
|
@@ -6855,7 +6855,7 @@
|
|
|
6855
6855
|
"surface": "builders-hall",
|
|
6856
6856
|
"text": "Enter the builders’ hall",
|
|
6857
6857
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
6858
|
-
"line":
|
|
6858
|
+
"line": 336,
|
|
6859
6859
|
"origin": "js-markup",
|
|
6860
6860
|
"confidence": "certain"
|
|
6861
6861
|
},
|
|
@@ -6945,7 +6945,7 @@
|
|
|
6945
6945
|
"surface": "builders-hall",
|
|
6946
6946
|
"text": "Every room in the hall is open now. The founding builders keep their mark for good.",
|
|
6947
6947
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
6948
|
-
"line":
|
|
6948
|
+
"line": 335,
|
|
6949
6949
|
"origin": "js-markup",
|
|
6950
6950
|
"confidence": "certain"
|
|
6951
6951
|
},
|
|
@@ -7174,12 +7174,21 @@
|
|
|
7174
7174
|
"origin": "html-text",
|
|
7175
7175
|
"confidence": "certain"
|
|
7176
7176
|
},
|
|
7177
|
+
{
|
|
7178
|
+
"id": "d320e778ed17",
|
|
7179
|
+
"surface": "builders-hall",
|
|
7180
|
+
"text": "Finish every task above and this stage moves on by itself.",
|
|
7181
|
+
"file": "modules/hall-ui/public/genesis-home.js",
|
|
7182
|
+
"line": 294,
|
|
7183
|
+
"origin": "js-markup",
|
|
7184
|
+
"confidence": "certain"
|
|
7185
|
+
},
|
|
7177
7186
|
{
|
|
7178
7187
|
"id": "f3c56ef0d809",
|
|
7179
7188
|
"surface": "builders-hall",
|
|
7180
7189
|
"text": "Finish every task above, then put this stage to the board.",
|
|
7181
7190
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
7182
|
-
"line":
|
|
7191
|
+
"line": 295,
|
|
7183
7192
|
"origin": "js-markup",
|
|
7184
7193
|
"confidence": "certain"
|
|
7185
7194
|
},
|
|
@@ -8731,15 +8740,6 @@
|
|
|
8731
8740
|
"origin": "js-markup",
|
|
8732
8741
|
"confidence": "certain"
|
|
8733
8742
|
},
|
|
8734
|
-
{
|
|
8735
|
-
"id": "e14ebcf3eec5",
|
|
8736
|
-
"surface": "builders-hall",
|
|
8737
|
-
"text": "Legislation has passed. Genesis is complete.",
|
|
8738
|
-
"file": "modules/hall-ui/public/genesis-home.js",
|
|
8739
|
-
"line": 250,
|
|
8740
|
-
"origin": "js-markup",
|
|
8741
|
-
"confidence": "certain"
|
|
8742
|
-
},
|
|
8743
8743
|
{
|
|
8744
8744
|
"id": "d6a78b9e5368",
|
|
8745
8745
|
"surface": "builders-hall",
|
|
@@ -11229,7 +11229,7 @@
|
|
|
11229
11229
|
"surface": "builders-hall",
|
|
11230
11230
|
"text": "Open the Board Room",
|
|
11231
11231
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
11232
|
-
"line":
|
|
11232
|
+
"line": 283,
|
|
11233
11233
|
"origin": "js-markup",
|
|
11234
11234
|
"confidence": "certain"
|
|
11235
11235
|
},
|
|
@@ -11238,7 +11238,7 @@
|
|
|
11238
11238
|
"surface": "builders-hall",
|
|
11239
11239
|
"text": "Open the Board Room",
|
|
11240
11240
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
11241
|
-
"line":
|
|
11241
|
+
"line": 288,
|
|
11242
11242
|
"origin": "js-markup",
|
|
11243
11243
|
"confidence": "certain"
|
|
11244
11244
|
},
|
|
@@ -11247,7 +11247,7 @@
|
|
|
11247
11247
|
"surface": "builders-hall",
|
|
11248
11248
|
"text": "Open the Board Room",
|
|
11249
11249
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
11250
|
-
"line":
|
|
11250
|
+
"line": 326,
|
|
11251
11251
|
"origin": "js-markup",
|
|
11252
11252
|
"confidence": "certain"
|
|
11253
11253
|
},
|
|
@@ -12057,7 +12057,7 @@
|
|
|
12057
12057
|
"surface": "builders-hall",
|
|
12058
12058
|
"text": "Put it to the board again",
|
|
12059
12059
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
12060
|
-
"line":
|
|
12060
|
+
"line": 287,
|
|
12061
12061
|
"origin": "js-markup",
|
|
12062
12062
|
"confidence": "certain"
|
|
12063
12063
|
},
|
|
@@ -14559,7 +14559,7 @@
|
|
|
14559
14559
|
"surface": "builders-hall",
|
|
14560
14560
|
"text": "The board sent this stage back. Read why in the Board Room, then put it up again.",
|
|
14561
14561
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
14562
|
-
"line":
|
|
14562
|
+
"line": 286,
|
|
14563
14563
|
"origin": "js-markup",
|
|
14564
14564
|
"confidence": "certain"
|
|
14565
14565
|
},
|
|
@@ -16885,6 +16885,15 @@
|
|
|
16885
16885
|
"origin": "html-text",
|
|
16886
16886
|
"confidence": "certain"
|
|
16887
16887
|
},
|
|
16888
|
+
{
|
|
16889
|
+
"id": "41d9ab42e41d",
|
|
16890
|
+
"surface": "builders-hall",
|
|
16891
|
+
"text": "What your stages left behind. Edit any of them at any time; it does not reopen the stage.",
|
|
16892
|
+
"file": "modules/hall-ui/public/genesis-home.js",
|
|
16893
|
+
"line": 264,
|
|
16894
|
+
"origin": "js-markup",
|
|
16895
|
+
"confidence": "certain"
|
|
16896
|
+
},
|
|
16888
16897
|
{
|
|
16889
16898
|
"id": "a9e95b5fda1d",
|
|
16890
16899
|
"surface": "builders-hall",
|
|
@@ -3474,5 +3474,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
3474
3474
|
landed since 1.25.16 with no explicit bump. run 43506364199. (task 1002620)
|
|
3475
3475
|
1.25.18 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3476
3476
|
landed since 1.25.17 with no explicit bump. run 43517532785. (task 1002620)
|
|
3477
|
+
1.25.19 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3478
|
+
landed since 1.25.18 with no explicit bump. run 43520229236. (task 1002620)
|
|
3477
3479
|
---------------------------------------------------------------------------
|
|
3478
3480
|
```
|
package/docs/page-readings.json
CHANGED
|
@@ -954,7 +954,7 @@
|
|
|
954
954
|
"surface": "builders",
|
|
955
955
|
"title": "Builders' Hall",
|
|
956
956
|
"states_read": ["home","out","founding","genesis","decide","demo","votes"],
|
|
957
|
-
"files_hash": "
|
|
957
|
+
"files_hash": "87b88299aa07eacf",
|
|
958
958
|
"reading_hash": "c5f4986bd90e2a2a",
|
|
959
959
|
"counts": {"lines":29,"placed":8,"shared":8,"unplaced":13},
|
|
960
960
|
"omitted": {"data":4},
|
|
@@ -241,13 +241,36 @@
|
|
|
241
241
|
return '<section class="genesis__now" aria-labelledby="genesis-now-h">'
|
|
242
242
|
+ '<h3 id="genesis-now-h" class="genesis__now-h">This stage’s work · ' + esc(s.label) + '</h3>'
|
|
243
243
|
+ '<p class="genesis__note">Done when: ' + esc(s.done_when) + '</p>'
|
|
244
|
-
+ tasks + closeHtml(g, s, viewerId) + '</section>';
|
|
244
|
+
+ movedHtml(g) + tasks + closeHtml(g, s, viewerId) + documentsHtml(g) + '</section>';
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// task 1005115: with no Board Room a finished stage moves on by itself, so say plainly
|
|
248
|
+
// that it did and which rooms woke.
|
|
249
|
+
function movedHtml(g) {
|
|
250
|
+
var m = g.moved;
|
|
251
|
+
if (!m || g.board_room !== false) return '';
|
|
252
|
+
var from = (g.stages.find(function (x) { return x.key === m.from; }) || {}).label || m.from;
|
|
253
|
+
var opened = (m.opened || []).map(function (id) { return ROOM[id] || id; });
|
|
254
|
+
return '<p class="genesis__note" data-genesis-moved>' + esc(from) + ' is done, so this stage opened by itself.'
|
|
255
|
+
+ esc(opened.length ? ' Now open: ' + opened.join(', ') + '.' : '') + '</p>';
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// task 1005115: what each stage left behind, in place. Editable any time without
|
|
259
|
+
// reopening the stage; until the hall's editor lands (task 1005285) the founder edits
|
|
260
|
+
// it through their AI session or the command shown.
|
|
261
|
+
function documentsHtml(g) {
|
|
262
|
+
var docs = g.stages.filter(function (s) { return s.document && s.document.filled; });
|
|
263
|
+
if (!docs.length) return '';
|
|
264
|
+
return '<div class="genesis__docs" data-genesis-docs><p class="genesis__note">What your stages left behind. Edit any of them at any time; it does not reopen the stage.</p><ul>'
|
|
265
|
+
+ docs.map(function (s) {
|
|
266
|
+
return '<li><b>' + esc(s.document.title) + '</b> · <code>npx bongos genesis document ' + esc(s.key) + '</code></li>';
|
|
267
|
+
}).join('') + '</ul></div>';
|
|
245
268
|
}
|
|
246
269
|
|
|
247
270
|
// Who the close is waiting on, and the one door the viewer has (spec D7).
|
|
248
271
|
function closeHtml(g, s, viewerId) {
|
|
249
272
|
if (g.can_come_alive) {
|
|
250
|
-
return '<div class="genesis__doors"><p class="genesis__note">Legislation has passed. Genesis is complete.</p>'
|
|
273
|
+
return '<div class="genesis__doors"><p class="genesis__note">' + (g.board_room === false ? 'Every legislation task is finished.' : 'Legislation has passed.') + ' Genesis is complete.</p>'
|
|
251
274
|
+ '<button type="button" class="btn-accent" data-genesis-alive>Bring ' + esc(projectName()) + ' to life</button></div>';
|
|
252
275
|
}
|
|
253
276
|
var b = s.board;
|
|
@@ -267,7 +290,9 @@
|
|
|
267
290
|
if (g.can_close) {
|
|
268
291
|
return '<div class="genesis__doors"><button type="button" class="btn-accent" data-genesis-close="' + esc(s.key) + '">Close this stage</button></div>';
|
|
269
292
|
}
|
|
270
|
-
return
|
|
293
|
+
return g.board_room === false
|
|
294
|
+
? '<p class="genesis__note">Finish every task above and this stage moves on by itself.</p>'
|
|
295
|
+
: '<p class="genesis__note">Finish every task above, then put this stage to the board.</p>';
|
|
271
296
|
}
|
|
272
297
|
|
|
273
298
|
// ── every stage vote waiting on the viewer, in one place (task 1005199) ──────
|
|
@@ -27,6 +27,15 @@
|
|
|
27
27
|
// as `board.genesis_stage.passed` (the route factory listens), and every read
|
|
28
28
|
// reconciles again, so a missed nudge cannot strand a stage.
|
|
29
29
|
//
|
|
30
|
+
// WITH NO BOARD ROOM (task 1005115; owner, 2026-11-07: "I would automatically proceed").
|
|
31
|
+
// A project without the government module has nobody to put a stage to, so a stage
|
|
32
|
+
// whose tasks are all finished moves on BY ITSELF — reconcile does it, on every read and
|
|
33
|
+
// on every ship — and the view says so (`moved`: from, to, what woke). There is no
|
|
34
|
+
// close button to press on that path. Where there IS a Board Room the sitting stays:
|
|
35
|
+
// a team deciding together is not the same act as a solo founder acknowledging their
|
|
36
|
+
// own work. Either way, each stage leaves a DOCUMENT behind (genesis-work.js
|
|
37
|
+
// documentOf) that the founder can edit at any time without reopening the stage.
|
|
38
|
+
//
|
|
30
39
|
// THE BOUNDARY. Core through ../../src/module-api.js; the lifecycle and government
|
|
31
40
|
// modules through their ports only (resolveOptional), never a require.
|
|
32
41
|
|
|
@@ -158,7 +167,11 @@ function taskState(t) {
|
|
|
158
167
|
// task, named in `waits_on`) or 'open' — decided here, never re-derived in a browser.
|
|
159
168
|
// board { stage: genesisStageStatus row } or {}
|
|
160
169
|
// stageAt { stage: ISO } — when each stage began, for its due date
|
|
161
|
-
|
|
170
|
+
// boardRoom false on a project with no government module: stages advance by
|
|
171
|
+
// themselves, so nothing is ever "closable" and the alive door opens on
|
|
172
|
+
// finished legislation tasks (task 1005115)
|
|
173
|
+
// documents { stage: { title, filled, updated_at, editable } } from genesis-work.js
|
|
174
|
+
function shapeGenesis({ mode, plan, tasks = {}, board = {}, stageAt = {}, boardRoom = true, documents = {} }) {
|
|
162
175
|
const at = fm.STAGES.indexOf(mode.stage);
|
|
163
176
|
const stages = PROPER.map((key) => {
|
|
164
177
|
const info = STAGE_INFO[key];
|
|
@@ -190,7 +203,10 @@ function shapeGenesis({ mode, plan, tasks = {}, board = {}, stageAt = {} }) {
|
|
|
190
203
|
total: list.length,
|
|
191
204
|
// task 1005199: this stage (the current one or any later one) can be put to
|
|
192
205
|
// the Board Room now — its tasks are all finished and it is not already there.
|
|
193
|
-
can_close: at >= 1 && idx >= at && allFinished && !onBoard,
|
|
206
|
+
can_close: boardRoom && at >= 1 && idx >= at && allFinished && !onBoard,
|
|
207
|
+
// What this stage left behind (task 1005115): null where the store is not read.
|
|
208
|
+
document: documents[key] || null,
|
|
209
|
+
all_finished: allFinished,
|
|
194
210
|
board: b ? {
|
|
195
211
|
state: b.state, item_id: b.item_id || null, needs: b.needs || null,
|
|
196
212
|
one_vote_decides: !!b.one_vote_decides, waiting_on: b.waiting_on || [],
|
|
@@ -200,6 +216,14 @@ function shapeGenesis({ mode, plan, tasks = {}, board = {}, stageAt = {} }) {
|
|
|
200
216
|
const now = stages.find((s) => s.state === 'now') || null;
|
|
201
217
|
const sitting = now && now.board && now.board.state === 'sitting';
|
|
202
218
|
const passed = now && now.board && now.board.state === 'passed';
|
|
219
|
+
// The last move, so a presentation can say plainly that it happened and what opened
|
|
220
|
+
// (task 1005115). Derived from the stage stamps, never stored twice.
|
|
221
|
+
const prev = at >= 2 ? fm.STAGES[at - 1] : null;
|
|
222
|
+
const moved = prev && stageAt[mode.stage] ? {
|
|
223
|
+
from: prev, to: mode.stage, at: stageAt[mode.stage],
|
|
224
|
+
how: boardRoom ? 'board_passed' : 'tasks_finished',
|
|
225
|
+
opened: fm.WAKES[prev] || [],
|
|
226
|
+
} : null;
|
|
203
227
|
return {
|
|
204
228
|
stage: mode.stage,
|
|
205
229
|
stage_number: mode.stage_number,
|
|
@@ -211,9 +235,12 @@ function shapeGenesis({ mode, plan, tasks = {}, board = {}, stageAt = {} }) {
|
|
|
211
235
|
demo: plan && plan.demo ? plan.demo : null,
|
|
212
236
|
stages,
|
|
213
237
|
// The close door: every task of the current stage finished, and not already sitting.
|
|
214
|
-
can_close: !!(now && now.total > 0 && now.finished === now.total && !sitting && !passed),
|
|
215
|
-
// Alive: the last stage has passed its sitting
|
|
216
|
-
|
|
238
|
+
can_close: !!(boardRoom && now && now.total > 0 && now.finished === now.total && !sitting && !passed),
|
|
239
|
+
// Alive: the last stage has passed its sitting — or, with no Board Room, its tasks
|
|
240
|
+
// are all finished.
|
|
241
|
+
can_come_alive: !!(now && now.key === 'legislation' && (boardRoom ? passed : now.total > 0 && now.finished === now.total)),
|
|
242
|
+
board_room: boardRoom,
|
|
243
|
+
moved,
|
|
217
244
|
};
|
|
218
245
|
}
|
|
219
246
|
|
|
@@ -226,9 +253,18 @@ function seams(deps = {}) {
|
|
|
226
253
|
set: deps.setSetting || api.projectSettings.set,
|
|
227
254
|
lifecycle: deps.lifecycle !== undefined ? deps.lifecycle : api.resolveOptional('lifecycle.kickoffSeed'),
|
|
228
255
|
government: deps.government !== undefined ? deps.government : api.resolveOptional('government'),
|
|
256
|
+
// Each stage's document summary (task 1005115): the founder's store unless injected.
|
|
257
|
+
// Fails soft in readGenesis, so a hall without the tables still renders.
|
|
258
|
+
documents: deps.documents !== undefined ? deps.documents : () => require('./genesis-work').readDocuments(),
|
|
229
259
|
now: deps.now,
|
|
230
260
|
};
|
|
231
261
|
}
|
|
262
|
+
|
|
263
|
+
// hasBoardRoom(gov) — can a stage be put to a sitting at all? Without one a finished
|
|
264
|
+
// stage advances by itself (task 1005115).
|
|
265
|
+
const hasBoardRoom = (gov) => !!(gov && (typeof gov.closeGenesisStage === 'function'
|
|
266
|
+
|| typeof gov.openGenesisStageClose === 'function'));
|
|
267
|
+
const allDone = (list) => !!(list && list.length && list.every((t) => FINISHED.includes(t.status)));
|
|
232
268
|
const modeDeps = (s) => ({ getSetting: s.get, setSetting: s.set, government: s.government, now: s.now });
|
|
233
269
|
|
|
234
270
|
async function boardByStage(gov) {
|
|
@@ -245,6 +281,15 @@ async function boardByStage(gov) {
|
|
|
245
281
|
async function reconcile(s) {
|
|
246
282
|
let mode = await fm.foundingModeFor(modeDeps(s));
|
|
247
283
|
if (!mode || !PROPER.includes(mode.stage) || mode.stage === 'legislation') return mode;
|
|
284
|
+
if (!hasBoardRoom(s.government)) {
|
|
285
|
+
// No Board Room: finished work IS the decision (task 1005115). Move past every
|
|
286
|
+
// stage whose tasks are all finished, in order; legislation waits for the alive door.
|
|
287
|
+
const all = s.lifecycle && typeof s.lifecycle.genesisTasks === 'function' ? await s.lifecycle.genesisTasks() : {};
|
|
288
|
+
while (mode && PROPER.includes(mode.stage) && mode.stage !== 'legislation' && allDone(all[mode.stage])) {
|
|
289
|
+
mode = await fm.setFoundingMode({ stage: fm.STAGES[fm.STAGES.indexOf(mode.stage) + 1] }, null, modeDeps(s));
|
|
290
|
+
}
|
|
291
|
+
return mode;
|
|
292
|
+
}
|
|
248
293
|
const board = await boardByStage(s.government);
|
|
249
294
|
while (mode && PROPER.includes(mode.stage) && mode.stage !== 'legislation'
|
|
250
295
|
&& board[mode.stage] && board[mode.stage].state === 'passed') {
|
|
@@ -268,7 +313,11 @@ async function readGenesis(deps = {}) {
|
|
|
268
313
|
const row = await s.get(fm.stageAtKey(key));
|
|
269
314
|
if (row && row.value) stageAt[key] = row.value;
|
|
270
315
|
}
|
|
271
|
-
|
|
316
|
+
let documents = {};
|
|
317
|
+
if (typeof s.documents === 'function') {
|
|
318
|
+
try { documents = (await s.documents()) || {}; } catch (_) { documents = {}; } // the home still renders without them
|
|
319
|
+
}
|
|
320
|
+
return shapeGenesis({ mode, plan, tasks, board, stageAt, boardRoom: hasBoardRoom(s.government), documents });
|
|
272
321
|
}
|
|
273
322
|
|
|
274
323
|
// startFounding — a brand-new project enters genesis (founding-birth.js calls this once
|
|
@@ -403,6 +452,13 @@ async function closeStage(stageKey, builderId, deps = {}) {
|
|
|
403
452
|
// stage's pass waits for the earlier ones. A stage already behind, or the decide
|
|
404
453
|
// pre-stage, is still refused.
|
|
405
454
|
if (!PROPER.includes(stageKey)) return { ok: false, reason: 'unknown_stage' };
|
|
455
|
+
// No Board Room (task 1005115): the stage already moved on by itself when its tasks
|
|
456
|
+
// finished, so asking to close it again is answered with what happened, not refused.
|
|
457
|
+
if (!hasBoardRoom(s.government) && PROPER.includes(mode.stage)
|
|
458
|
+
&& fm.STAGES.indexOf(stageKey) < fm.STAGES.indexOf(mode.stage)) {
|
|
459
|
+
// next_stage is where the project IS now, which may be several stages on.
|
|
460
|
+
return { ok: true, closed: true, stage: stageKey, next_stage: mode.stage, item_id: null, confirm: null, already: true };
|
|
461
|
+
}
|
|
406
462
|
if (!PROPER.includes(mode.stage) || fm.STAGES.indexOf(stageKey) < fm.STAGES.indexOf(mode.stage)) {
|
|
407
463
|
return { ok: false, reason: 'not_current_stage', stage: mode.stage };
|
|
408
464
|
}
|
|
@@ -546,7 +602,12 @@ async function putFinishedStages(deps = {}) {
|
|
|
546
602
|
// stage; on a project that is not founding this costs the one genesis.enabled read.
|
|
547
603
|
// Best-effort: the founder's own close button is still there if this misses.
|
|
548
604
|
async function onTaskShipped(deps = {}) {
|
|
549
|
-
try {
|
|
605
|
+
try {
|
|
606
|
+
const s = seams(deps);
|
|
607
|
+
// No Board Room: the ship that finishes a stage moves the project on (task 1005115).
|
|
608
|
+
if (!hasBoardRoom(s.government)) { await reconcile(s); return []; }
|
|
609
|
+
return await putFinishedStages(deps);
|
|
610
|
+
} catch (_) { return []; }
|
|
550
611
|
}
|
|
551
612
|
|
|
552
613
|
module.exports = {
|
|
@@ -260,6 +260,73 @@ function contextMarkdown(stages) {
|
|
|
260
260
|
...out].join('\n').trimEnd() + '\n';
|
|
261
261
|
}
|
|
262
262
|
|
|
263
|
+
// ── each stage's DOCUMENT (task 1005115) ──────────────────────────────────────
|
|
264
|
+
// A finished stage leaves something behind the founder can come back to: the scope, the
|
|
265
|
+
// strategy, the charter … It is NOT a second store. The document IS the stage's record
|
|
266
|
+
// above (its answers, its free page, its link) read as one named page, so editing it is
|
|
267
|
+
// editing those, through the same writes, by the same person. It stays editable after
|
|
268
|
+
// the stage moves on, and editing it never reopens the stage or undoes anything: the
|
|
269
|
+
// stage's progress is founding-mode's, and nothing here reads or writes it.
|
|
270
|
+
const DOCUMENT_TITLES = Object.freeze({
|
|
271
|
+
scope: 'The scope', strategize: 'The strategy', charter: 'The charter',
|
|
272
|
+
legalize: 'The rewards', legislation: 'The voting rules',
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
// documentOf(shape) → the stage's document: its title, whether anything is in it yet,
|
|
276
|
+
// and the founder's words as markdown. Each part names the write that edits it, so a
|
|
277
|
+
// presentation (the game's district, the hall) never has to know the store.
|
|
278
|
+
// The markdown is the founder's raw words, unescaped: a reader shows it as text or through
|
|
279
|
+
// an escaping markdown renderer, never as HTML.
|
|
280
|
+
function documentOf(s) {
|
|
281
|
+
const said = s.questions.filter((q) => q.answer);
|
|
282
|
+
const lines = [`# ${DOCUMENT_TITLES[s.stage]}`, ''];
|
|
283
|
+
let group = null;
|
|
284
|
+
for (const q of said) {
|
|
285
|
+
if (q.group && q.group !== group) { group = q.group; lines.push(`## ${group}`, ''); }
|
|
286
|
+
const a = q.answer;
|
|
287
|
+
const body = a.state === 'answered' ? (a.choice_label || a.text) : `${STATE_WORDS[a.state]}${a.text ? ` — ${a.text}` : ''}`;
|
|
288
|
+
lines.push(`**${q.ask}**${ORIGIN_WORDS[a.origin] || ''}`, '', String(body), '');
|
|
289
|
+
}
|
|
290
|
+
if (s.page) lines.push(said.length ? "## In the founder's own words" : '', '', s.page, '');
|
|
291
|
+
if (s.link) lines.push(`The founder's existing document: ${s.link}`, '');
|
|
292
|
+
const filled = said.length > 0 || !!s.page || !!s.link;
|
|
293
|
+
return {
|
|
294
|
+
stage: s.stage,
|
|
295
|
+
title: DOCUMENT_TITLES[s.stage],
|
|
296
|
+
filled,
|
|
297
|
+
markdown: filled ? lines.join('\n').replace(/\n{3,}/g, '\n\n').trimEnd() + '\n' : '',
|
|
298
|
+
counts: s.counts,
|
|
299
|
+
updated_at: latest([s.updated_at, ...said.map((q) => q.answer.updated_at)]),
|
|
300
|
+
// Editing never reopens the stage. Task 1005107 narrows this for a stage the Board
|
|
301
|
+
// Room passed; until then every document is open to its author.
|
|
302
|
+
editable: true,
|
|
303
|
+
edit: {
|
|
304
|
+
answer: `PUT /api/bongos/founding/work/${s.stage}/answers/:question`,
|
|
305
|
+
page: `PUT /api/bongos/founding/work/${s.stage}/page`,
|
|
306
|
+
link: `PUT /api/bongos/founding/work/${s.stage}/link`,
|
|
307
|
+
},
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const latest = (isos) => isos.filter(Boolean).sort().at(-1) || null;
|
|
312
|
+
|
|
313
|
+
async function readDocument(stage, deps = {}) {
|
|
314
|
+
const r = await readStage(stage, deps);
|
|
315
|
+
if (!r.ok) return r;
|
|
316
|
+
return { ok: true, document: documentOf(r.work) };
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// readDocuments(deps) → { stage: { title, filled, updated_at } } — the light summary the
|
|
320
|
+
// genesis home carries per stage, so the page shows each stage's document in place.
|
|
321
|
+
async function readDocuments(deps = {}) {
|
|
322
|
+
const out = {};
|
|
323
|
+
for (const s of await readAll(deps)) {
|
|
324
|
+
const d = documentOf(s);
|
|
325
|
+
out[s.stage] = { title: d.title, filled: d.filled, updated_at: d.updated_at, editable: d.editable };
|
|
326
|
+
}
|
|
327
|
+
return out;
|
|
328
|
+
}
|
|
329
|
+
|
|
263
330
|
// assistPrompt(stage) → the brief the founder hands their own AI session for the
|
|
264
331
|
// assisted door. It works the stage's own questions (never a shape of its own),
|
|
265
332
|
// argues rather than authors, and records only what the founder decides.
|
|
@@ -480,5 +547,6 @@ async function readContext(deps = {}) {
|
|
|
480
547
|
// and are exercised through the operations (tests/genesis_work.mjs).
|
|
481
548
|
module.exports = {
|
|
482
549
|
STAGES, LIMITS, QUESTIONS, assistPrompt,
|
|
550
|
+
readDocument, readDocuments,
|
|
483
551
|
pgStore, readAll, readStage, setDoor, setPage, setLink, setAnswer, clearAnswer, answerHistory, readContext,
|
|
484
552
|
};
|
|
@@ -41,6 +41,9 @@ module.exports = function mountGenesisWorkRoutes(router, deps = {}) {
|
|
|
41
41
|
router.get('/founding/work', api.requireBuilder, handle(async () => ({ stages: await work.readAll(deps) })));
|
|
42
42
|
router.get('/founding/context', api.requireBuilder, handle(() => work.readContext(deps)));
|
|
43
43
|
router.get('/founding/work/:stage', api.requireBuilder, handle((req) => work.readStage(stage(req), deps)));
|
|
44
|
+
// The stage's document (task 1005115): its record read as one named page, editable
|
|
45
|
+
// through the writes below at any time, without reopening the stage.
|
|
46
|
+
router.get('/founding/work/:stage/document', api.requireBuilder, handle((req) => work.readDocument(stage(req), deps)));
|
|
44
47
|
router.get('/founding/work/:stage/assist', api.requireBuilder, handle(async (req) => {
|
|
45
48
|
const prompt = work.assistPrompt(stage(req));
|
|
46
49
|
return prompt ? { prompt } : { ok: false, reason: 'unknown_stage' };
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.25.
|
|
3
|
+
"version": "1.25.19",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.25.
|
|
9
|
+
"version": "1.25.19",
|
|
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.25.
|
|
3
|
+
"version": "1.25.19",
|
|
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
|
@@ -11852,5 +11852,11 @@
|
|
|
11852
11852
|
"id": "1004571",
|
|
11853
11853
|
"text": "Inside a project's hall, the options menu now shows where the project's app runs (no platform yet, or Render and its progress and address), and gives the owner a one-click way to connect Render."
|
|
11854
11854
|
}
|
|
11855
|
+
],
|
|
11856
|
+
"1.25.19": [
|
|
11857
|
+
{
|
|
11858
|
+
"id": "1005115",
|
|
11859
|
+
"text": "A solo founder's Genesis now moves to the next stage by itself when a stage's work is finished, and every stage leaves a named document (the scope, the strategy...) they can come back and edit any time."
|
|
11860
|
+
}
|
|
11855
11861
|
]
|
|
11856
11862
|
}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
//
|
|
12
12
|
// Usage:
|
|
13
13
|
// npx bongos genesis show [stage] every stage, or one, with its answers
|
|
14
|
+
// npx bongos genesis document <stage> the stage's document (task 1005115): what it left behind, editable any time
|
|
14
15
|
// npx bongos genesis context what the founder said, as markdown (for planning sessions)
|
|
15
16
|
// npx bongos genesis assist <stage> the brief for the founder's AI session (the assisted door)
|
|
16
17
|
// npx bongos genesis answer <stage> <question> "<words>" [--origin founder|assisted]
|
|
@@ -28,7 +29,7 @@
|
|
|
28
29
|
const fs = require('node:fs');
|
|
29
30
|
const { apiCall, requireSession, errCode, cliExit } = require('./cli-lib');
|
|
30
31
|
|
|
31
|
-
const USAGE = 'usage: npx bongos genesis show [stage] | context | assist <stage> | answer <stage> <question> "<words>" [--origin founder|assisted] | answer <stage> <question> --not-sure|--skip ["why"] | clear <stage> <question> | history <stage> <question> | door <stage> guided|open|assisted | page <stage> "<words>"|--file <path>|--remove | link <stage> <url>|--remove';
|
|
32
|
+
const USAGE = 'usage: npx bongos genesis show [stage] | context | document <stage> | assist <stage> | answer <stage> <question> "<words>" [--origin founder|assisted] | answer <stage> <question> --not-sure|--skip ["why"] | clear <stage> <question> | history <stage> <question> | door <stage> guided|open|assisted | page <stage> "<words>"|--file <path>|--remove | link <stage> <url>|--remove';
|
|
32
33
|
|
|
33
34
|
const STATE_LABEL = { answered: '', not_sure: '[not sure yet] ', skipped: '[skipped] ' };
|
|
34
35
|
const ORIGIN_LABEL = { assisted: ' (with AI help)', carried_over: ' (carried over — confirm or edit)' };
|
|
@@ -130,6 +131,12 @@ async function main(argv) {
|
|
|
130
131
|
return 0;
|
|
131
132
|
}
|
|
132
133
|
if (!stage) { console.error(USAGE); return 2; }
|
|
134
|
+
if (cmd === 'document') {
|
|
135
|
+
const d = await call('GET', `/founding/work/${enc(stage)}/document`, null, 'read the document');
|
|
136
|
+
if (!d) return 1;
|
|
137
|
+
console.log(d.document.markdown || `${d.document.title}: nothing written yet.`);
|
|
138
|
+
return 0;
|
|
139
|
+
}
|
|
133
140
|
if (cmd === 'assist') {
|
|
134
141
|
const d = await call('GET', `/founding/work/${enc(stage)}/assist`, null, 'build the brief');
|
|
135
142
|
if (!d) return 1;
|
package/src/module-api.js
CHANGED
|
@@ -81,7 +81,7 @@ const { sleep } = require('./sleep');
|
|
|
81
81
|
// MAJOR (see allowBoxScope below): passes the request through untouched.
|
|
82
82
|
function deprecatedNoopMiddleware(_req, _res, next) { next(); }
|
|
83
83
|
|
|
84
|
-
const CORE_VERSION = '1.25.
|
|
84
|
+
const CORE_VERSION = '1.25.19'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
85
85
|
|
|
86
86
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
87
87
|
// Usage: const log = api.logger('discord'); log.info('mounted');
|
package/tests/genesis_home.mjs
CHANGED
|
@@ -226,7 +226,7 @@ function world({ withGovernment = true } = {}) {
|
|
|
226
226
|
const deps = () => ({
|
|
227
227
|
getSetting: async (k) => (store.has(k) ? { key: k, value: store.get(k) } : null),
|
|
228
228
|
setSetting: async (k, v) => { store.set(k, String(v)); return { key: k, value: String(v) }; },
|
|
229
|
-
lifecycle, government, now,
|
|
229
|
+
lifecycle, government, now, documents: null,
|
|
230
230
|
});
|
|
231
231
|
return {
|
|
232
232
|
store, tasks, board, opened, deps,
|
|
@@ -385,6 +385,67 @@ test('with no Board Room module the founder\'s confirm closes a finished stage',
|
|
|
385
385
|
assert.equal((await gh.readGenesis(w.deps())).stage, 'strategize');
|
|
386
386
|
});
|
|
387
387
|
|
|
388
|
+
test('task 1005115: with no Board Room a finished stage moves on by itself, and the view says so', async () => {
|
|
389
|
+
const w = world({ withGovernment: false });
|
|
390
|
+
await gh.startFounding(1, w.deps());
|
|
391
|
+
await gh.savePlan({}, 1, w.deps());
|
|
392
|
+
let g = await gh.readGenesis(w.deps());
|
|
393
|
+
assert.equal(g.board_room, false);
|
|
394
|
+
assert.equal(g.moved, null, 'nothing has moved past a stage yet');
|
|
395
|
+
w.finish('scope');
|
|
396
|
+
// A ship moves it on; no read and no button needed.
|
|
397
|
+
assert.deepEqual(await gh.onTaskShipped(w.deps()), []);
|
|
398
|
+
assert.equal(w.store.get(fm.KEYS.STAGE), 'strategize', 'the ship that finished scope advanced it');
|
|
399
|
+
g = await gh.readGenesis(w.deps());
|
|
400
|
+
assert.equal(g.stage, 'strategize');
|
|
401
|
+
assert.equal(g.can_close, false, 'there is no close button on this path');
|
|
402
|
+
assert.equal(g.moved.from, 'scope');
|
|
403
|
+
assert.equal(g.moved.to, 'strategize');
|
|
404
|
+
assert.equal(g.moved.how, 'tasks_finished');
|
|
405
|
+
assert.deepEqual(g.moved.opened, fm.WAKES.scope, 'and it names what opened');
|
|
406
|
+
assert.equal(g.stages[0].state, 'done');
|
|
407
|
+
// Every read reconciles too, through several finished stages in order.
|
|
408
|
+
w.finish('strategize'); w.finish('charter');
|
|
409
|
+
g = await gh.readGenesis(w.deps());
|
|
410
|
+
assert.equal(g.stage, 'legalize');
|
|
411
|
+
// Legislation does not pass itself: its finished tasks open the alive door.
|
|
412
|
+
w.finish('legalize'); w.finish('legislation');
|
|
413
|
+
g = await gh.readGenesis(w.deps());
|
|
414
|
+
assert.equal(g.stage, 'legislation');
|
|
415
|
+
assert.equal(g.can_close, false);
|
|
416
|
+
assert.equal(g.can_come_alive, true);
|
|
417
|
+
// The old close call on a stage that already moved answers what happened.
|
|
418
|
+
const again = await gh.closeStage('scope', 1, w.deps());
|
|
419
|
+
assert.equal(again.ok, true);
|
|
420
|
+
assert.equal(again.already, true);
|
|
421
|
+
assert.equal(again.next_stage, 'legislation', 'it names where the project is now, not the stage after scope');
|
|
422
|
+
assert.equal((await gh.comeAlive(1, w.deps())).ok, true);
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
test('task 1005115: with a Board Room nothing moves by itself; the sitting still decides', async () => {
|
|
426
|
+
const w = world();
|
|
427
|
+
await gh.startFounding(1, w.deps());
|
|
428
|
+
await gh.savePlan({}, 1, w.deps());
|
|
429
|
+
w.finish('scope');
|
|
430
|
+
const g = await gh.readGenesis(w.deps());
|
|
431
|
+
assert.equal(g.stage, 'scope');
|
|
432
|
+
assert.equal(g.board_room, true);
|
|
433
|
+
assert.equal(g.can_close, true);
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
test('task 1005115: each stage on the genesis home carries its document', async () => {
|
|
437
|
+
const w = world({ withGovernment: false });
|
|
438
|
+
await gh.startFounding(1, w.deps());
|
|
439
|
+
await gh.savePlan({}, 1, w.deps());
|
|
440
|
+
const documents = async () => ({ scope: { title: 'The scope', filled: true, updated_at: null, editable: true } });
|
|
441
|
+
let g = await gh.readGenesis({ ...w.deps(), documents });
|
|
442
|
+
assert.equal(g.stages[0].document.title, 'The scope');
|
|
443
|
+
assert.equal(g.stages[1].document, null);
|
|
444
|
+
g = await gh.readGenesis({ ...w.deps(), documents: async () => { throw new Error('db down'); } });
|
|
445
|
+
assert.equal(g.stage, 'scope', 'the home still renders when the documents cannot be read');
|
|
446
|
+
assert.equal(g.stages[0].document, null);
|
|
447
|
+
});
|
|
448
|
+
|
|
388
449
|
test('the view: states, wakes, the life plates and a due date from the plan', () => {
|
|
389
450
|
const mode = { stage: 'strategize', stage_number: 2, stage_count: 5, day: 9 };
|
|
390
451
|
const g = gh.shapeGenesis({
|
|
@@ -605,6 +666,25 @@ test('the stage reads as a checklist: done, open and locked, and a locked row of
|
|
|
605
666
|
assert.doesNotMatch(r304, /data-genesis-copy/);
|
|
606
667
|
});
|
|
607
668
|
|
|
669
|
+
test('task 1005115: with no Board Room the card says the stage moved by itself, and lists what each stage left', async () => {
|
|
670
|
+
const genesis = gh.shapeGenesis({
|
|
671
|
+
mode: { stage: 'strategize', stage_number: 2, stage_count: 5, day: 3 },
|
|
672
|
+
plan: { days: {} },
|
|
673
|
+
tasks: { scope: [{ id: '1', title: 'Write the scope', status: 'shipped' }], strategize: [{ id: '2', title: 'Write the strategy', status: 'ready' }] },
|
|
674
|
+
stageAt: { strategize: '2026-10-08T00:00:00Z' },
|
|
675
|
+
boardRoom: false,
|
|
676
|
+
documents: { scope: { title: 'The scope', filled: true, updated_at: null, editable: true }, strategize: { title: 'The strategy', filled: false } },
|
|
677
|
+
});
|
|
678
|
+
const { host } = bootCard({ founding: true, data: { genesis, viewer_id: '1' } });
|
|
679
|
+
await new Promise((r) => setImmediate(r));
|
|
680
|
+
await new Promise((r) => setImmediate(r));
|
|
681
|
+
assert.match(host.innerHTML, /data-genesis-moved>Scope is done, so this stage opened by itself\. Now open: /);
|
|
682
|
+
assert.match(host.innerHTML, /moves on by itself/);
|
|
683
|
+
assert.doesNotMatch(host.innerHTML, /put this stage to the board/, 'no board to put it to');
|
|
684
|
+
assert.match(host.innerHTML, /<b>The scope<\/b>/);
|
|
685
|
+
assert.doesNotMatch(host.innerHTML, /The strategy<\/b>/, 'an empty document is not listed');
|
|
686
|
+
});
|
|
687
|
+
|
|
608
688
|
test('the hall carries the five life plates byte-identical to the world\'s', () => {
|
|
609
689
|
const world = path.join(ROOT, 'modules', 'public-landing', 'public', 'assets', 'world');
|
|
610
690
|
const hall = path.join(ROOT, 'modules', 'hall-ui', 'public', 'genesis');
|
package/tests/genesis_work.mjs
CHANGED
|
@@ -370,6 +370,35 @@ if (import.meta.url === url.pathToFileURL(process.argv[1]).href) {
|
|
|
370
370
|
assert.match(out, /\(empty\)/);
|
|
371
371
|
});
|
|
372
372
|
|
|
373
|
+
await test('task 1005115: a stage\'s document is its record read as one named, editable page', async () => {
|
|
374
|
+
const deps = { store: memStore() };
|
|
375
|
+
let d = (await gw.readDocument('strategize', deps)).document;
|
|
376
|
+
assert.equal(d.title, 'The strategy');
|
|
377
|
+
assert.equal(d.filled, false, 'nothing written yet: an empty document, not a heading');
|
|
378
|
+
assert.equal(d.markdown, '');
|
|
379
|
+
await gw.setAnswer('strategize', 'big_pieces', { text: 'Ledger, then sync' }, 1, deps);
|
|
380
|
+
await gw.setAnswer('strategize', 'risks', { state: 'not_sure', text: 'bank API' }, 1, deps);
|
|
381
|
+
await gw.setPage('strategize', 'We start small.', 1, deps);
|
|
382
|
+
d = (await gw.readDocument('strategize', deps)).document;
|
|
383
|
+
assert.equal(d.filled, true);
|
|
384
|
+
assert.match(d.markdown, /^# The strategy\n/);
|
|
385
|
+
assert.match(d.markdown, /Ledger, then sync/);
|
|
386
|
+
assert.match(d.markdown, /Not sure yet — bank API/);
|
|
387
|
+
assert.match(d.markdown, /We start small\./);
|
|
388
|
+
assert.equal(d.editable, true);
|
|
389
|
+
assert.equal(d.edit.page, 'PUT /api/bongos/founding/work/strategize/page');
|
|
390
|
+
assert.ok(d.updated_at, 'the document says when it last changed');
|
|
391
|
+
// Editing it is editing the record: the same write, seen at once in the document.
|
|
392
|
+
await gw.setAnswer('strategize', 'big_pieces', { text: 'Sync first' }, 1, deps);
|
|
393
|
+
assert.match((await gw.readDocument('strategize', deps)).document.markdown, /Sync first/);
|
|
394
|
+
assert.equal((await gw.readDocument('nope', deps)).reason, 'unknown_stage');
|
|
395
|
+
const all = await gw.readDocuments(deps);
|
|
396
|
+
assert.deepEqual(Object.keys(all), ['scope', 'strategize', 'charter', 'legalize', 'legislation']);
|
|
397
|
+
assert.equal(all.strategize.filled, true);
|
|
398
|
+
assert.equal(all.scope.filled, false);
|
|
399
|
+
assert.equal(all.charter.title, 'The charter');
|
|
400
|
+
});
|
|
401
|
+
|
|
373
402
|
console.log(`\ngenesis_work: ${passed} passed, ${failed} failed`);
|
|
374
403
|
if (failed) process.exit(1);
|
|
375
404
|
}
|
|
@@ -67,6 +67,15 @@ try {
|
|
|
67
67
|
assert.equal(r.data.work.questions.find((q) => q.id === 'big_pieces').answer.text, 'Ledger first.');
|
|
68
68
|
});
|
|
69
69
|
|
|
70
|
+
await test('task 1005115: any builder reads a stage\'s document; an unknown stage is 404', async () => {
|
|
71
|
+
assert.equal((await call('GET', '/founding/work/strategize/document', { as: null })).status, 401);
|
|
72
|
+
const r = await call('GET', '/founding/work/strategize/document', { as: OTHER });
|
|
73
|
+
assert.equal(r.status, 200);
|
|
74
|
+
assert.equal(r.data.document.title, 'The strategy');
|
|
75
|
+
assert.match(r.data.document.markdown, /Ledger first\./, 'the answer written above is in the document');
|
|
76
|
+
assert.equal((await call('GET', '/founding/work/nope/document')).status, 404);
|
|
77
|
+
});
|
|
78
|
+
|
|
70
79
|
await test('a builder who is not the owner cannot write', async () => {
|
|
71
80
|
for (const [m, p, body] of [
|
|
72
81
|
['PUT', '/founding/work/strategize/answers/risks', { text: 'x' }],
|