From 0fde7e493bce246df3a1dcc45f5e2e28e1d1a06c Mon Sep 17 00:00:00 2001 From: Jonathan Hvid Date: Tue, 12 May 2026 11:45:27 +0200 Subject: [PATCH] =?UTF-8?q?chore(seed):=20/roadmap=20demo=20=E2=80=94=209?= =?UTF-8?q?=20items=20spanning=20shipping=20=E2=86=92=20considering?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces the 7-item roadmap seed with the 9-item layout from the v5 spec. Distribution: 3 shipping → 1 in_beta → 3 exploring → 2 considering. travelledStop computes to (2 + 0.5) / 9 ≈ 0.28, so the route gradient visibly reads as 'travelled-then-ahead' rather than one solid tone. Each item gets a target string and either a metadata_text (8 of 9) or a fresh attribution (the one without metadata_text, 'Multi-tenant isolation', attributed to Camilla — so the route card surfaces the 'Shaped by Camilla' trailing line via the fallback path). metadata_text varies across the spec'd cues — 'Shaped by Lars in our March session' / 'Pilot-tested with Mette's team' / 'Builds on traceability layer' / 'Request beta access →' / '2 council requests' / 'Open question on key custody' / 'Council input wanted' / 'Long-term direction'. Attribution coverage now spans 6 of the 7 cab members so multiple 'Shaped by ...' trailers exist if metadata_text were ever cleared. The first three shipping items get realistic shipped_at backdates (-21 / -7 / -1 days) so the 'most recent shipping' detection lands on 'Audit log export' — which becomes the pulsed 'you are here' dot on the route. Smoke as Lars: /roadmap header reads 'What we are building.', LatestDispatchBanner shows the deprioritising-public-cloud decision, all nine route titles render, metadata_text trailing lines present in the DOM, .rr-current marker on the most recent shipping milestone. Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/settings.local.json | 3 ++- scripts/seed-demo.js | 29 +++++++++++++++++------------ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 1b31df2..5d46556 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -44,7 +44,8 @@ "Bash(curl -s -b /tmp/jar.txt http://localhost:4321/dispatches/1-we-are-deprioritising-public-cloud-parity-for-q3)", "Bash(pnpm db:seed)", "Bash(curl -s -c /tmp/jar.txt -d \"email=lars@virk2.dk&password=cab123\" http://localhost:4321/login -o /dev/null -i)", - "Bash(curl -s -c /tmp/jar.txt -d \"email=lars@virk2.dk&password=cab123\" http://localhost:4321/login -o /dev/null)" + "Bash(curl -s -c /tmp/jar.txt -d \"email=lars@virk2.dk&password=cab123\" http://localhost:4321/login -o /dev/null)", + "Bash(curl -s -b /tmp/jar.txt http://localhost:4321/roadmap)" ] } } diff --git a/scripts/seed-demo.js b/scripts/seed-demo.js index 9676b76..ecb8c4e 100644 --- a/scripts/seed-demo.js +++ b/scripts/seed-demo.js @@ -195,24 +195,29 @@ 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: 7 items spanning shipping → considering, admin-ordered ── +// ── Roadmap: 9 items spanning the full timeline, admin-ordered ────── +// 3 shipping → 1 in_beta → 3 exploring → 2 considering. travelledStop +// lands at (2 + 0.5) / 9 ≈ 0.28 — the route's gradient reads as +// 'travelled-then-ahead' instead of one solid tone. const roadmap = [ - { 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: [] }, + { title: 'Traceability layer', description: 'Every response cites its sources with structured provenance.', status: 'shipping', target: 'Live now', display_order: 1, shipped_at: nowIso(-21 * 24 * 3600), attributed: [cabs[0].id], metadata_text: 'Shaped by Lars in our March session' }, + { title: 'Document ingestion', description: 'Upload PDF, Word, plain text. Chunked, indexed, retrievable.', status: 'shipping', target: 'Late May', display_order: 2, shipped_at: nowIso(-7 * 24 * 3600), attributed: [cabs[1].id, cabs[2].id], metadata_text: "Pilot-tested with Mette's team" }, + { title: 'Audit log export', description: 'One-click export of every model call, source, and reviewer action.', status: 'shipping', target: 'Next week', display_order: 3, shipped_at: nowIso(-1 * 24 * 3600), attributed: [cabs[3].id], metadata_text: 'Builds on traceability layer' }, + { title: 'Agentic query mode', description: 'Multi-step retrieval and synthesis with full provenance.', status: 'in_beta', target: 'July', display_order: 4, shipped_at: null, attributed: [cabs[1].id], metadata_text: 'Request beta access →' }, + { title: 'Contextual memory', description: 'The system learns the regulatory and organisational context over time.', status: 'exploring', target: 'Q3 2026', display_order: 5, shipped_at: null, attributed: [cabs[3].id], metadata_text: '2 council requests' }, + { title: 'Multi-organisation graphs', description: 'Cross-tenant graph queries with strict permission scoping.', status: 'exploring', target: 'Q3 2026', display_order: 6, shipped_at: null, attributed: [cabs[4].id], metadata_text: 'Open question on key custody' }, + { title: 'Multi-tenant isolation', description: 'Strict per-organisation data boundaries for shared deployments.', status: 'exploring', target: 'Q4 2026', display_order: 7, shipped_at: null, attributed: [cabs[5].id], metadata_text: null }, + { title: 'Federated learning hooks', description: 'Train shared models across council members without moving data.', status: 'considering', target: '2027', display_order: 8, shipped_at: null, attributed: [], metadata_text: 'Council input wanted' }, + { title: 'Open evaluation framework', description: 'A public benchmark suite for sovereign AI deployments.', status: 'considering', target: '2027', display_order: 9, shipped_at: null, attributed: [], metadata_text: 'Long-term direction' }, ]; const insertRoad = db.prepare(` - INSERT INTO roadmap_items (title, description, status, target, display_order, shipped_at) - VALUES (?,?,?,?,?,?) + INSERT INTO roadmap_items (title, description, status, target, display_order, shipped_at, metadata_text) + VALUES (?,?,?,?,?,?,?) `); const insertAttr = db.prepare('INSERT INTO roadmap_attributions (roadmap_item_id, user_id) VALUES (?,?)'); for (const r of roadmap) { - const id = Number(insertRoad.run(r.title, r.description, r.status, r.target, r.display_order, r.shipped_at).lastInsertRowid); + const id = Number(insertRoad.run(r.title, r.description, r.status, r.target, r.display_order, r.shipped_at, r.metadata_text).lastInsertRowid); for (const uid of r.attributed) insertAttr.run(id, uid); } @@ -370,7 +375,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 ${cabs.length} voted`); -console.log(' roadmap: 7 items (2 shipping / 1 in_beta / 2 exploring / 2 considering)'); +console.log(' roadmap: 9 items (3 shipping / 1 in_beta / 3 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');