jekyll-theme-zer0 1.19.1 → 1.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +404 -0
  3. data/README.md +27 -19
  4. data/_data/authors.yml +154 -5
  5. data/_data/backlog.yml +12 -5
  6. data/_data/content_statistics.yml +273 -297
  7. data/_data/features.yml +4 -25
  8. data/_data/navigation/README.md +24 -0
  9. data/_data/navigation/about.yml +2 -0
  10. data/_data/navigation/main.yml +2 -7
  11. data/_data/roadmap.yml +86 -12
  12. data/_data/roadmap_plan.yml +37 -0
  13. data/_data/routing.yml +73 -0
  14. data/_includes/components/author-avatar-url.html +28 -0
  15. data/_includes/components/author-bio.html +86 -0
  16. data/_includes/components/author-card.html +184 -121
  17. data/_includes/components/author-eeat.html +10 -4
  18. data/_includes/components/info-section.html +1 -1
  19. data/_includes/components/mermaid.html +0 -3
  20. data/_includes/components/post-card.html +19 -9
  21. data/_includes/content/giscus.html +3 -2
  22. data/_includes/core/footer-fabs.html +28 -0
  23. data/_includes/core/footer.html +7 -17
  24. data/_includes/core/head.html +2 -2
  25. data/_includes/navigation/breadcrumbs.html +20 -2
  26. data/_includes/navigation/local-graph.html +18 -2
  27. data/_includes/obsidian/full-graph.html +4 -6
  28. data/_layouts/article.html +44 -74
  29. data/_layouts/author.html +274 -0
  30. data/_layouts/authors.html +55 -0
  31. data/_layouts/news.html +3 -3
  32. data/_layouts/note.html +21 -6
  33. data/_layouts/notebook.html +21 -6
  34. data/_layouts/root.html +31 -17
  35. data/_layouts/section.html +3 -3
  36. data/_plugins/author_pages_generator.rb +121 -0
  37. data/_sass/components/_author.scss +219 -0
  38. data/_sass/components/_content-tables.scss +16 -1
  39. data/_sass/components/_notes-index.scss +102 -0
  40. data/_sass/components/_search-modal.scss +40 -0
  41. data/_sass/components/_ui-enhancements.scss +570 -0
  42. data/_sass/core/_docs-code-examples.scss +463 -0
  43. data/_sass/core/_docs-layout.scss +0 -453
  44. data/_sass/core/_navbar.scss +253 -0
  45. data/_sass/core/_sidebar-extras.scss +79 -0
  46. data/_sass/core/_toc.scss +87 -0
  47. data/_sass/core/_variables.scss +7 -142
  48. data/_sass/custom.scss +24 -1122
  49. data/_sass/layouts/_global-chrome.scss +59 -0
  50. data/assets/css/main.scss +19 -2
  51. data/assets/js/author-profile.js +190 -0
  52. data/assets/js/modules/navigation/navbar.js +104 -0
  53. data/assets/js/obsidian-graph.js +2 -2
  54. data/assets/js/obsidian-local-graph.js +11 -5
  55. data/assets/vendor/cytoscape/cytoscape.min.js +32 -0
  56. data/scripts/README.md +39 -0
  57. data/scripts/bin/validate +11 -1
  58. data/scripts/dev/css-diff.sh +49 -0
  59. data/scripts/dev/shot.js +37 -0
  60. data/scripts/features/generate-preview-images +110 -6
  61. data/scripts/features/pixelate-preview-images +126 -0
  62. data/scripts/features/pixelate_images.py +662 -0
  63. data/scripts/github-setup.sh +0 -0
  64. data/scripts/lib/preview_generator.py +47 -3
  65. data/scripts/pixelate-preview-images.sh +12 -0
  66. data/scripts/sync-backlog.rb +149 -26
  67. data/scripts/sync-plan.rb +164 -0
  68. data/scripts/sync-plan.sh +21 -0
  69. data/scripts/test/integration/auto-version +10 -8
  70. data/scripts/test/lib/run_tests.sh +2 -0
  71. data/scripts/test/lib/test_content_review.sh +205 -0
  72. data/scripts/test/lib/test_pixelate_images.sh +108 -0
  73. metadata +29 -20
  74. data/_data/hub.yml +0 -68
  75. data/_data/hub_index.yml +0 -203
  76. data/_data/navigation/hub.yml +0 -110
  77. data/assets/vendor/font-awesome/css/all.min.css +0 -9
  78. data/assets/vendor/font-awesome/webfonts/fa-brands-400.ttf +0 -0
  79. data/assets/vendor/font-awesome/webfonts/fa-brands-400.woff2 +0 -0
  80. data/assets/vendor/font-awesome/webfonts/fa-regular-400.ttf +0 -0
  81. data/assets/vendor/font-awesome/webfonts/fa-regular-400.woff2 +0 -0
  82. data/assets/vendor/font-awesome/webfonts/fa-solid-900.ttf +0 -0
  83. data/assets/vendor/font-awesome/webfonts/fa-solid-900.woff2 +0 -0
  84. data/assets/vendor/font-awesome/webfonts/fa-v4compatibility.ttf +0 -0
  85. data/assets/vendor/font-awesome/webfonts/fa-v4compatibility.woff2 +0 -0
  86. data/assets/vendor/jquery/jquery-3.7.1.min.js +0 -2
  87. data/scripts/lib/hub.rb +0 -208
  88. data/scripts/provision-org-sites.rb +0 -252
  89. data/scripts/provision-org-sites.sh +0 -23
  90. data/scripts/sync-hub-metadata.rb +0 -184
  91. data/scripts/sync-hub-metadata.sh +0 -22
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eee5e695e786a8beae6a6a98fe23447c7d93efc282ff035b2a8ceb1b7a645dc2
4
- data.tar.gz: 4eaec3a38a92a070546da29b0f68e5ca1c88ca2bde5b4cb39099f1f5029628e4
3
+ metadata.gz: 8552bc1992ed59b6f63392207f6a49d12bc9e66ac16cd43b61bb57700f45395e
4
+ data.tar.gz: 54304e964cff2dc7fafe3ab03c722dfac994011994be96201d700a67e224ec35
5
5
  SHA512:
