diff --git a/BUILD-NOTES.md b/BUILD-NOTES.md index de06fc8..04f67cb 100644 --- a/BUILD-NOTES.md +++ b/BUILD-NOTES.md @@ -507,3 +507,61 @@ of 578 rules with the same at-rule nesting, and only those four change position. resolved cascade moves — the qualified selectors already won on specificity — only the order the file reads in. `noSvgWithoutTitle` is fixed with a real `` in each logo; both render through `<img alt="">`, so the title serves anyone who opens the file on its own. + +## 2026-09-06 — Approved five-template visual revamp (review branch) + +This branch integrates five designs selected after a side-by-side review. It does not alter routes, +slugs, categories, template types, slots, CSP, migrations or runtime behavior: + +- `proposal.html`: **Decision Spine (A)** — approved source SHA-256 + `410f6432ae72556ff5f234b7ca682bb06fadb18ab9ff684827cdc5b59e64fdd5`. +- `project-plan.html`: **Phase & gate map (A)** — approved source SHA-256 + `731edb7f5e6c8d4fdce7b6b6ef9c37279affacd42a278f12caf312930775c143`. +- `checklist.html`: **Gate Ledger (A)** — approved source SHA-256 + `11af6b493836d125e2f5f30fb67b637332f4aad90e9d8c5de061d2c6f5d6675f`. +- `service-health.html`: **Budget accounting board (A)** — approved source SHA-256 + `994adadd14891263c23e61a0a8912b16608307abc4ccac1c31a3d4cb5d93f1a8`. +- `report.html`: **Briefing Broadsheet (B)** — approved source SHA-256 + `05f82a6a39026c7570a6b7df523ef01d77bc10ba4401c75581df08a851f2baac`. + +The listed hashes bind the approved preview inputs. Production preserves their `<style>` and `<body>` +bytes exactly; Proposal, Checklist and Report reuse their previous reader-facing `<title>` text instead +of shipping the preview-only “Alternative A/B” labels. Their resulting canonical SHA-256 values are +`7279fefcd7c01dcca7f214d6d3267ea0d2ca894b59adab53a29a7e694ca1dfdb`, +`19a86a131daeab7e95e34f0d4da358effc9606362e85d03f32359f2e335150b1` and +`2d2222c8596c0560ebb816370b358ca262bde5e6431c52ca47e08f3ee943fa39`. The public frames at the +branch point matched the previous canonical files exactly through `</html>` plus the final newline; +the frame server's appended height reporter is not template source. Proposal's catalog description +is updated because the approved design leads with a dated ask rather than a hero number. Report's +description now names its finding → recommendation → evidence opening instead of the superseded +summary/figures split, and Project plan's now names the phase/gate/dependency ledger rather than +stage cards. Names, slugs, categories, formats and slots are unchanged. + +The gallery crops are also part of the review contract, not an incidental screenshot. Proposal and +Report use a 1280px thumbnail viewport so their signature dated ask and finding/recommendation/ +evidence band appear inside the 16:10 crop. Project plan uses 1440px so the crop includes all four +schedule rows and the today marker without shrinking the ledger to an illegible overview. Checklist +and Service health keep their existing framing. `thumbnail_viewport` changes only the Chromium +canvas used to derive the committed 1000×625 PNG; it does not alter the template source or runtime +frame layout. + +After modifying a template, build browser assets first and regenerate thumbnails with the canonical +tooling: + +```sh +pnpm run build:assets +pnpm run build:template-thumbs +``` + +The generator rewrites every committed thumbnail. Review the working tree and keep only image +changes whose source template or thumbnail framing was intentionally changed. For an additional +full-page review set, use: + +```sh +pnpm run build:template-thumbs -- --review-dir /absolute/review/directory +``` + +Do not hand-edit thumbnail PNGs or treat them as template source. The approved set deliberately +keeps distinct document voices rather than applying one shared dashboard shell: decisions use a +humanist decision spine, plans use phase/gate and readiness-ledger forms, status uses budget +accounting, and research uses an editorial broadsheet. diff --git a/public/assets/template-thumbs/checklist.png b/public/assets/template-thumbs/checklist.png index 62d7d18..2feb0a0 100644 Binary files a/public/assets/template-thumbs/checklist.png and b/public/assets/template-thumbs/checklist.png differ diff --git a/public/assets/template-thumbs/project-plan.png b/public/assets/template-thumbs/project-plan.png index 86f9f7c..a87fc00 100644 Binary files a/public/assets/template-thumbs/project-plan.png and b/public/assets/template-thumbs/project-plan.png differ diff --git a/public/assets/template-thumbs/proposal.png b/public/assets/template-thumbs/proposal.png index 1431581..eae0440 100644 Binary files a/public/assets/template-thumbs/proposal.png and b/public/assets/template-thumbs/proposal.png differ diff --git a/public/assets/template-thumbs/report.png b/public/assets/template-thumbs/report.png index c59ce98..13cc2f1 100644 Binary files a/public/assets/template-thumbs/report.png and b/public/assets/template-thumbs/report.png differ diff --git a/public/assets/template-thumbs/service-health.png b/public/assets/template-thumbs/service-health.png index 043af19..b2766f0 100644 Binary files a/public/assets/template-thumbs/service-health.png and b/public/assets/template-thumbs/service-health.png differ diff --git a/templates/checklist.html b/templates/checklist.html index 9edd30d..35b29be 100644 --- a/templates/checklist.html +++ b/templates/checklist.html @@ -1,278 +1,33 @@ <!doctype html> <html lang="en"> <head> - <meta charset="utf-8" /> - <meta name="viewport" content="width=device-width, initial-scale=1" /> - <title>Atlas API v2 — public beta readiness - - - +body{background:#f1f4f1}.head{padding:50px 0 30px;display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:14px 50px}.head .eyebrow,.head h1,.head .lede,.head .meta{grid-column:1}.head h1{font-size:clamp(2.3rem,5vw,4.4rem);line-height:1;letter-spacing:-.045em;margin-bottom:12px;max-width:15ch}.lede{font-size:1.08rem;line-height:1.62;max-width:60ch}.tally{grid-column:2;grid-row:1/5;background:var(--ink);color:white;padding:24px;align-self:end}.tally .hero{display:flex;align-items:baseline;gap:10px;margin-bottom:24px}.tally .hero b{font:700 4rem/1 Georgia,serif;color:#ef9b65}.tally .hero span{text-transform:uppercase;letter-spacing:.1em;font-size:.68rem;font-weight:800}.tally dl{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:0}.tally dl div{border-top:1px solid #59615d;padding-top:8px}.tally dt{font-size:.65rem;color:#bfc7c2}.tally dd{font-weight:800;margin:0}.meter{grid-column:1/-1;margin-top:12px}.meter-bars{display:flex;height:14px;gap:3px}.meter-legend{display:flex;flex-wrap:wrap;justify-content:space-between;gap:5px 18px;margin-top:5px}.run{min-width:0}.run--ok{flex:18;background:var(--green)}.run--block{flex:4;background:var(--orange)}.run--waive{flex:2;background:var(--waive)}.run__cells{display:none}.run__label{font-size:.68rem;white-space:nowrap;color:var(--muted);margin:0}.run__label .i{margin-right:4px}.meta{font-size:.78rem;color:var(--muted);margin-top:14px;margin-bottom:0} +body>section.wrap{background:#fff;width:min(1180px,calc(100% - 32px));padding:clamp(25px,4vw,48px);margin-bottom:20px}.blockers{margin-top:22px;border-top:3px solid var(--ink)}.blk{display:grid;grid-template-columns:34px minmax(250px,.8fr) 225px minmax(300px,1fr);gap:16px;align-items:start;padding:20px 4px;border-bottom:1px solid var(--line)}.blk>.i{grid-column:1;color:var(--orange);font-size:1.25rem;margin-top:3px}.blk h3{grid-column:2;font-size:1rem;line-height:1.45;margin:0}.blk__meta{grid-column:3;color:var(--orange);font-size:.78rem;font-weight:700;margin:2px 0 0}.blk>p:last-child{grid-column:4;font-size:.9rem;line-height:1.58;margin:0}.blk.setting-date{background:var(--orange-pale);outline:2px solid var(--orange);outline-offset:-2px;padding-inline:18px}.blk.setting-date h3{font-size:1.05rem}.blk.setting-date .blk__meta{color:#723313} +.areas{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));border-top:3px solid var(--ink);margin-top:20px}.area{padding:20px 24px 20px 0;border-bottom:1px solid var(--line)}.area:nth-child(odd){border-right:1px solid var(--line)}.area:nth-child(even){padding-left:24px}.area h3{font-size:.9rem;text-transform:uppercase;letter-spacing:.07em;display:flex;justify-content:space-between}.area h3 span{color:var(--green)}.area ul{list-style:none;padding:0;margin:0;display:grid;gap:7px}.area li{font-size:.875rem;display:flex;gap:8px;align-items:flex-start}.area li .i{color:var(--green);margin-top:.28em}.waived{display:grid;grid-template-columns:1fr 1fr;border-top:3px solid var(--ink)}.wv{padding:22px 24px 8px 0}.wv+.wv{padding-left:24px;border-left:1px solid var(--line)}.wv>.i{color:var(--waive);margin-right:7px}.wv b{font-size:.95rem}.wv p{font-size:.875rem;line-height:1.55;margin:8px 0}.wv .who{color:var(--muted);font-size:.75rem}.foot{padding:14px 0 38px;border-top:1px solid var(--line)} +@media(max-width:940px){.head{grid-template-columns:1fr}.tally{grid-column:1;grid-row:auto}.blk{grid-template-columns:30px 1fr 210px}.blk>p:last-child{grid-column:2/-1}.areas{grid-template-columns:1fr}.area:nth-child(odd){border-right:0}.area:nth-child(even){padding-left:0}} +@media(max-width:620px){.wrap{width:min(100% - 28px,1120px)}.head{padding-top:34px}.head h1{font-size:2.6rem}.tally{margin-inline:-14px}.meter-bars{gap:2px}.meter-legend{justify-content:flex-start;gap:5px 14px}.run__label{white-space:normal;font-size:.62rem}.blk,.blk.setting-date{grid-template-columns:26px 1fr;padding:18px 0}.blk.setting-date{padding-inline:12px}.blk h3,.blk__meta{grid-column:2}.blk>p:last-child{grid-column:1/-1}.waived{grid-template-columns:1fr}.wv+.wv{padding-left:0;border-left:0;border-top:1px solid var(--line)}body>section.wrap{width:100%;margin-bottom:12px;padding:26px 16px}.area{padding-right:0}.foot{padding-inline:0}} + + @@ -287,28 +42,44 @@

