jekyll-theme-zer0 1.19.1 → 1.20.2

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 (86) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +395 -0
  3. data/README.md +27 -19
  4. data/_data/authors.yml +154 -5
  5. data/_data/backlog.yml +5 -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/_includes/components/author-avatar-url.html +28 -0
  13. data/_includes/components/author-bio.html +86 -0
  14. data/_includes/components/author-card.html +184 -121
  15. data/_includes/components/author-eeat.html +10 -4
  16. data/_includes/components/info-section.html +1 -1
  17. data/_includes/components/mermaid.html +0 -3
  18. data/_includes/components/post-card.html +19 -9
  19. data/_includes/content/giscus.html +3 -2
  20. data/_includes/core/footer-fabs.html +28 -0
  21. data/_includes/core/footer.html +7 -17
  22. data/_includes/core/head.html +2 -2
  23. data/_includes/navigation/breadcrumbs.html +20 -2
  24. data/_includes/navigation/local-graph.html +18 -2
  25. data/_includes/obsidian/full-graph.html +4 -6
  26. data/_layouts/article.html +44 -74
  27. data/_layouts/author.html +274 -0
  28. data/_layouts/authors.html +55 -0
  29. data/_layouts/news.html +3 -3
  30. data/_layouts/note.html +21 -6
  31. data/_layouts/notebook.html +21 -6
  32. data/_layouts/root.html +31 -17
  33. data/_layouts/section.html +3 -3
  34. data/_plugins/author_pages_generator.rb +121 -0
  35. data/_sass/components/_author.scss +219 -0
  36. data/_sass/components/_content-tables.scss +16 -1
  37. data/_sass/components/_notes-index.scss +102 -0
  38. data/_sass/components/_search-modal.scss +40 -0
  39. data/_sass/components/_ui-enhancements.scss +570 -0
  40. data/_sass/core/_docs-code-examples.scss +463 -0
  41. data/_sass/core/_docs-layout.scss +0 -453
  42. data/_sass/core/_navbar.scss +253 -0
  43. data/_sass/core/_sidebar-extras.scss +79 -0
  44. data/_sass/core/_toc.scss +87 -0
  45. data/_sass/core/_variables.scss +7 -142
  46. data/_sass/custom.scss +24 -1122
  47. data/_sass/layouts/_global-chrome.scss +59 -0
  48. data/assets/css/main.scss +19 -2
  49. data/assets/js/author-profile.js +190 -0
  50. data/assets/js/modules/navigation/navbar.js +104 -0
  51. data/assets/js/obsidian-graph.js +2 -2
  52. data/assets/js/obsidian-local-graph.js +11 -5
  53. data/assets/vendor/cytoscape/cytoscape.min.js +32 -0
  54. data/scripts/README.md +39 -0
  55. data/scripts/bin/validate +11 -1
  56. data/scripts/dev/css-diff.sh +49 -0
  57. data/scripts/dev/shot.js +37 -0
  58. data/scripts/features/generate-preview-images +110 -6
  59. data/scripts/features/pixelate-preview-images +126 -0
  60. data/scripts/features/pixelate_images.py +662 -0
  61. data/scripts/github-setup.sh +0 -0
  62. data/scripts/lib/preview_generator.py +47 -3
  63. data/scripts/pixelate-preview-images.sh +12 -0
  64. data/scripts/test/integration/auto-version +10 -8
  65. data/scripts/test/lib/run_tests.sh +2 -0
  66. data/scripts/test/lib/test_content_review.sh +205 -0
  67. data/scripts/test/lib/test_pixelate_images.sh +108 -0
  68. metadata +25 -20
  69. data/_data/hub.yml +0 -68
  70. data/_data/hub_index.yml +0 -203
  71. data/_data/navigation/hub.yml +0 -110
  72. data/assets/vendor/font-awesome/css/all.min.css +0 -9
  73. data/assets/vendor/font-awesome/webfonts/fa-brands-400.ttf +0 -0
  74. data/assets/vendor/font-awesome/webfonts/fa-brands-400.woff2 +0 -0
  75. data/assets/vendor/font-awesome/webfonts/fa-regular-400.ttf +0 -0
  76. data/assets/vendor/font-awesome/webfonts/fa-regular-400.woff2 +0 -0
  77. data/assets/vendor/font-awesome/webfonts/fa-solid-900.ttf +0 -0
  78. data/assets/vendor/font-awesome/webfonts/fa-solid-900.woff2 +0 -0
  79. data/assets/vendor/font-awesome/webfonts/fa-v4compatibility.ttf +0 -0
  80. data/assets/vendor/font-awesome/webfonts/fa-v4compatibility.woff2 +0 -0
  81. data/assets/vendor/jquery/jquery-3.7.1.min.js +0 -2
  82. data/scripts/lib/hub.rb +0 -208
  83. data/scripts/provision-org-sites.rb +0 -252
  84. data/scripts/provision-org-sites.sh +0 -23
  85. data/scripts/sync-hub-metadata.rb +0 -184
  86. 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: 2871e1d0cd0522e37b6bac85065edfe6767fc749c39a0ac257fec51dbff97691
