Skip to content

Release blog + upgrade manifest: render breaking-change detect blocks from a single source (DRY) #2622

@chalin

Description

@chalin

Background

In 0.15.0 we shipped two parallel artifacts for upgrade guidance:

  • Human-readable blog: Release 0.15.0 report and upgrade guide — narrative breaking-change sections with Applies if… gates and prose action checklists.
  • Machine-readable manifest (experimental, introduced in #PR-PLACEHOLDER): /upgrades/0.15.0.yaml — structured detect predicates, references, peer versions, and sanity checks intended for tooling and AI-agent consumption.

These two artifacts are currently independent and risk drifting (version pins, breaking-item ids, anchor names, detect recipes can all skew between the blog and the manifest as releases pile up). We accepted that risk for 0.15.0 to keep the change small and ship the manifest as a first step.

Goal for 0.16.0

Make the manifest the single source of truth for the structured bits, and have the release blog render them inline via Hugo data + a small set of shortcodes. The blog stays prose for narrative sections; structural data (versions, detect commands, applies-if gates, partial links, per-item references) is rendered from data/upgrades/<version>.yaml so authors maintain one file per release.

Proposed scope

  • Promote docsy.dev/static/upgrades/0.15.0.yaml to a Hugo data file under docsy.dev/data/upgrades/0.15.0.yaml, and (re-)expose it as a static asset at /upgrades/<version>.yaml (e.g. via Hugo `outputs` or a copy step) so agent-facing URLs remain stable.
  • Define and document the schema (`schema: docsy-upgrade-manifest/v1`): `from`, `to`, `peer`, `breaking[]` (with `id`, `title`, `summary`, `applies-if`, `detect`, `actions`, `references`), `sanity[]`, `rollback`. Detect rule kinds: `grep`, `file-exists`, `config-key-present`, `config-multilingual`, plus `any`/`all` combinators. The 0.15.0 manifest is the working seed.
  • Author shortcodes (working titles): `upgrade-versions`, `upgrade-applies-if`, `upgrade-detect`, `upgrade-actions`. Each takes a manifest `id` and renders the corresponding structured bit inline. Output should match the existing blog formatting so the visual change is minimal.
  • Add a small CSS rule for the rendered detect block (monospace, copy-button if cheap).
  • Refactor the 0.15.0 blog to use the shortcodes (and likely backport to verify nothing visual regresses for indexed/archived versions).
  • Document the workflow in maintainer-notes under the release-prep audit section so authors know to edit the manifest first, then the blog narrative.
  • Add a CI check that validates the manifest schema and that referenced anchors (`/blog/2026/X.Y.Z/#anchor`) resolve.

Out of scope (future)

  • An official Docsy upgrade skill / CLI (`docsy-upgrade`) that consumes the manifest. Once the schema stabilizes through 0.16.0+, a separate effort can package the skill — possibly as a Claude Code skill, GitHub action, or stand-alone CLI.
  • Auto-fix transforms for deterministic migrations (e.g. the multilingual `/community/` → `//community/` rewrite under stated conditions). Would belong with the skill, not the manifest itself.

Why now

The 0.15.0 manifest is a first step, not a foundation. If we wait until 0.17.0 to DRY this up, we'll have at least three drifted copies and a much larger refactor. Doing it during 0.16.0 — while we have only one manifest in the wild — is the cheapest moment to lock in the workflow.

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions