@bongos/core 1.19.88 → 1.19.90
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 +61 -26
- package/config/branding.neutral.json +2 -2
- package/docs/design/front-door-and-hub-direction.md +155 -0
- package/docs/design/gate-navigation-direction.md +17 -0
- package/docs/design/landing-page-direction.md +176 -0
- package/docs/design/mocks/_schemes.css +604 -0
- package/docs/design/mocks/landing-page-mock.html +687 -0
- package/docs/design/mocks/landing-palettes.html +103 -0
- package/modules/dev-box/app/assets/tray/win-alert.png +0 -0
- package/modules/dev-box/app/assets/tray/win-busy.png +0 -0
- package/modules/dev-box/app/assets/tray/win-off.png +0 -0
- package/modules/dev-box/app/assets/tray/win-on.png +0 -0
- package/modules/dev-box/app/build-resources/icon.png +0 -0
- package/modules/dev-box/app/renderer/theme.generated.css +3 -3
- package/modules/dev-box/app/scripts/gen-brand.js +3 -3
- package/modules/dev-box/app/scripts/gen-dmg-backdrop.py +1 -1
- package/modules/dev-box/app/scripts/gen-icons.js +1 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/public-landing/assets/cosmos.css +27 -16
- package/public-landing/create.html +5 -2
- package/public-landing/gate/index.html +43 -1
- package/src/module-api.js +5 -1
- package/tests/cloud_bongos_pack.mjs +5 -3
- package/tests/cosmos_token_contrast.mjs +268 -0
- package/tests/gate_launch_metadata.mjs +67 -0
package/.bongos-core.json
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.19.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.90",
|
|
6
|
+
"core_contract": "1.19.90",
|
|
7
|
+
"source_commit": "45d0b3918cf244fda1eb923ed5d62224bc5885cb",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-
|
|
9
|
+
"built_at": "2026-08-13T15:51:02.618Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
12
|
+
"docs_redacted": 298,
|
|
13
13
|
"agent_docs_stubbed": 21,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 1239,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 1558,
|
|
20
|
+
"tree_sha256": "7dc9f0a0062008bfdc80372316b3d7ff5ce73181237509094f584b99efe5573d",
|
|
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": "
|
|
385
|
+
"sha256": "48460f6fba8d39293c091cc1cd908896bd670c5eae5bab8665f755211e0f5790"
|
|
386
386
|
},
|
|
387
387
|
{
|
|
388
388
|
"path": "config/design-tokens.neutral.json",
|
|
@@ -1354,16 +1354,41 @@
|
|
|
1354
1354
|
"mode": "0000644",
|
|
1355
1355
|
"sha256": "a86af6a923ed70bb8ea0846266f232f31a5fc9709d286362bcd37104d683342b"
|
|
1356
1356
|
},
|
|
1357
|
+
{
|
|
1358
|
+
"path": "docs/design/front-door-and-hub-direction.md",
|
|
1359
|
+
"mode": "0000644",
|
|
1360
|
+
"sha256": "e3026e23472629a7d4f1bebe883f9bc84263a849e22eab627f7a5b5ace9dd110"
|
|
1361
|
+
},
|
|
1357
1362
|
{
|
|
1358
1363
|
"path": "docs/design/gate-navigation-direction.md",
|
|
1359
1364
|
"mode": "0000644",
|
|
1360
|
-
"sha256": "
|
|
1365
|
+
"sha256": "90bed9a9f3859f7cfc6dd8a0e23e70adeda5854be0b10f8208d60a96c83403b3"
|
|
1366
|
+
},
|
|
1367
|
+
{
|
|
1368
|
+
"path": "docs/design/landing-page-direction.md",
|
|
1369
|
+
"mode": "0000644",
|
|
1370
|
+
"sha256": "445344b91eee651e2831fe74ce30d317a4fd4f6310475cb8fd924edd883f9f95"
|
|
1371
|
+
},
|
|
1372
|
+
{
|
|
1373
|
+
"path": "docs/design/mocks/_schemes.css",
|
|
1374
|
+
"mode": "0000644",
|
|
1375
|
+
"sha256": "b765820040413ebe4f123f5d67f6daaf5955ccbc76d16f34eb8fc8bd65d7bb21"
|
|
1361
1376
|
},
|
|
1362
1377
|
{
|
|
1363
1378
|
"path": "docs/design/mocks/component-sheet.html",
|
|
1364
1379
|
"mode": "0000644",
|
|
1365
1380
|
"sha256": "c77dbf2152c6109b6ce925e2badf6dfaa74f74c2d0cb7eb76fa1101eec7b3310"
|
|
1366
1381
|
},
|
|
1382
|
+
{
|
|
1383
|
+
"path": "docs/design/mocks/landing-page-mock.html",
|
|
1384
|
+
"mode": "0000644",
|
|
1385
|
+
"sha256": "89106dce576bc0777aa63ec6ac0dde61a68317bef53de0fb6edf47870f0cdd04"
|
|
1386
|
+
},
|
|
1387
|
+
{
|
|
1388
|
+
"path": "docs/design/mocks/landing-palettes.html",
|
|
1389
|
+
"mode": "0000644",
|
|
1390
|
+
"sha256": "c277f432a0d3e23e481bae01355f5f11648ee9a6593f665a809d8f406ebbe033"
|
|
1391
|
+
},
|
|
1367
1392
|
{
|
|
1368
1393
|
"path": "docs/design/mocks/projects-page-mock.html",
|
|
1369
1394
|
"mode": "0000644",
|
|
@@ -2417,22 +2442,22 @@
|
|
|
2417
2442
|
{
|
|
2418
2443
|
"path": "modules/dev-box/app/assets/tray/win-alert.png",
|
|
2419
2444
|
"mode": "0000644",
|
|
2420
|
-
"sha256": "
|
|
2445
|
+
"sha256": "ce381ff0ae4d29c684d0e864c4f05806548b24da4c17b900a4b87fb7d7b977a7"
|
|
2421
2446
|
},
|
|
2422
2447
|
{
|
|
2423
2448
|
"path": "modules/dev-box/app/assets/tray/win-busy.png",
|
|
2424
2449
|
"mode": "0000644",
|
|
2425
|
-
"sha256": "
|
|
2450
|
+
"sha256": "f330901daeb01ba88b60622dfb04030bce131807c0b8ec488d628c1710b16c9c"
|
|
2426
2451
|
},
|
|
2427
2452
|
{
|
|
2428
2453
|
"path": "modules/dev-box/app/assets/tray/win-off.png",
|
|
2429
2454
|
"mode": "0000644",
|
|
2430
|
-
"sha256": "
|
|
2455
|
+
"sha256": "f3ad8ff1f1d31228699133d9b6fc64f5f09cad4cd3e7a69fa68643a554a50d30"
|
|
2431
2456
|
},
|
|
2432
2457
|
{
|
|
2433
2458
|
"path": "modules/dev-box/app/assets/tray/win-on.png",
|
|
2434
2459
|
"mode": "0000644",
|
|
2435
|
-
"sha256": "
|
|
2460
|
+
"sha256": "6611cb8cbe81102028705085ec5f093d056f7b4f82220cefe25acdab68156367"
|
|
2436
2461
|
},
|
|
2437
2462
|
{
|
|
2438
2463
|
"path": "modules/dev-box/app/build-resources/dmg-background.png",
|
|
@@ -2447,7 +2472,7 @@
|
|
|
2447
2472
|
{
|
|
2448
2473
|
"path": "modules/dev-box/app/build-resources/icon.png",
|
|
2449
2474
|
"mode": "0000644",
|
|
2450
|
-
"sha256": "
|
|
2475
|
+
"sha256": "03edf4c2ad4d5059f28e641e37b5b932087b508aeca23f64251b00ec1eea29f0"
|
|
2451
2476
|
},
|
|
2452
2477
|
{
|
|
2453
2478
|
"path": "modules/dev-box/app/electron-builder.tmpl.yml",
|
|
@@ -2487,7 +2512,7 @@
|
|
|
2487
2512
|
{
|
|
2488
2513
|
"path": "modules/dev-box/app/renderer/theme.generated.css",
|
|
2489
2514
|
"mode": "0000644",
|
|
2490
|
-
"sha256": "
|
|
2515
|
+
"sha256": "579376e7f7bccc9632a739942d20f3dfe6fb3a75e7118bf0f2503ea315faa574"
|
|
2491
2516
|
},
|
|
2492
2517
|
{
|
|
2493
2518
|
"path": "modules/dev-box/app/scripts/apply-dmg-backdrop.sh",
|
|
@@ -2502,17 +2527,17 @@
|
|
|
2502
2527
|
{
|
|
2503
2528
|
"path": "modules/dev-box/app/scripts/gen-brand.js",
|
|
2504
2529
|
"mode": "0000644",
|
|
2505
|
-
"sha256": "
|
|
2530
|
+
"sha256": "37d7b4d6c3ea5e0cfa7e280353b3adb9f68b7c5e7bababfe1c1ba809706dd145"
|
|
2506
2531
|
},
|
|
2507
2532
|
{
|
|
2508
2533
|
"path": "modules/dev-box/app/scripts/gen-dmg-backdrop.py",
|
|
2509
2534
|
"mode": "0000644",
|
|
2510
|
-
"sha256": "
|
|
2535
|
+
"sha256": "8493db368ac3364f559f166eea3421a4e85c11503d056e8eb3e41e70ac1198cc"
|
|
2511
2536
|
},
|
|
2512
2537
|
{
|
|
2513
2538
|
"path": "modules/dev-box/app/scripts/gen-icons.js",
|
|
2514
2539
|
"mode": "0000644",
|
|
2515
|
-
"sha256": "
|
|
2540
|
+
"sha256": "b6dd666505d4c0c3d28b69082945792c88a78cc40ac79191921dec196a904d28"
|
|
2516
2541
|
},
|
|
2517
2542
|
{
|
|
2518
2543
|
"path": "modules/dev-box/app/scripts/vendor-client.js",
|
|
@@ -4087,12 +4112,12 @@
|
|
|
4087
4112
|
{
|
|
4088
4113
|
"path": "package-lock.json",
|
|
4089
4114
|
"mode": "0000644",
|
|
4090
|
-
"sha256": "
|
|
4115
|
+
"sha256": "e2360c5ef62eeb078207fc6b3e1230d4f7099a58f2c78c6b204d5de6df1a4ba2"
|
|
4091
4116
|
},
|
|
4092
4117
|
{
|
|
4093
4118
|
"path": "package.json",
|
|
4094
4119
|
"mode": "0000644",
|
|
4095
|
-
"sha256": "
|
|
4120
|
+
"sha256": "34e9ad3018b2d905c6cf60f10bb9ddc6db4b9547facf4df8ee6284f646c93201"
|
|
4096
4121
|
},
|
|
4097
4122
|
{
|
|
4098
4123
|
"path": "public-docs/index.html",
|
|
@@ -4332,7 +4357,7 @@
|
|
|
4332
4357
|
{
|
|
4333
4358
|
"path": "public-landing/assets/cosmos.css",
|
|
4334
4359
|
"mode": "0000644",
|
|
4335
|
-
"sha256": "
|
|
4360
|
+
"sha256": "d38bef9066bf2cc7cf2fbe493af5e9dd7a4f4b20f7f051460e72fc6c0d98012d"
|
|
4336
4361
|
},
|
|
4337
4362
|
{
|
|
4338
4363
|
"path": "public-landing/buddha.png",
|
|
@@ -4342,7 +4367,7 @@
|
|
|
4342
4367
|
{
|
|
4343
4368
|
"path": "public-landing/create.html",
|
|
4344
4369
|
"mode": "0000644",
|
|
4345
|
-
"sha256": "
|
|
4370
|
+
"sha256": "efcc1894c06d1f4755028ae554707a61f8ef6e6753d7d7554f94e3748910f155"
|
|
4346
4371
|
},
|
|
4347
4372
|
{
|
|
4348
4373
|
"path": "public-landing/gate/README.md",
|
|
@@ -4367,7 +4392,7 @@
|
|
|
4367
4392
|
{
|
|
4368
4393
|
"path": "public-landing/gate/index.html",
|
|
4369
4394
|
"mode": "0000644",
|
|
4370
|
-
"sha256": "
|
|
4395
|
+
"sha256": "4fabebb37446cb55803332d89909dd25b905ebbff5f3dd7d607d383122095800"
|
|
4371
4396
|
},
|
|
4372
4397
|
{
|
|
4373
4398
|
"path": "public-landing/gate/previews/cloud-bongos.jpg",
|
|
@@ -5727,7 +5752,7 @@
|
|
|
5727
5752
|
{
|
|
5728
5753
|
"path": "src/module-api.js",
|
|
5729
5754
|
"mode": "0000644",
|
|
5730
|
-
"sha256": "
|
|
5755
|
+
"sha256": "fb1e1a8efafde2d29df7b9dd4e9de53a985a858b7f0a26517baf1632c4227d96"
|
|
5731
5756
|
},
|
|
5732
5757
|
{
|
|
5733
5758
|
"path": "src/module-loader/loader.js",
|
|
@@ -6197,7 +6222,7 @@
|
|
|
6197
6222
|
{
|
|
6198
6223
|
"path": "tests/cloud_bongos_pack.mjs",
|
|
6199
6224
|
"mode": "0000644",
|
|
6200
|
-
"sha256": "
|
|
6225
|
+
"sha256": "edfa4f2dad99e969d45b3fe37bc88aa9d0926d24d907cd8dade2ca0ee467ab11"
|
|
6201
6226
|
},
|
|
6202
6227
|
{
|
|
6203
6228
|
"path": "tests/conductor.mjs",
|
|
@@ -6224,6 +6249,11 @@
|
|
|
6224
6249
|
"mode": "0000644",
|
|
6225
6250
|
"sha256": "55bd70efd8067e39d6220d14f78c743ce80d8a8ff37988acf00136b5108dc004"
|
|
6226
6251
|
},
|
|
6252
|
+
{
|
|
6253
|
+
"path": "tests/cosmos_token_contrast.mjs",
|
|
6254
|
+
"mode": "0000644",
|
|
6255
|
+
"sha256": "f295115dbefe49aef1ac4cb9b34404952fb92c858d45f00af2caacee580ec9ce"
|
|
6256
|
+
},
|
|
6227
6257
|
{
|
|
6228
6258
|
"path": "tests/cost.mjs",
|
|
6229
6259
|
"mode": "0000644",
|
|
@@ -6494,6 +6524,11 @@
|
|
|
6494
6524
|
"mode": "0000644",
|
|
6495
6525
|
"sha256": "df503f198853f6fe3497a2e0317d90bee69cc275f024027ad569ee1cef0155b6"
|
|
6496
6526
|
},
|
|
6527
|
+
{
|
|
6528
|
+
"path": "tests/gate_launch_metadata.mjs",
|
|
6529
|
+
"mode": "0000644",
|
|
6530
|
+
"sha256": "235dfa1ea341b596ea4981fe8375650150387a60c9093c3a1a7b761222ee259a"
|
|
6531
|
+
},
|
|
6497
6532
|
{
|
|
6498
6533
|
"path": "tests/gate_review.mjs",
|
|
6499
6534
|
"mode": "0000644",
|
|
@@ -35,9 +35,9 @@
|
|
|
35
35
|
"ui": {
|
|
36
36
|
"colors": {
|
|
37
37
|
"bg": "#fff7ed", "bgCard": "#ffffff", "bgDeep": "#ffedd5", "bgFrame": "#fde4c8",
|
|
38
|
-
"ink": "#2a1f17", "inkSoft": "#6b5d52", "inkFaint": "#
|
|
38
|
+
"ink": "#2a1f17", "inkSoft": "#6b5d52", "inkFaint": "#756a60",
|
|
39
39
|
"rule": "#fdba74", "ruleSoft": "#fed7aa",
|
|
40
|
-
"accent": "#
|
|
40
|
+
"accent": "#ce4806", "accentDeep": "#9e3406", "sea": "#38bdf8", "terracotta": "#fb7185"
|
|
41
41
|
},
|
|
42
42
|
"fonts": {
|
|
43
43
|
"display": "\"Baloo 2\", \"Quicksand\", system-ui, sans-serif",
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# The Front Door and the Project Hub — Direction
|
|
2
|
+
|
|
3
|
+
> **Task 1002746** (goal 1000059), promoted from idea 1000713 · decided with the owner 2026-08-13.
|
|
4
|
+
> Surfaced by the gate-navigation session (task 1002741) and **revises it** — see §6.
|
|
5
|
+
> Time-sensitive: whichever page answers `/` when the pre-launch lock comes off becomes the
|
|
6
|
+
> product's first impression.
|
|
7
|
+
|
|
8
|
+
Scope: what `cloudbongos.com/` serves at launch, what happens to the `index.html` placeholder, and
|
|
9
|
+
how the project surfaces are organised. Deliberately **not** in scope: the visual design of any of
|
|
10
|
+
it — the owner plans a whole-site UI pass once the projects work completes, and this direction
|
|
11
|
+
settles structure so that pass inherits a clean shape rather than a decision.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 0. Starting point — what exists today
|
|
16
|
+
|
|
17
|
+
Verified live on core 1.19.85 and read from `origin/main`.
|
|
18
|
+
|
|
19
|
+
**Two landing pages, and the wrong one answers the domain.**
|
|
20
|
+
|
|
21
|
+
| Path | Live | Notes |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| `/` | **302 → `/gate/` → 401** | the orb sky, behind the pre-launch `basic_auth` |
|
|
24
|
+
| `/index.html` | 200, public | reachable only if you type the filename |
|
|
25
|
+
| `/create`, `/projects` | 200, public | link only to each other |
|
|
26
|
+
|
|
27
|
+
`public-landing/index.html` declares what it is in its own source: *"a deliberately MINIMAL
|
|
28
|
+
placeholder home — just the mascot + a way into the Hall. The full landing page is a separate
|
|
29
|
+
task."* It is a pre-gate stub, not a competing design.
|
|
30
|
+
|
|
31
|
+
**The metadata is inverted.** The placeholder nobody reaches has a real product title and a meta
|
|
32
|
+
description. The gate that actually answers `/` shipped with `<title>Cloud Bongos — landing gate</title>`,
|
|
33
|
+
**no** description, **no** `og:`/`twitter:` tags, and **no** `<noscript>` — and the sky is entirely
|
|
34
|
+
JS-built, so a non-executing crawler or a JS-off visitor got a blank page. None of it bit yet only
|
|
35
|
+
because `X-Robots-Tag: noindex, nofollow` covers the whole host pre-launch. All of it bites at once
|
|
36
|
+
when the lock comes off.
|
|
37
|
+
|
|
38
|
+
**`index.html` is shared, not platform-specific.** It is the default landing every instance serves
|
|
39
|
+
(a child instance like `spike-harbor.cloudbongos.com` has no gate, so it already answers `/` with
|
|
40
|
+
this page). `/projects` is apex-only. That asymmetry constrains what may be hardcoded into it (§4).
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 1. Decisions (owner, 2026-08-13)
|
|
45
|
+
|
|
46
|
+
1. **`/` serves a real landing page** — proper title, meta description, `og:`/social tags, and the
|
|
47
|
+
rest of the landing information. Not a redirect into an interactive experience.
|
|
48
|
+
2. **`/projects` becomes the project hub.** One surface absorbs *all* project-related actions:
|
|
49
|
+
viewing the map/grid of projects, managing the signed-in owner's own projects, and creating new
|
|
50
|
+
ones. `/create` redirects into it. The orb sky stops being a front door and becomes a **view
|
|
51
|
+
inside the hub**.
|
|
52
|
+
3. **Launch-safety is fixed now; the visual build is deferred** to the whole-site UI pass.
|
|
53
|
+
4. **The pre-launch `basic_auth` is temporary** (carried over from task 1002741 §1).
|
|
54
|
+
|
|
55
|
+
## 2. The hub model
|
|
56
|
+
|
|
57
|
+
`/projects` is the single place a person goes for anything project-shaped:
|
|
58
|
+
|
|
59
|
+
| Inside the hub | Comes from today's |
|
|
60
|
+
|---|---|
|
|
61
|
+
| the map / grid of projects (orb sky + the sortable table) | `/gate/` (`view-space`, `view-table`) |
|
|
62
|
+
| your own projects — status, address, teardown, revive | `/projects` |
|
|
63
|
+
| creating a project | `/create` (redirects in) |
|
|
64
|
+
|
|
65
|
+
- **No new vocabulary.** The hub keeps the `/projects` URL rather than inventing `/projects-hub`;
|
|
66
|
+
every existing link and bookmark keeps working, and "projects" already means projects to anyone
|
|
67
|
+
who has seen the surface. (An underscore form — `/projects_hub` — was considered and rejected:
|
|
68
|
+
underscores are unconventional in URLs and read poorly in search results.)
|
|
69
|
+
- **The map and the manage list are two views of one truth.** Both must render the verification
|
|
70
|
+
overlay the task 1002696 direction established (`live · checked Xm ago` / `live?` / `unreachable`).
|
|
71
|
+
A project cannot look alive on the map and unreachable in the list.
|
|
72
|
+
- **Signed-out visitors get the map** as a showcase, plus a way in. Signed-in owners additionally get
|
|
73
|
+
their own projects — which is where owner-orbs (§6) land.
|
|
74
|
+
|
|
75
|
+
## 3. Sequencing — why the flip is NOT in this task
|
|
76
|
+
|
|
77
|
+
The apex flip is deliberately **not** shipped here, for a reason worth recording:
|
|
78
|
+
|
|
79
|
+
- `/` today at least reaches the sky, which carries a (weak) corner door to `/projects`. The shared
|
|
80
|
+
`index.html` has **no** door into the hub at all — its only outbound link is the builders' hall.
|
|
81
|
+
Flipping `/` to that page before it has doors would leave navigation **worse** than today, not
|
|
82
|
+
better.
|
|
83
|
+
- The flip also has an **infra half**: `/` is redirected in two places — the app
|
|
84
|
+
(`src/platform-server.js:115-121`) and the live Caddyfile (`redir / /gate/ 302` inside the `@gate`
|
|
85
|
+
block, which also carries the `basic_auth`). Changing code alone moves nothing on prod. The Caddy
|
|
86
|
+
edit is an operator act on the live box tied to launch, not a surface task.
|
|
87
|
+
|
|
88
|
+
So the flip ships **with** the hub build, once the landing page has doors, and is paired with the
|
|
89
|
+
Caddy change. What ships now is the part that is safe and useful regardless (§4).
|
|
90
|
+
|
|
91
|
+
## 4. What ships in this task (the launch-safety fix)
|
|
92
|
+
|
|
93
|
+
Because the gate is what answers `/` **today**, the launch-safety fix is applied to the gate — not to
|
|
94
|
+
a page that does not yet hold the door:
|
|
95
|
+
|
|
96
|
+
- **`public-landing/gate/index.html`**: a real `<title>`, a meta description, `canonical`,
|
|
97
|
+
`og:type/site_name/url/title/description/image`, and `twitter:` card tags. Absolute
|
|
98
|
+
`cloudbongos.com` URLs, matching the domain `space.js` already pins.
|
|
99
|
+
- **A `<noscript>` block** stating plainly what Cloud Bongos is and linking to `/projects`,
|
|
100
|
+
`/create`, and the hall. Inline-styled, because every rule in `space.css` is scoped to a body
|
|
101
|
+
view-class this block must ignore. **No visual change for a JS visitor** — it renders only when
|
|
102
|
+
scripting is off.
|
|
103
|
+
|
|
104
|
+
**Explicitly not done, and why:** `og:` tags were *not* added to `public-landing/index.html`. It ships
|
|
105
|
+
to every instance, and social tags are read before JS runs — so its `window.__BRANDING__` fill cannot
|
|
106
|
+
populate them, and hardcoding `cloudbongos.com` would make every child instance advertise the wrong
|
|
107
|
+
site. Per-instance social tags need server-side injection; filed as **idea 1000715** rather than
|
|
108
|
+
hacked in here.
|
|
109
|
+
|
|
110
|
+
## 5. Findings surfaced while deciding this
|
|
111
|
+
|
|
112
|
+
- **`tests/platform_boot.mjs` is parked in `KNOWN_FAILING` and has rotted.** Its apex test asserts
|
|
113
|
+
`/` returns 200 with the landing page; the gate redirect (task 1002408) made it 302, and the test
|
|
114
|
+
was never updated. It sits in `run-unit-tests.js`'s `KNOWN_FAILING` set (parked by task 1002617 so
|
|
115
|
+
the `unit` check could be made required), which is why CI is green. A `known_failing_ratchet.mjs`
|
|
116
|
+
pairs with it and fails the suite if a parked test starts passing — so **the hub flip must unpark
|
|
117
|
+
this test in the same change that makes it pass**. Filed as **idea 1000716**.
|
|
118
|
+
- Note the test also asserts an identity chip (`id="who"`, task 2094) that `index.html` does not
|
|
119
|
+
contain — a second, independent rot in the same file.
|
|
120
|
+
- The assertion the repo already carries (`/` → 200, the landing page) is exactly the behaviour this
|
|
121
|
+
direction decides. The test was right; the code drifted past it.
|
|
122
|
+
|
|
123
|
+
## 6. Revision of the gate-navigation direction (task 1002741)
|
|
124
|
+
|
|
125
|
+
That direction was written hours earlier on the premise that **the gate is the front door**. This
|
|
126
|
+
direction supersedes that premise. What survives and what changes:
|
|
127
|
+
|
|
128
|
+
| Decision there | Status now |
|
|
129
|
+
|---|---|
|
|
130
|
+
| The `basic_auth` wall is temporary | **stands** |
|
|
131
|
+
| The type-`bongos` entry ritual is removed; land on the sky | **stands** — the sky is now a hub view, and the ritual should not gate a view any more than it should gate a front door |
|
|
132
|
+
| A persistent door in every gate view | **becomes hub navigation** — the same requirement, relocated: the door is now the hub's own nav between map / your projects / create, not a link out of the gate |
|
|
133
|
+
| A signed-in owner's projects get a distinct identity in the sky | **stands** — and lands inside the hub's map view |
|
|
134
|
+
| The sky is the public front door | **superseded** — `/` is the landing page; the sky is a view of `/projects` |
|
|
135
|
+
|
|
136
|
+
Both carriers are re-scoped accordingly: **task 1002743** (ritual removal + hub navigation, plus the
|
|
137
|
+
apex flip and unparking `platform_boot`) and **task 1002744** (owner-scoped feed + owned-orb identity
|
|
138
|
+
inside the hub map).
|
|
139
|
+
|
|
140
|
+
## 7. Boundary with the coming UI pass
|
|
141
|
+
|
|
142
|
+
This direction settles **structure**: which URL serves what, what the hub contains, and what
|
|
143
|
+
redirects where. It settles **no** visual design — not the landing page's layout, not the hub's
|
|
144
|
+
chrome, not how the map and list views sit together. Those belong to the whole-site UI pass the owner
|
|
145
|
+
plans after the projects work completes, and that pass should be able to take this structure as given
|
|
146
|
+
and change only how it looks.
|
|
147
|
+
|
|
148
|
+
## 8. Sign-off dispositions (owner, 2026-08-13)
|
|
149
|
+
|
|
150
|
+
1. **`/` = a real landing page**; the map/project list is a separate surface.
|
|
151
|
+
2. **That surface is `/projects`**, absorbing map, manage, and create — chosen over a new
|
|
152
|
+
`/projects-hub` URL so no vocabulary or bookmarks are lost.
|
|
153
|
+
3. **Amend task 1002741's direction and re-scope its two carriers** rather than letting them ship
|
|
154
|
+
against a premise that changed (§6).
|
|
155
|
+
4. **Decide + do the launch-safety fix now** — hence §4, and hence the flip deferred to §3.
|
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Gate Navigation — Direction
|
|
2
2
|
|
|
3
|
+
> ## ⚠ REVISED the same day — read this first
|
|
4
|
+
>
|
|
5
|
+
> This document's central premise — **the gate is the front door** — was **superseded within hours**
|
|
6
|
+
> by [`front-door-and-hub-direction.md`](front-door-and-hub-direction.md) (task 1002746, owner,
|
|
7
|
+
> 2026-08-13). Under that decision `/` serves a real landing page, and **`/projects` becomes a project
|
|
8
|
+
> hub** that absorbs the map/grid, managing your projects, and creating them. The orb sky is no longer
|
|
9
|
+
> a front door — it is a **view inside the hub**.
|
|
10
|
+
>
|
|
11
|
+
> **What still stands:** the temporary `basic_auth` wall, removing the type-`bongos` entry ritual, the
|
|
12
|
+
> requirement for persistent navigation, and owner-orbs. **What changed:** those land inside the hub
|
|
13
|
+
> rather than on a standalone gate, and the "door out to `/projects`" becomes the hub's own internal
|
|
14
|
+
> navigation. The full disposition is in that document's §6.
|
|
15
|
+
>
|
|
16
|
+
> Everything below is preserved as the **evidence base** — the live navigation trace, the five-view
|
|
17
|
+
> map, the sign-in-awareness findings, and the shipped-door analysis are all still accurate and still
|
|
18
|
+
> load-bearing for the build. Only the framing changed.
|
|
19
|
+
|
|
3
20
|
> **Task 1002741** (goal 1000059 "Projects surface revamp") · direction decided with the owner 2026-08-13.
|
|
4
21
|
> Owner finding, 2026-08-12, minutes after the task 1002696 redesign went live: *"cloudbongos.com/gate
|
|
5
22
|
> is the landing page and there's no way to get there from the landing page."*
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# The Landing Page — Direction
|
|
2
|
+
|
|
3
|
+
> **Task 1002747** (goal 1000061 "Apex UI pass") · decided with the owner 2026-08-13.
|
|
4
|
+
> The mock this approves: [`mocks/landing-page-mock.html`](mocks/landing-page-mock.html).
|
|
5
|
+
> Palette comparison sheet: [`mocks/landing-palettes.html`](mocks/landing-palettes.html) ·
|
|
6
|
+
> candidate tokens: <redacted>
|
|
7
|
+
|
|
8
|
+
Scope: the **look and content spine** of the page that answers `cloudbongos.com/`. Structure was
|
|
9
|
+
already settled by [`front-door-and-hub-direction.md`](front-door-and-hub-direction.md), whose §7
|
|
10
|
+
deferred the visual design to this pass and told it to take the structure as given. This document
|
|
11
|
+
does not reopen structure. It also does **not** cover the hub — that is the next surface.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 1. Decisions (owner, 2026-08-13)
|
|
16
|
+
|
|
17
|
+
1. **The hero is the bongo pair, not the buddha.** Animated, pulsing on a beat.
|
|
18
|
+
2. **The palette is `ember marigold`** — the existing sunrise with the milk taken out.
|
|
19
|
+
3. **One file, with a server-side apex conditional.** `public-landing/index.html` renders two
|
|
20
|
+
shapes rather than the platform getting its own landing file.
|
|
21
|
+
4. **`landingPage()` gains server-side head injection** — `og:`/`twitter:`/`canonical` are stamped
|
|
22
|
+
from the server-side `branding()`, in this pass. This closes idea 1000715.
|
|
23
|
+
|
|
24
|
+
## 2. The hero — why the drums beat the buddha
|
|
25
|
+
|
|
26
|
+
The mascot was the obvious hero and is not the right one.
|
|
27
|
+
|
|
28
|
+
- **The bongo pair is already the brand mark.** `config/branding.neutral.json`'s favicon is two
|
|
29
|
+
circles, big and small, with lighter heads. The hero is that mark made dimensional, so the tab
|
|
30
|
+
icon and the hero are the same object rather than two unrelated illustrations.
|
|
31
|
+
- **It re-themes.** It is inline SVG whose every fill is a token, so it follows the palette. The
|
|
32
|
+
buddha is a fixed raster and would have pinned one instance's art onto every instance's landing
|
|
33
|
+
page — the same portability problem as the social tags.
|
|
34
|
+
- **It is ~3KB against 1.3MB.** The buddha hero is 44 webp frames above the fold.
|
|
35
|
+
- **It animates the tagline.** "Building software is laying down a beat" is a claim about rhythm;
|
|
36
|
+
a drum being played states it, a seated figure only implies it.
|
|
37
|
+
|
|
38
|
+
The beat is a 1.6s loop: the big drum on 0.0 and 0.8, the small one syncopating at 0.4, 1.0 and
|
|
39
|
+
1.25, with ripples crossing each head, a shell bob, and a matching pulse in the glow and shadow. It
|
|
40
|
+
holds a static pose under `prefers-reduced-motion`.
|
|
41
|
+
|
|
42
|
+
> **Gotcha worth keeping.** The drum head is *skin*, not a card. An early version had it inherit
|
|
43
|
+
> `--bg-card` and it turned black in dark mode. The head carries its own `--skin-hi/mid/lo` tokens
|
|
44
|
+
> that stay a light parchment in both modes.
|
|
45
|
+
|
|
46
|
+
The buddha is **not retired** — it stays the brand's character, and the interactive widget
|
|
47
|
+
(task 1001523, still gated on two unshipped art shoots) has a home in goal 1000031. It is simply
|
|
48
|
+
not what answers `/`.
|
|
49
|
+
|
|
50
|
+
## 3. The palette — `ember marigold`
|
|
51
|
+
|
|
52
|
+
Six palettes were designed against distinct moods and ranked by a brand critique; the sheet and all
|
|
53
|
+
six token sets are preserved in `mocks/`. Marigold won on the thing the light mode most needed:
|
|
54
|
+
|
|
55
|
+
- **A genuinely pigmented backdrop.** Today's light mode has page, sky and cards all within a few
|
|
56
|
+
points of white, so nothing has a figure/ground relationship and the page reads as fog. Marigold
|
|
57
|
+
keeps the backdrop golden all the way to the footer and makes the cards the only near-white
|
|
58
|
+
surfaces, so every panel lifts.
|
|
59
|
+
- **A fired accent.** `#ce4806` instead of `#f97316` — unmistakably the same bongo orange, but with
|
|
60
|
+
heat behind it, and it clears contrast (see §4) where the current one does not.
|
|
61
|
+
- **Dark mode is not an inversion.** Cards are `#2c1710`, a deep saturated umber, and the accent
|
|
62
|
+
pair flips direction — the hover/link tone goes *brighter* (`#ffab63`), which is how warm schemes
|
|
63
|
+
actually behave on a dark ground.
|
|
64
|
+
|
|
65
|
+
**Its risk, recorded so the build can watch for it:** the palette is almost entirely warm and
|
|
66
|
+
almost entirely orange. The ivory cards and the lagoon `--sea` (`#0f7a96`) are the only relief
|
|
67
|
+
valves. If either gets crowded out the page tips into a single amber wash. If that happens in the
|
|
68
|
+
build, the fix already identified is to borrow adobe clay's move and give the scheme a real second
|
|
69
|
+
hue rather than to desaturate the first.
|
|
70
|
+
|
|
71
|
+
## 4. The contrast defect this pass found — fix it in the build
|
|
72
|
+
|
|
73
|
+
Every candidate palette was checked with a WCAG contrast calculator across twelve pairs, and the
|
|
74
|
+
calculator was pointed at the **current** tokens too. The palette shipping today fails AA:
|
|
75
|
+
|
|
76
|
+
| Pair | Ratio | Required | |
|
|
77
|
+
|---|---|---|---|
|
|
78
|
+
| white on `--accent` `#f97316` | **2.80:1** | 4.5 | **fail** |
|
|
79
|
+
| white on `--accent-deep` `#ea580c` | **3.56:1** | 4.5 | **fail** |
|
|
80
|
+
| `--accent-deep` as link text on a card | **3.56:1** | 4.5 | **fail** |
|
|
81
|
+
|
|
82
|
+
This is **not** limited to the landing page — `--accent` is the fill of every primary `.btn` and
|
|
83
|
+
`--accent-deep` is the link color on `/create` and `/projects` right now. Marigold's `#ce4806`
|
|
84
|
+
(4.61:1) and `#9e3406` (6.86:1) clear it. Tracked as its own task so the fix is not buried inside a
|
|
85
|
+
landing-page commit.
|
|
86
|
+
|
|
87
|
+
**`--chrome-accent` must follow `--accent` in the same change.** It is hardcoded `#f97316`/`#fb923c`
|
|
88
|
+
in `cosmos.css`, so a re-themed instance gets an orange wordmark and orange glass borders beside its
|
|
89
|
+
own accent. Marigold is orange enough that this is subtle, but it is wrong for every other pack and
|
|
90
|
+
it is a one-line fix per mode.
|
|
91
|
+
|
|
92
|
+
## 5. The content spine
|
|
93
|
+
|
|
94
|
+
Ordered. **Portable** = true on every instance; **apex-only** = true of Cloud Bongos the platform.
|
|
95
|
+
Press `S` in the mock to outline the apex-only blocks, `C` to see the child-instance shape.
|
|
96
|
+
|
|
97
|
+
| | Section | Portable? |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| S0 | Head metadata — title, description, canonical, `og:`, `twitter:` | server-stamped |
|
|
100
|
+
| S1 | Header — wordmark, Projects, Hall, mode toggle, identity chip | portable |
|
|
101
|
+
| S2 | Hero — self-typing eyebrow, tagline, sub, two CTAs, the drums | portable (2nd CTA apex-only) |
|
|
102
|
+
| S3 | The mechanism — the ledger · the gates · the grade | portable |
|
|
103
|
+
| S4 | The lifecycle — claim → build → grade → ship → credit | portable |
|
|
104
|
+
| S5 | Living proof — the real project catalog | **apex-only**, self-hides on empty |
|
|
105
|
+
| S6 | What you own — AGPL, capture-resistant | **apex-only** |
|
|
106
|
+
| S7 | Two doors — build a project · join as a builder | portable |
|
|
107
|
+
| S8 | Footer | split (see below) |
|
|
108
|
+
|
|
109
|
+
Copy notes:
|
|
110
|
+
- The sub is verbatim from `space.js:34` and the §S6 paragraph verbatim from `create.html:391` —
|
|
111
|
+
both already public-facing and owner-approved. Not newly invented.
|
|
112
|
+
- **The footer line splits.** `index.html:104` currently ships *"A non-profit, capture-resistant
|
|
113
|
+
commons"* to every instance, including ones that are neither. That half is apex-only; *"Built by
|
|
114
|
+
agents, on Cloud Bongos"* is the portable attribution.
|
|
115
|
+
- **S3 is the differentiator, not "AI writes code."** That claim is crowded. What is actually
|
|
116
|
+
enforced — a complete ledger, a server-checked rank ladder, an adversarial grade — is not.
|
|
117
|
+
- **No CLI download block.** `/downloads/bongos/*` only mounts when `config/bongos-cli.json` exists.
|
|
118
|
+
It does not, and the live URL 404s. Do not design copy around it.
|
|
119
|
+
|
|
120
|
+
## 6. The design system
|
|
121
|
+
|
|
122
|
+
The page **links `cosmos.css`** and adds a page-local sheet. It does not fork it and does not start
|
|
123
|
+
a fourth design system. The lifecycle rail is literally `.strip`, the catalog chips are the same
|
|
124
|
+
`.chip` verification vocabulary the hub uses — the marketing page and the working page share
|
|
125
|
+
components rather than resembling each other.
|
|
126
|
+
|
|
127
|
+
`cosmos.css` was built for `/create` and `/projects` and is missing things a marketing page needs.
|
|
128
|
+
The build should add these to the shared layer, not to the page: a `.wrap` container, a type scale
|
|
129
|
+
below `h1`, a spacing scale, one grid primitive, and a mid (~900px) breakpoint. The mock authors all
|
|
130
|
+
five page-locally; they are marked in its stylesheet.
|
|
131
|
+
|
|
132
|
+
## 7. Constraints the build must respect
|
|
133
|
+
|
|
134
|
+
- **C1 · One `:root`.** `injectBrandingGlobal` splices the pack's theme `<style>` at the end of
|
|
135
|
+
`<head>`; a page-local `:root` block silently outranks it and defeats re-branding. Page-local
|
|
136
|
+
custom properties stay scoped to their component.
|
|
137
|
+
- **C2 · Dark changes are made twice.** `:root[data-mode="dark"]` and the
|
|
138
|
+
`prefers-color-scheme` twin are byte-identical duplicates in `cosmos.css`. Both, every time.
|
|
139
|
+
- **C3 · The page must ship a `.sky` element.** The pack's `theme.backdrop` emits a
|
|
140
|
+
`body{background:…}` that overrides `--page-bg` in both modes; `.sky` is the opaque fixed layer
|
|
141
|
+
that paints over it.
|
|
142
|
+
- **C4 · `id="who"` is required.** `tests/platform_boot.mjs:120` asserts `/id="who"/` on the apex
|
|
143
|
+
landing, and that test must leave `KNOWN_FAILING` in the same change that makes it pass — the
|
|
144
|
+
ratchet fails the suite otherwise (idea 1000716).
|
|
145
|
+
- **C5 · Nothing about cloudbongos.com is hardcoded.** `public-landing/` ships wholesale to every
|
|
146
|
+
instance.
|
|
147
|
+
- **C6 · Outbound links cannot be client-filled.** `clientBranding()` does not project `domains`, so
|
|
148
|
+
`[data-link-hall]` never re-points and every child instance currently sends visitors to
|
|
149
|
+
`builders.cloudbongos.com`. The §1.4 server-side injection is the fix that respects the branding
|
|
150
|
+
contract's decision to keep origins server-side.
|
|
151
|
+
- **C7 · Real markup, not JS-built.** The page must read correctly to a crawler and with JavaScript
|
|
152
|
+
off — the failure the gate shipped with and task 1002746 had to repair.
|
|
153
|
+
|
|
154
|
+
## 8. Follow-on tasks this direction produced
|
|
155
|
+
|
|
156
|
+
| Task | Goal | What it does |
|
|
157
|
+
|---|---|---|
|
|
158
|
+
| **task 1002748** | 1000061 | **The build carrier.** Builds this direction into `public-landing/index.html`: the content spine, the bongo hero, the apex conditional, and the server-stamped head tags. This document plus the mock are its contract. |
|
|
159
|
+
| **task 1002749** | 1000059 | **The WCAG defect** found in §4. Filed separately from the build because it is a live fault on `/create` and `/projects`, not a landing-page issue, and should not be buried inside a landing-page commit. |
|
|
160
|
+
|
|
161
|
+
Both are promoted and claimable. Neither is started.
|
|
162
|
+
|
|
163
|
+
Already existing, and gated on the build: **task 1002743** part 3 is the apex flip — it does not run
|
|
164
|
+
until the landing page carries a door into the hub, which §5's header now does, *and* the hub itself
|
|
165
|
+
exists.
|
|
166
|
+
|
|
167
|
+
## 9. What is deliberately still open
|
|
168
|
+
|
|
169
|
+
- **The hub is not designed.** `/projects` is the next surface and gets its own mock and direction.
|
|
170
|
+
- **The apex flip does not happen here.** `/` keeps redirecting until the hub exists; the flip is
|
|
171
|
+
task 1002743 part 3 and is paired with an operator Caddy edit.
|
|
172
|
+
- **Whether the catalog band survives at three projects.** It reads thin today. The band self-hides
|
|
173
|
+
on an empty feed, so shipping it is safe, but if the catalog stays this small the honest options
|
|
174
|
+
are a threshold or cutting S5 and letting the hub carry the showcase.
|
|
175
|
+
- **The proof band's effect is weaker in dark mode.** In light it reads as a window into the hub; in
|
|
176
|
+
dark the whole page is already dark and it separates only by tint.
|