@bongos/core 1.24.59 → 1.24.61

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,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.24.59",
6
- "core_contract": "1.24.59",
7
- "source_commit": "a6ac4e31607a82978349eba6f0d2c113bdc48345",
5
+ "core_version": "1.24.61",
6
+ "core_contract": "1.24.61",
7
+ "source_commit": "074455f5f70a80b93f2d0d0b300cd1e0ffde4c7c",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-11-07T15:21:01.170Z",
9
+ "built_at": "2026-11-07T15:53:12.866Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 638,
@@ -17,7 +17,7 @@
17
17
  "gate": "passed"
18
18
  },
19
19
  "file_count": 4571,
20
- "tree_sha256": "0d58836fc7200aa61d37a68fc94e1fef65ba9556f5afb9e9c7105fcc474f0d4b",
20
+ "tree_sha256": "3a47117d4d3f490712a748e2757c6055a16f91e1d1709e2368024622ba8ec308",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -367,7 +367,7 @@
367
367
  {
368
368
  "path": "config/branding.neutral.json",
369
369
  "mode": "0000644",
370
- "sha256": "3fc7cefeb390fc6bab3c33c0a57753a90d1addaf559e3d6afecb50957819bc84"
370
+ "sha256": "f68f2148356fbb2b200e4449395cd70c0de995a6dbd83824daabb448b878d0eb"
371
371
  },
