showcase · tier 2 · builders
Release notes
git log in, typed notes out, the CHANGELOG edited in place and the team pinged with the headline.
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