4
+ data.tar.gz: 12d1d870ed1115cd2044446c66b318f4d6e6c65b1ca3a59493353e5a9d6402a9
5
5
  SHA512:
6
- metadata.gz: faae528fee5ced31d52aaacc0d68868613abe1fdfe79286e2c80aca63eff2c6513f9cb0920f795251348a6e2171ca9dc7d3eae55062ca89fe20c01ed4d5060e4
7
- data.tar.gz: 6e67acd65dc9bcc7bdd86fafb65c1262a09494de52ca86f9593030cdd48331981de7bbe9324e27e36505d49017a6623653cd56b2cc26ff0fd2989819fbc0d780
6
+ metadata.gz: 25198dd08404a6ae41724e8e172ce38f832f19b34efd83761cff86ba033c5952e2d315dad70c75b343cb0c94e216c1d5755a0c53048252a2bd7a1c1a61ac590b
7
+ data.tar.gz: 49d28d829375c95f39986c6e19ff37d524e06f00ae7c388b743e6cd073a35f9c4717aa47f877bb8802d7c5f12fc1f2dd2d618c12785a6342f8a2164774fe6576
data/CHANGELOG.md CHANGED
@@ -5,6 +5,401 @@ 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.20.2](https://github.com/bamr87/zer0-mistakes/compare/v1.20.1...v1.20.2) (2026-06-25)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **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))
14
+ * **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))
15
+
16
+ ## [1.20.1](https://github.com/bamr87/zer0-mistakes/compare/v1.20.0...v1.20.1) (2026-06-24)
17
+
18
+
19
+ ### Bug Fixes
20
+
21
+ * 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))
22
+ * **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))
23
+
24
+ ## [1.20.0](https://github.com/bamr87/zer0-mistakes/compare/v1.19.0...v1.20.0) (2026-06-22)
25
+
26
+
27
+ ### Features
28
+
29
+ * **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))
30
+ * **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))
31
+
32
+
33
+ ### Bug Fixes
34
+
35
+ * **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))
36
+ * **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))
37
+ * **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))
38
+
39
+
40
+ ### Performance Improvements
41
+
42
+ * 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))
43
+
44
+
45
+ ### Reverts
46
+
47
+ * 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))
48
+
49
+ ## [Unreleased]
50
+
51
+ ### Added
52
+ - **Visual-evidence standard + reusable evidence kit.** UI/behavioural changes
53
+ now ship a regression test **and** before/after visual evidence, surfaced in
54
+ release notes and enforced in CI:
55
+ - `test/visual/evidence-kit.mjs` — a config-driven generator that drives the
56
+ live site across a viewport matrix + configurations, measures page overflow
57
+ in before/after states, composes labelled montages (Playwright, no
58
+ ImageMagick), and writes `metrics.json` + a CHANGELOG snippet.
59
+ - `.github/skills/visual-evidence/SKILL.md` + `visual-evidence.instructions.md`
60
+ codify the standard (and how to file issues a fix uncovers into the backlog
61
+ loop). Indexed from `AGENTS.md`, `CLAUDE.md`, and the instructions README.
62
+ - `.github/workflows/evidence-gate.yml` — a required check that fails a UI PR
63
+ missing the test/evidence (opt-out label `skip-evidence`).
64
+ - **Autonomy policy extended** (`continuous-evolution.md`,
65
+ `backlog-implement.prompt.md`, `auto-merge.yml`): a `risk: low` **fix** that
66
+ ships tests + evidence is now auto-merge-eligible alongside docs/deps/lint.
67
+
68
+ ### Fixed
69
+ - **Navbar no longer appears "cut off" at certain widths.** The root cause was
70
+ page-level horizontal overflow, not the navbar itself: because the header is
71
+ `position: fixed`, any element that pushed the page wider than the viewport
72
+ (a wide markdown table, a long inline-code token, an unwrapped Bootstrap
73
+ `.row`) created a sideways scrollbar and left the navbar's right edge
74
+ uncovered. Fixes:
75
+ - Wide content tables now scroll **inside** their `.content-table-wrapper`
76
+ card (`overflow-x: auto`) instead of overflowing the page — the wrapper that
77
+ `table-copy.js` injects previously had `overflow: visible`, which also
78
+ bypassed the existing mobile responsive-table fallback.
79
+ - Long unbroken inline-code tokens wrap in content areas instead of forcing a
80
+ horizontal scrollbar.
81
+ - A theme-wide `html { overflow-x: clip }` safety net guarantees no stray
82
+ element can make the fixed navbar look cut off. `clip` is used instead of
83
+ `hidden` so `position: sticky` (docs sidebar / TOC) keeps working; wide
84
+ content keeps its own local scroll so nothing is hidden.
85
+ - The mobile menu/settings offcanvas width is clamped (`min(21rem, 86vw)`) so
86
+ the slide-in panel and its close button always fit narrow phones, instead of
87
+ Bootstrap's fixed 400px overflowing the viewport.
88
+ - **Giscus comments were silently disabled** ([#201](https://github.com/bamr87/zer0-mistakes/issues/201)).
89
+ `_config.yml` defined the comment block under the misspelled key `gisgus:`
90
+ while every template reads `site.giscus`, so comments never rendered. Renamed
91
+ the key to `giscus:`. Fixing this also surfaced and fixed a latent
92
+ include-path error in `_includes/content/giscus.html` (a literal
93
+ `include giscus.html` Liquid tag inside an HTML doc comment) that only fired
94
+ once comments were enabled.
95
+ - **Theme chrome no longer injects internal links that 404 for remote-theme
96
+ Pages consumers** ([#204](https://github.com/bamr87/zer0-mistakes/issues/204)).
97
+ Tag badges (`article`/`note`/`notebook`), the breadcrumb collection-root crumb,
98
+ the local-graph "Full graph" link, and author byline profile links are now
99
+ **existence-gated** — they render as plain text when the target page isn't in
100
+ the build instead of linking to a 404. The post category base is configurable
101
+ via `category_base` (default `/news`); the tags page via `tags_page` (default
102
+ `/tags/`); the full-graph page via `obsidian_graph_url`.
103
+
104
+ ### Changed
105
+ - **Vendored cytoscape.js** ([#152](https://github.com/bamr87/zer0-mistakes/issues/152)),
106
+ the last runtime CDN dependency in the theme. `cytoscape@3.30.0` is committed
107
+ under `assets/vendor/cytoscape/` (matching the Bootstrap/Icons/Mermaid
108
+ pattern) and loaded locally by the Obsidian local-graph FAB and full-graph
109
+ page, so the graph works under strict CSP and offline. Added to
110
+ `vendor-manifest.json`.
111
+
112
+ ### Added
113
+ - **Dev-mode navbar fit warnings.** On local/dev hosts only, the navbar module
114
+ logs an actionable `console.warn` when the inline menubar has more top-level
115
+ items than fit the bar, or when page content overflows the viewport (the usual
116
+ "navbar looks cut off" cause) — naming the widest offending element. Silent on
117
+ deployed sites.
118
+ - **Quickstart documentation hub + fork/remote-theme guide (#126).** Fleshes out
119
+ `pages/_docs/quickstart/` (previously only `bare-minimum.md`): a new
120
+ `index.md` hub that links the available quickstart paths (bare-minimum,
121
+ fork-and-deploy, and the step-by-step series), and a full
122
+ `fork-and-deploy.md` guide covering the standard fork or remote-theme GitHub
123
+ Pages workflow end to end (choose model → setup → local preview → enable Pages
124
+ → verify → troubleshoot). Both pages carry annotated screenshots under
125
+ `assets/images/docs/quickstart/` and score 🟢 excellent in the content
126
+ reviewer.
127
+ - **Remote-theme consumer checklist doc**
128
+ ([#203](https://github.com/bamr87/zer0-mistakes/issues/203),
129
+ [#202](https://github.com/bamr87/zer0-mistakes/issues/202)). New
130
+ `pages/_docs/deployment/remote-theme-checklist.md` documenting what
131
+ `remote_theme` does not deliver on GitHub Pages (config, data, plugins) and how
132
+ to fill each gap — including the hand-authored `/search.json` + `/sitemap/`
133
+ files that the plugin-only generator can't produce in Pages safe mode.
134
+ - **Contributor workflow guardrails.** New `change-workflow` skill
135
+ (`.github/skills/change-workflow/SKILL.md`) codifying the branch → commit → PR
136
+ flow for any change (branch-first, one concern per PR, stage-by-path,
137
+ worktrees for parallel work, splitting a messy working tree). Paired with
138
+ expanded `version-control.instructions.md` rules — working-tree/branch
139
+ discipline, the `version.rb` ↔ `Gemfile.lock` invariant, and keeping generated
140
+ artifacts out of feature PRs — and indexed from `AGENTS.md`, `CLAUDE.md`, and
141
+ `.github/instructions/README.md`.
142
+ ### Tests
143
+ - **Navbar responsiveness regression suite.** New
144
+ `test/visual/navbar-responsive.spec.js` (smoke tier) sweeps a 16-width matrix
145
+ (320 → 1920px) asserting no page-level horizontal overflow, the fixed header
146
+ spans the full viewport, the search/settings cluster stays on-screen, the
147
+ brand renders, and the inline menubar never clips its items. Adds offcanvas-,
148
+ dropdown-, long-title-, and many-items- fit checks, plus a reusable
149
+ `measureNavbarLayout()` fixture (overflow detection is element-level so it
150
+ still catches regressions the `overflow-x: clip` net would otherwise hide).
151
+ - **Unit tests for the `content-review.rb` scoring engine (#166).** New
152
+ `scripts/test/lib/test_content_review.sh` drives the deterministic content
153
+ reviewer against synthetic Markdown fixtures using the real production config
154
+ and schema: asserts a well-formed docs page scores ≥ 80, that removing the
155
+ required `description` lowers the score and reports the issue, that a closing
156
+ bare ` ``` ` after a language-tagged fence is not flagged (the v1.18.1
157
+ regression), and that `--strict` exits non-zero when a file is below the fail
158
+ threshold (while warn mode exits 0). Runs under `LC_ALL=C` for
159
+ locale-independence parity with the T-015 guard.
160
+ - **Playwright smoke specs for the search modal and AI chat widget (#167,
161
+ #168).** New `test/visual/search.spec.js` covers the site-wide search modal
162
+ (ZER0-032): the `/` shortcut opens it and focuses the input, Escape closes it,
163
+ a query populates results from `/search.json`, and opening search closes the
164
+ Settings offcanvas without stacking backdrops. New `test/visual/ai-chat.spec.js`
165
+ covers the AI chat widget (ZER0-060): the render guard's positive path (FAB +
166
+ config present), and the FAB ⇄ panel toggle via click, close button, and
167
+ Escape — all client-side, no AI backend. Note: the smoke build
168
+ (`_config.yml,_config_dev.yml`) sets `ai_chat.proxy_ready: true`, so the widget
169
+ renders in the test environment; the specs assert that real behavior.
170
+ - **CI coverage for the installer wizard and upgrade path (#147).** New
171
+ `test/test_install_wizard_upgrade.sh` (auto-discovered by the
172
+ `test_install_*.sh` glob in CI) covers two previously-untested libraries:
173
+ it drives the non-AI wizard prompt helpers (`_wiz_prompt`, `_wiz_confirm`,
174
+ `_wiz_choose`) non-interactively with piped answers — defaults, typed input,
175
+ yes/no confirmation, numbered/by-name menu selection, out-of-range fallback —
176
+ and exercises `upgrade.sh` end to end: version detection (marker, `_config.yml`
177
+ fallback, unknown), a detect→migrate→verify run across a version gap, the
178
+ dry-run (no-write) branch, and the already-current no-op branch.
179
+ - **Unit tests for `sanitize_config_filter.rb` (T-023).** Added 12 Minitest
180
+ specs to `test/test_plugins.rb` covering both regex paths of the
181
+ security-critical Liquid filter: `SENSITIVE_KEY_RE` matches `api_key`,
182
+ `apikey`, `secret`, `password`, and `token` (case-insensitive); `PHC_VALUE_RE`
183
+ catches PostHog project keys; mixed multi-line input produces correct partial
184
+ redaction; and edge cases (`nil`, empty string) return without error.
185
+ ### Added
186
+ - **Author profiles ("About the Author") across all collections.** A single,
187
+ layered author system replaces the three divergent ad-hoc treatments that
188
+ existed before:
189
+ - `components/author-card.html` is now the canonical rendering primitive
190
+ (`inline` / `compact` / `full`), with avatars, profile links, schema.org
191
+ `Person` microdata, and expertise chips.
192
+ - New `components/author-bio.html` renders the shared "About the Author"
193
+ section (used by the `article`, `note`, and `notebook` layouts), gated by
194
+ the previously-unused `author_profile` front-matter flag.
195
+ - New `author` / `authors` layouts add per-author profile pages at
196
+ `/authors/:key/` (content aggregated across **every** collection) and an
197
+ `/authors/` directory index, linked from the navbar (under **About**) and
198
+ the footer quick links. Each profile is **interactive**: a hero with
199
+ bio/blurb, an at-a-glance stats dashboard that doubles as type filters
200
+ (Posts / Docs / Notes / …), free-text search over titles + tags, sort
201
+ (newest / oldest / A–Z), a clickable topic/tag cloud, a live result count,
202
+ and deep-linkable filters via the URL hash — powered by the new
203
+ progressive-enhancement `assets/js/author-profile.js` (with JS off it falls
204
+ back to a full, crawlable grid). Emits `schema.org/CollectionPage` +
205
+ `ItemList` structured data.
206
+ - New `_plugins/author_pages_generator.rb` auto-generates those pages for
207
+ each `_data/authors.yml` entry (opt out per author with `profile: false`,
208
+ or globally with `authors.generate_pages: false`); profiles for this site's
209
+ authors are also committed under `/authors/` so they build under GitHub
210
+ Pages safe mode, mirroring the committed `search.json` / `sitemap` pattern.
211
+ - New `_sass/components/_author.scss` styling (dark-mode safe, token-driven).
212
+ - `_data/authors.yml` documents the new `tagline`, `location`, `expertise`,
213
+ and `profile` fields.
214
+ - **AI author personas.** An author can be flagged `ai: true` with a `persona`
215
+ block (archetype / voice / signature_moves / avoids / disclosure + custom
216
+ `topics`); the theme then renders an "AI" badge on every byline and card and
217
+ a visible authorship disclosure on the profile hero and the
218
+ About-the-Author box. Ships two examples — **Cassandra** (a paranoid AI
219
+ Security Analyst who catastrophizes trivial gaps) and **Vega** (an
220
+ enthusiastic AI Data Analyst who over-models trivial data) — each with a
221
+ profile page, an SVG avatar, and example in-voice posts, plus a reusable
222
+ `.github/prompts/ai-author.prompt.md` template for writing as a persona.
223
+ - **Per-author preview art styles.** An author entry can carry a `preview:`
224
+ block (`style`, `style_modifiers`, and — for the Bash generator — `size`,
225
+ `quality`, `model`). When a post sets `author: <that key>`, the AI
226
+ preview-image generator uses those settings **instead of** the site-wide
227
+ `preview_images` config for that post's banner, so each AI persona gets a
228
+ recognisable look (Cassandra → ominous security-ops noir, Vega → vibrant
229
+ data-viz). Resolved per file by both
230
+ `scripts/features/generate-preview-images` and
231
+ `scripts/lib/preview_generator.py`; posts by non-AI authors are unaffected.
232
+ Precedence — Bash generator: author `preview:` › `IMAGE_STYLE` env ›
233
+ `_config.yml` › defaults; Python generator: author `preview:` › `--style`
234
+ flag › default (it does not read `_config.yml`).
235
+ The two shipped personas were given deliberately divergent styles
236
+ (Cassandra → hand-inked **noir graphic novel**; Vega → glossy **isometric 3D
237
+ infographic**) and their four example posts now carry real generated banners
238
+ — downscaled to ~1200px JPEGs (~300 KB) — replacing the placeholder SVGs.
239
+ - **Guest author page is now a contribution guide.** `/authors/guest/`
240
+ doubles as the contributor onboarding page — how to submit an article (paths,
241
+ front-matter template, local preview, PR + review), how to become a credited
242
+ author (add yourself to `_data/authors.yml`, use your key, profile stub for
243
+ safe mode), and AI-authorship disclosure. The `author` layout now renders a
244
+ page's Markdown body (in a `.author-page-body` section) and suppresses the
245
+ generic "no content" empty state when a body is present, so any profile page
246
+ can carry custom content.
247
+ - **Avatars can be full URLs (incl. GitHub) or auto-derived from a handle.**
248
+ An author's `avatar` may now be a full URL — e.g. a GitHub avatar
249
+ (`https://avatars.githubusercontent.com/u/<id>?v=4`) — used as-is; relative
250
+ paths still resolve under the assets folder. If `avatar` is omitted but
251
+ `github` is set, the avatar falls back to `https://github.com/<handle>.png`.
252
+ Resolution is centralised in `components/author-avatar-url.html` and shared by
253
+ the byline, bio card, profile hero, and E-E-A-T blocks. The Guest profile
254
+ demonstrates the handle-only path (its avatar comes from `github: amr-bash`),
255
+ and bamr87 uses an explicit GitHub avatar URL.
256
+
257
+ ### Performance
258
+ - **Docker dev image cut from ~4GB to ~1.7GB and cold build from ~193s to ~82s**
259
+ (native arm64; far worse under the old emulated build). The `dev-test` stage
260
+ no longer installs `@mermaid-js/mermaid-cli` (its only reference in the whole
261
+ repo was its own install line — Mermaid renders client-side from the vendored
262
+ `mermaid.min.js`, never via `mmdc`, and it dragged in a ~300MB headless
263
+ Chromium), ImageMagick, libvips, or Node/npm (all unused in-container; the
264
+ `package.json` scripts run on the host). Kept Python + Jupyter/nbconvert for
265
+ the notebook tooling. Dropped the redundant second `bundle install` (the
266
+ `base` stage already installs all gem groups), removed the `platform:
267
+ linux/amd64` pin from `docker-compose.yml` (it forced QEMU emulation on Apple
268
+ Silicon), removed the per-start `generate_statistics.sh` regeneration from the
269
+ compose command, and simplified the production runtime stage (the static-file
270
+ `ruby -run -e httpd` server needs no Gemfile or `bundle install`).
271
+ - **Jekyll build ~16.4s → ~12s** by wrapping page-invariant chrome in
272
+ `include_cached` (the `jekyll-include-cache` plugin was a dependency but went
273
+ unused): `core/footer.html`, `components/{cookie-consent,nanobar,svg,
274
+ search-modal,shortcuts-modal,setup-banner,background-settings}.html`, and
275
+ `components/js-cdn.html`. The footer alone was **3.9s** of the build — it ran
276
+ `where`-scans over every collection on all 172 page renders to auto-detect
277
+ quick links, despite output that depends only on site config. Its
278
+ page-front-matter-dependent tail (TOC/local-graph FABs) moved to
279
+ `core/footer-fabs.html` so the body stays cacheable; the FABs are
280
+ `position:fixed` with explicit z-index, so the output is visually identical.
281
+ `root.html` self-time dropped 9.1s → 4.4s.
282
+ - **Production CSS now minified** (`sass: style: compressed`, `sourcemap:
283
+ never`); `main.css` ~182KB → ~158KB render-blocking. `_config_dev.yml` keeps
284
+ `expanded` + sourcemaps for local debugging.
285
+ - **Content statistics no longer regenerate on every build.**
286
+ `content_statistics.auto_generate` now defaults to `false`; templates read the
287
+ committed `_data/content_statistics.yml` directly. The generator hook had been
288
+ re-scanning all content on every `jekyll build` (~12× per CI run) and dirtying
289
+ a tracked file. Refresh on demand with `rake stats:generate`.
290
+
291
+ ### Removed
292
+ - **Dead vendored libraries (~1.1MB).** Deleted `assets/vendor/font-awesome`
293
+ (1.0MB) and `assets/vendor/jquery` (88KB), their `vendor-manifest.json`
294
+ entries, and the misleading "jQuery" `powered_by` credit. Font Awesome was
295
+ loaded only by `components/mermaid.html` (no theme diagram uses `fa:` icons) —
296
+ that 1.0MB render-blocking stylesheet no longer loads on Mermaid pages. jQuery
297
+ was already removed from page loads (Bootstrap 5 dropped it). **Forks** that
298
+ relied on Font Awesome icons inside Mermaid diagrams must re-add the
299
+ stylesheet.
300
+
301
+ ### Changed
302
+ - **CSS Grid tutorial now ships live, in-browser demos.** Expanded
303
+ `pages/_posts/tutorial/2025-01-23-css-grid-mastery.md` so every concept renders
304
+ a real grid next to its code — basic tracks, `fr`/`minmax()`, `auto-fit` vs
305
+ `auto-fill`, line spanning, named areas, an interactive column playground, and
306
+ card / holy-grail / magazine / alignment / dense-packing layouts (theme-aware,
307
+ responsive, keyboard-accessible). Added bidirectional "Related Reading" links
308
+ between the tutorial and the card-grid / accessible-forms posts, plus references
309
+ to it from the Bootstrap, Layouts, and Styles docs.
310
+ - **Bylines now use the shared author component.** The `article`, `note`,
311
+ `notebook`, `news`, and `section` layouts plus `components/post-card.html`
312
+ previously printed `{{ page.author }}` as bare text; they now render
313
+ `components/author-card.html` (`inline`), so a known author key resolves to a
314
+ display name, avatar, and a link to their profile page. The inline
315
+ "About the Author" block that was hard-coded in `_layouts/article.html` was
316
+ removed in favor of `components/author-bio.html`.
317
+ - **Author bylines and the "About the Author" section now link to the profile
318
+ even when front matter uses the display name.** Previously only a direct
319
+ `_data/authors.yml` key (e.g. `author: default`) resolved to a profile link;
320
+ posts/notes written as `author: "Zer0-Mistakes Team"` (the display name) fell
321
+ back to an unlinked card. `components/author-card.html` and
322
+ `components/author-bio.html` now resolve the author by key **or** by matching
323
+ `name` / `display_name`, so the inline byline, the full card name, and the
324
+ "More from …" link all point at `/authors/<key>/`. Non-matching strings
325
+ (template placeholders, name variants) stay unlinked as before.
326
+ - **Committed author pages moved to `pages/_about/authors/`** (into the `about`
327
+ collection), co-located with the rest of the About section instead of a
328
+ top-level `/authors/` source directory. URLs are unchanged (explicit
329
+ `/authors/:key/` permalinks), and `author_pages_generator.rb`'s dedup now also
330
+ checks collection documents so no duplicate pages are generated.
331
+ - **Design framework (SCSS) refactor — structure only, no visual change.**
332
+ Decomposed the 1,131-line `_sass/custom.scss` monolith into a thin back-compat
333
+ barrel plus five focused partials (`layouts/_global-chrome`, `core/_toc`,
334
+ `core/_sidebar-extras`, `components/_ui-enhancements`, `components/_notes-index`);
335
+ split the code-example chrome out of `core/_docs-layout.scss` into
336
+ `core/_docs-code-examples.scss`; extracted `components/_search-modal.scss`;
337
+ consolidated the navbar fixed/grid layout into `core/_navbar.scss`; lifted the
338
+ stylesheet assembly order into `assets/css/main.scss` as the single manifest;
339
+ removed two redundant duplicate rules (a second `.btn { position; overflow }`
340
+ and a duplicate global `prefers-reduced-motion` reset); and deleted 141 lines
341
+ of dead legacy Sass variables from `core/_variables.scss`. The compiled
342
+ `assets/css/main.css` is verified **semantically identical** (only the two
343
+ redundant duplicates and some emitted comments were removed) — no tokens,
344
+ selectors, or declaration values changed.
345
+ - **Automation no longer pushes directly to `main`.** The roadmap→README sync
346
+ (`sync.yml`) and Jupyter notebook conversion (`convert-notebooks.yml`) now
347
+ open pull requests via `peter-evans/create-pull-request` (labelled
348
+ `automated`, assigned for review) instead of committing straight to `main` —
349
+ prerequisite for enabling branch protection. Mirrors the existing
350
+ `update-dependencies.yml` pattern. (PRs opened by `GITHUB_TOKEN` don't
351
+ auto-trigger CI; close/reopen to run checks, or merge directly.)
352
+
353
+ ### Fixed
354
+ - **`Gemfile.lock` re-synced to `version.rb` (1.19.1 → 1.19.0)** and guarded
355
+ against future drift. The `validate_version_consistency` check
356
+ (`scripts/bin/validate`) now also compares the gem version pinned in
357
+ `Gemfile.lock`, and a new always-running `Version ↔ Gemfile.lock consistency`
358
+ step in CI's `quality-checks` job fails any PR where the two disagree — the
359
+ exact drift that left the lock at 1.19.1 while `version.rb` said 1.19.0.
360
+
361
+ ## [1.19.0](https://github.com/bamr87/zer0-mistakes/compare/v1.18.1...v1.19.0) (2026-06-16)
362
+
363
+
364
+ ### Features
365
+
366
+ * **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))
367
+ * **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))
368
+
369
+
370
+ ### Bug Fixes
371
+
372
+ * **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))
373
+ * **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))
374
+ * **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))
375
+
376
+ ### Added
377
+ - **Preview-image pixelator (`scripts/features/pixelate-preview-images`).** A
378
+ dependency-free (Python stdlib only — no ImageMagick/Pillow/pngquant) utility
379
+ that pixelates and palette-quantizes the AI-generated preview banners into
380
+ indexed PNG-8, shrinking them ~90% (e.g. 2.7&nbsp;MB → ~230&nbsp;KB) while
381
+ preserving the retro 8-bit aesthetic. A dry-run across all 146 banners reports
382
+ 283&nbsp;MB → 28&nbsp;MB. Includes a conventions-friendly bash wrapper (config
383
+ default path, parallel `--jobs`, `--dry-run`), the `pixelate_images.py` engine
384
+ with `--selftest`, and a `scripts/test/lib/test_pixelate_images.sh` suite wired
385
+ into the library test runner. Non-PNG / 16-bit / interlaced inputs are skipped
386
+ gracefully.
387
+
388
+ ### Removed
389
+ - **Revert the "Year of AI" / federated content-hub pivot (PR #173).** Restored
390
+ the original `zer0-mistakes` theme landing page: re-published `README.md` as
391
+ the site homepage at `/` (dropped `published: false`) and removed the
392
+ `Year of AI` hub homepage (`pages/home.md`), the `/hub/` dashboard
393
+ (`pages/hub.md`), the hub registry/metadata (`_data/hub.yml`,
394
+ `_data/hub_index.yml`, `_data/navigation/hub.yml`), the hub tooling
395
+ (`scripts/lib/hub.rb`, `scripts/sync-hub-metadata.{rb,sh}`,
396
+ `scripts/provision-org-sites.{rb,sh}`, `templates/org-site/*`), the daily
397
+ `hub-sync` workflow, the `content-hub` system doc, and the `Hub` navbar entry.
398
+ Feature `ZER0-061` was dropped from the features data. `_config.yml`/`CNAME`
399
+ were already restored to the `zer0-mistakes.com` identity by PRs #174/#176.
400
+
401
+ ### Changed
402
+ - **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
403
  ## [1.19.1] - 2026-06-16
9
404
 
10
405
  ### 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. |