@bongos/core 1.20.51 → 1.20.52

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.
Files changed (29) hide show
  1. package/.bongos-core.json +119 -14
  2. package/docs/module-api-changelog.md +2 -0
  3. package/modules/provisioning/soft-limits.js +17 -0
  4. package/modules/public-landing/public/assets/world/r5-life-1-primordial-sea-cut.webp +0 -0
  5. package/modules/public-landing/public/assets/world/r5-life-1-primordial-sea-cut.webp.json +16 -0
  6. package/modules/public-landing/public/assets/world/r5-life-1-primordial-sea.jpg +0 -0
  7. package/modules/public-landing/public/assets/world/r5-life-1-primordial-sea.jpg.json +16 -0
  8. package/modules/public-landing/public/assets/world/r5-life-2-first-cells-cut.webp +0 -0
  9. package/modules/public-landing/public/assets/world/r5-life-2-first-cells-cut.webp.json +16 -0
  10. package/modules/public-landing/public/assets/world/r5-life-2-first-cells.jpg +0 -0
  11. package/modules/public-landing/public/assets/world/r5-life-2-first-cells.jpg.json +16 -0
  12. package/modules/public-landing/public/assets/world/r5-life-3-genome-cut.webp +0 -0
  13. package/modules/public-landing/public/assets/world/r5-life-3-genome-cut.webp.json +16 -0
  14. package/modules/public-landing/public/assets/world/r5-life-3-genome.jpg +0 -0
  15. package/modules/public-landing/public/assets/world/r5-life-3-genome.jpg.json +16 -0
  16. package/modules/public-landing/public/assets/world/r5-life-4-membrane-cut.webp +0 -0
  17. package/modules/public-landing/public/assets/world/r5-life-4-membrane-cut.webp.json +16 -0
  18. package/modules/public-landing/public/assets/world/r5-life-4-membrane.jpg +0 -0
  19. package/modules/public-landing/public/assets/world/r5-life-4-membrane.jpg.json +16 -0
  20. package/modules/public-landing/public/assets/world/r5-life-5-nervous-system-cut.webp +0 -0
  21. package/modules/public-landing/public/assets/world/r5-life-5-nervous-system-cut.webp.json +16 -0
  22. package/modules/public-landing/public/assets/world/r5-life-5-nervous-system.jpg +0 -0
  23. package/modules/public-landing/public/assets/world/r5-life-5-nervous-system.jpg.json +16 -0
  24. package/package-lock.json +2 -2
  25. package/package.json +1 -1
  26. package/release-notes.json +10 -0
  27. package/src/module-api.js +1 -1
  28. package/tests/genesis_life_plates.mjs +63 -0
  29. package/tests/provisioning_planet_physics.mjs +14 -0
package/.bongos-core.json CHANGED
@@ -2,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/gds/package-core.js",
5
- "core_version": "1.20.51",
6
- "core_contract": "1.20.51",
7
- "source_commit": "8f1131cd7bdd2b9d403445356b3f978ce0c40438",
5
+ "core_version": "1.20.52",
6
+ "core_contract": "1.20.52",
7
+ "source_commit": "e3143859f3882b836b0c86f59b126cb27cb8209d",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-10-01T04:42:37.796Z",
9
+ "built_at": "2026-10-01T04:55:11.621Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 569,
13
13
  "agent_docs_stubbed": 27,
14
- "functional_verbatim": 2711,
14
+ "functional_verbatim": 2732,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 3308,
20
- "tree_sha256": "07b7a593dc3090e92b5ea9cded1aa717a82bf99a209474ed6b881901e682caa6",
19
+ "file_count": 3329,
20
+ "tree_sha256": "bc0888acafd3809d66ad4ad330f38258ff34918aef78a22ff590a15610cf8b15",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -2797,7 +2797,7 @@
2797
2797
  {
2798
2798
  "path": "docs/module-api-changelog.md",
2799
2799
  "mode": "0000644",
2800
- "sha256": "5aed784bb80052edded6bf5e4365901408628646d3f4e39ab852af3771413b68"
2800
+ "sha256": "86c99fc203ccb2c42644e11910bc8f47b85f11a8bd17dd7bd8d5047abd61bd94"
2801
2801
  },
