8000 blog: one cover series for every post (field-log posters, og + hero + thumbnail) by xerj-org · Pull Request #1918 · xerj-org/xerj · GitHub
[go: up one dir, main page]

Skip to content

blog: one cover series for every post (field-log posters, og + hero + thumbnail) - #1918

Merged
xerj-org merged 6 commits into
mainfrom
blog/cover-series
Oct 20, 2026
Merged

xerj-org merged 6 commits into
mainfrom
blog/cover-series

Conversation

@xerj-org
@xerj-org xerj-org commented Oct 20, 2026 •
Copy link
Copy Markdown
Owner

Every blog post gets its own cover from one series, the engineering field-log poster. It replaces the generic og/xerj-card.png that seven of the eight posts shared, and the one-off JEV card.

Revision 2 (2026-10-20): light print on the brand palette

The first version was night-black with yellow halftone dots. The owner's feedback was that it looked unrelated to the site, because /blog/ is served in the day theme (paper #f6f4ee, ochre accents). The series is now restyled to the original brand book (landing/brand.html, landing/brandbook/), and it targets the current site on main, not the light-theme redesign (#1920):

  • Paper and ink. Day paper #f6f4ee on a faint 1px square grid. Art and type are in ink #0B0B0D. Titles are Big Shoulders Display 900 and subtitles are ochre #A06800.
  • Yellow #FFC400 is earned. It is used only as a fill, on the one result each post is about, and never for text: the 28% cut, the vote's 45 extra correct answers over Jev, the $0 local bill, the mask bug, the four launch corpora, the 36 PoCs, the three passing gates and the lz4 route.
  • Square matrix. Every motif is built from squares on a grid. dot() draws a filled cell and ring() draws an empty one.
  • Flat. No halftone wash, grain, displacement filter, gradient or shadow. Lines are 1px.
  • og on white. The og PNG gets a 1px #d6d4cb frame so it keeps its edge on X, Slack and LinkedIn. The hero and thumbnail are framed by blog.css, which uses a paper mount and square corners (blog.css?v=3).
  • Unchanged. Sizes and file names are the same, so the meta tags do not change. og:image:alt and alt were updated only where the drawing changed (jevbars, vote, index28, tiles).
post motif (numbers taken from the post)
does-xerj-beat-jev nDCG@10 square-bars: 0.6993/0.7410, 0.3448/0.3312, 0.2382/0.3638; FiQA bill $0.6375 vs $0 (yellow)
jev-vs-a-bm25-vote 500 Banking77 decisions per arm, filled = correct (0.9140 vs 0.8240), the vote's extra wins in yellow; SMS 0.9840 vs 0.9880
cutting-the-index-28-percent 5.52 MB vs 3.99 MB blocks to scale, the 28% cut in yellow; .seg −73.1%, .meta −93.1%
one-vulnerability-three-names three advisory ids converging on one signed record; 4,107 → 1,950
the-rc80-gates ten gates: 3 pass (yellow), 3 fail, 1 split, 1 reported, 2 unmeasured
the-corpus-hub 100 pack tiles, the launch four in yellow, the signed pack framed
eval-scars-from-agent-memory six scratch marks tagged with each pattern's figure, the mask bug in yellow
the-exploit-hub PoC network: CVE-2026-23744 → 36 PoCs (yellow), CVE-2026-105844 → one neighbour, CVE-2026-97332 → none

The ninth cover, corpus-hub-v2 (route motif), ships with its post in #1915, which is stacked on this PR.

