Skip to content

Commit 333c150

Browse files
author
Piyush Tripathi
committed
Merge remote-tracking branch 'upstream/master' into fix-cta-formatting
# Conflicts: # src/components/Card/Card.style.js
2 parents 0f2a262 + 07996d9 commit 333c150

624 files changed

Lines changed: 9769 additions & 4928 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
# Changelog
2+
3+
All notable changes to the `layer5-blog-writer` skill. Versions follow [semver](https://semver.org):
4+
the major number moves when a generated artifact or a CLI contract changes shape.
5+
6+
The canonical copy lives at `.claude/skills/layer5-blog-writer/` in the
7+
[layer5io/layer5](https://github.com/layer5io/layer5) repo. `scripts/sync_skill.sh` mirrors it to
8+
`~/.claude/skills/`, `~/.agents/skills/`, and any vendored copy passed to it (the koopverse/firstmate
9+
fleet pack, layer5io/meshery-cloud's `.agents/skills/`).
10+
11+
## 2.0.1
12+
13+
### Sign text is centered on the sign, and never silently truncated
14+
15+
`--sign-text` rendered too high on both blank-signage poses: two-line text on `blank-signpost` ran
16+
through the top edge of the board. Two causes compounded. `build_sign_text_overlay` centered each
17+
line's SVG `y`, which is the alphabetic baseline, so every block sat half a cap height above its
18+
slot. And both zones in `mesh_palette.SIGN_TEXT_ZONES` had been eyeballed: each was wider than the
19+
surface it sits on and centered above it. The zones are now measured from a per-row dark-pixel
20+
profile of each pose rendered at viewBox size (signpost board x 198-405, y 266-346; book pages
21+
x 195-372, y 208-355), and carry a `max_height` and `min_font_size`.
22+
23+
Text that did not fit used to be cut to its first three lines with no message. The generator now
24+
shrinks the font toward `min_font_size` until the block fits, and exits with an error naming the
25+
zone when it cannot.
26+
27+
### A missing Pillow fails before anything lands in the post directory
28+
29+
Without Pillow, a `.jpg` run wrote `hero-image.png`, exited 1 anyway, and wrote the working SVG to
30+
`hero-image.svg` beside it - the exact filename every 1.x post committed, so it was one `git add`
31+
away from shipping the broken format 2.0.0 removed. SKILL.md described the same case as "a PNG plus
32+
a warning". The Pillow check now runs before Chrome launches, nothing is written on failure, and
33+
the working SVG stays in its temp directory. The temp directory is also removed after a successful
34+
run; it previously leaked on every invocation.
35+
36+
### sync_skill.sh checks content, refuses to run from a copy, and covers vendored copies
37+
38+
- `--check` compared size and mtime, so an identical copy checked out by git read as drifted. It
39+
now compares checksums.
40+
- The script is mirrored with everything else, and running a stale copy's sync would overwrite the
41+
current copies. It now refuses to run anywhere but `<layer5 repo>/.claude/skills/`.
42+
- Symlinked targets are resolved and de-duplicated; `~/.claude/skills` is often a symlink to
43+
`~/.agents/skills`, which was synced and reported twice.
44+
- Extra directories can be passed to sync or check vendored copies in other repos.
45+
- The header claimed the project copy shadows the user-level copy inside the layer5 repo. It does
46+
not reliably: a session in this repo loaded the stale 1.x user-level copy and shipped an SVG hero
47+
in an open PR before the drift was caught.
48+
49+
### The hero image no longer appears twice
50+
51+
`references/blog-structure.md` imported `heroImage` and placed it in the body of its post template,
52+
and SKILL.md's checklist asked for "at least one in-body image". The blog template already renders
53+
`thumbnail` above the title, so every post that followed the template showed the same image twice
54+
in a row. The template no longer imports the hero, the checklist asks for alt text on genuine
55+
in-body images instead, and `check_post.py` flags any body `<img>` whose source is the thumbnail
56+
file. Its first run found two posts on `master` doing this (AGENTS.md: One File to Guide Them All,
57+
and Meshery Hits 10,000 GitHub Stars); both are fixed in the same change.
58+
59+
### Docs
60+
61+
- SKILL.md no longer links `src/utils/build-collections.js` by a relative path that only resolves
62+
inside the layer5 repo, so vendored copies are byte-identical to this one.
63+
- Em dashes removed from SKILL.md and `references/`, which the skill's own voice rules forbid.
64+
65+
## 2.0.0
66+
67+
Breaking: `--output` now takes a raster path and refuses `.svg`. Posts written by 1.x reference
68+
`hero-image.svg` and must be re-pointed at a raster.
69+
70+
### Hero images now ship as rasters
71+
72+
`og:image` and `twitter:image` resolve to the thumbnail's `publicURL`
73+
(`src/templates/blog-single.js` into `src/components/seo.js`), and no major social platform renders
74+
SVG there, so every post produced by 1.x unfurled with no image on X, LinkedIn, Facebook, and
75+
Slack. `childImageSharp` is also null for SVG, so the blog index served the full-size file to paint
76+
a ~350px card with no srcset or modern formats.
77+
78+
Heroes are composed in SVG and rasterized to JPEG q88: ~70KB against ~310KB, visually
79+
indistinguishable (mean delta 1.1/255), and `gatsby-plugin-sharp` can now generate WebP/AVIF for
80+
on-page display while crawlers still get a JPEG. Rasterizing also bakes the type, so the Qanelas
81+
Soft OTF is no longer base64-embedded in every hero - it had been 73% of each file, which meant
82+
committing the binary of a commercially licensed font once per post.
83+
84+
The two posts already on `master` were re-rendered to JPEG and re-pointed.
85+
86+
### Hero images stopped looking identical
87+
88+
- Category selected 1 of 2 compositions; 14 categories shared one list. Category now selects a
89+
_tone_, and a hash of the title selects among 10 compositions within it.
90+
- One fixed layout. Now 4: the mascot sits left or right, centered or grounded.
91+
- One invariant glow that covered 36% of the canvas. Now 3 feathered contrast devices.
92+
- Measured across 8 heroes, two posts in the same category differed by a mean of 8/255 across the
93+
background - below perceptual threshold.
94+
95+
### Fixed
96+
97+
- **Non-determinism.** Selection used `hash(("mesh", title))`; Python salts string hashes per
98+
process, so the same command produced a different image on every run and a hero could never be
99+
regenerated. The seed is now `zlib.crc32` of the title, and per-choice selection uses
100+
`blake2b` - a second CRC skewed the three-way device pick (153/133/114 over 400 titles).
101+
- **Mascot sizing.** Placement scaled by the Illustrator artboard rather than the artwork.
102+
`pondering` paints 113 units of ink in a 529-unit-wide viewBox, so it rendered roughly a quarter
103+
of the intended size while artboard-filling poses rendered full height. Sizing now reads
104+
`assets/mascot-five/pose-bounds.json`, measured by `scripts/measure_pose_bounds.py`.
105+
- **Edge clipping.** The mascot zone ran to the canvas edge exactly, so any pose whose ink reached
106+
its own artboard edge was cropped by the frame. There is now a margin on every side.
107+
- **Footer overlap.** The mascot was centered on full canvas height, so the footer bar painted over
108+
its feet. The footer band is now reserved.
109+
- **Contrast.** Device alpha is solved against the measured background luminance rather than fixed,
110+
so light compositions get a whisper and dark ones get a real light source.
111+
- **Category pill accessibility.** White on `#00B39F` measured 2.64:1, failing WCAG AA for the 12px
112+
label. Now `#1E2117` on the same teal: 6.19:1.
113+
- **XML escaping.** Titles containing `&`, `<`, or `>` produced malformed SVG.
114+
- **Silent category fallback.** An unknown or mis-cased `--category` quietly took the default
115+
palette. `Internship Programs` and `Programs` were both in the approved taxonomy and missing from
116+
the palette map, and `Security` was in the map but not the taxonomy. Unknown categories are now a
117+
hard error, and `check_post.py` cross-checks the two lists.
118+
- **Raster pose paths.** `--five-pose PNG/...` died with a UTF-8 decode traceback; it now explains
119+
the problem.
120+
121+
### Added
122+
123+
- `scripts/check_post.py` - post linter used by Step 7a. Its first run against the two posts on
124+
`master` found an SVG thumbnail on both and a `Meshmates` capitalization error that the previous
125+
hand-ticked checklist had passed.
126+
- `scripts/rasterize.py`, `scripts/measure_pose_bounds.py`, `scripts/sync_skill.sh`.
127+
- `assets/mascot-five/pose-bounds.json`.
128+
- Step 7b: build the **blog collection** before merging
129+
(`BUILD_FULL_SITE=false LITE_BUILD_PROFILE=blog`), not the full site - nothing a blog post can
130+
break lives in the other collections, and CI builds the whole site on the PR anyway. Step 8 now
131+
waits on `gh pr checks --watch` instead of merging immediately, and stages only the post's own
132+
directory instead of the whole year folder.
133+
134+
### Removed
135+
136+
- `assets/mascot-five/PNG/` - 1.3MB of never-referenced files that only existed as a trap.
137+
- Ten byte-identical duplicate poses (`Artboard 5/8/13/16/18/20/22/25/35/38.svg`).
138+
139+
### Documentation
140+
141+
- `Artboard 41.svg` was on disk and absent from the pose index, which claimed to be complete. Added
142+
as `bursting-through`.
143+
- `references/blog-structure.md` specified `hero-image.png` in four places, including an
144+
`import heroImage from "./hero-image.png"` that would fail the Gatsby build, while Step 6
145+
generated `.svg`.
146+
- The style rule read ``Never use em dashes (`-`). Use a hyphen (`-`)`` - a hyphen in both
147+
positions, so it forbade nothing. Now named by code point, with a portable check.
148+
149+
## 1.x
150+
151+
Initial skill: MDX scaffolding, brand voice guidance, tag/category taxonomy, mesh-gradient hero
152+
generator with the Five mascot collection, worktree-isolated commit and auto-merge flow.

0 commit comments

Comments
 (0)