cd /news/ai-agents/show-hn-coding-agent-that-compiles-i… Β· home β€Ί topics β€Ί ai-agents β€Ί article
[ARTICLE Β· art-45821] src=github.com β†— pub= topic=ai-agents verified=true sentiment=↑ positive

Show HN: Coding agent that compiles intent into deterministic DAG before running

Rigorix, a new open-source coding agent runtime, compiles natural-language development tasks into deterministic Directed Acyclic Graphs (DAGs) before execution, separating planning from execution to enable repeatable, auditable, and governable AI-assisted software engineering for CI/CD environments.

read10 min views1 publishedJul 1, 2026
Show HN: Coding agent that compiles intent into deterministic DAG before running
Image: source

A deterministic coding-agent runtime for repeatable, auditable AI software engineering.

Rigorix compiles natural-language development tasks into executable Directed Acyclic Graphs (DAGs). Instead of relying on an open-ended agent loop, it separates planning from execution: the execution plan is generated, validated, and then executed within configurable policy, permission, and budget constraints. The result is AI-assisted software engineering that is repeatable, inspectable, and suitable for automated environments such as CI/CD.

The LLM generates code; Rigorix governs execution.

Rigorix operates through three modes:

CLI(rigorix

) β€” Interactive TUI + flag-based scripting for local developmentGitHub Action(rigorix-action

) β€” PR governance and automated code generation in CI/CDEngineβ€” The core library powering both

Rigorix is built with the Guardian Framework β€” an architecture enforcement framework for AI-assisted development. Guardian ensures every change is traceable to canonical architecture specs, validated by proof scripts, and governed by frozen module contracts.

Modern coding agents are remarkably capable. They can write code, edit projects, execute commands, and iterate on failures. But they share a fundamental problem: they are unpredictable, unauditable, and difficult to govern in automated contexts.

Every agent loop today works the same way: an LLM decides what to do, does it, checks the result, and loops. That loop is powerful β€” but it has no structure. There's no distinction between planning and execution. There's no audit trail beyond conversation history. There's no way to say "execute this plan but only if it stays within these boundaries."

This works fine when a human is watching every step. It breaks down when you want to:

Run in CI/CDβ€” without a human to approve every tool call** Audit what happened**β€” when conversation history isn't enough for compliance** Enforce policies**β€” "deny any change that touches the auth module" or "flag diffs that modify payment processing"** Budget costs**β€” cap LLM spending per run so a runaway agent doesn't burn your API key

Rigorix is opinionated: it intentionally gives up some flexibility in exchange for repeatability, governance, and deterministic execution.

The core idea is simple: instead of an LLM deciding what to do at each step, you compile the intent into a DAG first β€” a deterministic, reviewable plan. The DAG says: read these files, generate this patch, run these tests, verify these conditions. The LLM fills in the content; the DAG controls the flow. This is the same pattern that made build systems (Make, Bazel) and data pipelines (Airflow, Dagster) reliable: separate what from how, validate the plan before running it, and record every execution.

This approach makes tradeoffs. Rigorix is not as flexible as a free-form agent loop. It can't have a "conversation" with you or improvise mid-execution. If you want a coding assistant that chats, Rigorix is the wrong tool. But if you want a CI/CD pipeline that generates code, enforces policies, produces auditable records, and can run without supervision β€” Rigorix exists for that.

Rigorix achieves this through bounded autonomy: every execution is constrained by configurable risk policies, permission rules, execution budgets, and quality gates. The model is intentionally restrictive: the LLM decides what to generate within the execution graph, while Rigorix determines what is allowed to happen.

 Natural language task
        ↓
 Classifier β€” maps intent to a template
        ↓
 Template β€” defines the execution structure
        ↓
 Parameters β€” extracted from the task
        ↓
 DAG β€” deterministic execution graph
        ↓
 Execution β€” tools, retry, recovery
        ↓
 Validation β€” quality gates, policies
        ↓
 Audit β€” signed, timestamped record

Templates encode repeatable engineering workflows. Instead of asking the model to rediscover how to perform a common task each time, Rigorix selects an appropriate template, extracts parameters, builds an execution graph, and lets the LLM focus on generating code within that structure.

Repeatable means the same intent produces the same execution structure under the same templates and policies. The generated code may differ, but the workflow, validation steps, and governance remain consistent.

A template defines:

What files to read and what to generate from themWhich commands to run for verification (type-check, test, lint)How to handle dependencies between stepsWhere the output goes (new files, patches, test results)

Here is a minimal template β€” it reads a file, runs a regex filter, and writes the result:

name: extract-function-docs
description: Extract JSDoc comments from a TypeScript file
parameters:
  - name: file_path
    type: string
    description: Path to the TypeScript file