Files

  • scripts/seo/blog_covers/ holds the generator (covers.py, motifs.py), a README and the vendored OFL fonts. It is an offline tool (Playwright + Pillow) that CI does not run.
  • landing/og/blog-<slug>.png (1200×630), landing/blog/covers/<slug>-hero.webp (1600×640) and <slug>-thumb.webp (640×336) are committed.
  • pagedata.py sets og_image/og_image_alt. fix_heads.py --write regenerated the heads. The sitemap and tools/packs/xerj-blogposts/posts/*.json are regenerated.

Checks run locally (all pass)

test_article_schema, test_urlmap, test_llms_field_report, build_articles --check, gen_sitemap --check (also re-run after the commit, no drift), fix_heads --check, fix_links --check, mk_og_card --check, seo_lint (0 gate violations), factcheck --self-test / --fixture-check / --fail-on error (0 ERROR), audit --fail-on critical, landing-constants-guard.sh. No workflow files changed. Index (day) and post (night) pages were rendered locally and checked.


AI disclosure: this PR was prepared with an AI agent (Xerj Merger / Grok Bot) acting for the maintainers. The covers are drawn by code (HTML + SVG rendered in headless Chromium), not by an image model. Every number on a cover is quoted from its post.

The covers were night-black posters; the /blog/ index is served in the day
theme and they read as a different site. Restyle the series to the brand
book: day paper (#f6f4ee) on a 1px square grid, ink (#0B0B0D) art and type,
Big Shoulders Display 900 titles, ochre (#A06800) subtitles, and brand
yellow (#FFC400) only as a fill on the one result each post is about.
Flat: no halftone wash, grain, displacement or shadow.

- motifs draw squares on a grid (dot = filled cell, ring = empty cell)
- yellow trimmed to the earned result per post (the 28% cut, the vote's
  extra correct answers, the $0 local bill, the mask bug, the launch four,
  the 36 PoCs, the three passing gates, the lz4 route)
- og PNG gets a 1px #d6d4cb frame so it keeps its edge on white timelines
- blog.css: paper mount for the hero and thumbnail, square corners (v=3)
- alt / og:image:alt updated where the drawing changed

Same sizes and file names, so the meta tags are unchanged apart from alt.
Owner review of the live blog:

- covers: the in-post hero and the index thumbnail are now art only (no
  title, subtitle or labels; motifs.LABELS = False), the motif's real
  bounding box fitted and centred in the frame. The page already carries
  the title, so the cover no longer repeats the header. The og card keeps
  its title and labels, because a social feed shows it on its own.
  Same file names and sizes.
- alt: hero/thumbnail alt describes the art only (covers.POSTS alt);
  og:image:alt names the title plus the art (new og_alt)
- post pages: every /blog/ page is served in the day theme
  (data-theme="day"), five posts were still night. blog.css tightens the
  day tokens to WCAG AAA on paper (#f6f4ee): body ink 17.9:1, secondary
  8.3:1, accent text #6b4500 7.7:1; brand ochre #A06800 kept for rules and
  borders. Body 19px / 1.7, 68ch measure, lede 21px. No gradients or
  shadows; night toggle unchanged. blog.css?v=4
- route motif counts the 251 Releases packs (re-counted 2026-10-20)
xerj-org added a commit that referenced this pull request Oct 20, 2026
…home page

- corpus-hub-v2 hero and thumbnail re-rendered art only (same names/sizes);
  img alt describes the art, og:image:alt the og card (title + art)
- the post is served in the day theme like every /blog/ page (blog.css v4,
  reading theme from #1918); its own typography block is dropped in favour
  of #1918's
- home page "From the blog": the three newest posts (Corpus Hub v2, the
  exploit hub, eval scars) with their cover thumbnails, replacing the two
  September cards with no images; responsive 3/2/1 columns
@xerj-org
Copy link
Copy Markdown
Owner Author

Revision 3 (5dfe79a), from the owner's review of the live blog:

  • Covers are art only. The in-post hero and the index thumbnail no longer carry a title, subtitle or labels, so they don't repeat the page header. The motif is auto-fitted and centred in the frame. The og card (/og/blog-<slug>.png) keeps its title and figure labels, because social feeds show it on its own. File names and sizes are unchanged.
  • Alt text. Hero and thumbnail alt describes only the art. og:image:alt names the title plus the art (new og_alt field in covers.POSTS).
  • Light post pages. All /blog/ pages are now served in the day theme; five posts were still dark. blog.css (v4) tightens the day tokens to WCAG AAA on paper #f6f4ee: ink 17.9:1, secondary text 8.3:1, accent text #6b4500 at 7.7:1. Brand ochre #A06800 (4.27:1) is used only for rules and borders. Body text is 19px with 1.7 line height and a 68ch measure. No gradients or shadows. The night toggle is unchanged.

All scripts/seo gates pass. Deployed to production ahead of CI together with #1915 and #1953 (Pages deployment 117ddaf8).

AI disclosure: prepared by an AI agent (Xerj Merger / Grok Bot) acting for the maintainers.

@xerj-org
xerj-org merged commit d7cf8a1 into main Oct 20, 2026
2 of 9 checks passed
xerj-org added a commit that referenced this pull request Oct 20, 2026
* blog: field-log cover series for every post (og card, in-post hero, index thumbnail)

* sitemap: lastmod for the blog pages touched by the covers

* blog covers: keep the route motif's node and caption inside the hero box

* blog covers: light print on the brand palette, square-matrix motifs

The covers were night-black posters; the /blog/ index is served in the day
theme and they read as a different site. Restyle the series to the brand
book: day paper (#f6f4ee) on a 1px square grid, ink (#0B0B0D) art and type,
Big Shoulders Display 900 titles, ochre (#A06800) subtitles, and brand
yellow (#FFC400) only as a fill on the one result each post is about.
Flat: no halftone wash, grain, displacement or shadow.

- motifs draw squares on a grid (dot = filled cell, ring = empty cell)
- yellow trimmed to the earned result per post (the 28% cut, the vote's
  extra correct answers, the $0 local bill, the mask bug, the launch four,
  the 36 PoCs, the three passing gates, the lz4 route)
- og PNG gets a 1px #d6d4cb frame so it keeps its edge on white timelines
- blog.css: paper mount for the hero and thumbnail, square corners (v=3)
- alt / og:image:alt updated where the drawing changed

Same sizes and file names, so the meta tags are unchanged apart from alt.

* blog: art-only covers, light AAA post pages

Owner review of the live blog:

- covers: the in-post hero and the index thumbnail are now art only (no
  title, subtitle or labels; motifs.LABELS = False), the motif's real
  bounding box fitted and centred in the frame. The page already carries
  the title, so the cover no longer repeats the header. The og card keeps
  its title and labels, because a social feed shows it on its own.
  Same file names and sizes.
- alt: hero/thumbnail alt describes the art only (covers.POSTS alt);
  og:image:alt names the title plus the art (new og_alt)
- post pages: every /blog/ page is served in the day theme
  (data-theme="day"), five posts were still night. blog.css tightens the
  day tokens to WCAG AAA on paper (#f6f4ee): body ink 17.9:1, secondary
  8.3:1, accent text #6b4500 7.7:1; brand ochre #A06800 kept for rules and
  borders. Body 19px / 1.7, 68ch measure, lede 21px. No gradients or
  shadows; night toggle unchanged. blog.css?v=4
- route motif counts the 251 Releases packs (re-counted 2026-10-20)

* blog: Corpus Hub v2

Corpus Hub v2 and xerj ask: route a plain question to one signed corpus,
pull only that pack and answer locally. Every timing measured on
xerj v1.0.0-rc.97; every count read live, with its source in the post.

- cover from the light field-log series (route motif: 251 Releases packs
  behind the 14 catalogue corpora, the lz4 route in yellow), og card,
  in-post hero and index thumbnail
- facts re-read on 2026-10-20 before publishing: contributors (3,663),
  corpora (3,659), multi-corpus people (70), lines (3,861,407 over 3,653
  cards) and the top-ten table unchanged; repo 10,671 stars / 637 forks /
  60 contributor accounts; hub stars 3 (two profiles, one corpus);
  Releases packs 245 -> 251; catalogue still 14 (2026-10-18 02:13 UTC)
- reading typography for post bodies in blog.css (size/measure only,
  colours stay with the theme tokens); no light-theme dependency
- head, sitemap and blogposts pack records regenerated

* blog + home: art-only v2 cover, light post page, newest posts on the home page

- corpus-hub-v2 hero and thumbnail re-rendered art only (same names/sizes);
  img alt describes the art, og:image:alt the og card (title + art)
- the post is served in the day theme like every /blog/ page (blog.css v4,
  reading theme from #1918); its own typography block is dropped in favour
  of #1918's
- home page "From the blog": the three newest posts (Corpus Hub v2, the
  exploit hub, eval scars) with their cover thumbnails, replacing the two
  September cards with no images; responsive 3/2/1 columns

* sitemap: lastmod for the home page
@xerj-org
Copy link
Copy Markdown
Owner Author

Xerj Merger made the fix: merged on owner's instruction ahead of the CI backlog; this content was already live (deploy 117ddaf8).

cursor Bot pushed a commit that referenced this pull request Oct 20, 2026
Port the measured answer pages from #1928 (cef6b23) onto the
article-shell branch. The sixth page, extract structured data from a
web page into a JSON schema, is not included: that feature is still
planned (#1797). Its capture stays in
benchmarks/agent-intents-2026-10-19/02-* and is named as unpublished
in that README and in llms-full.txt.

OG cards are re-rendered in the light blog-cover palette from #1918
(paper #f6f4ee, ink, ochre subtitles, yellow as a fill only, no grain
and no shadow). The dark cards from the stacked branch are not used.

No page sets structured_data, so these pages do not emit FAQPage or
HowTo. Existing articles gain links to the five new pages. The two
links that pointed only at the held page are not added.
xerj-org added a commit that referenced this pull request Oct 20, 2026
* answers: five agent-intent pages, light field-log covers

Port the measured answer pages from #1928 (cef6b23) onto the
article-shell branch. The sixth page, extract structured data from a
web page into a JSON schema, is not included: that feature is still
planned (#1797). Its capture stays in
benchmarks/agent-intents-2026-10-19/02-* and is named as unpublished
in that README and in llms-full.txt.

OG cards are re-rendered in the light blog-cover palette from #1918
(paper #f6f4ee, ink, ochre subtitles, yellow as a fill only, no grain
and no shadow). The dark cards from the stacked branch are not used.

No page sets structured_data, so these pages do not emit FAQPage or
HowTo. Existing articles gain links to the five new pages. The two
links that pointed only at the held page are not added.

* seo: date the five new answer pages in the sitemap

* answers: match the JSONL query time to the capture, and name each intent page's queries

The JSONL intent page said the multi_match took 3 ms. The committed
capture benchmarks/agent-intents-2026-10-19/03-jsonl-multi-match.json
records "took":1, with 57 hits and issue #1801 first. The CSV match
in 03-csv-match.json is also "took":1, so the page no longer says
1 to 3 ms. The reduced response, the evidence line, the table, the
FAQ and the description now say 1 ms.

Each of the five published intent sources gains a queries: list: the
search strings that page is written to answer, taken from its own
question and heading. The field is optional, not rendered, and
published on answers/index.json. The sixth intent page, extract
structured data from a web page, stays unpublished because schema-in
JSON-out is still planned (#1797).

Verified: build_articles --check, fix_heads --check, fix_links --check,
mk_og_card --check, seo_lint 194 pages and 0 gate violations,
factcheck --fail-on error with 0 ERROR, test_article_schema 10 tests,
landing-constants-guard.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

0