372
372
  {
373
373
  "path": "config/design-tokens.neutral.json",
@@ -2477,7 +2477,7 @@
2477
2477
  {
2478
2478
  "path": "docs/branding-contract.md",
2479
2479
  "mode": "0000644",
2480
- "sha256": "8b3cc175530daab089182c44d63d8d924ec67bcf42c0ccb520e9cf6fea5982f6"
2480
+ "sha256": "ad17037122411275bdcca49a5a7069deb2d2dddbdf7ef47fde859f51df6ea91d"
2481
2481
  },
2482
2482
  {
2483
2483
  "path": "docs/branding-fill-prompt.md",
@@ -2492,12 +2492,12 @@
2492
2492
  {
2493
2493
  "path": "docs/copy-inventory.md",
2494
2494
  "mode": "0000644",
2495
- "sha256": "9f6c2622a044bc47c67ce6e1555af9a956f4189c2057ee80ba969744cd194aed"
2495
+ "sha256": "7f97e11caa94b1693f38586940150ace84c2f9057f4d7fcc64eb80645d1512ea"
2496
2496
  },
2497
2497
  {
2498
2498
  "path": "docs/copy-registry.json",
2499
2499
  "mode": "0000644",
2500
- "sha256": "1503133709b601acaf90536389f65a6ba32725867e79ad210432538c641382e7"
2500
+ "sha256": "0fee9a8650df406535da5ceef77962fc63167990d3ca32290cded778219c7e80"
2501
2501
  },
2502
2502
  {
2503
2503
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2997,7 +2997,7 @@
2997
2997
  {
2998
2998
  "path": "docs/file-map.md",
2999
2999
  "mode": "0000644",
3000
- "sha256": "9f5ad5e2fbbe0ef916d7a9519118fb06655553451f13d6070220ce93f083b89f"
3000
+ "sha256": "1f1c7b5865a042ecc60fbb68c806b97fbf125370a6d17537cb6178c747c774dc"
3001
3001
  },
3002
3002
  {
3003
3003
  "path": "docs/handoff-template.md",
@@ -3007,7 +3007,7 @@
3007
3007
  {
3008
3008
  "path": "docs/module-api-changelog.md",
3009
3009
  "mode": "0000644",
3010
- "sha256": "b68ba24d900494bac49e77694a228c04794d1c0b5a43c4733159ee5429cbec4f"
3010
+ "sha256": "61622b0e04b04643ec4dbb40fa1ca22010c7afc1e27da81d878c69b194ecac26"
3011
3011
  },
3012
3012
  {
3013
3013
  "path": "docs/modules-contract.md",
@@ -3097,7 +3097,7 @@
3097
3097
  {
3098
3098
  "path": "docs/page-readings.json",
3099
3099
  "mode": "0000644",
3100
- "sha256": "16e8909e4de1207587056fece1ee2fc2455778f569d3338043fd6bc5eb05543d"
3100
+ "sha256": "88b9f5d7e3070c780c640b83c10cdbffd6411143d2a4e3c0f9bdd2a48126d9a1"
3101
3101
  },
3102
3102
  {
3103
3103
  "path": "docs/project-context.template.md",
@@ -10762,7 +10762,7 @@
10762
10762
  {
10763
10763
  "path": "modules/public-landing/public/index.html",
10764
10764
  "mode": "0000644",
10765
- "sha256": "de0fb5b87a4069bb068b1aaa267678a90c82f42fb4ca615bbdb019de53020c36"
10765
+ "sha256": "27630b553805d9ceabfdf773637df3a1198a3ca6bc7a2fc3fe9ac8b78e0744a6"
10766
10766
  },
10767
10767
  {
10768
10768
  "path": "modules/public-landing/public/index.probes.json",
@@ -11297,7 +11297,7 @@
11297
11297
  {
11298
11298
  "path": "modules/status-ui/public/README.md",
11299
11299
  "mode": "0000644",
11300
- "sha256": "77452dd9a7fcd5fb0b080cd74bc3c87dbd5dd02b30bc75e63076467291ddcdc3"
11300
+ "sha256": "75f17ca1a5953b38a8166fe0aa6daa6fa5582c8ca163c69db87c6e96d297d1a0"
11301
11301
  },
11302
11302
  {
11303
11303
  "path": "modules/status-ui/public/explore.html",
@@ -11352,7 +11352,7 @@
11352
11352
  {
11353
11353
  "path": "modules/ui-design/docs/design-contract.md",
11354
11354
  "mode": "0000644",
11355
- "sha256": "a4032fc607a6864db56531bb68bbd89a4a55c58d41b1798e7500b8c23bca104b"
11355
+ "sha256": "8a4375a548f75143f3ca3b05b5841ea8f02224b6613a45676985ad1f2038dcd0"
11356
11356
  },
11357
11357
  {
11358
11358
  "path": "modules/ui-design/kit/README.md",
@@ -11902,12 +11902,12 @@
11902
11902
  {
11903
11903
  "path": "package-lock.json",
11904
11904
  "mode": "0000644",
11905
- "sha256": "38c4ec31d6cb51fd92185003e550832f29d0e44f18f3a2df2b7d3594bdca972e"
11905
+ "sha256": "dc1a30721a1d7001d1bdf3cef618f61c5153d415aa8a23b185f856a3188479ee"
11906
11906
  },
11907
11907
  {
11908
11908
  "path": "package.json",
11909
11909
  "mode": "0000644",
11910
- "sha256": "0a9fbd43bcf2caa7e6c2b6faeef134a0dc96d7c5f1ee29519edf5d48ffb78db9"
11910
+ "sha256": "b491bd0afc113786b92c543a484947d6ec14b0b9719985bb821bee081e6340a6"
11911
11911
  },
11912
11912
  {
11913
11913
  "path": "public-docs/index.html",
@@ -11927,7 +11927,7 @@
11927
11927
  {
11928
11928
  "path": "release-notes.json",
11929
11929
  "mode": "0000644",
11930
- "sha256": "9735ab47bbd28140534686e37156442e586d1a7c5abce86f23ab0d546c9da0a7"
11930
+ "sha256": "244eb52141bda5874d8575bc0e62b785fa775f9aa51f124e9cfc7509a709f713"
11931
11931
  },
11932
11932
  {
11933
11933
  "path": "scripts/bongos/CLAUDE.md",
@@ -12267,7 +12267,7 @@
12267
12267
  {
12268
12268
  "path": "scripts/bongos/css-literal-scan.js",
12269
12269
  "mode": "0000644",
12270
- "sha256": "8da46806402a840192f29f93d98afd6b5018715f6fd4ce6fbe060e23ffc977de"
12270
+ "sha256": "1dbcdb46cfd195c1080bdd37bc8337b0926cd5f6e281cd131656801f6c92b236"
12271
12271
  },
12272
12272
  {
12273
12273
  "path": "scripts/bongos/cutover-codemod.js",
@@ -15812,7 +15812,7 @@
15812
15812
  {
15813
15813
  "path": "src/bongos/serve-internal.js",
15814
15814
  "mode": "0000644",
15815
- "sha256": "0d5a45ed0f8b8f907169a886504749887a659fbd2bdff23c28fa8146c3742a05"
15815
+ "sha256": "ab9d8ea8916de44b0b716cacd8e42a3d51cc8e78e04eaac9837365765d0d17d3"
15816
15816
  },
15817
15817
  {
15818
15818
  "path": "src/bongos/sign-in-pages.js",
@@ -15842,7 +15842,7 @@
15842
15842
  {
15843
15843
  "path": "src/branding.js",
15844
15844
  "mode": "0000644",
15845
- "sha256": "fc21c374775cd9951283b28b319d687dda5b768113a7ca7734191fe6c139d6a4"
15845
+ "sha256": "95b6aa41a818f16a2e48e62dda45e42e8800eeff8e1b959ce3e55e7ff22c504c"
15846
15846
  },
15847
15847
  {
15848
15848
  "path": "src/build-info.js",
@@ -15877,7 +15877,7 @@
15877
15877
  {
15878
15878
  "path": "src/module-api.js",
15879
15879
  "mode": "0000644",
15880
- "sha256": "06c54ea826895a4de9a90970d7b72e6479fada3880d45e1c1f164f29e7c319c5"
15880
+ "sha256": "27521706c60b70d9a73933dd7385d00db4846d5e7eff66f8df918671016e3a82"
15881
15881
  },
15882
15882
  {
15883
15883
  "path": "src/module-loader/catalog.js",
@@ -16677,7 +16677,7 @@
16677
16677
  {
16678
16678
  "path": "tests/brand_surfaces.mjs",
16679
16679
  "mode": "0000644",
16680
- "sha256": "26684884f85c8ad99966ae4f7713552cc12709c0d41100b3d7a5b60b8d50c9af"
16680
+ "sha256": "e39a15c534b0989c75ae44254de290b0487a33f5e0ec986ec10119d87ed217e6"
16681
16681
  },
16682
16682
  {
16683
16683
  "path": "tests/branding.mjs",
@@ -17412,7 +17412,7 @@
17412
17412
  {
17413
17413
  "path": "tests/design_counts_ratchet.mjs",
17414
17414
  "mode": "0000644",
17415
- "sha256": "2fd9ecdc86bb0a9b2392db350568eb4776a27b3d3bd43e896686475707a61a85"
17415
+ "sha256": "3e7457685c915d01d11ba4dd1481e726f82c83a3ce481f5190893e4b0636b7bc"
17416
17416
  },
17417
17417
  {
17418
17418
  "path": "tests/design_reference.mjs",
@@ -22237,7 +22237,7 @@
22237
22237
  {
22238
22238
  "path": "tests/status_company_attribution.mjs",
22239
22239
  "mode": "0000644",
22240
- "sha256": "585ab3d5617d01bfecfa67c157ce9bbaa0d5f5f9064faa41cfaa52ad55380670"
22240
+ "sha256": "becfaa842aa426f4b34a11a4e7364b1a8c1da30847b1580ed63256362a35d048"
22241
22241
  },
22242
22242
  {
22243
22243
  "path": "tests/status_default_version.mjs",
@@ -6,7 +6,8 @@
6
6
  "company": {
7
7
  "name": "",
8
8
  "site": "",
9
- "tagline": ""
9
+ "tagline": "",
10
+ "mark": ""
10
11
  }
11
12
  },
12
13
  "llmProjectName": "this project",
@@ -21,7 +21,7 @@ env override → instance config (config/branding.json) → neutral star
21
21
  |---|---|
22
22
  | `identity.productName` | The product name (e.g. "Example"). **Required.** |
23
23
  | `identity.worldName` | The in-world / civilization name rendered at runtime (e.g. "Example"). **Required.** |
24
- | `identity.company` | `{ name, site, tagline }` of the operating company — every field may be empty. `tagline` is the free-text clause that follows the name in the status page footer ("{{worldName}} is the work of **name**, *tagline*."), so put a location there if you want one; there is no separate location field. The footer stamps them as `{{companyName}}` / `{{companySite}}` / `{{companyTagline}}`, and each clause sits in a `<!--brand-if:KEY-->…<!--/brand-if:KEY-->` region that drops whole when its field is empty: no name hides the whole sentence, no site renders the name unlinked, no tagline ends the sentence at the name. (task [#1002853](https://cloudbongos.com/builders#/task/1002853)) |
24
+ | `identity.company` | `{ name, site, tagline, mark }` of the operating company — every field may be empty. `mark` is an image URL for the company's mark, stamped as `{{companyMark}}` in the landing's maker band inside a `brand-if:companyMark` region: no mark, no image (task 1005139). `tagline` is the free-text clause that follows the name in the status page footer ("{{worldName}} is the work of **name**, *tagline*."), so put a location there if you want one; there is no separate location field. The footer stamps them as `{{companyName}}` / `{{companySite}}` / `{{companyTagline}}`, and each clause sits in a `<!--brand-if:KEY-->…<!--/brand-if:KEY-->` region that drops whole when its field is empty: no name hides the whole sentence, no site renders the name unlinked, no tagline ends the sentence at the name. (task [#1002853](https://cloudbongos.com/builders#/task/1002853)) |
25
25
  | `llmProjectName` | The project name injected into grader / architect / onboarding **LLM prompts**, so a non-OTB instance is graded against its own identity. **Required.** |
26
26
  | `domains.publicOrigin` | Public game/app origin. **Required.** |
27
27
  | `domains.buildersOrigin` / `statusOrigin` | Hall + status origins. **These three (`publicOrigin`/`buildersOrigin`/`statusOrigin`) are the docs-discovery contract** ([ADR 0114](adr/0114-instance-docs-discovery-contract.md)): the hall is the canonical doc-reading surface, `/docs` on `publicOrigin` renders the API reference, the status page is the outage fallback. `GET <publicOrigin>/api/bongos` re-advertises them (`hall`/`status`/`public`) so an agent resolves the surfaces with no hard-coded host. |
@@ -2236,7 +2236,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
2236
2236
  | `afe83bbbd0d4` | certain | A non-profit, capture-resistant commons. | `modules/public-landing/public/connections.html:187` |
2237
2237
  | `afe83bbbd0d4` | certain | A non-profit, capture-resistant commons. | `modules/public-landing/public/contact.html:130` |
2238
2238
  | `afe83bbbd0d4` | certain | A non-profit, capture-resistant commons. | `modules/public-landing/public/guild.html:282` |
2239
- | `afe83bbbd0d4` | certain | A non-profit, capture-resistant commons. | `modules/public-landing/public/index.html:953` |
2239
+ | `afe83bbbd0d4` | certain | A non-profit, capture-resistant commons. | `modules/public-landing/public/index.html:954` |
2240
2240
  | `afe83bbbd0d4` | certain | A non-profit, capture-resistant commons. | `modules/public-landing/public/invitations.html:190` |
2241
2241
  | `afe83bbbd0d4` | certain | A non-profit, capture-resistant commons. | `modules/public-landing/public/privacy.html:143` |
2242
2242
  | `afe83bbbd0d4` | certain | A non-profit, capture-resistant commons. | `modules/public-landing/public/projects.html:2185` |
@@ -2277,10 +2277,10 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
2277
2277
  | `093091159e05` | certain | At present, all Bongos projects are held by {{companyName}} or its pilot clients. | `modules/public-landing/public/index.html:784` |
2278
2278
  | `caf18d1a2b8e` | certain | Auto (recommended) | `modules/public-landing/public/projects.html:2032` |
2279
2279
  | `b7ac7fbd7209` | certain | Back to your projects | `modules/public-landing/public/projects.html:1148` |
2280
- | `4782de01c86b` | certain | Bongos Managed. | `modules/public-landing/public/index.html:912` |
2280
+ | `4782de01c86b` | certain | Bongos Managed. | `modules/public-landing/public/index.html:913` |
2281
2281
  | `750136e8637c` | certain | Bringing AI to the builder, ideator, and artist in everyone. | `modules/public-landing/public/index.html:769` |
2282
2282
  | `3aaad242a24c` | certain | Build command | `modules/public-landing/public/projects.html:1964` |
2283
- | `0f1ec6cf9dfa` | certain | Build equity in multiple projects. | `modules/public-landing/public/index.html:926` |
2283
+ | `0f1ec6cf9dfa` | certain | Build equity in multiple projects. | `modules/public-landing/public/index.html:927` |
2284
2284
  | `0379baef7921` | certain | Builder guild access | `modules/public-landing/public/projects.html:2008` |
2285
2285
  | `9e64afc8d912` | certain | Builder of the month | `modules/public-landing/public/community.html:234` |
2286
2286
  | `39b61cc5172e` | certain | Builder of the week | `modules/public-landing/public/account.html:119` |
@@ -2335,7 +2335,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
2335
2335
  | `90a128c97eae` | certain | Builders' hall | `modules/public-landing/public/connections.html:187` |
2336
2336
  | `90a128c97eae` | certain | Builders' hall | `modules/public-landing/public/contact.html:130` |
2337
2337
  | `90a128c97eae` | certain | Builders' hall | `modules/public-landing/public/guild.html:282` |
2338
- | `90a128c97eae` | certain | Builders' hall | `modules/public-landing/public/index.html:959` |
2338
+ | `90a128c97eae` | certain | Builders' hall | `modules/public-landing/public/index.html:960` |
2339
2339
  | `90a128c97eae` | certain | Builders' hall | `modules/public-landing/public/invitations.html:190` |
2340
2340
  | `90a128c97eae` | certain | Builders' hall | `modules/public-landing/public/privacy.html:143` |
2341
2341
  | `90a128c97eae` | certain | Builders' hall | `modules/public-landing/public/projects.html:977` |
@@ -2349,14 +2349,14 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
2349
2349
  | `bd315dd71ea7` | certain | Built by agents, on Cloud&nbsp;Bongos. | `modules/public-landing/public/connections.html:187` |
2350
2350
  | `bd315dd71ea7` | certain | Built by agents, on Cloud&nbsp;Bongos. | `modules/public-landing/public/contact.html:130` |
2351
2351
  | `bd315dd71ea7` | certain | Built by agents, on Cloud&nbsp;Bongos. | `modules/public-landing/public/guild.html:282` |
2352
- | `bd315dd71ea7` | certain | Built by agents, on Cloud&nbsp;Bongos. | `modules/public-landing/public/index.html:953` |
2352
+ | `bd315dd71ea7` | certain | Built by agents, on Cloud&nbsp;Bongos. | `modules/public-landing/public/index.html:954` |
2353
2353
  | `bd315dd71ea7` | certain | Built by agents, on Cloud&nbsp;Bongos. | `modules/public-landing/public/invitations.html:190` |
2354
2354
  | `bd315dd71ea7` | certain | Built by agents, on Cloud&nbsp;Bongos. | `modules/public-landing/public/privacy.html:143` |
2355
2355
  | `bd315dd71ea7` | certain | Built by agents, on Cloud&nbsp;Bongos. | `modules/public-landing/public/terms.html:154` |
2356
- | `d23b1ca38aee` | certain | Built by {{companyName}}, {{productName}} is our way of making AI co-building usable by entire project groups, | `modules/public-landing/public/index.html:897` |
2356
+ | `d23b1ca38aee` | certain | Built by {{companyName}}, {{productName}} is our way of making AI co-building usable by entire project groups, | `modules/public-landing/public/index.html:898` |
2357
2357
  | `20b4fa9a0424` | certain | Built on Bongos. | `modules/public-landing/public/index.html:783` |
2358
2358
  | `8639cc7fcada` | certain | Buttons here ask the platform to act; each row reports only what was verified, and when. A standup keeps going | `modules/public-landing/public/projects.html:1084` |
2359
- | `101339c676b4` | certain | Buy microtransaction packages of code modules on our marketplace. | `modules/public-landing/public/index.html:914` |
2359
+ | `101339c676b4` | certain | Buy microtransaction packages of code modules on our marketplace. | `modules/public-landing/public/index.html:915` |
2360
2360
  | `aae97f9d46e9` | certain | By GitHub username. The invite is sent from your project’s own hall — that is the invite that lets them in — a | `modules/public-landing/public/projects.html:1392` |
2361
2361
  | `50d493f08964` | certain | Can find me | `modules/public-landing/public/account.html:251` |
2362
2362
  | `48d721eb2ed7` | certain | Can’t find me | `modules/public-landing/public/account.html:252` |
@@ -2423,8 +2423,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
2423
2423
  | `2f12266c6e37` | certain | Docker — use my repository’s Dockerfile | `modules/public-landing/public/projects.html:1961` |
2424
2424
  | `47d1558b17a3` | certain | Domain you own | `modules/public-landing/public/projects.html:1830` |
2425
2425
  | `8d812912c392` | certain | Don't use {{productName}} to break the law, to attack this site or other people's projects, to mine, spam or o | `modules/public-landing/public/terms.html:143` |
2426
- | `d919980d2ca5` | certain | Download our core code and protocols, and build instantly with your team. | `modules/public-landing/public/index.html:910` |
2427
- | `41c49e22002d` | certain | Download the CLI | `modules/public-landing/public/index.html:943` |
2426
+ | `d919980d2ca5` | certain | Download our core code and protocols, and build instantly with your team. | `modules/public-landing/public/index.html:911` |
2427
+ | `41c49e22002d` | certain | Download the CLI | `modules/public-landing/public/index.html:944` |
2428
2428
  | `544a3fb1602a` | certain | Each is the builder who earned the most {{currency}} across every project in that time, among the builders who | `modules/public-landing/public/community.html:237` |
2429
2429
  | `31881554ecb8` | certain | Each sign-in creates a session: a random token. A signed-out or expired session stays on record but can no lon | `modules/public-landing/public/privacy.html:113` |
2430
2430
  | `b451221d44da` | certain | Each week is decided once, the first time a community page asks for it after it ends, and it does not change a | `modules/public-landing/public/community.html:301` |
@@ -2432,7 +2432,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
2432
2432
  | `9a4a940d2a56` | certain | Emersonian Circles | `modules/public-landing/public/index.html:798` |
2433
2433
  | `9150fa905ba4` | certain | Enough for a small version. Trim it to one shared list, voting and a winner reveal; accounts and notifications | `modules/public-landing/public/projects.html:1606` |
2434
2434
  | `05fed739a9e1` | certain | Enter Genesis | `modules/public-landing/public/projects.html:2160` |
2435
- | `af5ca714d375` | certain | Equity issuance, business filing, and builder compensation. | `modules/public-landing/public/index.html:917` |
2435
+ | `af5ca714d375` | certain | Equity issuance, business filing, and builder compensation. | `modules/public-landing/public/index.html:918` |
2436
2436
  | `ca61755eef01` | certain | Erased for good: | `modules/public-landing/public/projects.html:1491` |
2437
2437
  | `78611d18f54b` | certain | Every part of this — what is stored, where, and for how long — is public. This site runs Cloud Bongos, free so | `modules/public-landing/public/privacy.html:138` |
2438
2438
  | `069634b92263` | certain | Every project gets one on this platform, at its own handle. You can point a domain you already own at it inste | `modules/public-landing/public/projects.html:1254` |
@@ -2468,21 +2468,21 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
2468
2468
  | `f1e93ba98ceb` | certain | Find a builder | `modules/public-landing/public/projects.html:876` |
2469
2469
  | `f1e93ba98ceb` | certain | Find a builder | `modules/public-landing/public/terms.html:72` |
2470
2470
  | `f1e93ba98ceb` | certain | Find a builder | `modules/public-landing/public/terms.html:85` |
2471
- | `0208e4bbba9c` | certain | Find a project | `modules/public-landing/public/index.html:940` |
2471
+ | `0208e4bbba9c` | certain | Find a project | `modules/public-landing/public/index.html:941` |
2472
2472
  | `0208e4bbba9c` | certain | Find a project | `modules/public-landing/public/projects.html:825` |
2473
2473
  | `483a7eff25f2` | certain | Find a project to join | `modules/public-landing/public/index.html:773` |
2474
2474
  | `964c23113e4f` | certain | Follow the people :) | `modules/public-landing/public/contact.html:115` |
2475
2475
  | `0a0667aea2db` | certain | Footer doors before launch: privacy, terms and contact pages linked from the landing page and the hub | `modules/public-landing/public/index.html:873` |
2476
2476
  | `1977ccbf64e3` | certain | For Cloud Bongos itself — the platform these projects run on — two environments of its own. | `modules/public-landing/public/contact.html:125` |
2477
- | `f510ba460300` | certain | For builders | `modules/public-landing/public/index.html:923` |
2478
- | `dbced351ca0d` | certain | For founders | `modules/public-landing/public/index.html:907` |
2477
+ | `f510ba460300` | certain | For builders | `modules/public-landing/public/index.html:924` |
2478
+ | `dbced351ca0d` | certain | For founders | `modules/public-landing/public/index.html:908` |
2479
2479
  | `6007218fd3d9` | certain | For-profit company | `modules/public-landing/public/projects.html:1702` |
2480
2480
  | `1497b6e85da0` | certain | Free core only | `modules/public-landing/public/projects.html:1997` |
2481
2481
  | `aab2b51efeab` | certain | Free while we find our feet. Your project’s repo and server are yours — | `modules/public-landing/public/projects.html:1557` |
2482
2482
  | `0808df6e434c` | certain | From your settings you can hide your statistics, drop out of the recruiting directory, or make your account pr | `modules/public-landing/public/terms.html:128` |
2483
2483
  | `255bc1ce35eb` | certain | Full access | `modules/public-landing/public/projects.html:1674` |
2484
2484
  | `688eb71d9170` | certain | Future payouts | `modules/public-landing/public/projects.html:1910` |
2485
- | `8bb1f00b1558` | certain | Get access to our advanced project presets and module packages. | `modules/public-landing/public/index.html:916` |
2485
+ | `8bb1f00b1558` | certain | Get access to our advanced project presets and module packages. | `modules/public-landing/public/index.html:917` |
2486
2486
  | `36e5a4d78071` | certain | GitHub handle | `modules/public-landing/public/projects.html:2149` |
2487
2487
  | `36e5a4d78071` | certain | GitHub handle | `modules/public-landing/public/projects.html:2150` |
2488
2488
  | `98eb6344d39e` | certain | GitHub owner | `modules/public-landing/public/projects.html:1799` |
@@ -2491,7 +2491,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
2491
2491
  | `8c815a28df30` | certain | GitHub, Google or both. Each one opens this same account, with the same credits, ranks and history. | `modules/public-landing/public/account.html:221` |
2492
2492
  | `cf1458a108cd` | certain | Guild name or /g/ address | `modules/public-landing/public/projects.html:1409` |
2493
2493
  | `4a96e3af1110` | certain | Guild name or address | `modules/public-landing/public/projects.html:1408` |
2494
- | `41778f67b4c9` | certain | Have us handle your hosting. | `modules/public-landing/public/index.html:915` |
2494
+ | `41778f67b4c9` | certain | Have us handle your hosting. | `modules/public-landing/public/index.html:916` |
2495
2495
  | `50dd0f948962` | certain | Have you found a way into our little system of minimal importance? Contact the project owner directly. | `modules/public-landing/public/contact.html:121` |
2496
2496
  | `ccd4861996eb` | certain | Hide it | `modules/public-landing/public/account.html:276` |
2497
2497
  | `978da2e651bd` | certain | Hosted projects | `modules/public-landing/public/terms.html:119` |
@@ -2615,12 +2615,12 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
2615
2615
  | `d6314ddcc1d0` | certain | Open source | `modules/public-landing/public/connections.html:187` |
2616
2616
  | `d6314ddcc1d0` | certain | Open source | `modules/public-landing/public/contact.html:130` |
2617
2617
  | `d6314ddcc1d0` | certain | Open source | `modules/public-landing/public/guild.html:282` |
2618
- | `d6314ddcc1d0` | certain | Open source | `modules/public-landing/public/index.html:953` |
2618
+ | `d6314ddcc1d0` | certain | Open source | `modules/public-landing/public/index.html:954` |
2619
2619
  | `d6314ddcc1d0` | certain | Open source | `modules/public-landing/public/invitations.html:190` |
2620
2620
  | `d6314ddcc1d0` | certain | Open source | `modules/public-landing/public/privacy.html:143` |
2621
2621
  | `d6314ddcc1d0` | certain | Open source | `modules/public-landing/public/projects.html:2185` |
2622
2622
  | `d6314ddcc1d0` | certain | Open source | `modules/public-landing/public/terms.html:154` |
2623
- | `275ca0d5ce65` | certain | Open source. | `modules/public-landing/public/index.html:910` |
2623
+ | `275ca0d5ce65` | certain | Open source. | `modules/public-landing/public/index.html:911` |
2624
2624
  | `1e116d8fe95a` | certain | Open to recruiters | `modules/public-landing/public/account.html:121` |
2625
2625
  | `1e116d8fe95a` | certain | Open to recruiters | `modules/public-landing/public/account.html:133` |
2626
2626
  | `1e116d8fe95a` | certain | Open to recruiters | `modules/public-landing/public/community.html:189` |
@@ -2662,7 +2662,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
2662
2662
  | `875e313de939` | certain | Physical files or work is the main one | `modules/public-landing/public/projects.html:1746` |
2663
2663
  | `af309d83b861` | certain | Pick a project from the map, or paste any project’s address — its owner sees your application in their own que | `modules/public-landing/public/invitations.html:173` |
2664
2664
  | `d4e9bf625ab3` | certain | Pick one of your repositories | `modules/public-landing/public/projects.html:1769` |
2665
- | `384c5b38f500` | certain | Play as a: game or learning experience. | `modules/public-landing/public/index.html:928` |
2665
+ | `384c5b38f500` | certain | Play as a: game or learning experience. | `modules/public-landing/public/index.html:929` |
2666
2666
  | `b131252149e6` | certain | Play cloud hop while you wait | `modules/public-landing/public/projects.html:2122` |
2667
2667
  | `fe7e815b989c` | certain | Privacy Page | `modules/public-landing/public/contact.html:118` |
2668
2668
  | `d0c4d9ddcd71` | certain | Private individual | `modules/public-landing/public/projects.html:1709` |
@@ -2786,7 +2786,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
2786
2786
  | `26e3868ace39` | certain | Sort the projects | `modules/public-landing/public/projects.html:960` |
2787
2787
  | `fa9afbbe8173` | certain | Sorted by name, A to Z. | `modules/public-landing/public/projects.html:981` |
2788
2788
  | `2ae36be1c531` | certain | Start a project | `modules/public-landing/public/index.html:774` |
2789
- | `2ae36be1c531` | certain | Start a project | `modules/public-landing/public/index.html:939` |
2789
+ | `2ae36be1c531` | certain | Start a project | `modules/public-landing/public/index.html:940` |
2790
2790
  | `2ae36be1c531` | certain | Start a project | `modules/public-landing/public/projects.html:936` |
2791
2791
  | `e7c7838545ee` | certain | Start command | `modules/public-landing/public/projects.html:1967` |
2792
2792
  | `9a042be7cfd7` | certain | Starting from zero | `modules/public-landing/public/projects.html:1739` |
@@ -2824,7 +2824,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
2824
2824
  | `502ab071ba33` | certain | The short version: this is free software run by its owner, your code stays yours, and you are responsible for | `modules/public-landing/public/terms.html:105` |
2825
2825
  | `40ed6300ba27` | certain | The six most recent shipped tasks. | `modules/public-landing/public/index.html:845` |
2826
2826
  | `c0c201325b44` | certain | The totals add up everyone else. | `modules/public-landing/public/guild.html:226` |
2827
- | `73230bca8688` | certain | The {{companyName}} mark | `modules/public-landing/public/index.html:894` |
2827
+ | `73230bca8688` | certain | The {{companyName}} mark | `modules/public-landing/public/index.html:895` |
2828
2828
  | `ae77c49f9671` | certain | Their handle | `modules/public-landing/public/connections.html:174` |
2829
2829
  | `ae77c49f9671` | certain | Their handle | `modules/public-landing/public/connections.html:175` |
2830
2830
  | `541d5a7612a9` | certain | Their name or handle | `modules/public-landing/public/community.html:312` |
@@ -2851,7 +2851,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
2851
2851
  | `50f764cf1229` | certain | Two things, and only two: a name — this project already has one — and a description of what it is. Modules, ar | `modules/public-landing/public/projects.html:1240` |
2852
2852
  | `b0c3729108be` | certain | Type a country | `modules/public-landing/public/projects.html:1657` |
2853
2853
  | `bd1761f316f7` | certain | Type a state or province | `modules/public-landing/public/projects.html:1661` |
2854
- | `a165999f36a9` | certain | Types of projects | `modules/public-landing/public/index.html:908` |
2854
+ | `a165999f36a9` | certain | Types of projects | `modules/public-landing/public/index.html:909` |
2855
2855
  | `2f740afee113` | certain | US and EU | `modules/public-landing/public/projects.html:1681` |
2856
2856
  | `693b824cb0b9` | certain | US only | `modules/public-landing/public/projects.html:1680` |
2857
2857
  | `11416e2b83fa` | certain | Use these | `modules/public-landing/public/projects.html:1617` |
@@ -2859,7 +2859,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
2859
2859
  | `b97287183335` | certain | View Projects | `modules/public-landing/public/index.html:802` |
2860
2860
  | `f68a38de7e1b` | certain | Visitors who aren’t signed in meet a sign-in door instead of the project’s pages — its front page, its status | `modules/public-landing/public/projects.html:1284` |
2861
2861
  | `3d6b0bf6c2db` | certain | Waiting on you | `modules/public-landing/public/invitations.html:154` |
2862
- | `3597d73ce7f9` | certain | Ways to get paid/rewarded | `modules/public-landing/public/index.html:924` |
2862
+ | `3597d73ce7f9` | certain | Ways to get paid/rewarded | `modules/public-landing/public/index.html:925` |
2863
2863
  | `5361539434e0` | certain | We already have a legal entity | `modules/public-landing/public/projects.html:1696` |
2864
2864
  | `784aa2a44bf0` | certain | We couldn’t read your GitHub repositories just now, so enter the repo by hand below. | `modules/public-landing/public/projects.html:1766` |
2865
2865
  | `0d15556febdd` | certain | We don’t have one yet | `modules/public-landing/public/projects.html:1711` |
@@ -2909,7 +2909,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
2909
2909
  | `101301013616` | certain | Why there is nowhere to type the value | `modules/public-landing/public/projects.html:1374` |
2910
2910
  | `f1474a4af906` | certain | Will anyone under 18 build? | `modules/public-landing/public/projects.html:1663` |
2911
2911
  | `5ca5f2595a65` | certain | Word documents, spreadsheets, other software. | `modules/public-landing/public/projects.html:1745` |
2912
- | `a581f96fb2c8` | certain | Work as a paid contractor for companies big, medium and small. | `modules/public-landing/public/index.html:927` |
2912
+ | `a581f96fb2c8` | certain | Work as a paid contractor for companies big, medium and small. | `modules/public-landing/public/index.html:928` |
2913
2913
  | `ee4b8cc687f7` | certain | Works shipped | `modules/public-landing/public/guild.html:259` |
2914
2914
  | `8a4892d03781` | certain | World round: PRODUCT.md and four style candidates across landing, hall and status | `modules/public-landing/public/index.html:867` |
2915
2915
  | `2388a450deb9` | certain | You agree to follow the terms and usage policies of the AI company whose model answers your request, and OpenR | `modules/public-landing/public/terms.html:136` |
@@ -394,7 +394,7 @@
394
394
  "modules/public-landing/public/connections.html:187",
395
395
  "modules/public-landing/public/contact.html:130",
396
396
  "modules/public-landing/public/guild.html:282",
397
- "modules/public-landing/public/index.html:959",
397
+ "modules/public-landing/public/index.html:960",
398
398
  "modules/public-landing/public/invitations.html:190",
399
399
  "modules/public-landing/public/privacy.html:143",
400
400
  "modules/public-landing/public/projects.html:977",
@@ -452,7 +452,7 @@
452
452
  "modules/public-landing/public/connections.html:187",
453
453
  "modules/public-landing/public/contact.html:130",
454
454
  "modules/public-landing/public/guild.html:282",
455
- "modules/public-landing/public/index.html:953",
455
+ "modules/public-landing/public/index.html:954",
456
456
  "modules/public-landing/public/invitations.html:190",
457
457
  "modules/public-landing/public/privacy.html:143",
458
458
  "modules/public-landing/public/projects.html:2185",
@@ -506,7 +506,7 @@
506
506
  "modules/public-landing/public/connections.html:187",
507
507
  "modules/public-landing/public/contact.html:130",
508
508
  "modules/public-landing/public/guild.html:282",
509
- "modules/public-landing/public/index.html:953",
509
+ "modules/public-landing/public/index.html:954",
510
510
  "modules/public-landing/public/invitations.html:190",
511
511
  "modules/public-landing/public/privacy.html:143",
512
512
  "modules/public-landing/public/projects.html:2185",
@@ -578,7 +578,7 @@
578
578
  "modules/public-landing/public/connections.html:187",
579
579
  "modules/public-landing/public/contact.html:130",
580
580
  "modules/public-landing/public/guild.html:282",
581
- "modules/public-landing/public/index.html:953",
581
+ "modules/public-landing/public/index.html:954",
582
582
  "modules/public-landing/public/invitations.html:190",
583
583
  "modules/public-landing/public/privacy.html:143",
584
584
  "modules/public-landing/public/terms.html:154"
@@ -963,7 +963,7 @@
963
963
  "occurrences": 3,
964
964
  "at": [
965
965
  "modules/public-landing/public/index.html:774",
966
- "modules/public-landing/public/index.html:939",
966
+ "modules/public-landing/public/index.html:940",
967
967
  "modules/public-landing/public/projects.html:936"
968
968
  ]
969
969
  },
@@ -1581,7 +1581,7 @@
1581
1581
  "text": "Find a project",
1582
1582
  "occurrences": 2,
1583
1583
  "at": [
1584
- "modules/public-landing/public/index.html:940",
1584
+ "modules/public-landing/public/index.html:941",
1585
1585
  "modules/public-landing/public/projects.html:825"
1586
1586
  ]
1587
1587
  },
@@ -21537,7 +21537,7 @@
21537
21537
  "surface": "landing",
21538
21538
  "text": "A non-profit, capture-resistant commons.",
21539
21539
  "file": "modules/public-landing/public/index.html",
21540
- "line": 953,
21540
+ "line": 954,
21541
21541
  "origin": "html-text",
21542
21542
  "confidence": "certain"
21543
21543
  },
@@ -21906,7 +21906,7 @@
21906
21906
  "surface": "landing",
21907
21907
  "text": "Bongos Managed.",
21908
21908
  "file": "modules/public-landing/public/index.html",
21909
- "line": 912,
21909
+ "line": 913,
21910
21910
  "origin": "html-text",
21911
21911
  "confidence": "certain"
21912
21912
  },
@@ -21933,7 +21933,7 @@
21933
21933
  "surface": "landing",
21934
21934
  "text": "Build equity in multiple projects.",
21935
21935
  "file": "modules/public-landing/public/index.html",
21936
- "line": 926,
21936
+ "line": 927,
21937
21937
  "origin": "html-text",
21938
21938
  "confidence": "certain"
21939
21939
  },
@@ -22428,7 +22428,7 @@
22428
22428
  "surface": "landing",
22429
22429
  "text": "Builders' hall",
22430
22430
  "file": "modules/public-landing/public/index.html",
22431
- "line": 959,
22431
+ "line": 960,
22432
22432
  "origin": "html-text",
22433
22433
  "confidence": "certain"
22434
22434
  },
@@ -22554,7 +22554,7 @@
22554
22554
  "surface": "landing",
22555
22555
  "text": "Built by agents, on Cloud&nbsp;Bongos.",
22556
22556
  "file": "modules/public-landing/public/index.html",
22557
- "line": 953,
22557
+ "line": 954,
22558
22558
  "origin": "html-text",
22559
22559
  "confidence": "certain"
22560
22560
  },
@@ -22590,7 +22590,7 @@
22590
22590
  "surface": "landing",
22591
22591
  "text": "Built by {{companyName}}, {{productName}} is our way of making AI co-building usable by entire project groups, whether that's a 5,000-person company, a 100-person department, a college research project, or a solo dev.",
22592
22592
  "file": "modules/public-landing/public/index.html",
22593
- "line": 897,
22593
+ "line": 898,
22594
22594
  "origin": "html-text",
22595
22595
  "confidence": "certain"
22596
22596
  },
@@ -22617,7 +22617,7 @@
22617
22617
  "surface": "landing",
22618
22618
  "text": "Buy microtransaction packages of code modules on our marketplace.",
22619
22619
  "file": "modules/public-landing/public/index.html",
22620
- "line": 914,
22620
+ "line": 915,
22621
22621
  "origin": "html-text",
22622
22622
  "confidence": "certain"
22623
22623
  },
@@ -23220,7 +23220,7 @@
23220
23220
  "surface": "landing",
23221
23221
  "text": "Download our core code and protocols, and build instantly with your team.",
23222
23222
  "file": "modules/public-landing/public/index.html",
23223
- "line": 910,
23223
+ "line": 911,
23224
23224
  "origin": "html-text",
23225
23225
  "confidence": "certain"
23226
23226
  },
@@ -23229,7 +23229,7 @@
23229
23229
  "surface": "landing",
23230
23230
  "text": "Download the CLI",
23231
23231
  "file": "modules/public-landing/public/index.html",
23232
- "line": 943,
23232
+ "line": 944,
23233
23233
  "origin": "html-text",
23234
23234
  "confidence": "certain"
23235
23235
  },
@@ -23301,7 +23301,7 @@
23301
23301
  "surface": "landing",
23302
23302
  "text": "Equity issuance, business filing, and builder compensation.",
23303
23303
  "file": "modules/public-landing/public/index.html",
23304
- "line": 917,
23304
+ "line": 918,
23305
23305
  "origin": "html-text",
23306
23306
  "confidence": "certain"
23307
23307
  },
@@ -23625,7 +23625,7 @@
23625
23625
  "surface": "landing",
23626
23626
  "text": "Find a project",
23627
23627
  "file": "modules/public-landing/public/index.html",
23628
- "line": 940,
23628
+ "line": 941,
23629
23629
  "origin": "html-text",
23630
23630
  "confidence": "certain"
23631
23631
  },
@@ -23679,7 +23679,7 @@
23679
23679
  "surface": "landing",
23680
23680
  "text": "For builders",
23681
23681
  "file": "modules/public-landing/public/index.html",
23682
- "line": 923,
23682
+ "line": 924,
23683
23683
  "origin": "html-text",
23684
23684
  "confidence": "certain"
23685
23685
  },
@@ -23688,7 +23688,7 @@
23688
23688
  "surface": "landing",
23689
23689
  "text": "For founders",
23690
23690
  "file": "modules/public-landing/public/index.html",
23691
- "line": 907,
23691
+ "line": 908,
23692
23692
  "origin": "html-text",
23693
23693
  "confidence": "certain"
23694
23694
  },
@@ -23751,7 +23751,7 @@
23751
23751
  "surface": "landing",
23752
23752
  "text": "Get access to our advanced project presets and module packages.",
23753
23753
  "file": "modules/public-landing/public/index.html",
23754
- "line": 916,
23754
+ "line": 917,
23755
23755
  "origin": "html-text",
23756
23756
  "confidence": "certain"
23757
23757
  },
@@ -23832,7 +23832,7 @@
23832
23832
  "surface": "landing",
23833
23833
  "text": "Have us handle your hosting.",
23834
23834
  "file": "modules/public-landing/public/index.html",
23835
- "line": 915,
23835
+ "line": 916,
23836
23836
  "origin": "html-text",
23837
23837
  "confidence": "certain"
23838
23838
  },
@@ -24948,7 +24948,7 @@
24948
24948
  "surface": "landing",
24949
24949
  "text": "Open source",
24950
24950
  "file": "modules/public-landing/public/index.html",
24951
- "line": 953,
24951
+ "line": 954,
24952
24952
  "origin": "html-text",
24953
24953
  "confidence": "certain"
24954
24954
  },
@@ -24993,7 +24993,7 @@
24993
24993
  "surface": "landing",
24994
24994
  "text": "Open source.",
24995
24995
  "file": "modules/public-landing/public/index.html",
24996
- "line": 910,
24996
+ "line": 911,
24997
24997
  "origin": "html-text",
24998
24998
  "confidence": "certain"
24999
24999
  },
@@ -25371,7 +25371,7 @@
25371
25371
  "surface": "landing",
25372
25372
  "text": "Play as a: game or learning experience.",
25373
25373
  "file": "modules/public-landing/public/index.html",
25374
- "line": 928,
25374
+ "line": 929,
25375
25375
  "origin": "html-text",
25376
25376
  "confidence": "certain"
25377
25377
  },
