The Hallucination Problem in AI Coding Assistants: How to Achieve Specification-driven Development with OpenSpec
The Hallucination Problem in AI Coding Assistants: How to Achieve Specification-driven Development with OpenSpec
Section titled “The Hallucination Problem in AI Coding Assistants: How to Achieve Specification-driven Development with OpenSpec”AI coding assistants are powerful, but they often generate code that does not match real requirements or violates project conventions. This article shares how the HagiCode project uses the OpenSpec workflow to implement specification-driven development and significantly reduce the risk of AI hallucinations through a structured proposal mechanism.
Background
Section titled “Background”Anyone who has used GitHub Copilot or ChatGPT to write code has probably had this experience: the code generated by AI looks polished, but once you actually use it, problems show up everywhere. Maybe it uses the wrong component from the project, maybe it ignores the team’s coding standards, or maybe it writes a large chunk of logic based on assumptions that do not even exist.
This is the so-called “AI hallucination” problem. In programming, it appears as code that seems reasonable on the surface but does not actually fit the real state of the project.
There is also something a bit frustrating about this. As AI coding assistants become more widespread, the problem becomes more serious. After all, AI lacks an understanding of project history, architectural decisions, and coding conventions, and when given too much freedom it can “creatively” generate code that does not match reality. It is a bit like writing an article: without structure, it is easy to wander off into imagination, even though the real situation is far more grounded.
To solve these pain points, we made a bold decision: instead of trying to make AI smarter, we put it inside a “specification” cage. The change this decision brought was probably bigger than you might expect, and I will explain that shortly.
About HagiCode
Section titled “About HagiCode”The approach shared in this article comes from our practical experience in the HagiCode project. HagiCode is an open-source AI coding assistant project dedicated to solving real problems in AI programming through structured engineering practices.
The Root Causes of AI Hallucinations
Section titled “The Root Causes of AI Hallucinations”Before diving into the solution, let us first look at where the problem actually comes from. After all, if you understand both yourself and your opponent, you can fight a hundred battles without defeat. Applied to AI, that saying is still surprisingly fitting.
Missing context
Section titled “Missing context”AI models are trained on public code repositories, but your project has its own history, conventions, and architectural decisions. AI cannot directly access this kind of “implicit knowledge,” so the code it generates is often disconnected from the actual project.
This is not entirely the AI’s fault. It has never lived inside your project, so how could it know all of your unwritten rules? Like a brand-new intern, not understanding the local customs is normal. The only issue is that the cost can be rather high.
Too much freedom
Section titled “Too much freedom”When you ask AI, “Help me implement a user authentication feature,” it may generate code in almost any form. Without clear constraints, AI will implement things in the way it “thinks” is reasonable instead of following your project’s requirements.
That is like asking someone who has never learned your project standards to improvise freely. How could that not cause trouble? It is not even that the AI is being irresponsible; it just has no idea what responsibility means in this context.
Lack of validation
Section titled “Lack of validation”After AI generates code, if there is no structured review process, code based on false assumptions can go directly into the repository. By the time the problem is discovered in testing or even in production, the cost is already far too high.
That is like trying to mend the pen after the sheep are already gone. The principle is obvious, but in practice people often still find the extra work bothersome. Before things go wrong, who really wants to spend more time up front?
OpenSpec: The Answer to Specification-driven Development
Section titled “OpenSpec: The Answer to Specification-driven Development”HagiCode chose OpenSpec as the solution. The core idea is simple: all code changes must go through a structured proposal workflow, turning abstract ideas into executable implementation plans.
That may sound grand, but in plain terms it just means making AI write the requirements document before writing the code. As the old saying goes, preparation leads to success, and lack of preparation leads to failure.
What is OpenSpec
Section titled “What is OpenSpec”OpenSpec is an npm-based command-line tool (@fission-ai/openspec) that defines a standard proposal file structure and validation mechanism. Put simply, it makes AI “write the requirements document” before it writes code.
A three-step workflow to prevent hallucinations
Section titled “A three-step workflow to prevent hallucinations”OpenSpec ensures proposal quality through a three-step workflow:
Step 1: Initialize the proposal - Set the session state to Openspecing Step 2: Intermediate processing - Keep the Openspecing state while gradually refining the artifacts Step 3: Complete the proposal - Transition to the Reviewing state
There is a clever detail in this design: the first step uses the ProposalGenerationStart type, and completing it does not trigger a state transition. This ensures that the review stage is not entered too early before the entire multi-step workflow is finished.
This detail is actually quite interesting. It is like cooking: if you lift the lid before the heat is right, nothing will turn out well. Only by moving step by step with a bit of patience can you end up with a good dish.
// Implementation in the HagiCode projectpublic enum MessageAssociationType{ ProposalGeneration = 2, ProposalExecution = 3,
/// <summary> /// Marks the start of the three-step proposal generation workflow /// Does not transition to the Reviewing state when completed /// </summary> ProposalGenerationStart = 5}Standardized file structure
Section titled “Standardized file structure”Every OpenSpec proposal follows the same directory structure:
openspec/├── changes/ # Active and archived changes│ ├── {change-name}/│ │ ├── proposal.md # Proposal description│ │ ├── design.md # Design document│ │ ├── specs/ # Technical specifications│ │ └── tasks.md # Executable task list│ └── archive/ # Archived changes└── specs/ # Standalone specification libraryAccording to statistics from the HagiCode project, there are already more than 4,000 archived changes and over 150,000 lines of specification files. This historical accumulation not only gives AI clear guidance to follow, but also provides the team with a valuable knowledge base.
It is a bit like the classics left behind by earlier generations. Read enough of them and patterns begin to emerge. The only difference is that these classics are stored in files instead of written on bamboo slips.
Multi-layer validation mechanism
Section titled “Multi-layer validation mechanism”The system implements multiple layers of validation to ensure proposal quality:
// Validate that required files existValidateProposalFiles()
// Validate prerequisites before executionValidateExecuteAsync()
// Validate start conditionsValidateStartAsync()
// Validate archive conditionsValidateArchiveAsync()
// Validate proposal name format (kebab-case)ValidateNameFormat()These validations are like gatekeepers at multiple checkpoints. Only truly qualified proposals can pass through. It may look tedious, but it is still much better than letting poor code enter the repository.
Prompt template constraints
Section titled “Prompt template constraints”When AI runs inside HagiCode, it uses predefined Handlebars templates. These templates contain explicit step-by-step instructions and protective guardrails. For example:
- Do not continue before understanding the user’s intent
- Do not generate unvalidated code
- Require the user to provide the name again if it is invalid
- If the change already exists, suggest using the continue command instead of recreating it
This way of “dancing in shackles” actually helps AI focus more on understanding requirements and generating code that follows standards. Constraints are not always a bad thing. Sometimes too much freedom is exactly what creates chaos.
Practice: How to Use OpenSpec in a Project
Section titled “Practice: How to Use OpenSpec in a Project”Installation and initialization
Section titled “Installation and initialization”npm install -g @fission-ai/openspec@1openspec --version # Verify the installationThe openspec/ folder structure will be created automatically in the project root.
There is not much mystery in this step. It is just tool installation, which everyone understands. Just remember to use @fission-ai/openspec@1; newer versions may have pitfalls, and stability matters most.
Create a proposal
Section titled “Create a proposal”In the HagiCode conversation interface, use the shortcut command:
/opsx:newOr specify a change name and target repository:
/opsx:new "add-user-auth" --repos "repos/web"Creating a proposal is like outlining an article before writing it. Once you have an outline, the rest becomes much easier. Many people prefer to jump straight into writing, only to realize halfway through that the idea does not hold together. That is when the real headache begins.
Generate artifacts
Section titled “Generate artifacts”Use /opsx:continue to generate the required artifacts step by step:
proposal.md - Describes the purpose and scope of the change
# Proposal: Add User Authentication
## WhyThe current system lacks user authentication and cannot protect sensitive APIs.
## What Changes- Add JWT authentication middleware- Implement login/registration APIs- Update frontend integrationdesign.md - Detailed technical design
# Design: Add User Authentication
## ContextThe system currently uses public APIs, so anyone can access them...
## Decisions1. Choose JWT instead of Session...2. Use the HS256 algorithm...
## Risks- Risk of token leakage...- Mitigation measures...specs/ - Technical specifications and test scenarios
# user-auth Specification
## Requirements
### Requirement: JWT Token GenerationThe system SHALL use the HS256 algorithm to generate JWT tokens.
#### Scenario: Valid login- WHEN the user provides valid credentials- THEN the system SHALL return a valid JWT tokentasks.md - Executable task list
# Tasks: Add User Authentication
## 1. Backend Changes- [ ] 1.1 Create AuthController- [ ] 1.2 Implement JWT middleware- [ ] 1.3 Add unit testsThese artifacts are a lot like drafts for an article. Once the draft is complete, the main text flows naturally. Many people dislike writing drafts because they think it wastes time, but in reality that is often where the clearest thinking happens.
Review and apply
Section titled “Review and apply”After all artifacts are complete:
/opsx:applyAI will read all context files and execute tasks step by step according to the checklist in tasks.md. At this point, because the specification is already clear, the quality of the generated code is much higher.
By this stage, half the work is already done. Once there is a clear task list, the rest is simply executing it step by step. The problem is that many people skip the earlier steps and jump straight here, and then quality naturally becomes hard to guarantee.
Archive
Section titled “Archive”After the change is completed:
/opsx:archiveMove the completed change into the archive/ directory so it can be reviewed and reused later.
Archiving matters. It is like carefully storing away a finished article. When a similar problem appears in the future, looking back through old records may provide the answer. Many people find it troublesome, but these accumulated materials are often the most valuable assets.
Notes and Best Practices
Section titled “Notes and Best Practices”Proposal naming rules
Section titled “Proposal naming rules”Use kebab-case, start with a letter, and include only lowercase letters, numbers, and hyphens:
- ✅
add-user-auth - ❌
AddUserAuth - ❌
add--user-auth
Naming rules may seem minor, but consistency is always worth something. In software, consistency matters even when people do not always pay attention to it.
Avoid common mistakes
Section titled “Avoid common mistakes”- Using the wrong type in step 1 of the three-step workflow - This causes the state to transition too early
- Forgetting to trigger the state transition in the final step - This leaves the workflow stuck in the Openspecing state
- Skipping review and executing directly - You should validate that all artifacts are complete first
These mistakes are all common for beginners. Experienced people naturally know how to avoid them. Still, everyone becomes experienced eventually, and taking a few detours is part of the process. The only hope is to avoid taking too many.
Multi-change management
Section titled “Multi-change management”OpenSpec supports managing multiple proposals at the same time, which is especially useful for large features:
# View all active changesopenspec list
# Switch to a specific changeopenspec apply "add-user-auth"
# View change statusopenspec status --change "add-user-auth"Managing multiple changes is like writing several articles at once. It takes some technique and patience, but once you get used to it, it becomes natural enough.
Understanding the session state machine
Section titled “Understanding the session state machine”Understanding state transitions helps with troubleshooting:
Init → Drafting → Openspecing → Reviewing → Executing → ExecutionCompleted → Completed → Archived- Openspecing: Generating the plan
- Reviewing: Under review (artifacts can be revised repeatedly)
- Executing: In execution (applying
tasks.md)
A state machine is, in the end, just a set of rules. Rules can feel annoying at times, but more often they are useful. As the saying goes, without rules, nothing can be accomplished properly.
Conclusion
Section titled “Conclusion”Through the OpenSpec workflow, the HagiCode project has achieved significant results in addressing the AI hallucination problem:
- Fewer hallucinations - AI must follow a structured specification instead of generating code arbitrarily
- Higher quality - Multi-layer validation ensures changes comply with project standards
- Faster collaboration - Archived changes provide references for future development
- Traceability - Every change has a complete record of proposal, design, specification, and tasks
This approach does not make AI smarter. It puts AI inside a “specification” cage. Practice has shown that dancing in shackles can actually lead to a better performance.
The principle is simple. Constraints are not necessarily bad. Like writing, having a format to follow often makes it easier to produce good work. Many people dislike constraints because they think constraints limit creativity, but creativity also needs the right soil to grow.
If you are also using AI coding assistants and have run into similar problems, give OpenSpec a try. Specification-driven development may seem to add extra steps, but that early investment pays back many times over in code quality and maintenance efficiency.
Sometimes slowing down a little is actually the fastest way forward. Many people just do not realize it yet.
References
Section titled “References”- OpenSpec npm package: www.npmjs.com/package/@fission-ai/openspec
- HagiCode project repository: github.com/HagiCode-org/site
- HagiCode official website: hagicode.com
- Watch the 30-minute hands-on demo: www.bilibili.com/video/BV1pirZBuEzq/
- One-click installation with Docker Compose: docs.hagicode.com/installation/docker-compose
- Quick installation for Desktop: hagicode.com/desktop/
If this article helped you, feel free to give us a Star on GitHub. The HagiCode public beta has already started, and you can join the experience by installing it now.
That is about enough for this article. There is nothing especially profound here, just a summary of a few practical lessons. I hope it is useful to everyone. Sharing is a good thing: you learn something yourself, and others learn something too.
Still, an article is only an article. Practice is what really matters. Knowledge from the page always feels shallow until you apply it yourself.
Copyright Notice
Section titled “Copyright Notice”Thank you for reading. If you found this article useful, feel free to like, bookmark, and share it. This content was created with AI-assisted collaboration, and the final content was reviewed and approved by the author.
- Author: newbe36524
- Original link: https://docs.hagicode.com/blog/2026-04-02-ai-coding-assistant-hallucination-openspec-spec-driven-development/
- Copyright: Unless otherwise stated, all articles on this blog are licensed under BY-NC-SA. Please include the source when reposting.