AGPL-3.0-or-later · forever.

showcase · tier 2 · builders

Release notes

git log in, typed notes out, the CHANGELOG edited in place and the team pinged with the headline.

Release day: one command, a changelog in your voice, zero copy-paste. · conformance-gated in nika-spec ↗ · re-proven at every push

The whole file

4 tasks · 4 waves · the plan falls out of the bindings, nothing is scheduled by hand.

t2-release-notes.nika.yamlsource
nika: v1workflow:  id: release-notes  description: "git log → typed release notes → CHANGELOG insert → team ping"model: ollama/qwen3.5:4b   # local · zero key · swap for mistral/mistral-largevars:  since_tag: "v0.80.0"secrets:  team_webhook:    source: env    key: TEAM_WEBHOOK_URL    egress:                       # sanction the one send · the secret IS the URL      - to: "nika:notify"        host_from_self: truetasks:  history:    exec:      command: ["git", "log", "${{ vars.since_tag }}..HEAD", "--oneline", "--no-merges"]  notes:    with:      history: ${{ tasks.history.output }}    infer:      prompt: |        Write release notes from these commits ·        ${{ with.history }}        Tone · plain, direct, no marketing fluff.      schema:        type: object        required: [headline, body]        properties:          headline: { type: string }          breaking: { type: array, items: { type: string } }          body: { type: string }  changelog:    with:      notes_headline: ${{ tasks.notes.output.headline }}      notes_body: ${{ tasks.notes.output.body }}    invoke:      tool: "nika:edit"      args:        path: "./CHANGELOG.md"        find: "# Changelog"        replace: |          # Changelog          ## ${{ vars.since_tag }}..HEAD · ${{ with.notes_headline }}          ${{ with.notes_body }}  announce:    with:      notes_headline: ${{ tasks.notes.output.headline }}    after:      changelog: succeeded    invoke:      tool: "nika:notify"      args:        channel: webhook        target: "${{ secrets.team_webhook }}"        message: "Release notes ready · ${{ with.notes_headline }}"        severity: infooutputs:  headline: ${{ tasks.notes.output.headline }}  body: ${{ tasks.notes.output.body }}

nika inspect · engine 0.105.0 · vendored graph, never re-derived

5 declared edges · 4 waves · the plan falls out of the bindings