@bongos/core 1.20.47 → 1.20.48
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 +81 -56
- package/docs/copy-inventory.md +82 -80
- package/docs/copy-registry.json +109 -91
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-inventory.json +5 -3
- package/docs/page-readings.json +242 -243
- package/modules/hall-ui/public/atlas.html +1 -1
- package/modules/hall-ui/public/blockers.html +1 -1
- package/modules/hall-ui/public/board-room.html +1 -1
- package/modules/hall-ui/public/collab.html +1 -1
- package/modules/hall-ui/public/commands.html +1 -1
- package/modules/hall-ui/public/copy-desk.html +1 -1
- package/modules/hall-ui/public/deploy.html +1 -1
- package/modules/hall-ui/public/diagrams.html +1 -1
- package/modules/hall-ui/public/drachmae.html +1 -1
- package/modules/hall-ui/public/fleet.html +1 -1
- package/modules/hall-ui/public/gate.html +1 -1
- package/modules/hall-ui/public/goals.html +1 -1
- package/modules/hall-ui/public/government.html +1 -1
- package/modules/hall-ui/public/hall-render.js +3 -0
- package/modules/hall-ui/public/idea.html +1 -1
- package/modules/hall-ui/public/ideas.html +1 -1
- package/modules/hall-ui/public/index.html +1 -1
- package/modules/hall-ui/public/modules.html +1 -1
- package/modules/hall-ui/public/primer.html +1 -1
- package/modules/hall-ui/public/profile.html +1 -1
- package/modules/hall-ui/public/project-settings.html +1 -1
- package/modules/hall-ui/public/ranks.html +1 -1
- package/modules/hall-ui/public/roadmap.html +1 -1
- package/modules/hall-ui/public/roster.html +1 -1
- package/modules/hall-ui/public/sessions.html +1 -1
- package/modules/hall-ui/public/settings.html +1 -1
- package/modules/hall-ui/public/shell.js +82 -1
- package/modules/hall-ui/public/studio.html +1 -1
- package/modules/hall-ui/public/style.css +36 -0
- package/modules/hall-ui/public/task.html +1 -1
- package/modules/hall-ui/public/thinking.html +1 -1
- package/modules/hall-ui/public/tweak-editor.html +1 -1
- package/modules/hall-ui/public/watch.html +1 -1
- package/modules/hall-ui/public/work-founding.states.json +39 -0
- package/modules/hall-ui/public/work.html +1 -1
- package/modules/hall-ui/records/founding-mode.md +31 -0
- package/modules/onboarding/founding-mode.js +185 -0
- package/modules/onboarding/port.js +7 -0
- package/modules/ui-design/kit/fixtures/me-founding.json +24 -0
- package/modules/ui-design/kit/serve.js +3 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/src/bongos/routes/me.js +18 -1
- package/src/module-api.js +1 -1
- package/tests/founding_mode.mjs +294 -0
- package/tests/hall_tweak_editor.mjs +1 -1
- package/tests/nav_permission_atoms.mjs +1 -1
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
|
|
92
92
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
93
93
|
|
|
94
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
94
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
95
95
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
96
96
|
<script src="/builders/palette.js" defer></script>
|
|
97
97
|
<script src="/builders/atlas.js?v=2026-09-02-index" defer></script>
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
|
|
51
51
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
52
52
|
chrome exists before the page script runs. -->
|
|
53
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
53
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
54
54
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
55
55
|
<script src="/builders/palette.js" defer></script>
|
|
56
56
|
<!-- shared frontend toolkit (window.OTB — rank labels, number formats) + the
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
|
|
61
61
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
62
62
|
|
|
63
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
63
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
64
64
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
65
65
|
<script src="/builders/palette.js" defer></script>
|
|
66
66
|
<script src="/builders/dom-utils.js?v=2026-06-16-board"></script>
|
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
|
|
149
149
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
150
150
|
|
|
151
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
151
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
152
152
|
<script src="/builders/palette.js" defer></script>
|
|
153
153
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
154
154
|
<script src="/builders/collab-lib.js?v=2026-09-24-archive"></script>
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
|
|
55
55
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
56
56
|
|
|
57
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
57
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
58
58
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
59
59
|
<script src="/builders/palette.js" defer></script>
|
|
60
60
|
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
@@ -177,7 +177,7 @@
|
|
|
177
177
|
|
|
178
178
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
179
179
|
|
|
180
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
180
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
181
181
|
<script src="/builders/palette.js" defer></script>
|
|
182
182
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
183
183
|
<script src="/builders/hall-kit.js"></script>
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
|
|
75
75
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
76
76
|
|
|
77
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
77
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
78
78
|
<script src="/builders/palette.js" defer></script>
|
|
79
79
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
80
80
|
<script src="/builders/hall-kit.js"></script>
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
|
|
98
98
|
<!-- The app shell (sidebar + top bar + footer). Dependency-free; runs at parse
|
|
99
99
|
time so the chrome exists before the deferred page scripts execute. -->
|
|
100
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
100
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
101
101
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
102
102
|
<script src="/builders/palette.js" defer></script>
|
|
103
103
|
<script src="/builders/diagram-viewer.js?v=2026-06-14-diagviewer-1" defer></script>
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
|
|
99
99
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
100
100
|
|
|
101
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
101
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
102
102
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
103
103
|
<script src="/builders/palette.js" defer></script>
|
|
104
104
|
<script src="/builders/md-reader.js?v=2026-09-02-mdreader-2"></script>
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
|
|
55
55
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
56
56
|
|
|
57
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
57
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
58
58
|
<script src="/builders/palette.js" defer></script>
|
|
59
59
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
60
60
|
<script src="/builders/hall-kit.js"></script>
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
<div id="gate-modal-root"></div>
|
|
77
77
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
78
78
|
|
|
79
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
79
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
80
80
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
81
81
|
<script src="/builders/palette.js" defer></script>
|
|
82
82
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
@@ -230,7 +230,7 @@
|
|
|
230
230
|
|
|
231
231
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
232
232
|
|
|
233
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
233
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
234
234
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
235
235
|
<script src="/builders/palette.js" defer></script>
|
|
236
236
|
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
@@ -134,7 +134,7 @@
|
|
|
134
134
|
|
|
135
135
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
136
136
|
|
|
137
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
137
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
138
138
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
139
139
|
<script src="/builders/palette.js" defer></script>
|
|
140
140
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
@@ -221,6 +221,9 @@
|
|
|
221
221
|
// same reason: the index is where a builder lands, so omitting it here
|
|
222
222
|
// would mean the badge appeared everywhere EXCEPT the page they open first.
|
|
223
223
|
needs: (ctx.lastMeState && ctx.lastMeState.needs) || null,
|
|
224
|
+
// task 1004422: project founding mode — passed here for the same reason as the
|
|
225
|
+
// three above, or the index would be the one page the band never appears on.
|
|
226
|
+
founding: (ctx.lastMeState && ctx.lastMeState.founding_mode) || null,
|
|
224
227
|
builder,
|
|
225
228
|
});
|
|
226
229
|
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
|
|
53
53
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
54
54
|
|
|
55
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
55
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
56
56
|
<script src="/builders/palette.js" defer></script>
|
|
57
57
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib" defer></script>
|
|
58
58
|
<!-- task-detail.js still owns the #/idea/N and #/blocker/N overlay, so a ref
|
|
@@ -225,7 +225,7 @@
|
|
|
225
225
|
|
|
226
226
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
227
227
|
|
|
228
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
228
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
229
229
|
<script src="/builders/palette.js" defer></script>
|
|
230
230
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
231
231
|
<!-- task 1003069 (R08) — the quick-filing form's routed result links a task
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
<script src="/builders/brand-apply.js?v=2026-06-27-r75" defer></script>
|
|
107
107
|
<!-- The app shell (sidebar + top bar + view router). Dependency-free; loaded
|
|
108
108
|
BEFORE builders.js so the chrome ids exist when events are wired. -->
|
|
109
|
-
<script src="/builders/shell.js?v=2026-09-30-commands" defer></script>
|
|
109
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands" defer></script>
|
|
110
110
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
111
111
|
<script src="/builders/palette.js" defer></script>
|
|
112
112
|
<!-- task 2166: the shared component kit (window.OTBKit) — pager/ledger/rail.
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
|
|
102
102
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
103
103
|
|
|
104
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
104
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
105
105
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
106
106
|
<script src="/builders/palette.js" defer></script>
|
|
107
107
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
|
|
116
116
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
117
117
|
|
|
118
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
118
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
119
119
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
120
120
|
<script src="/builders/palette.js" defer></script>
|
|
121
121
|
<!-- the shared markdown reader (window.OTBMdReader) — primer.js renders through
|
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
|
|
188
188
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
189
189
|
chrome exists before the page script runs. -->
|
|
190
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
190
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
191
191
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
192
192
|
<script src="/builders/palette.js" defer></script>
|
|
193
193
|
<!-- shared frontend toolkit (window.OTB) — loaded before profile.js, which pulls from it. -->
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
|
|
59
59
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
60
60
|
|
|
61
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
61
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
62
62
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
63
63
|
<script src="/builders/palette.js" defer></script>
|
|
64
64
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
|
|
69
69
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
70
70
|
chrome exists before the page script runs. -->
|
|
71
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
71
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
72
72
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
73
73
|
<script src="/builders/palette.js" defer></script>
|
|
74
74
|
<!-- shared frontend toolkit (window.OTB) — loaded before ranks.js, which pulls from it. -->
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
|
|
42
42
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
43
43
|
|
|
44
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
44
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
45
45
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
46
46
|
<script src="/builders/palette.js" defer></script>
|
|
47
47
|
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
|
|
51
51
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
52
52
|
chrome exists before the page script runs. -->
|
|
53
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
53
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
54
54
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
55
55
|
<script src="/builders/palette.js" defer></script>
|
|
56
56
|
<!-- shared frontend toolkit (window.OTB — rank labels, number formats) + the
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
|
|
100
100
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
101
101
|
chrome exists before the page script runs. -->
|
|
102
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
102
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
103
103
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
104
104
|
<script src="/builders/palette.js" defer></script>
|
|
105
105
|
<!-- shared frontend toolkit (window.OTB) — loaded BEFORE sessions.js so it can pull from it. -->
|
|
@@ -400,7 +400,7 @@
|
|
|
400
400
|
|
|
401
401
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
402
402
|
chrome exists before the page scripts run. -->
|
|
403
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
403
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
404
404
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
405
405
|
<script src="/builders/palette.js" defer></script>
|
|
406
406
|
<!-- shared frontend toolkit (window.OTB) — loaded before consuming IIFEs. -->
|
|
@@ -788,7 +788,7 @@
|
|
|
788
788
|
// not establish authority. null is NOT "holds nothing that matters": it is
|
|
789
789
|
// unreadable, and unreadable hides the link, the same call gateAllows()'s
|
|
790
790
|
// `default: false` and the social mode's OFF-is-the-fallback rule make.
|
|
791
|
-
var access = { authed: null, rank: null, graduated: false, showWork: false, permissions: null, needs: null };
|
|
791
|
+
var access = { authed: null, rank: null, graduated: false, showWork: false, permissions: null, needs: null, founding: null };
|
|
792
792
|
|
|
793
793
|
function gateAllows(gate) {
|
|
794
794
|
var authed = access.authed === true;
|
|
@@ -840,6 +840,79 @@
|
|
|
840
840
|
else delete root.dataset.social;
|
|
841
841
|
}
|
|
842
842
|
|
|
843
|
+
// PROJECT FOUNDING MODE (task 1004422 / BV2.PS03, goal 1000121). While a project is
|
|
844
|
+
// being founded, its EXISTING hall wears this mode — the owner's blend rule
|
|
845
|
+
// (docs/design/project-startup-direction.md): genesis never becomes a second hall.
|
|
846
|
+
// It adds exactly two things here and changes nothing else:
|
|
847
|
+
// - the founding band, a strip created ABOVE the topbar inside .app-body;
|
|
848
|
+
// - the asleep state on today's nav items, each saying which stage wakes it.
|
|
849
|
+
// The server decides which rooms sleep (/me.founding_mode.asleep, keyed by NAV id)
|
|
850
|
+
// and this never re-derives it — the social-mode precedent.
|
|
851
|
+
//
|
|
852
|
+
// OFF is the default and the fallback, and OFF REMOVES rather than hides: the band
|
|
853
|
+
// element and every asleep class and tag are taken out of the DOM, so a hall that
|
|
854
|
+
// is not founding is byte-for-byte the hall it was (tests/founding_mode.mjs pins
|
|
855
|
+
// it). Cosmetic only — an asleep room still opens; nothing is enforced (ADR 0016).
|
|
856
|
+
// The asleep tag in words a person would say, never a raw stage slug.
|
|
857
|
+
var WAKE_TEXT = {
|
|
858
|
+
scope: 'opens after scope', strategize: 'opens after strategy', charter: 'opens after the charter',
|
|
859
|
+
legalize: 'opens after legal setup', legislation: 'opens after legislation', alive: 'opens when alive'
|
|
860
|
+
};
|
|
861
|
+
function applyFounding() {
|
|
862
|
+
var f = access.founding;
|
|
863
|
+
var on = !!(f && f.active === true && f.asleep && typeof f.asleep === 'object');
|
|
864
|
+
var root = document.documentElement;
|
|
865
|
+
// The common case — a project that is not founding, on a page that never wore the
|
|
866
|
+
// mode — returns before touching a single node. That is the strongest form of the
|
|
867
|
+
// no-hijack condition: nothing is read, created, classed or removed.
|
|
868
|
+
if (!on && root.dataset.founding !== 'on') return;
|
|
869
|
+
document.querySelectorAll('#app-sidebar .nav-item--asleep').forEach(function (el) {
|
|
870
|
+
el.classList.remove('nav-item--asleep');
|
|
871
|
+
delete el.dataset.wakes;
|
|
872
|
+
var tag = el.querySelector('[data-wakes-tag]');
|
|
873
|
+
if (tag && tag.parentNode) tag.parentNode.removeChild(tag);
|
|
874
|
+
});
|
|
875
|
+
var band = document.getElementById('founding-band');
|
|
876
|
+
if (!on) {
|
|
877
|
+
delete root.dataset.founding;
|
|
878
|
+
if (band && band.parentNode) band.parentNode.removeChild(band);
|
|
879
|
+
return;
|
|
880
|
+
}
|
|
881
|
+
root.dataset.founding = 'on';
|
|
882
|
+
Object.keys(f.asleep).forEach(function (id) {
|
|
883
|
+
var el = document.getElementById('nav-' + id);
|
|
884
|
+
if (!el) return;
|
|
885
|
+
var stage = String(f.asleep[id]);
|
|
886
|
+
el.classList.add('nav-item--asleep');
|
|
887
|
+
el.dataset.wakes = stage;
|
|
888
|
+
var tag = document.createElement('span');
|
|
889
|
+
tag.className = 'nav-item__wakes';
|
|
890
|
+
tag.setAttribute('data-wakes-tag', '');
|
|
891
|
+
tag.textContent = WAKE_TEXT[stage] || 'opens later';
|
|
892
|
+
el.appendChild(tag);
|
|
893
|
+
});
|
|
894
|
+
if (!band) {
|
|
895
|
+
var body = document.querySelector('.app-body');
|
|
896
|
+
if (!body) return;
|
|
897
|
+
band = document.createElement('div');
|
|
898
|
+
band.id = 'founding-band';
|
|
899
|
+
band.className = 'founding-band';
|
|
900
|
+
band.setAttribute('role', 'status');
|
|
901
|
+
body.insertBefore(band, body.firstChild);
|
|
902
|
+
}
|
|
903
|
+
var name = (brand.identity && (brand.identity.productName || brand.identity.worldName)) || 'This project';
|
|
904
|
+
var stageText = f.stage === 'decide'
|
|
905
|
+
? 'deciding the plan'
|
|
906
|
+
: 'stage ' + f.stage_number + ' of ' + f.stage_count + ' \u00b7 ' + f.stage;
|
|
907
|
+
band.innerHTML =
|
|
908
|
+
'<span class="founding-band__dot" aria-hidden="true"></span>' +
|
|
909
|
+
'<span class="founding-band__title">Project founding mode</span>' +
|
|
910
|
+
'<span class="founding-band__desc">' + esc(name) + ' is still being founded. Rooms open as each stage finishes, and everyone who joins now becomes a founding builder.</span>' +
|
|
911
|
+
'<span class="founding-band__stage">' + esc(stageText) + (f.day ? ' \u00b7 day ' + esc(String(f.day)) : '') +
|
|
912
|
+
(Array.isArray(f.waiting_on) && f.waiting_on.length ? ' \u00b7 waiting on ' + esc(f.waiting_on.join(', ')) : '') + '</span>' +
|
|
913
|
+
'<a class="founding-band__link" href="/">What\u2019s this?</a>';
|
|
914
|
+
}
|
|
915
|
+
|
|
843
916
|
// task 1003117 (R06 of goal 1000074): EMPHASISE the Studio nav entry for a
|
|
844
917
|
// builder whose craft includes artist — the "emphasized entry for artist-craft
|
|
845
918
|
// builders" half of artist mode. Cosmetic only (the page is open to every rank,
|
|
@@ -917,6 +990,10 @@
|
|
|
917
990
|
access.needs = (state.needs && typeof state.needs === 'object') ? state.needs : null;
|
|
918
991
|
}
|
|
919
992
|
if ('social' in state) applySocial(state.social);
|
|
993
|
+
// task 1004422: stored as given — the object, or null (OFF).
|
|
994
|
+
if ('founding' in state) {
|
|
995
|
+
access.founding = (state.founding && typeof state.founding === 'object') ? state.founding : null;
|
|
996
|
+
}
|
|
920
997
|
if (state.builder) { renderUser(state.builder); applyCraftEmphasis(state.builder); }
|
|
921
998
|
}
|
|
922
999
|
document.querySelectorAll('#app-sidebar [data-gate]').forEach(function (el) {
|
|
@@ -930,6 +1007,8 @@
|
|
|
930
1007
|
// what settles. Reversing the order would badge an item still hidden from
|
|
931
1008
|
// the previous state.
|
|
932
1009
|
applyCounts();
|
|
1010
|
+
// task 1004422: after the gate loop, so the asleep tags land on the settled items.
|
|
1011
|
+
applyFounding();
|
|
933
1012
|
// AFTER the gate loop for the same reason applyCounts is: it reads the settled
|
|
934
1013
|
// permission map, which the loop above is what the shell has just been told.
|
|
935
1014
|
maybeRenderCoreUpdate();
|
|
@@ -1153,6 +1232,8 @@
|
|
|
1153
1232
|
// hall's Standing card and the CLI nudge read — no new route, no extra
|
|
1154
1233
|
// poll, and the badge cannot disagree with the roster it came from.
|
|
1155
1234
|
needs: me.needs || null,
|
|
1235
|
+
// task 1004422: project founding mode, for the band and the asleep rooms.
|
|
1236
|
+
founding: me.founding_mode || null,
|
|
1156
1237
|
builder: me.builder,
|
|
1157
1238
|
});
|
|
1158
1239
|
}).catch(function () { /* cosmetic only */ });
|
|
@@ -176,7 +176,7 @@
|
|
|
176
176
|
|
|
177
177
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
178
178
|
|
|
179
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
179
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
180
180
|
<script src="/builders/palette.js" defer></script>
|
|
181
181
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
182
182
|
<!-- The kit, for its ONE renderer: the full-size ship-time visual figure
|
|
@@ -667,6 +667,42 @@ main:focus { outline: none; }
|
|
|
667
667
|
.nav-item--craft .nav-icon,
|
|
668
668
|
.nav-item--craft .nav-item__label { color: var(--accent-ink); }
|
|
669
669
|
|
|
670
|
+
/* task 1004422 (BV2.PS03): PROJECT FOUNDING MODE. The hall wears it; it never
|
|
671
|
+
becomes a second hall (the blend rule, docs/design/project-startup-direction.md).
|
|
672
|
+
Two additions only, both created by shell.js while /me says founding and REMOVED
|
|
673
|
+
when it does not: the band above the topbar, and today's nav items dimmed with
|
|
674
|
+
the stage that wakes them. The band is live state, so its dot takes the accent;
|
|
675
|
+
the wake tag reads only in the open rail, like the labels. */
|
|
676
|
+
.founding-band {
|
|
677
|
+
display: flex;
|
|
678
|
+
align-items: center;
|
|
679
|
+
gap: 12px;
|
|
680
|
+
min-height: 44px;
|
|
681
|
+
padding: 0 22px;
|
|
682
|
+
background: color-mix(in srgb, var(--accent) 14%, var(--bg));
|
|
683
|
+
border-bottom: 1px solid color-mix(in srgb, var(--accent) 36%, transparent);
|
|
684
|
+
font-size: 13px;
|
|
685
|
+
color: var(--ink-soft);
|
|
686
|
+
}
|
|
687
|
+
.founding-band__dot { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); flex: none; }
|
|
688
|
+
.founding-band__title { font-size: 11.5px; font-weight: 600; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink); white-space: nowrap; }
|
|
689
|
+
.founding-band__desc { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
690
|
+
.founding-band__stage { margin-left: auto; font-size: 12px; color: var(--accent-ink); white-space: nowrap; }
|
|
691
|
+
/* The prose-link 24px floor convention: width bought with padding, handed back with
|
|
692
|
+
an equal negative margin, so the target grows and the row does not re-space. */
|
|
693
|
+
.founding-band__link { padding: 10px 6px; margin: 0 -6px; color: var(--ink); text-decoration: underline; text-underline-offset: 3px; white-space: nowrap; }
|
|
694
|
+
/* Phone: the row wraps instead of widening the page (the no-sideways rule the kit
|
|
695
|
+
measured), and the long sentence steps aside for the stage and the link. */
|
|
696
|
+
@media (max-width: 640px) {
|
|
697
|
+
.founding-band { flex-wrap: wrap; row-gap: 2px; padding: 8px 16px; }
|
|
698
|
+
.founding-band__desc { display: none; }
|
|
699
|
+
.founding-band__stage { margin-left: 0; white-space: normal; }
|
|
700
|
+
}
|
|
701
|
+
.nav-item--asleep { opacity: 0.55; }
|
|
702
|
+
.nav-item__wakes { display: none; margin-left: auto; font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-faint); }
|
|
703
|
+
.app-sidebar:hover .nav-item__wakes,
|
|
704
|
+
.app-sidebar:focus-within .nav-item__wakes { display: inline; }
|
|
705
|
+
|
|
670
706
|
/* task 1003737: the nav count badge — the hall's only badge mechanism, built
|
|
671
707
|
once and generically (shell.js `count:` names a need id; see the NAV model).
|
|
672
708
|
ABSOLUTE, not inline, because the rail has two shapes: it is a 64px icon strip
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
|
|
58
58
|
<!-- The app shell (sidebar + top bar + footer). Dependency-free; runs at parse
|
|
59
59
|
time so the chrome exists before the deferred page scripts execute. -->
|
|
60
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
60
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
61
61
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
62
62
|
<script src="/builders/palette.js" defer></script>
|
|
63
63
|
<!-- shared frontend toolkit (window.OTB) — loaded FIRST so task.js can pull from it. -->
|
|
@@ -138,7 +138,7 @@
|
|
|
138
138
|
</div>
|
|
139
139
|
</div>
|
|
140
140
|
|
|
141
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
141
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
142
142
|
<script src="/builders/palette.js" defer></script>
|
|
143
143
|
|
|
144
144
|
<script src="/builders/idea-objects.js?v=2026-09-27-split"></script>
|
|
@@ -140,7 +140,7 @@
|
|
|
140
140
|
|
|
141
141
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
142
142
|
|
|
143
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
143
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
144
144
|
<script src="/builders/palette.js" defer></script>
|
|
145
145
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
146
146
|
<script src="/builders/brand-holes.js?v=2026-09-29-aqfix"></script>
|
|
@@ -162,7 +162,7 @@
|
|
|
162
162
|
|
|
163
163
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
164
164
|
chrome exists before the page script runs. -->
|
|
165
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
165
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
166
166
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
167
167
|
<script src="/builders/palette.js" defer></script>
|
|
168
168
|
<!-- shared frontend toolkit (window.OTB) — loaded before watch.js, which pulls from it. -->
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_": "Project founding mode (task 1004422) on an ordinary hall page: the founding band above the topbar and today's nav items asleep, rendered from a /me that says founding (kit fixture me-founding.json, the real server shaper's output at stage strategize). The page itself is work.states.json's; only the identity differs. The no-founding case is every other hall states file.",
|
|
3
|
+
"page": "/builders/work",
|
|
4
|
+
"surface": "hall-ui",
|
|
5
|
+
"stub": {
|
|
6
|
+
"prefix": "/builders/",
|
|
7
|
+
"fixtures": {
|
|
8
|
+
"me": "me-founding"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"modeQuery": false,
|
|
12
|
+
"ignoreRequests": [
|
|
13
|
+
"/api/(gds|bongos)/me$",
|
|
14
|
+
"/api/(gds|bongos)/me/",
|
|
15
|
+
"/api/(gds|bongos)/tasks",
|
|
16
|
+
"/api/(gds|bongos)/claims",
|
|
17
|
+
"/api/(gds|bongos)/goals",
|
|
18
|
+
"/api/(gds|bongos)/inbox/",
|
|
19
|
+
"/api/(gds|bongos)/versions"
|
|
20
|
+
],
|
|
21
|
+
"ignoreConsole": [
|
|
22
|
+
"/api/(gds|bongos)/",
|
|
23
|
+
"\\b401\\b",
|
|
24
|
+
"\\b404\\b",
|
|
25
|
+
"Unauthorized",
|
|
26
|
+
"Not Found",
|
|
27
|
+
"load failed"
|
|
28
|
+
],
|
|
29
|
+
"states": {
|
|
30
|
+
"founding": {
|
|
31
|
+
"auth": true,
|
|
32
|
+
"expect": {
|
|
33
|
+
"visible": [
|
|
34
|
+
"#founding-band"
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
|
|
172
172
|
<!-- The app shell (sidebar + top bar + footer). Dependency-free; runs at parse
|
|
173
173
|
time so the chrome exists before the deferred page scripts execute. -->
|
|
174
|
-
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
174
|
+
<script src="/builders/shell.js?v=2026-09-30-founding-commands"></script>
|
|
175
175
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
176
176
|
<script src="/builders/palette.js" defer></script>
|
|
177
177
|
<!-- shared frontend toolkit (window.OTB) — loaded FIRST so work.js can pull from it. -->
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Project founding mode — the band and the asleep rooms, worn by the existing hall (task 1004422)
|
|
2
|
+
|
|
3
|
+
**BV2.PS03 (goal 1000121).**
|
|
4
|
+
- Design of record: [`docs/design/project-startup-direction.md`](../../../docs/design/project-startup-direction.md), part 2 of the genesis table.
|
|
5
|
+
- Spec: [`docs/specs/<redacted>.md`](../../../docs/specs/<redacted>.md).
|
|
6
|
+
|
|
7
|
+
## The rule this record exists to keep
|
|
8
|
+
|
|
9
|
+
The owner's blend rule: **genesis is a MODE the existing hall wears, never a second hall.** Founding mode follows the social-mode precedent exactly: one attribute on the document, `html[data-founding="on"]`, read from `/me`. It adds two things in this task:
|
|
10
|
+
|
|
11
|
+
- **the founding band**, a strip created as the first child of `.app-body`. It sits above the sticky topbar, which is kept as it is.
|
|
12
|
+
- **the asleep state on today's nav items**: dimmed, with an "at <stage>" or "when alive" tag that reads in the open rail.
|
|
13
|
+
|
|
14
|
+
Nothing else changes: no new page, no new route, no new nav item. **A project that is not founding makes `applyFounding` return before it touches a single node**, and `tests/founding_mode.mjs` proves that with a proxy that records every DOM call. Switching the mode off REMOVES the band and every class and tag, so the hall is restored exactly; it does not merely hide them. It is cosmetic: an asleep room still opens, and nothing is enforced.
|
|
15
|
+
|
|
16
|
+
## Where the answer comes from
|
|
17
|
+
|
|
18
|
+
- `modules/onboarding/founding-mode.js` holds three `project_settings` keys (`founding.active`, `founding.stage`, `founding.started_at`) and computes which rooms sleep.
|
|
19
|
+
- `asleep` is keyed by `shell.js` NAV ids, so the client never re-derives it. A test holds the two maps together.
|
|
20
|
+
- It **fails closed to OFF**: an absent, unreadable or unknown stage reads as not founding. A hall wrongly stuck asleep would be the hijack; a hall wrongly awake only loses a banner.
|
|
21
|
+
- `/me.founding_mode` carries the answer. Both `applyAccess` callers pass it (`shell.js` `probeMe` and `hall-render.js`).
|
|
22
|
+
|
|
23
|
+
## Rendered, and the phone rule
|
|
24
|
+
|
|
25
|
+
work-founding.states.json renders an ordinary hall page with a founding /me (kit fixture me-founding.json, the real shaper's output). The kit's /me honours stub.fixtures for this. At 390 and 320 the band wraps, the sentence steps aside and the stage and link stay visible, because the first render measured the band widening the page to 483px.
|
|
26
|
+
|
|
27
|
+
## What is deliberately not here
|
|
28
|
+
|
|
29
|
+
- The genesis home, the stage tasks and the "what's this?" destination belong to PS08 (task 1004423). The band links home until then.
|
|
30
|
+
- The founding mark belongs to PS10 (task 1004424).
|
|
31
|
+
- Starting founding on a new project and moving its stage is `setFoundingMode`, on the onboarding port, and PS08 drives it. Nothing in this task writes it.
|