diff --git a/reports/test-audit/test-integrity-note-2026-09-27-portable-kernel.yaml b/reports/test-audit/test-integrity-note-2026-09-27-portable-kernel.yaml index 163b75c..b568207 100644 --- a/reports/test-audit/test-integrity-note-2026-09-27-portable-kernel.yaml +++ b/reports/test-audit/test-integrity-note-2026-09-27-portable-kernel.yaml @@ -1,6 +1,7 @@ test_integrity_note: change_type: - new_tests + - spec_correction scenarios: - id: SCN-init-read-only given: a normal Git repository with committed project files @@ -217,7 +218,7 @@ test_integrity_note: - id: SCN-product-site given: the redesigned TORCH public surface when: its product story and local-console boundary are inspected - then: it explains project-derived fleets, exact-commit routing, honest open gates, and measured context claims without obsolete product language + then: it explains project-derived fleets, exact-commit routing, honest open gates, and measured context claims without obsolete product language, and onboarding uses the installed public launcher rather than source-checkout internals - id: SCN-architecture-decisions given: the ten implementation decisions required by the portable Fleet specification when: the repository architecture ledger is inspected diff --git a/site/app.js b/site/app.js index 883f791..c3eaab8 100644 --- a/site/app.js +++ b/site/app.js @@ -33,26 +33,46 @@ routeButton?.addEventListener('click', () => { const commands = { both: [ - 'node bin/torch.mjs bootstrap \\', + 'torch bootstrap \\', ' --repo /path/to/project \\', ' --spec /path/to/product-spec.md \\', ' --output fleet-design-brief.json \\', ' --json', ].join('\n'), repo: [ - 'node bin/torch.mjs bootstrap \\', + 'torch bootstrap \\', ' --repo /path/to/project \\', ' --output fleet-design-brief.json \\', ' --json', ].join('\n'), }; const command = document.querySelector('#start-command'); -document.querySelectorAll('[data-command]').forEach((button) => button.addEventListener('click', () => { - document.querySelectorAll('[data-command]').forEach((tab) => tab.setAttribute('aria-selected', String(tab === button))); +const commandTabs = [...document.querySelectorAll('[data-command]')]; +function selectCommand(button) { + commandTabs.forEach((tab) => { + tab.setAttribute('aria-selected', String(tab === button)); + tab.tabIndex = tab === button ? 0 : -1; + }); command.textContent = commands[button.dataset.command]; -})); + command.setAttribute('aria-labelledby', button.id); +} +commandTabs.forEach((button, buttonIndex) => { + button.addEventListener('click', () => selectCommand(button)); + button.addEventListener('keydown', (event) => { + if (!['ArrowLeft', 'ArrowRight'].includes(event.key)) return; + event.preventDefault(); + const offset = event.key === 'ArrowRight' ? 1 : -1; + const target = commandTabs[(buttonIndex + offset + commandTabs.length) % commandTabs.length]; + selectCommand(target); + target.focus(); + }); +}); document.querySelector('#copy-command')?.addEventListener('click', async (event) => { - await navigator.clipboard.writeText(command.textContent); - event.currentTarget.textContent = 'Copied'; + try { + await navigator.clipboard.writeText(command.textContent); + event.currentTarget.textContent = 'Copied'; + } catch { + event.currentTarget.textContent = 'Copy unavailable'; + } setTimeout(() => { event.currentTarget.textContent = 'Copy command'; }, 1500); }); diff --git a/site/index.html b/site/index.html index c60d2a1..31589bc 100644 --- a/site/index.html +++ b/site/index.html @@ -34,7 +34,7 @@
Request CR-184
+Example fleet ยท Request CR-184
node bin/torch.mjs bootstrap \
+ torch bootstrap \
--repo /path/to/project \
--spec /path/to/product-spec.md \
--output fleet-design-brief.json \
diff --git a/site/styles.css b/site/styles.css
index 403d8ea..24cdfa6 100644
--- a/site/styles.css
+++ b/site/styles.css
@@ -154,14 +154,16 @@ footer div { display: flex; gap: 1.5rem; }
@media (max-width: 600px) {
body { font-size: 16px; }
- .masthead { padding-block: 1rem; align-items: flex-start; }
- nav { display: grid; grid-template-columns: 1fr 1fr; gap: .4rem 1rem; }
+ .masthead { padding-block: 1rem; align-items: stretch; flex-direction: column; gap: 1rem; }
+ nav { display: grid; grid-template-columns: 1fr 1fr; gap: .4rem 1.5rem; font-size: .95rem; }
.hero { padding-top: 4rem; }
h1 { font-size: clamp(3rem, 13vw, 5.2rem); }
.hero-actions, footer { align-items: flex-start; flex-direction: column; }
.peer { display: none; }
.ledger-row { grid-template-columns: 1fr; gap: .25rem; }
.ledger-head { display: none; }
+ .ledger-row > [data-label]::before { content: attr(data-label) ": "; color: var(--muted); font-weight: 500; }
+ .ledger-row > [data-label="Capability"]::before { content: ""; }
.context-diagram { grid-template-columns: 1fr; }
.versus { writing-mode: initial; text-align: center; }
.console-summary, .console-grid, .agent-list { grid-template-columns: 1fr; }
diff --git a/test/fleet/product-surface.test.mjs b/test/fleet/product-surface.test.mjs
index 1f8b9ab..6fe254f 100644
--- a/test/fleet/product-surface.test.mjs
+++ b/test/fleet/product-surface.test.mjs
@@ -31,7 +31,10 @@ test('SCN-product-site: public surface explains the portable fleet and separates
assert.match(html, /Exact-commit checks/);
assert.match(html, /Live gate open/);
assert.match(html, /Context savings are a measured hypothesis/);
- assert.match(html, /torch\.mjs bootstrap/);
+ assert.match(html, /torch bootstrap/);
+ assert.doesNotMatch(html, /node bin\/torch\.mjs/);
+ assert.match(html, /Isolated build \+ activation/);
+ assert.match(html, /data-label="Evidence"/);
assert.match(html, /manager can propose another specialist[\s\S]*owner approval/i);
assert.doesNotMatch(html, /nostr|relay coordination|task lock/i);
assert.match(consoleHtml, /Local Fleet Console/);