nodes:
  - id: read_file
    action: file_read
    params:
      path: "{{ file_path }}"
  - id: extract_docs
    action: llm_generate
    depends_on: [read_file]
    params:
      prompt: >-
        Extract all JSDoc comments from the file below.
        Return them as a markdown list.
      input: "{{ read_file.output }}"
  - id: write_output
    action: file_write
    depends_on: [extract_docs]
    params:
      path: "docs/{{ file_path | basename }}.md"
      content: "{{ extract_docs.output }}"

When a user runs rigorix plan "Extract docs from src/api.ts"

, Rigorix classifies the intent, maps it to this template, prompts the LLM to fill file_path

, and builds the 3-node DAG. The LLM generates the doc content; the template controls the flow.

When no existing template matches the intent β€” or confidence is low β€” Rigorix prompts the LLM to generate a new template dynamically. Generated templates can be cached and reused for future executions, reducing the need to regenerate common workflows.

Dimension Rigorix Claude Code Copilot / Cursor Aider SWE-Agent
Execution
Template-driven DAG Agent loop Agent loop Agent loop Agent loop
Safety
Risk gating, budgets, permissions Permission prompts Permission prompts (Cursor) Git auto-commit Docker sandbox
PR governance
Built-in policy.toml External CI βœ— βœ— βœ—
Audit
HMAC-signed envelopes Conversation history Conversation history Git log Ephemeral containers
Quality gates
Post-execution validation βœ— βœ— βœ— βœ—
Self-correcting
Validate loop (plan β†’ verify β†’ fix) Retry loop βœ— Lint-then-fix loop Retry loop

Rigorix is designed for deterministic, auditable, safely-bounded automation β€” not open-ended agent loops. If you need a code assistant that chats with you, use Claude Code or Aider. If you need a CI/CD pipeline that enforces policies and generates auditable code changes, use Rigorix.

The example below shows the generated execution graph before anything is modified. The user can inspect the plan and choose whether to execute it.

πŸŽ₯ Demo: Rigorix planning and executing a TypeScript refactor β€” reading code, generating a patch, type-checking, and running tests.

CLI output from the same DAG shown in the TUI above:

$ rigorix-cli plan  "Add a method to TaskList class in src/task.ts that returns only active tasks"
Plan: Add a method to TaskList class in src/task.ts that returns only active tasks (confidence 100%)
  Template: add-get-active-tasks-method | LLM: 2 calls, 1141 tokens
  Parameters:
    β”œβ”€β”€ file_path: "src/task.ts"
  Graph: 5 node(s), sealed=true
    Β· Read current task.ts file (root)
    Β· Insert getActiveTasks method after activeCount ← [Read current task.ts file]
    Β· Write extended task list test file ← [Read current task.ts file]
    Β· Type-check with tsc ← [Insert getActiveTasks method after activeCount, Write extended task list test file]
    Β· Run extended task list tests ← [Type-check with tsc, Write extended task list test file]

Run this plan now? [y/N]: y
2026-06-28T16:40:38.139935Z  INFO run: rigorix_engine::orchestrator::application::orchestrator_impl: Starting orchestrator run execution_id=019f0f1a-bbfb-7722-8c43-e3232eb88f9b
2026-06-28T16:40:46.026763Z  INFO run: rigorix_engine::orchestrator::application::orchestrator_impl: Orchestrator run completed execution_id=019f0f1a-bbfb-7722-8c43-e3232eb88f9b status=Completed
Run: Completed β€” 0 failed, 5 passed, 0 skipped (5 total)
  Template: add-get-active-tasks-method | LLM: 2 calls, 1210 tokens

  βœ“ Read current task.ts file β€” Success
  βœ“ Insert getActiveTasks method after activeCount β€” Success
  βœ“ Write extended task list test file β€” Success
  βœ“ Type-check with tsc β€” Success
  βœ“ Run extended task list tests β€” Success

Rigorix currently supports Rust, TypeScript, Python, and Go as target codebases. TypeScript is the most mature integration today (it has a working failure-compiler step); the others are functional but earlier-stage.

cargo install --git https://github.com/arman-jalili/rigorix-oss rigorix-cli

git clone https://github.com/arman-jalili/rigorix-oss
cd rigorix-oss && cargo build --release -p rigorix-cli
./target/release/rigorix --help
export RIGORIX__LLM__API_KEY="sk-ant-..."   # Anthropic
cd my-project
rigorix init
rigorix run "Explain how the main module works"

Rigorix will: classify the intent β†’ extract parameters β†’ generate a DAG β†’ execute nodes (file reads, edits, bash commands) β†’ validate results.

rigorix plan "Add a new endpoint to the API"   # Review the DAG, then:
rigorix run "Add a new endpoint to the API"

Or just plan and confirm in one flow:

