@bongos/core 1.19.155 → 1.19.156

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.bongos-core.json CHANGED
@@ -2,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/gds/package-core.js",
5
- "core_version": "1.19.155",
6
- "core_contract": "1.19.155",
7
- "source_commit": "64b481f3953b847b3950e606203102e1d130fbc9",
5
+ "core_version": "1.19.156",
6
+ "core_contract": "1.19.156",
7
+ "source_commit": "3eb459c447a131f66f5d8297ca621cca2bee58a2",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-08-16T16:05:24.376Z",
9
+ "built_at": "2026-08-16T16:14:04.323Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 304,
13
13
  "agent_docs_stubbed": 21,
14
- "functional_verbatim": 1255,
14
+ "functional_verbatim": 1256,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 1580,
20
- "tree_sha256": "6da1e49fcc1c83ee83beaf54277f2ab817dba9dea35185de47e0528a4e9e53aa",
19
+ "file_count": 1581,
20
+ "tree_sha256": "482b7fbbf94668a5a66dfbbf5f2450699c1670c04b8199d6bf3529b0853cfe31",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/blocker-review/SKILL.md",
@@ -382,7 +382,7 @@
382
382
  {
383
383
  "path": "config/branding.neutral.json",
384
384
  "mode": "0000644",
385
- "sha256": "dc69c5c9e9041da9cd3c297c3e7c81c8311f42952524297d9f228cc1751af3ea"
385
+ "sha256": "c3d785e319252965f8b5f338908d1dd66bd56985dafacb5d2ab8e5095d2515b3"
386
386
  },
