@bongos/core 1.19.441 → 1.19.443
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 +496 -441
- package/clients/bongos-client/index.d.ts +1 -2
- package/config/branding.neutral.json +1 -1
- package/docs/adr/0218-the-apex-root-web-surface.md +55 -0
- package/docs/adr/README.md +1 -0
- package/docs/api/openapi.json +3 -20
- package/docs/api-reference.md +1 -1
- package/docs/architecture.md +2 -1
- package/docs/copy-inventory.md +363 -359
- package/docs/copy-registry.json +608 -561
- package/docs/design/mocks/hub/mine.html +1 -1
- package/docs/design/mocks/hub/picker.html +1 -1
- package/docs/design/mocks/hub/planets.html +1 -1
- package/docs/design/mocks/hub/v1.html +3 -3
- package/docs/design/mocks/hub/v2.html +2 -2
- package/docs/design/mocks/hub/v3.html +5 -5
- package/docs/design/mocks/hub/wizard.html +1 -1
- package/docs/design/mocks/landing/v1.html +1 -1
- package/docs/design/mocks/landing/v2.html +1 -1
- package/docs/design/mocks/landing/v3.html +1 -1
- package/docs/design/mocks/landing-page-mock.html +3 -3
- package/docs/design/mocks/projects-hub-mock.html +1 -1
- package/docs/design/mocks/projects-hub-variants.html +1 -1
- package/docs/design/mocks/projects-page-mock.html +1 -1
- package/docs/design/projects-hub-direction-v2.md +23 -0
- package/docs/file-map.md +3 -3
- package/docs/module-api-changelog.md +4 -0
- package/docs/modules-contract.md +9 -2
- package/docs/recipes/ui-look-before-you-ship.md +4 -4
- package/modules/copy-desk/tests/copy_flags.mjs +4 -4
- package/modules/platform-identity/routes/projects.js +2 -1
- package/modules/provisioning/provisioning.js +11 -2
- package/modules/provisioning/routes/provisioning.js +10 -5
- package/modules/public-landing/CLAUDE.md +15 -0
- package/modules/public-landing/module.json +15 -0
- package/{public-landing → modules/public-landing/public}/assets/cosmos.css +8 -0
- package/modules/public-landing/public/assets/world/r4-card-chrome.jpg +0 -0
- package/modules/public-landing/public/assets/world/r4-card-chrome.jpg.json +14 -0
- package/modules/public-landing/public/assets/world/r4-card-deepfield.jpg +0 -0
- package/modules/public-landing/public/assets/world/r4-card-deepfield.jpg.json +14 -0
- package/modules/public-landing/public/assets/world/r4-card-dust.jpg +0 -0
- package/modules/public-landing/public/assets/world/r4-card-dust.jpg.json +14 -0
- package/modules/public-landing/public/assets/world/r4-card-nebula.jpg +0 -0
- package/modules/public-landing/public/assets/world/r4-card-nebula.jpg.json +14 -0
- package/{public-landing → modules/public-landing/public}/projects-floor.states.json +28 -1
- package/{public-landing → modules/public-landing/public}/projects.html +101 -1
- package/{public-landing → modules/public-landing/public}/projects.probes.json +6 -0
- package/{public-landing → modules/public-landing/public}/projects.states.json +1 -0
- package/modules/ui-design/kit/fixtures/featured-hub.json +1 -1
- package/modules/ui-design/kit/lib.js +2 -2
- package/modules/ui-design/kit/render.js +1 -1
- package/modules/ui-design/kit/serve.js +32 -7
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/copy-inventory.js +3 -3
- package/scripts/gds/fitness-checks-identity.js +18 -1
- package/scripts/gds/publish-manifest.js +1 -1
- package/src/bongos/module-scope-map.js +9 -7
- package/src/bongos/serve-internal.js +13 -1
- package/src/module-api.js +1 -1
- package/src/module-loader/loader.js +34 -17
- package/src/module-loader/manifest-schema.js +16 -8
- package/src/platform-server.js +50 -18
- package/tests/copy_inventory.mjs +0 -0
- package/tests/cosmos_token_contrast.mjs +6 -6
- package/tests/fitness.mjs +20 -0
- package/tests/landing_legal_pages.mjs +2 -1
- package/tests/landing_page.mjs +7 -5
- package/tests/module-scope-map.mjs +2 -2
- package/tests/module_loader.mjs +4 -1
- package/tests/onboard.mjs +5 -5
- package/tests/projects_hub.mjs +105 -20
- package/tests/projects_hub_pre_uat.mjs +5 -3
- package/tests/provisioning_settings.mjs +49 -4
- package/tests/public_landing_projects.mjs +2 -2
- package/tests/terms_acceptance.mjs +1 -1
- package/tests/ui_design_kit.mjs +3 -3
- package/tests/world_tokens.mjs +3 -2
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_00.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_01.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_02.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_03.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_04.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_05.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_06.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_07.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_08.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_09.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_10.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_11.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_12.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_13.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_14.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_15.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_16.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_17.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_18.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_19.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_20.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_21.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_22.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_23.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_24.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_25.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_26.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_27.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_28.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_29.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_30.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_31.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_32.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_33.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_34.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_35.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_36.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_37.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_38.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_39.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_40.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_41.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_42.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/anim/idle/frame_43.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/verro-medallion.png +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/og-card.jpg +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r2-bongos-chrome-a-cut.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r2-bongos-chrome-a-cut.webp.json +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r2-bongos-chrome-b.jpg +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r2-bongos-chrome-b.jpg.json +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r2-chrome-blob-one-cut.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r2-chrome-blob-one-cut.webp.json +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r2-chrome-blob-one.jpg +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r2-chrome-blob-one.jpg.json +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r2-chrome-blobs-set-cut.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r2-chrome-blobs-set-cut.webp.json +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r2-chrome-blobs-set.jpg +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r2-chrome-blobs-set.jpg.json +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-frost-bead-cut.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-frost-bead-cut.webp.json +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-frost-blob-cut.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-frost-blob-cut.webp.json +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-frost-pair-cut.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-frost-pair-cut.webp.json +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-gold-bead-cut.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-gold-bead-cut.webp.json +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-gold-blob-cut.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-gold-blob-cut.webp.json +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-gold-pair-cut.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-gold-pair-cut.webp.json +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-obsidian-bead-cut.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-obsidian-bead-cut.webp.json +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-obsidian-blob-cut.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-obsidian-blob-cut.webp.json +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-obsidian-pair-cut.webp +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-obsidian-pair-cut.webp.json +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-space-nebula.jpg +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world/r3-space-nebula.jpg.json +0 -0
- /package/{public-landing → modules/public-landing/public}/assets/world.css +0 -0
- /package/{public-landing → modules/public-landing/public}/buddha.png +0 -0
- /package/{public-landing → modules/public-landing/public}/contact.html +0 -0
- /package/{public-landing → modules/public-landing/public}/index.html +0 -0
- /package/{public-landing → modules/public-landing/public}/index.probes.json +0 -0
- /package/{public-landing → modules/public-landing/public}/index.states.json +0 -0
- /package/{public-landing → modules/public-landing/public}/privacy.html +0 -0
- /package/{public-landing → modules/public-landing/public}/projects-empty.states.json +0 -0
- /package/{public-landing → modules/public-landing/public}/terms.html +0 -0
- /package/{public-landing → modules/public-landing/public}/world/assets/clouds/cloud-island-large.png +0 -0
- /package/{public-landing → modules/public-landing/public}/world/assets/clouds/cloud-puff.png +0 -0
- /package/{public-landing → modules/public-landing/public}/world/assets/creatures/creature-whale-cargo.png +0 -0
- /package/{public-landing → modules/public-landing/public}/world/assets/creatures/creature-whale-glide.png +0 -0
- /package/{public-landing → modules/public-landing/public}/world/assets/plates/plate-clouds-near.png +0 -0
- /package/{public-landing → modules/public-landing/public}/world/assets/plates/scene-establishing.png +0 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
9
9
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
10
10
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Manrope:wght@300;400;500;600&display=swap">
|
|
11
|
-
<link rel="stylesheet" href="../../../../public-landing/assets/cosmos.css">
|
|
11
|
+
<link rel="stylesheet" href="../../../../modules/public-landing/public/assets/cosmos.css">
|
|
12
12
|
<style>
|
|
13
13
|
body{
|
|
14
14
|
/* The composition round for task 1003345 (docs/design/projects-hub-direction-v2.md §14). cosmos.css
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
9
9
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
10
10
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Manrope:wght@300;400;500;600&display=swap">
|
|
11
|
-
<link rel="stylesheet" href="../../../../public-landing/assets/cosmos.css">
|
|
11
|
+
<link rel="stylesheet" href="../../../../modules/public-landing/public/assets/cosmos.css">
|
|
12
12
|
<style>
|
|
13
13
|
body{
|
|
14
14
|
/* The composition round for task 1003347 (docs/design/projects-hub-direction-v2.md §16): the
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
12
12
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
13
13
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Manrope:wght@300;400;500;600&display=swap">
|
|
14
|
-
<link rel="stylesheet" href="../../../../public-landing/assets/cosmos.css">
|
|
14
|
+
<link rel="stylesheet" href="../../../../modules/public-landing/public/assets/cosmos.css">
|
|
15
15
|
<style>
|
|
16
16
|
body{
|
|
17
17
|
/* The composition round for task 1003319 (docs/design/projects-hub-direction-v2.md §11). cosmos.css
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
12
12
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
13
13
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Manrope:wght@300;400;500;600&display=swap">
|
|
14
|
-
<link rel="stylesheet" href="../../../../public-landing/assets/cosmos.css">
|
|
14
|
+
<link rel="stylesheet" href="../../../../modules/public-landing/public/assets/cosmos.css">
|
|
15
15
|
<style>
|
|
16
16
|
/* ═══════════════ v1 "the shelf" — the page tier ═══════════════════════════
|
|
17
17
|
cosmos.css above carries the fifteen contract tokens, the sky, the orbs, the
|
|
@@ -757,7 +757,7 @@ not a width), --ok, --warn and --err keep cosmos's meaning and are not redeclare
|
|
|
757
757
|
<div class="cardScrim" id="cardScrim" hidden>
|
|
758
758
|
<div class="projCard" id="projCard" role="dialog" aria-modal="true" aria-labelledby="cardName" data-art="on" data-faces="on" data-figs="two" data-facts="on" data-hall="on" style="--acc:var(--accent)">
|
|
759
759
|
<button type="button" class="cardX" id="cardClose" aria-label="Close"><svg viewBox="0 0 20 20" aria-hidden="true"><path d="M5.4 5.4l9.2 9.2M14.6 5.4l-9.2 9.2"/></svg></button>
|
|
760
|
-
<img class="cardArt" id="cardArt" src="../../../../public-landing/assets/world/og-card.jpg" alt="">
|
|
760
|
+
<img class="cardArt" id="cardArt" src="../../../../modules/public-landing/public/assets/world/og-card.jpg" alt="">
|
|
761
761
|
<span class="cardDot" id="cardDot"></span>
|
|
762
762
|
<h2 class="cardName" id="cardName">Cloud Bongos</h2>
|
|
763
763
|
<p class="cardTag" id="cardTag">Building Digitally, as simple as Bongos.</p>
|
|
@@ -903,7 +903,7 @@ not a width), --ok, --warn and --err keep cosmos's meaning and are not redeclare
|
|
|
903
903
|
var AV = 'https://avatars.githubusercontent.com/u/';
|
|
904
904
|
var PLATFORM = {
|
|
905
905
|
acc: 'var(--accent)', name: 'Cloud Bongos', tag: 'Building Digitally, as simple as Bongos.',
|
|
906
|
-
rel: 'you build here', art: '../../../../public-landing/assets/world/og-card.jpg',
|
|
906
|
+
rel: 'you build here', art: '../../../../modules/public-landing/public/assets/world/og-card.jpg',
|
|
907
907
|
faces: [[AV + '64553469?v=4', 'jaxri'], [AV + '283020391?v=4', 'lars589'], [AV + '290184380?v=4', 'IAMMASTERQUA'],
|
|
908
908
|
[AV + '295990394?v=4', 'scootermack'], [AV + '35337514?v=4', 'LarsCode']],
|
|
909
909
|
type: null, more: '+4', builders: '9', shipped: '30+', runs: 'cloudbongos.com',
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
13
13
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
14
14
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Manrope:wght@300;400;500;600&display=swap">
|
|
15
|
-
<link rel="stylesheet" href="../../../../public-landing/assets/cosmos.css">
|
|
15
|
+
<link rel="stylesheet" href="../../../../modules/public-landing/public/assets/cosmos.css">
|
|
16
16
|
<style>
|
|
17
17
|
body{
|
|
18
18
|
/* v2 "the hairline" — the world's derived tier for this surface, by the recipes in DESIGN.md's
|
|
@@ -753,7 +753,7 @@ vocabulary its chips depend on). Two recipes are adapted because a mock may carr
|
|
|
753
753
|
<div class="cardScrim" id="cardScrim" hidden>
|
|
754
754
|
<div class="projCard has-art" id="projCard" role="dialog" aria-modal="true" aria-labelledby="cardName">
|
|
755
755
|
<button type="button" class="cardX" id="cardClose" aria-label="Close"><svg aria-hidden="true"><use href="#i-close"></use></svg></button>
|
|
756
|
-
<img class="cardArt" id="cardArt" src="../../../../public-landing/assets/world/og-card.jpg" alt="">
|
|
756
|
+
<img class="cardArt" id="cardArt" src="../../../../modules/public-landing/public/assets/world/og-card.jpg" alt="">
|
|
757
757
|
<p class="cardFigs" id="cardFigs">
|
|
758
758
|
<span class="cardCall a" id="figA"><svg class="lead" viewBox="0 0 68 26" preserveAspectRatio="none" aria-hidden="true"><line x1="0" y1="25" x2="67" y2="1" stroke="currentColor" stroke-width="1" vector-effect="non-scaling-stroke"/></svg><span class="fig" id="figABig">9</span><span class="cap">builders</span></span>
|
|
759
759
|
<span class="cardCall b" id="figB"><svg class="lead" viewBox="0 0 68 26" preserveAspectRatio="none" aria-hidden="true"><line x1="0" y1="25" x2="67" y2="1" stroke="currentColor" stroke-width="1" vector-effect="non-scaling-stroke"/></svg><span class="fig" id="figBBig">30+</span><span class="cap">shipped in 30 days</span></span>
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
12
12
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
13
13
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Manrope:wght@300;400;500;600&display=swap">
|
|
14
|
-
<link rel="stylesheet" href="../../../../public-landing/assets/cosmos.css">
|
|
14
|
+
<link rel="stylesheet" href="../../../../modules/public-landing/public/assets/cosmos.css">
|
|
15
15
|
<style>
|
|
16
16
|
/* ══ v3 THE GLASS STRIP. Page tier only. cosmos.css owns the fifteen contract
|
|
17
17
|
tokens, the sky, the orbs, the hover card, the toolbar, the table, the
|
|
@@ -875,7 +875,7 @@ the hub's fixed verification vocabulary.
|
|
|
875
875
|
<div class="ladderCell" data-card="card"><span class="boardLbl">card</span>
|
|
876
876
|
<div class="projCard" id="projCard" role="dialog" aria-modal="true" aria-labelledby="cardName" style="--acc:var(--accent)">
|
|
877
877
|
<button type="button" class="cardX" id="cardClose" aria-label="Close"><svg class="ic" aria-hidden="true"><use href="#i-close"></use></svg></button>
|
|
878
|
-
<img class="cardArt" src="../../../../public-landing/assets/world/og-card.jpg" alt="">
|
|
878
|
+
<img class="cardArt" src="../../../../modules/public-landing/public/assets/world/og-card.jpg" alt="">
|
|
879
879
|
<span class="artScrim" aria-hidden="true"></span>
|
|
880
880
|
<span class="cardDot" id="cardDot"></span>
|
|
881
881
|
<h3 class="cardName" id="cardName">Cloud Bongos</h3>
|
|
@@ -967,7 +967,7 @@ the hub's fixed verification vocabulary.
|
|
|
967
967
|
<div class="ladderCell" data-card="card-nofaces" hidden><span class="boardLbl">card-nofaces</span>
|
|
968
968
|
<div class="projCard" style="--acc:var(--accent)">
|
|
969
969
|
<button type="button" class="cardX" aria-label="Close"><svg class="ic" aria-hidden="true"><use href="#i-close"></use></svg></button>
|
|
970
|
-
<img class="cardArt" src="../../../../public-landing/assets/world/og-card.jpg" alt="">
|
|
970
|
+
<img class="cardArt" src="../../../../modules/public-landing/public/assets/world/og-card.jpg" alt="">
|
|
971
971
|
<span class="artScrim" aria-hidden="true"></span>
|
|
972
972
|
<span class="cardDot"></span>
|
|
973
973
|
<h3 class="cardName" id="cardName-nofaces">Cloud Bongos</h3>
|
|
@@ -990,7 +990,7 @@ the hub's fixed verification vocabulary.
|
|
|
990
990
|
<div class="ladderCell" data-card="card-onefig" hidden><span class="boardLbl">card-onefig</span>
|
|
991
991
|
<div class="projCard" style="--acc:var(--accent)">
|
|
992
992
|
<button type="button" class="cardX" aria-label="Close"><svg class="ic" aria-hidden="true"><use href="#i-close"></use></svg></button>
|
|
993
|
-
<img class="cardArt" src="../../../../public-landing/assets/world/og-card.jpg" alt="">
|
|
993
|
+
<img class="cardArt" src="../../../../modules/public-landing/public/assets/world/og-card.jpg" alt="">
|
|
994
994
|
<span class="artScrim" aria-hidden="true"></span>
|
|
995
995
|
<span class="cardDot"></span>
|
|
996
996
|
<h3 class="cardName" id="cardName-onefig">Cloud Bongos</h3>
|
|
@@ -1020,7 +1020,7 @@ the hub's fixed verification vocabulary.
|
|
|
1020
1020
|
<div class="ladderCell" data-card="card-nofig" hidden><span class="boardLbl">card-nofig</span>
|
|
1021
1021
|
<div class="projCard" style="--acc:var(--accent)">
|
|
1022
1022
|
<button type="button" class="cardX" aria-label="Close"><svg class="ic" aria-hidden="true"><use href="#i-close"></use></svg></button>
|
|
1023
|
-
<img class="cardArt" src="../../../../public-landing/assets/world/og-card.jpg" alt="">
|
|
1023
|
+
<img class="cardArt" src="../../../../modules/public-landing/public/assets/world/og-card.jpg" alt="">
|
|
1024
1024
|
<span class="artScrim" aria-hidden="true"></span>
|
|
1025
1025
|
<span class="cardDot"></span>
|
|
1026
1026
|
<h3 class="cardName" id="cardName-nofig">Cloud Bongos</h3>
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
9
9
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
10
10
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Manrope:wght@300;400;500;600&display=swap">
|
|
11
|
-
<link rel="stylesheet" href="../../../../public-landing/assets/cosmos.css">
|
|
11
|
+
<link rel="stylesheet" href="../../../../modules/public-landing/public/assets/cosmos.css">
|
|
12
12
|
<style>
|
|
13
13
|
body{
|
|
14
14
|
/* The composition round for task 1003346 (docs/design/projects-hub-direction-v2.md §15). cosmos.css
|
|
@@ -803,7 +803,7 @@ in the h1 is the server-stamped {{tagline}}. Apex-only regions are stripped on a
|
|
|
803
803
|
<!--apex-only:start-->
|
|
804
804
|
<section class="band">
|
|
805
805
|
<div class="wrap verro">
|
|
806
|
-
<img src="../../../../public-landing/assets/verro-medallion.png" width="384" height="384"
|
|
806
|
+
<img src="../../../../modules/public-landing/public/assets/verro-medallion.png" width="384" height="384"
|
|
807
807
|
alt="The Verro Labs mark: a galaxy and constellation above a river valley threaded with circuitry">
|
|
808
808
|
<div>
|
|
809
809
|
<h2>VERRO LABS</h2>
|
|
@@ -614,7 +614,7 @@ data-link-hall); the h1 string is the server-stamped {{tagline}}.
|
|
|
614
614
|
<!--apex-only:start-->
|
|
615
615
|
<section class="page">
|
|
616
616
|
<div class="wrap verro">
|
|
617
|
-
<img src="../../../../public-landing/assets/verro-medallion.png" width="292" height="292"
|
|
617
|
+
<img src="../../../../modules/public-landing/public/assets/verro-medallion.png" width="292" height="292"
|
|
618
618
|
alt="The Verro Labs mark: a galaxy and constellation above a river valley threaded with circuitry">
|
|
619
619
|
<div>
|
|
620
620
|
<span class="wordmark">VERRO LABS</span>
|
|
@@ -825,7 +825,7 @@ composition A, pinned by the owner 2026-08-27. No roll.
|
|
|
825
825
|
<!--apex-only:start-->
|
|
826
826
|
<section class="band">
|
|
827
827
|
<div class="wrap verro">
|
|
828
|
-
<img src="../../../../public-landing/assets/verro-medallion.png"
|
|
828
|
+
<img src="../../../../modules/public-landing/public/assets/verro-medallion.png"
|
|
829
829
|
alt="The Verro Labs mark: a galaxy and constellation above a river valley threaded with circuitry">
|
|
830
830
|
<div>
|
|
831
831
|
<p class="wordmark">VERRO LABS</p>
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Baloo+2:wght@500;600;700&family=Quicksand:wght@400;500;600;700&family=Fira+Code:wght@400;500&display=swap">
|
|
33
33
|
<!-- Same convention as projects-page-mock.html: this links the REAL token layer
|
|
34
34
|
the live pages use, so what you review is what ships. Toggle ☾/☀ in the header. -->
|
|
35
|
-
<link rel="stylesheet" href="../../../public-landing/assets/cosmos.css">
|
|
35
|
+
<link rel="stylesheet" href="../../../modules/public-landing/public/assets/cosmos.css">
|
|
36
36
|
<!-- Candidate palettes. MOCK-ONLY: on a real instance exactly one of these
|
|
37
37
|
exists and arrives via config/branding.json → themeMarkup(). See the file
|
|
38
38
|
header for the contrast audit. -->
|
|
@@ -339,7 +339,7 @@ body:not([data-mascot="bongos"]) .mascot-bongos{display:none;}
|
|
|
339
339
|
</div>
|
|
340
340
|
</div>
|
|
341
341
|
<div class="mascot">
|
|
342
|
-
<img class="mascot-buddha" id="buddha" src="../../../public-landing/buddha.png"
|
|
342
|
+
<img class="mascot-buddha" id="buddha" src="../../../modules/public-landing/public/buddha.png"
|
|
343
343
|
alt="A laughing Cloud Bongos buddha playing the bongos on a cloud">
|
|
344
344
|
|
|
345
345
|
<svg class="mascot-bongos bongos" viewBox="0 0 440 320" role="img"
|
|
@@ -611,7 +611,7 @@ body:not([data-mascot="bongos"]) .mascot-bongos{display:none;}
|
|
|
611
611
|
only ever been visible behind a 401. buddha.png stays the poster so the
|
|
612
612
|
hero is never blank while frames load. */
|
|
613
613
|
if(!reduce){
|
|
614
|
-
var img=document.getElementById('buddha'), FR=44, base='../../../public-landing/assets/anim/idle/frame_';
|
|
614
|
+
var img=document.getElementById('buddha'), FR=44, base='../../../modules/public-landing/public/assets/anim/idle/frame_';
|
|
615
615
|
var srcs=[], loaded=0;
|
|
616
616
|
for(var i=0;i<FR;i++){
|
|
617
617
|
var p=new Image();
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<!-- The mock links the SHIPPING stylesheet by relative path so what you see is
|
|
9
9
|
what the build inherits. Serve over HTTP (python -m http.server 8899) — a
|
|
10
10
|
file:// open still resolves this, but the fonts do not. -->
|
|
11
|
-
<link rel="stylesheet" href="../../../public-landing/assets/cosmos.css">
|
|
11
|
+
<link rel="stylesheet" href="../../../modules/public-landing/public/assets/cosmos.css">
|
|
12
12
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
13
13
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
14
14
|
<link href="https://fonts.googleapis.com/css2?family=Baloo+2:wght@500;600;700&family=Quicksand:wght@400;500;600;700&family=Fira+Code:wght@400;500&display=swap" rel="stylesheet">
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="utf-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
6
|
<title>The hub's ground — three candidates (task 1002758)</title>
|
|
7
|
-
<link rel="stylesheet" href="../../../public-landing/assets/cosmos.css">
|
|
7
|
+
<link rel="stylesheet" href="../../../modules/public-landing/public/assets/cosmos.css">
|
|
8
8
|
<link href="https://fonts.googleapis.com/css2?family=Baloo+2:wght@500;600;700&family=Quicksand:wght@400;500;600;700&family=Fira+Code:wght@400;500&display=swap" rel="stylesheet">
|
|
9
9
|
<style>
|
|
10
10
|
/* Contact sheet — the same pattern landing-palettes.html used for the palette
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Baloo+2:wght@500;600;700&family=Quicksand:wght@400;500;600;700&family=Fira+Code:wght@400;500&display=swap">
|
|
10
10
|
<!-- This mock links the REAL token/component layer the live pages use, so what
|
|
11
11
|
you review here is what ships. Toggle ☾/☀ in the header to see both modes. -->
|
|
12
|
-
<link rel="stylesheet" href="../../../public-landing/assets/cosmos.css">
|
|
12
|
+
<link rel="stylesheet" href="../../../modules/public-landing/public/assets/cosmos.css">
|
|
13
13
|
<script>
|
|
14
14
|
try{var _m=localStorage.getItem('cb-color-mode');if(_m==='light'||_m==='dark')document.documentElement.setAttribute('data-mode',_m);}catch(e){}
|
|
15
15
|
</script>
|
|
@@ -312,3 +312,26 @@ Three mastheads, rendered dark and light at 1440 / 390 / 320 (ALL CLEAN) and mea
|
|
|
312
312
|
**Retargeted.** Every table pin: the self row's extraction (`<li class="tblRow" id="selfRow">`), the generated-row template, the six-cell parity test (now "every row lays the same five parts", which reads the planet expression too, so dropping the planet cannot pass), the column-source test (now fact-source), the fixed-tracks test (now asserts the two views' tracks line for line and that **no table rule outlived the table**), the `—`/0 pin, the Runs pin, `.rowHall`'s box, the placeholder-href guard, and `projects_hub_pre_uat.mjs`'s keyboard-sort test. One test is new: the sort control's own contract.
|
|
313
313
|
|
|
314
314
|
**Flagged to the copy desk, not changed here.** `typeHtml`'s "not declared" now speaks in the row's voice but is still the formatter the create wizard's review reads through `typeLabel`; the two are not in conflict, but a copy pass over the row's four fact lines as a set would be worth one sitting.
|
|
315
|
+
|
|
316
|
+
## 19. The card's backdrop: a plate set the owner picks, beside the planet (task 1003352)
|
|
317
|
+
|
|
318
|
+
**Date:** 2026-08-30 · deferred out of the planet round (§16) when the owner said, on that review, *"this could also house project card backdrop customization."* It waited because a card plate set is an art round of its own and the free image coverage had ended; the owner confirmed the spend for this session.
|
|
319
|
+
|
|
320
|
+
**The art round.** Four **5:2** bands — the shape a poster card's banner actually is. Round 3's four space plates are 16:9 field grounds; a 5:2 crop of one puts its density wherever it happens to fall, so the round generated for the card's own composition instead: the interest centre-right, the left third and both lower corners near-black, because the card puts its disc and name lower-left and its two figure callouts upper-left and lower-right.
|
|
321
|
+
|
|
322
|
+
| Key | What it is |
|
|
323
|
+
|---|---|
|
|
324
|
+
| `nebula` | a violet-and-bronze nebula wash, sparse stars — the field's own language in the card's shape |
|
|
325
|
+
| `dust` | warm bronze dust lanes, very low contrast; a haze rather than a shape |
|
|
326
|
+
| `deepfield` | a deep field of very distant galaxies on near-black; the quietest of the four |
|
|
327
|
+
| `chrome` | a sweeping ribbon of liquid chrome — the world's own material with no object in it |
|
|
328
|
+
|
|
329
|
+
**Two things worth recording about the round.** `nano_banana_pro` was asked first (the model round 3 used); after twenty-five minutes not one of its four jobs had left `waiting`, while the same four prompts on `soul_location` returned in fifteen seconds — a stuck provider queue, not a bad request. And the nebula came back too dark to read at the card's 560px: a **gamma** lift (1.75) raises the wash without crushing the black the disc and the name sit on, which is what a contrast lift did instead when it was tried first. Both are in the sidecars, so the plates can be remade.
|
|
330
|
+
|
|
331
|
+
**The key is the planet's kind, not a new kind.** `card_backdrop` joins `PLANET_VOCAB` rather than getting a vocabulary of its own, because everything true of the planet is true of it: a closed list, no default, the platform's to draw, pushed to no instance, restarting nothing. That one line is the whole server change — `planetChoice()` loops the vocab, the settings route builds both its validator and its `settingKeys` from it, and `publicInstance()` spreads it — so the key reaches the row, the own-scoped read and the public wire with no new branch. Two edits beyond it: `planetChoicesForHosts` now admits a host that chose **only** a backdrop, and `/projects/featured` carries the third key.
|
|
332
|
+
|
|
333
|
+
**On the page.** `openCard` reads `backdropPlate(p.card_backdrop) || safeHttpUrl(p.art_url)` — the owner's plate stands in front of the project's own picture, and a key this platform does not draw resolves to `''` rather than a broken `src`. The picker is **its own section beside the planet**, not a control inside it: the owner's words were "beside the planet", and one heading is how a project is drawn *everywhere* while the other is one surface's backdrop, so folding them together would have made both headings lie. It is the planet section's twin otherwise — one band of hairline cells (five: "its own picture" and the four plates), the preview at the planet preview's width as a 5:2 band, one save door, the settings PATCH, the receipt the page repaints from. The preview's caption speaks for the ROW, so a pick that is ahead of the row reads **"not saved yet"** rather than "nothing chosen" under a plate the owner can already see.
|
|
334
|
+
|
|
335
|
+
**What the grade caught, and the class it closed.** The first round shipped `card_backdrop` into `PLANET_VOCAB` and stopped there — and the settings route's `validateOrRespond` schema was a **hand-written field list**, not the vocabulary. Strict mode rejects any field a schema does not declare, so `settingKeys` would have copied the key that the validator had already 400'd: every real save from the manage page would have failed. Nothing caught it, because the kit's stub accepted any body key, so 47 probes and a clean render all passed against a request the server refuses. Both halves are fixed rather than patched: the route's schema is now **derived from the vocabularies** (`vocabSchema(SETTINGS_VOCAB)` + `vocabSchema(PLANET_VOCAB)`), so a key can no longer exist in one and not the other; the stub validates against the same closed lists (copied — a kit module may not import core — and pinned to their source by a test); and `provisioning_settings.mjs` now PATCHes the **real** router with `card_backdrop`, refuses an off-vocabulary one, and walks every declared key of both vocabularies asserting a 200, which is the guard that would have failed on the first round.
|
|
336
|
+
|
|
337
|
+
**The kit.** The read path renders where the hub's own catalog is served — `projects-floor.states.json` is the sibling allowed to alias a fixture, so `featured-hub.json` gives Example a `card_backdrop` and the new `card-backdrop` state pins the plate's `src` on the card. `render.js --page /projects` **ALL CLEAN** (with `in-manage-card`), the two sibling states files ALL CLEAN, `probe.js` **47/47** (two new: the pick saves with the route's no-restart receipt; handing it back restores the project's own picture). `projects_hub` 138/138, `projects_hub_pre_uat` 56/56, `<redacted>` 34/34, `provisioning_settings` 26/26, `provisioning_settings_env` 12/12, `validate-design --strict` valid, `fitness` all checks passed, the copy registry regenerated. DESIGN.md carries the round-4 table.
|
package/docs/file-map.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
├── README.md ← public-facing one-paragraph summary
|
|
12
12
|
├── PRODUCT.md ← durable product truth for the apex/hall/status surfaces (impeccable init, task 1003296): users, positioning, constraints, brand commitments, principles — no palette, no type
|
|
13
13
|
├── DESIGN.md ← the visual rulebook written FROM the built landing (task 1003298, ADR 0196): palette + derived recipes, type, materials (the chrome plates), components, the motion grammar, both modes; what H1 (hall) and S1 (status) build against. Sidecar .impeccable/design.json
|
|
14
|
-
├── .impeccable/ ← impeccable skill artifacts: config.json (buildPath: code), surfaces/<route>.md (per-route briefs), mocks/world-assets/ (Higgsfield renders + prompt sidecars; the SOURCE of public-landing/assets/world/), mocks/decision/ (A1 comps), design.json (DESIGN.md sidecar), review/ (finish captures)
|
|
14
|
+
├── .impeccable/ ← impeccable skill artifacts: config.json (buildPath: code), surfaces/<route>.md (per-route briefs), mocks/world-assets/ (Higgsfield renders + prompt sidecars; the SOURCE of modules/public-landing/public/assets/world/), mocks/decision/ (A1 comps), design.json (DESIGN.md sidecar), review/ (finish captures)
|
|
15
15
|
├── .gitignore
|
|
16
16
|
├── package.json / package-lock.json
|
|
17
17
|
├── CODEOWNERS ← owner review on the merge-gate surfaces (real since task 1002611, ADR 0159); inert until branch protection is on (scripts/gds/gating.js) — keep aligned with gate-review.js HARD_FLOOR_GLOBS
|
|
@@ -130,7 +130,7 @@
|
|
|
130
130
|
│ ├── hall-ui/ ← CORE-DOMAIN WEB-SURFACE carve (BV1.R85, default-on): the authenticated builders' hall at builders.<apex>, moved from public-builders/ (~13k LOC, the largest). NO routes/db/port — declares contributes.webSurfaces:[{host:"builders.",dir:"public"}] for discovery, but UNLIKE status-ui keeps its DEDICATED serving block in serve-internal (the /builders shim + canonical redirects + citizen/Archon page gates + asset-stamping + hall-widget injection), partitioned out of the generic web-surface loop and served from BUILDERS_DIR. CLAUDE.md, module.json, public/{index.html,builders.js,style.css,work,watch,harbor,gate,pair,settings,ranks,sessions,primer,diagrams,atlas,...}.{html,js},cursors/,chime.wav.
|
|
131
131
|
│ ├── lifecycle/ ← CORE-DOMAIN carve (BV1.R86, default-on): the build state machine — tasks · claims · versions · done-when · goals · dependencies · claim→ship→grade→credit · github-push + merge-lock + conflict-resolve + publish-reconciler. The LAST, most-coupled carve; registers the `lifecycle` kernel port (createTask, classifyTaskKind, tallyPeerVotes, work-tracking reads). CLAUDE.md, module.json, routes/{tasks,claims,versions,done-when,goals,dependencies,gate-approvals,analytics}.js, lifecycle.js, github-push.js, merge-lock.js, conflict-resolve.js, publish-reconciler.js, task-visuals.js + task-visual-db.js + routes/visuals.js (the optional ship-time visual, task 1003109 — the route file is NOT named task-*.js on purpose; see the module CLAUDE.md).
|
|
132
132
|
│ ├── copy-desk/ ← CORE-DOMAIN module (task 1003113 / R02 of goal 1000074, default-on): the COPY half of the design contract — ADR 0081 gave design TOKENS a repo-owned source of truth, text had none. Owns the FLAG (anyone in any role marks a string or a whole surface as needing an artist's attention, with a reason required in BOTH the route and a CHECK constraint) and the QUEUE an artist reads it from. READS R01's committed registry (docs/copy-registry.json, generated by scripts/gds/copy-inventory.js) and never writes it. NO LIVE CMS is the hard non-goal: no column here could hold replacement text, and copy_no_cms.mjs pins that. Key is `copy-desk`, not `copy` — the branding contract already owns a `copy` block, so the bare word reds the "core carries no module code" fitness check. CLAUDE.md, module.json, registry.js, flags.js, routes/copy-desk.js, migrations/copy_desk_001_flags.sql, tests/{copy_flags,copy_queue,copy_no_cms}.mjs. Its hall surface lives with hall-ui (public/copy-desk.{html,js,css}), per the one-key-per-web-surface precedent.
|
|
133
|
-
│ ├── 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/gds/, 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), contrast.js + png.js; a page's <page>.states.json / <page>.probes.json sit BESIDE the surface (public-landing/, modules/hall-ui/public/). Recipe: docs/recipes/ui-look-before-you-ship.md. 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. Reserved home styles/ (1003323) with a README. config/design-tokens.* + design-sources.json STAY in config/ as the host boundary; public-landing keeps its own key (first customer, not owner).
|
|
133
|
+
│ ├── 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/gds/, 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), 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. 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. Reserved home styles/ (1003323) with a README. config/design-tokens.* + design-sources.json STAY in config/ as the host boundary; public-landing keeps its own key (first customer, not owner).
|
|
134
134
|
│ ├── character-anim/ ← consistent-character generative animation (ADR 0088) — graded painterly frame sets + manifest, the otb-character-review skill. CLAUDE.md, module.json.
|
|
135
135
|
│ ├── provisioning/ ← stands up + operates a Cloud Bongos instance's own infra (server/DB/domain/DNS/TLS) via the API (ADR 0111); web-tier request+state only, no cloud tokens — a separate control-plane runner drains the intents. Distinct from the `hosting` module (ADR 0092), which brokers compute workloads. CLAUDE.md, module.json.
|
|
136
136
|
│ └── demo/ ← BV1.R52 acceptance-proof module: one rank-gated write route + one namespaced migration proving the loader mounts a scaffolded module with zero core edits. CLAUDE.md, module.json.
|
|
@@ -254,7 +254,7 @@
|
|
|
254
254
|
│ ├── assets/tray/ + build-resources/ ← generated icons (scripts/gen-icons.js; build-resources name dodges the global build/ gitignore)
|
|
255
255
|
│ └── test/unit.mjs ← hermetic unit tests (run by the CI workflow, not the root gate)
|
|
256
256
|
│
|
|
257
|
-
├── public-landing/
|
|
257
|
+
├── modules/public-landing/public/ ← the APEX front door + hub surfaces. Its OWN MODULE since task 1003322 / ADR 0218 (manifest declares { apexRoot: true, dir: "public" } — the apex is not a Host prefix), still served by src/platform-server.js (landingPage(): apex-only strip → brand-token stamp → theme injection → ?v= asset stamp). Ships to EVERY instance; <!--apex-only:start/end--> regions are removed on a child
|
|
258
258
|
│ ├── index.html ← the landing (/) — v3 "the template's page" of the chrome world (task 1003298, ADR 0196): server-stamped head, the breath (CSS-only signature), live figures/ledger/orbs from the public feeds baked inside sentinels; page-local <style> only (no :root), links /assets/world.css
|
|
259
259
|
│ ├── projects.html ← the hub (/projects?view=map|mine|manage|new) on cosmos.css (A4, task 1003299, rebuilds it in the world)
|
|
260
260
|
│ ├── privacy.html / terms.html / contact.html ← the footer doors (task 1003251), on cosmos.css
|
|
@@ -1319,5 +1319,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
1319
1319
|
landed since 1.19.439 with no explicit bump. run 33321131006. (task 1002620)
|
|
1320
1320
|
1.19.441 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1321
1321
|
landed since 1.19.440 with no explicit bump. run 33323478836. (task 1002620)
|
|
1322
|
+
1.19.442 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1323
|
+
landed since 1.19.441 with no explicit bump. run 33326781131. (task 1002620)
|
|
1324
|
+
1.19.443 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1325
|
+
landed since 1.19.442 with no explicit bump. run 33330337830. (task 1002620)
|
|
1322
1326
|
---------------------------------------------------------------------------
|
|
1323
1327
|
```
|
package/docs/modules-contract.md
CHANGED
|
@@ -99,7 +99,9 @@ Every module must have a `module.json` at its root (`modules/<key>/module.json`)
|
|
|
99
99
|
"disciplines": ["artist"], // builder disciplines this module adds
|
|
100
100
|
"skills": ["otb-tile-generate"], // slash-command skills it ships
|
|
101
101
|
"uiSections": ["boxes"], // hall/status UI sections gated by window.__MODULES__
|
|
102
|
-
"webSurfaces": [{ "host": "status.", "dir": "public" }], //
|
|
102
|
+
"webSurfaces": [{ "host": "status.", "dir": "public" }], // static web surfaces: a Host PREFIX (BV1.R84)…
|
|
103
|
+
// …or { "apexRoot": true, "dir": "public" } for the
|
|
104
|
+
// apex root (ADR 0218). One or the other, never both.
|
|
103
105
|
"migrations": true // true → modules/<key>/migrations/*.sql applied if enabled
|
|
104
106
|
},
|
|
105
107
|
"provides": ["box.hasEverConnected"], // OPTIONAL. Seam PORTS this module registers a provider for.
|
|
@@ -152,7 +154,11 @@ At boot the loader (called from `src/modules.js` and the route mounter) runs:
|
|
|
152
154
|
4. **Enablement filter** — check `isModuleEnabled(key)` (env override → `config/modules.json` → `config/modules.neutral.json` → `manifest.default`); disabled modules are skipped.
|
|
153
155
|
5. **Mount routes** — for each `contributes.routes` key, `require(`modules/<key>/routes/<routeKey>.js`)` and call the factory. Audit is already composed at the kernel level (routes.js runs `auditMiddleware` before the loader mounts anything); each route self-gates at the appropriate rank via `api.requireBuilder` / `api.requireRank`. The fitness check (`BV1.R44`) ensures every write route is rank-gated.
|
|
154
156
|
6. **Start pollers** — call each `contributes.pollers` file's `start()` on successful mount.
|
|
155
|
-
7. **Serve web surfaces** —
|
|
157
|
+
7. **Serve web surfaces** — a `contributes.webSurfaces` entry says WHERE the surface answers in exactly one of two ways, never both and never neither ([ADR 0218](adr/<redacted>.md)):
|
|
158
|
+
- `{ host: "status.", dir: "public" }` — a **Host-header prefix**. `serve-internal.js` (via `loader.moduleWebSurfaces`) serves `modules/<key>/<dir>/` on the matching host, with the content-hash-stamped index + branding injection the status page always used. This is how the status dashboard (`status-ui`) reaches `status.<apex>` with no core edit (BV1.R84).
|
|
159
|
+
- `{ apexRoot: true, dir: "public" }` — the **apex root**: whatever host is left once the subdomains are taken (`isApexHost` = `!isStatusHost && !isBuildersHost`). Declared by `public-landing`, the front door, and served by `platform-server.js`'s dedicated block. **`host: ""` is rejected, not read as "the root"** — the routers match with `host.startsWith(s.host)` and every string starts with `""`, so an empty prefix would answer on `builders.`/`status.` too and make `isModuleSurfaceHost()` true for every request, silently un-serving the hall.
|
|
160
|
+
|
|
161
|
+
A disabled module's surface is never built, so its host routes nowhere — and for the apex root that means the front door is gone and the 404 tail answers.
|
|
156
162
|
8. **Apply migrations** — enabled-gated; `migrate.sh` discovers `modules/<key>/migrations/*.sql` only when the module is enabled.
|
|
157
163
|
|
|
158
164
|
The loader is safe-by-construction: with no `modules/` dir it returns empty and all functions are no-ops — the instance behaves identically to before the module move.
|
|
@@ -246,6 +252,7 @@ Rules (enforced by the `BV1.R45` fitness check):
|
|
|
246
252
|
| **`autonomy`** *(core-domain, default-on; R83)* | routes: `autonomy` (the `/autonomy/precheck`); pollers: `routine-timers` | — (registers NO port; reaches the lifecycle `tallyPeerVotes` via the doorway) | `^1.11.0` |
|
|
247
253
|
| **`status-ui`** *(core-domain web surface, default-on; R84)* | webSurfaces: `{ host: "status.", dir: "public" }` (the status dashboard at `status.<apex>`) | — (registers NO port, NO routes; pure host-routed static surface) | `^1.11.0` |
|
|
248
254
|
| **`hall-ui`** *(core-domain web surface, default-on; R85)* | webSurfaces: `{ host: "builders.", dir: "public" }` (the authenticated builders' hall) | — (registers NO port; keeps a DEDICATED serving block in `serve-internal.js`, unlike `status-ui`) | `^1.11.0` |
|
|
255
|
+
| **`public-landing`** *(core-domain web surface, default-on; task 1003322 / ADR 0218)* | webSurfaces: `{ apexRoot: true, dir: "public" }` (the front door at the apex root: `/`, `/projects`, `/create`, `/privacy`, `/terms`, `/contact`) | — (registers NO port; the first surface that is not a subdomain, and like `hall-ui` it keeps a DEDICATED serving block — in `platform-server.js`) | `^1.19.0` |
|
|
249
256
|
| **`lifecycle`** *(core-domain, default-on; R86)* | routes: `tasks`, `claims`, `versions`, `done-when`, `goals`, `dependencies`, `gate-approvals`, `analytics` | provides `lifecycle` (createTask, classifyTaskKind, tallyPeerVotes, work-tracking reads); resolves `reward`, `onboarding` | `^1.12.0` |
|
|
250
257
|
| **`provisioning`** *(default-off; [ADR 0111](adr/<redacted>.md))* | routes: `provisioning` (own+Archon rank-gated) | provides `provisioning.instanceState` | `^1.14.0` |
|
|
251
258
|
| **`ui-design`** *(core-domain, default-on; [ADR 0197](adr/<redacted>.md))* | skills: `design`, `design-sync`, `figma-design-sync` (the /design playbook + the two tool round-trips); the ADR 0081 adapters, sync CLIs and validator live in the module dir | — (registers NO port, NO routes; declaration-only — disabling it withdraws the skills and touches no served surface) | `^1.19.0` |
|
|
@@ -15,7 +15,7 @@ Edge or Chrome must be installed. If neither launches, every kit command prints
|
|
|
15
15
|
## 1. Stub — serve the surface the way the instance would
|
|
16
16
|
|
|
17
17
|
```
|
|
18
|
-
node modules/ui-design/kit/serve.js #
|
|
18
|
+
node modules/ui-design/kit/serve.js # the front door at http://127.0.0.1:3412/
|
|
19
19
|
AUTH=1 STUB_PORT=3413 node modules/ui-design/kit/serve.js # the same, signed in (/me answers { builder })
|
|
20
20
|
SURFACE=hall-ui PREFIX=/builders/ node modules/ui-design/kit/serve.js
|
|
21
21
|
CHILD=1 node modules/ui-design/kit/serve.js # the child-instance shape (apex-only regions stripped)
|
|
@@ -25,7 +25,7 @@ FAIL=featured,progress node modules/ui-design/kit/serve.js # those feeds answe
|
|
|
25
25
|
|
|
26
26
|
The stub runs the page through the **instance's real transforms** — the apex-only strip, the brand-token stamp, the pack's theme injection, run by the core-side command `scripts/gds/ui-kit-transform.js` (a module may not require core, so the stub spawns the command and memoises the page) — then the content-hash `?v=` stamp, with the instance's own branding pack, and answers the public feeds from `kit/fixtures/`. It also serves `docs/` raw, so a mock under `docs/design/mocks/` renders with its relative links: `http://127.0.0.1:3412/docs/design/mocks/hub/v2.html`.
|
|
27
27
|
|
|
28
|
-
`SURFACE` is a checkout directory (`
|
|
28
|
+
`SURFACE` is a checkout directory (`modules/hall-ui/public`) or a module key whose manifest declares a `webSurfaces` dir (`public-landing`, `hall-ui`). `PREFIX` is the URL prefix the surface's pages and assets live under (the hall's is `/builders/`).
|
|
29
29
|
|
|
30
30
|
## 2. Render — every state, every width, both modes, audited
|
|
31
31
|
|
|
@@ -74,7 +74,7 @@ Then a state's own `expect` (a band open, a dialog present, a field's value, a c
|
|
|
74
74
|
|
|
75
75
|
Actions: `click`, `focus`, `press`, `fill`, `wait`, `clickAt x y`, `clickIfVisible`, `dispatchClick`, `check`, `back`, `forward`. Expectations: `expanded`, `dialog`, `visible[]`, `hidden[]`, `open`, `closed`, `activeId`, `activeText`, `expandedIds[]`, `param{}`, `attr[[sel,name,value]]`, `text[[sel,value]]`, `href[[sel,value]]`, `count[[sel,n]]`, `value[[sel,v]]`, `hasClass[[sel,class,bool]]`, `checked`, `noOverflow`, `top[[sel,px]]` (an element's viewport top — assert it closed, open a band, assert it again: the proof an overlay did not push the page). The kit validates the file before it opens a browser and names every problem.
|
|
76
76
|
|
|
77
|
-
The worked examples: `public-landing/projects.states.json` (the hub's thirteen), `public-landing/index.states.json` (the landing's four), `modules/hall-ui/public/ranks.states.json` (a second surface under its own prefix — it renders **red**, deliberately: the hall predates the 24px floor and Ranks has no `<h1>`, and the states file declares the shell's un-fixtured feeds rather than hiding the findings; idea 1000863 carries them).
|
|
77
|
+
The worked examples: `modules/public-landing/public/projects.states.json` (the hub's thirteen), `modules/public-landing/public/index.states.json` (the landing's four), `modules/hall-ui/public/ranks.states.json` (a second surface under its own prefix — it renders **red**, deliberately: the hall predates the 24px floor and Ranks has no `<h1>`, and the states file declares the shell's un-fixtured feeds rather than hiding the findings; idea 1000863 carries them).
|
|
78
78
|
|
|
79
79
|
## 3. Probe — the interaction contract, as PASS/FAIL lines
|
|
80
80
|
|
|
@@ -83,7 +83,7 @@ node modules/ui-design/kit/probe.js --page /projects
|
|
|
83
83
|
node modules/ui-design/kit/probe.js --page / --only "Escape"
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
-
A **probes file** (`<surface>/<page>.probes.json`) is a sequence: each probe opens the page (or continues the previous probe's page with `"continue": true`), drives steps from the same action vocabulary, and states what must be true with the same expectations. An uncaught page error during a probe fails it. The disclosure contract ships first — `public-landing/projects.probes.json` (24 probes: Enter opens on the first item, arrows cycle and skip hidden cells, Escape returns focus, Tab out closes, a click outside closes, one band closes the other, the views, the card yields Escape, the fold under 480, signed out nothing throws) and `index.probes.json` (10, the landing).
|
|
86
|
+
A **probes file** (`<surface>/<page>.probes.json`) is a sequence: each probe opens the page (or continues the previous probe's page with `"continue": true`), drives steps from the same action vocabulary, and states what must be true with the same expectations. An uncaught page error during a probe fails it. The disclosure contract ships first — `modules/public-landing/public/projects.probes.json` (24 probes: Enter opens on the first item, arrows cycle and skip hidden cells, Escape returns focus, Tab out closes, a click outside closes, one band closes the other, the views, the card yields Escape, the fold under 480, signed out nothing throws) and `index.probes.json` (10, the landing).
|
|
87
87
|
|
|
88
88
|
## 4. Read the shots, fix in one batch, re-run once
|
|
89
89
|
|
|
@@ -32,7 +32,7 @@ const FAKE = {
|
|
|
32
32
|
counts: { strings: 3, unique_ids: 2, certain: 3, heuristic: 0, duplicate_ids: 1 },
|
|
33
33
|
surfaces: {
|
|
34
34
|
'builders-hall': { at: 'modules/hall-ui/public', files: 2, strings: 2 },
|
|
35
|
-
landing: { at: 'public-landing', files: 1, strings: 1 },
|
|
35
|
+
landing: { at: 'modules/public-landing/public', files: 1, strings: 1 },
|
|
36
36
|
},
|
|
37
37
|
duplicates: [
|
|
38
38
|
{ id: 'dup1', surface: 'builders-hall', text: 'Could not save.', occurrences: 2,
|
|
@@ -41,7 +41,7 @@ const FAKE = {
|
|
|
41
41
|
entries: [
|
|
42
42
|
{ id: 'dup1', surface: 'builders-hall', text: 'Could not save.', file: 'modules/hall-ui/public/a.js', line: 10, origin: 'js-notice', confidence: 'certain' },
|
|
43
43
|
{ id: 'dup1', surface: 'builders-hall', text: 'Could not save.', file: 'modules/hall-ui/public/b.js', line: 20, origin: 'js-notice', confidence: 'certain' },
|
|
44
|
-
{ id: 'solo', surface: 'landing', text: 'Enter the future.', file: 'public-landing/index.html', line: 4, origin: 'html-text', confidence: 'certain' },
|
|
44
|
+
{ id: 'solo', surface: 'landing', text: 'Enter the future.', file: 'modules/public-landing/public/index.html', line: 4, origin: 'html-text', confidence: 'certain' },
|
|
45
45
|
],
|
|
46
46
|
};
|
|
47
47
|
const INDEX = registry.indexRegistry(FAKE);
|
|
@@ -137,7 +137,7 @@ await test('the snapshot is taken from the registry', () => {
|
|
|
137
137
|
const r = ok({ scope: 'string', surface: 'landing', string_id: 'solo', reason: GOOD_REASON });
|
|
138
138
|
assert.equal(r.ok, true);
|
|
139
139
|
assert.equal(r.value.text_at_flag, 'Enter the future.');
|
|
140
|
-
assert.equal(r.value.file_at_flag, 'public-landing/index.html');
|
|
140
|
+
assert.equal(r.value.file_at_flag, 'modules/public-landing/public/index.html');
|
|
141
141
|
assert.equal(r.value.line_at_flag, 4);
|
|
142
142
|
assert.equal(r.value.registry_schema, 1);
|
|
143
143
|
});
|
|
@@ -153,7 +153,7 @@ await test('a caller-supplied snapshot is IGNORED', () => {
|
|
|
153
153
|
});
|
|
154
154
|
assert.equal(r.ok, true);
|
|
155
155
|
assert.equal(r.value.text_at_flag, 'Enter the future.');
|
|
156
|
-
assert.equal(r.value.file_at_flag, 'public-landing/index.html');
|
|
156
|
+
assert.equal(r.value.file_at_flag, 'modules/public-landing/public/index.html');
|
|
157
157
|
assert.equal(r.value.line_at_flag, 4);
|
|
158
158
|
});
|
|
159
159
|
|
|
@@ -148,7 +148,8 @@ module.exports = function projectsRoutes() {
|
|
|
148
148
|
// the wire always carries both keys: null = the platform's own pick
|
|
149
149
|
const planetOf = (p) => {
|
|
150
150
|
const c = (planets && planets[hostOfOrigin(p.origin)]) || {};
|
|
151
|
-
return { planet_template: c.planet_template || null, planet_accent: c.planet_accent || null
|
|
151
|
+
return { planet_template: c.planet_template || null, planet_accent: c.planet_accent || null,
|
|
152
|
+
card_backdrop: c.card_backdrop || null };
|
|
152
153
|
};
|
|
153
154
|
// The enrichment's keys (builders, tags, owner, owner_avatar, faces,
|
|
154
155
|
// shipped_30d, shipped_30d_capped, hall_origin) never collide with the
|
|
@@ -142,7 +142,16 @@ const PLANET_TEMPLATES = Object.freeze([
|
|
|
142
142
|
...PLANET_SHAPES.flatMap((s) => PLANET_MATERIALS.flatMap((m) => ['tint', 'wash', 'plain'].map((y) => `${s}-${m}-${y}`))),
|
|
143
143
|
]);
|
|
144
144
|
const PLANET_ACCENTS = Object.freeze(['sea', 'terracotta', 'gold-soft', 'sun-lit', 'accent']);
|
|
145
|
-
|
|
145
|
+
// The card's backdrop (task 1003352) is the same KIND of key as the planet, so it
|
|
146
|
+
// rides the same vocab: a closed list of platform-drawn plates, null = the
|
|
147
|
+
// project's own art (or none). It is not a policy either — nothing is pushed to
|
|
148
|
+
// the instance and nothing restarts; the card simply reads the row.
|
|
149
|
+
const CARD_BACKDROPS = Object.freeze(['nebula', 'dust', 'deepfield', 'chrome']);
|
|
150
|
+
// Named PLANET_VOCAB for the keys it began with; what it actually holds is every
|
|
151
|
+
// key the PLATFORM draws a project with — no default, no env transport, no restart.
|
|
152
|
+
const PLANET_VOCAB = Object.freeze({
|
|
153
|
+
planet_template: PLANET_TEMPLATES, planet_accent: PLANET_ACCENTS, card_backdrop: CARD_BACKDROPS,
|
|
154
|
+
});
|
|
146
155
|
|
|
147
156
|
// The optional project-detail interview (BV1.R15, task 1002334) — the "tell us
|
|
148
157
|
// about your project" step every creation form offers and every owner may skip.
|
|
@@ -1088,7 +1097,7 @@ async function planetChoicesForHosts(db, hosts) {
|
|
|
1088
1097
|
for (const r of rows) {
|
|
1089
1098
|
if (out[r.host]) continue;
|
|
1090
1099
|
const choice = planetChoice(r);
|
|
1091
|
-
if (
|
|
1100
|
+
if (Object.values(choice).some(Boolean)) out[r.host] = choice;
|
|
1092
1101
|
}
|
|
1093
1102
|
return out;
|
|
1094
1103
|
}
|
|
@@ -796,12 +796,17 @@ module.exports = function provisioningRoutes() {
|
|
|
796
796
|
router.patch('/provisioning/instances/:id/settings', auth.requireBuilder, async (req, res) => {
|
|
797
797
|
const id = parseId(req, res); // (req, res) — parseId sends 400 bad_id + returns null on failure
|
|
798
798
|
if (!id) return;
|
|
799
|
+
// The schema IS the vocabularies, not a copy of them (task 1003352): strict
|
|
800
|
+
// mode rejects any field the schema does not declare, so a key added to a
|
|
801
|
+
// vocabulary but forgotten here reaches settingKeys and then 400s on every
|
|
802
|
+
// real save — which is exactly what card_backdrop did until the grader caught
|
|
803
|
+
// it. Deriving both from the same source makes that drift unrepresentable.
|
|
804
|
+
// The platform-drawn keys are nullable on purpose: null hands the pick back.
|
|
805
|
+
const vocabSchema = (vocab) => Object.fromEntries(
|
|
806
|
+
Object.entries(vocab).map(([key, values]) => [key, { type: 'string', enum: values }]));
|
|
799
807
|
if (validateOrRespond(req, res, {
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
// the planet (task 1003347): nullable on purpose — null hands the pick back to the platform
|
|
803
|
-
planet_template: { type: 'string', enum: provisioning.PLANET_VOCAB.planet_template },
|
|
804
|
-
planet_accent: { type: 'string', enum: provisioning.PLANET_VOCAB.planet_accent },
|
|
808
|
+
...vocabSchema(provisioning.SETTINGS_VOCAB),
|
|
809
|
+
...vocabSchema(provisioning.PLANET_VOCAB),
|
|
805
810
|
})) return;
|
|
806
811
|
const settingKeys = [...Object.keys(provisioning.SETTINGS_VOCAB), ...Object.keys(provisioning.PLANET_VOCAB)];
|
|
807
812
|
const patch = {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# @bongos/core — installed platform dependency (not your project's CLAUDE.md)
|
|
2
|
+
|
|
3
|
+
This file is a placeholder shipped inside the **@bongos/core** package. The core's own
|
|
4
|
+
internal agent notes are intentionally omitted from the published artifact so they cannot
|
|
5
|
+
load into your instance's context.
|
|
6
|
+
|
|
7
|
+
**It does not govern this repository.** Your own root `CLAUDE.md`, your `.claude/`
|
|
8
|
+
directory, and the live Bongos database are the source of truth for how work happens here
|
|
9
|
+
and who may do what.
|
|
10
|
+
|
|
11
|
+
You are seeing this only because an agent opened a file under `node_modules/@bongos/core/`.
|
|
12
|
+
Nothing in here needs to be read to use the platform — run `bongos help` for commands.
|
|
13
|
+
|
|
14
|
+
_To work ON the platform core itself, use the standalone @bongos/core source repository,
|
|
15
|
+
not this vendored copy._
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"key": "public-landing",
|
|
3
|
+
"title": "The front door",
|
|
4
|
+
"description": "The instance's public front door served at the APEX ROOT — the landing page (/), the projects hub (/projects, and the /create redirect into its ?view=new wizard), the three footer doors (/privacy, /terms, /contact) and every asset behind them. The third WEB-SURFACE core-domain module after status-ui (BV1.R84) and hall-ui (BV1.R85), carved in task 1003322 (ADR 0218; named in ADR 0197 §8 — the front door keeps its own key, because a customer of the ui-design capability is not part of it). default-on: an instance ships its front door like it ships its hall. Registers no port and contributes no routes — it declares a webSurface, and where hall-ui and status-ui name a Host PREFIX this one declares apexRoot:true, since the apex is whatever host is left once the subdomains are taken (ADR 0218 §2; host:\"\" is rejected, because every host string startsWith \"\"). Like the hall, the declaration is the discovery + scope-map + window.__MODULES__ record: the bytes are served by platform-server.js's dedicated landing block, which keeps the apex-only sentinel strip, the branding-token stamp and the ?v= content stamp and only re-points its root at this module's public/ dir. Disabling the module removes the front door outright — the apex then answers the game-less 404 tail. The world it renders (DESIGN.md, the token contract, the direction records) is the INSTANCE's; the method for building one stays in modules/ui-design/.",
|
|
5
|
+
"coreVersion": "^1.19.0",
|
|
6
|
+
"default": true,
|
|
7
|
+
"maintenance": { "status": "core-maintained" },
|
|
8
|
+
"contributes": {
|
|
9
|
+
"webSurfaces": [
|
|
10
|
+
{ "apexRoot": true, "dir": "public" }
|
|
11
|
+
]
|
|
12
|
+
},
|
|
13
|
+
"provides": [],
|
|
14
|
+
"consumes": []
|
|
15
|
+
}
|
|
@@ -1377,6 +1377,14 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
1377
1377
|
#view-manage .pickPreview{display:grid;gap:12px;justify-items:center;padding-top:6px;}
|
|
1378
1378
|
#view-manage .pickWords{margin:0;font-size:14px;font-weight:400;line-height:1.45;color:var(--ink);text-align:center;max-width:168px;}
|
|
1379
1379
|
#view-manage .pickWords small{display:block;font-size:12.5px;color:var(--ink-soft);}
|
|
1380
|
+
/* the card's backdrop preview (task 1003352): the poster's own 5:2 band at the
|
|
1381
|
+
width the planet preview stands at, so the two sections read as one column.
|
|
1382
|
+
No ground of its own — "its own picture" is an empty hairline frame, which is
|
|
1383
|
+
the honest drawing of a project that may have no art at all. */
|
|
1384
|
+
#view-manage .cardBand{display:block;width:168px;aspect-ratio:5/2;background-size:cover;
|
|
1385
|
+
background-position:center;background-repeat:no-repeat;background-color:var(--bg);
|
|
1386
|
+
border:1px solid var(--rule-soft);}
|
|
1387
|
+
#view-manage .cardBand[data-own]{border-style:dashed;}
|
|
1380
1388
|
#view-manage .pickBands{display:grid;border-bottom:1px solid var(--rule);}
|
|
1381
1389
|
#view-manage .pickBand{display:grid;grid-template-columns:88px 1fr;gap:0 18px;align-items:center;border-top:1px solid var(--rule);}
|
|
1382
1390
|
#view-manage .pickLabel{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;color:var(--ink-faint);padding:14px 0;}
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "card-band",
|
|
3
|
+
"model": "soul_location (Higgsfield) — nano_banana_pro was asked first; its queue had not started a job after 25 minutes, so the round moved to the model that answered",
|
|
4
|
+
"job_id": "a9e4cb59-7436-4f8f-9289-aba9b1fd567e",
|
|
5
|
+
"aspect_ratio": "5:2",
|
|
6
|
+
"source_aspect_ratio": "21:9",
|
|
7
|
+
"generated": "2026-08-30T17:09Z",
|
|
8
|
+
"round": 4,
|
|
9
|
+
"task": 1003352,
|
|
10
|
+
"prompt": "Ultra-wide studio photograph on a pure black ground: a single sweeping ribbon of liquid chrome, polished mirror metal with soft neutral specular highlights and a faint cool blue and warm bronze reflection, curving gently through the centre-right of the frame and fading into black at both ends. Abstract material study, not an object, no recognisable shape, no product. The left third and both lower corners stay almost pure black and empty. No text, no watermark, no logo, no border, no reflection of a studio or a person. Pure black dominates the frame.",
|
|
11
|
+
"source": ".impeccable/mocks/world-assets/r4-card-chrome-src.jpg",
|
|
12
|
+
"encoded": "ffmpeg crop=2560:1024:0:24 (21:9 → 5:2, centred), JPEG -q:v 4",
|
|
13
|
+
"use": "the poster card's backdrop on /projects, chosen by an owner as card_backdrop=\"chrome\": a sweeping ribbon of liquid chrome — the world's own material with no object in it. Dark only (ADR 0204); composed so the left third and the lower corners stay near-black, where the card puts its disc, its name and its two figure callouts."
|
|
14
|
+
}
|
|
Binary file
|