DEV Community

Cover image for What's New in CogniRunner: Local AI, Zero-Key Models & Actions That Write Back
Mihai Perdum
Mihai Perdum

Posted on Originally published at leanzero.net

What's New in CogniRunner: Local AI, Zero-Key Models & Actions That Write Back

What's New in CogniRunner: Local AI, Zero-Key Models & Actions That Write Back

Key takeaways

  • Run AI on your own hardware with LM Studio — the first Jira app to do it — or zero-key inside Atlassian with the new Forge LLM provider.
  • Declarative AI actions go beyond validation: draft comments, create sub-tasks or linked issues, and generate DOCX/PDF/PPTX — all in plain English.
  • Skills, Memories, and a shared documentation library ground every decision in your team's real context.

CogniRunner — the semantic layer for Jira workflows — just got its biggest update yet. If you've used it to block a vague bug report or flag a likely duplicate, the core idea is familiar: write a plain-English prompt, pick a field, and let an AI model judge meaning, not just structure. This release pushes that idea in three directions: where the AI runs, what it can do after it decides, and how well it understands your project.

CogniRunner's admin panel — every AI validator, condition and post-function across your workflows, in one place.
The CogniRunner admin dashboard

CogniRunner is open source under Apache-2.0. Everything below is in the shipping app on the Atlassian Marketplace — and in the open on GitHub.

Run AI where your data lives

The headline of this update is choice of where inference happens. CogniRunner now spans the full spectrum, from fully local to fully managed:

Option What it means Best for
LM Studio (local) Inference and your field data stay on your own hardware. Zero per-token cost. Maximum privacy, air-gapped or cost-sensitive teams.
Atlassian Forge LLM Zero-key, runs inside Atlassian's platform — no API key, no external egress. The fastest start; data never leaves Atlassian.
BYOK cloud Bring your own key: OpenAI, Anthropic, Azure OpenAI, OpenRouter, AWS Bedrock. A specific model, vision support, or your own account.

CogniRunner is the first Jira app to integrate LM Studio for on-device inference, and among the first to ship the Atlassian Forge LLM provider — AI that runs with no key and no egress, so the app keeps its Runs on Atlassian eligibility. Switching providers never loses your other keys; each is stored per-provider, encrypted at rest.

The Settings tab: choose a provider, paste a key (stored encrypted in Forge), pick a model — and wire up optional MCP integrations like context7, web-search and document tooling.
Multi-provider AI configuration

With LM Studio, field content and attachments never leave your machines. With the Forge LLM provider, they never leave Atlassian's cloud. Privacy is now a configuration choice, not a compromise.

From validation to action

Validators gate a transition; the new declarative AI actions let CogniRunner act on one. After a transition, you can now have the AI:

Draft and post a comment — a summary, a triage note, a status update.

Create a sub-task or linked issue — spin off follow-up work automatically.

Generate and attach a document — a DOCX, PDF, or PPTX, built from the issue's own content.

All of it is configured in plain English — no code required. Under the hood, the same engine powers CogniRunner's static post-functions: the AI writes the JavaScript once at setup, then it runs on every future transition at zero AI cost, chaining up to 50 sandboxed steps.

The Function Builder: describe each step in plain English, generate the code, and it runs at zero AI cost once published — steps chain by passing variables.
Declarative actions and the static function builder

Use semantic post-functions when the output should change per issue (a summary, a release note), and static ones for deterministic, high-volume work (creating standard sub-tasks) where you don't want a model call on every transition.

Smarter context: Skills, Memories & the docs library

A model is only as good as what it knows about your project. This update deepens grounding three ways:

Documentation library — upload API specs, JSON schemas, or business rules once, then attach them to any rule so the AI validates and generates against your standards.

Skills — reusable, named capabilities you can drop into rules instead of re-writing prompts.

Memories — instance-specific context the AI learns and carries forward.

Optional MCP integrations (context7 for live SDK docs, web-search, document tooling) extend that reach further — CogniRunner acts as the middle layer and runs the tool calls, so your AI provider never sees the integration URLs.

Agentic by default — the AI searches Jira for you

When a rule needs context beyond the field itself — "is this a duplicate?" — CogniRunner goes agentic: the AI autonomously builds and runs JQL against the issue's own project, over multiple rounds, before deciding. Every query, every round, and the final reasoning are recorded.

An agentic validation log: three rounds of JQL, a high-confidence match against PROJ-118, a JQL timeout that was retried, and a final block decision — every step recorded.
Agentic JQL search, fully logged

Agentic search is now confined to the rule's own project and bounded to three rounds within a 22-second budget — and it always fails open. If the model errors or runs out of time, the transition is allowed. A workflow that locks up is worse than one that occasionally misses.

Hardened for production

Beyond features, this release is the result of a long adversarial-review and durability campaign. Among the under-the-hood wins: agentic JQL is project-scoped, the static-function sandbox is tightened, multi-provider dispatch is hardened, and a durability sweeper reaps any killed long-running task so you never see a "stuck" run. It's the same app — just sturdier on a Monday.

Try it

🧪 CogniRunner on the Atlassian Marketplace — install straight into Jira Cloud.

💻 Open source on GitHub — open source under Apache-2.0.

📖 The CogniRunner project page — the full feature tour.

Configuration still takes about 30 seconds: pick a field, write what "good" means in plain English, done. The difference now is that the AI can run on your terms, act on what it finds, and reason with everything your team knows.

Top comments (2)

Collapse
 
raju_dandigam profile image
Raju Dandigam

Separating semantic and static post-functions is a sharp boundary. One thing I’d make configurable per rule is failure posture: a project-scoped JQL timeout on low-risk enrichment can fail open, while an approval or data-mutation rule may need to fail closed or route to manual review. Since every query and round is logged, do you also persist the rule version and provider or model identity so a later incident can reconstruct why a transition was allowed?

Collapse
 
mihai_leanzero profile image
Mihai Perdum

@raju_dandigam checked the source rather than guess. On the AI-judgment seam there's no per-rule knob yet — a provider error or timeout during validation always fails open: validators and conditions let the transition through, and a semantic post-function that errors returns decision:SKIP rather than retrying into a manual-review path. (Worth noting elsewhere in the same codebase a fault in the storage or Jira-write layer fails CLOSED instead, so it's a per-seam contract, not one blanket policy — but on this specific validate/act seam it's always open today.) Configurable posture per rule, especially for the approval/mutation case, would be a real improvement.

On persistence: the per-run record written today is an async_job row for operational visibility, not a durable audit log — best-effort, 2h TTL while active, 20 minutes once done, by the source's own comment. It carries ruleId, but that's current identity, not a version snapshot of the prompt/config at run time. Provider and model aren't reliably captured either — on the actual post-function enqueue path, provider is only recorded when it's LM Studio and model is hardcoded null. So no, an incident a couple weeks out can't yet reconstruct which model or which rule version made a given call.