Part 3 of 3 — Engineering Intent Series -- Inside the Machine: The ISL Build Pipeline
<p>In Part 1 we identified the problem. In Part 2 we dissected the spec format. Now we go inside the engine that transforms intent into production code — automatically, verifiably, and repeatably.</p> <p>This is the <strong>ISL Tooling Engine</strong>. It has two distinct phases: <strong>Build</strong> and <strong>Generate</strong>.</p> <h2> Phase 1: The Builder </h2> <p>Real software is never a single file. A <code>LoginForm</code> depends on <code>UserAuthService</code>, which depends on <code>User</code> domain model, which depends on <code>AuthStatus</code> enum. Each of those has its own <code>.isl.md</code> spec file.</p> <p>The <strong>ISL Builder</strong> scans your entire specification folder, identifies all <code>@Reference</code> tags, and builds a <strong>Directed Acyclic Graph
In Part 1 we identified the problem. In Part 2 we dissected the spec format. Now we go inside the engine that transforms intent into production code — automatically, verifiably, and repeatably.
This is the ISL Tooling Engine. It has two distinct phases: Build and Generate.
Phase 1: The Builder
Real software is never a single file. A LoginForm depends on UserAuthService, which depends on User domain model, which depends on AuthStatus enum. Each of those has its own .isl.md spec file.
The ISL Builder scans your entire specification folder, identifies all @Reference tags, and builds a Directed Acyclic Graph (DAG) of your system:
AuthStatus (enum) └── User (domain model) └── UserAuthService (business logic) └── LoginForm (presentation)AuthStatus (enum) └── User (domain model) └── UserAuthService (business logic) └── LoginForm (presentation)Enter fullscreen mode
Exit fullscreen mode
This graph is not documentation. It's the build order.
Topological Sort
The Builder performs a topological sort on this graph — the same technique used by real compilers, package managers (npm, cargo, gradle), and build systems like Make. The rule is simple: before processing any node, all its dependencies must already be resolved.
To trigger the build phase and resolve the project graph:
npx ts-node tools/vscode-isl/src/isl-builder.ts example/design-pomodoro
Enter fullscreen mode
Exit fullscreen mode
For each component, the Builder produces two files:
xxx.build.md — the full generation context: the original ISL spec of the component, with all the .ref.md files of its dependencies inlined. This is the complete, self-contained instruction set for that component.
xxx.ref.md — the public interface of the component: what it exports, what its capabilities are, what types it exposes. This is what downstream components will receive as context.
Here's what a real .ref.md looks like — from an actual ISL project:
`
Project: Logic
Version: 1.0.0 ISL Version: 1.6.1
Reference: TimerMode, TimerState, TimerConfigEntity in
./domain.isl.md
Component: PomodoroEngine
Role: Business Logic
⚡ Capabilities
initialize
Contract: Sets up the initial state of the timer Signature: Input: None / Output: None
startTimer
Contract: Initiates the countdown for the current timer mode Signature: Input: None / Output: None
selectMode
Contract: Changes the active timer mode and resets the timer Signature:
- Input:
mode:TimerMode - Output: None`
Enter fullscreen mode
Exit fullscreen mode
The Builder also produces the Build Manifest — a JSON index of all components in topological order, with their source paths, build paths, and integrity hashes:
[ { "sourceFile": "./pomodoro/domain.isl.md", "buildFile": "./pomodoro/build/domain.build.md", "implementationPath": "./domain", "hash": "753ff32724b2a2501ab95b5241afbd48" }, { "sourceFile": "./pomodoro/logic.isl.md", "buildFile": "./pomodoro/build/logic.build.md", "implementationPath": "./logic", "hash": "8b36f3559da223a04d77a5ccba40bfbd" }, { "sourceFile": "./pomodoro/ui.isl.md", "buildFile": "./pomodoro/build/ui.build.md", "implementationPath": "./ui", "hash": "91d28e3dc2652d9d0f0590acf7f1583a" }, { "sourceFile": "./pomodoro/main.isl.md", "buildFile": "./pomodoro/build/main.build.md", "implementationPath": "./main", "hash": "72145c5ee3d89dac2a7f86f0047cb673" } ][ { "sourceFile": "./pomodoro/domain.isl.md", "buildFile": "./pomodoro/build/domain.build.md", "implementationPath": "./domain", "hash": "753ff32724b2a2501ab95b5241afbd48" }, { "sourceFile": "./pomodoro/logic.isl.md", "buildFile": "./pomodoro/build/logic.build.md", "implementationPath": "./logic", "hash": "8b36f3559da223a04d77a5ccba40bfbd" }, { "sourceFile": "./pomodoro/ui.isl.md", "buildFile": "./pomodoro/build/ui.build.md", "implementationPath": "./ui", "hash": "91d28e3dc2652d9d0f0590acf7f1583a" }, { "sourceFile": "./pomodoro/main.isl.md", "buildFile": "./pomodoro/build/main.build.md", "implementationPath": "./main", "hash": "72145c5ee3d89dac2a7f86f0047cb673" } ]Enter fullscreen mode
Exit fullscreen mode
Notice the order: domain first, then logic (which depends on domain), then ui (which depends on logic), then main last. The topological sort guarantees this. The Generate phase will process them in exactly this sequence.
Phase 2: The Generator
With the Build Manifest ready, the Generator processes each component in topological order — because by the time it reaches any component, all its dependencies have already been compiled.
For each component, the Generator receives exactly two inputs:
-
xxx.build.md — the spec + inlined interfaces of all dependencies.
-
dep.sign.ts for each dependency — the actual TypeScript signatures generated in previous steps. Not the spec. Not the .ref.md. The real, generated code signatures.
Here's why this matters. The .ref.md describes what a component should expose according to the ISL spec. But the LLM that compiled it may have made idiomatic choices — wrapping a return type, using a language-native pattern, adjusting a signature slightly. The sign.ts captures what was actually generated:
import { TimerMode, TimerState, TimerConfigEntity } from "./domain";
export const PomodoroEngine: (initialConfig?: { workDuration?: number; shortBreakDuration?: number; longBreakDuration?: number; }) => { initialize: () => void; startTimer: () => void; pauseTimer: () => void; resetTimer: () => void; selectMode: (mode: (typeof TimerMode)[keyof typeof TimerMode]) => void; getCurrentState: () => (typeof TimerState)[keyof typeof TimerState]; getRemainingTime: () => number; };`
Enter fullscreen mode
Exit fullscreen mode
When LoginForm is compiled, it receives this exact signature — not what the spec said, but what the code is. This eliminates integration mismatches structurally. The generated code is guaranteed to compile against the code that actually exists.
To generate the implementation using a specific stack and LLM provider:
npx ts-node tools/vscode-isl/src/isl-generator.ts example/design-pomodoro --gemini --v=31p --stack=react-js
Enter fullscreen mode
Exit fullscreen mode
The Generator outputs:
-
xxx.js — the generated implementation
-
xxx.sign.ts — the actual signature of this component, ready for downstream consumers
Phase 3: The Auditor (Verification)
The pipeline doesn't end when the code is written. To ensure the implementation strictly follows the logical state transitions defined in the ISL, we trigger the Auditor.
The Auditor is a specialized agent that acts as a Deterministic Unit Test Runner. It doesn't just look at the code; it simulates the "Flow" described in the spec against the generated logic.
Its job is to catch Logical Dead-ends:
-
Is an isLoading flag set but never reset in a CATCH block?
-
Does a state transition skip a mandatory notification?
-
Is a method signature logically sound but practically unreachable?
The audit process happens in two steps: first generating the scenarios, then running the simulation.
# 1. Create the logical tests from the spec npx ts-node tools/vscode-isl/src/isl-logic-test.ts example/design-pomodoro --gemini --v=31p# 1. Create the logical tests from the spec npx ts-node tools/vscode-isl/src/isl-logic-test.ts example/design-pomodoro --gemini --v=31p2. Run the robotic auditor to verify the implementation
npx ts-node tools/vscode-isl/src/isl-logic-test-run.ts example/design-pomodoro --gemini --v=31p`
Enter fullscreen mode
Exit fullscreen mode
By running this verification automatically, we catch architectural bugs before a human developer even opens a Pull Request.
The Full Pipeline
.isl.md files │ ▼ ┌─────────────┐ │ BUILDER │ DAG + topological sort └─────────────┘ │ ├──► xxx.build.md (ISL + inlined .ref.md of dependencies) ├──► xxx.ref.md (public interface, for downstream specs) └──► manifest.json (ordered build index + hashes) │ ▼ ┌─────────────┐ │ GENERATOR │ processes in topological order └─────────────┘ │ Input per component: ├── xxx.build.md └── dep.sign.ts (real signatures of all dependencies) │ Output per component: ├──► xxx.js (generated implementation) └──► xxx.sign.ts (real signature, for downstream generators).isl.md files │ ▼ ┌─────────────┐ │ BUILDER │ DAG + topological sort └─────────────┘ │ ├──► xxx.build.md (ISL + inlined .ref.md of dependencies) ├──► xxx.ref.md (public interface, for downstream specs) └──► manifest.json (ordered build index + hashes) │ ▼ ┌─────────────┐ │ GENERATOR │ processes in topological order └─────────────┘ │ Input per component: ├── xxx.build.md └── dep.sign.ts (real signatures of all dependencies) │ Output per component: ├──► xxx.js (generated implementation) └──► xxx.sign.ts (real signature, for downstream generators)Enter fullscreen mode
Exit fullscreen mode
Every step is deterministic. Every component is compiled against real, already-generated interfaces. The output is not "what the AI felt like generating today." It's the inevitable result of compiling a precise specification against a verified dependency graph.
Closing the Loop
Across these three articles, we've built the case for a fundamentally different way of working with AI in software development.
Not prompt engineering. Spec engineering.
The shift is conceptually simple but practically significant: you stop treating the LLM as a creative collaborator you negotiate with, and start treating it as a compiler you feed precise input. The quality of the output stops depending on how well you phrase your request and starts depending on how well you define your intent.
ISL is the language for that intent. The Tooling Engine is the compiler. The generated code is the artifact. And the spec — always in sync with the code, by construction — is the end of undocumented legacy software.
The spec is open source — read it, use it, contribute to it: github.com/fra00/isl-specification
DEV Community
https://dev.to/francesco_marconi_282058b/inside-the-machine-the-isl-build-pipeline-3eppSign in to highlight and annotate this article