6
- metadata.gz: faae528fee5ced31d52aaacc0d68868613abe1fdfe79286e2c80aca63eff2c6513f9cb0920f795251348a6e2171ca9dc7d3eae55062ca89fe20c01ed4d5060e4
7
- data.tar.gz: 6e67acd65dc9bcc7bdd86fafb65c1262a09494de52ca86f9593030cdd48331981de7bbe9324e27e36505d49017a6623653cd56b2cc26ff0fd2989819fbc0d780
6
+ metadata.gz: d656b64ce2440c13047ce0802ca968c767cbcfe20eb8b442973e5cc0a63aafb29263081f2ab5c5737260775643193e9fad9eaa08680fe0151b8442efae15128d
7
+ data.tar.gz: a1a9000773b53140084dd986072d1cbfacda99ba66859cfd5cd82965e163b1aa47184ef64e56cb41ed0a6e0ae2950a96a5f4935e637f073c756de757afb36a53
data/CHANGELOG.md CHANGED
@@ -5,6 +5,410 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.21.0](https://github.com/bamr87/zer0-mistakes/compare/v1.20.2...v1.21.0) (2026-06-26)
9
+
10
+
11
+ ### Features
12
+
13
+ * **automation:** committee planning + specialized executor agents (Phase 4) ([#226](https://github.com/bamr87/zer0-mistakes/issues/226)) ([1e9016b](https://github.com/bamr87/zer0-mistakes/commit/1e9016b869ff33f26fc60d3ae27e7fcd0216e802))
14
+ * **automation:** issue intake + /issue-implement routing (Phases 2-3) ([#225](https://github.com/bamr87/zer0-mistakes/issues/225)) ([21a7008](https://github.com/bamr87/zer0-mistakes/commit/21a70080b2814827bd390201e1ec76fb2b9a874e))
15
+ * **scripts:** issue adoption in sync-backlog (Phase 1) ([#224](https://github.com/bamr87/zer0-mistakes/issues/224)) ([512068e](https://github.com/bamr87/zer0-mistakes/commit/512068e2556be7fe3a4c7870d9feab0ca52955d8))
16
+
17
+ ## [1.20.2](https://github.com/bamr87/zer0-mistakes/compare/v1.20.1...v1.20.2) (2026-06-25)
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * **navigation:** stop fixed navbar being cut off by page overflow ([#215](https://github.com/bamr87/zer0-mistakes/issues/215)) ([8c32563](https://github.com/bamr87/zer0-mistakes/commit/8c325633ab7f82f96fa5605716d995fc84935af9))
23
+ * **release:** re-sync Gemfile.lock and package-lock.json to 1.20.1 ([#216](https://github.com/bamr87/zer0-mistakes/issues/216)) ([294575b](https://github.com/bamr87/zer0-mistakes/commit/294575b6b70c1a2ee7f08e839457dcd30625043b))
24
+
25
+ ## [1.20.1](https://github.com/bamr87/zer0-mistakes/compare/v1.20.0...v1.20.1) (2026-06-24)
26
+
27
+
28
+ ### Bug Fixes
29
+
30
+ * harden remote-theme consumer experience + vendor cytoscape ([#205](https://github.com/bamr87/zer0-mistakes/issues/205)) ([c6b0312](https://github.com/bamr87/zer0-mistakes/commit/c6b0312312842c9bf88fccd81472483fb4d15284))
31
+ * **layouts:** render hero image for breaking posts, not just featured ([#189](https://github.com/bamr87/zer0-mistakes/issues/189)) ([4473a07](https://github.com/bamr87/zer0-mistakes/commit/4473a072fcc5d1018a196f8be94af5e0ba31620a))
32
+
33
+ ## [1.20.0](https://github.com/bamr87/zer0-mistakes/compare/v1.19.0...v1.20.0) (2026-06-22)
34
+
35
+
36
+ ### Features
37
+
38
+ * **authors:** unified author profiles & About-the-Author across collections ([#193](https://github.com/bamr87/zer0-mistakes/issues/193)) ([a6db304](https://github.com/bamr87/zer0-mistakes/commit/a6db30422a5bce69a55acaba2989b461d781e013))
39
+ * **scripts:** add dependency-free preview-image pixelator ([#178](https://github.com/bamr87/zer0-mistakes/issues/178)) ([ada91ee](https://github.com/bamr87/zer0-mistakes/commit/ada91ee255d790ea94063419afc8ff9621fe06b0))
40
+
41
+
42
+ ### Bug Fixes
43
+
44
+ * **chat-proxy:** identify as Claude Code for subscription OAuth tokens ([#185](https://github.com/bamr87/zer0-mistakes/issues/185)) ([8924efd](https://github.com/bamr87/zer0-mistakes/commit/8924efd167f3cddf866df2225c069470d0f8f13a))
45
+ * **config:** restore remote_theme contract + add missing lastmod (unblocks CI) ([#174](https://github.com/bamr87/zer0-mistakes/issues/174)) ([b995115](https://github.com/bamr87/zer0-mistakes/commit/b995115a4ffb745704f1111539085a610ba94053))
46
+ * **config:** restore zer0-mistakes.com site identity + CNAME (site was down) ([#176](https://github.com/bamr87/zer0-mistakes/issues/176)) ([9ef8ff8](https://github.com/bamr87/zer0-mistakes/commit/9ef8ff8335e0a9f394da1ec342f388d31470eb22))
47
+
48
+
49
+ ### Performance Improvements
50
+
51
+ * slim Docker build, cache page-invariant chrome, drop dead vendor weight ([#186](https://github.com/bamr87/zer0-mistakes/issues/186)) ([28ba4eb](https://github.com/bamr87/zer0-mistakes/commit/28ba4eb0948b60cee94415865f66dd4a9a58391d))
52
+
53
+
54
+ ### Reverts
55
+
56
+ * remove Year of AI / org content-hub pivot, restore theme landing page ([#180](https://github.com/bamr87/zer0-mistakes/issues/180)) ([3960f65](https://github.com/bamr87/zer0-mistakes/commit/3960f65b1af4c750216deda0d032a309b0f93b78))
57
+
58
+ ## [Unreleased]
59
+
60
+ ### Added
61
+ - **Visual-evidence standard + reusable evidence kit.** UI/behavioural changes
62
+ now ship a regression test **and** before/after visual evidence, surfaced in
63
+ release notes and enforced in CI:
64
+ - `test/visual/evidence-kit.mjs` — a config-driven generator that drives the
65
+ live site across a viewport matrix + configurations, measures page overflow
66
+ in before/after states, composes labelled montages (Playwright, no
67
+ ImageMagick), and writes `metrics.json` + a CHANGELOG snippet.
68
+ - `.github/skills/visual-evidence/SKILL.md` + `visual-evidence.instructions.md`
69
+ codify the standard (and how to file issues a fix uncovers into the backlog
70
+ loop). Indexed from `AGENTS.md`, `CLAUDE.md`, and the instructions README.
71
+ - `.github/workflows/evidence-gate.yml` — a required check that fails a UI PR
72
+ missing the test/evidence (opt-out label `skip-evidence`).
73
+ - **Autonomy policy extended** (`continuous-evolution.md`,
74
+ `backlog-implement.prompt.md`, `auto-merge.yml`): a `risk: low` **fix** that
75
+ ships tests + evidence is now auto-merge-eligible alongside docs/deps/lint.
76
+
77
+ ### Fixed
78
+ - **Navbar no longer appears "cut off" at certain widths.** The root cause was
79
+ page-level horizontal overflow, not the navbar itself: because the header is
80
+ `position: fixed`, any element that pushed the page wider than the viewport
81
+ (a wide markdown table, a long inline-code token, an unwrapped Bootstrap
82
+ `.row`) created a sideways scrollbar and left the navbar's right edge
83
+ uncovered. Fixes:
84
+ - Wide content tables now scroll **inside** their `.content-table-wrapper`
85
+ card (`overflow-x: auto`) instead of overflowing the page — the wrapper that
86
+ `table-copy.js` injects previously had `overflow: visible`, which also
87
+ bypassed the existing mobile responsive-table fallback.
88
+ - Long unbroken inline-code tokens wrap in content areas instead of forcing a
89
+ horizontal scrollbar.
90
+ - A theme-wide `html { overflow-x: clip }` safety net guarantees no stray
91
+ element can make the fixed navbar look cut off. `clip` is used instead of
92
+ `hidden` so `position: sticky` (docs sidebar / TOC) keeps working; wide
93
+ content keeps its own local scroll so nothing is hidden.
94
+ - The mobile menu/settings offcanvas width is clamped (`min(21rem, 86vw)`) so
95
+ the slide-in panel and its close button always fit narrow phones, instead of
96
+ Bootstrap's fixed 400px overflowing the viewport.
97
+ - **Giscus comments were silently disabled** ([#201](https://github.com/bamr87/zer0-mistakes/issues/201)).
98
+ `_config.yml` defined the comment block under the misspelled key `gisgus:`
99
+ while every template reads `site.giscus`, so comments never rendered. Renamed
100
+ the key to `giscus:`. Fixing this also surfaced and fixed a latent
101
+ include-path error in `_includes/content/giscus.html` (a literal
102
+ `include giscus.html` Liquid tag inside an HTML doc comment) that only fired
103
+ once comments were enabled.
104
+ - **Theme chrome no longer injects internal links that 404 for remote-theme
105
+ Pages consumers** ([#204](https://github.com/bamr87/zer0-mistakes/issues/204)).
106
+ Tag badges (`article`/`note`/`notebook`), the breadcrumb collection-root crumb,
107
+ the local-graph "Full graph" link, and author byline profile links are now
108
+ **existence-gated** — they render as plain text when the target page isn't in
109
+ the build instead of linking to a 404. The post category base is configurable
110
+ via `category_base` (default `/news`); the tags page via `tags_page` (default
111
+ `/tags/`); the full-graph page via `obsidian_graph_url`.
112
+
113
+ ### Changed
114
+ - **Vendored cytoscape.js** ([#152](https://github.com/bamr87/zer0-mistakes/issues/152)),
115
+ the last runtime CDN dependency in the theme. `cytoscape@3.30.0` is committed
116
+ under `assets/vendor/cytoscape/` (matching the Bootstrap/Icons/Mermaid
117
+ pattern) and loaded locally by the Obsidian local-graph FAB and full-graph
118
+ page, so the graph works under strict CSP and offline. Added to
119
+ `vendor-manifest.json`.
120
+
121
+ ### Added
122
+ - **Dev-mode navbar fit warnings.** On local/dev hosts only, the navbar module
123
+ logs an actionable `console.warn` when the inline menubar has more top-level
124
+ items than fit the bar, or when page content overflows the viewport (the usual
125
+ "navbar looks cut off" cause) — naming the widest offending element. Silent on
126
+ deployed sites.
127
+ - **Quickstart documentation hub + fork/remote-theme guide (#126).** Fleshes out
128
+ `pages/_docs/quickstart/` (previously only `bare-minimum.md`): a new
129
+ `index.md` hub that links the available quickstart paths (bare-minimum,
130
+ fork-and-deploy, and the step-by-step series), and a full
131
+ `fork-and-deploy.md` guide covering the standard fork or remote-theme GitHub
132
+ Pages workflow end to end (choose model → setup → local preview → enable Pages
133
+ → verify → troubleshoot). Both pages carry annotated screenshots under
134
+ `assets/images/docs/quickstart/` and score 🟢 excellent in the content
135
+ reviewer.
136
+ - **Remote-theme consumer checklist doc**
137
+ ([#203](https://github.com/bamr87/zer0-mistakes/issues/203),
138
+ [#202](https://github.com/bamr87/zer0-mistakes/issues/202)). New
139
+ `pages/_docs/deployment/remote-theme-checklist.md` documenting what
140
+ `remote_theme` does not deliver on GitHub Pages (config, data, plugins) and how
141
+ to fill each gap — including the hand-authored `/search.json` + `/sitemap/`
142
+ files that the plugin-only generator can't produce in Pages safe mode.
143
+ - **Contributor workflow guardrails.** New `change-workflow` skill
144
+ (`.github/skills/change-workflow/SKILL.md`) codifying the branch → commit → PR
145
+ flow for any change (branch-first, one concern per PR, stage-by-path,
146
+ worktrees for parallel work, splitting a messy working tree). Paired with
147
+ expanded `version-control.instructions.md` rules — working-tree/branch
148
+ discipline, the `version.rb` ↔ `Gemfile.lock` invariant, and keeping generated
149
+ artifacts out of feature PRs — and indexed from `AGENTS.md`, `CLAUDE.md`, and
150
+ `.github/instructions/README.md`.
151
+ ### Tests
152
+ - **Navbar responsiveness regression suite.** New
153
+ `test/visual/navbar-responsive.spec.js` (smoke tier) sweeps a 16-width matrix
154
+ (320 → 1920px) asserting no page-level horizontal overflow, the fixed header
155
+ spans the full viewport, the search/settings cluster stays on-screen, the
156
+ brand renders, and the inline menubar never clips its items. Adds offcanvas-,
157
+ dropdown-, long-title-, and many-items- fit checks, plus a reusable
158
+ `measureNavbarLayout()` fixture (overflow detection is element-level so it
159
+ still catches regressions the `overflow-x: clip` net would otherwise hide).
160
+ - **Unit tests for the `content-review.rb` scoring engine (#166).** New
161
+ `scripts/test/lib/test_content_review.sh` drives the deterministic content
162
+ reviewer against synthetic Markdown fixtures using the real production config
163
+ and schema: asserts a well-formed docs page scores ≥ 80, that removing the
164
+ required `description` lowers the score and reports the issue, that a closing
165
+ bare ` ``` ` after a language-tagged fence is not flagged (the v1.18.1
166
+ regression), and that `--strict` exits non-zero when a file is below the fail
167
+ threshold (while warn mode exits 0). Runs under `LC_ALL=C` for
168
+ locale-independence parity with the T-015 guard.
169
+ - **Playwright smoke specs for the search modal and AI chat widget (#167,
170
+ #168).** New `test/visual/search.spec.js` covers the site-wide search modal
171
+ (ZER0-032): the `/` shortcut opens it and focuses the input, Escape closes it,
172
+ a query populates results from `/search.json`, and opening search closes the
173
+ Settings offcanvas without stacking backdrops. New `test/visual/ai-chat.spec.js`
174
+ covers the AI chat widget (ZER0-060): the render guard's positive path (FAB +
175
+ config present), and the FAB ⇄ panel toggle via click, close button, and
176
+ Escape — all client-side, no AI backend. Note: the smoke build
177
+ (`_config.yml,_config_dev.yml`) sets `ai_chat.proxy_ready: true`, so the widget
178
+ renders in the test environment; the specs assert that real behavior.
179
+ - **CI coverage for the installer wizard and upgrade path (#147).** New
180
+ `test/test_install_wizard_upgrade.sh` (auto-discovered by the
181
+ `test_install_*.sh` glob in CI) covers two previously-untested libraries:
182
+ it drives the non-AI wizard prompt helpers (`_wiz_prompt`, `_wiz_confirm`,
183
+ `_wiz_choose`) non-interactively with piped answers — defaults, typed input,
184
+ yes/no confirmation, numbered/by-name menu selection, out-of-range fallback —
185
+ and exercises `upgrade.sh` end to end: version detection (marker, `_config.yml`
186
+ fallback, unknown), a detect→migrate→verify run across a version gap, the
187
+ dry-run (no-write) branch, and the already-current no-op branch.
188
+ - **Unit tests for `sanitize_config_filter.rb` (T-023).** Added 12 Minitest
189
+ specs to `test/test_plugins.rb` covering both regex paths of the
190
+ security-critical Liquid filter: `SENSITIVE_KEY_RE` matches `api_key`,
191
+ `apikey`, `secret`, `password`, and `token` (case-insensitive); `PHC_VALUE_RE`
192
+ catches PostHog project keys; mixed multi-line input produces correct partial
193
+ redaction; and edge cases (`nil`, empty string) return without error.
194
+ ### Added
195
+ - **Author profiles ("About the Author") across all collections.** A single,
196
+ layered author system replaces the three divergent ad-hoc treatments that
197
+ existed before:
198
+ - `components/author-card.html` is now the canonical rendering primitive
199
+ (`inline` / `compact` / `full`), with avatars, profile links, schema.org
200
+ `Person` microdata, and expertise chips.
201
+ - New `components/author-bio.html` renders the shared "About the Author"
202
+ section (used by the `article`, `note`, and `notebook` layouts), gated by
203
+ the previously-unused `author_profile` front-matter flag.
204
+ - New `author` / `authors` layouts add per-author profile pages at
205
+ `/authors/:key/` (content aggregated across **every** collection) and an
206
+ `/authors/` directory index, linked from the navbar (under **About**) and
207
+ the footer quick links. Each profile is **interactive**: a hero with
208
+ bio/blurb, an at-a-glance stats dashboard that doubles as type filters
209
+ (Posts / Docs / Notes / …), free-text search over titles + tags, sort
210
+ (newest / oldest / A–Z), a clickable topic/tag cloud, a live result count,
211
+ and deep-linkable filters via the URL hash — powered by the new
212
+ progressive-enhancement `assets/js/author-profile.js` (with JS off it falls
213
+ back to a full, crawlable grid). Emits `schema.org/CollectionPage` +
214
+ `ItemList` structured data.
215
+ - New `_plugins/author_pages_generator.rb` auto-generates those pages for
216
+ each `_data/authors.yml` entry (opt out per author with `profile: false`,
217
+ or globally with `authors.generate_pages: false`); profiles for this site's
218
+ authors are also committed under `/authors/` so they build under GitHub
219
+ Pages safe mode, mirroring the committed `search.json` / `sitemap` pattern.
220
+ - New `_sass/components/_author.scss` styling (dark-mode safe, token-driven).
221
+ - `_data/authors.yml` documents the new `tagline`, `location`, `expertise`,
222
+ and `profile` fields.
223
+ - **AI author personas.** An author can be flagged `ai: true` with a `persona`
224
+ block (archetype / voice / signature_moves / avoids / disclosure + custom
225
+ `topics`); the theme then renders an "AI" badge on every byline and card and
226
+ a visible authorship disclosure on the profile hero and the
227
+ About-the-Author box. Ships two examples — **Cassandra** (a paranoid AI
228
+ Security Analyst who catastrophizes trivial gaps) and **Vega** (an
229
+ enthusiastic AI Data Analyst who over-models trivial data) — each with a
230
+ profile page, an SVG avatar, and example in-voice posts, plus a reusable
231
+ `.github/prompts/ai-author.prompt.md` template for writing as a persona.
232
+ - **Per-author preview art styles.** An author entry can carry a `preview:`
233
+ block (`style`, `style_modifiers`, and — for the Bash generator — `size`,
234
+ `quality`, `model`). When a post sets `author: <that key>`, the AI
235
+ preview-image generator uses those settings **instead of** the site-wide
236
+ `preview_images` config for that post's banner, so each AI persona gets a
237
+ recognisable look (Cassandra → ominous security-ops noir, Vega → vibrant
238
+ data-viz). Resolved per file by both
239
+ `scripts/features/generate-preview-images` and
240
+ `scripts/lib/preview_generator.py`; posts by non-AI authors are unaffected.
241
+ Precedence — Bash generator: author `preview:` › `IMAGE_STYLE` env ›
242
+ `_config.yml` › defaults; Python generator: author `preview:` › `--style`
243
+ flag › default (it does not read `_config.yml`).
244
+ The two shipped personas were given deliberately divergent styles
245
+ (Cassandra → hand-inked **noir graphic novel**; Vega → glossy **isometric 3D
246
+ infographic**) and their four example posts now carry real generated banners
247
+ — downscaled to ~1200px JPEGs (~300 KB) — replacing the placeholder SVGs.
248
+ - **Guest author page is now a contribution guide.** `/authors/guest/`
249
+ doubles as the contributor onboarding page — how to submit an article (paths,
250
+ front-matter template, local preview, PR + review), how to become a credited
251
+ author (add yourself to `_data/authors.yml`, use your key, profile stub for
252
+ safe mode), and AI-authorship disclosure. The `author` layout now renders a
253
+ page's Markdown body (in a `.author-page-body` section) and suppresses the
254
+ generic "no content" empty state when a body is present, so any profile page
255
+ can carry custom content.
256
+ - **Avatars can be full URLs (incl. GitHub) or auto-derived from a handle.**
257
+ An author's `avatar` may now be a full URL — e.g. a GitHub avatar
258
+ (`https://avatars.githubusercontent.com/u/<id>?v=4`) — used as-is; relative
259
+ paths still resolve under the assets folder. If `avatar` is omitted but
260
+ `github` is set, the avatar falls back to `https://github.com/<handle>.png`.
261
+ Resolution is centralised in `components/author-avatar-url.html` and shared by
262
+ the byline, bio card, profile hero, and E-E-A-T blocks. The Guest profile
263
+ demonstrates the handle-only path (its avatar comes from `github: amr-bash`),
264
+ and bamr87 uses an explicit GitHub avatar URL.
265
+
266
+ ### Performance
267
+ - **Docker dev image cut from ~4GB to ~1.7GB and cold build from ~193s to ~82s**
268
+ (native arm64; far worse under the old emulated build). The `dev-test` stage
269
+ no longer installs `@mermaid-js/mermaid-cli` (its only reference in the whole
270
+ repo was its own install line — Mermaid renders client-side from the vendored
271
+ `mermaid.min.js`, never via `mmdc`, and it dragged in a ~300MB headless
272
+ Chromium), ImageMagick, libvips, or Node/npm (all unused in-container; the
273
+ `package.json` scripts run on the host). Kept Python + Jupyter/nbconvert for
274
+ the notebook tooling. Dropped the redundant second `bundle install` (the
275
+ `base` stage already installs all gem groups), removed the `platform:
276
+ linux/amd64` pin from `docker-compose.yml` (it forced QEMU emulation on Apple
277
+ Silicon), removed the per-start `generate_statistics.sh` regeneration from the
278
+ compose command, and simplified the production runtime stage (the static-file
279
+ `ruby -run -e httpd` server needs no Gemfile or `bundle install`).
280
+ - **Jekyll build ~16.4s → ~12s** by wrapping page-invariant chrome in
281
+ `include_cached` (the `jekyll-include-cache` plugin was a dependency but went
282
+ unused): `core/footer.html`, `components/{cookie-consent,nanobar,svg,
283
+ search-modal,shortcuts-modal,setup-banner,background-settings}.html`, and
284
+ `components/js-cdn.html`. The footer alone was **3.9s** of the build — it ran
285
+ `where`-scans over every collection on all 172 page renders to auto-detect
286
+ quick links, despite output that depends only on site config. Its
287
+ page-front-matter-dependent tail (TOC/local-graph FABs) moved to
288
+ `core/footer-fabs.html` so the body stays cacheable; the FABs are
289
+ `position:fixed` with explicit z-index, so the output is visually identical.
290
+ `root.html` self-time dropped 9.1s → 4.4s.
291
+ - **Production CSS now minified** (`sass: style: compressed`, `sourcemap:
292
+ never`); `main.css` ~182KB → ~158KB render-blocking. `_config_dev.yml` keeps
293
+ `expanded` + sourcemaps for local debugging.
294
+ - **Content statistics no longer regenerate on every build.**
295
+ `content_statistics.auto_generate` now defaults to `false`; templates read the
296
+ committed `_data/content_statistics.yml` directly. The generator hook had been
297
+ re-scanning all content on every `jekyll build` (~12× per CI run) and dirtying
298
+ a tracked file. Refresh on demand with `rake stats:generate`.
299
+
300
+ ### Removed
301
+ - **Dead vendored libraries (~1.1MB).** Deleted `assets/vendor/font-awesome`
302
+ (1.0MB) and `assets/vendor/jquery` (88KB), their `vendor-manifest.json`
303
+ entries, and the misleading "jQuery" `powered_by` credit. Font Awesome was
304
+ loaded only by `components/mermaid.html` (no theme diagram uses `fa:` icons) —
305
+ that 1.0MB render-blocking stylesheet no longer loads on Mermaid pages. jQuery
306
+ was already removed from page loads (Bootstrap 5 dropped it). **Forks** that
307
+ relied on Font Awesome icons inside Mermaid diagrams must re-add the
308
+ stylesheet.
309
+
310
+ ### Changed
311
+ - **CSS Grid tutorial now ships live, in-browser demos.** Expanded
312
+ `pages/_posts/tutorial/2025-01-23-css-grid-mastery.md` so every concept renders
313
+ a real grid next to its code — basic tracks, `fr`/`minmax()`, `auto-fit` vs
314
+ `auto-fill`, line spanning, named areas, an interactive column playground, and
315
+ card / holy-grail / magazine / alignment / dense-packing layouts (theme-aware,
316
+ responsive, keyboard-accessible). Added bidirectional "Related Reading" links
317
+ between the tutorial and the card-grid / accessible-forms posts, plus references
318
+ to it from the Bootstrap, Layouts, and Styles docs.
319
+ - **Bylines now use the shared author component.** The `article`, `note`,
320
+ `notebook`, `news`, and `section` layouts plus `components/post-card.html`
321
+ previously printed `{{ page.author }}` as bare text; they now render
322
+ `components/author-card.html` (`inline`), so a known author key resolves to a
323
+ display name, avatar, and a link to their profile page. The inline
324
+ "About the Author" block that was hard-coded in `_layouts/article.html` was
325
+ removed in favor of `components/author-bio.html`.
326
+ - **Author bylines and the "About the Author" section now link to the profile
327
+ even when front matter uses the display name.** Previously only a direct
328
+ `_data/authors.yml` key (e.g. `author: default`) resolved to a profile link;
329
+ posts/notes written as `author: "Zer0-Mistakes Team"` (the display name) fell
330
+ back to an unlinked card. `components/author-card.html` and
331
+ `components/author-bio.html` now resolve the author by key **or** by matching
332
+ `name` / `display_name`, so the inline byline, the full card name, and the
333
+ "More from …" link all point at `/authors/<key>/`. Non-matching strings
334
+ (template placeholders, name variants) stay unlinked as before.
335
+ - **Committed author pages moved to `pages/_about/authors/`** (into the `about`
336
+ collection), co-located with the rest of the About section instead of a
337
+ top-level `/authors/` source directory. URLs are unchanged (explicit
338
+ `/authors/:key/` permalinks), and `author_pages_generator.rb`'s dedup now also
339
+ checks collection documents so no duplicate pages are generated.
340
+ - **Design framework (SCSS) refactor — structure only, no visual change.**
341
+ Decomposed the 1,131-line `_sass/custom.scss` monolith into a thin back-compat
342
+ barrel plus five focused partials (`layouts/_global-chrome`, `core/_toc`,
343
+ `core/_sidebar-extras`, `components/_ui-enhancements`, `components/_notes-index`);
344
+ split the code-example chrome out of `core/_docs-layout.scss` into
345
+ `core/_docs-code-examples.scss`; extracted `components/_search-modal.scss`;
346
+ consolidated the navbar fixed/grid layout into `core/_navbar.scss`; lifted the
347
+ stylesheet assembly order into `assets/css/main.scss` as the single manifest;
348
+ removed two redundant duplicate rules (a second `.btn { position; overflow }`
349
+ and a duplicate global `prefers-reduced-motion` reset); and deleted 141 lines
350
+ of dead legacy Sass variables from `core/_variables.scss`. The compiled
351
+ `assets/css/main.css` is verified **semantically identical** (only the two
352
+ redundant duplicates and some emitted comments were removed) — no tokens,
353
+ selectors, or declaration values changed.
354
+ - **Automation no longer pushes directly to `main`.** The roadmap→README sync
355
+ (`sync.yml`) and Jupyter notebook conversion (`convert-notebooks.yml`) now
356
+ open pull requests via `peter-evans/create-pull-request` (labelled
357
+ `automated`, assigned for review) instead of committing straight to `main` —
358
+ prerequisite for enabling branch protection. Mirrors the existing
359
+ `update-dependencies.yml` pattern. (PRs opened by `GITHUB_TOKEN` don't
360
+ auto-trigger CI; close/reopen to run checks, or merge directly.)
361
+
362
+ ### Fixed
363
+ - **`Gemfile.lock` re-synced to `version.rb` (1.19.1 → 1.19.0)** and guarded
364
+ against future drift. The `validate_version_consistency` check
365
+ (`scripts/bin/validate`) now also compares the gem version pinned in
366
+ `Gemfile.lock`, and a new always-running `Version ↔ Gemfile.lock consistency`
367
+ step in CI's `quality-checks` job fails any PR where the two disagree — the
368
+ exact drift that left the lock at 1.19.1 while `version.rb` said 1.19.0.
369
+
370
+ ## [1.19.0](https://github.com/bamr87/zer0-mistakes/compare/v1.18.1...v1.19.0) (2026-06-16)
371
+
372
+
373
+ ### Features
374
+
375
+ * **chat:** rebuild AI assistant on Claude API with GitHub issue/PR tools + OAuth connector ([#151](https://github.com/bamr87/zer0-mistakes/issues/151)) ([02e81af](https://github.com/bamr87/zer0-mistakes/commit/02e81afbdc02643f4bc78af5e18792cd1b9c2213))
376
+ * **home:** opt-out flags for RSS link and visible title ([#157](https://github.com/bamr87/zer0-mistakes/issues/157)) ([7597351](https://github.com/bamr87/zer0-mistakes/commit/7597351addd720fb4ff08b1170a1f0ef25fb3d75))
377
+
378
+
379
+ ### Bug Fixes
380
+
381
+ * **analytics:** only load GA/GTM in production and skip dev hostnames ([#160](https://github.com/bamr87/zer0-mistakes/issues/160)) ([12d701e](https://github.com/bamr87/zer0-mistakes/commit/12d701e88ee2c76659869ccc948b2b550bb855d0))
382
+ * **config:** restore remote_theme contract + add missing lastmod (unblocks CI) ([#174](https://github.com/bamr87/zer0-mistakes/issues/174)) ([b995115](https://github.com/bamr87/zer0-mistakes/commit/b995115a4ffb745704f1111539085a610ba94053))
383
+ * **config:** restore zer0-mistakes.com site identity + CNAME (site was down) ([#176](https://github.com/bamr87/zer0-mistakes/issues/176)) ([9ef8ff8](https://github.com/bamr87/zer0-mistakes/commit/9ef8ff8335e0a9f394da1ec342f388d31470eb22))
384
+
385
+ ### Added
386
+ - **Preview-image pixelator (`scripts/features/pixelate-preview-images`).** A
387
+ dependency-free (Python stdlib only — no ImageMagick/Pillow/pngquant) utility
388
+ that pixelates and palette-quantizes the AI-generated preview banners into
389
+ indexed PNG-8, shrinking them ~90% (e.g. 2.7&nbsp;MB → ~230&nbsp;KB) while
390
+ preserving the retro 8-bit aesthetic. A dry-run across all 146 banners reports
391
+ 283&nbsp;MB → 28&nbsp;MB. Includes a conventions-friendly bash wrapper (config
392
+ default path, parallel `--jobs`, `--dry-run`), the `pixelate_images.py` engine
393
+ with `--selftest`, and a `scripts/test/lib/test_pixelate_images.sh` suite wired
394
+ into the library test runner. Non-PNG / 16-bit / interlaced inputs are skipped
395
+ gracefully.
396
+
397
+ ### Removed
398
+ - **Revert the "Year of AI" / federated content-hub pivot (PR #173).** Restored
399
+ the original `zer0-mistakes` theme landing page: re-published `README.md` as
400
+ the site homepage at `/` (dropped `published: false`) and removed the
401
+ `Year of AI` hub homepage (`pages/home.md`), the `/hub/` dashboard
402
+ (`pages/hub.md`), the hub registry/metadata (`_data/hub.yml`,
403
+ `_data/hub_index.yml`, `_data/navigation/hub.yml`), the hub tooling
404
+ (`scripts/lib/hub.rb`, `scripts/sync-hub-metadata.{rb,sh}`,
405
+ `scripts/provision-org-sites.{rb,sh}`, `templates/org-site/*`), the daily
406
+ `hub-sync` workflow, the `content-hub` system doc, and the `Hub` navbar entry.
407
+ Feature `ZER0-061` was dropped from the features data. `_config.yml`/`CNAME`
408
+ were already restored to the `zer0-mistakes.com` identity by PRs #174/#176.
409
+
410
+ ### Changed
411
+ - **Roadmap catch-up (T-022)**: recorded shipped milestones v1.14–v1.18 as `completed` in `_data/roadmap.yml` and advanced the active milestone to v1.19 so the roadmap tracks the gem version; README gantt diagram regenerated.
8
412
  ## [1.19.1] - 2026-06-16
9
413
 
10
414
  ### Changed
data/README.md CHANGED
@@ -4,10 +4,6 @@ sub-title: AI-Native Jekyll Theme
4
4
  description: AI-native Jekyll theme for GitHub Pages — Docker-first development, AI-powered installation, multi-agent integration (Copilot, Codex, Cursor, Claude), AI preview-image generation, and AIEO content optimization with Bootstrap 5.3.
5
5
  version: 1.19.1
6
6
  layout: landing
7
- # This repo now serves as the year-of-ai organization root site; the homepage
8
- # lives in pages/home.md. README stays as the repository README on GitHub but
9
- # is not published as a site page.
10
- published: false
11
7
  tags:
12
8
  - jekyll
13
9
  - docker
@@ -761,15 +757,18 @@ All workflows live under [`.github/workflows/`](.github/workflows/).
761
757
 
762
758
  | # | Workflow | File | Trigger | Purpose |
763
759
  |---|----------|------|---------|---------|
764
- | 1 | **Comprehensive CI Pipeline** | [`ci.yml`](.github/workflows/ci.yml) | push / PR / dispatch | Detect changes → fast checks → quality control → matrix test suite (Ruby 3.3) → integration tests → build & validate |
765
- | 2 | **TEST (Latest Dependencies)** | [`test-latest.yml`](.github/workflows/test-latest.yml) | scheduled / dispatch | Zero-pin Docker build with bleeding-edge gems; promotes only passing images |
766
- | 3 | **Update Dependencies** | [`update-dependencies.yml`](.github/workflows/update-dependencies.yml) | weekly schedule | Refreshes `Gemfile.lock` to latest compatible versions and opens an automated PR |
767
- | 4 | **CodeQL Security Scanning** | [`codeql.yml`](.github/workflows/codeql.yml) | push / PR on code paths | Static security analysis across Ruby, JavaScript, TypeScript, Python, YAML, plugins, scripts |
768
- | 5 | **Version Bump** | [`version-bump.yml`](.github/workflows/version-bump.yml) | push to main / dispatch | Analyzes conventional commits, determines MAJOR/MINOR/PATCH bump, updates `version.rb` + CHANGELOG, creates tag |
769
- | 6 | **Release (Gem + GitHub)** | [`release.yml`](.github/workflows/release.yml) | tag `v*` / dispatch | Pre-release validation build assets publish to [RubyGems](https://rubygems.org/gems/jekyll-theme-zer0) create GitHub Release |
760
+ | 1 | **Comprehensive CI Pipeline** | [`ci.yml`](.github/workflows/ci.yml) | push / PR / dispatch | Detect changes → fast checks → quality control → matrix test suite → integration tests → build & validate |
761
+ | 2 | **TEST (Latest Dependencies)** | [`test-latest.yml`](.github/workflows/test-latest.yml) | daily schedule / push / PR / dispatch | Zero-pin Docker build with bleeding-edge gems; tests then promotes passing images to Docker Hub |
762
+ | 3 | **Release** | [`release.yml`](.github/workflows/release.yml) | push to `main` | release-please opens a release PR from Conventional Commits; merging it tags `vX.Y.Z` and publishes the gem to [RubyGems](https://rubygems.org/gems/jekyll-theme-zer0) |
763
+ | 4 | **Update Dependencies** | [`update-dependencies.yml`](.github/workflows/update-dependencies.yml) | weekly schedule | Refreshes `Gemfile.lock` to latest compatible versions and opens an automated PR |
764
+ | 5 | **CodeQL Security Scanning** | [`codeql.yml`](.github/workflows/codeql.yml) | push / PR on code paths + weekly | Static security analysis across Ruby, JavaScript/TypeScript, Python, Actions, and YAML |
765
+ | 6 | **Content & Docs Review** | [`ai-content-review.yml`](.github/workflows/ai-content-review.yml) | PR on docs/content | Deterministic SEO/quality review + optional Claude agent + docs front matter, internal-link, and markdownlint checks |
770
766
  | 7 | **Convert Jupyter Notebooks** | [`convert-notebooks.yml`](.github/workflows/convert-notebooks.yml) | push to `pages/_notebooks/**.ipynb` | Auto-converts `.ipynb` → Jekyll-friendly Markdown with extracted images |
771
- | 8 | **Roadmap Sync** | [`roadmap-sync.yml`](.github/workflows/roadmap-sync.yml) | push affecting `_data/roadmap.yml` | Regenerates the README roadmap section from data; fails PRs with stale README |
772
- | 9 | **New Site Setup** | [`setup-template.yml`](.github/workflows/setup-template.yml) | first push after template/fork | Creates a PR with prefilled `_config.yml` so a new site is ready to merge & go |
767
+ | 8 | **Sync** | [`sync.yml`](.github/workflows/sync.yml) | push affecting `_data/backlog.yml` or `_data/roadmap.yml` | Mirrors the backlog to GitHub Issues and regenerates the README roadmap section |
768
+ | 9 | **Install Matrix** | [`install-matrix.yml`](.github/workflows/install-matrix.yml) | PR on installer paths + weekly | Installer e2e across OS × Ruby, the `curl \| bash` bootstrap, and the `install doctor` diagnostic |
769
+ | 10 | **Deploy chat proxy** | [`deploy-chat-proxy.yml`](.github/workflows/deploy-chat-proxy.yml) | push to chat-proxy worker files | Deploys the AI chat proxy Worker to Cloudflare |
770
+ | 11 | **Auto-merge low-risk PRs** | [`auto-merge.yml`](.github/workflows/auto-merge.yml) | PR labeled `auto-merge` | Enables GitHub native auto-merge once required checks pass |
771
+ | 12 | **Lint workflows** | [`lint-workflows.yml`](.github/workflows/lint-workflows.yml) | PR/push on `.github/**` | actionlint gate on the workflow + composite-action definitions |
773
772
 
774
773
  > 💡 GitHub Pages adds an additional managed `pages-build-deployment` run on every push to `main`.
775
774
 
@@ -784,8 +783,8 @@ gh run list --repo bamr87/zer0-mistakes --limit 10
784
783
  # Manually dispatch a release
785
784
  gh workflow run release.yml --ref main -f tag=v0.22.21
786
785
 
787
- # Trigger an automatic version bump on demand
788
- gh workflow run version-bump.yml --ref main
786
+ # Re-sync the backlog issues / README roadmap from _data on demand
787
+ gh workflow run sync.yml --ref main
789
788
 
790
789
  # Re-run the most recent failed CI run
791
790
  gh run rerun --failed --repo bamr87/zer0-mistakes
@@ -798,10 +797,9 @@ gh run watch --repo bamr87/zer0-mistakes
798
797
 
799
798
  When you fork the theme as a starter, the workflows come with you. To make them safe and useful in your fork:
800
799
 
801
- 1. **Add `RUBYGEMS_API_KEY`** in `Settings → Secrets and variables → Actions` if you plan to publish your own gem; otherwise disable [`release.yml`](.github/workflows/release.yml).
800
+ 1. **Configure gem publishing** if you plan to publish your own gem (`release.yml` uses [`bamr87/.github`](https://github.com/bamr87/.github) reusable workflows); otherwise disable [`release.yml`](.github/workflows/release.yml).
802
801
  2. **Tune triggers** in [`update-dependencies.yml`](.github/workflows/update-dependencies.yml) (default: weekly).
803
- 3. **Disable** [`setup-template.yml`](.github/workflows/setup-template.yml) after the first run it's a one-shot bootstrap.
804
- 4. **GitHub Pages** is auto-enabled when you push to `main` if your repo is `<username>.github.io`.
802
+ 3. **GitHub Pages** is auto-enabled when you push to `main` if your repo is `<username>.github.io`.
805
803
 
806
804
  ---
807
805
 
@@ -836,8 +834,13 @@ gantt
836
834
  v1.11 Continuous-Evolution Loop :done, 2026-06, 2026-06
837
835
  v1.12 Headless Endpoints :done, 2026-06, 2026-06
838
836
  v1.13 Quality Framework — First Wave :done, 2026-06, 2026-06
837
+ v1.14 Zer0-Mistake Quality Framework :done, 2026-06, 2026-06
838
+ v1.15 Quality Framework Batch :done, 2026-06, 2026-06
839
+ v1.16 AI Chat + Consumer Audit :done, 2026-06, 2026-06
840
+ v1.17 A11y, Mermaid & Migration Tests :done, 2026-06, 2026-06
841
+ v1.18 AI Content Reviewer :done, 2026-06, 2026-06
839
842
  section Current
840
- v1.14 Zer0-Mistake Quality Framework :active, 2026-06, 2026-08
843
+ v1.19 Site Hardening & Polish :active, 2026-06, 2026-08
841
844
  section Future
842
845
  v2.0 CMS Integration :2026-06, 2026-08
843
846
  v2.1 i18n Support :2026-08, 2026-10
@@ -871,7 +874,12 @@ gantt
871
874
  | **v1.11** | ✅ Completed | Jun 2026 | Self-sustaining backlog loop so AI agents keep improving the repo between human sessions. |
872
875
  | **v1.12** | ✅ Completed | Jun 2026 | Machine-readable site endpoints for downstream sites and AI agents. |
873
876
  | **v1.13** | ✅ Completed | Jun 2026 | First shipped wave of the Zer0-Mistake Quality Framework: CI gate parity and DOM sanitization. |
874
- | **v1.14** | 🚧 In Progress | Current (1.14.x) | Close the gap between the repo's quality gates and what CI actually enforces no mistake lands green. |
877
+ | **v1.14** | Completed | Jun 2026 | Second wave of the Zer0-Mistake Quality Framework: DOM sanitization hardening and workflow lint cleanup. |
878
+ | **v1.15** | ✅ Completed | Jun 2026 | Quality framework batch: docs lint baseline, locale guard, strict site_generation, contribution templates, and YAML export fix. |
879
+ | **v1.16** | ✅ Completed | Jun 2026 | AI chat widget (ZER0-060) and consumer audit tooling; render guard bug fixed. |
880
+ | **v1.17** | ✅ Completed | Jun 2026 | Plugin unit specs, coverage baseline, config-page sync, WCAG 2.1 AA fixes, Mermaid on 12 more pages, and migration tests. |
881
+ | **v1.18** | ✅ Completed | Jun 2026 | Two-tier AI content reviewer framework and chat GitHub action tools (issue/PR creation via Claude tool use). |
882
+ | **v1.19** | 🚧 In Progress | Current (1.19.x) | Production config hardening, analytics privacy fix, landing-page opt-out flags, and a documentation freshness sweep. |
875
883
  | **v2.0** | 🗓 Planned | Q3 2026 | Headless CMS integration with a content API and admin dashboard. |
876
884
  | **v2.1** | 🗓 Planned | Q4 2026 | Multi-language content support with locale-aware routing. |
877
885
  | **v2.2** | 🗓 Planned | Q4 2026 | Visual theme customizer, A/B testing, and conversion funnels. |