@@ -26487,7 +26487,7 @@
26487
26487
  "surface": "landing",
26488
26488
  "text": "Start a project",
26489
26489
  "file": "modules/public-landing/public/index.html",
26490
- "line": 939,
26490
+ "line": 940,
26491
26491
  "origin": "html-text",
26492
26492
  "confidence": "certain"
26493
26493
  },
@@ -26829,7 +26829,7 @@
26829
26829
  "surface": "landing",
26830
26830
  "text": "The {{companyName}} mark",
26831
26831
  "file": "modules/public-landing/public/index.html",
26832
- "line": 894,
26832
+ "line": 895,
26833
26833
  "origin": "html-attr:alt",
26834
26834
  "confidence": "certain"
26835
26835
  },
@@ -27072,7 +27072,7 @@
27072
27072
  "surface": "landing",
27073
27073
  "text": "Types of projects",
27074
27074
  "file": "modules/public-landing/public/index.html",
27075
- "line": 908,
27075
+ "line": 909,
27076
27076
  "origin": "html-text",
27077
27077
  "confidence": "certain"
27078
27078
  },
@@ -27144,7 +27144,7 @@
27144
27144
  "surface": "landing",
27145
27145
  "text": "Ways to get paid/rewarded",
27146
27146
  "file": "modules/public-landing/public/index.html",