387
387
  {
388
388
  "path": "config/design-tokens.neutral.json",
@@ -2597,7 +2597,7 @@
2597
2597
  {
2598
2598
  "path": "modules/dev-box/app/src/brand.generated.json",
2599
2599
  "mode": "0000644",
2600
- "sha256": "a230bd4095c23b5f3fcb41f9f691398ca2560a820dd9d01346fee7aec5f07cf9"
2600
+ "sha256": "516593196fc4d75a44325e478690485d91f1d293387a541df571b4bccf6e3360"
2601
2601
  },
2602
2602
  {
2603
2603
  "path": "modules/dev-box/app/src/brand.js",
@@ -4187,12 +4187,12 @@
4187
4187
  {
4188
4188
  "path": "package-lock.json",
4189
4189
  "mode": "0000644",
4190
- "sha256": "356b00e692fa069d4f14d94317d0c126ef5c35879491be3fb41ea7c8536d3059"
4190
+ "sha256": "288b7b3c867bd31f3753a058d01234d02a39d422cc9196569620b3609ca67ba8"
4191
4191
  },
4192
4192
  {
4193
4193
  "path": "package.json",
4194
4194
  "mode": "0000644",
4195
- "sha256": "62448d273d09db942d8c9fa123c8a6238070ca9bf754a6ecf0ea664d2c170df5"
4195
+ "sha256": "2892b26243a2c662e0e772a9f8a2a3e7b1ae63bcc046f1d797ac2cab597d7f7e"
4196
4196
  },
4197
4197
  {
4198
4198
  "path": "public-docs/index.html",
@@ -4434,6 +4434,11 @@
4434
4434
  "mode": "0000644",
4435
4435
  "sha256": "611050e8599be5791e89f9711b76ef6efc5b1e8bd703e2badc6a6418a9ed432b"
4436
4436
  },
4437
+ {
4438
+ "path": "public-landing/assets/verro-medallion.png",
4439
+ "mode": "0000644",
4440
+ "sha256": "f374d042a0428f956212a11ca9e86870232ab46af4010bd710a15affd374ab45"
4441
+ },
4437
4442
  {
4438
4443
  "path": "public-landing/buddha.png",
4439
4444
  "mode": "0000644",
@@ -4442,7 +4447,7 @@
4442
4447
  {
4443
4448
  "path": "public-landing/index.html",
4444
4449
  "mode": "0000644",
4445
- "sha256": "f011cbcc82b95284f00dae9aa63600ea664f9edc5c7b79c533501c2c0c54495c"
4450
+ "sha256": "ab299596b6c514ac044b2471330026e1516f6878e02b9045afae0ddc1f5fbfd9"
4446
4451
  },
4447
4452
  {
4448
4453
  "path": "public-landing/projects.html",
@@ -5782,7 +5787,7 @@
5782
5787
  {
5783
5788
  "path": "src/module-api.js",
5784
5789
  "mode": "0000644",
5785
- "sha256": "bc766f15de530f14ccf76f0b280e58f4ec594efebea6570744012fc5483b98d4"
5790
+ "sha256": "7e9d6b73af3f2c1ebb9aa216c63f0049ce892c85297ff2d5f00cc02aa9e6a1cb"
5786
5791
  },
5787
5792
  {
5788
5793
  "path": "src/module-loader/catalog.js",
@@ -6262,7 +6267,7 @@
6262
6267
  {
6263
6268
  "path": "tests/cloud_bongos_pack.mjs",
6264
6269
  "mode": "0000644",
6265
- "sha256": "087d0379a559ebb858e8e42458754cfb93720a5222e5f85fb81995851ce811be"
6270
+ "sha256": "9f225b5d4db7e73fbd35bea68ab6c8c64b72bac79daa7be0219e796dc758376a"
6266
6271
  },
6267
6272
  {
6268
6273
  "path": "tests/conductor.mjs",
@@ -6967,7 +6972,7 @@
6967
6972
  {
6968
6973
  "path": "tests/landing_page.mjs",
6969
6974
  "mode": "0000644",
6970
- "sha256": "89a9d21ee1c5b00ee09de2d888873fa13c1b2b6d15ab05a6bfeb7e7a5d016a03"
6975
+ "sha256": "2efddbab276f2ef38dbcf09ef6b76d4c1ff58f68c8b11a8803c7a27b605b385f"
6971
6976
  },
6972
6977
  {
6973
6978
  "path": "tests/lib_sh_resolution.mjs",
@@ -7292,7 +7297,7 @@
7292
7297
  {
7293
7298
  "path": "tests/platform_boot.mjs",
7294
7299
  "mode": "0000644",
7295
- "sha256": "de3bbe68cb648ad5027506f7dcf848e2758e9e67ea65d8c7fb27febbab264845"
7300
+ "sha256": "3552e9e4e947c21770d734b340893db576ea42c7b5de9d2822021a03e1345810"
7296
7301
  },
7297
7302
  {
7298
7303
  "path": "tests/post_login_landing.mjs",
@@ -51,7 +51,7 @@
51
51
  },
52
52
  "rankLabels": { "xenos": "Newcomer", "thetes": "Contributor", "metic": "Trusted", "archon": "Owner" },
53
53
  "copy": {
54
- "tagline": "Building software is laying down a beat.",
54
+ "tagline": "Building Digitally, as simple as Bongos.",
55
55
  "hallName": "Builders' Hall",
56
56
  "notFound": "This page skipped a beat.",
57
57
  "authError": {
@@ -8,6 +8,6 @@
8
8
  "APP_ID": "com.cloudbongos.devbox",
9
9
  "COPYRIGHT": "© Cloud Bongos",
10
10
  "CONFIG_DIR": "cloudbongos",
11
- "TAGLINE": "Building software is laying down a beat.",
11
+ "TAGLINE": "Building Digitally, as simple as Bongos.",
12
12
  "BG_COLOR": "#f9d9a8"
13
13
  }
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.155",
3
+ "version": "1.19.156",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.155",
9
+ "version": "1.19.156",
10
10
  "license": "AGPL-3.0-or-later",
11
11
  "dependencies": {
12
12
  "express": "^4.21.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.155",
3
+ "version": "1.19.156",
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",
@@ -144,11 +144,62 @@ h1.big{font-family:var(--font-display);font-weight:700;font-size:clamp(33px,5.4v
144
144
  at rest and would otherwise sit visible at full stroke. */
145
145
  @media (prefers-reduced-motion:reduce){.bongos .ring{display:none;}}
146
146
 
147
- /* ── S3 · the mechanism ── */
148
- .beats{--col:238px;}
149
- .beat{background:var(--card);border-radius:22px;box-shadow:var(--shadow-card);padding:clamp(19px,2.5vw,26px);}
150
- .beatNum{font-family:var(--font-mono);font-size:12px;font-weight:500;color:var(--accent);letter-spacing:1.3px;text-transform:uppercase;margin-bottom:11px;}
151
- .beat p{font-size:var(--fs-body);font-weight:500;color:var(--ink-soft);line-height:1.58;}
147
+ /* ── S3 · the builder-credit strip (apex-only content; classes .verro*) ──
148
+ Deliberately a different house from the rest of the page. Its palette is a
149
+ LOCAL token set, not the Bongos one: cool greys that hold in both schemes,
150
+ so the block reads as an inset plaque rather than another warm card. Only
151
+ these five tokens are local — everything else still comes from cosmos.css. */
152
+ .verro{
153
+ --v-ground:#e9ecec; --v-surface:#f3f5f5; --v-ink:#4e5457;
154
+ --v-ink-strong:#33383b; --v-hair:#aeb6b8;
155
+ background:var(--v-ground);border-radius:20px;
156
+ padding:clamp(18px,2.4vw,26px) clamp(20px,2.8vw,30px);
157
+ box-shadow:var(--shadow-card);overflow:hidden;
158
+ }
159
+ @media (prefers-color-scheme:dark){
160
+ .verro{--v-ground:#15181a;--v-surface:#1b1f21;--v-ink:#aeb6b9;--v-ink-strong:#d6dcde;--v-hair:#3d4548;}
161
+ }
162
+ :root[data-theme="dark"] .verro{--v-ground:#15181a;--v-surface:#1b1f21;--v-ink:#aeb6b9;--v-ink-strong:#d6dcde;--v-hair:#3d4548;}
163
+ :root[data-theme="light"] .verro{--v-ground:#e9ecec;--v-surface:#f3f5f5;--v-ink:#4e5457;--v-ink-strong:#33383b;--v-hair:#aeb6b8;}
164
+ /* mark LEFT, text RIGHT — a fixed logo column, the copy takes the rest */
165
+ .verroInner{position:relative;display:grid;grid-template-columns:124px 1fr;gap:clamp(18px,2.6vw,30px);align-items:center;}
166
+ .verroMark{
167
+ font-family:system-ui,-apple-system,"Segoe UI",Arial,sans-serif;font-weight:400;
168
+ font-size:clamp(19px,2.6vw,26px);letter-spacing:.075em;line-height:1;
169
+ color:var(--v-ink-strong);margin-bottom:11px;
170
+ text-shadow:-1px 0 rgba(214,120,40,.26),1px 0 rgba(60,120,190,.26);
171
+ }
172
+ .verroRule{width:40px;height:1px;background:var(--v-hair);margin-bottom:12px;}
173
+ .verro p{
174
+ position:relative;font-family:system-ui,-apple-system,"Segoe UI",Arial,sans-serif;
175
+ font-size:clamp(14px,1.5vw,15.5px);font-weight:400;line-height:1.58;
176
+ color:var(--v-ink);max-width:62ch;
177
+ }
178
+ .verroMedal{justify-self:center;}
179
+ /* No border-radius needed: the PNG is already masked to a transparent-cornered
180
+ disc, so it sits on the grey block with nothing to clip. Width/height are
181
+ also set as attributes on the element so the box is reserved before the
182
+ image loads and the block does not reflow. */
183
+ .verroMedal .verroDisc{width:124px;height:124px;display:block;}
184
+ @media (max-width:760px){
185
+ .verroInner{grid-template-columns:1fr;justify-items:center;text-align:center;}
186
+ .verroRule{margin-left:auto;margin-right:auto;}
187
+ }
188
+
189
+
190
+ /* ── S6b · the basics ── */
191
+ .basics{--col:300px;align-items:stretch;}
192
+ .basic{background:var(--card);border-radius:22px;box-shadow:var(--shadow-card);padding:clamp(20px,2.8vw,28px);}
193
+ .basicWho{font-family:var(--font-mono);font-size:12px;font-weight:500;color:var(--accent);letter-spacing:1.3px;text-transform:uppercase;margin-bottom:11px;}
194
+ .basic ul{list-style:none;margin:14px 0 0;padding:0;display:flex;flex-direction:column;gap:13px;}
195
+ .basic li{position:relative;padding-left:19px;font-size:var(--fs-body);font-weight:500;color:var(--ink-soft);line-height:1.55;}
196
+ .basic li::before{content:"";position:absolute;left:0;top:.62em;width:7px;height:7px;border-radius:50%;background:var(--accent);}
197
+ .basic li b{font-weight:700;color:var(--ink);}
198
+ /* second level: the points that fold up under a tier. Hollow marker so the
199
+ nesting reads as subordinate rather than as another top-level choice. */
200
+ .basic li ul{margin:9px 0 0;gap:7px;}
201
+ .basic li li{padding-left:16px;font-size:calc(var(--fs-body) - .5px);}
202
+ .basic li li::before{top:.66em;width:5px;height:5px;background:transparent;border:1.5px solid var(--accent);}
152
203
 
153
204
  /* ── S4 · the lifecycle: cosmos.css's .strip, unmodified, doing marketing work.
154
205
  The marketing page and the working page share the component rather than
@@ -179,10 +230,10 @@ h1.big{font-family:var(--font-display);font-weight:700;font-size:clamp(33px,5.4v
179
230
  .conTag{font-size:12.5px;font-weight:600;color:rgba(255,246,230,.58);margin-top:3px;line-height:1.35;display:block;}
180
231
  .conItem .chip{margin-top:8px;white-space:nowrap;}
181
232
 
182
- /* ── S6/S7 ── */
183
- .own{background:var(--card);border-radius:24px;box-shadow:var(--shadow-card);padding:clamp(22px,3.2vw,34px);}
184
- .door{background:var(--card);border-radius:22px;box-shadow:var(--shadow-card);padding:clamp(20px,2.8vw,28px);display:flex;flex-direction:column;gap:10px;align-items:flex-start;}
185
- .door p{font-size:var(--fs-body);font-weight:500;color:var(--ink-soft);line-height:1.55;flex:1;}
233
+ /* ── S7 ── */
234
+ /* S7 closes on two bare buttons — the door cards are gone (task 1002934), and
235
+ .door/.door p went with them rather than lingering as dead rules. */
236
+ .closing .cta-row{justify-content:center;}
186
237
 
187
238
  @media (max-width:900px){
188
239
  .lead{grid-template-columns:1fr;text-align:center;}
@@ -238,11 +289,16 @@ h1.big{font-family:var(--font-display);font-weight:700;font-size:clamp(33px,5.4v
238
289
  <section class="lead">
239
290
  <div>
240
291
  <p class="eyebrow">type <b>bongos</b> in <span class="typed" id="typed">any AI</span><span class="caret" aria-hidden="true">▌</span></p>
241
- <h1 class="big" data-brand-tagline>Building software is laying&nbsp;down a beat.</h1>
242
- <p class="lede">AI agents claim tasks and ship the code; you set the direction and the gates.</p>
292
+ <h1 class="big" data-brand-tagline>Building Digitally, as simple as&nbsp;Bongos.</h1>
293
+ <p class="lede">AI agents claim tasks and ship code. You direct them.</p>
294
+ <!-- ONE button by owner direction (task 1002934). The former ghost CTA
295
+ ("See what's building") is gone; the survivor keeps .btn.lg exactly as
296
+ it was — a deletion, not a restyle. It now points at /projects rather
297
+ than /projects?view=new because the label is an invitation to browse,
298
+ not to create. NOTE for a child instance: /projects there means that
299
+ instance's own provisioning rows, not the hub catalog. -->
243
300
  <div class="cta-row">
244
- <a class="btn lg" href="/projects?view=new">Start a project</a>
245
- <!--apex-only:start--><a class="btn ghost lg" href="/projects">See what's building</a><!--apex-only:end-->
301
+ <a class="btn lg" href="/projects">Explore Bongo Projects</a>
246
302
  </div>
247
303
  </div>
248
304
  <div class="mascot">
@@ -329,41 +385,64 @@ h1.big{font-family:var(--font-display);font-weight:700;font-size:clamp(33px,5.4v
329
385
  </section>
330
386
  </div>
331
387
 
332
- <!-- ══ S3 · THE MECHANISM ══════════════════════════════════════════════════
333
- "AI writes code" is a crowded claim and not the differentiator. What is
334
- actually enforced — a complete ledger, a server-checked ladder, an
335
- adversarial grade — is. All three are portable: a child instance inherits
336
- them, so none of this section is apex-only.
388
+ <!--apex-only:start-->
389
+ <!-- ══ S3 · VERRO LABS ═════════════════════════════════════════════════════
390
+ Replaces the three mechanism cards (the ledger / the gates / the grade) by
391
+ owner direction, task 1002934.
392
+
393
+ APEX-ONLY, and it must stay that way: a child instance is NOT built by
394
+ Verro Labs and must never say so. The block the beats used to occupy was
395
+ deliberately portable; this one cannot be. Consequence a child instance
396
+ now has nothing between the hero and the lifecycle — flagged to the owner
397
+ as a follow-up decision, not silently absorbed.
398
+
399
+ The design is drawn FROM the Verro Labs logo so it reads as a different
400
+ house inside the warm Bongos page: cool grey monochrome, a wide-tracked
401
+ uppercase wordmark, and a dialled-down chromatic fringe.
402
+
403
+ NO HAIRLINE FRAME. An earlier pass added one, reading the thin rectangle
404
+ in the logo lockup as part of the mark; the owner confirmed it was not
405
+ meant to be there. Do not reintroduce it.
337
406
  ═══════════════════════════════════════════════════════════════════════ -->
338
407
  <div class="wrap">
339
- <section class="sec grid beats">
340
- <div class="beat">
341
- <div class="beatNum">the ledger</div>
342
- <h3 class="sec-h3">Every change is a claimed task</h3>
343
- <p>No admin loophole, no tiny-fix loophole. If work happened, there is a row that says who did
344
- it, what it cost, and why. The ledger is complete or it lies.</p>
345
- </div>
346
- <div class="beat">
347
- <div class="beatNum">the gates</div>
348
- <h3 class="sec-h3">A rank ladder the server enforces</h3>
349
- <p>Authority lives in the database, checked per request, never cached. An agent editing its own
350
- instructions grants itself nothing.</p>
351
- </div>
352
- <div class="beat">
353
- <div class="beatNum">the grade</div>
354
- <h3 class="sec-h3">Nothing ships ungraded</h3>
355
- <p>An adversarial panel reads the real committed diff before work lands — not the summary the
356
- agent wrote about itself.</p>
408
+ <section class="sec verro">
409
+ <div class="verroInner">
410
+ <!-- mark first in source order as well as visually, so it reads the same
411
+ way to a screen reader and stacks logo-above-text on a narrow screen
412
+ without needing an order override -->
413
+ <div class="verroMedal">
414
+ <!-- The Verro Labs medallion. Cropped from the supplied artwork to the
415
+ circle only and masked to a transparent-cornered disc, so there is
416
+ no white plate and no square frame to hide with CSS. The file is
417
+ 384px against a 124px box — comfortably past 2x, so it stays sharp
418
+ if the block is ever scaled back up.
419
+
420
+ NOTE ON SHARPNESS: the source was a 217x210 screenshot and the disc
421
+ within it only 193x197, so this is upscaled and will look soft on a
422
+ high-DPI screen. If a higher-resolution original (or a vector)
423
+ exists, re-crop from that — the recipe is in the task notes. -->
424
+ <img class="verroDisc" src="assets/verro-medallion.png"
425
+ width="124" height="124" loading="lazy" decoding="async"
426
+ alt="The Verro Labs mark: a galaxy and constellation above a river valley threaded with circuitry">
427
+ </div>
428
+ <div>
429
+ <div class="verroMark">VERRO LABS</div>
430
+ <div class="verroRule"></div>
431
+ <p>Built by Verro Labs, Cloud Bongos is our way of making AI co-building usable by entire
432
+ project groups — whether that's a 5,000-person company, a 3,000-person department inside
433
+ one, a college research project, or a solo dev.</p>
434
+ </div>
357
435
  </div>
358
436
  </section>
359
437
  </div>
360
438
 
439
+ <!--apex-only:end-->
440
+
361
441
  <!-- ══ S4 · THE LIFECYCLE ══════════════════════════════════════════════════ -->
362
442
  <div class="wrap">
363
443
  <section class="sec railWrap">
364
- <h2 class="sec-h">How a change reaches your project</h2>
365
- <p class="sec-p">The same five beats every task moves through — the ones you'll watch on your own
366
- projects page.</p>
444
+ <h2 class="sec-h">A project as a codebase, regardless of function.</h2>
445
+ <p class="sec-p">A laddered beat progresses all tasks.</p>
367
446
  <div class="strip isLive" role="img" aria-label="claim, build, grade, ship, credit">
368
447
  <ul class="stages">
369
448
  <li class="done"><span class="sdot"></span><span class="slbl">claim</span></li>
@@ -391,7 +470,8 @@ h1.big{font-family:var(--font-display);font-weight:700;font-size:clamp(33px,5.4v
391
470
  <div class="bandHead">
392
471
  <div>
393
472
  <h2 class="sec-h">Built on Cloud Bongos</h2>
394
- <p class="bandSub">Real projects, standing up right now.</p>
473
+ <p class="bandSub">At present, Bongos projects are all held by Verro Labs or its pilot
474
+ clients.</p>
395
475
  </div>
396
476
  <a class="linklike" href="/projects">Open the map →</a>
397
477
  </div>
@@ -401,43 +481,61 @@ h1.big{font-family:var(--font-display);font-weight:700;font-size:clamp(33px,5.4v
401
481
  <!--apex-only:end-->
402
482
 
403
483
  <!--apex-only:start-->
404
- <!-- ══ S6 · WHAT YOU OWN ═══════════════════════════════════════════════════
405
- Copy verbatim from create.html — already owner-approved and already
406
- public-facing. It is a claim about Cloud Bongos the platform, so it does
407
- not travel to a child instance.
484
+ <!-- ══ S6b · THE BASICS ═════════════════════════════════════════════════════
485
+ New dual block, owner direction (task 1002934). Inside the existing
486
+ apex-only run: it describes Verro Labs' commercial offering, which is not
487
+ true of a child instance.
488
+
489
+ Placement is a planner's call — the last block before the closing
490
+ doors, so the practical explainer sits just ahead of the final ask.
408
491
  ═══════════════════════════════════════════════════════════════════════ -->
409
492
  <div class="wrap">
410
- <section class="sec own">
411
- <h2 class="sec-h">What you own</h2>
412
- <p class="sec-p" style="margin-bottom:18px;">Free while we find our feet. Your project's repo and
413
- server are yours — Cloud Bongos is
414
- <a href="https://www.gnu.org/licenses/agpl-3.0.html" target="_blank" rel="noopener">open source
415
- (AGPL-3.0)</a> and capture-resistant by design. Run the whole thing on your own box and owe us
416
- nothing; the hosted version is a convenience, not a lock.</p>
417
- <!-- server-stamped from the pack's repo binding, never baked: a hardcoded
418
- owner/name would point every instance at whoever authored this file, and
419
- the authorship audit fails it. Dropped below if the pack names no repo. -->
420
- <a class="btn ghost" href="{{sourceRepoUrl}}" target="_blank" rel="noopener">Read the source →</a>
493
+ <section class="sec">
494
+ <div class="grid pair basics">
495
+ <div class="basic">
496
+ <div class="basicWho">For founders</div>
497
+ <h3 class="sec-h3">Types of projects</h3>
498
+ <ul>
499
+ <li><b>Open source.</b> Download our core code and protocols, and build instantly with
500
+ your team.</li>
501
+ <!-- "Bongos Managed" and "Cloud Bongos Managed" were two separate tiers with
502
+ near-identical names, which read as the same thing said twice. Consolidated
503
+ into one tier by owner direction; every point from both now sits under it. -->
504
+ <li><b>Bongos Managed.</b>
505
+ <ul>
506
+ <li>Buy microtransaction packages of code modules on our marketplace.</li>
507
+ <li>Have us handle your hosting.</li>
508
+ <li>Get access to our advanced project presets and module packages.</li>
509
+ <li>Equity issuance, business filing, and builder compensation.</li>
510
+ </ul>
511
+ </li>
512
+ </ul>
513
+ </div>
514
+ <div class="basic">
515
+ <div class="basicWho">For builders</div>
516
+ <h3 class="sec-h3">Ways to get paid</h3>
517
+ <ul>
518
+ <li><b>Build equity</b> in multiple projects.</li>
519
+ <li><b>Work as a contractor</b> for companies big, medium and small — and get paid
520
+ instantly.</li>
521
+ <li><b>Build as a game</b> or a learning experience.</li>
522
+ </ul>
523
+ </div>
524
+ </div>
421
525
  </section>
422
526
  </div>
423
527
  <!--apex-only:end-->
424
528
 
425
- <!-- ══ S7 · TWO DOORS ══════════════════════════════════════════════════════
426
- The hero can only lead one of the two arrivals. This is the second chance
427
- for whichever one it didn't serve.
529
+ <!-- ══ S7 · THE CLOSING PAIR ═══════════════════════════════════════════════
530
+ Was two "door" cards (Build a project / Join as a builder). Reduced to two
531
+ bare buttons by owner direction, task 1002934 — the hero already made the
532
+ argument, so the page closes on the choice rather than re-pitching it.
428
533
  ═══════════════════════════════════════════════════════════════════════ -->
429
534
  <div class="wrap">
430
- <section class="sec grid pair">
431
- <div class="door">
432
- <h3 class="sec-h3">Build a project</h3>
433
- <p>Say what you want to exist. Agents take it from there, and you hold every gate that matters.</p>
434
- <a class="btn" href="/projects?view=new">Start a project</a>
435
- </div>
436
- <div class="door">
437
- <h3 class="sec-h3">Join as a builder</h3>
438
- <p>Claim tasks, ship code, earn credits. The hall is where the work is, and newcomers start
439
- with a real task on day one.</p>
440
- <a class="btn ghost" data-link-hall href="{{buildersOrigin}}">Enter the Hall →</a>
535
+ <section class="sec closing">
536
+ <div class="cta-row">
537
+ <a class="btn lg" href="/projects?view=new">Start a Project</a>
538
+ <a class="btn ghost lg" href="/projects">Find a Project</a>
441
539
  </div>
442
540
  </section>
443
541
  </div>
package/src/module-api.js CHANGED
@@ -737,8 +737,10 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
737
737
  // landed since 1.19.153 with no explicit bump. run 31957052737. (task 1002620)
738
738
  // 1.19.155 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
739
739
  // landed since 1.19.154 with no explicit bump. run 31957556550. (task 1002620)
740
+ // 1.19.156 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
741
+ // landed since 1.19.155 with no explicit bump. run 31957976979. (task 1002620)
740
742
  // ---------------------------------------------------------------------------
741
- const CORE_VERSION = '1.19.155'; // CI auto-patch carrier (ADR 0161); see changelog above
743
+ const CORE_VERSION = '1.19.156'; // CI auto-patch carrier (ADR 0161); see changelog above
742
744
 
743
745
  // A namespaced logger so a module's log lines are attributable + consistent.
744
746
  // Usage: const log = api.logger('dev-box'); log.info('mounted');
@@ -44,7 +44,8 @@ test('R74: the vanilla pack carries the Cloud Bongos LOOK (sunrise palette, Balo
44
44
  assert.match(c.theme.favicon, /circle/, 'bongo-pair favicon (circles), not the Greek Α');
45
45
  assert.doesNotMatch(c.theme.favicon, /font-family='serif'>Α/);
46
46
  assert.equal(c.theme.backdrop, '#f9d9a8', 'the marigold ground holds all the way down');
47
- assert.equal(c.copy.tagline, 'Building software is laying down a beat.');
47
+ // task 1002934: the owner's homepage rewrite retitled the platform.
48
+ assert.equal(c.copy.tagline, 'Building Digitally, as simple as Bongos.');
48
49
  assert.equal(c.rankLabels.archon, 'Owner', 'plain rank labels, not "Archon"');
49
50
  });
50
51
 
@@ -55,20 +55,22 @@ test('the hub keeps every apex-only section', () => {
55
55
  test('a child instance is served none of the platform-only claims', () => {
56
56
  const child = stripApexOnly(HTML, false);
57
57
  assert.doesNotMatch(child, /<!--apex-only:(start|end)-->/, 'no sentinel survives the strip');
58
- // the four regions, by their load-bearing content
58
+ // the apex-only regions, by their load-bearing content (task 1002934: the
59
+ // Verro Labs strip + The Basics replaced the beats / What-you-own era)
59
60
  assert.doesNotMatch(child, /capture-resistant commons/, 'the commons claim is the platform\'s, not a child\'s');
60
61
  assert.doesNotMatch(child, /Built on Cloud Bongos/, 'a child has no catalog of other instances');
61
- assert.doesNotMatch(child, /What you own/, 'the AGPL/ownership pitch is the platform\'s');
62
- assert.doesNotMatch(child, /See what's building/, 'the catalog CTA has nothing to point at');
62
+ assert.doesNotMatch(child, /Verro Labs/, 'a child instance is not built by Verro Labs');
63
+ assert.doesNotMatch(child, /Bongos Managed/, 'the commercial offer is the platform\'s, not a child\'s');
64
+ assert.doesNotMatch(child, /thousands of builders/, 'a child has no hub builder pool to promise');
63
65
  });
64
66
 
65
67
  test('a child instance keeps the whole portable spine', () => {
66
68
  const child = stripApexOnly(HTML, false);
67
69
  for (const portable of [
68
- 'Building software is laying', // the hero tagline
69
- 'the ledger', 'the gates', 'the grade', // S3, the differentiator
70
- 'How a change reaches your project', // S4
71
- 'Build a project', 'Join as a builder', // S7, both doors
70
+ 'Building Digitally, as simple as', // the hero tagline (task 1002934)
71
+ 'A project as a codebase', // S4 heading (task 1002934 rewording)
72
+ 'A laddered beat progresses all tasks', // S4 subtitle
73
+ 'Start a Project', 'Find a Project', // S7, the closing pair (buttons since 1002934)
72
74
  'Built by agents, on Cloud', // the portable half of the footer
73
75
  'id="who"', // the identity chip
74
76
  ]) {
@@ -109,7 +111,9 @@ test('every head tag a crawler reads is stamped, and no token survives', () => {
109
111
  test('every cross-host link is stamped to THIS instance, never the platform', () => {
110
112
  const out = applyBrandTokens(HTML, BRAND, 'https://spike-harbor.example', 'https://builders.spike-harbor.example');
111
113
  const halls = [...out.matchAll(/data-link-hall href="([^"]*)"/g)].map((m) => m[1]);
112
- assert.ok(halls.length >= 2, 'the header door and the builders door both point at the hall');
114
+ // task 1002934: the S7 door cards (which carried the second hall link) became
115
+ // two bare project buttons — the header Hall entry is the one that remains.
116
+ assert.ok(halls.length >= 1, 'the header Hall entry points at the hall');
113
117
  for (const href of halls) assert.equal(href, 'https://builders.spike-harbor.example');
114
118
  // C6: this is the bug the stamping fixes — clientBranding() omits domains, so a
115
119
  // client fill can never re-point these and every child sent visitors to the platform.
@@ -121,19 +125,21 @@ test('a pack with no hall of its own falls back to its own apex, not the platfor
121
125
  assert.match(out, /data-link-hall href="https:\/\/spike-harbor\.example"/);
122
126
  });
123
127
 
124
- test('the source link is stamped from the pack repo, never a baked owner/name', () => {
125
- // the authorship audit fails a hardcoded owner/name, and a baked one would
126
- // point every instance at whoever authored this file
128
+ test('no repo path is baked into the page', () => {
129
+ // task 1002934 removed the "What you own" section and with it the page's only
130
+ // {{sourceRepoUrl}} link (owner-accepted). What must still hold: no HARDCODED
131
+ // owner/name — a baked one would point every instance at whoever authored
132
+ // this file, and the authorship audit fails it.
127
133
  assert.doesNotMatch(HTML, /github\.com\/[a-z0-9-]+\/[a-z0-9-]+/i, 'no baked repo path');
128
- const out = applyBrandTokens(HTML, BRAND, 'https://o.example', '', 'https://github.com/acme/harbor');
129
- assert.match(out, /href="https:\/\/github\.com\/acme\/harbor"/);
130
134
  });
131
135
 
132
136
  test('an unstamped link is removed, not left dangling', () => {
133
- const out = applyBrandTokens(HTML, BRAND, 'https://o.example', '', '');
134
- assert.match(out, /href=""/, 'the token resolves empty when the pack names no repo');
135
- assert.match(CODE, /a\[href=""\]/, 'and the page drops those links');
137
+ // the page keeps its empty-href scrubber so ANY future unstamped token link
138
+ // (the header hall entry today) is dropped rather than rendered dead.
139
+ const out = applyBrandTokens(HTML, BRAND, 'https://o.example', '');
140
+ assert.match(CODE, /a\[href=""\]/, 'the page drops empty-href links');
136
141
  assert.match(CODE, /\.remove\(\)/);
142
+ assert.ok(out.length > 0);
137
143
  });
138
144
 
139
145
  // ── the branding cascade + portability ─────────────────────────────────────
@@ -238,13 +244,12 @@ test('nothing about the platform is hardcoded — the file is portable (C5)', ()
238
244
  test('the page reads without JavaScript: the spine is markup, not script-built', () => {
239
245
  const body = HTML.split('<body>')[1].split('<script>')[0];
240
246
  for (const copy of [
241
- 'Building software is laying',
242
- 'Every change is a claimed task',
243
- 'A rank ladder the server enforces',
244
- 'Nothing ships ungraded',
245
- 'How a change reaches your project',
246
- 'Start a project',
247
- 'Enter the Hall',
247
+ 'Building Digitally, as simple as', // hero (task 1002934)
248
+ 'Built by Verro Labs', // the Verro strip
249
+ 'A project as a codebase', // S4 heading
250
+ 'Explore Bongo Projects', // the hero CTA
251
+ 'Start a Project', // the closing pair
252
+ 'Find a Project',
248
253
  ]) {
249
254
  assert.ok(body.includes(copy), `"${copy}" is only reachable with scripting on`);
250
255
  }
@@ -297,7 +302,7 @@ test('the five primitives graduated into cosmos.css, not the page (§6)', () =>
297
302
 
298
303
  test('the page satisfies the parked platform_boot assertions', () => {
299
304
  assert.match(HTML, /id="who"/);
300
- assert.match(HTML, /Enter the Hall/);
305
+ assert.match(HTML, /Find a Project/); // the landing marker since task 1002934
301
306
  // an ORG-level action that lives only on the gate — asserted absent there
302
307
  assert.doesNotMatch(HTML, /Create a project/);
303
308
  });
@@ -113,7 +113,9 @@ test('the apex host serves the landing page — not the game — on a game-less
113
113
  assert.doesNotMatch(res.body, /404 — not found/); // not the bare apex tail
114
114
  // it IS the landing, with the branding pack injected (look + identity from config)
115
115
  assert.match(res.body, /window\.__BRANDING__=/);
116
- assert.match(res.body, /Enter the Hall/);
116
+ // task 1002934: the doors became two bare buttons; "Find a Project" is the
117
+ // portable landing marker now ("Enter the Hall" left with the door cards).
118
+ assert.match(res.body, /Find a Project/);
117
119
  // the per-project landing carries the top-right identity chip + hall entry
118
120
  // (goal 35, task 2094). "Create a project" is an ORG-level action that lives
119
121
  // only on the gate now — it must NOT appear on a project's own landing.