feat: deterministic image composer — OG + square variants, branding, baked caption (v0.17.0)
Commit 2 (final scope) of the in-plugin editorial image pipeline (ARCHITECTURE.md #21). A deterministic local composer now runs between provider bytes and sideload: Image A yields a corner-marked featured (1200x632) + branded OG (1200x630, teal band, logo, baked caption in Poppins SemiBold) + square card (1080x1080, cream panel, Poppins Bold, teal footer with the reverse lockup); Image B gets the corner mark only. - Capability ladder: imagick (full compositing) -> wp_get_image_editor resize-only (unbranded, WARNING once) -> pass-through (WARNING once); probe cached in prautoblogger_image_compose_capability, fingerprinted by PHP version + imagick/gd presence so host flips auto-invalidate. compose() never throws; composition can never fail a publish. - Variants sideloaded with a role filename suffix; attachment meta _prautoblogger_image_role + _prautoblogger_base_attachment_id; post meta _prautoblogger_og_image_id (frozen for the rebuilt SEO stage) + _prautoblogger_square_image_id. No cost-tracker rows ($0 local stage; duration logged on the image_composer channel). - New Images settings: compose_enabled ('1'), compose_variants ('og,square'), featured_mark_enabled ('1') — read at point of use. Geometry ships as Layout defaults behind the prautoblogger_image_compose_layout filter. - Vendored brand rasters (assets/brand) + bundled OFL Poppins faces (assets/fonts) for per-environment byte-stable output (stripImage + PNG date/time chunks excluded). Validated on Hostinger PHP 8.3.30 / ImageMagick 7.1.1-43: php -l clean on all touched files, double render byte-identical (sha256), exact variant geometry. - Fix: featured/Image B alt text is the editorial caption (was the model name); model still persists in _prautoblogger_image_model. - Image_Attacher extracted from Image_Pipeline (300-line compliance); sideloader gains an optional filename suffix param (back-compat ''). - Version 0.16.0 -> 0.17.0 + CHANGELOG + ARCHITECTURE.md #21 + CONVENTIONS.md composer guide in this commit. Unit tests: layout clamp boundaries, capability ladder, cache invalidation, attacher meta-linking, pipeline integration, imagick determinism (gated). Agent-Session: engineer-prautoblogger-image-composer-20260611
This commit is contained in:
48
CHANGELOG.md
48
CHANGELOG.md
@@ -5,6 +5,54 @@ All notable changes to PRAutoBlogger will be documented in this file.
|
||||
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project uses [Semantic Versioning](https://semver.org/).
|
||||
|
||||
## [0.17.0] - 2026-06-11
|
||||
|
||||
### Added
|
||||
- **Deterministic PHP image composer (Commit 2 of the in-plugin editorial image
|
||||
pipeline).** Every generated image now passes through a local, $0,
|
||||
deterministic composer between the provider's bytes and the media sideloader.
|
||||
Image A yields a corner-marked featured image (1200×632) plus a branded
|
||||
**OG/social variant** (1200×630, teal band, brand mark, baked editorial
|
||||
caption in Poppins SemiBold) and a **square card variant** (1080×1080, image
|
||||
slice + cream caption panel in Poppins Bold + teal footer with the horizontal
|
||||
lockup). Image B gets the corner mark only. Variants are sideloaded with a
|
||||
role filename suffix and meta-linked: attachment meta
|
||||
`_prautoblogger_image_role` + `_prautoblogger_base_attachment_id`, post meta
|
||||
`_prautoblogger_og_image_id` + `_prautoblogger_square_image_id` (the rebuilt
|
||||
SEO stage will emit `og:image` from the frozen og key).
|
||||
- **Capability ladder with cached probe.** Imagick (full compositing) →
|
||||
`wp_get_image_editor()` GD path (resize-only, unbranded, single WARNING) →
|
||||
pass-through (single WARNING). The probe result is cached in
|
||||
`prautoblogger_image_compose_capability`, fingerprinted by PHP version +
|
||||
imagick/gd presence so it auto-invalidates when the host changes. Override
|
||||
filter: `prautoblogger_image_compose_capability`. Composition failure can
|
||||
never block a publish (per-render try/catch + pipeline safety net).
|
||||
- New Images settings: `prautoblogger_image_compose_enabled` (default on),
|
||||
`prautoblogger_image_compose_variants` (default `og,square`),
|
||||
`prautoblogger_image_featured_mark_enabled` (default on). Geometry ships as
|
||||
layout-class constants behind the `prautoblogger_image_compose_layout`
|
||||
filter. All keys keep the `prautoblogger_`/`_prautoblogger_` prefixes, so
|
||||
the existing uninstall prefix-sweep purges them (no uninstall.php changes).
|
||||
- Vendored brand rasters (`assets/brand/`, from peptide-repo-brand SVG masters)
|
||||
and bundled OFL fonts (`assets/fonts/`: Poppins Bold + Poppins SemiBold +
|
||||
OFL.txt) — no system-font or runtime-SVG dependency, byte-stable output per
|
||||
environment (metadata stripped, PNG date/time chunks excluded).
|
||||
|
||||
### Fixed
|
||||
- Featured/Image B **alt text is now the editorial caption** instead of the
|
||||
generation model name (`sideload_and_log()` passed the model as `$alt_text`,
|
||||
contradicting the sideloader docblock). The model keeps persisting in
|
||||
`_prautoblogger_image_model`.
|
||||
|
||||
### Changed
|
||||
- `PRAutoBlogger_Image_Media_Sideloader::sideload_image()` /
|
||||
`generate_filename()` accept an optional filename role suffix
|
||||
(back-compat default `''`).
|
||||
- `PRAutoBlogger_Image_Pipeline` delegates sideload/cost-log, caption
|
||||
prepending, and variant persistence to the new
|
||||
`PRAutoBlogger_Image_Attacher` (300-line compliance); also declares the
|
||||
previously-dynamic `$trace_context` property (PHP 8.2 deprecation).
|
||||
|
||||
## [0.16.0] - 2026-05-29
|
||||
|
||||
### Changed
|
||||
|
||||
Reference in New Issue
Block a user