@bongos/core 1.25.14 → 1.25.15

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 CHANGED
@@ -2,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/bongos/package-core.js",
5
- "core_version": "1.25.14",
6
- "core_contract": "1.25.14",
7
- "source_commit": "c787ea767033e83cc2ef245450a292b99f23d077",
5
+ "core_version": "1.25.15",
6
+ "core_contract": "1.25.15",
7
+ "source_commit": "1b254149590e7e241c7939f99161b110576b5708",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-11-13T20:00:44.555Z",
9
+ "built_at": "2026-11-13T20:17:48.847Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 657,
12
+ "docs_redacted": 658,
13
13
  "agent_docs_stubbed": 33,
14
- "functional_verbatim": 4019,
14
+ "functional_verbatim": 4027,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 4710,
20
- "tree_sha256": "38ceaa985a20dd0efed34bfdebd5fb598d5ebe7c968a3178998e5ed96600bf6c",
19
+ "file_count": 4719,
20
+ "tree_sha256": "f682c64a449d98d37ba0215018176a763264d3bb11d3d90a1abf5cdb5ac8023e",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -327,17 +327,17 @@
327
327
  {
328
328
  "path": "bin/bongos.js",
329
329
  "mode": "0000755",
330
- "sha256": "ad713a00fd44630c460a2cd9c8a2998d8c40117f2de4c4726f5eba81b83d785b"
330
+ "sha256": "b8f304da0098250c62760dcba255fc6cd01850d082d52cf8ae1284eb4bbe02bc"
331
331
  },
332
332
  {
333
333
  "path": "clients/bongos-client/README.md",
334
334
  "mode": "0000644",
335
- "sha256": "443db1b62f84147c42bcbc1d2556e47f90925c2e1fe67107193101ae611d69f4"
335
+ "sha256": "ce4ff25a43869980ffb784024927a73c20805d804ebf31d8b4a6f7fe64a14a7e"
336
336
  },
337
337
  {
338
338
  "path": "clients/bongos-client/bongos-client.global.js",
339
339
  "mode": "0000644",
340
- "sha256": "701b55ca742af38e1fd644a11fc550c992b4c243621a3a66b8b303d988f9bef5"
340
+ "sha256": "c552be01ea8b1ac046ddd144e8416ca63fcf02a6657bf189a1021a5f952897a2"
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": "01eec68e5292a12cb58ddc22e78893c0dd1ef374c4949d8f58486cd86ba3809c"
350
+ "sha256": "b73ce847b707bc562470adf7df24d88e841d9f4d3d18cbbec78a601d49502f86"
351
351
  },
352
352
  {
353
353
  "path": "clients/bongos-client/index.d.ts",
354
354
  "mode": "0000644",
355
- "sha256": "3b5acc8f398f18e7144bd00d4072ec8ab13c049667f531262e97416050e26770"
355
+ "sha256": "0f71811021df44a69be49ff5f6dc42d2d80df6b97019c68b41eecf509135e019"
356
356
  },
357
357
  {
358
358
  "path": "clients/bongos-client/index.mjs",
359
359
  "mode": "0000644",
360
- "sha256": "603986b89a0e4030b3ce590f47d2d2f99e994ca3b596c58a117cb2c08d37f558"
360
+ "sha256": "36e2c1964aacc3e49592ec55f483b8dade28d5f0636a0b64d0c58498b67112cf"
361
361
  },
362
362
  {
363
363
  "path": "clients/bongos-client/package.json",
@@ -2499,20 +2499,25 @@
2499
2499
  "mode": "0000644",
2500
2500
  "sha256": "0af8295774d6c056587f2d96d83e44d0cab496bc1e034ca9807419665723f994"
2501
2501
  },
2502
+ {
2503
+ "path": "docs/adr/0408-a-genesis-stage-is-three-doors-onto-one-record.md",
2504
+ "mode": "0000644",
2505
+ "sha256": "e49269e0b1381d7d78ee9cb72c255f98ba0a357de3794fd09512e414324d08a3"
2506
+ },
2502
2507
  {
2503
2508
  "path": "docs/adr/README.md",
2504
2509
  "mode": "0000644",
2505
- "sha256": "64486d3e734bce60b0a215ce5bc97b6219958a730f033aa73af10281fd7ff5f9"
2510
+ "sha256": "6b6b7335839c7939c5f413d324e453ddab7f732e58188ea6f97061b6ab5d0d98"
2506
2511
  },
2507
2512
  {
2508
2513
  "path": "docs/api-reference.md",
2509
2514
  "mode": "0000644",
2510
- "sha256": "6222bc04e7b134403b1867df8bef9f6c645717bacc4a23f8273a16f50b7e0878"
2515
+ "sha256": "86488f35d4427223edf9788643d9f2065e4bb21616773d9f2ae8f44eda53bda2"
2511
2516
  },