27147
- "line": 924,
27147
+ "line": 925,
27148
27148
  "origin": "html-text",
27149
27149
  "confidence": "certain"
27150
27150
  },
@@ -27594,7 +27594,7 @@
27594
27594
  "surface": "landing",
27595
27595
  "text": "Work as a paid contractor for companies big, medium and small.",
27596
27596
  "file": "modules/public-landing/public/index.html",
27597
- "line": 927,
27597
+ "line": 928,
27598
27598
  "origin": "html-text",
27599
27599
  "confidence": "certain"
27600
27600
  },
package/docs/file-map.md CHANGED
@@ -121,7 +121,7 @@
121
121
  │ ├── raise/ ← the /raise investor page (task 1004847, ADR 0384, default-off; hub only): password-gated for investors (signing in accepts the NDA, non-binding interest), edited in place by any active builder with every change logged. The copy in content/ is the owner's words — never reword it in code. module.json, CLAUDE.md, raise.js (pure), page.js, web.js (the GET-only raise.web port core mounts at /raise), db.js, routes/ (every write), migrations/, content/, views/, public/.
122
122
  │ ├── npm-release/ ← the deploy page for a project that publishes an npm package from GitHub (task 1002622, default-OFF — on only in the Bongos hall, which publishes @bongos/core). "Where the work is": every task finished in the last 14 days, placed in the stage it has actually reached (not merged · merged, no version yet · published, not running here · running here, not released · released · in no version), plus the version history — each version's tasks. The version↔task join reads the release-notes.json the package itself carries (scripts/bongos/release-notes.js writes it at pack time), streamed out of the NEWEST version's npm tarball in-process (no child process, no sync call) when the running core's own copy stops short. module.json, work.js (the reading + the stage placement — the packument, tarball stream and tar reader it uses are the core's src/bongos/package-registry.js, reached through the doorway's readPackageRegistry since task 1004296), routes/work.js (GET /npm-release/work, gated core.pin.move like the page), public/work.{js,css} (the two sections /deploy lends it: #nr-work, #nr-versions). Task 1004301 added the same line on a task's own page: routes/task-where.js (GET /npm-release/task/:id, any signed-in builder — it shows nothing not already public) + public/task-widget.js, injected into task.html by the loader's uiSections seam (hallWidgetScripts file task-widget.js) to fill #task-contrib on otb:task-shown. Tests sit at the repo root — tests/npm_release_{work,page}.mjs — because a default-off module's own tests/ is skipped by the unit runner.