2802
2802
  {
2803
2803
  "path": "docs/modules-contract.md",
@@ -7907,7 +7907,7 @@
7907
7907
  {
7908
7908
  "path": "modules/provisioning/soft-limits.js",
7909
7909
  "mode": "0000644",
7910
- "sha256": "03991cd9683c3fc2b4a9fda9e359dcd40a1e782800884b33b49b1d6e1fd9637d"
7910
+ "sha256": "f29a6294abc2f33d2a900a95739789c188102294176e95943775c1d7dd62390e"
7911
7911
  },
7912
7912
  {
7913
7913
  "path": "modules/provisioning/starter-bundles.js",
@@ -8409,6 +8409,106 @@
8409
8409
  "mode": "0000644",
8410
8410
  "sha256": "cc94151e141c518dda940b5448c88c302f85aaff0da680f7ce8e3dff6f2604e9"
8411
8411
  },
8412
+ {
8413
+ "path": "modules/public-landing/public/assets/world/r5-life-1-primordial-sea-cut.webp",
8414
+ "mode": "0000644",
8415
+ "sha256": "321aefaf8b8d6dd803059a50442c91335d90575339f5febca347a7c62827e562"
8416
+ },
8417
+ {
8418
+ "path": "modules/public-landing/public/assets/world/r5-life-1-primordial-sea-cut.webp.json",
8419
+ "mode": "0000644",
8420
+ "sha256": "0533fb89915fabcd659bcf2812d8c4791f4306d87b0abeb3d0156c462d0192c7"
8421
+ },
8422
+ {
8423
+ "path": "modules/public-landing/public/assets/world/r5-life-1-primordial-sea.jpg",
8424
+ "mode": "0000644",
8425
+ "sha256": "e952f8868dc13f27579179ed4d883ed9e320ebd6ec1d2f5cc2f68da64e5d6222"
8426
+ },
8427
+ {
8428
+ "path": "modules/public-landing/public/assets/world/r5-life-1-primordial-sea.jpg.json",
8429
+ "mode": "0000644",
8430
+ "sha256": "bb619378f85cef70736d721bdd80c636cbecb1c5e1fef71ac535365039ee1521"
8431
+ },
8432
+ {
8433
+ "path": "modules/public-landing/public/assets/world/r5-life-2-first-cells-cut.webp",
8434
+ "mode": "0000644",
8435
+ "sha256": "3721d1aadd091744d603553c6d607c363ad275178c8493a13a86b9df3a59f082"
8436
+ },
8437
+ {
8438
+ "path": "modules/public-landing/public/assets/world/r5-life-2-first-cells-cut.webp.json",
8439
+ "mode": "0000644",
8440
+ "sha256": "fd41d8dbf68b6a8fdd6d325207b2765833f634a71ca22916085b75cdc6b6475a"
8441
+ },
8442
+ {
8443
+ "path": "modules/public-landing/public/assets/world/r5-life-2-first-cells.jpg",
8444
+ "mode": "0000644",
8445
+ "sha256": "27f065cc034e6d5c7a13dec07a3bff3bac133d12020661f4f2bdc09617ae635b"
8446
+ },
8447
+ {
8448
+ "path": "modules/public-landing/public/assets/world/r5-life-2-first-cells.jpg.json",
8449
+ "mode": "0000644",
8450
+ "sha256": "8c84d49ff7fff44fd0b10ab91810b43642859ce3d11bb6d5d18bf05c40143058"
8451
+ },
8452
+ {
8453
+ "path": "modules/public-landing/public/assets/world/r5-life-3-genome-cut.webp",
8454
+ "mode": "0000644",
8455
+ "sha256": "5fdb40732cdd86f220cbb0090f058f6990c4362abcf1d5c3300a1fd9fb7815e0"
8456
+ },
8457
+ {
8458
+ "path": "modules/public-landing/public/assets/world/r5-life-3-genome-cut.webp.json",
8459
+ "mode": "0000644",
8460
+ "sha256": "ea3cd4f1124ebc261d795f35e8fac2fc87e8eb7c001f6415672f3ca2971ded45"
8461
+ },
8462
+ {
8463
+ "path": "modules/public-landing/public/assets/world/r5-life-3-genome.jpg",
8464
+ "mode": "0000644",
8465
+ "sha256": "4aa1190f9978012d9fb5c2ff7993eb129972bcff246865e6a695b5a7b28d7ffc"
8466
+ },
8467
+ {
8468
+ "path": "modules/public-landing/public/assets/world/r5-life-3-genome.jpg.json",
8469
+ "mode": "0000644",
8470
+ "sha256": "508e073ccb997cdf754c082d6e5cff3beb7dff9ca22b757488e8572a8e4b15a0"
8471
+ },
8472
+ {
8473
+ "path": "modules/public-landing/public/assets/world/r5-life-4-membrane-cut.webp",
8474
+ "mode": "0000644",
8475
+ "sha256": "c3a1f42705593f7c773e49ddb7beb004d16a07d612df2a9be1effb32b30c19d1"
8476
+ },
8477
+ {
8478
+ "path": "modules/public-landing/public/assets/world/r5-life-4-membrane-cut.webp.json",
8479
+ "mode": "0000644",
8480
+ "sha256": "1bbbbb67567f5d30ca43df2369f380006696319a87100b6525fd0eb186777d2d"
8481
+ },
8482
+ {
8483
+ "path": "modules/public-landing/public/assets/world/r5-life-4-membrane.jpg",
8484
+ "mode": "0000644",
8485
+ "sha256": "26f154e1c8471b6efb035427684ee3ed331a99f70d545877ea90f9f85cc6c2c1"
8486
+ },
8487
+ {
8488
+ "path": "modules/public-landing/public/assets/world/r5-life-4-membrane.jpg.json",
8489
+ "mode": "0000644",
8490
+ "sha256": "9868bb5cb179989408215a87c7fa9e13869660c365d6cc9ee3d6ad691cf3bf0d"
8491
+ },
8492
+ {
8493
+ "path": "modules/public-landing/public/assets/world/r5-life-5-nervous-system-cut.webp",
8494
+ "mode": "0000644",
8495
+ "sha256": "311bf87d9e93d82c6da76383a3aea13ed0cf8112e5dce4332364aa661082a7b0"
8496
+ },
8497
+ {
8498
+ "path": "modules/public-landing/public/assets/world/r5-life-5-nervous-system-cut.webp.json",
8499
+ "mode": "0000644",
8500
+ "sha256": "ab2b5ace654ff2c08e87f6ee35849fae915e2e0974e46156341ad8bbe9f07f7a"
8501
+ },
8502
+ {
8503
+ "path": "modules/public-landing/public/assets/world/r5-life-5-nervous-system.jpg",
8504
+ "mode": "0000644",
8505
+ "sha256": "0a7f1d704304971ece4e0ccb97082179a28cdfd76293ab46eceec02945de88df"
8506
+ },
8507
+ {
8508
+ "path": "modules/public-landing/public/assets/world/r5-life-5-nervous-system.jpg.json",
8509
+ "mode": "0000644",
8510
+ "sha256": "ebed0ca887ec4c27f22cc3f3e996cc6429ed7366c876c54073bad6f97b03b065"
8511
+ },
8412
8512
  {
8413
8513
  "path": "modules/public-landing/public/buddha.png",
8414
8514
  "mode": "0000644",
@@ -9127,12 +9227,12 @@
9127
9227
  {
9128
9228
  "path": "package-lock.json",
9129
9229
  "mode": "0000644",
9130
- "sha256": "5cd63d21fbfe521e0443515f8405cae0fda53578d1bb27bf723144bf58fa7260"
9230
+ "sha256": "d098937dc15b84158548b81a92be4a66c53852088099d5ecf18d8412923f52de"
9131
9231
  },
9132
9232
  {
9133
9233
  "path": "package.json",
9134
9234
  "mode": "0000644",
9135
- "sha256": "b8ca279c9bb9ed7ab94f87d715e969c3d61fda60c88ff1e486e902772f4ba511"
9235
+ "sha256": "2823bd18e053bf6c233177c8b96fd56ec5018e4c2d85c310c1320ecb287f77de"
9136
9236
  },
9137
9237
  {
9138
9238
  "path": "public-docs/index.html",
@@ -9152,7 +9252,7 @@
9152
9252
  {
9153
9253
  "path": "release-notes.json",
9154
9254
  "mode": "0000644",
9155
- "sha256": "fac2f382f362c7a08d87dc81a33b7d75aa3a96149354337b2470f152e86abc11"
9255
+ "sha256": "2f0bc73b1cab48056c8c76bb5f14dbd8d6f85549aa6f11c2478371033f5715d4"
9156
9256
  },
9157
9257
  {
9158
9258
  "path": "scripts/bongos-mcp.js",
@@ -11317,7 +11417,7 @@
11317
11417
  {
11318
11418
  "path": "src/module-api.js",
11319
11419
  "mode": "0000644",
11320
- "sha256": "51e4e472dbdd179b092c0026fcb0eae2a6a4b26bd50582a78cdef27abccafe8a"
11420
+ "sha256": "be64d41f259aa175bb0fc4e971e38af38a86b5fef5b1c0a700fe6106dd40c04f"
11321
11421
  },
11322
11422
  {
11323
11423
  "path": "src/module-loader/catalog.js",
@@ -12819,6 +12919,11 @@
12819
12919
  "mode": "0000644",
12820
12920
  "sha256": "da4904efa11dbce4d4a61e0d0936d58d5566f89337dd855f4cdfab9e649626c2"
12821
12921
  },
12922
+ {
12923
+ "path": "tests/genesis_life_plates.mjs",
12924
+ "mode": "0000644",
12925
+ "sha256": "0e6b37be208ce5d1e29f45baa7982625b576c6d4c347d1db43ebdc7184697e81"
12926
+ },
12822
12927
  {
12823
12928
  "path": "tests/git_guard.mjs",
12824
12929
  "mode": "0000644",
@@ -15097,7 +15202,7 @@
15097
15202
  {
15098
15203
  "path": "tests/provisioning_planet_physics.mjs",
15099
15204
  "mode": "0000644",
15100
- "sha256": "febbdbf82e7521ef80fb00d48a0a5fa9edf063ec20efbb39ddf59051c5cad4b2"
15205
+ "sha256": "286bb7f951088b0923df6d63d77cf2fd2f990a3200641a50b29b15b4e9d50d6e"
15101
15206
  },
15102
15207
  {
15103
15208
  "path": "tests/provisioning_public_refusal.mjs",
@@ -2759,5 +2759,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
2759
2759
  landed since 1.20.49 with no explicit bump. run 36815399738. (task 1002620)
2760
2760
  1.20.51 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2761
2761
  landed since 1.20.50 with no explicit bump. run 36816320939. (task 1002620)
2762
+ 1.20.52 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2763
+ landed since 1.20.51 with no explicit bump. run 36817286385. (task 1002620)
2762
2764
  ---------------------------------------------------------------------------
2763
2765
  ```
@@ -56,6 +56,23 @@ const SOFT_LIMIT_RULES = Object.freeze([
56
56
  effect: 'grey',
57
57
  reason: 'A nonprofit has no owners, so it has no shares to give.',
58
58
  }),
59
+ // The owner's call (task 1004475, 2026-09-30): a single-owner company and a research
60
+ // entity are greyed too, each with the reason that fits it. Only a for-profit company
61
+ // or a division of a corporation is offered equity.
62
+ Object.freeze({
63
+ id: 'equity-not-in-a-single-owner-llc',
64
+ when: { entity: { in: ['single-owner-llc'] } },
65
+ options: ['reward_intents:equity'],
66
+ effect: 'grey',
67
+ reason: 'A single-owner company has one owner. Giving builders a stake means taking on more owners first.',
68
+ }),
69
+ Object.freeze({
70
+ id: 'equity-not-in-a-research-entity',
71
+ when: { entity: { in: ['research'] } },
72
+ options: ['reward_intents:equity'],
73
+ effect: 'grey',
74
+ reason: "A research entity usually has no shares to give, so equity is off unless it's set up as a company.",
75
+ }),
59
76
  Object.freeze({
60
77
  id: 'no-cash-payouts-to-eu-builders-yet',
61
78
  when: { builder_geography: { in: ['us-eu', 'global'] } },
@@ -0,0 +1,16 @@
1
+ {
2
+ "kind": "cutout",
3
+ "model": "Gemini image model (generated by the owner in the Gemini app, 2026-09-30; one 5-panel sheet)",
4
+ "aspect_ratio": "1:1",
5
+ "generated": "2026-09-30",
6
+ "round": 5,
7
+ "task": 1004425,
8
+ "stage": "scope",
9
+ "label": "primordial sea",
10
+ "prompt": "Mirror-polished liquid chrome, soft key light from the top left, a slightly long lens, the object whole and centred, pure black background everywhere the object is not. No text, no letters, no logo, no watermark, no UI. A chrome planet whose whole surface is a slow, liquid chrome ocean with faint swirling currents, calm and empty, nothing living yet.",
11
+ "reference": "modules/public-landing/public/assets/world/r2-chrome-blob-one.jpg, uploaded as the material/light/ground reference",
12
+ "resolution": "1024x1024 from the same panel",
13
+ "source": "r5-life-1-primordial-sea.jpg with the black ground removed: flood-fill from the edges on near-black pixels, luminance-feathered",
14
+ "encoded": "canvas WebP quality 0.88 with alpha",
15
+ "use": "light mode: the genesis life strip, stage scope (primordial sea)"
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "kind": "plate",
3
+ "model": "Gemini image model (generated by the owner in the Gemini app, 2026-09-30; one 5-panel sheet)",
4
+ "aspect_ratio": "1:1",
5
+ "generated": "2026-09-30",
6
+ "round": 5,
7
+ "task": 1004425,
8
+ "stage": "scope",
9
+ "label": "primordial sea",
10
+ "prompt": "Mirror-polished liquid chrome, soft key light from the top left, a slightly long lens, the object whole and centred, pure black background everywhere the object is not. No text, no letters, no logo, no watermark, no UI. A chrome planet whose whole surface is a slow, liquid chrome ocean with faint swirling currents, calm and empty, nothing living yet.",
11
+ "reference": "modules/public-landing/public/assets/world/r2-chrome-blob-one.jpg, uploaded as the material/light/ground reference",
12
+ "resolution": "source panel about 220px across the object in a 1024x559 sheet, squared and upscaled to 1024px; soft if shown large, sized for the genesis life strip",
13
+ "source": "the owner's Gemini sheet, split by the ui-design kit browser (panel detection on the white dividers)",
14
+ "encoded": "canvas JPEG quality 0.92, 1024x1024, pure black ground",
15
+ "use": "dark mode: the genesis life strip, stage scope (primordial sea)"
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "kind": "cutout",
3
+ "model": "Gemini image model (generated by the owner in the Gemini app, 2026-09-30; one 5-panel sheet)",
4
+ "aspect_ratio": "1:1",
5
+ "generated": "2026-09-30",
6
+ "round": 5,
7
+ "task": 1004425,
8
+ "stage": "strategize",
9
+ "label": "first cells",
10
+ "prompt": "Mirror-polished liquid chrome, soft key light from the top left, a slightly long lens, the object whole and centred, pure black background everywhere the object is not. No text, no letters, no logo, no watermark, no UI. The same chrome planet with a cluster of small glossy chrome beads, like the first cells, gathering on one side of its surface.",
11
+ "reference": "modules/public-landing/public/assets/world/r2-chrome-blob-one.jpg, uploaded as the material/light/ground reference",
12
+ "resolution": "1024x1024 from the same panel",
13
+ "source": "r5-life-2-first-cells.jpg with the black ground removed: flood-fill from the edges on near-black pixels, luminance-feathered",
14
+ "encoded": "canvas WebP quality 0.88 with alpha",
15
+ "use": "light mode: the genesis life strip, stage strategize (first cells)"
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "kind": "plate",
3
+ "model": "Gemini image model (generated by the owner in the Gemini app, 2026-09-30; one 5-panel sheet)",
4
+ "aspect_ratio": "1:1",
5
+ "generated": "2026-09-30",
6
+ "round": 5,
7
+ "task": 1004425,
8
+ "stage": "strategize",
9
+ "label": "first cells",
10
+ "prompt": "Mirror-polished liquid chrome, soft key light from the top left, a slightly long lens, the object whole and centred, pure black background everywhere the object is not. No text, no letters, no logo, no watermark, no UI. The same chrome planet with a cluster of small glossy chrome beads, like the first cells, gathering on one side of its surface.",
11
+ "reference": "modules/public-landing/public/assets/world/r2-chrome-blob-one.jpg, uploaded as the material/light/ground reference",
12
+ "resolution": "source panel about 220px across the object in a 1024x559 sheet, squared and upscaled to 1024px; soft if shown large, sized for the genesis life strip",
13
+ "source": "the owner's Gemini sheet, split by the ui-design kit browser (panel detection on the white dividers)",
14
+ "encoded": "canvas JPEG quality 0.92, 1024x1024, pure black ground",
15
+ "use": "dark mode: the genesis life strip, stage strategize (first cells)"
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "kind": "cutout",
3
+ "model": "Gemini image model (generated by the owner in the Gemini app, 2026-09-30; one 5-panel sheet)",
4
+ "aspect_ratio": "1:1",
5
+ "generated": "2026-09-30",
6
+ "round": 5,
7
+ "task": 1004425,
8
+ "stage": "charter",
9
+ "label": "the genome",
10
+ "prompt": "Mirror-polished liquid chrome, soft key light from the top left, a slightly long lens, the object whole and centred, pure black background everywhere the object is not. No text, no letters, no logo, no watermark, no UI. The same chrome planet wrapped loosely by a single double-helix ribbon of polished chrome, like DNA, circling it at an angle.",
11
+ "reference": "modules/public-landing/public/assets/world/r2-chrome-blob-one.jpg, uploaded as the material/light/ground reference",
12
+ "resolution": "1024x1024 from the same panel",
13
+ "source": "r5-life-3-genome.jpg with the black ground removed: flood-fill from the edges on near-black pixels, luminance-feathered",
14
+ "encoded": "canvas WebP quality 0.88 with alpha",
15
+ "use": "light mode: the genesis life strip, stage charter (the genome)"
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "kind": "plate",
3
+ "model": "Gemini image model (generated by the owner in the Gemini app, 2026-09-30; one 5-panel sheet)",
4
+ "aspect_ratio": "1:1",
5
+ "generated": "2026-09-30",
6
+ "round": 5,
7
+ "task": 1004425,
8
+ "stage": "charter",
9
+ "label": "the genome",
10
+ "prompt": "Mirror-polished liquid chrome, soft key light from the top left, a slightly long lens, the object whole and centred, pure black background everywhere the object is not. No text, no letters, no logo, no watermark, no UI. The same chrome planet wrapped loosely by a single double-helix ribbon of polished chrome, like DNA, circling it at an angle.",
11
+ "reference": "modules/public-landing/public/assets/world/r2-chrome-blob-one.jpg, uploaded as the material/light/ground reference",
12
+ "resolution": "source panel about 220px across the object in a 1024x559 sheet, squared and upscaled to 1024px; soft if shown large, sized for the genesis life strip",
13
+ "source": "the owner's Gemini sheet, split by the ui-design kit browser (panel detection on the white dividers)",
14
+ "encoded": "canvas JPEG quality 0.92, 1024x1024, pure black ground",
15
+ "use": "dark mode: the genesis life strip, stage charter (the genome)"
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "kind": "cutout",
3
+ "model": "Gemini image model (generated by the owner in the Gemini app, 2026-09-30; one 5-panel sheet)",
4
+ "aspect_ratio": "1:1",
5
+ "generated": "2026-09-30",
6
+ "round": 5,
7
+ "task": 1004425,
8
+ "stage": "legalize",
9
+ "label": "the membrane",
10
+ "prompt": "Mirror-polished liquid chrome, soft key light from the top left, a slightly long lens, the object whole and centred, pure black background everywhere the object is not. No text, no letters, no logo, no watermark, no UI. The same chrome planet sealed inside a thin, translucent frosted-glass shell, a soft membrane with a gentle inner glow.",
11
+ "reference": "modules/public-landing/public/assets/world/r2-chrome-blob-one.jpg, uploaded as the material/light/ground reference",
12
+ "resolution": "1024x1024 from the same panel",
13
+ "source": "r5-life-4-membrane.jpg with the black ground removed: flood-fill from the edges on near-black pixels, luminance-feathered; the halo outside the shell rim un-multiplied from black so the glow fades on light paper instead of darkening",
14
+ "encoded": "canvas WebP quality 0.88 with alpha",
15
+ "use": "light mode: the genesis life strip, stage legalize (the membrane)"
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "kind": "plate",
3
+ "model": "Gemini image model (generated by the owner in the Gemini app, 2026-09-30; one 5-panel sheet)",
4
+ "aspect_ratio": "1:1",
5
+ "generated": "2026-09-30",
6
+ "round": 5,
7
+ "task": 1004425,
8
+ "stage": "legalize",
9
+ "label": "the membrane",
10
+ "prompt": "Mirror-polished liquid chrome, soft key light from the top left, a slightly long lens, the object whole and centred, pure black background everywhere the object is not. No text, no letters, no logo, no watermark, no UI. The same chrome planet sealed inside a thin, translucent frosted-glass shell, a soft membrane with a gentle inner glow.",
11
+ "reference": "modules/public-landing/public/assets/world/r2-chrome-blob-one.jpg, uploaded as the material/light/ground reference",
12
+ "resolution": "source panel about 220px across the object in a 1024x559 sheet, squared and upscaled to 1024px; soft if shown large, sized for the genesis life strip",
13
+ "source": "the owner's Gemini sheet, split by the ui-design kit browser (panel detection on the white dividers)",
14
+ "encoded": "canvas JPEG quality 0.92, 1024x1024, pure black ground",
15
+ "use": "dark mode: the genesis life strip, stage legalize (the membrane)"
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "kind": "cutout",
3
+ "model": "Gemini image model (generated by the owner in the Gemini app, 2026-09-30; one 5-panel sheet)",
4
+ "aspect_ratio": "1:1",
5
+ "generated": "2026-09-30",
6
+ "round": 5,
7
+ "task": 1004425,
8
+ "stage": "legislation",
9
+ "label": "the nervous system",
10
+ "prompt": "Mirror-polished liquid chrome, soft key light from the top left, a slightly long lens, the object whole and centred, pure black background everywhere the object is not. No text, no letters, no logo, no watermark, no UI. The same chrome planet with fine branching chrome filaments spreading across its surface like neurons, a faint warm glow where they meet.",
11
+ "reference": "modules/public-landing/public/assets/world/r2-chrome-blob-one.jpg, uploaded as the material/light/ground reference",
12
+ "resolution": "1024x1024 from the same panel",
13
+ "source": "r5-life-5-nervous-system.jpg with the black ground removed: flood-fill from the edges on near-black pixels, luminance-feathered",
14
+ "encoded": "canvas WebP quality 0.88 with alpha",
15
+ "use": "light mode: the genesis life strip, stage legislation (the nervous system)"
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "kind": "plate",
3
+ "model": "Gemini image model (generated by the owner in the Gemini app, 2026-09-30; one 5-panel sheet)",
4
+ "aspect_ratio": "1:1",
5
+ "generated": "2026-09-30",
6
+ "round": 5,
7
+ "task": 1004425,
8
+ "stage": "legislation",
9
+ "label": "the nervous system",
10
+ "prompt": "Mirror-polished liquid chrome, soft key light from the top left, a slightly long lens, the object whole and centred, pure black background everywhere the object is not. No text, no letters, no logo, no watermark, no UI. The same chrome planet with fine branching chrome filaments spreading across its surface like neurons, a faint warm glow where they meet.",
11
+ "reference": "modules/public-landing/public/assets/world/r2-chrome-blob-one.jpg, uploaded as the material/light/ground reference",
12
+ "resolution": "source panel about 220px across the object in a 1024x559 sheet, squared and upscaled to 1024px; soft if shown large, sized for the genesis life strip",
13
+ "source": "the owner's Gemini sheet, split by the ui-design kit browser (panel detection on the white dividers)",
14
+ "encoded": "canvas JPEG quality 0.92, 1024x1024, pure black ground",
15
+ "use": "dark mode: the genesis life strip, stage legislation (the nervous system)"
16
+ }
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.20.51",
3
+ "version": "1.20.52",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.20.51",
9
+ "version": "1.20.52",
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.20.51",
3
+ "version": "1.20.52",
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",
@@ -8419,5 +8419,15 @@
8419
8419
  "id": "1004430",
8420
8420
  "text": "Hall navigation is more standard. The top bar now has a Back button when you open a page from inside another one. A builder's profile opened from the Builders list shows \"Back to Builders\" and returns you to the same spot in t"
8421
8421
  }
8422
+ ],
8423
+ "1.20.52": [
8424
+ {
8425
+ "id": "1004425",
8426
+ "text": "The project-startup flow now has its five life-stage pictures, one per stage of a new project's genesis: a primordial sea, first cells, a genome, a membrane and a nervous system, each in the chrome world's style with a dark an"
8427
+ },
8428
+ {
8429
+ "id": "1004475",
8430
+ "text": "Equity or shares is now also greyed out for a single-owner company and for a research entity, each with its own short reason. Only a regular for-profit company or a division of a corporation is offered equity. As before, it's"
8431
+ }
8422
8432
  ]
8423
8433
  }
package/src/module-api.js CHANGED
@@ -75,7 +75,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
75
75
  // MAJOR (see allowBoxScope below): passes the request through untouched.
76
76
  function deprecatedNoopMiddleware(_req, _res, next) { next(); }
77
77
 
78
- const CORE_VERSION = '1.20.51'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
78
+ const CORE_VERSION = '1.20.52'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
79
79
 
80
80
  // A namespaced logger so a module's log lines are attributable + consistent.
81
81
  // Usage: const log = api.logger('discord'); log.info('mounted');
@@ -0,0 +1,63 @@
1
+ // tests/genesis_life_plates.mjs — the five genesis life-stage plates (task 1004425 /
2
+ // BV2.PS12, goal 1000121).
3
+ //
4
+ // One plate per genesis stage, shipped as the world's pair: a black-ground JPEG for
5
+ // dark mode and an alpha WebP cutout for light, each with the provenance sidecar every
6
+ // world plate carries. The genesis home's life strip (the GenesisHall mock today, the
7
+ // live genesis home in PS08) reads them by these names, so a renamed or half-shipped
8
+ // pair breaks the strip silently: a missing image is an empty square, not an error.
9
+
10
+ import { test } from 'node:test';
11
+ import assert from 'node:assert/strict';
12
+ import fs from 'node:fs';
13
+ import path from 'node:path';
14
+ import { fileURLToPath } from 'node:url';
15
+
16
+ const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
17
+ const WORLD = path.join(ROOT, 'modules', 'public-landing', 'public', 'assets', 'world');
18
+ const MOCK = path.join(ROOT, 'docs', 'design', 'mocks', 'project-startup', 'GenesisHall.dc.html');
19
+
20
+ // The stages in genesis order, with the label the strip captions them by.
21
+ const PLATES = [
22
+ ['scope', 'primordial sea', 'r5-life-1-primordial-sea'],
23
+ ['strategize', 'first cells', 'r5-life-2-first-cells'],
24
+ ['charter', 'the genome', 'r5-life-3-genome'],
25
+ ['legalize', 'the membrane', 'r5-life-4-membrane'],
26
+ ['legislation', 'the nervous system', 'r5-life-5-nervous-system'],
27
+ ];
28
+
29
+ // The first bytes of each format, so a mislabelled file (a PNG saved as .jpg) fails here.
30
+ const isJpeg = (b) => b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff;
31
+ const isWebp = (b) => b.toString('ascii', 0, 4) === 'RIFF' && b.toString('ascii', 8, 12) === 'WEBP';
32
+
33
+ test('each genesis stage ships the world pair: a dark JPEG and a light WebP cutout', () => {
34
+ for (const [, , slug] of PLATES) {
35
+ const jpg = fs.readFileSync(path.join(WORLD, `${slug}.jpg`));
36
+ const cut = fs.readFileSync(path.join(WORLD, `${slug}-cut.webp`));
37
+ assert.ok(isJpeg(jpg), `${slug}.jpg is a JPEG`);
38
+ assert.ok(isWebp(cut), `${slug}-cut.webp is a WebP`);
39
+ }
40
+ });
41
+
42
+ test('every plate file carries a provenance sidecar naming its stage and label', () => {
43
+ for (const [stage, label, slug] of PLATES) {
44
+ for (const [file, kind] of [[`${slug}.jpg`, 'plate'], [`${slug}-cut.webp`, 'cutout']]) {
45
+ const side = JSON.parse(fs.readFileSync(path.join(WORLD, `${file}.json`), 'utf8'));
46
+ assert.equal(side.kind, kind, `${file}: kind`);
47
+ assert.equal(side.task, 1004425, `${file}: task`);
48
+ assert.equal(side.stage, stage, `${file}: stage`);
49
+ assert.equal(side.label, label, `${file}: label`);
50
+ assert.ok(side.prompt && side.model, `${file}: prompt and model recorded`);
51
+ }
52
+ }
53
+ });
54
+
55
+ test('the genesis mock life strip shows all five plates and no placeholder', () => {
56
+ const html = fs.readFileSync(MOCK, 'utf8');
57
+ assert.ok(!/plate to render/.test(html), 'no "plate to render" placeholder left');
58
+ for (const [stage, label, slug] of PLATES) {
59
+ const tile = html.split('\n').find((l) => l.includes(`<p class="cap">${stage}<b>${label}</b>`));
60
+ assert.ok(tile, `a tile for ${stage}`);
61
+ assert.ok(tile.includes(`/assets/world/${slug}-cut.webp`), `${stage} tile uses ${slug}`);
62
+ }
63
+ });
@@ -188,6 +188,20 @@ await t("the spec's three examples fire, each with its why line", () => {
188
188
  assert.equal(find({ entity: 'for-profit' }, 'reward_intents:equity').length, 0);
189
189
  });
190
190
 
191
+ await t('equity is greyed for a single-owner LLC and a research entity, each with its own reason (task 1004475, owner 2026-09-30)', () => {
192
+ const equity = (entity) => softLimitsFor({ entity }).limits.filter((l) => l.option === 'reward_intents:equity');
193
+ const llc = equity('single-owner-llc');
194
+ assert.equal(llc.length, 1); assert.equal(llc[0].effect, 'grey');
195
+ assert.match(llc[0].reason, /one owner/);
196
+ const research = equity('research');
197
+ assert.equal(research.length, 1); assert.equal(research[0].effect, 'grey');
198
+ assert.match(research[0].reason, /research/i);
199
+ assert.notEqual(llc[0].reason, research[0].reason, 'each says its own why');
200
+ // The two companies that can give a builder a stake are still offered it.
201
+ assert.equal(equity('for-profit').length, 0);
202
+ assert.equal(equity('corporate-division').length, 0);
203
+ });
204
+
191
205
  await t('a rule never fires on an answer nobody gave — only the platform-wide facts apply to a skipped interview', () => {
192
206
  const skipped = softLimitsFor({});
193
207
  for (const limit of skipped.limits) {