2512
2517
  {
2513
2518
  "path": "docs/api/openapi.json",
2514
2519
  "mode": "0000644",
2515
- "sha256": "1b95f85a807b76f6d5bbf422e392a24f104c45c87445d24b9225023f47945415"
2520
+ "sha256": "10f998180cc5a4479c6299762280d31933cb30db0bda31137d5b82b4f897e328"
2516
2521
  },
2517
2522
  {
2518
2523
  "path": "docs/architecture.md",
@@ -3087,7 +3092,7 @@
3087
3092
  {
3088
3093
  "path": "docs/file-map.md",
3089
3094
  "mode": "0000644",
3090
- "sha256": "14d2cd161653eec8b9478b8552e1bf39b93f60a608da0a72099734be16e5053e"
3095
+ "sha256": "cc37ba21f9959764f4568a6020d815619360bc875a5a5630db3354a556f6b3c7"
3091
3096
  },
3092
3097
  {
3093
3098
  "path": "docs/handoff-template.md",
@@ -3097,7 +3102,7 @@
3097
3102
  {
3098
3103
  "path": "docs/module-api-changelog.md",
3099
3104
  "mode": "0000644",
3100
- "sha256": "88acc962bf4ec0ff97a231925d1f09932a1273b292febb9acce60d6d2b4dddc4"
3105
+ "sha256": "d5c681a206a77f4f14fba7fb2754091f4f74e9acd787b91e821d1d3bac19c894"
3101
3106
  },
3102
3107
  {
3103
3108
  "path": "docs/modules-contract.md",
@@ -8527,7 +8532,7 @@
8527
8532
  {
8528
8533
  "path": "modules/lifecycle/kickoff-checklist.js",
8529
8534
  "mode": "0000644",
8530
- "sha256": "3f410b4613cc3a8da34fb79d4ea88692da7fcea56611173ef428e31e2db4f121"
8535
+ "sha256": "930d6676bb5ed47463cca128fc54b5882e687548b666ccb0aa3f3b24a9dd3fa1"
8531
8536
  },
8532
8537
  {
8533
8538
  "path": "modules/lifecycle/kickoff-seed.js",
@@ -9364,6 +9369,11 @@
9364
9369
  "mode": "0000644",
9365
9370
  "sha256": "77f9b217824e7cee4c652f08212cdd27e5d497dffd8cc0141f7e78b2337cb87d"
9366
9371
  },
9372
+ {
9373
+ "path": "modules/onboarding/genesis-work.js",
9374
+ "mode": "0000644",
9375
+ "sha256": "4b4a25682412c3cd6cb8e8a434fef0184400667408b6ff9f4af4739e0a217e43"
9376
+ },
9367
9377
  {
9368
9378
  "path": "modules/onboarding/howto-guide.js",
9369
9379
  "mode": "0000644",
@@ -9384,6 +9394,11 @@
9384
9394
  "mode": "0000644",
9385
9395
  "sha256": "cb5a3a58b4db75c028ccc53ea3316bb733fda650218b16b494d69de58c84e982"
9386
9396
  },
9397
+ {
9398
+ "path": "modules/onboarding/migrations/onboarding_002_genesis_work.sql",
9399
+ "mode": "0000644",
9400
+ "sha256": "fe782b875ac2f3f5c8656dfaf643929fa91b76ded9acab1e7fd69da90ffba6f1"
9401
+ },
9387
9402
  {
9388
9403
  "path": "modules/onboarding/module.json",
9389
9404
  "mode": "0000644",
@@ -9414,10 +9429,15 @@
9414
9429
  "mode": "0000644",
9415
9430
  "sha256": "e34b57ba77610afe4f9318abdf846a17e892ad7e1e4e7a0708b6188b7eb54e95"
9416
9431
  },
9432
+ {
9433
+ "path": "modules/onboarding/routes/genesis-work.js",
9434
+ "mode": "0000644",
9435
+ "sha256": "253921965c920962fdc3a042095c61f8a2792f5c8cc34acd54b9ae4c4305c089"
9436
+ },
9417
9437
  {
9418
9438
  "path": "modules/onboarding/routes/onboarding.js",
9419
9439
  "mode": "0000644",
9420
- "sha256": "f9f9fa9b62c8086c10566e346b5533abce0d5f48200f3a39a61f304288807b62"
9440
+ "sha256": "9b186a1219b7b52004525716ded66207988e406188405206d01e0db9c9d5ae80"
9421
9441
  },
9422
9442
  {
9423
9443
  "path": "modules/page-notes/CLAUDE.md",
@@ -12337,12 +12357,12 @@
12337
12357
  {
12338
12358
  "path": "package-lock.json",
12339
12359
  "mode": "0000644",
12340
- "sha256": "7e52b55eec543f27f482307f29f9cf49874ce77137f5a29eff3705f737147efd"
12360
+ "sha256": "cbeaef4c630f08964cdbcb3c15e9cfa186fedfa7c342af43f7621f5b7e9c7a81"
12341
12361
  },
12342
12362
  {
12343
12363
  "path": "package.json",
12344
12364
  "mode": "0000644",
12345
- "sha256": "13af5e2d8b0f4682ad0688f525c6d3c1cfe7c8962966c0bb8c4cc5df51118760"
12365
+ "sha256": "1546731214102562d2c4d4852fc37bd7a1888b2409b3259aa6e1a0f61b253922"
12346
12366
  },
12347
12367
  {
12348
12368
  "path": "public-docs/index.html",
@@ -12362,7 +12382,7 @@
12362
12382
  {
12363
12383
  "path": "release-notes.json",
12364
12384
  "mode": "0000644",
12365
- "sha256": "e6698238d2808b5f90c1360c9e495538a7412ca4c97fd177b9d1ad33d6fed335"
12385
+ "sha256": "c0a04d8be03f80bab80408d6b13a6a539ed4c6dbf8f867b40be14d82d98fe2c7"
12366
12386
  },
12367
12387
  {
12368
12388
  "path": "scripts/bongos/CLAUDE.md",
@@ -13024,6 +13044,11 @@
13024
13044
  "mode": "0000644",
13025
13045
  "sha256": "3e17b1c793b3b2e3206d7e844eb279adc45f70fce8a8914ff72462b04570df30"
13026
13046
  },
13047
+ {
13048
+ "path": "scripts/bongos/genesis.js",
13049
+ "mode": "0000644",
13050
+ "sha256": "7db27ef450350504cee721afdd2cb2aadbeb9739181dc647bdca2b685bf75eee"
13051
+ },
13027
13052
  {
13028
13053
  "path": "scripts/bongos/git-merge-regen.js",
13029
13054
  "mode": "0000644",
@@ -13632,7 +13657,7 @@
13632
13657
  {
13633
13658
  "path": "scripts/bongos/run-unit-tests.js",
13634
13659
  "mode": "0000644",
13635
- "sha256": "248d61074607a03eb23d6a23c009a8ed8f332128865c591d7481325943d2f61d"
13660
+ "sha256": "7dfefb7f24dc671a16a311b0b8816bb319d857652aaedff9015256858cd88c5f"
13636
13661
  },
13637
13662
  {
13638
13663
  "path": "scripts/bongos/runner-drift.js",
@@ -14704,6 +14729,11 @@
14704
14729
  "mode": "0000644",
14705
14730
  "sha256": "b7dba15aee5399eee4a04786acd7510758020fac2a7cb7698d8d2e34c4733de1"
14706
14731
  },
14732
+ {
14733
+ "path": "scripts/gds/genesis.js",
14734
+ "mode": "0000644",
14735
+ "sha256": "265af8abf1957e09c539c548f8f04f10a6654c5424badeac46e3d58235b26dcb"
14736
+ },
14707
14737
  {
14708
14738
  "path": "scripts/gds/git-merge-regen.js",
14709
14739
  "mode": "0000644",
@@ -16372,7 +16402,7 @@
16372
16402
  {
16373
16403
  "path": "src/module-api.js",
16374
16404
  "mode": "0000644",
16375
- "sha256": "95f60fdf2c30bdf5576aecd5ebe3e05c0602447f74de995f7a5d520061c95d4a"
16405
+ "sha256": "331c5f206ee346b44ba1e3a9ecce003f6e7c42e45ee993c6270c8f590d31d948"
16376
16406
  },
16377
16407
  {
16378
16408
  "path": "src/module-loader/catalog.js",
@@ -18429,6 +18459,21 @@
18429
18459
  "mode": "0000644",
18430
18460
  "sha256": "0e6b37be208ce5d1e29f45baa7982625b576c6d4c347d1db43ebdc7184697e81"
18431
18461
  },
18462
+ {
18463
+ "path": "tests/genesis_work.mjs",
18464
+ "mode": "0000644",
18465
+ "sha256": "b4e77c3b6d4762a87860543eb4e9fcbbef270c8869cdbb608c70187a72c7d02f"
18466
+ },
18467
+ {
18468
+ "path": "tests/genesis_work_db.mjs",
18469
+ "mode": "0000644",
18470
+ "sha256": "982a83585f491f1b16e0b2d56df43e8ff4dce6d39ac6e41c102d6074113514ba"
18471
+ },
18472
+ {
18473
+ "path": "tests/genesis_work_routes.mjs",
18474
+ "mode": "0000644",
18475
+ "sha256": "91298982e8b7d4f978f680c3ee028254df8229e6dbf209d139ee9b484aa2c499"
18476
+ },
18432
18477
  {
18433
18478
  "path": "tests/git_guard.mjs",
18434
18479
  "mode": "0000644",
package/bin/bongos.js CHANGED
@@ -83,6 +83,7 @@ const VERBS = {
83
83
  recall: { script: 'recall.js', group: 'work', summary: 'Search the docs + project knowledge (bongos recall "x")' },
84
84
  cost: { script: 'cost.js', group: 'work', summary: 'Log a cost entry' },
85
85
  howto: { script: 'howto.js', group: 'work', summary: 'The how-to guide: show the unread steps for a moment (bongos howto moment first_open)' },
86
+ genesis: { script: 'genesis.js', group: 'work', summary: 'The founder\'s genesis answers: show, answer, or read them for planning (bongos genesis context)' },
86
87
 
87
88
  login: { script: 'login.js', group: 'account', summary: 'Sign in to an instance (bongos login <url> — browser click, no paste)' },
88
89
  setup: { script: 'setup.js', group: 'account', summary: 'Full builder setup on this instance (art key, disciplines, consent)' },
@@ -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
- - 709 operations across 86 resource groups
8
+ - 719 operations across 86 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -473,6 +473,8 @@ function createClient(opts = {}) {
473
473
  postFoundingAlive: (args) => request("POST", "/founding/alive", { hasBody: true }, args),
474
474
  // GET /founding/builders — rank: any-builder — GET /founding/builders
475
475
  getFoundingBuilders: (args) => request("GET", "/founding/builders", { hasBody: false }, args),
476
+ // GET /founding/context — rank: any-builder — GET /founding/context
477
+ getFoundingContext: (args) => request("GET", "/founding/context", { hasBody: false }, args),
476
478
  // PUT /founding/enabled — rank: any-builder — PUT /founding/enabled
477
479
  putFoundingEnabled: (args) => request("PUT", "/founding/enabled", { hasBody: true }, args),
478
480
  // GET /founding/genesis — rank: any-builder — GET /founding/genesis
@@ -485,6 +487,24 @@ function createClient(opts = {}) {
485
487
  postFoundingStagesStageClose: (args) => request("POST", "/founding/stages/{stage}/close", { hasBody: true }, args),
486
488
  // POST /founding/start — rank: any-builder — POST /founding/start
487
489
  postFoundingStart: (args) => request("POST", "/founding/start", { hasBody: true }, args),
490
+ // GET /founding/work — rank: any-builder — GET /founding/work
491
+ getFoundingWork: (args) => request("GET", "/founding/work", { hasBody: false }, args),
492
+ // GET /founding/work/{stage} — rank: any-builder — GET /founding/work/:stage
493
+ getFoundingWorkStage: (args) => request("GET", "/founding/work/{stage}", { hasBody: false }, args),
494
+ // DELETE /founding/work/{stage}/answers/{question} — rank: any-builder — DELETE /founding/work/:stage/answers/:question
495
+ deleteFoundingWorkStageAnswersQuestion: (args) => request("DELETE", "/founding/work/{stage}/answers/{question}", { hasBody: false }, args),
496
+ // PUT /founding/work/{stage}/answers/{question} — rank: any-builder — PUT /founding/work/:stage/answers/:question
497
+ putFoundingWorkStageAnswersQuestion: (args) => request("PUT", "/founding/work/{stage}/answers/{question}", { hasBody: true }, args),
498
+ // GET /founding/work/{stage}/answers/{question}/history — rank: any-builder — GET /founding/work/:stage/answers/:question/history
499
+ getFoundingWorkStageAnswersQuestionHistory: (args) => request("GET", "/founding/work/{stage}/answers/{question}/history", { hasBody: false }, args),
500
+ // GET /founding/work/{stage}/assist — rank: any-builder — GET /founding/work/:stage/assist
501
+ getFoundingWorkStageAssist: (args) => request("GET", "/founding/work/{stage}/assist", { hasBody: false }, args),
502
+ // PUT /founding/work/{stage}/door — rank: any-builder — PUT /founding/work/:stage/door
503
+ putFoundingWorkStageDoor: (args) => request("PUT", "/founding/work/{stage}/door", { hasBody: true }, args),
504
+ // PUT /founding/work/{stage}/link — rank: any-builder — PUT /founding/work/:stage/link
505
+ putFoundingWorkStageLink: (args) => request("PUT", "/founding/work/{stage}/link", { hasBody: true }, args),
506
+ // PUT /founding/work/{stage}/page — rank: any-builder — PUT /founding/work/:stage/page
507
+ putFoundingWorkStagePage: (args) => request("PUT", "/founding/work/{stage}/page", { hasBody: true }, args),
488
508
  },
489
509
  "frontDoorGuide": {
490
510
  // POST /front-door-guide/conversations — rank: public — POST /front-door-guide/conversations
@@ -472,6 +472,8 @@ function createClient(opts = {}) {
472
472
  postFoundingAlive: (args) => request("POST", "/founding/alive", { hasBody: true }, args),
473
473
  // GET /founding/builders — rank: any-builder — GET /founding/builders
474
474
  getFoundingBuilders: (args) => request("GET", "/founding/builders", { hasBody: false }, args),
475
+ // GET /founding/context — rank: any-builder — GET /founding/context
476
+ getFoundingContext: (args) => request("GET", "/founding/context", { hasBody: false }, args),
475
477
  // PUT /founding/enabled — rank: any-builder — PUT /founding/enabled
476
478
  putFoundingEnabled: (args) => request("PUT", "/founding/enabled", { hasBody: true }, args),
477
479
  // GET /founding/genesis — rank: any-builder — GET /founding/genesis
@@ -484,6 +486,24 @@ function createClient(opts = {}) {
484
486
  postFoundingStagesStageClose: (args) => request("POST", "/founding/stages/{stage}/close", { hasBody: true }, args),
485
487
  // POST /founding/start — rank: any-builder — POST /founding/start
486
488
  postFoundingStart: (args) => request("POST", "/founding/start", { hasBody: true }, args),
489
+ // GET /founding/work — rank: any-builder — GET /founding/work
490
+ getFoundingWork: (args) => request("GET", "/founding/work", { hasBody: false }, args),
491
+ // GET /founding/work/{stage} — rank: any-builder — GET /founding/work/:stage
492
+ getFoundingWorkStage: (args) => request("GET", "/founding/work/{stage}", { hasBody: false }, args),
493
+ // DELETE /founding/work/{stage}/answers/{question} — rank: any-builder — DELETE /founding/work/:stage/answers/:question
494
+ deleteFoundingWorkStageAnswersQuestion: (args) => request("DELETE", "/founding/work/{stage}/answers/{question}", { hasBody: false }, args),
495
+ // PUT /founding/work/{stage}/answers/{question} — rank: any-builder — PUT /founding/work/:stage/answers/:question
496
+ putFoundingWorkStageAnswersQuestion: (args) => request("PUT", "/founding/work/{stage}/answers/{question}", { hasBody: true }, args),
497
+ // GET /founding/work/{stage}/answers/{question}/history — rank: any-builder — GET /founding/work/:stage/answers/:question/history
498
+ getFoundingWorkStageAnswersQuestionHistory: (args) => request("GET", "/founding/work/{stage}/answers/{question}/history", { hasBody: false }, args),
499
+ // GET /founding/work/{stage}/assist — rank: any-builder — GET /founding/work/:stage/assist
500
+ getFoundingWorkStageAssist: (args) => request("GET", "/founding/work/{stage}/assist", { hasBody: false }, args),
501
+ // PUT /founding/work/{stage}/door — rank: any-builder — PUT /founding/work/:stage/door
502
+ putFoundingWorkStageDoor: (args) => request("PUT", "/founding/work/{stage}/door", { hasBody: true }, args),
503
+ // PUT /founding/work/{stage}/link — rank: any-builder — PUT /founding/work/:stage/link
504
+ putFoundingWorkStageLink: (args) => request("PUT", "/founding/work/{stage}/link", { hasBody: true }, args),
505
+ // PUT /founding/work/{stage}/page — rank: any-builder — PUT /founding/work/:stage/page
506
+ putFoundingWorkStagePage: (args) => request("PUT", "/founding/work/{stage}/page", { hasBody: true }, args),
487
507
  },
488
508
  "frontDoorGuide": {
489
509
  // POST /front-door-guide/conversations — rank: public — POST /front-door-guide/conversations
@@ -726,6 +726,10 @@ export interface PutCopyDeskPagesPageIdDraftResponse { ok: boolean; outcome: unk
726
726
  export interface PutDoneWhenCriterionIdBackendOnlyRequest { backend_only: boolean }
727
727
  export interface PutDoneWhenCriterionIdBackendOnlyResponse { ok: boolean; criterion_id: unknown; backend_only: unknown }
728
728
  export interface PutFoundingEnabledRequest { enabled?: boolean }
729
+ export interface PutFoundingWorkStageAnswersQuestionRequest { state?: string; text?: string; origin?: string; if_empty?: boolean }
730
+ export interface PutFoundingWorkStageDoorRequest { door: string }
731
+ export interface PutFoundingWorkStageLinkRequest { url?: string }
732
+ export interface PutFoundingWorkStagePageRequest { page?: string }
729
733
  export interface PutGovernmentAsksMatterIdResponse { ok: boolean; matter_id: unknown; ask: unknown }
730
734
  export interface PutGovernmentRanksRankKeyPermissionsPermissionKeyResponse { ok: boolean; rank_key: unknown; permission_key: unknown; granted: unknown }
731
735
  export interface PutGovernmentTreasuryPotsGoalIdRequest { budget_usd?: unknown }
@@ -1151,6 +1155,8 @@ export interface BongosClient {
1151
1155
  postFoundingAlive(args?: RequestArgs): Promise<ApiResponse>;
1152
1156
  /** GET /founding/builders — rank: any-builder */
1153
1157
  getFoundingBuilders(args?: RequestArgs): Promise<ApiResponse>;
1158
+ /** GET /founding/context — rank: any-builder */
1159
+ getFoundingContext(args?: RequestArgs): Promise<ApiResponse>;
1154
1160
  /** PUT /founding/enabled — rank: any-builder */
1155
1161
  putFoundingEnabled(args?: RequestArgs & { body?: PutFoundingEnabledRequest }): Promise<ApiResponse>;
1156
1162
  /** GET /founding/genesis — rank: any-builder */
@@ -1163,6 +1169,24 @@ export interface BongosClient {
1163
1169
  postFoundingStagesStageClose(args?: RequestArgs): Promise<ApiResponse>;
1164
1170
  /** POST /founding/start — rank: any-builder */
1165
1171
  postFoundingStart(args?: RequestArgs): Promise<ApiResponse>;
1172
+ /** GET /founding/work — rank: any-builder */
1173
+ getFoundingWork(args?: RequestArgs): Promise<ApiResponse>;
1174
+ /** GET /founding/work/{stage} — rank: any-builder */
1175
+ getFoundingWorkStage(args?: RequestArgs): Promise<ApiResponse>;
1176
+ /** DELETE /founding/work/{stage}/answers/{question} — rank: any-builder */
1177
+ deleteFoundingWorkStageAnswersQuestion(args?: RequestArgs): Promise<ApiResponse>;
1178
+ /** PUT /founding/work/{stage}/answers/{question} — rank: any-builder */
1179
+ putFoundingWorkStageAnswersQuestion(args?: RequestArgs & { body?: PutFoundingWorkStageAnswersQuestionRequest }): Promise<ApiResponse>;
1180
+ /** GET /founding/work/{stage}/answers/{question}/history — rank: any-builder */
1181
+ getFoundingWorkStageAnswersQuestionHistory(args?: RequestArgs): Promise<ApiResponse>;
1182
+ /** GET /founding/work/{stage}/assist — rank: any-builder */
1183
+ getFoundingWorkStageAssist(args?: RequestArgs): Promise<ApiResponse>;
1184
+ /** PUT /founding/work/{stage}/door — rank: any-builder */
1185
+ putFoundingWorkStageDoor(args: RequestArgs & { body: PutFoundingWorkStageDoorRequest }): Promise<ApiResponse>;
1186
+ /** PUT /founding/work/{stage}/link — rank: any-builder */
1187
+ putFoundingWorkStageLink(args?: RequestArgs & { body?: PutFoundingWorkStageLinkRequest }): Promise<ApiResponse>;
1188
+ /** PUT /founding/work/{stage}/page — rank: any-builder */
1189
+ putFoundingWorkStagePage(args?: RequestArgs & { body?: PutFoundingWorkStagePageRequest }): Promise<ApiResponse>;
1166
1190
  };
1167
1191
  "frontDoorGuide": {
1168
1192
  /** POST /front-door-guide/conversations — rank: public */
@@ -469,6 +469,8 @@ export function createClient(opts = {}) {
469
469
  postFoundingAlive: (args) => request("POST", "/founding/alive", { hasBody: true }, args),
470
470
  // GET /founding/builders — rank: any-builder — GET /founding/builders
471
471
  getFoundingBuilders: (args) => request("GET", "/founding/builders", { hasBody: false }, args),
472
+ // GET /founding/context — rank: any-builder — GET /founding/context
473
+ getFoundingContext: (args) => request("GET", "/founding/context", { hasBody: false }, args),
472
474
  // PUT /founding/enabled — rank: any-builder — PUT /founding/enabled
473
475
  putFoundingEnabled: (args) => request("PUT", "/founding/enabled", { hasBody: true }, args),
474
476
  // GET /founding/genesis — rank: any-builder — GET /founding/genesis
@@ -481,6 +483,24 @@ export function createClient(opts = {}) {
481
483
  postFoundingStagesStageClose: (args) => request("POST", "/founding/stages/{stage}/close", { hasBody: true }, args),
482
484
  // POST /founding/start — rank: any-builder — POST /founding/start
483
485
  postFoundingStart: (args) => request("POST", "/founding/start", { hasBody: true }, args),
486
+ // GET /founding/work — rank: any-builder — GET /founding/work
487
+ getFoundingWork: (args) => request("GET", "/founding/work", { hasBody: false }, args),
488
+ // GET /founding/work/{stage} — rank: any-builder — GET /founding/work/:stage
489
+ getFoundingWorkStage: (args) => request("GET", "/founding/work/{stage}", { hasBody: false }, args),
490
+ // DELETE /founding/work/{stage}/answers/{question} — rank: any-builder — DELETE /founding/work/:stage/answers/:question
491
+ deleteFoundingWorkStageAnswersQuestion: (args) => request("DELETE", "/founding/work/{stage}/answers/{question}", { hasBody: false }, args),
492
+ // PUT /founding/work/{stage}/answers/{question} — rank: any-builder — PUT /founding/work/:stage/answers/:question
493
+ putFoundingWorkStageAnswersQuestion: (args) => request("PUT", "/founding/work/{stage}/answers/{question}", { hasBody: true }, args),
494
+ // GET /founding/work/{stage}/answers/{question}/history — rank: any-builder — GET /founding/work/:stage/answers/:question/history
495
+ getFoundingWorkStageAnswersQuestionHistory: (args) => request("GET", "/founding/work/{stage}/answers/{question}/history", { hasBody: false }, args),
496
+ // GET /founding/work/{stage}/assist — rank: any-builder — GET /founding/work/:stage/assist
497
+ getFoundingWorkStageAssist: (args) => request("GET", "/founding/work/{stage}/assist", { hasBody: false }, args),
498
+ // PUT /founding/work/{stage}/door — rank: any-builder — PUT /founding/work/:stage/door
499
+ putFoundingWorkStageDoor: (args) => request("PUT", "/founding/work/{stage}/door", { hasBody: true }, args),
500
+ // PUT /founding/work/{stage}/link — rank: any-builder — PUT /founding/work/:stage/link
501
+ putFoundingWorkStageLink: (args) => request("PUT", "/founding/work/{stage}/link", { hasBody: true }, args),
502
+ // PUT /founding/work/{stage}/page — rank: any-builder — PUT /founding/work/:stage/page
503
+ putFoundingWorkStagePage: (args) => request("PUT", "/founding/work/{stage}/page", { hasBody: true }, args),
484
504
  },
485
505
  "frontDoorGuide": {
486
506
  // POST /front-door-guide/conversations — rank: public — POST /front-door-guide/conversations
@@ -0,0 +1,60 @@
1
+ # ADR 0408 — A genesis stage is three doors onto one record
2
+
3
+ - **Status:** accepted
4
+ - **Date:** 2026-11-13
5
+ - **Task:** [task 1005116](https://cloudbongos.com/builders#/task/1005116) (goal 1000106, Project creation)
6
+ - **Owner ruling:** 2026-11-07 — one pattern, every stage, scope included
7
+
8
+ ## Context
9
+
10
+ Each genesis stage (scope, strategize, charter, legalize, legislation) is a decision only
11
+ the founder can make. Until now each had exactly one route through it: an AI session
12
+ drafted the stage's answer and the founder read it, so the project's strategy was the
13
+ model's. The owner's rule: **Bongos may structure the thinking and may help with the
14
+ words, but the founder is the author.** The owner ruled the fix is one pattern shared by
15
+ every stage, not a strategize feature that charter then copies.
16
+
17
+ ## Decision
18
+
19
+ 1. **Three doors, guided first.** Every stage offers *guided* (the stage's questions, one
20
+ at a time), *open* (a blank page, with the questions shown beside it as the shape of a
21
+ good answer) and *assisted* (the founder's own AI session works the same questions,
22
+ pushes back and records only what the founder accepts). Plus the existing way: link a
23
+ document the founder already has. Guided is the default because a blank page is how
24
+ toast's scope came back thin.
25
+ 2. **One record per stage, not one per door.** The door is only how the founder is
26
+ working right now (`onboarding_genesis_work.door`). The answers, the free page and the
27
+ link are kept whatever the door, so switching loses nothing.
28
+ 3. **An answer is a row, not prose.** `onboarding_genesis_answers` holds one row per
29
+ answered question with a STATE — `answered`, `not_sure` ("not sure yet", an answer,
30
+ not a gap) or `skipped` — and no row means never touched. Un-answering deletes the
31
+ row, back to empty. Each row carries its ORIGIN (`founder`, `assisted`,
32
+ `carried_over`), so answers brought in from before sign-up (task 1005274) read as
33
+ carried over until the founder makes them theirs. Every change is appended to
34
+ `onboarding_genesis_answer_history`.
35
+ 4. **The questions are code.** `QUESTIONS` in `modules/onboarding/genesis-work.js`; a
36
+ stage adopts the pattern by declaring its questions there. Strategize does now; scope's
37
+ guided door is its project interview (task 1005114); charter, legalize and legislation
38
+ adopt it when next touched. A stage with no questions still takes a page and a link.
39
+ 5. **The founder writes, everyone reads.** Writes are behind `project.settings.manage`,
40
+ like the rest of genesis; reads are any signed-in builder. `GET /founding/context`
41
+ (and `npx bongos genesis context`) is the read path a session planning a goal or task
42
+ uses.
43
+
44
+ ## Rejected
45
+
46
+ - **Answers in `project_settings` JSON**, beside `founding.plan`. One blob per stage
47
+ cannot tell "not sure yet" from empty at the database, loses every earlier wording on
48
+ revision, and makes a carry-over that must never overwrite the founder a
49
+ read-modify-write race.
50
+ - **The answers inside the stage task's description.** That is prose; nothing later can
51
+ read a single answer out of it, which is the problem the owner raised.
52
+ - **A separate store per door.** Three copies of one artifact drift, and switching would
53
+ lose work — the opposite of the ruling.
54
+
55
+ ## Consequences
56
+
57
+ - Presentation is left to the game frame (the founding of the government district) and
58
+ the hall version (task 1005285). Today a founder works a stage through their AI session
59
+ and `npx bongos genesis …`.
60
+ - Task 1005115 renders each stage's record as an editable document from this store.
@@ -521,5 +521,6 @@ These 20 numbers are each shared by exactly two files. They are **accepted histo
521
521
  | 0403 | [**In game mode the visor is the control and the scene is the view** ([task 1005203](https://cloudbongos.com/builders#/task/1005203), goal 1000142; owner 2026-11-11). Every main call to action you can see in game mode lives on the visor (the accent button, the key hints, the Actions sheet); the city, the sky and Home only show the project and can be moved through, never carry buttons of their own. A scene offers its actions to the visor through `OTBVisor.scene`. Found not yet keeping it: the city's decide button and door, the sky's top row and composer, Home's gallery links, the Artist's feedback tab.](0403-in-game-mode-the-visor-is-the-control-and-the-scene-is-the-view.md) | hall / game frame |
522
522
  | 0404 | [**A party is a room, and rooms register as kinds** ([task 1005220](https://cloudbongos.com/builders#/task/1005220), goal 1000148). Any group that talks together is a room: a free-form party (cap 8), a chain party (ADR 0400), a scoping session (cap 40, owned by `lifecycle`) or a decision room (cap 40, `government`). Each owner contributes its kind to the `room.kinds` contribution point (a port is single-provider, so four owners would fail the boot) with `members`/`isMember`/optional `invite`/`accept`, and fires `room.opened`/`room.member.joined`/`room.member.left`/`room.closed`; consumers never read an owner's tables and reconcile against `members()`. Free-form party: one per builder, leader handover to the longest-standing member, disband on last leave. A chain room follows an open `chain_party` row. Unlinked players get everything but voice. V3 polls (3 s, cursor + 304, paused when hidden, per-builder limiter) rather than pushing through `/live`. With discord off, no voice key or voice state; chat still works. A room is never authority. Rejected: one port, a port per kind, a rooms module reading other modules' tables, a second party roster, push via `/live`, speaking indicators.](0404-a-party-is-a-room-and-rooms-register-as-kinds.md) | game frame / modules / Discord |
523
523
  | 0405 | [**Each character has one colour, and the visor wears it** ([task 1005218](https://cloudbongos.com/builders#/task/1005218), goal 1000142; owner 2026-11-12). The Artisan is ember (the accent), the Artist violet, the Patron gold, each mixed from the hall’s tokens and none typed in. In game mode the visor’s lines, name, picture rim and accent are the held character’s colour, and your picture on the glass is your character wearing the visor. The characters are redrawn at 64 by 64 as two-animal aliens, drawn by a script.](0405-each-character-has-one-colour-and-the-visor-wears-it.md) | hall / game frame |
524
+ | 0408 | [**A genesis stage is three doors onto one record** ([task 1005116](https://cloudbongos.com/builders#/task/1005116), goal 1000106; owner 2026-11-07). Every genesis stage offers guided (its questions, the default), open (a blank page with the questions beside it) and assisted (the founder's own AI session works the same questions and records only what the founder accepts), plus linking an existing document. The door is only how the founder is working now: answers, page and link are one record per stage, so switching loses nothing. An answer is a row with a state (answered · not sure yet · skipped; no row = empty) and an origin (founder · assisted · carried over), with append-only history. Founder writes, everyone reads; `GET /founding/context` is the planning read path. Rejected: project_settings JSON, answers inside task prose, a store per door.](0408-a-genesis-stage-is-three-doors-onto-one-record.md) | onboarding / genesis |
524
525
  | 0406 | [**Every project gets a sandbox that follows main, and live moves only when a person promotes** ([task 1005288](https://cloudbongos.com/builders#/task/1005288), goal 1000106; owner 2026-11-13). One repository, no sandbox branch: a second Render web service on the free plan auto-deploys every landing on `main`, and the live service stops auto-deploying and takes only the commit a person promotes (with the Render key typed in for that request). Fake data and test keys by default; lent real keys should be read-only, behind an outbound gate that refuses sends, charges and writes. Render's free database expires in 30 days, so the sandbox gets a second database in the app's paid one. A project with no app gets no hosted sandbox; Cloud Bongos runs the same rule over its release pin.](0406-every-project-gets-a-sandbox-that-follows-main-and-live-moves-only-when-a-person-promotes.md) | provisioning / hosting |
525
526
  | 0407 | [**A hosted project's grant is made by its owner, not witnessed at sign-in** ([task 1004753](https://cloudbongos.com/builders#/task/1004753), goal 1000106; accepted by the owner 2026-11-13). Replaces ADR 0328's suspended Phase 2: no `membership_kind` admits anyone, because sign-in writes `member` for any GitHub user (the device flow included) and check-in is the project's own word. A new `provisioning_project_grants` row, one writer (`grants.js`), created only by the project's owner from their hub session (no archon create; owner, grantee or archon may revoke), read live in `requireProjectOwner` on routes that opt in with `{ grantee: 'operate' }`: the project read, settings read, env-manifest (names only) and restart. Teardown, disconnect, domain, the GitHub/Render/repo-private actions, settings and look writes stay owner-only. Audit actor `api:grantee:<id>`. The sign-in default stays `member`. A visitor or pending applicant gets 403 `project_membership_required` with the join path; a member without a grant gets 403 `project_access_required` (ask the owner); a stranger keeps the 404.](0407-a-project-grant-is-made-by-the-owner-not-witnessed-at-sign-in.md) | provisioning / permissions |