Atlas API v2 — public beta

4 blocking

-
Clear
18
-
Waived
2
-
Reviewed
24
+
+
Clear
+
18
+
+
+
Waived
+
2
+
+
+
Reviewed
+
24
+
-
+
- -

4 blocking

-
+ +
- -

2 waived

-
+ +
+
+

18 clear

+

4 blocking

+

2 waived

+
+

Reviewed 4 Sep 2026 by Priya Raman, Sam Oduya and Lena Fischer · next review 11 Sep · the gate is all four blockers closed, not a date @@ -321,7 +92,7 @@

The four that block

Nothing here is waivable. Owner and date on every one.

- +

Rate limiting is not enforced on the v2 gateway

Security · Sam Oduya · due 12 Sep

@@ -329,8 +100,8 @@

Rate limiting is not enforced on the v2 gateway

Reproduced on staging 2 Sep with 4,000 req/min from one key.

-
- +
+

p99 on /v2/search is 840ms against a 400ms target

Performance · Marco Bellini · due 18 Sep

@@ -339,7 +110,7 @@

p99 on /v2/search is 840ms against a 400ms target

- +

No procedure for revoking a leaked beta key

Support · Lena Fischer · due 15 Sep

@@ -348,7 +119,7 @@

No procedure for revoking a leaked beta key