rigorix plan "Add error handling to the parser"
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   User (Developer)                           β”‚
β”‚            (CLI / TUI / GitHub Action)                       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Planning Phase                           β”‚
β”‚                                                              β”‚
β”‚  Intent β†’ Classify β†’ Extract β†’ Generate TaskGraph β†’ Validate β”‚
β”‚                  ↕ (low-confidence fallback)                 β”‚
β”‚        Template System + LLM Template Generator              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Execution Phase                          β”‚
β”‚                                                              β”‚
β”‚  DAG Engine (topo sort) β†’ ParallelExecutor (tokio JoinSet)   β”‚
β”‚       β†’ Tool System (file/git/command/LSP)                   β”‚
β”‚       β†’ Retry/Recovery/Fallback                               β”‚
β”‚       β†’ Cancellation (graceful/immediate)                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  Observability & Persistence                  β”‚
β”‚                                                              β”‚
β”‚  Event Bus β†’ State Persistence β†’ Audit (HMAC-signed)         β”‚
β”‚         + Prometheus Metrics + Tracing                       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
rigorix-oss/
β”œβ”€β”€ engine/              # Core library β€” all business logic
β”‚   β”œβ”€β”€ src/             # Core engine (planning, execution, tools, governance)
β”‚   └── .pi/             # Architecture docs, ADRs, diagrams
β”œβ”€β”€ cli/                 # CLI binary β€” thin wrapper over engine
β”‚   β”œβ”€β”€ src/cli_boundary/# Flag-based CLI (Clap, dispatch, config)
β”‚   β”œβ”€β”€ src/tui/         # Interactive TUI (ratatui)
β”‚   └── .pi/             # Architecture docs
β”œβ”€β”€ actions/             # GitHub Action β€” thin adapter over engine
β”‚   β”œβ”€β”€ src/             # 9 bounded-context modules
β”‚   └── .pi/             # Architecture docs
β”œβ”€β”€ Cargo.toml           # Workspace root
└── .pi/                 # Root-level architecture docs, prompts, scripts
  • Rust 2024 edition (stable toolchain)
  • LLM API key (set ANTHROPIC_API_KEY

orOPENAI_API_KEY

)

Rigorix treats CI as continuous verification rather than compilation and testing. Beyond formatting, linting, unit tests, and security scanning, every architectural capability is validated through proofing scripts that verify contracts, architecture readiness, documentation consistency, policy enforcement, and execution guarantees.

πŸ“¦ 86 automated verification steps

  Lint (12)     β€” formatting, clippy, CI validation Γ— 3 crates
  Build (9)     β€” release build, static analysis, package Γ— 3 crates
  Test (53)     β€” cargo test, unit/integration stages, 30 module proofing scripts
  Security (7)  β€” cargo audit, secret scan, stage security, security validation
  Docs (13)     β€” canonical, architecture, readiness, ubiquitous language Γ— all crates
  Integration (2) β€” integration and operations validation
bash .pi/scripts/local-ci.sh

bash .pi/scripts/local-ci.sh --stage=lint      # lint only
bash .pi/scripts/local-ci.sh --stage=build     # build only
bash .pi/scripts/local-ci.sh --stage=test      # test only
bash .pi/scripts/local-ci.sh --stage=security  # security only
bash .pi/scripts/local-ci.sh --stage=docs      # documentation only
bash .pi/scripts/local-ci.sh --stage=integration  # integration only

bash .pi/scripts/local-ci.sh --crate=engine
bash .pi/scripts/local-ci.sh --crate=cli
bash .pi/scripts/local-ci.sh --crate=actions

bash .pi/scripts/local-ci.sh --quick

bash .pi/scripts/local-ci.sh --save

bash .pi/scripts/local-ci.sh --list

Each crate has its own .pi/architecture/

directory with:

Module specsβ€” Detailed interface contracts for each bounded context** ADRs**β€” Architecture Decision Records explaining key design choices** Diagrams**β€” System context, data flow, deployment

We welcome contributions! Please read CONTRIBUTING.md for our development process, coding standards, and pull request workflow.

Key guidelines:

  • Every edit must pass cargo clippy --workspace

andcargo fmt --check

  • All modules follow Clean Architecture with frozen contracts (see .pi/architecture/

) - Run cargo test --workspace

before submitting - New features require architecture documentation (see .pi/prompts/feature-development.md

)

Licensed under either of:

at your option.

── more in #ai-agents 4 stories Β· sorted by recency
── more on @rigorix 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain β€” perfect for shipping the agent you just read about.

$git push zahid main
β†’ Live at https://your-agent.zahid.host βœ“
Get free account β†’ Pricing
from €0/mo Β· no card required
LIVE [news/show-hn-coding-agent…] indexed:0 read:10min 2026-07-01 Β· β€”