showcase · tier 1 · business
Meeting actions
A transcript goes in, typed {owner, task, due} items come out, validated and ready for your tracker.
- 4tasksthe plan falls out of the bindings
- 3wavesparallel by construction
- 2verbs exercisedinvoke · infer
- T1the tierbusiness
The whole file
4 tasks · 3 wavesThe 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