- +

Beta terms have not come back from legal

Legal · R. Achebe · due 11 Sep

@@ -365,46 +136,69 @@

Cleared

Eighteen items, checked against evidence rather than memory.

-

Security 5 of 5

+

Security 5 of 5 +

    -
  • API keys scoped per workspace
  • -
  • Audit log covers every v2 route
  • -
  • Service secrets rotated 12 Jun
  • -
  • CORS allowlist reviewed
  • -
  • Pen test findings closed, 3 of 3
  • +
  • +API keys scoped per workspace
  • +
  • +Audit log covers every v2 route
  • +
  • +Service secrets rotated 12 Jun
  • +
  • +CORS allowlist reviewed
  • +
  • +Pen test findings closed, 3 of 3
-

Reliability 4 of 4

+

Reliability 4 of 4 +

    -
  • Autoscaling tested to 4× peak
  • -
  • Alerting on the v2 error budget
  • -
  • Failover drill passed 22 Aug
  • -
  • Rollback to v1 verified end to end
  • +
  • +Autoscaling tested to 4× peak
  • +
  • +Alerting on the v2 error budget
  • +
  • +Failover drill passed 22 Aug
  • +
  • +Rollback to v1 verified end to end
-

Data 3 of 3

+

Data 3 of 3 +

    -
  • Backfill verified on 1.2M rows
  • -
  • PII fields tagged in the catalogue
  • -
  • Retention job running on v2 tables
  • +
  • +Backfill verified on 1.2M rows
  • +
  • +PII fields tagged in the catalogue
  • +
  • +Retention job running on v2 tables