Conversation starters
Daily AI Digest
Get the top 5 AI stories delivered to your inbox every morning.
More about
geminimodelversionBaton
<p> Orchestrate your AI coding agents </p> <p> <a href="https://www.producthunt.com/products/baton-2?utm_campaign=producthunt-atom-posts-feed&utm_medium=rss-feed&utm_source=producthunt-atom-posts-feed">Discussion</a> | <a href="https://www.producthunt.com/r/p/1112791?app_id=339">Link</a> </p>
Hugging Face Releases TRL v1.0: A Unified Post-Training Stack for SFT, Reward Modeling, DPO, and GRPO Workflows
Hugging Face has officially released TRL (Transformer Reinforcement Learning) v1.0, marking a pivotal transition for the library from a research-oriented repository to a stable, production-ready framework. For AI professionals and developers, this release codifies the Post-Training pipeline—the essential sequence of Supervised Fine-Tuning (SFT), Reward Modeling, and Alignment—into a unified, standardized API. In the early stages […] The post Hugging Face Releases TRL v1.0: A Unified Post-Training Stack for SFT, Reward Modeling, DPO, and GRPO Workflows appeared first on MarkTechPost .
Handling Extreme Class Imbalance in Fraud Detection
<p><em>Originally published at <a href="https://riskernel.com/blog/extreme-class-imbalance-fraud-detection.html" rel="noopener noreferrer">Riskernel</a>.</em></p> <p>Fraud is one of the easiest machine learning problems to misunderstand because the target is so rare.</p> <p>In many portfolios, fraud is well below one percent of total events. That means a model can look excellent in offline evaluation while still creating a terrible operational outcome once it meets production traffic.</p> <p>If you are evaluating a fraud vendor or building your own stack, the first thing to understand is that this is not a standard classification problem. It is a rare-event decisioning problem with operational consequences.</p> <h2> Why the base rate changes everything </h2> <p>When fraud is extremely rare
Knowledge Map
Connected Articles — Knowledge Graph
This article is connected to other articles through shared AI topics and tags.
More in Products
Baton
<p> Orchestrate your AI coding agents </p> <p> <a href="https://www.producthunt.com/products/baton-2?utm_campaign=producthunt-atom-posts-feed&utm_medium=rss-feed&utm_source=producthunt-atom-posts-feed">Discussion</a> | <a href="https://www.producthunt.com/r/p/1112791?app_id=339">Link</a> </p>
Interactive Data Chart Generator (Pure JavaScript Canvas Tool)
Charts had become a normal part of our lives, visual elements of our work. Why not create a chart-building webpage where you enter the data and it creates the webpage? And with the help of AI it could be even easier. Read All
I Collected 170 AI Prompts From Reddit, GitHub & Twitter — Here's What I Learned About What Actually Works
<p>I spent a week doing something most people never bother with: going through Reddit's most upvoted AI posts, GitHub's most starred prompt collections (155K+ stars), and Twitter's most viral AI threads — and extracting the prompts that people actually use and share.</p> <p>Here's what surprised me.</p> <h2> The #1 Finding: Short Beats Long </h2> <p>The most upvoted AI prompt in Reddit history is just 3 lines:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight plaintext"><code>Before responding, ask me any clarifying questions until you are 95% confident you can complete this task successfully. Use only verifiable, credible sources. Do not speculate. </code></pre> </div> <p>That's it. 400+ upvotes. Not a 500-word mega-prompt. Three sentences.</p> <p>The pattern held a
Antropic's Claude Code leaked and Axios NPM Inflitration
<p><a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1ka41vwv76ehjjesu4d.png" class="article-body-image-wrapper"><img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1ka41vwv76ehjjesu4d.png" alt=" " width="784" height="478"></a></p> <h2> THE CODE LEAK THAT SHOCKED THE TECH WORLD </h2> <p>This week, Anthropic accidentally opened the floodgates to a wealth of secret information by leaking the full source code of Claude Code via an npm source map. With internal architecture, unreleased features, and multi-agent workflows thrust into the
Discussion
Sign in to join the discussion
No comments yet — be the first to share your thoughts!