AGPL-3.0-or-later · forever.

showcase · tier 1 · business

Meeting actions

A transcript goes in, typed {owner, task, due} items come out, validated and ready for your tracker.

Nobody re-reads the transcript. The tracker import is already done. · conformance-gated in nika-spec ↗ · re-proven at every push

  • 4tasksthe plan falls out of the bindings
  • 3wavesparallel by construction
  • 2verbs exercisedinvoke · infer
  • T1the tierbusiness

The whole file

4 tasks · 3 waves

The plan falls out of the bindings, nothing is scheduled by hand.

meeting-actions.nika.yamlsource
nika: v1workflow:  id: meeting-actions  description: "Transcript → typed action items {owner, task, due}"# A NON-thinking local model, deliberately: a thinking model can spend the# whole `max_tokens` budget in its think block and return before the JSON# (engine#428). Schema showcases pick a model that answers directly.model: ollama/llama3.2:3binputs:  transcript_path:    type: string    default: "examples/fixtures/meeting-transcript.txt"    description: "Path to the raw meeting transcript"permits:  tools: ["nika:log", "nika:read", "nika:write"]  fs:    # The sample transcript, named as a LITERAL. `permits:` cannot interpolate    # (NIKA-AUTH-007), so this line does not follow `inputs.transcript_path`    # around: pointing the var at your own file means editing this entry too,    # or the read is refused at run with NIKA-SEC-004. That is the wall doing    # its job — a boundary you can read is a boundary a reviewer can check.    read: ["examples/fixtures/meeting-transcript.txt"]    write: ["out/action-items.json"]tasks:  transcript:    invoke:      tool: "nika:read"      args: { path: "${{ inputs.transcript_path }}" }  extract:    with:      transcript: ${{ tasks.transcript.output }}    infer:      max_tokens: 900                  # a ceiling makes the cost report a number, not UNBOUNDED      prompt: |        Extract every action item from this meeting transcript ·        ${{ with.transcript }}        One entry per commitment somebody actually made. `due` only when a        date or deadline was stated — never invent one.      schema:                          # the contract the model must satisfy        type: object        additionalProperties: false        required: [actions]        properties:          actions:            type: array            items:              type: object              additionalProperties: false              required: [owner, task]              properties:                owner: { type: string }                task: { type: string }                due: { type: string }  save:    with:      extract_actions: ${{ tasks.extract.output.actions }}    invoke:      tool: "nika:write"      args:        # `.json` content is ONE interpolation of a real value — the engine        # serializes it. Typing `{ "actions": ${{ … }} }` by hand emits        # unquoted fields and the artifact stops being JSON.        path: out/action-items.json        content: "${{ with.extract_actions }}"        create_dirs: true  trace:    after:      extract: success    invoke:      tool: "nika:log"      args:        level: info        message: "Action items extracted to out/action-items.json"outputs:  actions:    value: ${{ tasks.extract.output.actions }}    description: "Typed action items, tracker-ready"

audited · 3 tasks · 3 waves · permits declared · 1 hintnika 0.106.1

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

3 declared edges · 3 waves · the plan falls out of the bindings