-

Docs & support 4 of 4

+

Docs & support 4 of 4 +

    -
  • Reference generated from the spec
  • -
  • Migration guide published
  • -
  • Support macros written and reviewed
  • -
  • On-call rota covers launch week
  • +
  • +Reference generated from the spec
  • +
  • +Migration guide published
  • +
  • +Support macros written and reviewed
  • +
  • +On-call rota covers launch week
-

Billing 2 of 2

+

Billing 2 of 2 +

    -
  • Metering matches v1 within 0.3%
  • -
  • Overage alerts at 80% and 100%
  • +
  • +Metering matches v1 within 0.3%
  • +
  • +Overage alerts at 80% and 100%
@@ -416,13 +210,13 @@

Waived for beta

Both come back as blocking before general availability.

- + SOC 2 evidence for the v2 gateway

Beta is invite-only and under NDA, so the exposure is bounded and known.

Waived by Security · D. Okafor · 1 Sep · required for GA

- + Localised error messages

English only for beta. Tracked as ATL-2211 with a translator booked for October.

Waived by Product · P. Raman · 29 Aug · required for GA

diff --git a/templates/manifest.ts b/templates/manifest.ts index 619b60b..d9d8d31 100644 --- a/templates/manifest.ts +++ b/templates/manifest.ts @@ -70,12 +70,12 @@ export const starterTemplateManifest = [ "slug": "proposal", "category": "decisions", "name": "Proposal", - "description": "A single argument, led by the number that carries it: the problem, what you propose, what it costs, what it buys, and the decision you are asking for.", + "description": "A single argument with the dated decision first, then the problem, cost, payoff, trade-off and evidence in a numbered decision spine.", "type": "html", "content_file": "proposal.html", "thumbnail": "/assets/template-thumbs/proposal.png", "slots": [], - "thumbnail_viewport": 768 + "thumbnail_viewport": 1280 }, { "slug": "spec", @@ -111,11 +111,11 @@ export const starterTemplateManifest = [ "slug": "report", "category": "research", "name": "Report", - "description": "The serious long document: a masthead over a two-column opening band — executive summary left, the quarter's headline figures right — then numbered sections carrying a ranked magnitude figure, a pull quote, and owned next steps with dates.", + "description": "The serious long document: an editorial masthead followed by a briefing band that puts the finding beside its recommendation and quarter evidence, then numbered sections with a ranked magnitude figure, a customer quote, and owned next steps with dates.", "type": "html", "content_file": "report.html", "thumbnail": "/assets/template-thumbs/report.png", - "thumbnail_viewport": 768, + "thumbnail_viewport": 1280, "slots": [] }, { @@ -202,11 +202,12 @@ export const starterTemplateManifest = [ "slug": "project-plan", "category": "plans", "name": "Project plan", - "description": "Phases, owners, dates and dependencies on one page: a seventeen-week rail with a today line and a part-filled bar for the phase in flight, a phase card per stage with its deliverables and exit criterion, what the plan depends on other teams for, and the risks with mitigations.", + "description": "Phases, owners, dates and dependencies on one page: a seventeen-week phase-and-gate ledger with a today line and all four phases, followed by each phase's deliverables and exit criterion, cross-team dependencies, and risks with mitigations.", "type": "html", "content_file": "project-plan.html", "thumbnail": "/assets/template-thumbs/project-plan.png", - "slots": [] + "slots": [], + "thumbnail_viewport": 1440 }, { "slug": "runbook", diff --git a/templates/project-plan.html b/templates/project-plan.html index 0532c37..72b52de 100644 --- a/templates/project-plan.html +++ b/templates/project-plan.html @@ -1,311 +1,29 @@ - - + + Self-serve onboarding — project plan - +*{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{margin:0;color:var(--ink);background:var(--paper);font-family:var(--font);font-size:16px;line-height:1.6;font-variant-numeric:tabular-nums}h1,h2,h3,p,figure,dl{margin:0}h1,h2,h3{line-height:1.16;letter-spacing:-.025em}h1{font-size:clamp(32px,4vw,52px);font-weight:700}h2{font-size:24px}h3{font-size:21px}ul,ol{margin:0;padding:0;list-style:none}a{color:inherit;text-underline-offset:.2em}a:focus-visible,summary:focus-visible,[tabindex]:focus-visible{outline:3px solid currentColor;outline-offset:4px}p,li,dd,figcaption{overflow-wrap:break-word}.label,.eyebrow,.lab{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.11em;line-height:1.5}.head{padding-block:40px 28px}.foot,.colophon{padding-block:22px 30px;border-top:1px solid var(--line);font-size:14px;color:var(--muted)}.page,.wrap{max-width:1184px;margin-inline:auto}.sub{color:var(--muted);max-width:76ch;margin-top:12px}.lede{color:var(--muted);max-width:58ch;font-size:18px;margin-top:16px}section{min-width:0}b,strong{font-weight:700}svg{max-width:100%}.state,.tag,.chip{display:inline-flex;align-items:center;gap:.5em;width:fit-content;max-width:100%;font-size:13px;font-weight:650;line-height:1.5}.state:before,.ann:before,.chip:before{content:"";display:inline-block;width:.5em;height:.5em;background:currentColor;flex-shrink:0;border-radius:50%}.s-idle:before{background:none;border:1px solid currentColor;border-radius:0}.s-now:before{border-radius:0}.s-risk:before,.chip--warn:before{border-radius:0;transform:rotate(45deg)} +@media(max-width:600px){h1{font-size:34px}.head{padding-block:26px 24px}.lede{font-size:17px}h2{font-size:22px}h3{font-size:20px}} + +:root{--ink:#192b22;--muted:#506056;--paper:#f1f4ed;--line:#c8d2c7;--forest:#24583d;--sage:#dde8da;--risk:#815011;--font:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif}body{padding-inline:28px}.eyebrow{color:var(--forest)}.verdict{display:inline-flex;align-items:center;gap:.6em;max-width:100%;margin-top:20px;padding:9px 13px;background:var(--sage);font-size:14px;font-weight:650;line-height:1.5}.verdict:before{content:"";width:8px;height:8px;border-radius:50%;background:var(--forest);flex-shrink:0}.facts{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:20px;margin-top:28px;padding-top:22px;border-top:1px solid var(--line)}.facts dt{font-size:12px;text-transform:uppercase;letter-spacing:.09em;font-weight:700;color:var(--muted)}.facts dd{font-size:16px;font-weight:650;margin:4px 0 0}.facts>div:nth-child(3){color:var(--forest)}.s-done,.s-now{color:var(--forest)}.s-risk{color:var(--risk)}.s-idle{color:var(--muted)}.schedule{padding-block:26px 32px;border-top:2px solid var(--ink)}.rail{margin-top:24px;padding:24px;background:#fff;border:1px solid var(--line)}.rail__head,.ph{display:grid;grid-template-columns:250px minmax(0,1fr);gap:18px;align-items:center}.rail__head{margin-bottom:12px}.months{display:grid;grid-template-columns:repeat(17,minmax(0,1fr));border-bottom:1px solid var(--line);padding-bottom:8px;font-size:13px;color:var(--muted)}.ph{padding-block:10px;border-bottom:1px solid #e6ebe3}.ph:last-child{border:0}.cap{display:flex;flex-wrap:wrap;gap:2px 12px;font-size:15px;line-height:1.5}.cap b{width:100%}.cap>span:not(.ann){color:var(--muted)}.ann{display:inline-flex;align-items:center;gap:.5em;font-size:13px;font-weight:650}.timeline-bar{display:block;width:100%;height:36px}.mobile-label{display:none}.desktop-label{display:inline}.phases{display:grid;margin-top:24px}.phase{padding:26px 0;border-top:1px solid var(--line)}.phase__top{display:flex;align-items:center;flex-wrap:wrap;gap:8px 18px;margin-bottom:12px}.phase__n{font-size:13px;text-transform:uppercase;letter-spacing:.08em;font-weight:700}.phase__meta{font-size:15px;color:var(--muted);margin-top:10px}.does{margin-top:18px;display:grid;gap:9px;color:var(--muted)}.does li{padding-left:22px;position:relative}.does li:before{content:"—";position:absolute;left:0;color:var(--muted)}.exit{border-top:1px solid var(--line);padding-top:14px;margin-top:20px;font-size:16px}.exit b{color:var(--ink)}.deps,.risks{margin-top:24px}.dep,.risk{padding:24px 0;border-top:1px solid var(--line)}.dep__top{display:flex;flex-wrap:wrap;gap:9px 12px;margin-bottom:10px}.dep__top>b{width:100%;font-size:18px;line-height:1.3}a.tag{min-height:44px}.dep__due{font-size:14px;color:var(--muted)}.tag{font-size:12px;padding:3px 7px}.tag--block{color:#73450c;background:#f1e4d1}.tag--soft{color:#254f37;background:var(--sage)}.dep>p:last-child,.risk>p:last-child{color:var(--muted)}.risk__hd{font-weight:700;line-height:1.5;margin-bottom:10px}.risk__lv{display:block;font-size:12px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin-top:6px}.risk__lv em{color:var(--risk);font-style:normal}.risk .phase-link{font-size:14px;font-weight:600;display:inline-flex;align-items:center;min-height:44px;margin-top:8px}.phase-nav{display:flex;flex-wrap:wrap;gap:0 20px;margin-top:12px}.phase-nav a{font-size:14px;display:inline-flex;align-items:center;min-height:44px}.risk-section{padding-block:30px 38px;border-top:2px solid var(--ink)}.risks{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:30px} +@media(max-width:900px){.rail__head,.ph{grid-template-columns:200px minmax(0,1fr)}.risks{grid-template-columns:1fr}.risk{padding-block:18px}.risks{gap:0}.facts{grid-template-columns:repeat(2,minmax(0,1fr))}.rail{padding:18px}} +@media(max-width:720px){.rail__head{display:block}.rail__head>span{display:none}.months{display:flex;justify-content:space-between}.rail{padding:20px}.ph{display:block;padding:20px 0}.timeline-bar{display:none}.cap{display:grid;grid-template-columns:1fr auto;align-items:center;gap:4px 12px}.cap b{grid-column:1/-1;font-size:18px}.cap .ann{grid-column:1/-1}.desktop-label{display:none}.mobile-label{display:block}.rail__head{margin-bottom:0}.ph:nth-child(3){background:var(--sage);margin-inline:-12px;padding-inline:12px;border:1px solid var(--line)}.ph:nth-child(3):before{content:"";display:block;border-top:1px dashed var(--muted);margin-bottom:15px}.rail .today-label{display:block;font-size:13px;font-weight:700;margin-bottom:8px}.schedule{padding-block:24px}} +@media(min-width:721px){.today-label{display:none}} +@media(max-width:600px){body{padding-inline:18px}.facts{gap:18px 14px}.facts dd{font-size:15px}.phase{padding-block:22px}.schedule .sub{font-size:15px}.rail{padding:18px}.dep,.risk{padding-block:20px}} +@media(max-width:359px){.facts{grid-template-columns:1fr}.head h1{font-size:32px}} + +.head{display:grid;grid-template-columns:minmax(0,1fr) minmax(260px,330px);column-gap:70px}.head>.eyebrow,.head>h1,.head>.lede,.head>.verdict{grid-column:1}.head>.facts{grid-column:2;grid-row:1/6;display:flex;flex-direction:column;justify-content:space-between;margin:0;padding:6px 0 6px 28px;border-top:0;border-left:1px solid var(--line)}.head .verdict{justify-self:start}.head h1{margin-top:12px;max-width:18ch}.plan-body{display:grid;grid-template-columns:minmax(0,1.8fr) minmax(0,1fr);gap:52px;padding-block:32px 38px;border-top:2px solid var(--ink)}.plan-body section{margin:0;max-width:none}.phase{display:grid;grid-template-columns:120px minmax(0,1fr);column-gap:20px}.phase__top{grid-column:1;grid-row:1/5;display:flex;align-content:start;align-items:start;flex-direction:column;gap:12px}.phase>h3,.phase>.phase__meta,.phase>.does,.phase>.exit,.phase>.phase-nav{grid-column:2}.phase--now{background:var(--sage);padding:26px 20px;margin-inline:-20px;border:1px solid var(--line)}.dependencies{padding:24px;background:#e6ecdf;align-self:start}.dependencies h2{font-size:22px}.phase-nav{grid-column:2}.rail__head .months{position:relative}.chart-today{position:absolute;left:35.29%;bottom:24px;background:#fff;font-size:12px;font-weight:700;color:var(--ink);padding:0 4px}.rail__head .months:after{content:""}.rail{padding-top:42px} +@media(max-width:1000px){.plan-body{grid-template-columns:1fr;gap:30px}.dependencies{display:block}.deps{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:22px}.head{grid-template-columns:1fr;gap:0}.head>.facts{grid-column:1;grid-row:auto;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));padding:22px 0 0;margin-top:28px;border-left:0;border-top:1px solid var(--line)}} +@media(max-width:900px){.deps{grid-template-columns:1fr;gap:0}} +@media(max-width:720px){.rail__head .months:after,.chart-today{display:none}.rail{padding-top:20px}.deps{grid-template-columns:1fr;gap:0}.head>.facts{grid-template-columns:repeat(2,minmax(0,1fr))}.phase{grid-template-columns:1fr}.phase__top{grid-column:1;grid-row:auto;flex-direction:row;gap:12px}.phase>h3,.phase>.phase__meta,.phase>.does,.phase>.exit,.phase>.phase-nav{grid-column:1}.phase--now{margin-inline:0;padding:22px 18px}.dependencies{padding:20px}} +@media(max-width:359px){.head>.facts{grid-template-columns:1fr}} + - -
+

Project plan

Self-serve onboarding

@@ -321,46 +39,39 @@

Self-serve onboarding

- -
+

The seventeen weeks

-

+ Mobile milestone flow

Desktop chart · One column per week; the dashed line is today, 4 Sep. Every date is written out, so the plan reads without the chart.

-
-
AugSepOctNov
+
AugSepOctNov4 Sep
-

1 · Discovery 27 Jul → 21 Aug

-
Complete
-
+

1 · Discovery 27 Jul → 21 AugComplete

+
-

2 · Signup 24 Aug → 25 Sep

-
In progress
-
+

Today · 4 Sep2 · Signup 24 Aug → 25 SepIn progress

+
-

3 · Guided setup 28 Sep → 30 Oct

-
Not started
-
+

3 · Guided setup 28 Sep → 30 OctNot started

+
-

4 · Billing 2 Nov → 20 Nov

-
At risk
-
+

4 · Billing 2 Nov → 20 NovAt risk

+
- -
+

What each phase actually delivers

-
+
Phase 1 Complete @@ -376,7 +87,7 @@

Discovery & instrumentation

-
+
Phase 2 In progress · week 2 of 5 @@ -390,9 +101,9 @@

Signup & workspace provisioning

Exit: a new account reaches a working workspace unaided.

-
+
-
+
Phase 3 Not started @@ -408,7 +119,7 @@

Guided setup & templates

-
+
Phase 4 At risk @@ -422,33 +133,32 @@

Self-serve billing

Exit: a customer upgrades without contacting sales.

-
+
- -
+

Depends on other people

-
+

Billing migration to the new ledger - Blocks phase 4 + Blocks phase 4 Finance platform · due 10 Nov

Ten days of float. Later than 13 Nov and phase 4 moves to December.

-
+

Security review of the invite flow - Blocks phase 2 exit + Blocks phase 2 exit Security · due 18 Sep

Booked. A week of slack before the phase 2 exit date.

-
+

Pricing page copy Wanted, not blocking @@ -459,8 +169,7 @@

Depends on other people

- -
+

What could go wrong

@@ -468,7 +177,7 @@

What could go wrong

Mitigation: phase 4 drops to card capture if the ledger misses 13 Nov.

-
+ Phase 4

Google sign-in review takes longer than quoted Possible · Medium impact

@@ -480,14 +189,14 @@

What could go wrong

Mitigation: three are written and reviewed before phase 3 opens.

-
+ Phase 3
-
@@ -249,15 +146,21 @@

A second list increase in January — defer

risk is the segment.

-
+

Next steps

    -
  1. Approve or reject the viewer tier -

    Priya RamanDecision needed by 17 October

  2. -
  3. Model the January increase against a segmented rollout -

    Revenue OperationsDraft by 31 October

  4. -
  5. Give every 20+ seat account a named renewal owner -

    Marcus Lai, Customer SuccessIn place by 1 November

  6. +
  7. +Approve or reject the viewer tier +

    Priya RamanDecision needed by 17 October

    +
  8. +
  9. +Model the January increase against a segmented rollout +

    Revenue OperationsDraft by 31 October

    +
  10. +
  11. +Give every 20+ seat account a named renewal owner +

    Marcus Lai, Customer SuccessIn place by 1 November

    +
diff --git a/templates/service-health.html b/templates/service-health.html index 123577f..63935e8 100644 --- a/templates/service-health.html +++ b/templates/service-health.html @@ -1,181 +1,27 @@ - - + + Every service met its objective and the error budget is 71% gone - -
- - -
+
+
Reliability review · Q4 FY26 · 8 September

Every service met its objective and the error budget is 71% gone

Six weeks into a thirteen-week quarter. Nothing here is breaching an @@ -184,34 +30,39 @@

Every service met its objective and the error budget is 71% gone

-
+
+
Remaining
1h 55m
+
Burn rate
7.1 min/day
+
Runs out
24 Sep
+
+

Error budget spent

71%

278 of 393 minutes, against a 99.7% quarterly objective across all services.

-
-
Remaining
1h 55m
-
Burn rate
7.1 min/day
-
Runs out
24 Sep
-
-
+
Budget remaining · 1 Aug – 31 Oct · 393 min at full
- + Budget falls from 393 minutes on 1 August to 115 today in three steps: webhook DNS 12 Aug, thumbnail worker 19 Aug, and the storage failover 4 Sep which alone took 134 minutes. At this burn rate it reaches zero on 24 September, five weeks before the quarter closes. - - - - + + + + -

Each step down is an incident. The dashed tail is the projection at +

1 Aug31 Oct

Each step down is an incident. The dashed tail is the projection at today's burn rate: budget gone 24 September, then five weeks of quarter with nothing left to spend.

-
+
+

The thing this board is for

+

Four services, four objectives met, and seventy-one per cent of the quarter spent in six + weeks. Both are true and only one of them is on a status page. The publish pipeline + cleared its floor by six hundredths of a point and took two-thirds of the money.

+
+ +

Where it went

@@ -240,7 +91,7 @@

Where it went

Sorted by budget consumed, not by date · four events, 4h 38m total
-
+

What the overspend has already cost

  1. 01
    @@ -261,52 +112,44 @@

    The latency objective is unfundable this quarter

-
+

By service · last 90 days, one bar per day

-
+
Publish pipeline objective 99.70% · actual 99.76%
- - - - - -

1 degraded day · 1 partial outage — 63% of the quarter's spend +

+ +

90 days · read each row left to right

1 degraded day · 1 partial outage — 63% of the quarter's spend Met, barely

Webhooks objective 99.50% · actual 99.95%
- - - - -

1 degraded day · 24% of the spendMet

+
+ +

90 days · read each row left to right

1 degraded day · 24% of the spendMet

API objective 99.90% · actual 99.99%
- - - - -

1 degraded day · 13% of the spendMet

+
+ +

90 days · read each row left to right

1 degraded day · 13% of the spendMet

Web app objective 99.90% · actual 100%
- - - -

No incidents · none of the spendMet

+
+ +

90 days · read each row left to right

No incidents · none of the spendMet

-

+

Operational — full bar Degraded — two-thirds bar Partial outage — short bar @@ -314,17 +157,10 @@

By service · last 90 days, one bar per day

-
-

The thing this board is for

-

Four services, four objectives met, and seventy-one per cent of the quarter spent in six - weeks. Both are true and only one of them is on a status page. The publish pipeline - cleared its floor by six hundredths of a point and took two-thirds of the money.

-
- -
+