Skip to main content
T2 chain · engineering / devrel: the release-day ritual as one file: history in, a typed notes object out, the CHANGELOG updated in place with nika:edit, the team pinged with the headline.

The job

Every release someone copy-pastes git log into a doc, rewrites it, pastes it into the CHANGELOG, then announces it. Four manual steps, four chances to drift. Here the git range is an input, the notes are a schema-typed object, and the announcement quotes the same headline the CHANGELOG got.

The shape

The file

release-notes.nika.yaml

How it works

1

The range is an input, not a hardcode

${{ inputs.since_tag }}..HEAD: next release you change one input, or pass it at run time.
2

Typed notes · headline + breaking + body

The schema means ${{ tasks.notes.output.headline }} is a real field downstream: in the CHANGELOG insert AND in the ping. One source, two consumers, no drift.
3

Edit-in-place, not overwrite

nika:edit finds the # Changelog heading and replaces it with itself + the new section: the file’s history stays intact below.

Constructs you just used

Make it yours

  • Gate the announce behind a human: add a nika:prompt task between changelog and announce. The pattern is in Invoice chaser.
  • Add breaking: to the ping when size(tasks.notes.output.breaking) > 0.
  • Render a public version too: a second infer task with a “user-facing tone” prompt, writing docs/changelog/.

Next · SEO content brief

Chained fetch extractions (sitemap mode, then article mode) and CEL indexing into a binding.