123
123
  │ ├── render-deploy/ ← the deploy page for a project whose app deploys through Render (task 1004270, default-OFF). The service's Render deploys, each tied to its commit and the Bongos tasks in it, what is live now, and deploy + roll back behind a two-step confirm the server also holds. The owner's Render key is never stored: it rides each request in a header. Uses the one Render client, scripts/bongos/render-api.js, and its ownerId guard. `deploys.js` (shaping + ledger), `render.js` (key + client), `routes/` (app, history, act), `public/deploy.js` (the page, mounted in /deploy), `migrations/` (one two-id table)
124
- │ ├── ui-design/ ← CORE-DOMAIN module (task 1003324 / ADR 0197, default-on): the design capability every builder on every instance gets — ships METHOD, never a world. Absorbs ADR 0081's layer: adapters/{claude-design,figma}/index.js (moved from src/ui/adapters/), scripts/{design-sync,figma-design-sync,validate-design}.js (moved from scripts/bongos/, which keeps thin shims), docs/design-contract.md (moved from docs/). Declaration-only: contributes.skills design (the /design playbook, new) + design-sync + figma-design-sync; no routes/port/migrations, so disabling it touches no served surface. CLAUDE.md separates the platform FLOORS (the Fifteen Rule, the dark twins, no page :root, the 24px floor, AA in both modes, the kill switch) from the instance's WORLD (its packs + DESIGN.md). kit/ (task 1003320) is the look-before-you-ship kit: lib.js (the floors, the states/probes contracts, the action + expectation vocabularies, the WCAG maths, the stub spawner), serve.js (any surface through the doorway's real transforms + fixtures/), render.js (states × 1440/390/320 × dark/light, audited), probe.js (PASS/FAIL contracts), check-mock.js (platform rules + the instance's DESIGN.md taste bans, then the detector), tells.js (task 1003329 / ADR 0223: the anti-pattern detector as two tiers — floors FAIL, craft tells WARN, kit-ignore waivers per file; the rendered twins live in lib.js factsInPage), contrast.js + png.js; a page's <page>.states.json / <page>.probes.json sit BESIDE the surface (modules/public-landing/public/, modules/hall-ui/public/). Recipe: docs/recipes/ui-look-before-you-ship.md. The thirteen design-style skills that lived in skills/ are the opt-in design-styles module since task 1004470 (below); design-taste-frontend-v1 was deleted. styles/ (task 1003323 / ADR 0219) is the style library: <name>/pack.json (the theme.ui overlay, exactly the fifteen) + DESIGN.md (the look's derived recipes, thirteen in lockstep with the pack) + mock.html (the specimen); chrome-world (pinned to the neutral pack), expedition, grove, blueprint (the first cool look, authored through /style at task 1003475); STYLE=<name> on the kit lays a look over the instance's pack through GDS_BRANDING_FILE; tests/ui_design_styles.mjs runs the world/cosmos/hall token suites once per alternate (UI_DESIGN_PACK). config/design-tokens.* + design-sources.json STAY in config/ as the host boundary; public-landing keeps its own key (first customer, not owner).
124
+ │ ├── ui-design/ ← CORE-DOMAIN module (task 1003324 / ADR 0197, default-on): the design capability every builder on every instance gets — ships METHOD, never a world. Absorbs ADR 0081's layer: adapters/{claude-design,figma}/index.js (moved from src/ui/adapters/), scripts/{design-sync,figma-design-sync,validate-design}.js (moved from scripts/bongos/, which keeps thin shims), docs/design-contract.md (moved from docs/). Contributes.skills design (the /design playbook) + design-sync + figma-design-sync; no routes/port/migrations, but it DOES serve files every surface loads (task 1005139): public/tokens.css (the shared --ds-* token sheet every surface links, task 1005081), public/brand/ (mark.svg, the one logo source, plus the logo, favicon and PNG files scripts/bongos/gen-brand.js writes from it, with png-sources.json recording the PNGs' hashes, tasks 1005088/1005133), and public/brand.html + brand.css (the /brand design-system reference on the hub, task 1005083). Its generators: scripts/gen-design-tokens.js (config/design-tokens.neutral.json) and scripts/gen-design-reference.js (brand.html), plus core's scripts/bongos/gen-brand.js; all three are checked fresh by fitness (scripts/bongos/design-generators-fresh.js). Disabling the module 404s those files (the module-asset route serves enabled modules only) and drops /brand, so every surface loses its token sheet and logo. CLAUDE.md separates the platform FLOORS (the Fifteen Rule, the dark twins, no page :root, the 24px floor, AA in both modes, the kill switch) from the instance's WORLD (its packs + DESIGN.md). kit/ (task 1003320) is the look-before-you-ship kit: lib.js (the floors, the states/probes contracts, the action + expectation vocabularies, the WCAG maths, the stub spawner), serve.js (any surface through the doorway's real transforms + fixtures/), render.js (states × 1440/390/320 × dark/light, audited), probe.js (PASS/FAIL contracts), check-mock.js (platform rules + the instance's DESIGN.md taste bans, then the detector), tells.js (task 1003329 / ADR 0223: the anti-pattern detector as two tiers — floors FAIL, craft tells WARN, kit-ignore waivers per file; the rendered twins live in lib.js factsInPage), contrast.js + png.js; a page's <page>.states.json / <page>.probes.json sit BESIDE the surface (modules/public-landing/public/, modules/hall-ui/public/). Recipe: docs/recipes/ui-look-before-you-ship.md. The thirteen design-style skills that lived in skills/ are the opt-in design-styles module since task 1004470 (below); design-taste-frontend-v1 was deleted. styles/ (task 1003323 / ADR 0219) is the style library: <name>/pack.json (the theme.ui overlay, exactly the fifteen) + DESIGN.md (the look's derived recipes, thirteen in lockstep with the pack) + mock.html (the specimen); chrome-world (pinned to the neutral pack), expedition, grove, blueprint (the first cool look, authored through /style at task 1003475); STYLE=<name> on the kit lays a look over the instance's pack through GDS_BRANDING_FILE; tests/ui_design_styles.mjs runs the world/cosmos/hall token suites once per alternate (UI_DESIGN_PACK). config/design-tokens.* + design-sources.json STAY in config/ as the host boundary; public-landing keeps its own key (first customer, not owner).
125
125
  │ ├── design-styles/ ← the opt-in design-style skills (task 1004470, default-OFF): split out of ui-design so the thirteen descriptions are not resident on an instance that never designs a page; an instance turns it on with "design-styles": true in config/modules.json, and /design says plainly when it is off. Declaration-only: module.json, CLAUDE.md, skills/. skills/ (task 1003321 / ADR 0198) is the vendoring policy: policy.json (licence allowlist, verdicts that may land, sidecar fields, preamble markers), PREAMBLE.md (the platform preamble every vendored SKILL.md opens with), README.md (the roster — both origins scanned dangerous on 2026-08-28, landed as rebuild specs; nothing vendored — and the landing recipe); a landable copy goes under skills/vendor/<name>/ with PROVENANCE.md + LICENSE and is materialised into an instance's .claude/skills/ by claude-materialize.js step 1b. skills/<name>/ (task 1003325 / ADR 0220) are the in-house rebuilds from the specs, first-party and counted: design-taste-frontend (the default taste skill), high-end-visual-design (the polish pass), redesign-existing-projects (the in-place upgrade); each opens with the same preamble and carries a "Rebuilt from" section instead of a sidecar. impeccable/ (task 1003326 / ADR 0221) is the design-craft method as ONE skill with sub-commands: SKILL.md (the router, the menu, the craft floor, the bounded finish) + reference/<sub-command>.md (eighteen playbooks, one loaded per request); no hooks, no bypass agent, no telemetry, no live server. minimalist-ui/, industrial-brutalist-ui/, gpt-taste/, stitch-design-taste/ (task 1003327 / ADR 0230) are the four looks, composition grammars with no colours of their own: the palette is the instance's pack and the texture is a named entry in modules/ui-design/styles/; a substrate is an archetype that still ships both modes, gpt-taste's selection is derived from the route rather than rolled, and stitch-design-taste writes a DESIGN.md-shaped contract document whose thirteen are transcribed from the pack. image-to-code/, imagegen-frontend-web/, imagegen-frontend-mobile/, brandkit/ (task 1003328 / ADR 0222) are the image family under the hero-only rule: plates and hero objects only, the pair (JPEG dark plate + WebP alpha cutout) with a <file>.json sidecar beside each, through the instance's art pipeline key; the grove specimen's modules/ui-design/styles/grove/assets/ is the worked example. style/ (task 1003475 / ADR 0231) is the first FIRST-PARTY skill (no upstream, so a `## First party` section instead of `## Rebuilt from`): the /style session in which an owner authors their own look in four bounded steps, rendering the nearest library entries before asking, drafting inside the contract, retuning by measurement, and handing over the one-step adoption without ever writing config/branding.json.
126
126
  │ ├── pixel-art/ ← the opt-in pixel-art skills (task 1004470, default-OFF): otb-tile-generate, otb-design-review, otb-character-review, otb-feedback-capture, otb-figma-sync under skills/<name>/SKILL.md — moved out of .claude/skills/, where they were orphans no manifest owned. Skill TEXT only: the pipeline, palette, rubric and the copyrighted reference maps stay in the instance's never-published art-pipeline (ADR 0098). module.json, CLAUDE.md, skills/.
