eleven / ocho Public

status: milestones.html — the story of the build, linked off the prompt ledger (#966)

A curated timeline of the key moments (day one, TestFlight, the Mac app,
self-serve spaces, billing, the registry itself…), each entry deep-linking
the ledger session it happened in via prompts.html#s=<id>. Static and
hand-appended by design — never generated. Milestones whose sessions the
registry withholds (security) keep their date and moment, without a link,
with the reason shown.

Not in the shared status nav: it's a sub-page of the prompt ledger, linked
from the ledger's home view.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Paul Campbell b6fde7fa3a83a1819c954ecb5b358e5757b659df parent 6ef8a37
3 files changed, +187 −2
  • docs/status.md +6 −2
  • web/status/milestones.html +177 −0
  • web/status/prompts.html +4 −0
diff --git a/docs/status.md b/docs/status.md
index 6961133..395a73a 100644
--- a/docs/status.md
+++ b/docs/status.md
@@ -69,10 +69,14 @@ public *ledger* repo is still roadmap — see `docs/planet-scale.md`).
Pieces: generator `deploy/status-publish.sh` (box timer, mirrors
`deploy/fleet-backup.sh`), viewer pages `web/status/`, bucket + IAM
-`infra/prod/status.tf`, contract test `test/status-contract.test.mjs`. All eight
+`infra/prod/status.tf`, contract test `test/status-contract.test.mjs`. All the
pages share one stylesheet, `web/status/status.css` — the design tokens, the
brand masthead, the eight-item nav that steps through every dashboard, and the
-common components (tiles, bar lists, notes, footer). Each page keeps only a
+common components (tiles, bar lists, notes, footer). (`milestones.html` — the
+curated timeline of key moments, each entry deep-linking its ledger session
+via `prompts.html#s=<id>` — is deliberately *not* in the nav: it's a sub-page
+of the prompt ledger, linked from the ledger's home view, hand-appended as
+moments land and never generated.) Each page keeps only a
small inline `<style>` for its own bits. It's same-origin in the status bucket
(no third-party request — the privacy line holds), and the publish script
uploads it *before* the pages so a page is never served ahead of its styles.
diff --git a/web/status/milestones.html b/web/status/milestones.html
new file mode 100644
index 0000000..c3eef80
--- /dev/null
+++ b/web/status/milestones.html
@@ -0,0 +1,177 @@
+<!-- 🤖 Milestones: the key moments of building Eleven, drawn from the prompt
+ registry (prompts.html) — a curated, editorial timeline, each entry linking
+ to the ledger session where it happened (./prompts.html#s=<id>). Static by
+ design: the list is hand-kept, appended as moments land, never generated.
+ Fully self-contained: inline CSS, no JS, no external requests. -->
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8" />
+<meta name="viewport" content="width=device-width, initial-scale=1" />
+<meta name="color-scheme" content="light dark" />
+<title>Eleven — milestones</title>
+<link rel="icon" type="image/png" href="./icon-192.png" />
+<link rel="stylesheet" href="./status.css" />
+<style>
+ /* Milestones-only styles; tokens, reset, masthead and the shared nav live
+ in status.css. A plain vertical timeline — dots on a rail, one entry per
+ key moment. */
+ a:focus-visible { outline: 2px solid var(--series); outline-offset: 2px; border-radius: 4px; }
+ h1 { font-size: 1.5rem; margin: 8px 0 4px; }
+ .sub, .meta { color: var(--ink-2); font-size: 0.9rem; }
+ ol.timeline { list-style: none; padding: 0; margin: 24px 0; position: relative; }
+ ol.timeline::before {
+ content: ""; position: absolute; left: 7px; top: 6px; bottom: 6px;
+ width: 2px; background: var(--grid);
+ }
+ ol.timeline li { position: relative; padding: 0 0 26px 32px; }
+ ol.timeline li::before {
+ content: ""; position: absolute; left: 1px; top: 5px; width: 10px; height: 10px;
+ border-radius: 50%; background: var(--series); border: 2px solid var(--surface);
+ }
+ ol.timeline li.withheld::before { background: var(--surface); border: 2px solid var(--ink-2); }
+ .when { color: var(--ink-2); font-size: 0.85rem; white-space: nowrap; }
+ ol.timeline h2 { font-size: 1.05rem; margin: 2px 0 4px; }
+ ol.timeline p { margin: 0 0 4px; }
+ .withheld-note { color: var(--ink-2); font-size: 0.85rem; font-style: italic; }
+</style>
+</head>
+<body>
+<div class="wrap">
+ <header>
+ <img src="./icon-192.png" alt="" />
+ <div>
+ <p class="brand">Eleven Messenger</p>
+ <h1>Milestones</h1>
+ </div>
+ </header>
+ <nav class="status-nav" aria-label="Status">
+ <a href="./index.html">Fleet</a>
+ <a href="./books.html">Income &amp; Expenditure</a>
+ <a href="./economics.html">Economics</a>
+ <a href="./security.html">Security</a>
+ <a href="./carbon.html">Carbon use</a>
+ <a href="./contributors.html">Contributors</a>
+ <a href="./prompts.html">Prompt Ledger</a>
+ <a href="./ssh.html">Access Ledger</a>
+ </nav>
+
+ <p class="sub">🤖 The key moments of building Eleven, drawn from the
+ <a href="./prompts.html">prompt registry</a> — the story, where the ledger is
+ the log. Each milestone links to the actual working session it happened in,
+ transcript and all. The two entries without a link landed in sessions the
+ registry withholds whole (its security rule — a credential can be redacted,
+ but a narrative that maps the defences cannot); they stay on this list with
+ their dates, because the moment is public even where the session is not.</p>
+
+ <ol class="timeline">
+ <li>
+ <span class="when">27 June 2026</span>
+ <h2>Day one</h2>
+ <p>The first commit: an end-to-end encrypted group chat, private from the
+ first line of code. The ledger's oldest surviving session is from this
+ same day — the record starts where the project does.</p>
+ <a href="./prompts.html#s=d44f1f0e-f363-48f3-a231-7faeba75a1aa" aria-label="Read the session behind: Day one">read the session →</a>
+ </li>
+ <li>
+ <span class="when">30 June 2026</span>
+ <h2>The encryption, explained</h2>
+ <p>The lock-and-key model written up for the first curious reader — at a
+ beginner level and an expert level, because both deserve a straight answer.</p>
+ <a href="./prompts.html#s=8ae123e4-7fed-4d0b-b58a-af0c51274c87" aria-label="Read the session behind: The encryption, explained">read the session →</a>
+ </li>
+ <li>
+ <span class="when">1 July 2026</span>
+ <h2>The house agents move in</h2>
+ <p>Claude, Eleven and the Announcer arrive as built-in members — welcome
+ messages, release notes and a helper that lives in the chat.</p>
+ <a href="./prompts.html#s=74557005-7c9f-42fb-82ea-da6bd2fcd499" aria-label="Read the session behind: The house agents move in">read the session →</a>
+ </li>
+ <li>
+ <span class="when">3 July 2026</span>
+ <h2>The iPhone app reaches TestFlight</h2>
+ <p>The first native iOS build goes up for testers, under the new Eleven
+ Messenger developer account.</p>
+ <a href="./prompts.html#s=d1e75cd1-160a-4e0f-934f-edd4f4bf46ec" aria-label="Read the session behind: The iPhone app reaches TestFlight">read the session →</a>
+ </li>
+ <li>
+ <span class="when">4 July 2026</span>
+ <h2>Choosing our own ground</h2>
+ <p>The search for a home off the hosting platform begins; a day later the
+ whole fleet was serving from a self-managed box — one router, one binary
+ per space.</p>
+ <a href="./prompts.html#s=ef26d8bc-b5ac-4781-b84d-df34dfb3b7cf" aria-label="Read the session behind: Choosing our own ground">read the session →</a>
+ </li>
+ <li>
+ <span class="when">5 July 2026</span>
+ <h2>The Mac app ships</h2>
+ <p>A signed, notarised DMG with the classic drag-to-Applications install —
+ and auto-updates from the first release.</p>
+ <a href="./prompts.html#s=cb607682-6c32-44f8-83c5-7fc4b4cfd899" aria-label="Read the session behind: The Mac app ships">read the session →</a>
+ </li>
+ <li>
+ <span class="when">5 July 2026</span>
+ <h2>Preparing the open beta</h2>
+ <p>TestFlight's open beta is set up and the app readied for Apple review.</p>
+ <a href="./prompts.html#s=e931af25-e90b-4b9f-89d6-64977305c2d9" aria-label="Read the session behind: Preparing the open beta">read the session →</a>
+ </li>
+ <li>
+ <span class="when">7 July 2026</span>
+ <h2>Spaces go self-serve</h2>
+ <p>Sign in with a passkey, press one button, get a space of your own —
+ no operator in the loop, ready before the page finishes loading.</p>
+ <a href="./prompts.html#s=2b5a13fd-1393-47c7-b00c-c5980dadc9f5" aria-label="Read the session behind: Spaces go self-serve">read the session →</a>
+ </li>
+ <li>
+ <span class="when">9 July 2026</span>
+ <h2>The fleet updates itself</h2>
+ <p>Signed release channels arrive: every space follows edge, beta or
+ stable on its own, hourly, with no hands on the wheel.</p>
+ <a href="./prompts.html#s=28b38705-1b54-40a9-b569-f796278bb428" aria-label="Read the session behind: The fleet updates itself">read the session →</a>
+ </li>
+ <li class="withheld">
+ <span class="when">11 July 2026</span>
+ <h2>Billing goes live</h2>
+ <p>Paid plans arrive — Stripe checkout, self-serve manage and cancel.</p>
+ <p class="withheld-note">session withheld: security</p>
+ </li>
+ <li>
+ <span class="when">11 July 2026</span>
+ <h2>The transparency ledgers begin</h2>
+ <p>The carbon tally and the contributor index go public — the first of the
+ open ledgers this page belongs to.</p>
+ <a href="./prompts.html#s=0e6d3bef-e7a3-49bb-ac6c-652df491b79c" aria-label="Read the session behind: The transparency ledgers begin">read the session →</a>
+ </li>
+ <li class="withheld">
+ <span class="when">12 July 2026</span>
+ <h2>The registry publishes itself</h2>
+ <p>Every AI session behind Eleven goes on the public record, credentials
+ redacted and annotated in place. Its own build session is withheld — the
+ security rule applies to the registry too.</p>
+ <p class="withheld-note">session withheld: security</p>
+ </li>
+ <li>
+ <span class="when">13 July 2026</span>
+ <h2>The beta opens to everyone</h2>
+ <p>Apple approves the external TestFlight group — the first testers from
+ outside the team arrive.</p>
+ <a href="./prompts.html#s=2a20be96-8b30-4717-8191-1ce62dac7f83" aria-label="Read the session behind: The beta opens to everyone">read the session →</a>
+ </li>
+ <li>
+ <span class="when">14 July 2026</span>
+ <h2>Writing gets rich</h2>
+ <p>CommonMark lands across web, Mac and iPhone — bold, italics, quotes and
+ code in every composer, the same on every platform.</p>
+ <a href="./prompts.html#s=53cfffdd-5431-4d08-82e8-915fa7b7c209" aria-label="Read the session behind: Writing gets rich">read the session →</a>
+ </li>
+ </ol>
+
+ <footer>
+ <p>🤖 This timeline is curated by hand and appended as moments land — the
+ <a href="./prompts.html">prompt registry</a> stays the complete record. A
+ milestone's date is the date of its session; where a session is withheld,
+ the date and the moment publish without the transcript.</p>
+ </footer>
+</div>
+</body>
+</html>
diff --git a/web/status/prompts.html b/web/status/prompts.html
index 77895ff..85b25d0 100644
--- a/web/status/prompts.html
+++ b/web/status/prompts.html
@@ -167,6 +167,10 @@
<div class="card totals" id="totals" aria-live="polite"></div>
+ <p class="meta">🤖 Prefer the story to the log? <a href="./milestones.html">Milestones</a>
+ — the key moments of building Eleven, each linked to the session where it
+ happened.</p>
+
<h2>Sessions</h2>
<p class="meta">Local transcripts prune after roughly a week, so the registry accrues
from each run of <code>tools/prompt-registry.mjs</code> forward; sessions that pruned