Open format · Schema-validated · v1.2
your-repo/intent.md
Evidence-backed intent, ready for any coding agent.
Not just another prompt. IntentSpec is the open format for the work upstream of code: the outcomes, edge cases, and evidence that define done. Write it by hand, or let Pathmode build it from your product evidence.
---id: "INT-EXPORT-JSON-001"status: "approved"objective: "Allow users to export filtered data to JSON"evidence:- type: "quote"source: "support-ticket-4421"excerpt: "I can't tell what's in my export before I download it."anchors: ["outcome:0", "edgeCase:0"]- type: "friction"source: "session-replay-a3f9"excerpt: "User re-exported full dataset 3 times trying to find filtered subset."anchors: ["objective"]outcomes:- "User clicks Export → JSON file downloads to device"- "Export contains only the currently filtered dataset"- "No PII fields are included in the output"constraints:- "Must run client-side only (no server round-trip)"- "File size must not exceed 10MB"scope:inScope:- "The export button and its filtered-data serializer"outOfScope:- "The filter UI"- "Saved-view persistence"edgeCases:- scenario: "Empty dataset"expectedBehavior: "Show toast: 'Nothing to export' — no file created"- scenario: "10k+ rows"expectedBehavior: "Stream to file, show progress indicator"healthMetrics:- "Page load time must not increase"- "Existing CSV export must continue to work"verification:- "Unit test: serializer emits only filtered rows, no PII keys"- "Manual: export with 0 rows shows the toast, writes no file"- "Prod signal: export error rate < 0.5% after launch"---
readable by claude-code · cursor · windsurf · copilot · aider · any-llm
Validate a spec. Right here.
Edit the file on the left. The output runs against the same JSON Schema your CI enforces.
Uses ajv against /intentspec.schema.json, the same schema the GitHub Action enforces.
A spec that can't say why is just an opinion.
The problem: specs without evidence
A spec that doesn't trace back to evidence is just opinion. When the agent asks "why this outcome?", the answer is "because someone said so." That's how scope creeps, agents drift, and PRs get rejected after the work is done.
The solution: judgment, carried
Intent is judgment under evidence, not a contract you compile from a prompt. That's Intent Engineering. IntentSpec is the form that judgment takes: outcomes anchored to quotes, friction, and observations, validated in CI like any spec. The evidence-anchored why and the machine-checkable spec are one artifact, not two. Agents execute against it; humans review against the evidence that produced it.
Make every outcome trace back.
Evidence flows in. A spec flows out. The anchors field ties each outcome, edge case, and constraint to the signal that justified it.
objectiveoutcome:0outcome:1edgeCase:0constraint:1outcome:2edgeCase:1verificationhealthMetricsscope.outOfScopestatus: approvedIntent Engineering
The practice of maintaining explicit, evidence-backed product intent upstream of code, so agents have concrete criteria for done instead of vague requirements that get interpreted differently every sprint. IntentSpec is the portable format that carries that intent from discovery to deployment.
How it works.
Three steps to go from vibe coding to spec-driven development.
Write an intent.md
Define the objective, expected outcomes, constraints, and edge cases in a Markdown file with YAML frontmatter. Commit it alongside your code.
your-repo/ ├── src/ ├── intent.md ← your spec └── package.json
Drop it into any agent
One rule line in your agent's config file points at intent.md. The agent now has concrete success criteria, not a vague prompt.
Works with Claude Code, Cursor, Windsurf, GitHub Copilot, Aider, and any LLM. See the config snippets below.
Validate in CI
Add the GitHub Action to enforce schema compliance on every PR. Prevent drift before it reaches main.
- uses: JanneL/validate- intentspec-action@v1 with: file: intent.md
Enforced in CI.
The GitHub Action checks every pull request against the schema. A malformed or evidence-free spec never reaches main.
$ git push origin feature/export-jsonrun JanneL/validate-intentspec-action@v1with: file: intent.md✓ frontmatter parsed✓ conforms to intentspec.schema.json · v1.2✓ evidence anchors resolve (outcome:0, edgeCase:0)check passed · intent.md is a valid IntentSpec
validate-intentspec-action on the GitHub Marketplace.
Drop it into any agent.
Hand-author intent.md, or build it from your evidence in Pathmode. Either way, one rule line in your agent's config points at it.
CLAUDE.mdmarkdownAlways read intent.md beforeimplementing any feature.
Not a ticket. Not a rule file.
Tickets, agent rule files, and design docs all describe work, but none of them carry evidence in a form an AI agent can read.
| Linear / Jira ticket | AGENTS.md / .cursorrules | RFC / design doc | IntentSpec | |
|---|---|---|---|---|
| Format | Free-form fields | Free-form Markdown | Prose | Markdown + YAML + JSON Schema |
| Machine-validated | No | No | No | Yes |
| Enforceable in CI | No | No | No | Yes |
| Defines "Done" | Sometimes | No | Sometimes | Always |
| Carries evidence | No | No | Sometimes | Yes |
| Designed for AI agents | No | Yes | No | Yes |
| Scope | Per-task | Per-repo | Per-system | Per-feature |
IntentSpec is complementary, not a replacement. Link from your ticket, reference from your AGENTS.md, derive from your RFC.
Frequently asked questions.
What is IntentSpec?
How is IntentSpec different from AGENTS.md or CLAUDE.md?
Which AI coding agents work with IntentSpec?
Do I need Pathmode to use IntentSpec?
Can IntentSpec be validated automatically?
How does IntentSpec prevent AI agent drift?
How is IntentSpec different from spec-driven development tools and GitHub spec-kit?
Specs in the wild.
Real intent.md files: built from evidence or hand-authored, validated in CI, consumed by AI agents.
T3 Stack Showcase
Full-stack Todo · TRPC + Zod + Tailwind
---id: "showcase-todo-feature"status: "approved"objective: "Full-stack Todo withTRPC + Zod + Tailwind"evidence:- type: "friction"source: "user-feedback-q3"excerpt: "Todos disappear onrefresh — users expectpersistence."anchors: ["outcome:3"]outcomes:- "User can create a Todo item"- "User can toggle completion"- "User can delete a Todo item"- "All changes persist via TRPC"constraints:- "Must use TRPC for all API calls"- "Must use Zod for validation"---
GitHub OAuth
Hand-authored alongside existing email auth
---id: "INT-AUTH-OAUTH-003"status: "approved"objective: "Add GitHub OAuth asa sign-in option"evidence:- type: "quote"source: "beta-feedback-nov"excerpt: "I'd use this but Idon't want another password."anchors: ["objective","outcome:0"]outcomes:- "User can sign in with GitHubin one click"- "Existing users can linktheir account"edgeCases:- scenario: "GitHub email matchesexisting account"expectedBehavior: "Prompt tolink — never auto-merge"---