127
127
  │ ├── character-anim/ ← consistent-character generative animation (ADR 0088) — graded painterly frame sets + manifest (its otb-character-review skill is the pixel-art module's since task 1004470). CLAUDE.md, module.json.
@@ -271,7 +271,7 @@
271
271
  │ │ ├── world.css ← the WORLD token layer (ADR 0196): contract tier = the pack, derived tier both modes, root-absolute plate token pairs, the reduced-motion kill switch; no page composition
272
272
  │ │ ├── world/ ← the six production plates + <file>.json provenance sidecars (embed-prompt.mjs --scan clean): r2-chrome-blobs-set.webp, r2-chrome-blob-one.webp, r2-bongos-chrome-b.webp (black plates, dark mode, lighten; each beside the verbatim .jpg it is encoded from) and their -cut.webp alpha twins (light mode); og-card.jpg (the social card, captured from the page)
273
273
  │ │ ├── cosmos.css ← the HUB component sheet (task 1002696): contract tier synced to the pack, its own derived + dark tiers, the .btn/.chip/.strip/.proj/.tbl vocabulary; measured by tests/cosmos_token_contrast.mjs
274
- │ │ └── verro-medallion.png ← the Verro Labs mark (apex-only block)
274
+ │ │ └── verro-medallion.png ← the hub maker's mark; shown only when the pack names it as identity.company.mark (task 1005139)
275
275
  │
276
276
  ├── public/ ← example.com — the game (product)
277
277
  │ ├── index.html
@@ -3372,5 +3372,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
3372
3372
  landed since 1.24.57 with no explicit bump. run 42380593295. (task 1002620)
3373
3373
  1.24.59 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3374
3374
  landed since 1.24.58 with no explicit bump. run 42385816081. (task 1002620)
3375
+ 1.24.60 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3376
+ landed since 1.24.59 with no explicit bump. run 42387285187. (task 1002620)
3377
+ 1.24.61 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3378
+ landed since 1.24.60 with no explicit bump. run 42387971712. (task 1002620)
3375
3379
  ---------------------------------------------------------------------------
3376
3380
  ```
@@ -4014,7 +4014,7 @@
4014
4014
  "surface": "landing",
4015
4015
  "title": "{{productName}}: {{tagline}}",
4016
4016
  "states_read": ["out","in","out-projects","in-profile","cli-out"],
4017
- "files_hash": "f1572bf4d31ba334",
4017
+ "files_hash": "40d8d50f1bbcbd70",
4018
4018
  "reading_hash": "317e0e1b725dc1f0",
4019
4019
  "counts": {"lines":85,"placed":50,"shared":16,"unplaced":19},
4020
4020
  "omitted": {"data":6},
@@ -4072,39 +4072,39 @@
4072
4072
  {"key":"L0050","section":"A project as a codebase, regardless of function.","text":"Footer doors before launch: privacy, terms and contact pages linked from the landing page and the hub","placement":"placed","file":"modules/public-landing/public/index.html","line":873,"string_id":"0a0667aea2db"},
4073
4073
  {"key":"L0051","section":"A project as a codebase, regardless of function.","text":"26 Aug","placement":"unplaced","occurrences":2},
4074
4074
  {"key":"L0052","section":"A project as a codebase, regardless of function.","text":"Task titles are write-once, no route can edit one, so a wrong title is permanent","placement":"placed","file":"modules/public-landing/public/index.html","line":879,"string_id":"052e2da986c2"},
4075
- {"key":"L0053","section":"A project as a codebase, regardless of function.","text":"For founders","placement":"placed","file":"modules/public-landing/public/index.html","line":907,"string_id":"dbced351ca0d"},
4076
- {"key":"L0054","section":"Types of projects","text":"Types of projects","placement":"placed","file":"modules/public-landing/public/index.html","line":908,"string_id":"a165999f36a9"},
4077
- {"key":"L0055","section":"Types of projects","text":"Open source.","placement":"placed","file":"modules/public-landing/public/index.html","line":910,"string_id":"275ca0d5ce65"},
4078
- {"key":"L0056","section":"Types of projects","text":"Download our core code and protocols, and build instantly with your team.","placement":"placed","file":"modules/public-landing/public/index.html","line":910,"string_id":"d919980d2ca5"},
4079
- {"key":"L0057","section":"Types of projects","text":"Bongos Managed.","placement":"placed","file":"modules/public-landing/public/index.html","line":912,"string_id":"4782de01c86b"},
4080
- {"key":"L0058","section":"Types of projects","text":"Buy microtransaction packages of code modules on our marketplace.","placement":"placed","file":"modules/public-landing/public/index.html","line":914,"string_id":"101339c676b4"},
4081
- {"key":"L0059","section":"Types of projects","text":"Have us handle your hosting.","placement":"placed","file":"modules/public-landing/public/index.html","line":915,"string_id":"41778f67b4c9"},
4082
- {"key":"L0060","section":"Types of projects","text":"Get access to our advanced project presets and module packages.","placement":"placed","file":"modules/public-landing/public/index.html","line":916,"string_id":"8bb1f00b1558"},
4083
- {"key":"L0061","section":"Types of projects","text":"Equity issuance, business filing, and builder compensation.","placement":"placed","file":"modules/public-landing/public/index.html","line":917,"string_id":"af5ca714d375"},
4084
- {"key":"L0062","section":"Types of projects","text":"For builders","placement":"placed","file":"modules/public-landing/public/index.html","line":923,"string_id":"f510ba460300"},
4085
- {"key":"L0063","section":"Ways to get paid/rewarded","text":"Ways to get paid/rewarded","placement":"placed","file":"modules/public-landing/public/index.html","line":924,"string_id":"3597d73ce7f9"},
4086
- {"key":"L0064","section":"Ways to get paid/rewarded","text":"Build equity in multiple projects.","placement":"placed","file":"modules/public-landing/public/index.html","line":926,"string_id":"0f1ec6cf9dfa"},
4087
- {"key":"L0065","section":"Ways to get paid/rewarded","text":"Work as a paid contractor for companies big, medium and small.","placement":"placed","file":"modules/public-landing/public/index.html","line":927,"string_id":"a581f96fb2c8"},
4088
- {"key":"L0066","section":"Ways to get paid/rewarded","text":"Play as a: game or learning experience.","placement":"placed","file":"modules/public-landing/public/index.html","line":928,"string_id":"384c5b38f500"},
4075
+ {"key":"L0053","section":"A project as a codebase, regardless of function.","text":"For founders","placement":"placed","file":"modules/public-landing/public/index.html","line":908,"string_id":"dbced351ca0d"},
4076
+ {"key":"L0054","section":"Types of projects","text":"Types of projects","placement":"placed","file":"modules/public-landing/public/index.html","line":909,"string_id":"a165999f36a9"},
4077
+ {"key":"L0055","section":"Types of projects","text":"Open source.","placement":"placed","file":"modules/public-landing/public/index.html","line":911,"string_id":"275ca0d5ce65"},
4078
+ {"key":"L0056","section":"Types of projects","text":"Download our core code and protocols, and build instantly with your team.","placement":"placed","file":"modules/public-landing/public/index.html","line":911,"string_id":"d919980d2ca5"},
4079
+ {"key":"L0057","section":"Types of projects","text":"Bongos Managed.","placement":"placed","file":"modules/public-landing/public/index.html","line":913,"string_id":"4782de01c86b"},
4080
+ {"key":"L0058","section":"Types of projects","text":"Buy microtransaction packages of code modules on our marketplace.","placement":"placed","file":"modules/public-landing/public/index.html","line":915,"string_id":"101339c676b4"},
4081
+ {"key":"L0059","section":"Types of projects","text":"Have us handle your hosting.","placement":"placed","file":"modules/public-landing/public/index.html","line":916,"string_id":"41778f67b4c9"},
4082
+ {"key":"L0060","section":"Types of projects","text":"Get access to our advanced project presets and module packages.","placement":"placed","file":"modules/public-landing/public/index.html","line":917,"string_id":"8bb1f00b1558"},
4083
+ {"key":"L0061","section":"Types of projects","text":"Equity issuance, business filing, and builder compensation.","placement":"placed","file":"modules/public-landing/public/index.html","line":918,"string_id":"af5ca714d375"},
4084
+ {"key":"L0062","section":"Types of projects","text":"For builders","placement":"placed","file":"modules/public-landing/public/index.html","line":924,"string_id":"f510ba460300"},
4085
+ {"key":"L0063","section":"Ways to get paid/rewarded","text":"Ways to get paid/rewarded","placement":"placed","file":"modules/public-landing/public/index.html","line":925,"string_id":"3597d73ce7f9"},
4086
+ {"key":"L0064","section":"Ways to get paid/rewarded","text":"Build equity in multiple projects.","placement":"placed","file":"modules/public-landing/public/index.html","line":927,"string_id":"0f1ec6cf9dfa"},
4087
+ {"key":"L0065","section":"Ways to get paid/rewarded","text":"Work as a paid contractor for companies big, medium and small.","placement":"placed","file":"modules/public-landing/public/index.html","line":928,"string_id":"a581f96fb2c8"},
4088
+ {"key":"L0066","section":"Ways to get paid/rewarded","text":"Play as a: game or learning experience.","placement":"placed","file":"modules/public-landing/public/index.html","line":929,"string_id":"384c5b38f500"},
4089
4089
  {"key":"L0067","section":"Ways to get paid/rewarded","text":"Start a project","placement":"placed","file":"modules/public-landing/public/index.html","line":774,"string_id":"2ae36be1c531"},
4090
- {"key":"L0068","section":"Ways to get paid/rewarded","text":"Find a project","placement":"placed","file":"modules/public-landing/public/index.html","line":940,"string_id":"0208e4bbba9c"},
4091
- {"key":"L0069","section":"Ways to get paid/rewarded","text":"Download the CLI","placement":"placed","file":"modules/public-landing/public/index.html","line":943,"string_id":"41c49e22002d","state":"cli-out"},
4090
+ {"key":"L0068","section":"Ways to get paid/rewarded","text":"Find a project","placement":"placed","file":"modules/public-landing/public/index.html","line":941,"string_id":"0208e4bbba9c"},
4091
+ {"key":"L0069","section":"Ways to get paid/rewarded","text":"Download the CLI","placement":"placed","file":"modules/public-landing/public/index.html","line":944,"string_id":"41c49e22002d","state":"cli-out"},
4092
4092
  {"key":"L0070","section":"Ways to get paid/rewarded","text":"macOS, Apple silicon · v0.4.2","placement":"unplaced","state":"cli-out"},
4093
4093
  {"key":"L0071","section":"Ways to get paid/rewarded","text":"Also for","placement":"unplaced","state":"cli-out"},
4094
4094
  {"key":"L0072","section":"Ways to get paid/rewarded","text":"macOS, Intel","placement":"unplaced","state":"cli-out"},
4095
4095
  {"key":"L0073","section":"Ways to get paid/rewarded","text":"Linux, x64","placement":"unplaced","state":"cli-out"},
4096
4096
  {"key":"L0074","section":"Ways to get paid/rewarded","text":"Linux, ARM64","placement":"unplaced","state":"cli-out"},
4097
4097
  {"key":"L0075","section":"Ways to get paid/rewarded","text":"Windows","placement":"unplaced","state":"cli-out"},
4098
- {"key":"L0076","section":"footer","text":"A non-profit, capture-resistant commons.","placement":"shared","file":"modules/public-landing/public/index.html","line":953,"string_id":"afe83bbbd0d4"},
4099
- {"key":"L0077","section":"footer","text":"Built by agents, on Cloud Bongos.","placement":"shared","file":"modules/public-landing/public/index.html","line":953,"string_id":"bd315dd71ea7"},
4100
- {"key":"L0078","section":"footer","text":"Open source","placement":"shared","file":"modules/public-landing/public/index.html","line":953,"string_id":"d6314ddcc1d0"},
4098
+ {"key":"L0076","section":"footer","text":"A non-profit, capture-resistant commons.","placement":"shared","file":"modules/public-landing/public/index.html","line":954,"string_id":"afe83bbbd0d4"},
4099
+ {"key":"L0077","section":"footer","text":"Built by agents, on Cloud Bongos.","placement":"shared","file":"modules/public-landing/public/index.html","line":954,"string_id":"bd315dd71ea7"},
4100
+ {"key":"L0078","section":"footer","text":"Open source","placement":"shared","file":"modules/public-landing/public/index.html","line":954,"string_id":"d6314ddcc1d0"},
4101
4101
  {"key":"L0079","section":"footer","text":"AGPL-3.0","placement":"shared"},
4102
4102
  {"key":"L0080","section":"footer","text":"About","placement":"shared"},
4103
4103
  {"key":"L0081","section":"footer","text":"Docs","placement":"shared"},
4104
4104
  {"key":"L0082","section":"footer","text":"Privacy","placement":"shared"},
4105
4105
  {"key":"L0083","section":"footer","text":"Terms","placement":"shared"},
4106
4106
  {"key":"L0084","section":"footer","text":"Contact","placement":"shared"},
4107
- {"key":"L0085","section":"footer","text":"Builders' hall","placement":"shared","file":"modules/public-landing/public/index.html","line":959,"string_id":"90a128c97eae"}
4107
+ {"key":"L0085","section":"footer","text":"Builders' hall","placement":"shared","file":"modules/public-landing/public/index.html","line":960,"string_id":"90a128c97eae"}
4108
4108
  ]
4109
4109
  },
4110
4110
  {
@@ -887,11 +887,12 @@ composition A; landing composition v3, picked by the owner 2026-08-27. No roll,
887
887
  <!--apex-only:start-->
888
888
  <!-- The maker's band (task 1005091): the company is the pack's (identity.company), never
889
889
  a name written into the portable landing, and the band drops whole when the pack
890
- names none. The medallion is the hub's own asset. -->
890
+ names none. Its mark is the pack's too (identity.company.mark, task 1005139): no
891
+ mark in the pack, no image, so another company never wears the hub's medallion. -->
891
892
  <!--brand-if:companyName--><section class="band">
892
893
  <div class="wrap verro">
893
- <img src="/assets/verro-medallion.png" width="384" height="384" loading="lazy" decoding="async"
894
- alt="The {{companyName}} mark">
894
+ <!--brand-if:companyMark--><img src="{{companyMark}}" width="384" height="384" loading="lazy" decoding="async"
895
+ alt="The {{companyName}} mark"><!--/brand-if:companyMark-->
895
896
  <div>
896
897
  <p class="wordmark">{{companyName}}</p>
897
898
  <p class="body">Built by {{companyName}}, {{productName}} is our way of making AI co-building usable by entire project groups, whether that's a 5,000-person company, a 100-person department, a college research project, or a solo dev.</p>
@@ -17,7 +17,7 @@ The mirror is a port of these files with three changes:
17
17
 
18
18
  1. **Availability banner (always truthful):** a top strip reads the external prober's `status.json` from the off-box `status-data` branch (`raw.githubusercontent.com`) — so it shows the *real* up/down even when the droplet (and its API) are down.
19
19
  2. **Dev panels (degrade gracefully):** `status.js`'s `API` base points at the absolute droplet origin (`https://example.com`); `/api/bongos/public/*` now sends `<redacted>: *` (see `src/bongos/routes/public.js`) so the panels load cross-origin. Each fetch already `.catch(() => null)`, so when the droplet is down the panels show their empty state instead of breaking the page.
20
- 3. **Assets are relative** so the page works at both the GitHub Pages URL and the custom domain.
20
+ 3. **Assets are root-absolute** (`/style.css`, `/status.js`, `/modules/ui-design/public/tokens.css`, `/modules/ui-design/public/brand/…`, `/modules/hall-ui/public/controls.css`): `scripts/status-mirror-sync.js` publishes the shared files at the same paths, so the links resolve on the custom domain (served from the host root). They do not resolve under a GitHub Pages project sub-path (`<owner>.github.io/<repo>/`), so the mirror must be served from a domain root.
21
21
 
22
22
  ## Probing & alerting
23
23
 
@@ -248,7 +248,9 @@ Adapters are discovered by the design subsystem at runtime. No static registry
248
248
 
249
249
  ## 5. CSS variable injection at runtime
250
250
 
251
- The design system renders as CSS custom properties injected into the document at boot, consistent with the existing `themeMarkup` pattern in `src/branding.js`. The naming convention:
251
+ > **What is live (task 1005139).** No served page reads a `--dt-*` variable today. The live surfaces read the fifteen pack tokens that `themeMarkup` (`src/theme-markup.js`) splices into every page, and the `--ds-*` scales of the shared token sheet `modules/ui-design/public/tokens.css`. The `--dt-*` names below are emitted only by the adapters' token-preview bundle (`adapters/claude-design/index.js`, `adapters/figma/index.js`), for a surface authored through an adapter under `src/ui/` — and none exists yet (`config/design-sources.json` is empty). [Task 1005092](https://cloudbongos.com/builders#/task/1005092) will publish the generated `/brand` reference as a Claude Design System; until a surface is authored through an adapter, read this section as the contract that output must follow, not as a description of the served pages.
252
+
253
+ The design system renders as CSS custom properties injected into the document at boot, consistent with the existing `themeMarkup` pattern in `src/theme-markup.js`. The naming convention:
252
254
 
253
255
  ```css
254
256
  --dt-color-bg: /* tokens.colors.bg */
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.24.59",
3
+ "version": "1.24.61",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.24.59",
9
+ "version": "1.24.61",
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.24.59",
3
+ "version": "1.24.61",
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",
@@ -11329,5 +11329,17 @@
11329
11329
  "id": "1005133",
11330
11330
  "text": "The logo files and the link-preview pictures are now checked automatically, so a logo change can no longer ship with out-of-date copies; the docs now say plainly that the off-site status page is updated by hand."
11331
11331
  }
11332
+ ],
11333
+ "1.24.60": [
11334
+ {
11335
+ "id": "1005134",
11336
+ "text": "The automatic check that stops pages from typing in their own colours and sizes now also catches colours given a custom name and styles written directly inside a page, so those shortcuts can no longer slip new colours past it."
11337
+ }
11338
+ ],
11339
+ "1.24.61": [
11340
+ {
11341
+ "id": "1005139",
11342
+ "text": "The design docs now describe what is actually live, and the landing page shows a company's logo only when that company's settings provide one, so other projects no longer show the Verro Labs medallion."
11343
+ }
11332
11344
  ]
11333
11345
  }
@@ -21,16 +21,28 @@
21
21
  // tokens; the count stops the set of breakpoints sprawling).
22
22
  // Sizes, radii, shadows and breakpoints are counted per DECLARATION / RULE.
23
23
  //
24
- // WHAT IT DOES NOT COUNT. A custom-property declaration (`--x: #123`) is a token
25
- // DEFINITION — tokens.css and the hall's token block are exactly where literals
26
- // belong — so its value is skipped. Page-private palettes are guarded separately
27
- // (tests/hall_private_palettes.mjs). Custom-property NAMES are removed from a
28
- // value before it is read (so --ds-space-12 is not a "12"), and url(...) bodies
29
- // are emptied (a data URI is not a colour). A literal inside a var() fallback
30
- // DOES count: a fallback is a typed-in value.
24
+ // CUSTOM PROPERTIES (task 1005134). A colour typed into a custom-property
25
+ // declaration (`:root{--mine:#123456}`, `body{--x:rgb(…)}`) COUNTS as a colour,
26
+ // so a new sheet cannot dodge its zero start by naming its colours. Only the
27
+ // shared token definitions are exempt, because they are exactly where literals
28
+ // belong: the whole of the shared token sheet and the hall's token block (its
29
+ // :root and the two byte-identical dark twins) — TOKEN_SHEETS. The pack splice
30
+ // (serve-internal.js themeMarkup) is built in JavaScript at serve time and is
31
+ // never scanned. A custom property's sizes/radii/shadows are not counted — those
32
+ // kinds are read off the property that SPENDS a value, and a --x is not one.
33
+ // Page-private palettes are also guarded by tests/hall_private_palettes.mjs.
34
+ //
35
+ // WHAT IT DOES NOT COUNT. Custom-property NAMES are removed from a value before
36
+ // it is read (so --ds-space-12 is not a "12"), and url(...) bodies are emptied (a
37
+ // data URI is not a colour). A literal inside a var() fallback DOES count: a
38
+ // fallback is a typed-in value.
31
39
  //
32
40
  // Scope: every tracked *.css outside docs/ (the design mocks there are not
33
- // served), node_modules and vendor/.
41
+ // served), node_modules and vendor/; the inline <style> blocks of every served
42
+ // .html (one under a public/, public-docs/, views/ or content/ folder); and the
43
+ // <style> blocks a server file writes as a string (STYLE_STRING_SOURCES: the
44
+ // branded error page). Task 1005134: a page could otherwise type its colours into
45
+ // a <style> tag and never be counted.
34
46
  //
35
47
  // Print the counts: node scripts/bongos/css-literal-scan.js [--all]
36
48
 
@@ -42,6 +54,18 @@ const ROOT = path.resolve(__dirname, '..', '..');
42
54
  const KINDS = ['colours', 'font_sizes', 'radii', 'shadows', 'breakpoints'];
43
55
 
44
56
  const EXCLUDE_RE = /^docs\/|(^|\/)(node_modules|vendor)\//;
57
+ // A served page: an .html under a folder the server serves or renders from.
58
+ const SERVED_HTML_RE = /(^|\/)(public|public-docs|views|content)\/.*\.html$/;
59
+ // Server files that write a page's <style> block as a string.
60
+ const STYLE_STRING_SOURCES = ['src/error-page.js'];
61
+ const STYLE_BLOCK_RE = /<style\b[^>]*>([\s\S]*?)<\/style>/gi;
62
+ // The shared token definitions, where a typed-in colour belongs: `true` exempts
63
+ // every custom property in the sheet; a RegExp exempts those in a rule whose
64
+ // selector matches it (the hall's token block: :root and the two dark twins).
65
+ const TOKEN_SHEETS = {
66
+ 'modules/ui-design/public/tokens.css': true,
67
+ 'modules/hall-ui/public/style.css': /^(?::root|html\[data-theme="dark"\]|html:not\(\[data-theme\]\))$/,
68
+ };
45
69
  const COMMENT_RE = /\/\*[\s\S]*?\*\//g;
46
70
  const URL_RE = /url\(\s*(?:"[^"]*"|'[^']*'|[^)]*)\)/gi;
47
71
  const VAR_NAME_RE = /--[\w-]+/g;
@@ -84,17 +108,43 @@ function hasLength(value) {
84
108
  return false;
85
109
  }
86
110
 
87
- /** The five counts for one stylesheet's text. */
88
- function countSheet(text) {
111
+ // The selector of the innermost rule around a position, read by walking the text
112
+ // forward (positions must be asked in increasing order). '' at the top level.
113
+ function selectorWalker(css) {
114
+ const stack = [];
115
+ let pos = 0;
116
+ let segStart = 0;
117
+ return (idx) => {
118
+ for (; pos < idx; pos += 1) {
119
+ const ch = css[pos];
120
+ if (ch === '{') { stack.push(css.slice(segStart, pos).replace(/\s+/g, ' ').trim()); segStart = pos + 1; }
121
+ else if (ch === '}') { stack.pop(); segStart = pos + 1; }
122
+ else if (ch === ';') segStart = pos + 1;
123
+ }
124
+ return stack.length ? stack[stack.length - 1] : '';
125
+ };
126
+ }
127
+
128
+ /**
129
+ * The five counts for one stylesheet's text. `tokens` marks the shared token
130
+ * definitions: true (the whole sheet) or a RegExp over a rule's selector.
131
+ */
132
+ function countSheet(text, { tokens = false } = {}) {
89
133
  const counts = Object.fromEntries(KINDS.map((k) => [k, 0]));
90
134
  const css = String(text).replace(COMMENT_RE, ' ').replace(URL_RE, 'url()');
91
135
  AT_RULE_RE.lastIndex = 0;
92
136
  let m;
93
137
  while ((m = AT_RULE_RE.exec(css))) if (MEDIA_LENGTH_RE.test(m[2])) counts.breakpoints += 1;
138
+ const selectorAt = selectorWalker(css);
94
139
  DECL_RE.lastIndex = 0;
95
140
  while ((m = DECL_RE.exec(css))) {
96
141
  const prop = m[1].toLowerCase();
97
- if (prop.startsWith('--')) continue; // a token definition
142
+ if (prop.startsWith('--')) {
143
+ // A custom property: its colours count unless it is a shared token definition.
144
+ const exempt = tokens === true || (tokens instanceof RegExp && tokens.test(selectorAt(m.index + m[0].indexOf(m[1]))));
145
+ if (!exempt) counts.colours += colourCount(m[2].replace(VAR_NAME_RE, ' '));
146
+ continue;
147
+ }
98
148
  const value = m[2].replace(VAR_NAME_RE, ' ');
99
149
  counts.colours += colourCount(value);
100
150
  if ((prop === 'font-size' || prop === 'font') && hasLength(value)) counts.font_sizes += 1;
@@ -106,8 +156,16 @@ function countSheet(text) {
106
156
  }
107
157
 
108
158
  function trackedStylesheets(root = ROOT) {
109
- const out = execFileSync('git', ['ls-files', '-z', '--', '*.css'], { cwd: root, encoding: 'utf8' });
110
- return out.split('\0').filter((f) => f && !EXCLUDE_RE.test(f)).sort();
159
+ const out = execFileSync('git', ['ls-files', '-z', '--', '*.css', '*.html', ...STYLE_STRING_SOURCES], { cwd: root, encoding: 'utf8' });
160
+ return out.split('\0').filter((f) => f && !EXCLUDE_RE.test(f)
161
+ && (f.endsWith('.css') || SERVED_HTML_RE.test(f) || STYLE_STRING_SOURCES.includes(f))).sort();
162
+ }
163
+
164
+ // The CSS a file carries: a stylesheet is all CSS; a page or a server file
165
+ // carries only what sits inside its <style> blocks.
166
+ function cssOf(file, text) {
167
+ if (file.endsWith('.css')) return text;
168
+ return [...String(text).matchAll(STYLE_BLOCK_RE)].map((b) => b[1]).join('\n');
111
169
  }
112
170
 
113
171
  /**
@@ -123,7 +181,7 @@ function scanCssLiterals({ root = ROOT, files = null, read = null } = {}) {
123
181
  let text;
124
182
  try { text = reader(f); } catch { continue; }
125
183
  scanned += 1;
126
- const c = countSheet(text);
184
+ const c = countSheet(cssOf(f, text), { tokens: TOKEN_SHEETS[f] || false });
127
185
  if (KINDS.some((k) => c[k] > 0)) sheets[f] = c;
128
186
  }
129
187
  return { sheets, scanned };
@@ -146,8 +146,9 @@ function injectBrandingGlobal(html, brand = clientBranding(), mods = clientModul
146
146
  // served page can carry a correct cross-host href or canonical/og: URL: a client
147
147
  // fill cannot reach them, and a baked one would make every instance advertise
148
148
  // whichever instance happened to author the file (task 1002748, direction C5/C6).
149
- // {{companyName}} {{companySite}} {{companyTagline}} are optional, so a page wraps
150
- // each clause in a brand-if region that drops whole when its field is empty (task 1002853).
149
+ // {{companyName}} {{companySite}} {{companyTagline}} {{companyMark}} (the company's mark
150
+ // image URL, task 1005139) are optional, so a page wraps each clause in a brand-if region
151
+ // that drops whole when its field is empty (task 1002853).
151
152
  // Pure + exported for the test; both origins are injectable so it drives with zero I/O.
152
153
  function applyBrandTokens(html, brand = clientBranding(), origin = safePublicOrigin(), hallOrigin = safeBuildersOrigin(), sourceRepo = safeSourceRepoUrl(), instanceBase = safeInstanceBase(), hubOrigin = safeHubOrigin()) {
153
154
  const world = (brand.identity && brand.identity.worldName) || '';
@@ -157,7 +158,7 @@ function applyBrandTokens(html, brand = clientBranding(), origin = safePublicOri
157
158
  const Cur = cur ? cur.charAt(0).toUpperCase() + cur.slice(1) : cur;
158
159
  const hall = hallOrigin || origin || '';
159
160
  const company = (brand.identity && brand.identity.company) || {};
160
- const conditioned = applyBrandConditionals(html == null ? '' : html, { companyName: company.name, companySite: company.site, companyTagline: company.tagline });
161
+ const conditioned = applyBrandConditionals(html == null ? '' : html, { companyName: company.name, companySite: company.site, companyTagline: company.tagline, companyMark: company.mark });
161
162
  return dropEmptyHrefLinks(conditioned, { publicOrigin: origin || '', buildersOrigin: hall, sourceRepoUrl: sourceRepo || '' })
162
163
  .split('{{worldName}}').join(esc(world))
163
164
  .split('{{productName}}').join(esc(product))
@@ -167,6 +168,7 @@ function applyBrandTokens(html, brand = clientBranding(), origin = safePublicOri
167
168
  .split('{{companyName}}').join(esc(company.name))
168
169
  .split('{{companySite}}').join(esc(company.site))
169
170
  .split('{{companyTagline}}').join(esc(company.tagline))
171
+ .split('{{companyMark}}').join(esc(company.mark || ''))
170
172
  .split('{{publicOrigin}}').join(esc(origin || ''))
171
173
  // a pack that names no hall of its own resolves to its OWN apex — never to
172
174
  // whichever instance authored the file
package/src/branding.js CHANGED
@@ -254,6 +254,8 @@ function clientBranding(b = branding()) {
254
254
  name: b.identity?.company?.name || '',
255
255
  site: b.identity?.company?.site || '',
256
256
  tagline: b.identity?.company?.tagline || '',
257
+ // the company's mark, an image URL; '' shows none (task 1005139)
258
+ mark: b.identity?.company?.mark || '',
257
259
  },
258
260
  },
259
261
  currency: {
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.24.59'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
84
+ const CORE_VERSION = '1.24.61'; // 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');
@@ -214,3 +214,17 @@ test('the landing names its maker only from the pack, and drops the band when th
214
214
  const none = stamp('');
215
215
  assert.doesNotMatch(none, /class="wrap verro"|held by|Built by ,/, 'the band and the line drop whole');
216
216
  });
217
+
218
+ // task 1005139: the band's image is the pack's (identity.company.mark). A pack that names a
219
+ // company but no mark shows the name without an image — never the hub's medallion.
220
+ test('the maker band shows the company mark only from the pack', () => {
221
+ const src = fs.readFileSync(path.join(ROOT, 'modules', 'public-landing', 'public', 'index.html'), 'utf8');
222
+ assert.doesNotMatch(src.replace(/<!--(?!\/?brand-if)[\s\S]*?-->/g, '').replace(/\/\*[\s\S]*?\*\//g, ''), /medallion/, 'no maker\'s image written into the portable page');
223
+ const stamp = (company) => applyBrandTokens(src, { identity: { productName: 'Acme', worldName: 'Acme', company: { site: '', tagline: '', ...company } } }, '', '', '', '', '');
224
+ const bare = stamp({ name: 'Rocket Labs', mark: '' });
225
+ assert.ok(bare.includes('<p class="wordmark">Rocket Labs</p>'), 'the band still shows the name');
226
+ assert.doesNotMatch(bare, /<img[^>]*alt="The Rocket Labs mark"/, 'no mark in the pack, no image');
227
+ const marked = stamp({ name: 'Rocket Labs', mark: '/assets/rocket.png' });
228
+ assert.match(marked, /<img src="\/assets\/rocket\.png"[^>]*alt="The Rocket Labs mark">/, 'the pack\'s mark is the image');
229
+ assert.equal(clientBranding({ identity: { company: { name: 'R', mark: '/m.png' } } }).identity.company.mark, '/m.png');
230
+ });
@@ -28,7 +28,7 @@ const readReal = (f) => fs.readFileSync(path.join(ROOT, f), 'utf8');
28
28
 
29
29
  test('the detector counts typed-in values and leaves tokens alone', () => {
30
30
  const c = scan.countSheet(`
31
- :root { --ds-x: 14px; --tone: #123456; } /* token definitions: not counted */
31
+ :root { --ds-x: 14px; --tone: #123456; } /* a token sheet's definitions: not counted */
32
32
  .a { font-size: 13px; border-radius: 6px; color: #abc; }
33
33
  .b { font-size: var(--ds-text-sm); border-radius: var(--ds-radius-tile); color: var(--ink); }
34
34
  .c { box-shadow: 0 2px 4px rgba(0, 0, 0, .2); } /* a shadow; the black scrim is allowed */
@@ -36,7 +36,7 @@ test('the detector counts typed-in values and leaves tokens alone', () => {
36
36
  .e { background: color-mix(in srgb, var(--ink) 40%, rgb(12 34 56)); padding: 0; }
37
37
  @media (max-width: 720px) { .f { border-radius: 0; } }
38
38
  @media (prefers-reduced-motion: reduce) { .g { transition: none; } }
39
- `);
39
+ `, { tokens: true });
40
40
  assert.deepEqual(c, { colours: 2, font_sizes: 1, radii: 1, shadows: 1, breakpoints: 1 });
41
41
  });
42
42
 
@@ -170,3 +170,60 @@ test('the freshness gate covers the logo set: mark.svg, the pack and both PNGs',
170
170
  fs.rmSync(dir, { recursive: true, force: true });
171
171
  }
172
172
  });
173
+
174
+ // task 1005134: two loopholes closed. (1) A sheet that names its colours as custom
175
+ // properties used to count zero, so a new sheet could bypass its zero start; now
176
+ // only the shared token definitions are exempt. (2) A page's inline <style> and the
177
+ // error page's CSS string were never scanned; now they are, with baselines.
178
+ const HALL_TOKENS = /^(?::root|html\[data-theme="dark"\]|html:not\(\[data-theme\]\))$/;
179
+
180
+ test('a colour typed into a custom property counts, outside the shared token definitions', () => {
181
+ assert.equal(scan.countSheet(':root { --mine: #123456; }').colours, 1, ':root{--mine:#123456}');
182
+ assert.equal(scan.countSheet('body { --x: rgb(10, 20, 30); --y: hsl(1 2% 3%); }').colours, 2, 'body{--x:rgb(...)}');
183
+ assert.equal(scan.countSheet('.v { --veil: rgba(0, 0, 0, .4); --tone: var(--ink); }').colours, 0, 'a scrim and a reference are not typed-in colours');
184
+ assert.equal(scan.countSheet(':root { --mine: #123456; } .x { --y: #654321; }', { tokens: true }).colours, 0, 'the shared token sheet is exempt');
185
+ const hall = ':root { --a: #111111; } html[data-theme="dark"] { --a: #222222; } '
186
+ + '@media (prefers-color-scheme: dark) { html:not([data-theme]) { --a: #222222; } } '
187
+ + '.brand { --mark-ink: #333333; } @media (max-width: 1px) { .y { --z: #444444; } }';
188
+ assert.equal(scan.countSheet(hall, { tokens: HALL_TOKENS }).colours, 2, 'the hall token block is exempt; its other rules are not');
189
+ });
190
+
191
+ test('a NEW sheet that names its colours as custom properties fails fitness', () => {
192
+ const NEW = 'modules/x/public/new.css';
193
+ const { sheets } = scan.scanCssLiterals({ files: [NEW], read: () => ':root { --mine: #123456; } body { --x: rgb(1, 2, 3); }' });
194
+ const d = ratchets.compareDesignCounts(sheets, { _comment: 'note' });
195
+ assert.ok(d.violations.some((v) => v.includes(`colours in ${NEW} regressed: 2 > baseline 0`)), d.violations.join('\n'));
196
+ // …while a definition planted in the shared token sheet, or the hall's :root, stays exempt.
197
+ const planted = scan.scanCssLiterals({
198
+ read: (f) => readReal(f) + (f === 'modules/ui-design/public/tokens.css' || f === HALL_SHEET ? '\n:root { --mine: #123456; }\n' : ''),
199
+ });
200
+ assert.deepEqual(ratchets.checkQualityRatchets({ metrics: {}, designCounts: planted.sheets }).violations, []);
201
+ const leak = scan.scanCssLiterals({ read: (f) => readReal(f) + (f === HALL_SHEET ? '\n.planted { --mine: #123456; }\n' : '') });
202
+ const r = ratchets.checkQualityRatchets({ metrics: {}, designCounts: leak.sheets });
203
+ assert.ok(r.violations.some((v) => v.includes(`colours in ${HALL_SHEET} regressed`)), r.violations.join('\n'));
204
+ });
205
+
206
+ test('inline <style> blocks in served pages and the error page CSS are scanned', () => {
207
+ const PAGE = 'modules/public-landing/public/terms.html';
208
+ const ERR = 'src/error-page.js';
209
+ const { sheets } = scan.scanCssLiterals();
210
+ assert.ok(sheets[ERR], `${ERR} is scanned`);
211
+ assert.ok(sheets[PAGE], `${PAGE} is scanned`);
212
+ assert.ok(!Object.keys(sheets).some((f) => /\/styles\/[^/]+\/mock\.html$|\/specimens\/.*\.html$/.test(f)), 'unserved mocks and specimens are not');
213
+ assert.equal(scan.countSheet('').colours, 0);
214
+ const planted = scan.scanCssLiterals({
215
+ read: (f) => {
216
+ const t = readReal(f);
217
+ if (f === PAGE || f === ERR) return t.replace('</style>', '.planted { color: #123456; font-size: 13px; }\n</style>');
218
+ return t;
219
+ },
220
+ });
221
+ const r = ratchets.checkQualityRatchets({ metrics: {}, designCounts: planted.sheets });
222
+ for (const f of [PAGE, ERR]) {
223
+ assert.ok(r.violations.some((v) => v.includes(`colours in ${f} regressed`)), `${f} colours: ${r.violations.join('\n')}`);
224
+ assert.ok(r.violations.some((v) => v.includes(`font_sizes in ${f} regressed`)), `${f} sizes: ${r.violations.join('\n')}`);
225
+ }
226
+ // Text outside a <style> block is not CSS: a hex in a page's prose is not counted.
227
+ const prose = scan.scanCssLiterals({ read: (f) => readReal(f) + (f === PAGE ? '\n<p>color: #123456;</p>\n' : '') });
228
+ assert.deepEqual(prose.sheets[PAGE], sheets[PAGE]);
229
+ });
@@ -55,6 +55,6 @@ test('the off-box mirror stamps the footer exactly as the served page does (KEEP
55
55
 
56
56
  test('clientBranding exposes the company site and tagline the footer stamps from', () => {
57
57
  const c = clientBranding({ identity: { company: { name: 'Acme Corp', site: 'https://acme-corp.example', tagline: 'a rocket works' } } });
58
- assert.deepEqual(c.identity.company, { name: 'Acme Corp', site: 'https://acme-corp.example', tagline: 'a rocket works' });
59
- assert.deepEqual(clientBranding({}).identity.company, { name: '', site: '', tagline: '' });
58
+ assert.deepEqual(c.identity.company, { name: 'Acme Corp', site: 'https://acme-corp.example', tagline: 'a rocket works', mark: '' });
59
+ assert.deepEqual(clientBranding({}).identity.company, { name: '', site: '', tagline: '', mark: '' });
60
60
  });