@bongos/core 1.24.36 → 1.24.38
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 +92 -87
- package/docs/copy-inventory.md +65 -64
- package/docs/copy-registry.json +170 -173
- package/docs/module-api-changelog.md +4 -0
- package/docs/onboarding/primer.md +2 -0
- package/docs/page-inventory.json +34 -34
- package/docs/page-readings.json +687 -684
- package/modules/hall-ui/public/ai-studio.html +2 -2
- package/modules/hall-ui/public/atlas.html +2 -2
- package/modules/hall-ui/public/blockers.html +2 -2
- package/modules/hall-ui/public/board-room.html +2 -2
- package/modules/hall-ui/public/city.html +2 -2
- package/modules/hall-ui/public/collab.html +2 -2
- package/modules/hall-ui/public/commands.html +2 -2
- package/modules/hall-ui/public/copy-desk.html +2 -2
- package/modules/hall-ui/public/craft-mode.js +6 -4
- package/modules/hall-ui/public/deploy.html +2 -2
- package/modules/hall-ui/public/fleet-costs.js +3 -2
- package/modules/hall-ui/public/gate.html +2 -2
- package/modules/hall-ui/public/goal-map.html +2 -2
- package/modules/hall-ui/public/goals.html +2 -2
- package/modules/hall-ui/public/government.html +2 -2
- package/modules/hall-ui/public/idea.html +2 -2
- package/modules/hall-ui/public/ideas.html +2 -2
- package/modules/hall-ui/public/index.html +2 -2
- package/modules/hall-ui/public/market-watch-item.html +2 -2
- package/modules/hall-ui/public/market-watch-rules.html +2 -2
- package/modules/hall-ui/public/market-watch.html +2 -2
- package/modules/hall-ui/public/modules.html +2 -2
- package/modules/hall-ui/public/money.html +92 -0
- package/modules/hall-ui/public/money.js +302 -0
- package/modules/hall-ui/public/money.states.json +15 -0
- package/modules/hall-ui/public/my-agents.html +2 -2
- package/modules/hall-ui/public/palette.js +9 -2
- package/modules/hall-ui/public/primer-live.js +18 -105
- package/modules/hall-ui/public/primer.html +7 -8
- package/modules/hall-ui/public/primer.js +16 -18
- package/modules/hall-ui/public/profile.html +2 -2
- package/modules/hall-ui/public/project-settings.css +2 -1
- package/modules/hall-ui/public/project-settings.html +6 -16
- package/modules/hall-ui/public/project-settings.js +2 -142
- package/modules/hall-ui/public/roadmap.html +2 -2
- package/modules/hall-ui/public/roster.html +2 -2
- package/modules/hall-ui/public/sessions.html +2 -2
- package/modules/hall-ui/public/settings.html +2 -2
- package/modules/hall-ui/public/shell.js +113 -94
- package/modules/hall-ui/public/street.html +2 -2
- package/modules/hall-ui/public/studio.html +2 -2
- package/modules/hall-ui/public/task.html +2 -2
- package/modules/hall-ui/public/thinking.html +2 -2
- package/modules/hall-ui/public/tweak-editor.html +2 -2
- package/modules/hall-ui/public/watch.html +2 -2
- package/modules/hall-ui/public/work.html +2 -2
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/src/bongos/auth.js +0 -8
- package/src/bongos/serve-internal.js +15 -6
- package/src/module-api.js +1 -1
- package/tests/auth_resolve_failure.mjs +5 -4
- package/tests/craft_mode_nav.mjs +12 -10
- package/tests/fleet_cost_view.mjs +2 -18
- package/tests/goal_map_page.mjs +5 -2
- package/tests/hall_loading.mjs +1 -1
- package/tests/hall_money_page.mjs +272 -0
- package/tests/hall_nav.mjs +23 -15
- package/tests/hall_oversight_world.mjs +1 -1
- package/tests/hall_page_gate_map.mjs +3 -2
- package/tests/hall_reading_room.mjs +21 -62
- package/tests/nav_permission_atoms.mjs +1 -1
- package/modules/hall-ui/public/fleet.html +0 -69
- package/modules/hall-ui/public/fleet.js +0 -41
- package/modules/hall-ui/public/fleet.states.json +0 -14
|
@@ -49,19 +49,9 @@
|
|
|
49
49
|
server resolved it through, and markup that could drift from that is the
|
|
50
50
|
thing this page exists to end. -->
|
|
51
51
|
<div id="ps-rows"><span class="kit-skel"></span></div>
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
read (payout.approve, the owner), so every other reader of this page never
|
|
56
|
-
sees an empty panel. Written by project-settings.js; every figure is the
|
|
57
|
-
server's, summed from records that already exist. -->
|
|
58
|
-
<section class="scroll" id="ps-money" aria-labelledby="ps-money-h" hidden>
|
|
59
|
-
<h2 class="scroll__h" id="ps-money-h">Where the money went</h2>
|
|
60
|
-
<p class="scroll__lede">
|
|
61
|
-
What this project has spent, what each builder has been paid, and what it has
|
|
62
|
-
promised but not paid yet. A balance only means something after those promises.
|
|
63
|
-
</p>
|
|
64
|
-
<div id="ps-money-body"></div>
|
|
52
|
+
<!-- task 1005047: the money figures this page drew ("Where the money went",
|
|
53
|
+
task 1003184) moved to the one money page; this page keeps its knobs. -->
|
|
54
|
+
<p class="ps-prov" id="ps-money-link">What this project has spent and paid out, its treasury and its hosting bills are on the <a href="/builders/money">Money</a> page.</p>
|
|
65
55
|
</section>
|
|
66
56
|
<!-- Danger zone (task 1004570): where this project's OWNER takes it offline or
|
|
67
57
|
disconnects it. Both controls live on the platform that hosts the project,
|
|
@@ -86,11 +76,11 @@
|
|
|
86
76
|
|
|
87
77
|
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
88
78
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
89
|
-
<script src="/builders/craft-mode.js?v=2026-11-
|
|
90
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
79
|
+
<script src="/builders/craft-mode.js?v=2026-11-05-sections"></script>
|
|
80
|
+
<script src="/builders/shell.js?v=2026-11-05-sections"></script>
|
|
91
81
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
92
82
|
<script src="/builders/palette.js" defer></script>
|
|
93
83
|
<script src="/builders/hall-kit.js"></script>
|
|
94
|
-
<script src="/builders/project-settings.js?v=2026-11-
|
|
84
|
+
<script src="/builders/project-settings.js?v=2026-11-04-money"></script>
|
|
95
85
|
</body>
|
|
96
86
|
</html>
|
|
@@ -417,148 +417,8 @@
|
|
|
417
417
|
$('ps-danger').hidden = false;
|
|
418
418
|
}
|
|
419
419
|
|
|
420
|
-
//
|
|
421
|
-
//
|
|
422
|
-
// The owner's outflow view. The server sums every figure (modules/economy/outflow.js);
|
|
423
|
-
// this only draws it. It leads with what is left AFTER what is owed, because a balance
|
|
424
|
-
// that looks healthy while it owes three payouts is the trap the view exists to show.
|
|
425
|
-
// Any outcome but a 200 leaves the section hidden: the read is the payout authority's,
|
|
426
|
-
// and everyone else on this page has nothing to see here, not an error.
|
|
427
|
-
|
|
428
|
-
const money = (micro) => {
|
|
429
|
-
const usd = Number(micro || 0) / 1e6;
|
|
430
|
-
const abs = Math.abs(usd).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
431
|
-
return `${usd < 0 ? '−' : ''}$${abs}`;
|
|
432
|
-
};
|
|
433
|
-
const monthLabel = (ym) => {
|
|
434
|
-
const [y, m] = String(ym).split('-').map(Number);
|
|
435
|
-
return new Date(Date.UTC(y, m - 1, 1)).toLocaleDateString(undefined, { month: 'short', year: 'numeric', timeZone: 'UTC' });
|
|
436
|
-
};
|
|
437
|
-
const dayLabel = (iso) => (iso ? new Date(iso).toLocaleDateString() : '');
|
|
438
|
-
|
|
439
|
-
function moneyFiguresHtml(out) {
|
|
440
|
-
const c = out.committed;
|
|
441
|
-
const after = out.balance.after_commitments_micro;
|
|
442
|
-
const fig = (label, value, note, tone) => `<div class="ps-money__fig${tone ? ` ps-money__fig--${tone}` : ''}">
|
|
443
|
-
<span class="ps-money__label">${escapeHtml(label)}</span>
|
|
444
|
-
<strong class="ps-money__value">${escapeHtml(value)}</strong>
|
|
445
|
-
<span class="ps-money__note">${escapeHtml(note)}</span>
|
|
446
|
-
</div>`;
|
|
447
|
-
const owedNote = c.owed_count === 1 ? '1 payment' : `${c.owed_count} payments`;
|
|
448
|
-
const apprNote = c.approved_count === 1 ? '1 approval' : `${c.approved_count} approvals`;
|
|
449
|
-
return `<div class="ps-money__figs">
|
|
450
|
-
${fig('Balance', money(out.balance.available_micro), c.held_micro ? `after ${money(c.held_micro)} held` : 'on our record')}
|
|
451
|
-
${fig('Owed but not paid', money(c.owed_micro), owedNote, c.owed_micro ? 'warn' : '')}
|
|
452
|
-
${fig('Approved, not started', money(c.approved_micro), apprNote, c.approved_micro ? 'warn' : '')}
|
|
453
|
-
${fig('Left after all of that', money(after), after < 0 ? 'the project owes more than it holds' : 'what is really free', after < 0 ? 'bad' : '')}
|
|
454
|
-
</div>${c.other_currency_count ? `<p class="ps-prov">${c.other_currency_count} more in a currency other than US dollars, not added in.</p>` : ''}`;
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
// The payout's latest try in words. A reason is either the processor's own sentence, shown
|
|
458
|
-
// as it is, or one of core's held codes (builder-payouts.js HELD_WORDS). The codes an owner
|
|
459
|
-
// can act on get a short phrase here; any other code is left out rather than shown as a slug.
|
|
460
|
-
const TRY_WORDS = { held: 'Waiting', failed: 'Did not go through' };
|
|
461
|
-
const REASON_WORDS = {
|
|
462
|
-
no_processor: 'no payment processor connected yet',
|
|
463
|
-
recipient_gated: 'this person cannot be paid right now',
|
|
464
|
-
guardian_cosign_missing: 'a guardian has not co-signed yet',
|
|
465
|
-
currency_not_supported: 'not in US dollars',
|
|
466
|
-
};
|
|
467
|
-
function lastTryWords(r) {
|
|
468
|
-
if (!r.last_outcome) return 'Not tried yet';
|
|
469
|
-
const reason = String(r.last_reason || '');
|
|
470
|
-
const why = REASON_WORDS[reason] || (/^[a-z_]+$/.test(reason) ? '' : reason);
|
|
471
|
-
return `${TRY_WORDS[r.last_outcome] || r.last_outcome}${why ? ` — ${why}` : ''}`;
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
function owedHtml(out) {
|
|
475
|
-
const rows = out.committed.owed;
|
|
476
|
-
if (!rows.length) return '';
|
|
477
|
-
return `<h3 class="ps-money__h">Owed but not paid</h3>
|
|
478
|
-
<div class="ps-money__wrap"><table class="ledger">
|
|
479
|
-
<thead><tr><th>Builder</th><th>Task</th><th>Amount</th><th>Owed since</th><th>Last try</th></tr></thead>
|
|
480
|
-
<tbody>${rows.map((r) => `<tr>
|
|
481
|
-
<td>${escapeHtml(r.builder_name || `builder ${r.builder_id}`)}</td>
|
|
482
|
-
<td><a href="/builders/task/${encodeURIComponent(r.task_id)}">${escapeHtml(r.task_title || `task ${r.task_id}`)}</a></td>
|
|
483
|
-
<td>${escapeHtml(money(r.amount_micro))}</td>
|
|
484
|
-
<td>${escapeHtml(dayLabel(r.since))}</td>
|
|
485
|
-
<td>${escapeHtml(lastTryWords(r))}</td>
|
|
486
|
-
</tr>`).join('')}</tbody>
|
|
487
|
-
</table></div>`;
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
function buildersHtml(out) {
|
|
491
|
-
const rows = out.by_builder;
|
|
492
|
-
if (!rows.length) return '';
|
|
493
|
-
return `<h3 class="ps-money__h">By builder</h3>
|
|
494
|
-
<div class="ps-money__wrap"><table class="ledger">
|
|
495
|
-
<thead><tr><th>Builder</th><th>Spent</th><th>Paid</th><th>Owed</th><th>Approved</th></tr></thead>
|
|
496
|
-
<tbody>${rows.map((b) => `<tr>
|
|
497
|
-
<td>${escapeHtml(b.builder_name || `builder ${b.builder_id}`)}</td>
|
|
498
|
-
<td>${escapeHtml(money(b.spend_micro))}</td>
|
|
499
|
-
<td>${escapeHtml(money(b.paid_micro))}</td>
|
|
500
|
-
<td>${escapeHtml(money(b.owed_micro))}</td>
|
|
501
|
-
<td>${escapeHtml(money(b.approved_micro))}</td>
|
|
502
|
-
</tr>`).join('')}</tbody>
|
|
503
|
-
</table></div>
|
|
504
|
-
<p class="ps-prov">Spent is the recorded cost of each builder’s sessions (API, compute). Paid, owed and approved are payouts.</p>`;
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
function burnHtml(out) {
|
|
508
|
-
const months = out.burn.months;
|
|
509
|
-
if (!months.some((m) => m.total_micro > 0)) return '';
|
|
510
|
-
const bars = window.OTBKit.barSeriesHtml(
|
|
511
|
-
months.map((m) => ({ label: monthLabel(m.month), value: m.total_micro, valueLabel: money(m.total_micro) })),
|
|
512
|
-
{ list: true, ariaLabel: 'Money out by month', valueWidth: '96px' });
|
|
513
|
-
return `<h3 class="ps-money__h">Money out, by month</h3>${bars}
|
|
514
|
-
<p class="ps-prov">Each month is recorded spend (${escapeHtml(money(months.reduce((s, m) => s + m.spend_micro, 0)))} over these ${months.length} months) plus payouts and fees out of the project account. Read from the cost log and the account’s own record.</p>`;
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
// The daily check of our record against the processor's (task 1004912). The newest check
|
|
518
|
-
// in words, and on a difference each one with both amounts. The blocker it raises is public
|
|
519
|
-
// and carries no numbers, so this is where the owner reads them.
|
|
520
|
-
const CHECK_WORDS = {
|
|
521
|
-
clean: 'Our records and the payment processor’s agree.',
|
|
522
|
-
drift: 'Our records and the payment processor’s differ.',
|
|
523
|
-
unchecked: 'Not checked: no payment processor is connected yet, so there is nothing to compare with.',
|
|
524
|
-
error: 'Could not check: the payment processor could not be read.',
|
|
525
|
-
};
|
|
526
|
-
function ledgerCheckHtml(out) {
|
|
527
|
-
const c = out && out.checks && out.checks[0];
|
|
528
|
-
if (!c) return '';
|
|
529
|
-
const words = out.kind_words || {};
|
|
530
|
-
const amt = (v) => (v === null || v === undefined ? '—' : money(v));
|
|
531
|
-
const rows = (c.findings || []).map((f) => `<tr>
|
|
532
|
-
<td>${escapeHtml(words[f.kind] || f.kind)}</td>
|
|
533
|
-
<td>${escapeHtml(f.ref || 'the project balance')}</td>
|
|
534
|
-
<td>${escapeHtml(amt(f.ours_micro))}</td>
|
|
535
|
-
<td>${escapeHtml(amt(f.theirs_micro))}</td>
|
|
536
|
-
</tr>`).join('');
|
|
537
|
-
return `<h3 class="ps-money__h">Daily check against the payment processor</h3>
|
|
538
|
-
<p class="ps-prov">${escapeHtml(dayLabel(c.created_at))}: ${escapeHtml(CHECK_WORDS[c.outcome] || c.outcome)}${c.outcome === 'clean' || c.outcome === 'drift' ? ` ${c.refs_compared} ${c.refs_compared === 1 ? 'movement' : 'movements'} compared.` : ''}</p>
|
|
539
|
-
${rows ? `<div class="ps-money__wrap"><table class="ledger">
|
|
540
|
-
<thead><tr><th>Difference</th><th>Reference</th><th>Our record</th><th>Processor</th></tr></thead>
|
|
541
|
-
<tbody>${rows}</tbody>
|
|
542
|
-
</table></div>` : ''}`;
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
async function loadMoney() {
|
|
546
|
-
let out = null;
|
|
547
|
-
try {
|
|
548
|
-
const res = await api.request('GET', `${API}/project-account/outflow`);
|
|
549
|
-
out = res.ok ? res.data : null;
|
|
550
|
-
} catch (_) { out = null; }
|
|
551
|
-
if (!out || !out.balance || !out.committed) return;
|
|
552
|
-
let checks = null;
|
|
553
|
-
try {
|
|
554
|
-
const res = await api.request('GET', `${API}/project-account/ledger-checks?limit=1`);
|
|
555
|
-
checks = res.ok ? res.data : null;
|
|
556
|
-
} catch (_) { checks = null; }
|
|
557
|
-
$('ps-money-body').innerHTML = moneyFiguresHtml(out) + ledgerCheckHtml(checks) + owedHtml(out) + buildersHtml(out) + burnHtml(out);
|
|
558
|
-
$('ps-money').hidden = false;
|
|
559
|
-
}
|
|
560
|
-
|
|
420
|
+
// task 1005047: "Where the money went" (task 1003184) moved to money.js, the one
|
|
421
|
+
// money page; the section's link is in project-settings.html.
|
|
561
422
|
load();
|
|
562
|
-
loadMoney();
|
|
563
423
|
loadDanger();
|
|
564
424
|
})();
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
|
|
44
44
|
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
45
45
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
46
|
-
<script src="/builders/craft-mode.js?v=2026-11-
|
|
47
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
46
|
+
<script src="/builders/craft-mode.js?v=2026-11-05-sections"></script>
|
|
47
|
+
<script src="/builders/shell.js?v=2026-11-05-sections"></script>
|
|
48
48
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
49
49
|
<script src="/builders/palette.js" defer></script>
|
|
50
50
|
<!-- The chart kit and the timeline's series builders (task 1003447). Both MUST
|
|
@@ -55,8 +55,8 @@
|
|
|
55
55
|
chrome exists before the page script runs. -->
|
|
56
56
|
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
57
57
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
58
|
-
<script src="/builders/craft-mode.js?v=2026-11-
|
|
59
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
58
|
+
<script src="/builders/craft-mode.js?v=2026-11-05-sections"></script>
|
|
59
|
+
<script src="/builders/shell.js?v=2026-11-05-sections"></script>
|
|
60
60
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
61
61
|
<script src="/builders/palette.js" defer></script>
|
|
62
62
|
<!-- the branding pack's currency label, loaded BEFORE roster.js. -->
|
|
@@ -113,8 +113,8 @@
|
|
|
113
113
|
chrome exists before the page script runs. -->
|
|
114
114
|
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
115
115
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
116
|
-
<script src="/builders/craft-mode.js?v=2026-11-
|
|
117
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
116
|
+
<script src="/builders/craft-mode.js?v=2026-11-05-sections"></script>
|
|
117
|
+
<script src="/builders/shell.js?v=2026-11-05-sections"></script>
|
|
118
118
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
119
119
|
<script src="/builders/palette.js" defer></script>
|
|
120
120
|
<script src="/builders/task-detail.js?v=2026-07-03-taskdetail"></script>
|
|
@@ -393,8 +393,8 @@
|
|
|
393
393
|
chrome exists before the page scripts run. -->
|
|
394
394
|
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
395
395
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
396
|
-
<script src="/builders/craft-mode.js?v=2026-11-
|
|
397
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
396
|
+
<script src="/builders/craft-mode.js?v=2026-11-05-sections"></script>
|
|
397
|
+
<script src="/builders/shell.js?v=2026-11-05-sections"></script>
|
|
398
398
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
399
399
|
<script src="/builders/palette.js" defer></script>
|
|
400
400
|
<!-- shared component kit (window.OTBKit) — section rail (task 2166). -->
|
|
@@ -122,7 +122,7 @@
|
|
|
122
122
|
sessions: '<path d="M7 5h8M7 9h8M7 13h8"/><circle cx="3.8" cy="5" r=".7" fill="currentColor"/><circle cx="3.8" cy="9" r=".7" fill="currentColor"/><circle cx="3.8" cy="13" r=".7" fill="currentColor"/>',
|
|
123
123
|
settings: '<circle cx="9" cy="9" r="2.5"/><path d="M9 2.5v2m0 9v2M2.5 9h2m9 0h2M4.4 4.4l1.4 1.4m6.4 6.4 1.4 1.4m0-9.2-1.4 1.4M5.8 12.2l-1.4 1.4"/>',
|
|
124
124
|
deploy: '<path d="M9 12V3M5.5 6.5 9 3l3.5 3.5M3 12.5v2a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1v-2"/>',
|
|
125
|
-
|
|
125
|
+
money: '<path d="M4 2.5h10v13l-1.7-1-1.6 1-1.7-1-1.7 1-1.6-1-1.7 1v-13Z"/><path d="M6.5 6h5M6.5 9h5M6.5 12h3"/>',
|
|
126
126
|
permissions: '<circle cx="6" cy="12" r="3.5"/><path d="M8.5 9.5 15 3M12.5 5.5l2 2M10.5 7.5l1.5 1.5"/>',
|
|
127
127
|
// The governor city: a pediment over columns, the Governing mode's own glyph.
|
|
128
128
|
city: '<path d="M2.5 7 9 3l6.5 4M4 7.5v6.5M7 7.5v6.5M11 7.5v6.5M14 7.5v6.5M2.5 15.5h13"/>',
|
|
@@ -176,13 +176,27 @@
|
|
|
176
176
|
// alongside it as sr-only text, because "3" alone in a link tells a screen
|
|
177
177
|
// reader nothing about what is waiting.
|
|
178
178
|
// task 2175: grouped by AUDIENCE of the data, so the sidebar reads in coherent
|
|
179
|
-
// runs instead of one long list
|
|
180
|
-
//
|
|
179
|
+
// runs instead of one long list. Since task 1005071: Work, Make, Community, You,
|
|
180
|
+
// Govern, Run the project, Help. A group's `gate` must match its most permissive item's, or the
|
|
181
181
|
// head renders over nothing.
|
|
182
182
|
var NAV = [
|
|
183
|
-
|
|
183
|
+
// task 1005071 (goal 1000095; owner decision 2026-11-04, from the sitemap audit): the
|
|
184
|
+
// project group was eleven items under no heading, mixing the work, the artist's
|
|
185
|
+
// room, an add-on and two governing surfaces. It is labelled now and split by what
|
|
186
|
+
// you DO there: Work (the project's state, everyone), Make (where you build things),
|
|
187
|
+
// Govern (the board's rooms). 'always' because Home is.
|
|
188
|
+
{ group: 'Work', gate: 'always', items: [
|
|
184
189
|
{ id: 'home', label: 'Home', icon: 'home', href: '/', view: 'home', gate: 'always' },
|
|
185
|
-
|
|
190
|
+
// task 1966: Tasks (the board formerly labelled "Work") is visible to ANY
|
|
191
|
+
// signed-in builder (incl. newcomer Xenos). Claimability is controlled
|
|
192
|
+
// per-task, not by hiding the page — every row carries a rank tag and the
|
|
193
|
+
// server enforces requires_rank on the claim. This reverses task #833's
|
|
194
|
+
// newcomer hide (the 'work' gate below is now unused).
|
|
195
|
+
// task 1002425: relabelled Work → Tasks and moved below Roadmap/Goals. The
|
|
196
|
+
// id ('work') and href ('/work') are deliberately UNCHANGED so deep links,
|
|
197
|
+
// active-nav detection (#nav-work), the 'work' gate case, and the server
|
|
198
|
+
// page-gate all keep working — only the visible label and order change.
|
|
199
|
+
{ id: 'work', label: 'Tasks', icon: 'work', href: '/work', gate: 'signed' },
|
|
186
200
|
{ id: 'goals', label: 'Goals', icon: 'goals', href: '/goals', gate: 'member' },
|
|
187
201
|
// task 1004232 (sky part 4 of 5, goal 1000095; ADR 0227 §11, ADR 0331):
|
|
188
202
|
// THE PROJECT SKY — the whole project drawn from the ledger, at the URL
|
|
@@ -195,16 +209,7 @@
|
|
|
195
209
|
// because the href does: Goals' own "see which goals wait on each other"
|
|
196
210
|
// link and every bookmark land here unchanged.
|
|
197
211
|
{ id: 'goal-map', label: 'Sky', icon: 'sky', href: '/goal-map', gate: 'member' },
|
|
198
|
-
|
|
199
|
-
// signed-in builder (incl. newcomer Xenos). Claimability is controlled
|
|
200
|
-
// per-task, not by hiding the page — every row carries a rank tag and the
|
|
201
|
-
// server enforces requires_rank on the claim. This reverses task #833's
|
|
202
|
-
// newcomer hide (the 'work' gate below is now unused).
|
|
203
|
-
// task 1002425: relabelled Work → Tasks and moved below Roadmap/Goals. The
|
|
204
|
-
// id ('work') and href ('/work') are deliberately UNCHANGED so deep links,
|
|
205
|
-
// active-nav detection (#nav-work), the 'work' gate case, and the server
|
|
206
|
-
// page-gate all keep working — only the visible label and order change.
|
|
207
|
-
{ id: 'work', label: 'Tasks', icon: 'work', href: '/work', gate: 'signed' },
|
|
212
|
+
{ id: 'roadmap', label: 'Roadmap', icon: 'roadmap', href: '/roadmap', gate: 'member' },
|
|
208
213
|
// task 1003455 (goal 1000089): the open-blocker queue — what's stuck on the
|
|
209
214
|
// owner. Lives with the project's own state (Roadmap/Goals/Tasks), not You
|
|
210
215
|
// or Community, because its subject is the project, not a person. Its one
|
|
@@ -214,40 +219,6 @@
|
|
|
214
219
|
// fronts, showing the link to signed-in builders while a stranger who
|
|
215
220
|
// already has the URL can still open it.
|
|
216
221
|
{ id: 'blockers', label: 'Blockers', icon: 'blockers', href: '/blockers', gate: 'signed' },
|
|
217
|
-
// task 1003744 (goal 1000111): the Board Room lives HERE, in the project's
|
|
218
|
-
// own group, and gates on the atom its page gates on.
|
|
219
|
-
//
|
|
220
|
-
// WHY IT LEFT GOVERNMENT. ADR 0266 carved the room out of /government, so
|
|
221
|
-
// the item first landed in the Government group and read that group's metic
|
|
222
|
-
// floor — the closest rank the shell could then express. Its real wall is
|
|
223
|
-
// `board.vote.cast` (auth.js requireBoardVotePage), which floors at XENOS on
|
|
224
|
-
// purpose so that WIDENING the board works (modules/government/board.js). The
|
|
225
|
-
// moment an instance seats a sub-Metic member — the config change ADR 0175 §6
|
|
226
|
-
// exists to make — that member could reach the room by URL and by the
|
|
227
|
-
// board_votes need's deep link, with no sidebar entry.
|
|
228
|
-
//
|
|
229
|
-
// Fixing the gate alone would have put a wider item under a metic group head,
|
|
230
|
-
// so a newcomer board member would see a group labelled "Government" holding
|
|
231
|
-
// one link — more authority than they hold. The owner's call (2026-09-09) was
|
|
232
|
-
// to move it instead: a sitting is work the project does, beside Goals and
|
|
233
|
-
// Tasks, not a monitoring surface. The Government group's audience and floor
|
|
234
|
-
// are unchanged.
|
|
235
|
-
//
|
|
236
|
-
// Cosmetic only, as every gate here is — the page gate is the wall (ADR 0016).
|
|
237
|
-
// task 1003737: the badge's first consumer. The owner's ask was to see that
|
|
238
|
-
// a sitting waits WITHOUT opening the room, and the count is already on
|
|
239
|
-
// /me (boardVotesNeed), pre-filtered to what the vote route would accept —
|
|
240
|
-
// so the badge counts ballots this viewer can actually cast, never "items
|
|
241
|
-
// open somewhere".
|
|
242
|
-
// task 1004685: `position: true` narrows the gate to seat holders (GOVERNING IS A POSITION).
|
|
243
|
-
{ id: 'board-room', label: 'Board Room', icon: 'boardroom', href: '/board-room', gate: 'perm:board.vote.cast', count: 'board_votes', position: true },
|
|
244
|
-
// The governor city (task 1004524): the owner put it on the sidebar on
|
|
245
|
-
// 2026-10-08, reversing "leave it off". It is the Governing mode's lead tab
|
|
246
|
-
// (craft-mode.js folds that mode's other tabs into a dropdown under it).
|
|
247
|
-
// Gated on the atom its page is (requireBoardVotePage), and it sits in this
|
|
248
|
-
// head-less group for the reason the Board Room does: the atom floors below
|
|
249
|
-
// any rank head. Cosmetic only (ADR 0016).
|
|
250
|
-
{ id: 'city', label: 'City', icon: 'city', href: '/city', gate: 'perm:board.vote.cast', position: true },
|
|
251
222
|
// task 1004326 (BV2.TW15 of goal 1000095): the Ideas board (/ideas, task
|
|
252
223
|
// 1002928) and the Copy desk (/copy-desk, task 1003113) are ARCHIVED — off
|
|
253
224
|
// the nav on the owner's call of 2026-09-27, NOT deleted. Both pages and
|
|
@@ -269,6 +240,9 @@
|
|
|
269
240
|
// thought, and the route reads the VIEWER's own trail, so there is
|
|
270
241
|
// nothing here a rank could protect.
|
|
271
242
|
{ id: 'thinking', label: 'Your thinking', icon: 'thinking', href: '/thinking', gate: 'signed' },
|
|
243
|
+
] },
|
|
244
|
+
// task 1005071: where things get made. Studio and the module-gated Market Watch.
|
|
245
|
+
{ group: 'Make', gate: 'signed', items: [
|
|
272
246
|
// task 1003117 (R06 of goal 1000074): the Studio — artist mode, "a place an
|
|
273
247
|
// artist wants to be, not a form". Here and not in Docs (a place you ACT,
|
|
274
248
|
// not reference) or You (its subject is the product, not a person).
|
|
@@ -279,21 +253,6 @@
|
|
|
279
253
|
{ id: 'studio', label: 'Studio', icon: 'studio', href: '/studio', gate: 'signed' },
|
|
280
254
|
{ id: 'market-watch', label: 'Market Watch', icon: 'marketwatch', href: '/market-watch', gate: 'signed', module: 'market-watch' }, // task 1004939: 'signed' is its page floor; dropped where the module is off
|
|
281
255
|
] },
|
|
282
|
-
// Your own numbers. task 2174 folded Achievements into Standing and this task
|
|
283
|
-
// retires its nav entry; VIEW_ALIASES still routes #achievements here, so old
|
|
284
|
-
// bookmarks and the stat tiles keep landing on the section.
|
|
285
|
-
{ group: 'You', gate: 'signed', items: [
|
|
286
|
-
{ id: 'standing', label: 'Accomplishments', icon: 'accomplishments', href: '/#accomplishments', view: 'standing', gate: 'signed' },
|
|
287
|
-
// task 1467: the viewable, shareable builder profile. The nav link points at
|
|
288
|
-
// the viewer's OWN profile (profile.js defaults to self when no ?id=). gate is
|
|
289
|
-
// cosmetic only — the /profile PAGE is public (a portfolio others can open via
|
|
290
|
-
// /profile?id=N from the leaderboard); 'signed' just means "show this 'my
|
|
291
|
-
// profile' shortcut once you're signed in".
|
|
292
|
-
{ id: 'profile', label: 'Profile', icon: 'profile', href: '/profile', gate: 'signed' },
|
|
293
|
-
// task 1004685 (prototype, board 6): MY AGENTS — how your own Claude works for you
|
|
294
|
-
// and which settings the project's laws lock. 'signed' is its page's real floor.
|
|
295
|
-
{ id: 'my-agents', label: 'My agents', icon: 'agents', href: '/my-agents', gate: 'signed' },
|
|
296
|
-
] },
|
|
297
256
|
// task 1003442 (goal 1000075): Community is Collab + Builders, and NEITHER
|
|
298
257
|
// carries a rank flag any more. Both items and this head read 'member'
|
|
299
258
|
// (authed && rank !== 'xenos') until now, which hid them from the newcomer
|
|
@@ -329,33 +288,68 @@
|
|
|
329
288
|
// call 2026-09-25, ADR 0337 D5). Cross-project discovery is the hub's, and
|
|
330
289
|
// /people redirects to /roster.
|
|
331
290
|
] },
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
//
|
|
338
|
-
|
|
339
|
-
//
|
|
340
|
-
//
|
|
341
|
-
//
|
|
342
|
-
|
|
343
|
-
//
|
|
344
|
-
//
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
291
|
+
// Your own numbers. task 2174 folded Achievements into Standing and this task
|
|
292
|
+
// retires its nav entry; VIEW_ALIASES still routes #achievements here, so old
|
|
293
|
+
// bookmarks and the stat tiles keep landing on the section.
|
|
294
|
+
{ group: 'You', gate: 'signed', items: [
|
|
295
|
+
{ id: 'standing', label: 'Accomplishments', icon: 'accomplishments', href: '/#accomplishments', view: 'standing', gate: 'signed' },
|
|
296
|
+
// task 1467: the viewable, shareable builder profile. The nav link points at
|
|
297
|
+
// the viewer's OWN profile (profile.js defaults to self when no ?id=). gate is
|
|
298
|
+
// cosmetic only — the /profile PAGE is public (a portfolio others can open via
|
|
299
|
+
// /profile?id=N from the leaderboard); 'signed' just means "show this 'my
|
|
300
|
+
// profile' shortcut once you're signed in".
|
|
301
|
+
{ id: 'profile', label: 'Profile', icon: 'profile', href: '/profile', gate: 'signed' },
|
|
302
|
+
// task 1004685 (prototype, board 6): MY AGENTS — how your own Claude works for you
|
|
303
|
+
// and which settings the project's laws lock. 'signed' is its page's real floor.
|
|
304
|
+
{ id: 'my-agents', label: 'My agents', icon: 'agents', href: '/my-agents', gate: 'signed' },
|
|
305
|
+
] },
|
|
306
|
+
// task 1005071: the board's own rooms get a head of their own. Gated on the SAME
|
|
307
|
+
// atom as both items (perm:, which floors below any rank), so the head can never
|
|
308
|
+
// be narrower than an item under it — the reason task 1003744 kept them out of a
|
|
309
|
+
// rank-gated group. The street stays off the sidebar (owner, kept 2026-11-05):
|
|
310
|
+
// the city is the way in, and it is Governing's Home.
|
|
311
|
+
{ group: 'Govern', gate: 'perm:board.vote.cast', position: true, items: [
|
|
312
|
+
// The governor city (task 1004524): the owner put it on the sidebar on
|
|
313
|
+
// 2026-10-08, reversing "leave it off". It is the Governing mode's lead tab
|
|
314
|
+
// (craft-mode.js folds that mode's other tabs into a dropdown under it).
|
|
315
|
+
// Gated on the atom its page is (requireBoardVotePage), and it sits in this
|
|
316
|
+
// head-less group for the reason the Board Room does: the atom floors below
|
|
317
|
+
// any rank head. Cosmetic only (ADR 0016).
|
|
318
|
+
{ id: 'city', label: 'City', icon: 'city', href: '/city', gate: 'perm:board.vote.cast', position: true },
|
|
319
|
+
// task 1003744 (goal 1000111): the Board Room lives HERE, in the project's
|
|
320
|
+
// own group, and gates on the atom its page gates on.
|
|
321
|
+
//
|
|
322
|
+
// WHY IT LEFT GOVERNMENT. ADR 0266 carved the room out of /government, so
|
|
323
|
+
// the item first landed in the Government group and read that group's metic
|
|
324
|
+
// floor — the closest rank the shell could then express. Its real wall is
|
|
325
|
+
// `board.vote.cast` (auth.js requireBoardVotePage), which floors at XENOS on
|
|
326
|
+
// purpose so that WIDENING the board works (modules/government/board.js). The
|
|
327
|
+
// moment an instance seats a sub-Metic member — the config change ADR 0175 §6
|
|
328
|
+
// exists to make — that member could reach the room by URL and by the
|
|
329
|
+
// board_votes need's deep link, with no sidebar entry.
|
|
330
|
+
//
|
|
331
|
+
// Fixing the gate alone would have put a wider item under a metic group head,
|
|
332
|
+
// so a newcomer board member would see a group labelled "Government" holding
|
|
333
|
+
// one link — more authority than they hold. The owner's call (2026-09-09) was
|
|
334
|
+
// to move it instead: a sitting is work the project does, beside Goals and
|
|
335
|
+
// Tasks, not a monitoring surface. The Government group's audience and floor
|
|
336
|
+
// are unchanged.
|
|
337
|
+
//
|
|
338
|
+
// Cosmetic only, as every gate here is — the page gate is the wall (ADR 0016).
|
|
339
|
+
// task 1003737: the badge's first consumer. The owner's ask was to see that
|
|
340
|
+
// a sitting waits WITHOUT opening the room, and the count is already on
|
|
341
|
+
// /me (boardVotesNeed), pre-filtered to what the vote route would accept —
|
|
342
|
+
// so the badge counts ballots this viewer can actually cast, never "items
|
|
343
|
+
// open somewhere".
|
|
344
|
+
// task 1004685: `position: true` narrows the gate to seat holders (GOVERNING IS A POSITION).
|
|
345
|
+
{ id: 'board-room', label: 'Board Room', icon: 'boardroom', href: '/board-room', gate: 'perm:board.vote.cast', count: 'board_votes', position: true },
|
|
353
346
|
] },
|
|
354
347
|
// Relabeled 'Archon' → 'Governance' in ADR 0157, then → 'Government' by ADR 0174: these pages are no longer
|
|
355
348
|
// Archon-only, so a group header reading "Archon" over items a Metic can open
|
|
356
349
|
// would misdescribe the ladder to the builders most likely to be learning it.
|
|
357
350
|
// task 1004685: a governing surface throughout, so head and items carry `position`.
|
|
358
|
-
|
|
351
|
+
// task 1005071: 'Government' → 'Run the project' — the operator surfaces.
|
|
352
|
+
{ group: 'Run the project', gate: 'government', position: true, items: [
|
|
359
353
|
// The Board Room was FIRST here from the ADR 0266 carve until task 1003744
|
|
360
354
|
// moved it into the project group — its wall is an ATOM (`board.vote.cast`,
|
|
361
355
|
// xenos floor) rather than this group's rank, and a group whose audience is
|
|
@@ -367,6 +361,12 @@
|
|
|
367
361
|
// The project's own fundamentals (task 1003280, goal 1000072). Mirrors the
|
|
368
362
|
// server's requireGovernmentPage floor; cosmetic only, as every item here is.
|
|
369
363
|
{ id: 'project-settings', label: 'Project settings', icon: 'settings', href: '/project-settings', gate: 'government', position: true },
|
|
364
|
+
// task 1005047 (owner decision 2026-11-03, idea 1001312): the owner's one money page —
|
|
365
|
+
// spend and payouts (once on Project settings), the treasury (once the Economy page)
|
|
366
|
+
// and the hosting bills (once 'Fleet costs', /fleet, which now redirects to its
|
|
367
|
+
// #hosting section). It mirrors the server's requireGovernmentPage floor; every
|
|
368
|
+
// section on it is hidden unless its own read answers, so the wall stays per route.
|
|
369
|
+
{ id: 'money', label: 'Money', icon: 'money', href: '/money', gate: 'government', position: true },
|
|
370
370
|
// The deploy door (task 1003159, ADR 0293). Gated 'archon' here to mirror the
|
|
371
371
|
// `core.pin.move` atom its page and both its routes check — cosmetic only, as
|
|
372
372
|
// every item in this list is; the wall is server-side.
|
|
@@ -377,10 +377,6 @@
|
|
|
377
377
|
// is the platform hall's page alone, and every other hall takes its update from
|
|
378
378
|
// Settings → Software update, whose Update button carries the hub hand-off.
|
|
379
379
|
{ id: 'deploy', label: 'Deploy', icon: 'deploy', href: '/deploy', gate: 'archon', module: 'provisioning render-deploy', position: true },
|
|
380
|
-
// task 1001949: what each hosted project costs. 'government' mirrors the metic floor
|
|
381
|
-
// of `provisioning.fleet.manage`, the atom its page and its one read check (the
|
|
382
|
-
// Deploy precedent above); dropped where the provisioning module is not enabled.
|
|
383
|
-
{ id: 'fleet', label: 'Fleet costs', icon: 'fleet', href: '/fleet', gate: 'government', module: 'provisioning', position: true },
|
|
384
380
|
// task 1005045: the owner's Market Watch settings (task 1004938) are an owner-only tab on
|
|
385
381
|
// /market-watch now, so the sidebar says "Market Watch" once (owner decision 2026-11-03).
|
|
386
382
|
// BV1.R113: the roles-and-permissions tab (ADR 0151). The one genuinely
|
|
@@ -393,14 +389,36 @@
|
|
|
393
389
|
// reading 'Ranks' beside it is the confusion this rename exists to remove. This tab
|
|
394
390
|
// is where a rank's permissions are granted, so it says what it does.,
|
|
395
391
|
] },
|
|
392
|
+
// task 1005071: 'Docs' → 'Help', and every craft shows it (craft-mode.js ALWAYS_TABS).
|
|
393
|
+
{ group: 'Help', gate: 'signed', items: [
|
|
394
|
+
// task 1002710: primer (and the old diagrams page) were gate:'member' (rank
|
|
395
|
+
// !== xenos) to mirror the old thetes+ page gate. That gate is gone — the
|
|
396
|
+
// reading room is for the first-session newcomer above all — so the link
|
|
397
|
+
// follows it down to 'signed'. Leaving them at 'member' would have ungated the pages
|
|
398
|
+
// while still hiding them from the only readers the change was for.
|
|
399
|
+
{ id: 'primer', label: 'Primer', icon: 'primer', href: '/primer', gate: 'signed' },
|
|
400
|
+
// task 1005046 (owner decision 2026-11-03, idea 1001311): ONE reading room.
|
|
401
|
+
// Ranks, Economy and Diagrams were three more pages explaining what the
|
|
402
|
+
// Primer already explained, so the copies drifted. They are Primer
|
|
403
|
+
// chapters now, each with its diagram beside it; /ranks, /drachmae and
|
|
404
|
+
// /diagrams 302 to the matching chapter (serve-internal.js), and the
|
|
405
|
+
// personal "Where you stand" card moved to Accomplishments.
|
|
406
|
+
// task 1004473: every skill and every bongos CLI verb, read live. Its page and
|
|
407
|
+
// both reads behind it are sign-in gated, so 'signed' is the real floor here.
|
|
408
|
+
{ id: 'commands', label: 'Commands', icon: 'commands', href: '/commands', gate: 'signed' },
|
|
409
|
+
{ id: 'atlas', label: 'Repo Atlas', icon: 'atlas', href: '/atlas', gate: 'member' },
|
|
410
|
+
{ id: 'modules', label: 'Modules', icon: 'modules', href: '/modules', gate: 'member' },
|
|
411
|
+
// The rendered OpenAPI reference lives on the APEX (/docs), not this builders
|
|
412
|
+
// subdomain — external so the rewrite shim doesn't turn it into /builders/docs.
|
|
413
|
+
{ id: 'apidocs', label: 'API docs', icon: 'apidocs', href: '/docs', gate: 'signed', external: true },
|
|
414
|
+
] },
|
|
396
415
|
];
|
|
397
416
|
|
|
398
417
|
// ---------- nav group collapse (labeled groups only) ----------
|
|
399
418
|
// Mirrors the THEME_KEY localStorage pattern: per-group collapsed state,
|
|
400
419
|
// survives reloads and carries across every hall page (shell.js runs on all
|
|
401
|
-
// of them).
|
|
402
|
-
//
|
|
403
|
-
// the lowercased group label, so a regroup renames the key and a group reverts
|
|
420
|
+
// of them). Every group is labeled (task 1005071), so every group gets a toggle.
|
|
421
|
+
// Keys are the group label, lowercased and hyphenated, so a regroup renames the key and a group reverts
|
|
404
422
|
// to expanded once — acceptable for a cosmetic preference.
|
|
405
423
|
var NAV_COLLAPSE_KEY = 'hall-nav-collapsed';
|
|
406
424
|
|
|
@@ -433,7 +451,8 @@
|
|
|
433
451
|
// source renderFoot() uses, so the core carries no hardcoded identity.
|
|
434
452
|
var platformName = (brand.identity && (brand.identity.productName || brand.identity.worldName)) || 'projects';
|
|
435
453
|
var groups = NAV.map(function (g) {
|
|
436
|
-
|
|
454
|
+
// A label can have spaces ('Run the project'); an id cannot, or aria-controls breaks.
|
|
455
|
+
var groupId = g.group ? g.group.toLowerCase().replace(/\s+/g, '-') : '';
|
|
437
456
|
var collapsible = !!g.group;
|
|
438
457
|
var collapsed = collapsible && isGroupCollapsed(groupId);
|
|
439
458
|
var items = g.items.map(function (it) {
|
|
@@ -230,8 +230,8 @@
|
|
|
230
230
|
|
|
231
231
|
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
232
232
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
233
|
-
<script src="/builders/craft-mode.js?v=2026-11-
|
|
234
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
233
|
+
<script src="/builders/craft-mode.js?v=2026-11-05-sections"></script>
|
|
234
|
+
<script src="/builders/shell.js?v=2026-11-05-sections"></script>
|
|
235
235
|
<script src="/builders/palette.js" defer></script>
|
|
236
236
|
<script src="/builders/gov-living.js?v=2026-10-09-positions1"></script>
|
|
237
237
|
<script src="/builders/gov-feeds.js?v=2026-10-09-living3"></script>
|
|
@@ -224,8 +224,8 @@
|
|
|
224
224
|
|
|
225
225
|
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
226
226
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
227
|
-
<script src="/builders/craft-mode.js?v=2026-11-
|
|
228
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
227
|
+
<script src="/builders/craft-mode.js?v=2026-11-05-sections"></script>
|
|
228
|
+
<script src="/builders/shell.js?v=2026-11-05-sections"></script>
|
|
229
229
|
<script src="/builders/palette.js" defer></script>
|
|
230
230
|
<!-- The kit, for its ONE renderer: the full-size ship-time visual figure
|
|
231
231
|
(task 1003829), which the older reviews still show. -->
|
|
@@ -58,8 +58,8 @@
|
|
|
58
58
|
time so the chrome exists before the deferred page scripts execute. -->
|
|
59
59
|
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
60
60
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
61
|
-
<script src="/builders/craft-mode.js?v=2026-11-
|
|
62
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
61
|
+
<script src="/builders/craft-mode.js?v=2026-11-05-sections"></script>
|
|
62
|
+
<script src="/builders/shell.js?v=2026-11-05-sections"></script>
|
|
63
63
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
64
64
|
<script src="/builders/palette.js" defer></script>
|
|
65
65
|
<!-- task-detail.js still owns the #/idea/N and #/blocker/N deep-link overlay
|
|
@@ -140,8 +140,8 @@
|
|
|
140
140
|
|
|
141
141
|
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
142
142
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
143
|
-
<script src="/builders/craft-mode.js?v=2026-11-
|
|
144
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
143
|
+
<script src="/builders/craft-mode.js?v=2026-11-05-sections"></script>
|
|
144
|
+
<script src="/builders/shell.js?v=2026-11-05-sections"></script>
|
|
145
145
|
<script src="/builders/palette.js" defer></script>
|
|
146
146
|
|
|
147
147
|
<script src="/builders/idea-objects.js?v=2026-09-27-split"></script>
|
|
@@ -144,8 +144,8 @@
|
|
|
144
144
|
|
|
145
145
|
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
146
146
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
147
|
-
<script src="/builders/craft-mode.js?v=2026-11-
|
|
148
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
147
|
+
<script src="/builders/craft-mode.js?v=2026-11-05-sections"></script>
|
|
148
|
+
<script src="/builders/shell.js?v=2026-11-05-sections"></script>
|
|
149
149
|
<script src="/builders/palette.js" defer></script>
|
|
150
150
|
<script src="/builders/brand-holes.js?v=2026-09-29-aqfix"></script>
|
|
151
151
|
<script src="/builders/tweak-editor-lib.js?v=2026-09-29-tw27"></script>
|