From cde98f945472f34b49ed70e4bafa71ab2b38a876 Mon Sep 17 00:00:00 2001 From: Jonathan Hvid Date: Tue, 12 May 2026 10:58:34 +0200 Subject: [PATCH] feat(pulse): spacing pass + council section header + 7-item roadmap seed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Spacing — explicit per-section margins on /pulse rather than a single gap. Page is padding: 40px 36px 80px now. Transitions match the spec: greeting ─ 48px ─ below nav greeting ─ 56px ─ hero hero ─ 18px ─ also coming up (intentionally tight; related) also ─ 72px ─ editorial row editorial ─ 72px ─ roadmap roadmap ─ 72px ─ council The hero, editorial, roadmap and council transitions all sit at 72px so the page reads as four distinct registers rather than a slab stack. The hero → also-coming-up gap stays deliberately tight at 18px because the two are a pair (the strip is the lighter outro to the indigo card). Council section restructured to match the roadmap carousel framing: - Outer card chrome dropped — no more single white surface wrapping the grid. Section is just a header row + a 4-column grid of tiles. - Header row: 22px serif 'The council' on the left, 11px terracotta tracked uppercase 'See who our council is made up of →' on the right. Same pattern as the roadmap header. - Tiles: 38px avatar (down from 56), 15px serif name, 11px title, 10px tracked organisation. No background, no border. 24px grid gap. - First 4 members render; if more, a 5th tile replaces the would-be fifth member with a right-aligned 'See all N council members →' link. With the current 4-member seed this case isn't exercised but the branch is in place for when the council grows. - 2-up on tablets, 1-up below 520px. Seed update: roadmap now has 7 items spanning all four statuses (2 shipping / 1 in_beta / 2 exploring / 2 considering) ordered by display_order 1..7. Traceability layer carries the 'Shaped by Lars' attribution; Agentic query mode is attributed to Anna; Contextual memory to Henriette. The rest are unattributed so the attribution trailer's hidden case is exercised too. With 7 items the carousel arrows engage and the right-edge fade is visible at start. Co-Authored-By: Claude Opus 4.7 (1M context) --- scripts/seed-demo.js | 15 +++-- src/pages/pulse.astro | 128 +++++++++++++++++++++++++++++++----------- 2 files changed, 103 insertions(+), 40 deletions(-) diff --git a/scripts/seed-demo.js b/scripts/seed-demo.js index aeab873..a73d996 100644 --- a/scripts/seed-demo.js +++ b/scripts/seed-demo.js @@ -169,12 +169,15 @@ db.prepare('INSERT INTO votes (pulse_id, user_id, option_index, voted_at) VALUES db.prepare('INSERT INTO votes (pulse_id, user_id, option_index, voted_at) VALUES (?,?,?,?)') .run(decisionPulseId, cabs[1].id, 1, nowIso(-30 * 60)); -// ── Roadmap: 1 shipping / 1 beta / 2 exploring, attributions ─────── +// ── Roadmap: 7 items spanning shipping → considering, admin-ordered ── const roadmap = [ - { title: 'Traceability layer', description: 'Every response cites its sources with structured provenance.', status: 'shipping', target: 'Live now', display_order: 10, shipped_at: nowIso(-2 * 24 * 3600), attributed: [cabs[0].id] }, - { title: 'Document ingestion pipeline', description: 'Upload PDF, Word, plain text. Chunked, indexed, retrievable.', status: 'beta', target: null, display_order: 10, shipped_at: null, attributed: [cabs[1].id, cabs[2].id] }, - { title: 'Contextual memory', description: 'The system learns the regulatory and organisational context over time.', status: 'exploring', target: 'Q3 2026', display_order: 10, shipped_at: null, attributed: [cabs[3].id] }, - { title: 'Agentic query mode', description: 'Multi-step retrieval and synthesis with full provenance.', status: 'exploring', target: 'Q4 2026', display_order: 20, shipped_at: null, attributed: [] }, + { title: 'Traceability layer', description: 'Every response cites its sources with structured provenance.', status: 'shipping', target: 'Live now', display_order: 1, shipped_at: nowIso(-2 * 24 * 3600), attributed: [cabs[0].id] }, + { title: 'Audit log export', description: 'One-click export of every model call, source, and reviewer action.', status: 'shipping', target: 'Next week', display_order: 2, shipped_at: nowIso(-1 * 24 * 3600), attributed: [] }, + { title: 'Agentic query mode', description: 'Multi-step retrieval and synthesis with full provenance.', status: 'in_beta', target: 'July', display_order: 3, shipped_at: null, attributed: [cabs[1].id] }, + { title: 'Contextual memory', description: 'The system learns the regulatory and organisational context over time.', status: 'exploring', target: 'Q3 2026', display_order: 4, shipped_at: null, attributed: [cabs[3].id] }, + { title: 'Multi-tenant isolation', description: 'Strict per-organisation data boundaries for shared deployments.', status: 'exploring', target: 'Q4 2026', display_order: 5, shipped_at: null, attributed: [] }, + { title: 'Federated learning hooks', description: 'Train shared models across council members without moving data.', status: 'considering', target: '2027', display_order: 6, shipped_at: null, attributed: [] }, + { title: 'Open evaluation framework', description: 'A public benchmark suite for sovereign AI deployments.', status: 'considering', target: '2027', display_order: 7, shipped_at: null, attributed: [] }, ]; const insertRoad = db.prepare(` @@ -341,7 +344,7 @@ insertActivity.run(cabs[1].id,'voted', 'pulse', decisionPulseId, no insertActivity.run(cabs[0].id,'rsvped', 'event', db.prepare("SELECT id FROM events WHERE slug = ?").get(dinnerSlug).id, nowIso(-8 * 3600)); console.log(' pulse #' + decisionPulseId + ' open, 2 of 4 voted'); -console.log(' roadmap: 1 shipping / 1 beta / 2 exploring'); +console.log(' roadmap: 7 items (2 shipping / 1 in_beta / 2 exploring / 2 considering)'); console.log(' contributions: 3 (most recent has 3 reactions)'); console.log(' dispatches: 4 published (2/5/9/12 days ago)'); console.log(' events: dinner + studio hours + working session, 2 past'); diff --git a/src/pages/pulse.astro b/src/pages/pulse.astro index efbdc62..17696da 100644 --- a/src/pages/pulse.astro +++ b/src/pages/pulse.astro @@ -227,27 +227,38 @@ const members = getAllCabMembers(); {roadmapItems.length > 0 && ( -
+
)} - + {members.length > 0 && (
+
+

The council

+ See who our council is made up of → +
+
    - {members.map(m => ( -
  • - -
    - {m.name} - {m.title && {m.title}} - {m.organisation} + {members.slice(0, 4).map(m => ( +
  • + +
    + {m.name} + {m.title && {m.title}} + {m.organisation}
  • ))} + {members.length > 4 && ( +
  • + + See all {members.length} council members → + +
  • + )}
- See who our council is made up of
)} @@ -256,14 +267,22 @@ const members = getAllCabMembers();