merge #69 #70 #76 brand+theme + close

aa76f57gl0w

all commits

Message

merge #69 #70 #76 brand+theme + close

Diff

.forge/issues/0fea47fa-c30f-4181-8340-de5f33012d0b/comments/99c5d4da-658f-402f-a30c-9a3cf4131a49.md+6 −0
diff --git a/.forge/issues/0fea47fa-c30f-4181-8340-de5f33012d0b/comments/99c5d4da-658f-402f-a30c-9a3cf4131a49.md b/.forge/issues/0fea47fa-c30f-4181-8340-de5f33012d0b/comments/99c5d4da-658f-402f-a30c-9a3cf4131a49.mdnew file mode 100644index 0000000..aee3ec7--- /dev/null+++ b/.forge/issues/0fea47fa-c30f-4181-8340-de5f33012d0b/comments/99c5d4da-658f-402f-a30c-9a3cf4131a49.md@@ -0,0 +1,6 @@1+---2+id: 99c5d4da-658f-402f-a30c-9a3cf4131a493+author: null4+created: 2026-10-27T16:00:02.536042938Z5+---6+Fixed in 0d27cbff-baad-47a5-afb4-1e84014f080b: see the PR body. Budget is 32768; tokens documented; header/footer branding; theme-aware logo; 1200x630 og.png; light palette with computed AA test (tests/theme_contrast.rs) and mobile/desktop screenshots verified.
.forge/issues/0fea47fa-c30f-4181-8340-de5f33012d0b/issue.md+2 −2
diff --git a/.forge/issues/0fea47fa-c30f-4181-8340-de5f33012d0b/issue.md b/.forge/issues/0fea47fa-c30f-4181-8340-de5f33012d0b/issue.mdindex b227f28..24705b9 100644--- a/.forge/issues/0fea47fa-c30f-4181-8340-de5f33012d0b/issue.md+++ b/.forge/issues/0fea47fa-c30f-4181-8340-de5f33012d0b/issue.md@@ -1,13 +1,13 @@11 ---22 id: 0fea47fa-c30f-4181-8340-de5f33012d0b33 title: 'Brand v1: gl0w + hu13 lockup, branded footer with gl0w.world, og:image, theme-aware logo'4-state: open4+state: closed55 labels:66 - ui77 assignees: []88 milestone: null99 created: 2026-10-27T15:26:52.226727799Z10-updated: null10+updated: 2026-10-27T16:00:02.516713781Z1111 ---1212 Today the site has **no gl0w branding anywhere** — zero references to gl0w.world in any generated page. The only attribution is the muted right-aligned footer line `generated from a snapshot of a repo and its f0rge · master @ afe4a2a`.1313 
.forge/issues/b085165e-9006-4ef4-a85f-ad58b2946280/comments/1e5d67d3-7826-4cc5-b91c-9b10b4777273.md+6 −0
diff --git a/.forge/issues/b085165e-9006-4ef4-a85f-ad58b2946280/comments/1e5d67d3-7826-4cc5-b91c-9b10b4777273.md b/.forge/issues/b085165e-9006-4ef4-a85f-ad58b2946280/comments/1e5d67d3-7826-4cc5-b91c-9b10b4777273.mdnew file mode 100644index 0000000..68f87bb--- /dev/null+++ b/.forge/issues/b085165e-9006-4ef4-a85f-ad58b2946280/comments/1e5d67d3-7826-4cc5-b91c-9b10b4777273.md@@ -0,0 +1,6 @@1+---2+id: 1e5d67d3-7826-4cc5-b91c-9b10b47772733+author: null4+created: 2026-10-27T16:00:02.638863983Z5+---6+Fixed in 0d27cbff-baad-47a5-afb4-1e84014f080b: see the PR body. Budget is 32768; tokens documented; header/footer branding; theme-aware logo; 1200x630 og.png; light palette with computed AA test (tests/theme_contrast.rs) and mobile/desktop screenshots verified.
.forge/issues/b085165e-9006-4ef4-a85f-ad58b2946280/issue.md+2 −2
diff --git a/.forge/issues/b085165e-9006-4ef4-a85f-ad58b2946280/issue.md b/.forge/issues/b085165e-9006-4ef4-a85f-ad58b2946280/issue.mdindex 55079b0..4314190 100644--- a/.forge/issues/b085165e-9006-4ef4-a85f-ad58b2946280/issue.md+++ b/.forge/issues/b085165e-9006-4ef4-a85f-ad58b2946280/issue.md@@ -1,13 +1,13 @@11 ---22 id: b085165e-9006-4ef4-a85f-ad58b294628033 title: Light theme retune + AA contrast pass (--muted is 2.76:1 dark / 4.26:1 light)4-state: open4+state: closed55 labels:66 - ui77 assignees: []88 milestone: null99 created: 2026-10-27T15:28:20.051026328Z10-updated: null10+updated: 2026-10-27T16:00:02.615871182Z1111 ---1212 The dark theme (Tokyo Night) is the designed one and reads well. The **light theme is the weak one**: page `#d5d6db`, header `#b4b8c7`, body `#343b58` on a dusty blue-grey field — it looks like a 2010s admin panel, everything on one flat tone with no surface separation. It is also the theme most first-time visitors on desktop will get.1313 
.forge/issues/f4e0b79d-0312-4d4d-b014-84337f4ef3db/comments/c0e29153-9cba-4de8-8f7f-611f9cd199d7.md+6 −0
diff --git a/.forge/issues/f4e0b79d-0312-4d4d-b014-84337f4ef3db/comments/c0e29153-9cba-4de8-8f7f-611f9cd199d7.md b/.forge/issues/f4e0b79d-0312-4d4d-b014-84337f4ef3db/comments/c0e29153-9cba-4de8-8f7f-611f9cd199d7.mdnew file mode 100644index 0000000..a841a70--- /dev/null+++ b/.forge/issues/f4e0b79d-0312-4d4d-b014-84337f4ef3db/comments/c0e29153-9cba-4de8-8f7f-611f9cd199d7.md@@ -0,0 +1,6 @@1+---2+id: c0e29153-9cba-4de8-8f7f-611f9cd199d73+author: null4+created: 2026-10-27T16:00:02.441946411Z5+---6+Fixed in 0d27cbff-baad-47a5-afb4-1e84014f080b: see the PR body. Budget is 32768; tokens documented; header/footer branding; theme-aware logo; 1200x630 og.png; light palette with computed AA test (tests/theme_contrast.rs) and mobile/desktop screenshots verified.
.forge/issues/f4e0b79d-0312-4d4d-b014-84337f4ef3db/issue.md+2 −2
diff --git a/.forge/issues/f4e0b79d-0312-4d4d-b014-84337f4ef3db/issue.md b/.forge/issues/f4e0b79d-0312-4d4d-b014-84337f4ef3db/issue.mdindex 7c87710..5ae503e 100644--- a/.forge/issues/f4e0b79d-0312-4d4d-b014-84337f4ef3db/issue.md+++ b/.forge/issues/f4e0b79d-0312-4d4d-b014-84337f4ef3db/issue.md@@ -1,13 +1,13 @@11 ---22 id: f4e0b79d-0312-4d4d-b014-84337f4ef3db33 title: 'Design foundations: raise the CSS budget (49 bytes free) + spacing/type/color scale'4-state: open4+state: closed55 labels:66 - ui77 assignees: []88 milestone: null99 created: 2026-10-27T15:26:36.434267184Z10-updated: null10+updated: 2026-10-27T16:00:02.419622939Z1111 ---1212 Parent/blocker for the cosmetic pass. `static/style.css` is 15311 / 15360 bytes — **49 bytes of headroom** — and three tests plus `gl0w.md` enforce the cap:1313 
.forge/merges/2026-10-27T16-00-02.303795215Z.md+9 −0
diff --git a/.forge/merges/2026-10-27T16-00-02.303795215Z.md b/.forge/merges/2026-10-27T16-00-02.303795215Z.mdnew file mode 100644index 0000000..e4a361a--- /dev/null+++ b/.forge/merges/2026-10-27T16-00-02.303795215Z.md@@ -0,0 +1,9 @@1+---2+pr: 0d27cbff-baad-47a5-afb4-1e84014f080b3+applied: true4+verdict: pass5+resolved: []6+created: 2026-10-27T16:00:02.303795215Z7+---8+clean apply9+patch: 12d0f7d957e68f1e29ea1e0d453cba14c29da5ed
.forge/prs/0d27cbff-baad-47a5-afb4-1e84014f080b/patch.diff+1360 −0
diff --git a/.forge/prs/0d27cbff-baad-47a5-afb4-1e84014f080b/patch.diff b/.forge/prs/0d27cbff-baad-47a5-afb4-1e84014f080b/patch.diffnew file mode 100644index 0000000..16f5832--- /dev/null+++ b/.forge/prs/0d27cbff-baad-47a5-afb4-1e84014f080b/patch.diff@@ -0,0 +1,1360 @@1+From ac0e52ac40bb4f33818a0ad43bf32035e1d2f223 Mon Sep 17 00:00:00 20012+From: hu13-test <[email protected]>3+Date: Tue, 27 Oct 2026 15:59:14 +00004+Subject: [PATCH] brand + theme foundations: gl0w lockup, AA palette, CSS5+ budget (#69 #70 #76)6+MIME-Version: 1.07+Content-Type: text/plain; charset=UTF-88+Content-Transfer-Encoding: 8bit9+10+#69: budget 15360 -> 32768 (CSS is 17.4KB with the new work) in the11+three tests and gl0w.md; add the token set the skin issues write12+against (--surface/-2, --fg-dim, spacing s1..s6, type scale,13+state colors, --radius) and document it at the top of the file.14+15+#70: header is now gl0w mark / hu13 lockup (96x32 logo keeps its16+aspect at 28px instead of being squeezed to 48x16); footer is a17+left-aligned brand block with 'hu13 — a gl0w project', a18+gl0w.world link and the provenance line; og:image (+width/height/19+alt, twitter card, site_name) points at a generated 1200x630 PNG;20+logo.svg/favicon.svg lose the baked #1a1b26 slab and flip ink via21+prefers-color-scheme:light.22+23+#76: light palette is a real light surface set (#f6f7f9 page,24+#eceef2 header, #ffffff panels, #d6dae2 borders); --muted is now25+AA in both themes (#9aa5ce dark, #4a5273 light) and every text var26+is checked by tests/theme_contrast.rs (computed WCAG, both themes).27+Adds GFM table/task-list/del/footnote styles for #71.28+---29+ gl0w.md                 |   2 +-30+ src/build.rs            |   2 +31+ src/layout.rs           |  42 +++++++----32+ static/favicon.svg      |   7 +-33+ static/logo.svg         |  17 +++--34+ static/og.png           | Bin 0 -> 34764 bytes35+ static/style.css        |  80 +++++++++++++++++---36+ tests/brand.rs          | 123 +++++++++++++++++++++++++++++++37+ tests/favicon.rs        |   7 +-38+ tests/light_theme.rs    |  15 ++--39+ tests/logo.rs           |  16 +++-40+ tests/polish.rs         |   4 +-41+ tests/responsive.rs     |   4 +-42+ tests/theme_contrast.rs | 157 ++++++++++++++++++++++++++++++++++++++++43+ 14 files changed, 422 insertions(+), 54 deletions(-)44+ create mode 100644 static/og.png45+ create mode 100644 tests/brand.rs46+ create mode 100644 tests/theme_contrast.rs47+48+diff --git a/gl0w.md b/gl0w.md49+index 9088ce8..0cb56f7 10064450+--- a/gl0w.md51++++ b/gl0w.md52+@@ -13,7 +13,7 @@ f0rge ci run        # local CI: fmt, clippy, test, dogfood53+ ```54+ 55+ Dogfood (stub-tolerant in m1): `cargo run -- build <repo> -o /tmp/hu13-dogfood` must exit 0.56+-CSS budget: `wc -c static/style.css` must stay under 15360 bytes (15KB);57++CSS budget: `wc -c static/style.css` must stay under 32768 bytes (32KB);58+ only allowed `border-radius` value is `0`: `grep border-radius static/style.css`.59+ 60+ ## Inbox safety61+diff --git a/src/build.rs b/src/build.rs62+index a88adba..a49f34e 10064463+--- a/src/build.rs64++++ b/src/build.rs65+@@ -873,6 +873,8 @@ fn write_favicon_and_manifest(out: &Path) -> Result<(), String> {66+     let icon = include_str!("../static/favicon.svg");67+     std::fs::write(out.join("favicon.svg"), icon)68+         .map_err(|e| format!("hu13: write favicon.svg: {e}"))?;69++    let social = include_bytes!("../static/og.png");70++    std::fs::write(out.join("og.png"), social).map_err(|e| format!("hu13: write og.png: {e}"))?;71+     let manifest = include_str!("../static/manifest.webmanifest");72+     std::fs::write(out.join("manifest.webmanifest"), manifest)73+         .map_err(|e| format!("hu13: write manifest.webmanifest: {e}"))?;74+diff --git a/src/layout.rs b/src/layout.rs75+index 70482a2..d985a04 10064476+--- a/src/layout.rs77++++ b/src/layout.rs78+@@ -100,7 +100,7 @@ pub fn page(title: &str, nav: &str, body: &str) -> String {79+ /// Head standards (m6 favicon, f0rge issue #16) ride along on every page:80+ /// SVG-first favicon (`rel=icon` + `apple-touch-icon` both point at81+ /// `/favicon.svg` — no binary blobs in the repo), light/dark82+-/// `theme-color` (Tokyo Night `#d5d6db` / `#1a1b26`, matching83++/// `theme-color` (Tokyo Night `#f6f7f9` / `#1a1b26`, matching84+ /// `static/style.css`), `og:type=website`, and the `manifest.webmanifest`85+ /// link..86+ /// Which nav `href` is active for a page (m6 navbar, f0rge issue #18).87+@@ -203,7 +203,7 @@ pub fn provenance_footer(branch: Option<&str>, short_sha: Option<&str>) -> Strin88+         }89+     }90+     format!(91+-        "<footer class=\"site-footer\"><div class=\"wrap\"><p class=\"muted footer-provenance\">{line}</p></div></footer>"92++        "<footer class=\"site-footer\"><div class=\"wrap\"><div class=\"footer-brand\"><a class=\"gl0w-mark\" href=\"https://gl0w.world\" rel=\"noopener\">gl0w</a><span class=\"footer-tag\">hu13 — a gl0w project</span></div><p class=\"footer-links\"><a href=\"https://gl0w.world\" rel=\"noopener\">gl0w.world</a><a href=\"/agents.html\">agents</a><a href=\"/inbox/issue\">submit</a></p><p class=\"muted footer-provenance\">{line}</p></div></footer>"93+     )94+ }95+ 96+@@ -268,13 +268,19 @@ fn page_site_inner(97+ <link rel=\"stylesheet\" href=\"/style.css\">\n\98+ <link rel=\"icon\" type=\"image/svg+xml\" href=\"/favicon.svg\">\n\99+ <link rel=\"apple-touch-icon\" href=\"/favicon.svg\">\n\100+-<meta name=\"theme-color\" media=\"(prefers-color-scheme: light)\" content=\"#d5d6db\">\n\101++<meta name=\"theme-color\" media=\"(prefers-color-scheme: light)\" content=\"#f6f7f9\">\n\102+ <meta name=\"theme-color\" media=\"(prefers-color-scheme: dark)\" content=\"#1a1b26\">\n\103+ <link rel=\"manifest\" href=\"/manifest.webmanifest\">\n\104+ <link rel=\"alternate\" type=\"application/atom+xml\" href=\"/feed.atom\">\n\105+ <title>{title_e}</title>\n\106+ <meta property=\"og:title\" content=\"{title_e}\">\n\107+-<meta property=\"og:type\" content=\"website\">\n"108++<meta property=\"og:type\" content=\"website\">\n\109++<meta property=\"og:site_name\" content=\"hu13 by gl0w\">\n\110++<meta property=\"og:image\" content=\"/og.png\">\n\111++<meta property=\"og:image:width\" content=\"1200\">\n\112++<meta property=\"og:image:height\" content=\"630\">\n\113++<meta property=\"og:image:alt\" content=\"hu13 — a gl0w project\">\n\114++<meta name=\"twitter:card\" content=\"summary_large_image\">\n"115+     );116+     if let Some(d) = description {117+         let d_e = esc(d);118+@@ -293,7 +299,7 @@ fn page_site_inner(119+ <html lang=\"en\">\n\120+ <head>\n{head}</head>\n\121+ <body>\n\122+-<header class=\"site-header\"><div class=\"wrap header-bar\"><a class=\"brand-lockup\" href=\"/\"><img class=\"site-logo\" src=\"/logo.svg\" alt=\"hu13 logo\" width=\"48\" height=\"48\"></a><span class=\"sep\" aria-hidden=\"true\">•</span><nav class=\"site-nav nav-scroll\" aria-label=\"Site\"><div class=\"nav-scroll-row\">{nav_active}</div></nav></div></header>\n\123++<header class=\"site-header\"><div class=\"wrap header-bar\"><a class=\"brand-lockup\" href=\"/\" aria-label=\"hu13 by gl0w — home\"><span class=\"gl0w-mark\" aria-hidden=\"true\">gl0w</span><span class=\"lockup-slash\" aria-hidden=\"true\">/</span><img class=\"site-logo\" src=\"/logo.svg\" alt=\"hu13 logo\" width=\"84\" height=\"28\"></a><span class=\"sep\" aria-hidden=\"true\">•</span><nav class=\"site-nav nav-scroll\" aria-label=\"Site\"><div class=\"nav-scroll-row\">{nav_active}</div></nav></div></header>\n\124+ <main class=\"wrap\">\n{body}\n</main>\n\125+ {footer}\n\126+ </body>\n\127+@@ -357,7 +363,7 @@ mod tests {128+         for needle in [129+             "<link rel=\"icon\" type=\"image/svg+xml\" href=\"/favicon.svg\">",130+             "<link rel=\"apple-touch-icon\" href=\"/favicon.svg\">",131+-            "<meta name=\"theme-color\" media=\"(prefers-color-scheme: light)\" content=\"#d5d6db\">",132++            "<meta name=\"theme-color\" media=\"(prefers-color-scheme: light)\" content=\"#f6f7f9\">",133+             "<meta name=\"theme-color\" media=\"(prefers-color-scheme: dark)\" content=\"#1a1b26\">",134+             "<meta property=\"og:title\"",135+             "<meta property=\"og:type\" content=\"website\">",136+@@ -612,21 +618,27 @@ mod tests {137+             css.contains("main>h1:first-child") && css.contains("margin-top:var(--gap-head)"),138+             "bare h1 shares nav->head gap"139+         );140+-        // #51: 48px logo (was 24px / 1.5rem), vector kept, header centers.141++        // #70: the 96x32 lockup keeps its 3:1 aspect instead of being142++        // squeezed into a 48x48 square (lettering was illegible).143+         assert!(css.contains(".site-logo"), "logo rule");144+-        assert!(css.contains("width:3rem"), "logo 48px width");145+-        assert!(css.contains("height:3rem"), "logo 48px height");146+-        assert!(!css.contains("width:1.5rem"), "old 24px gone");147++        assert!(148++            css.contains("width:auto;height:1.75rem"),149++            "logo keeps its aspect at 28px tall"150++        );151++        assert!(!css.contains("width:3rem"), "old square box gone");152+         let html = page("t", "<nav></nav>", "<p>b</p>");153+         assert!(154+-            html.contains("width=\"48\" height=\"48\""),155+-            "header img 48px attrs"156++            html.contains("width=\"84\" height=\"28\""),157++            "header img 3:1 attrs"158+         );159+-        // #52: footer provenance sits right, both themes (pure CSS var block).160++        // #70: footer is a left-aligned brand block (gl0w + hu13), not a161++        // lone right-aligned provenance line.162+         assert!(163+-            css.contains(".footer-provenance") && css.contains("text-align:right"),164+-            "footer right-aligned"165++            css.contains(".footer-provenance") && css.contains("text-align:left"),166++            "footer aligns with content"167+         );168++        assert!(css.contains(".footer-brand"), "footer brand row styled");169++        assert!(css.contains(".gl0w-mark"), "gl0w mark styled");170+     }171+ 172+     #[test]173+diff --git a/static/favicon.svg b/static/favicon.svg174+index 098e978..d1572be 100644175+--- a/static/favicon.svg176++++ b/static/favicon.svg177+@@ -1,9 +1,8 @@178+ <?xml version="1.0" encoding="UTF-8"?>179+-<!-- hu13 favicon: simplified mark-only variant for 16px legibility. Full lettering lives in logo.svg. -->180++<!-- hu13 favicon: simplified mark-only variant for 16px legibility.181++     No background fill (the browser chrome supplies it). -->182+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" role="img" aria-label="hu13 logo">183+   <title>hu13</title>184+-  <rect x="0" y="0" width="32" height="32" fill="#1a1b26"/>185+-  <rect x="0.5" y="0.5" width="31" height="31" fill="none" stroke="#292e42"/>186+-  <polygon points="16,6 26,16 16,26 6,16" fill="none" stroke="#7aa2f7" stroke-width="3"/>187++  <polygon points="16,5 27,16 16,27 5,16" fill="none" stroke="#7aa2f7" stroke-width="3"/>188+   <rect x="13" y="13" width="6" height="6" fill="#7dcfff"/>189+ </svg>190+diff --git a/static/logo.svg b/static/logo.svg191+index 1e7b01c..63ed209 100644192+--- a/static/logo.svg193++++ b/static/logo.svg194+@@ -1,13 +1,16 @@195+ <?xml version="1.0" encoding="UTF-8"?>196+-<!-- hu13 lockup: diamond-hub mark + hu13 lettering as hand-drawn vectors. Reads at 24px header size. -->197++<!-- hu13 lockup: diamond-hub mark + hu13 lettering as hand-drawn vectors.198++     No background fill: the page supplies it, so the lockup works on both199++     the dark and light themes (ink flips via prefers-color-scheme). -->200+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 32" width="96" height="32" role="img" aria-label="hu13 logo">201+   <title>hu13</title>202+-  <rect x="0" y="0" width="96" height="32" fill="#1a1b26"/>203+-  <rect x="0.5" y="0.5" width="95" height="31" fill="none" stroke="#292e42"/>204++  <style>.ink{stroke:#c0caf5}@media (prefers-color-scheme:light){.ink{stroke:#343b58}}</style>205+   <polygon points="16,4 28,16 16,28 4,16" fill="none" stroke="#7aa2f7" stroke-width="3"/>206+   <rect x="13" y="13" width="6" height="6" fill="#7dcfff"/>207+-  <path d="M40 8 V24 M40 15 H46 V24" fill="none" stroke="#c0caf5" stroke-width="2" stroke-linecap="square" stroke-linejoin="miter"/>208+-  <path d="M52 8 V21 H58 V8" fill="none" stroke="#c0caf5" stroke-width="2" stroke-linecap="square" stroke-linejoin="miter"/>209+-  <path d="M64 10 L66 8 V24 M62 24 H70" fill="none" stroke="#c0caf5" stroke-width="2" stroke-linecap="square" stroke-linejoin="miter"/>210+-  <path d="M74 8 H80 V14 H74 M74 14 H80 V24 H74" fill="none" stroke="#c0caf5" stroke-width="2" stroke-linecap="square" stroke-linejoin="miter"/>211++  <g class="ink" fill="none" stroke-width="2" stroke-linecap="square" stroke-linejoin="miter">212++    <path d="M40 8 V24 M40 15 H46 V24"/>213++    <path d="M52 8 V21 H58 V8"/>214++    <path d="M64 10 L66 8 V24 M62 24 H70"/>215++    <path d="M74 8 H80 V14 H74 M74 14 H80 V24 H74"/>216++  </g>217+ </svg>218+diff --git a/static/og.png b/static/og.png219+new file mode 100644220+index 0000000000000000000000000000000000000000..d7be379fba1e6798e29e3fdd0fe103d44b288c4a221+GIT binary patch222+literal 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 0802+HcmV?d00001803+804+diff --git a/static/style.css b/static/style.css805+index a75e481..d764077 100644806+--- a/static/style.css807++++ b/static/style.css808+@@ -6,8 +6,11 @@809+   --bg:#1a1b26;810+   --bg-alt:#16161e;811+   --bg-th:#1f2335;812++  --surface:#1f2335;813++  --surface-2:#24283b;814+   --fg:#c0caf5;815+-  --muted:#565f89;816++  --fg-dim:#9aa5ce;817++  --muted:#9aa5ce;818+   --blue:#7aa2f7;819+   --cyan:#7dcfff;820+   --green:#9ece6a;821+@@ -16,6 +19,28 @@822+   --border:#292e42;823+   --visited:#9aa5ce;824+   --btn-fg:#16161e;825++  --state-open:#9ece6a;826++  --state-merged:#bb9af7;827++  --state-closed:#f7768e;828++  /* syntax tokens (build-time highlighter) */829++  --tok-kw:#bb9af7;830++  --tok-str:#9ece6a;831++  --tok-num:#ff9e64;832++  --tok-com:#8b93b8;833++  --tok-fn:#7aa2f7;834++  --tok-type:#2ac3de;835++  /* scale: one source for gaps, type, corners (f0rge #69) */836++  --s1:.25rem;837++  --s2:.5rem;838++  --s3:.75rem;839++  --s4:1rem;840++  --s5:1.5rem;841++  --s6:2rem;842++  --fs-sm:.85rem;843++  --fs-lg:1.15rem;844++  --fs-xl:1.5rem;845++  --fs-2xl:2rem;846++  --radius:0;847+   --gap-head:.75rem;848+   --gap-content:1rem;849+   --diff-add:#9ece6a;850+@@ -27,19 +52,31 @@851+ }852+ @media (prefers-color-scheme:light){853+   :root{854+-    --bg:#d5d6db;855+-    --bg-alt:#cbccd3;856+-    --bg-th:#b4b8c7;857++    --bg:#f6f7f9;858++    --bg-alt:#eceef2;859++    --bg-th:#e4e7ee;860++    --surface:#ffffff;861++    --surface-2:#eef0f4;862+     --fg:#343b58;863+-    --muted:#565f89;864++    --fg-dim:#4a5273;865++    --muted:#4a5273;866+     --blue:#34548a;867+     --cyan:#0f4b6e;868+     --green:#33635c;869+-    --yellow:#8c6c3e;870++    --yellow:#7d5f33;871+     --red:#8c4351;872+-    --border:#b4b8c7;873++    --border:#d6dae2;874+     --visited:#5a4a78;875+-    --btn-fg:#e9e9ed;876++    --btn-fg:#ffffff;877++    --state-open:#33635c;878++    --state-merged:#5a4a78;879++    --state-closed:#8c4351;880++    --tok-kw:#5a4a78;881++    --tok-str:#33635c;882++    --tok-num:#7d5f33;883++    --tok-com:#4a5273;884++    --tok-fn:#34548a;885++    --tok-type:#0f4b6e;886+     --diff-add:#33635c;887+     --diff-add-bg:#c6d4ca;888+     --diff-del:#8c4351;889+@@ -121,11 +158,26 @@ button:hover,input[type=submit]:hover{background:var(--cyan)}890+ .btn-new:visited{color:var(--btn-fg)}891+ .btn-new:hover,.btn-new:focus{background:var(--cyan);text-decoration:none}892+ .muted{color:var(--muted)}893+-footer.site-footer{border-top:1px solid var(--border)}894+-footer.site-footer .wrap{padding:1rem}895++/* GFM markdown (f0rge #71): task lists, strikethrough, footnotes. */896++.task-list-item{list-style:none}897++.task-list-item input[type=checkbox]{margin:0 .4em 0 -1.2em;vertical-align:middle;accent-color:var(--green)}898++.prose del,.del{color:var(--fg-dim);text-decoration:line-through}899++.footnotes{margin-top:var(--s5);font-size:var(--fs-sm);color:var(--fg-dim)}900++.footnotes ol{padding-left:var(--s5)}901++.markdown table{background:var(--surface)}902++.markdown th{background:var(--bg-th);font-weight:600}903++.markdown td,.markdown th{padding:var(--s2) var(--s3)}904++.markdown tr:nth-child(even) td{background:var(--bg-alt)}905++footer.site-footer{border-top:1px solid var(--border);margin-top:var(--s6)}906++footer.site-footer .wrap{padding:var(--s4) 1rem var(--s5)}907++.footer-brand{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--s2) var(--s3);margin:0 0 var(--s2)}908++.footer-brand .gl0w-mark{text-decoration:none}909++.footer-tag{color:var(--fg);font-weight:600}910++.footer-links{margin:0 0 var(--s2);font-size:var(--fs-sm)}911++.footer-links a{margin-right:var(--s3)}912+ /* Provenance line (m6/footer-line, f0rge #41): the single muted line913+    inside the existing footer block — small, no extra whitespace. */914+-footer.site-footer .footer-provenance{margin:.5rem 0;font-size:.85rem;text-align:right}915++footer.site-footer .footer-provenance{margin:0;font-size:var(--fs-sm);text-align:left}916+ /* Navbar one-bar (m6/navbar, f0rge #18): logo hu13 • scrollable nav • repo.917+    Own classes only (.header-bar/.brand-lockup/.site-logo/.hu13-word/.sep/918+    .nav-scroll/.nav-scroll-row); earlier rules above are untouched. The nav919+@@ -134,7 +186,11 @@ footer.site-footer .footer-provenance{margin:.5rem 0;font-size:.85rem;text-align920+ .site-header .wrap.header-bar{display:flex;flex-wrap:nowrap;align-items:center;gap:.5rem .75rem}921+ .brand-lockup{display:inline-flex;align-items:center;gap:.5rem;flex:none;color:var(--fg);text-decoration:none;min-height:40px}922+ .brand-lockup:visited{color:var(--fg)}923+-.site-logo{display:block;width:3rem;height:3rem;flex:none}924++.gl0w-mark{font:600 .8rem/1 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.18em;925++  text-transform:lowercase;color:var(--cyan);border:1px solid var(--border);padding:.35rem .45rem}926++.brand-lockup:hover .gl0w-mark{color:var(--blue);border-color:var(--blue)}927++.lockup-slash{color:var(--border);font-weight:400}928++.site-logo{display:block;width:auto;height:1.75rem;flex:none}929+ .hu13-word{font-weight:700;color:var(--blue)}930+ .sep{flex:none;color:var(--muted)}931+ .site-header .site-nav.nav-scroll{flex:1 1 auto;min-width:0;background:none;border-bottom:none;overflow-x:auto;scroll-snap-type:none;-webkit-overflow-scrolling:touch}932+diff --git a/tests/brand.rs b/tests/brand.rs933+new file mode 100644934+index 0000000..d81c023935+--- /dev/null936++++ b/tests/brand.rs937+@@ -0,0 +1,123 @@938++//! f0rge #70: gl0w branding + gl0w.world attribution on every page,939++//! theme-aware logo, and an og:image social card.940++941++use std::path::{Path, PathBuf};942++use std::process::Command;943++944++fn fresh(prefix: &str) -> PathBuf {945++    let dir = std::env::temp_dir().join(format!(946++        "hu13-brand-{prefix}-{}-{}",947++        std::process::id(),948++        std::time::SystemTime::now()949++            .duration_since(std::time::UNIX_EPOCH)950++            .map(|d| d.as_nanos())951++            .unwrap_or(0)952++    ));953++    std::fs::create_dir_all(&dir).unwrap();954++    dir955++}956++957++fn git(repo: &Path, args: &[&str]) {958++    let st = Command::new("git")959++        .arg("-C")960++        .arg(repo)961++        .args(args)962++        .status()963++        .expect("spawn git");964++    assert!(st.success(), "git {args:?}");965++}966++967++fn build() -> PathBuf {968++    let repo = fresh("repo");969++    let out = fresh("out");970++    git(&repo, &["init", "-b", "main"]);971++    git(&repo, &["config", "user.name", "hu13-test"]);972++    git(&repo, &["config", "user.email", "[email protected]"]);973++    git(&repo, &["config", "commit.gpgsign", "false"]);974++    std::fs::write(repo.join("README.md"), "# brand\n").unwrap();975++    git(&repo, &["add", "-A"]);976++    git(&repo, &["commit", "-m", "brand"]);977++    let produced = Command::new(env!("CARGO_BIN_EXE_hu13"))978++        .arg("build")979++        .arg(&repo)980++        .arg("-o")981++        .arg(&out)982++        .output()983++        .unwrap();984++    assert!(985++        produced.status.success(),986++        "{}",987++        String::from_utf8_lossy(&produced.stderr)988++    );989++    out990++}991++992++#[test]993++fn header_and_footer_carry_gl0w_branding() {994++    let out = build();995++    for page in ["index.html", "agents.html", "issues/index.html"] {996++        let html = std::fs::read_to_string(out.join(page)).expect(page);997++        assert!(998++            html.contains("<span class=\"gl0w-mark\""),999++            "{page}: gl0w mark in header"1000++        );1001++        assert!(1002++            html.contains("hu13 — a gl0w project"),1003++            "{page}: brand tagline"1004++        );1005++        assert!(1006++            html.contains("href=\"https://gl0w.world\""),1007++            "{page}: links to gl0w.world"1008++        );1009++        assert!(1010++            html.contains("footer-provenance"),1011++            "{page}: provenance kept"1012++        );1013++        // Header lockup keeps the hu13 mark and is linked home.1014++        assert!(1015++            html.contains("<img class=\"site-logo\" src=\"/logo.svg\" alt=\"hu13 logo\""),1016++            "{page}: hu13 logo"1017++        );1018++        assert!(1019++            html.contains("href=\"/\" aria-label=\"hu13 by gl0w"),1020++            "{page}: lockup links home"1021++        );1022++    }1023++}1024++1025++#[test]1026++fn social_card_and_meta_present() {1027++    let out = build();1028++    let html = std::fs::read_to_string(out.join("index.html")).unwrap();1029++    for needle in [1030++        "<meta property=\"og:image\" content=\"/og.png\">",1031++        "<meta property=\"og:image:width\" content=\"1200\">",1032++        "<meta property=\"og:image:height\" content=\"630\">",1033++        "<meta name=\"twitter:card\" content=\"summary_large_image\">",1034++        "<meta property=\"og:site_name\" content=\"hu13 by gl0w\">",1035++    ] {1036++        assert!(html.contains(needle), "index.html has {needle}");1037++    }1038++    let png = std::fs::read(out.join("og.png")).expect("og.png emitted");1039++    assert!(png.starts_with(b"\x89PNG\r\n\x1a\n"), "real PNG");1040++    assert!(png.len() > 1000, "not a stub");1041++}1042++1043++#[test]1044++fn logo_has_no_baked_background() {1045++    let logo =1046++        std::fs::read_to_string(PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("static/logo.svg"))1047++            .unwrap();1048++    assert!(!logo.contains("fill=\"#1a1b26\""), "no dark slab");1049++    assert!(1050++        logo.contains("@media (prefers-color-scheme:light)"),1051++        "ink flips for light theme"1052++    );1053++    let css =1054++        std::fs::read_to_string(PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("static/style.css"))1055++            .unwrap();1056++    assert!(1057++        css.contains(".site-logo{display:block;width:auto;height:1.75rem"),1058++        "logo keeps its 3:1 aspect (was squeezed into 48x48)"1059++    );1060++}1061+diff --git a/tests/favicon.rs b/tests/favicon.rs1062+index 61c916e..cb85086 1006441063+--- a/tests/favicon.rs1064++++ b/tests/favicon.rs1065+@@ -80,7 +80,7 @@ fn build_fixture() -> (PathBuf, PathBuf) {1066+ const HEAD_TAGS: &[&str] = &[1067+     "<link rel=\"icon\" type=\"image/svg+xml\" href=\"/favicon.svg\">",1068+     "<link rel=\"apple-touch-icon\" href=\"/favicon.svg\">",1069+-    "<meta name=\"theme-color\" media=\"(prefers-color-scheme: light)\" content=\"#d5d6db\">",1070++    "<meta name=\"theme-color\" media=\"(prefers-color-scheme: light)\" content=\"#f6f7f9\">",1071+     "<meta name=\"theme-color\" media=\"(prefers-color-scheme: dark)\" content=\"#1a1b26\">",1072+     "<meta property=\"og:title\"",1073+     "<meta property=\"og:type\" content=\"website\">",1074+@@ -192,9 +192,10 @@ fn favicon_emitted_svg_only_no_binary_blobs() {1075+                     .extension()1076+                     .map(|e| e.to_string_lossy().to_ascii_lowercase())1077+                     .unwrap_or_default();1078++                let is_social_card = p.file_name().is_some_and(|n| n == "og.png");1079+                 assert!(1080+-                    !["ico", "png", "icns"].contains(&ext.as_str()),1081+-                    "no binary icon blobs: {}",1082++                    !["ico", "png", "icns"].contains(&ext.as_str()) || is_social_card,1083++                    "no binary icon blobs (social card excepted): {}",1084+                     p.display()1085+                 );1086+             }1087+diff --git a/tests/light_theme.rs b/tests/light_theme.rs1088+index e403ef7..d7cb27c 1006441089+--- a/tests/light_theme.rs1090++++ b/tests/light_theme.rs1091+@@ -126,8 +126,10 @@ fn light_media_block_overrides_vars() {1092+     // Tokyo Night Light palette spot-checks inside the light block.1093+     let inner = light_block_inner(&css);1094+     for var in [1095+-        "--bg:#d5d6db",1096++        "--bg:#f6f7f9",1097+         "--fg:#343b58",1098++        "--muted:#4a5273",1099++        "--surface:#ffffff",1100+         "--blue:#34548a",1101+         "--cyan:#0f4b6e",1102+         "--red:#8c4351",1103+@@ -162,9 +164,10 @@ fn no_hardcoded_palette_hex_outside_root() {1104+     let css = without_root_blocks(&without_comments(&css()));1105+     let palette = [1106+         "#1a1b26", "#16161e", "#c0caf5", "#565f89", "#7aa2f7", "#7dcfff", "#9ece6a", "#e0af68",1107+-        "#f7768e", "#292e42", "#1f2335", "#9aa5ce", "#d5d6db", "#343b58", "#34548a", "#0f4b6e",1108+-        "#8c4351", "#33635c", "#cbccd3", "#b4b8c7", "#5a4a78", "#8c6c3e", "#e9e9ed", "#233328",1109+-        "#38232e", "#c6d4ca", "#d9c2c7",1110++        "#f7768e", "#292e42", "#1f2335", "#9aa5ce", "#f6f7f9", "#343b58", "#34548a", "#0f4b6e",1111++        "#8c4351", "#33635c", "#eceef2", "#e4e7ee", "#5a4a78", "#7d5f33", "#ffffff", "#233328",1112++        "#38232e", "#c6d4ca", "#d9c2c7", "#d6dae2", "#4a5273", "#1f2335", "#24283b", "#bb9af7",1113++        "#ff9e64", "#7f87ad", "#2ac3de", "#8c6c3e",1114+     ];1115+     for hex in palette {1116+         assert!(1117+@@ -217,7 +220,7 @@ fn light_budget_and_sharp_corners() {1118+     let path = manifest().join("static").join("style.css");1119+     let len = std::fs::metadata(&path).expect("style.css exists").len();1120+     assert!(1121+-        len < 15360,1122+-        "static/style.css is {len} bytes, budget is 15360 (see gl0w.md)"1123++        len < 32768,1124++        "static/style.css is {len} bytes, budget is 32768 (see gl0w.md)"1125+     );1126+ }1127+diff --git a/tests/logo.rs b/tests/logo.rs1128+index 21c3518..12537d0 1006441129+--- a/tests/logo.rs1130++++ b/tests/logo.rs1131+@@ -137,9 +137,17 @@ fn logo_svg_exists_valid_tiny() {1132+         "svg namespace present"1133+     );1134+     assert!(svg.contains("viewBox"), "scales via viewBox (16px + 32px)");1135+-    for color in ["#1a1b26", "#7aa2f7", "#7dcfff"] {1136++    for color in ["#7aa2f7", "#7dcfff", "#c0caf5"] {1137+         assert!(svg.contains(color), "Tokyo Night palette keeps {color}");1138+     }1139++    assert!(1140++        !svg.contains("fill=\"#1a1b26\""),1141++        "logo has no baked-in background (light theme must not show a dark slab)"1142++    );1143++    assert!(1144++        svg.contains("prefers-color-scheme:light"),1145++        "lettering flips ink on the light theme"1146++    );1147+     assert_sharp_no_gradient("logo.svg", &svg);1148+     // Logo-text (#27): hu13 lettering is hand-written <path>, never1149+     // <text>/fonts, so the header lockup has no font dependency.1150+@@ -182,9 +190,13 @@ fn favicon_variant_is_simplified_mark_only() {1151+         "favicon is mark-only (no letter <path>s)"1152+     );1153+     assert_sharp_no_gradient("favicon.svg", &fav);1154+-    for color in ["#1a1b26", "#7aa2f7", "#7dcfff"] {1155++    for color in ["#7aa2f7", "#7dcfff"] {1156+         assert!(fav.contains(color), "favicon keeps {color}");1157+     }1158++    assert!(1159++        !fav.contains("fill=\"#1a1b26\""),1160++        "favicon has no baked-in background"1161++    );1162+     let logo_len = std::fs::metadata(manifest().join("static").join("logo.svg"))1163+         .expect("static/logo.svg exists")1164+         .len();1165+diff --git a/tests/polish.rs b/tests/polish.rs1166+index 6e95324..ea48bc3 1006441167+--- a/tests/polish.rs1168++++ b/tests/polish.rs1169+@@ -129,8 +129,8 @@ fn css_budget_under_15k() {1170+     let css = manifest().join("static").join("style.css");1171+     let len = std::fs::metadata(&css).expect("style.css exists").len();1172+     assert!(1173+-        len < 15360,1174+-        "static/style.css is {len} bytes, budget is 15360 (see gl0w.md)"1175++        len < 32768,1176++        "static/style.css is {len} bytes, budget is 32768 (see gl0w.md)"1177+     );1178+ }1179+ 1180+diff --git a/tests/responsive.rs b/tests/responsive.rs1181+index 1cf554a..bb72480 1006441182+--- a/tests/responsive.rs1183++++ b/tests/responsive.rs1184+@@ -171,8 +171,8 @@ fn css_budget_and_sharp_corners() {1185+     let path = manifest().join("static").join("style.css");1186+     let len = std::fs::metadata(&path).expect("style.css exists").len();1187+     assert!(1188+-        len < 15360,1189+-        "static/style.css is {len} bytes, budget is 15360 (see gl0w.md)"1190++        len < 32768,1191++        "static/style.css is {len} bytes, budget is 32768 (see gl0w.md)"1192+     );1193+     let css = css();1194+     for line in css.lines() {1195+diff --git a/tests/theme_contrast.rs b/tests/theme_contrast.rs1196+new file mode 1006441197+index 0000000..9ce311f1198+--- /dev/null1199++++ b/tests/theme_contrast.rs1200+@@ -0,0 +1,157 @@1201++//! f0rge #76: every text color must pass WCAG AA (4.5:1) in both themes.1202++//! Parsed from `static/style.css` so the palette cannot drift from the1203++//! rule set without this test noticing.1204++1205++use std::path::PathBuf;1206++1207++fn css() -> String {1208++    let p = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("static/style.css");1209++    std::fs::read_to_string(p).expect("style.css")1210++}1211++1212++/// Body of a `{...}` block starting at `at` (brace-matched).1213++fn block(css: &str, at: usize) -> &str {1214++    let open = css[at..].find('{').expect("open brace") + at;1215++    let bytes = css.as_bytes();1216++    let mut depth = 0;1217++    let mut i = open;1218++    while i < bytes.len() {1219++        match bytes[i] {1220++            b'{' => depth += 1,1221++            b'}' => {1222++                depth -= 1;1223++                if depth == 0 {1224++                    return &css[open + 1..i];1225++                }1226++            }1227++            _ => {}1228++        }1229++        i += 1;1230++    }1231++    panic!("unclosed block");1232++}1233++1234++fn var(block: &str, name: &str) -> String {1235++    let needle = format!("{name}:");1236++    let start = block1237++        .find(&needle)1238++        .unwrap_or_else(|| panic!("{name} missing"));1239++    let rest = &block[start + needle.len()..];1240++    let end = rest.find([';', '}']).unwrap_or(rest.len());1241++    rest[..end].trim().to_string()1242++}1243++1244++fn channel(c: f64) -> f64 {1245++    if c <= 0.039_28 {1246++        c / 12.921247++    } else {1248++        ((c + 0.055) / 1.055).powf(2.4)1249++    }1250++}1251++1252++fn lum(hex: &str) -> f64 {1253++    let h = hex.trim_start_matches('#');1254++    let r = u8::from_str_radix(&h[0..2], 16).unwrap() as f64 / 255.0;1255++    let g = u8::from_str_radix(&h[2..4], 16).unwrap() as f64 / 255.0;1256++    let b = u8::from_str_radix(&h[4..6], 16).unwrap() as f64 / 255.0;1257++    0.2126 * channel(r) + 0.7152 * channel(g) + 0.0722 * channel(b)1258++}1259++1260++fn contrast(a: &str, b: &str) -> f64 {1261++    let (hi, lo) = {1262++        let (la, lb) = (lum(a), lum(b));1263++        if la > lb {1264++            (la, lb)1265++        } else {1266++            (lb, la)1267++        }1268++    };1269++    (hi + 0.05) / (lo + 0.05)1270++}1271++1272++fn check(theme: &str, block: &str, pairs: &[(&str, &str)]) {1273++    for (fg, bg) in pairs {1274++        let f = var(block, fg);1275++        let b = var(block, bg);1276++        let ratio = contrast(&f, &b);1277++        assert!(1278++            ratio >= 4.5,1279++            "{theme}: {fg} {f} on {bg} {b} = {ratio:.2}:1 (AA needs 4.5)"1280++        );1281++    }1282++}1283++1284++#[test]1285++fn both_themes_pass_aa_for_text_colors() {1286++    let css = css();1287++    let dark_at = css.find(":root{").expect("dark root");1288++    let dark = block(&css, dark_at);1289++    let light_at = css1290++        .find("@media (prefers-color-scheme:light)")1291++        .expect("light block");1292++    let light = block(&css, light_at);1293++1294++    let pairs = [1295++        ("--fg", "--bg"),1296++        ("--fg", "--bg-alt"),1297++        ("--fg", "--surface"),1298++        ("--fg", "--surface-2"),1299++        ("--fg-dim", "--bg"),1300++        ("--fg-dim", "--bg-alt"),1301++        ("--fg-dim", "--bg-th"),1302++        ("--muted", "--bg"),1303++        ("--muted", "--bg-th"),1304++        ("--blue", "--bg"),1305++        ("--blue", "--surface"),1306++        ("--cyan", "--bg"),1307++        ("--green", "--bg"),1308++        ("--red", "--bg"),1309++        ("--yellow", "--bg"),1310++        ("--state-open", "--bg"),1311++        ("--state-merged", "--bg"),1312++        ("--state-closed", "--bg"),1313++        ("--tok-kw", "--surface"),1314++        ("--tok-str", "--surface"),1315++        ("--tok-num", "--surface"),1316++        ("--tok-com", "--surface"),1317++        ("--tok-com", "--surface-2"),1318++        ("--tok-fn", "--surface"),1319++        ("--tok-type", "--surface"),1320++    ];1321++    check("dark", dark, &pairs);1322++    check("light", light, &pairs);1323++}1324++1325++#[test]1326++fn themes_define_the_same_vars() {1327++    let css = css();1328++    let dark = block(&css, css.find(":root{").expect("dark root"));1329++    let light = block(1330++        &css,1331++        css.find("@media (prefers-color-scheme:light)")1332++            .expect("light block"),1333++    );1334++    // Every dark color var has a light override (scale vars may be shared).1335++    for line in dark.lines() {1336++        let Some(name) = line1337++            .trim()1338++            .strip_prefix("--")1339++            .and_then(|l| l.split(':').next())1340++        else {1341++            continue;1342++        };1343++        if name.starts_with("gap-")1344++            || name.starts_with('s')1345++                && name.len() <= 21346++                && name[1..].chars().all(|c| c.is_ascii_digit())1347++            || name.starts_with("fs-")1348++            || name == "radius"1349++        {1350++            continue;1351++        }1352++        assert!(1353++            light.contains(&format!("--{name}:")),1354++            "light theme must override --{name}"1355++        );1356++    }1357++}1358+-- 1359+2.56.01360+
.forge/prs/0d27cbff-baad-47a5-afb4-1e84014f080b/pr.md+13 −0
diff --git a/.forge/prs/0d27cbff-baad-47a5-afb4-1e84014f080b/pr.md b/.forge/prs/0d27cbff-baad-47a5-afb4-1e84014f080b/pr.mdnew file mode 100644index 0000000..1d320a5--- /dev/null+++ b/.forge/prs/0d27cbff-baad-47a5-afb4-1e84014f080b/pr.md@@ -0,0 +1,13 @@1+---2+id: 0d27cbff-baad-47a5-afb4-1e84014f080b3+title: 'Brand + theme foundations: gl0w lockup, AA palette, CSS budget (#69 #70 #76)'4+state: merged5+base: master6+head: issue-69-brand-foundations7+draft: false8+issues:9+- f4e0b79d-0312-4d4d-b014-84337f4ef3db10+ci: pass11+created: 2026-10-27T15:59:14.546815817Z12+updated: 2026-10-27T16:00:02.303795215Z13+---