<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://praxis-docs-site.netlify.app/blog</id>
    <title>PRAXIS Blog</title>
    <updated>2026-07-05T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://praxis-docs-site.netlify.app/blog"/>
    <subtitle>PRAXIS Blog</subtitle>
    <icon>https://praxis-docs-site.netlify.app/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[The ACCP Protocol — Compiling Agent Work Into Verifiable Artifacts]]></title>
        <id>https://praxis-docs-site.netlify.app/blog/accp-protocol</id>
        <link href="https://praxis-docs-site.netlify.app/blog/accp-protocol"/>
        <updated>2026-07-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[How the Autonomous Coding Compiler Protocol generates Final Verification Reports and Phase Review Reports without blocking execution.]]></summary>
        <content type="html"><![CDATA[<p>The Autonomous Coding Compiler Protocol (ACCP) is PRAXIS's answer to a hard question: <strong>how do you turn agent execution into permanent, verifiable artifacts without slowing down the work?</strong></p>
<p>The answer is: <strong>run it async, never block the critical path, and keep it separate from the Truth Engine.</strong></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-accp-exists">Why ACCP Exists<a href="https://praxis-docs-site.netlify.app/blog/accp-protocol#why-accp-exists" class="hash-link" aria-label="Direct link to Why ACCP Exists" title="Direct link to Why ACCP Exists" translate="no">​</a></h2>
<p>When an agent finishes a task, you need more than just a PASS/FAIL verdict. You need:</p>
<ul>
<li class="">A <strong>Final Verification Report (FVR)</strong> that documents every attempt, every gate result, and every piece of evidence</li>
<li class="">A <strong>Phase Review Report (PRR)</strong> that summarizes an entire wave of work — multiple tasks, multiple workers</li>
</ul>
<p>These artifacts are essential for audit, compliance, and human review. But they shouldn't slow down execution. If artifact generation fails, the task should still be complete. The work should never wait for the paperwork.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-architecture">The Architecture<a href="https://praxis-docs-site.netlify.app/blog/accp-protocol#the-architecture" class="hash-link" aria-label="Direct link to The Architecture" title="Direct link to The Architecture" translate="no">​</a></h2>
<p>ACCP follows a strict <strong>async, non-blocking</strong> pipeline:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">Execution Critical Path</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">┌──────────────────────────────────┐</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│ ADMIT → EXECUTE → CAPTURE →     │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│ VERIFY → ASSEMBLE → COMPLETE    │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">└──────────────────┬───────────────┘</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                   │ TaskRun/Wave COMPLETE</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                   │ Enqueue artifact job (non-blocking)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                   ▼</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">┌──────────────────────────────────┐</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│       ACCP Async Job Queue       │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│                                  │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│  ┌──────────┐  ┌──────────┐     │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│  │ FVR Job  │  │ PRR Job  │     │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│  │ per Task │  │ per Wave │     │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│  └────┬─────┘  └────┬─────┘     │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│       │              │           │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│       ▼              ▼           │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│  ┌──────────────────────────┐   │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│  │    ACCP Compiler         │   │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│  │  (kernel/accp)           │   │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│  └──────────┬───────────────┘   │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│             │                    │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│             ▼                    │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│  ┌──────────────────────────┐   │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│  │    Artifact Storage      │   │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│  │  (DB → Mission Control)  │   │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│  └──────────────────────────┘   │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">└──────────────────────────────────┘</span><br></div></code></pre></div></div>
<p>The key principle: <strong>the arrow from execution to artifact generation is one-directional.</strong> Execution never waits for ACCP. ACCP failure never rolls back execution verdicts.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fvr--final-verification-report">FVR — Final Verification Report<a href="https://praxis-docs-site.netlify.app/blog/accp-protocol#fvr--final-verification-report" class="hash-link" aria-label="Direct link to FVR — Final Verification Report" title="Direct link to FVR — Final Verification Report" translate="no">​</a></h2>
<p>Every TaskRun that reaches COMPLETE gets an FVR. It contains:</p>
<table><thead><tr><th>Section</th><th>Content</th></tr></thead><tbody><tr><td>Task metadata</td><td>task_id, plan_id, wave, namespace, task_type</td></tr><tr><td>Attempt history</td><td>All attempts with gate verdicts, timestamps, strategy used</td></tr><tr><td>Acceptance criteria</td><td>All criteria with PASS/FAIL per criterion</td></tr><tr><td>Evidence summary</td><td>Evidence record count, chain status, divergence flags</td></tr><tr><td>Final verdict</td><td>COMPLETE (FinalGate PASS), with timestamp</td></tr><tr><td>Repair history</td><td>Any HOLD/FAIL attempts, what was repaired, how</td></tr></tbody></table>
<p>The FVR is enqueued the moment a TaskRun transitions to COMPLETE. The execution pipeline doesn't wait for it — the artifact is compiled asynchronously and surfaced in Desktop Mission Control when ready.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prr--phase-review-report">PRR — Phase Review Report<a href="https://praxis-docs-site.netlify.app/blog/accp-protocol#prr--phase-review-report" class="hash-link" aria-label="Direct link to PRR — Phase Review Report" title="Direct link to PRR — Phase Review Report" translate="no">​</a></h2>
<p>Every wave that reaches terminal state gets a PRR. It contains:</p>
<table><thead><tr><th>Section</th><th>Content</th></tr></thead><tbody><tr><td>Wave metadata</td><td>wave_id, plan_id, task count, worker count</td></tr><tr><td>Task summaries</td><td>Per-task final status, attempt count, strategy history</td></tr><tr><td>Assembly result</td><td>Assembly success or ConflictReport summary</td></tr><tr><td>Timeline</td><td>Start-to-finish timeline with key events</td></tr><tr><td>Metrics</td><td>Duration, total attempts, repair count, failure rate</td></tr></tbody></table>
<p>The PRR gives a bird's-eye view of a phase of work — what was attempted, what succeeded, what had to be repaired, and how long it all took.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-accp-compiler">The ACCP Compiler<a href="https://praxis-docs-site.netlify.app/blog/accp-protocol#the-accp-compiler" class="hash-link" aria-label="Direct link to The ACCP Compiler" title="Direct link to The ACCP Compiler" translate="no">​</a></h2>
<p>The ACCP compiler (<code>kernel/accp</code>) is a port from the original <code>pi/packages/accp-compiler</code>. It has three responsibilities:</p>
<ol>
<li class=""><strong>Compile</strong> evidence and verdict data into structured reports</li>
<li class=""><strong>Validate</strong> evidence completeness — are all required evidence types present?</li>
<li class=""><strong>Document</strong> — never evaluate truth</li>
</ol>
<p>This last point is critical: <strong>the ACCP compiler is not the Truth Engine.</strong> The Truth Engine produces completion verdicts. The ACCP compiler produces documentation. They are separate systems with separate responsibilities, and they stay that way.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-design-decisions">Key Design Decisions<a href="https://praxis-docs-site.netlify.app/blog/accp-protocol#key-design-decisions" class="hash-link" aria-label="Direct link to Key Design Decisions" title="Direct link to Key Design Decisions" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="jsonl-for-evidence-not-yaml">JSONL for Evidence, Not YAML<a href="https://praxis-docs-site.netlify.app/blog/accp-protocol#jsonl-for-evidence-not-yaml" class="hash-link" aria-label="Direct link to JSONL for Evidence, Not YAML" title="Direct link to JSONL for Evidence, Not YAML" translate="no">​</a></h3>
<p>Evidence capture is fundamentally append-only streaming. YAML's complexity (anchors, multi-line, indentation) adds no value for records that are never hand-edited. JSONL gives us:</p>
<ul>
<li class="">Deterministic append</li>
<li class="">Trivial line-based tailing</li>
<li class="">Standard JSON parsing for each record</li>
<li class="">Native streaming support in Node.js</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="async-and-non-blocking">Async and Non-Blocking<a href="https://praxis-docs-site.netlify.app/blog/accp-protocol#async-and-non-blocking" class="hash-link" aria-label="Direct link to Async and Non-Blocking" title="Direct link to Async and Non-Blocking" translate="no">​</a></h3>
<p>The must/must-not rules are strict:</p>
<ul>
<li class="">ACCP artifact generation <strong>MUST</strong> be async and non-blocking</li>
<li class="">Execution <strong>MUST NOT</strong> wait for ACCP artifact completion</li>
<li class="">Artifact failure <strong>MUST NOT</strong> fail the TaskRun</li>
<li class="">Artifacts <strong>MUST</strong> be surfaced in Desktop Mission Control</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="compiler-is-not-the-truth-engine">Compiler Is Not the Truth Engine<a href="https://praxis-docs-site.netlify.app/blog/accp-protocol#compiler-is-not-the-truth-engine" class="hash-link" aria-label="Direct link to Compiler Is Not the Truth Engine" title="Direct link to Compiler Is Not the Truth Engine" translate="no">​</a></h3>
<p>This separation prevents a dangerous coupling. The Truth Engine evaluates completion. The ACCP compiler documents it. They have different failure modes, different performance characteristics, and different trust models.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="current-status">Current Status<a href="https://praxis-docs-site.netlify.app/blog/accp-protocol#current-status" class="hash-link" aria-label="Direct link to Current Status" title="Direct link to Current Status" translate="no">​</a></h2>
<p>ACCP is fully designed as part of the remaining MVP architecture pack (P3–P6). The compiler is specified to be ported from <code>pi/packages/accp-compiler</code> in P0.3. FVR and PRR are the only report types in the MVP — we are deliberately not expanding the report catalog until evidence from real usage shows a need.</p>
<p>The protocol exists to answer one question that stays relevant long after execution finishes: <strong>what actually happened?</strong></p>]]></content>
        <author>
            <name>PRAXIS Team</name>
            <uri>https://github.com/ddawnlll</uri>
        </author>
        <category label="ACCP" term="ACCP"/>
        <category label="Architecture" term="Architecture"/>
        <category label="Protocol" term="Protocol"/>
        <category label="Verification" term="Verification"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[How We Built PRAXIS — From Desktop Orchestrator to Truth Kernel]]></title>
        <id>https://praxis-docs-site.netlify.app/blog/how-we-built-praxis</id>
        <link href="https://praxis-docs-site.netlify.app/blog/how-we-built-praxis"/>
        <updated>2026-07-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The story of PRAXIS — how a desktop-first multi-agent orchestrator became a local Truth Kernel for agentic coding tools.]]></summary>
        <content type="html"><![CDATA[<p>PRAXIS didn't start as a Truth Kernel. It started as something much bigger — and much more wrong.</p>
<p>This is the story of how we discovered that our real problem wasn't "how do we run agents?" but <strong>"how do we know they actually finished?"</strong></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="act-1-the-desktop-first-dream">Act 1: The Desktop-First Dream<a href="https://praxis-docs-site.netlify.app/blog/how-we-built-praxis#act-1-the-desktop-first-dream" class="hash-link" aria-label="Direct link to Act 1: The Desktop-First Dream" title="Direct link to Act 1: The Desktop-First Dream" translate="no">​</a></h2>
<p>The original PRAXIS was designed as a <strong>desktop-first multi-agent coding orchestrator</strong>. The vision was ambitious:</p>
<ul>
<li class="">An Electron-based Desktop Mission Control</li>
<li class="">A local HTTP+SSE server backend</li>
<li class="">A PostgreSQL event log for persistent state</li>
<li class="">Multi-worker scheduling with Governor tiers up to <code>stable_16</code></li>
<li class="">A Deterministic Assembler for merging parallel worker outputs</li>
<li class="">A full runtime event-sourcing model</li>
</ul>
<p>We had it all planned out. MVP-A was a desktop mockup. MVP-B would wire up a single real Claude Code worker. MVP-C would scale to three parallel workers. The architecture was documented, the design decisions were locked, and the packages were scaffolded.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="act-2-the-landscape-shift">Act 2: The Landscape Shift<a href="https://praxis-docs-site.netlify.app/blog/how-we-built-praxis#act-2-the-landscape-shift" class="hash-link" aria-label="Direct link to Act 2: The Landscape Shift" title="Direct link to Act 2: The Landscape Shift" translate="no">​</a></h2>
<p>While we were designing, the world changed.</p>
<p><strong>Claude Code, MiMo Code, and OpenCode</strong> matured rapidly. These tools already covered the agent harness / terminal coding workflow layer exceptionally well. They were well-funded, actively developed, and solving real problems for developers.</p>
<p>We asked ourselves a hard question: <strong>"If someone already has Claude Code, why would they use PRAXIS?"</strong></p>
<p>The answer was uncomfortable. Competing by building another terminal-native coding agent was a losing strategy. The market already had multiple mature options. Our original "unique value" wasn't in running agents — it was in something else entirely.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="act-3-the-question-that-changed-everything">Act 3: The Question That Changed Everything<a href="https://praxis-docs-site.netlify.app/blog/how-we-built-praxis#act-3-the-question-that-changed-everything" class="hash-link" aria-label="Direct link to Act 3: The Question That Changed Everything" title="Direct link to Act 3: The Question That Changed Everything" translate="no">​</a></h2>
<p>We kept coming back to one question:</p>
<blockquote>
<p><strong>"Bitti mi gerçekten?"</strong> (Turkish for "Did it actually finish?")</p>
</blockquote>
<p>Every developer who works with AI coding agents knows this feeling. The agent says "done" but you're not sure. You check the diff. You run the tests yourself. You scroll through the conversation history looking for proof.</p>
<p>The agent <strong>reports</strong> completion, but does that mean it actually <strong>completed</strong> the task?</p>
<p>This was the real problem. And no existing tool was solving it.</p>
<ul>
<li class=""><strong>False done</strong> — Agent says "done" but the diff is empty</li>
<li class=""><strong>Echo chamber</strong> — Agent writes the acceptance criteria AND passes them</li>
<li class=""><strong>Missing evidence</strong> — Agent claims tests passed but never ran them</li>
<li class=""><strong>Self-reported truth</strong> — The agent's own status messages treated as completion</li>
<li class=""><strong>Scattered verification</strong> — Evidence spread across messages, files, and terminal output</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="act-4-the-pivot">Act 4: The Pivot<a href="https://praxis-docs-site.netlify.app/blog/how-we-built-praxis#act-4-the-pivot" class="hash-link" aria-label="Direct link to Act 4: The Pivot" title="Direct link to Act 4: The Pivot" translate="no">​</a></h2>
<p>On June 18, 2026, we made the call. ADR-013 documented the <strong>Plugin-First Pivot</strong>:</p>
<blockquote>
<p><strong>PRAXIS is not a coding agent. PRAXIS is a local Truth Kernel for agentic coding tools.</strong></p>
</blockquote>
<p>Everything changed. The desktop app became future scope. The PostgreSQL event log became future scope. The multi-worker orchestration became future scope.</p>
<p>What stayed?</p>
<ul>
<li class=""><strong>The Three Laws</strong> — Completion Authority, Write Authority, Verification Authority</li>
<li class=""><strong>The Truth Engine</strong> — EvidenceGate, ExecGate, FinalGate</li>
<li class=""><strong>Human-authored acceptance criteria</strong> — Agents don't define their own completion</li>
<li class=""><strong>Evidence-based verification</strong> — Claims must have proof</li>
</ul>
<p>And what became v0.1 was much simpler:</p>
<ol>
<li class=""><strong><code>praxis</code> CLI</strong> — Six commands: <code>init</code>, <code>spec</code>, <code>verify</code>, <code>repair</code>, <code>status</code>, <code>report</code></li>
<li class=""><strong>Local Truth Kernel</strong> — Three gates, evidence collection, repair packets</li>
<li class=""><strong>Claude Code plugin</strong> — Six slash commands that call the CLI</li>
<li class=""><strong><code>.praxis/</code> workspace</strong> — <code>task.yaml</code>, <code>evidence/*.jsonl</code>, <code>reports/*.md</code></li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="act-5-where-we-are-now">Act 5: Where We Are Now<a href="https://praxis-docs-site.netlify.app/blog/how-we-built-praxis#act-5-where-we-are-now" class="hash-link" aria-label="Direct link to Act 5: Where We Are Now" title="Direct link to Act 5: Where We Are Now" translate="no">​</a></h2>
<p>As of today, PRAXIS is <strong>design-complete</strong> for the remaining MVP architecture (P3–P6). The design pack includes full specifications for EvidenceGate, EvidenceLedger, WiringGate, ExecGate, FinalGate, RepairPacket, report model, CLI workflow, and plugin bridge.</p>
<p><strong>The Three Laws are preserved. The core pain point is real. The solution is focused.</strong></p>
<p>PRAXIS doesn't compete with coding agents. It sits above them and answers one question: <strong>did the agent actually do what it claimed?</strong></p>
<p>That question doesn't go away, no matter which agent you use. And that's why PRAXIS exists.</p>]]></content>
        <author>
            <name>PRAXIS Team</name>
            <uri>https://github.com/ddawnlll</uri>
        </author>
        <category label="PRAXIS" term="PRAXIS"/>
        <category label="Architecture" term="Architecture"/>
        <category label="Design" term="Design"/>
        <category label="Plugin-First Pivot" term="Plugin-First Pivot"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Problems We Faced Building PRAXIS — The Hard Lessons]]></title>
        <id>https://praxis-docs-site.netlify.app/blog/problems-building-praxis</id>
        <link href="https://praxis-docs-site.netlify.app/blog/problems-building-praxis"/>
        <updated>2026-07-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The real challenges we encountered designing PRAXIS — overambitious scope, market shifts, false-done detection, and knowing when to throw away work.]]></summary>
        <content type="html"><![CDATA[<p>Every project has hard problems. PRAXIS had some doozies.</p>
<p>Some we solved. Some we're still wrestling with. Some we realized were the wrong problems entirely and had to walk away from.</p>
<p>Here are the real ones.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-we-designed-too-much-too-early">1. We Designed Too Much Too Early<a href="https://praxis-docs-site.netlify.app/blog/problems-building-praxis#1-we-designed-too-much-too-early" class="hash-link" aria-label="Direct link to 1. We Designed Too Much Too Early" title="Direct link to 1. We Designed Too Much Too Early" translate="no">​</a></h2>
<p>The original PRAXIS architecture was beautiful. It had everything:</p>
<ul>
<li class="">Desktop Mission Control with Electron + React</li>
<li class="">Local HTTP+SSE server with Hono</li>
<li class="">PostgreSQL event log for persistent state</li>
<li class="">Multi-worker scheduling with Governor tiers</li>
<li class=""><code>stable_16</code> concurrency model</li>
<li class="">Deterministic Assembler for parallel merge</li>
<li class="">Wave scheduler for orchestration</li>
<li class="">Circuit breaker for admission control</li>
</ul>
<p>We had ADRs for all of it. We had diagrams. We had package names. We had a phase map that stretched out for months.</p>
<p><strong>The problem:</strong> none of it was validated against real usage. We were designing infrastructure for a problem we hadn't proven existed in the form we imagined.</p>
<p><strong>The lesson:</strong> Start with the kernel. Prove the core hypothesis before building the city around it. Infrastructure is expensive to build and even more expensive to undo when you discover the core hypothesis needs to change.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-the-market-shifted-under-us">2. The Market Shifted Under Us<a href="https://praxis-docs-site.netlify.app/blog/problems-building-praxis#2-the-market-shifted-under-us" class="hash-link" aria-label="Direct link to 2. The Market Shifted Under Us" title="Direct link to 2. The Market Shifted Under Us" translate="no">​</a></h2>
<p>While we were designing desktop Mission Control, the coding agent landscape changed dramatically:</p>
<ul>
<li class="">Claude Code matured into a production-ready tool</li>
<li class="">MiMo Code launched with strong adoption</li>
<li class="">OpenCode went open source with a growing community</li>
<li class="">Multiple other agent tools entered the space</li>
</ul>
<p>These tools already solved the "run a coding agent in your terminal" problem — and they solved it well. Competing on that axis would have been a mistake.</p>
<p><strong>The hard realization:</strong> The market doesn't care about your elegant architecture if it's solving a problem that's already solved. The question shifted from "how do we build a better agent?" to <strong>"what unique value does PRAXIS provide?"</strong></p>
<p>The answer — independent verification of agent claims — was hiding in plain sight the whole time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-the-false-done-problem-is-harder-than-it-sounds">3. The False-Done Problem Is Harder Than It Sounds<a href="https://praxis-docs-site.netlify.app/blog/problems-building-praxis#3-the-false-done-problem-is-harder-than-it-sounds" class="hash-link" aria-label="Direct link to 3. The False-Done Problem Is Harder Than It Sounds" title="Direct link to 3. The False-Done Problem Is Harder Than It Sounds" translate="no">​</a></h2>
<p>"False done" — when an agent reports completion but hasn't actually finished — sounds easy to detect. Just check the diff, right?</p>
<p>It's not that simple:</p>
<ul>
<li class="">An agent can produce a non-empty diff that doesn't satisfy the acceptance criteria</li>
<li class="">An agent can claim "all tests pass" without ever running the test suite</li>
<li class="">An agent can modify files that should be out of bounds</li>
<li class="">An agent can report success for a command that never executed</li>
<li class="">An agent can fabricate evidence that looks plausible</li>
</ul>
<p>Building gates that catch these cases without producing false positives of their own is a <strong>genuinely hard engineering problem.</strong></p>
<p>EvidenceGate checks that evidence exists and is trustworthy. ExecGate checks that commands actually ran. FinalGate checks that results meet human criteria. Each gate has a specific job and specific failure modes — and keeping them separate required multiple design iterations.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-the-pivot-was-painful">4. The Pivot Was Painful<a href="https://praxis-docs-site.netlify.app/blog/problems-building-praxis#4-the-pivot-was-painful" class="hash-link" aria-label="Direct link to 4. The Pivot Was Painful" title="Direct link to 4. The Pivot Was Painful" translate="no">​</a></h2>
<p>ADR-013 was the hardest document we've written.</p>
<p>It meant:</p>
<ul>
<li class="">Killing months of design work (MVP-A/B/C staging, Desktop Mission Control, server architecture)</li>
<li class="">Reclassifying dozens of design decisions to "future scope"</li>
<li class="">Admitting that the original direction was wrong</li>
<li class="">Starting over with a smaller, more focused product</li>
</ul>
<p><strong>The emotional challenge:</strong> It's hard to throw away work. The desktop-first architecture had been reviewed, approved, and documented. Walking away from it felt like failure.</p>
<p><strong>The rational reality:</strong> It wasn't failure — it was learning. The desktop-first architecture taught us what PRAXIS was NOT. The pivot focused us on what PRAXIS actually IS: a Truth Kernel, not an orchestrator.</p>
<p>We kept the Three Laws. We kept the Truth Engine. We kept human-authored acceptance criteria. We threw away everything that distracted from the core verification loop.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-design-vs-implementation-tension">5. Design vs. Implementation Tension<a href="https://praxis-docs-site.netlify.app/blog/problems-building-praxis#5-design-vs-implementation-tension" class="hash-link" aria-label="Direct link to 5. Design vs. Implementation Tension" title="Direct link to 5. Design vs. Implementation Tension" translate="no">​</a></h2>
<p>PRAXIS v0.1 is currently at ~45% design complete (D0-D1) and <strong>0% implementation complete</strong>. This creates a specific kind of tension:</p>
<ul>
<li class="">Designs are clean and elegant on paper</li>
<li class="">Reality is messy and full of edge cases</li>
<li class="">We know some assumptions will break on first contact with real code</li>
<li class="">But we also know that starting implementation too early leads to churn</li>
</ul>
<p><strong>The open problem:</strong> When do you stop designing and start building? For PRAXIS, the answer is when the design pack is complete through P6 (FinalGate + Repair + Reports + CLI + Plugin). The remaining design work is ~55% of the total, and every component is specified to contract level.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-the-bitti-mi-gerçekten-question-never-gets-old">6. The "Bitti mi gerçekten?" Question Never Gets Old<a href="https://praxis-docs-site.netlify.app/blog/problems-building-praxis#6-the-bitti-mi-ger%C3%A7ekten-question-never-gets-old" class="hash-link" aria-label="Direct link to 6. The &quot;Bitti mi gerçekten?&quot; Question Never Gets Old" title="Direct link to 6. The &quot;Bitti mi gerçekten?&quot; Question Never Gets Old" translate="no">​</a></h2>
<p>The Turkish phrase that became PRAXIS's internal motto — <strong>"Bitti mi gerçekten?"</strong> (Did it actually finish?) — turned out to be the hardest question to answer truthfully.</p>
<p>Not because verification is technically impossible. But because <strong>agents are designed to sound confident.</strong> They say "done" with conviction. They produce plausible-looking diffs. They describe passing tests that never ran.</p>
<p>Building a system that treats every agent claim as potentially false — and demands proof — requires a fundamentally different mindset than building a system that trusts the agent.</p>
<p>That mindset shift — from "trust the agent" to <strong>"verify the evidence"</strong> — is the hardest problem PRAXIS solves. And it's not a technical problem. It's a design philosophy problem.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-wed-do-differently">What We'd Do Differently<a href="https://praxis-docs-site.netlify.app/blog/problems-building-praxis#what-wed-do-differently" class="hash-link" aria-label="Direct link to What We'd Do Differently" title="Direct link to What We'd Do Differently" translate="no">​</a></h2>
<ol>
<li class=""><strong>Start with the kernel, not the infrastructure.</strong> The Truth Engine is the product. Everything else is distribution.</li>
<li class=""><strong>Validate the core hypothesis faster.</strong> We spent too long designing around assumptions that turned out to be wrong.</li>
<li class=""><strong>Pivot sooner.</strong> The signs were there before ADR-013. We could have saved weeks of work.</li>
<li class=""><strong>Keep the scope smaller.</strong> Each "future scope" item in the original design was a distraction from proving the core model.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-we-got-right">What We Got Right<a href="https://praxis-docs-site.netlify.app/blog/problems-building-praxis#what-we-got-right" class="hash-link" aria-label="Direct link to What We Got Right" title="Direct link to What We Got Right" translate="no">​</a></h2>
<ol>
<li class=""><strong>The Three Laws.</strong> They survived the pivot intact. They're the right foundation.</li>
<li class=""><strong>Human-authored acceptance criteria.</strong> This is the non-negotiable that prevents the echo chamber problem.</li>
<li class=""><strong>Evidence-based verification.</strong> Agent claims are not evidence. This distinction is everything.</li>
<li class=""><strong>The plugin-first model.</strong> It proved the kernel with real sessions immediately, without building infrastructure first.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-we-are-now">Where We Are Now<a href="https://praxis-docs-site.netlify.app/blog/problems-building-praxis#where-we-are-now" class="hash-link" aria-label="Direct link to Where We Are Now" title="Direct link to Where We Are Now" translate="no">​</a></h2>
<p>The remaining MVP architecture (P3–P6) is design-complete. The next step is Truth Kernel Proof Design (D2), followed by Claude Code Plugin Spike Spec (D3), followed by Final Design Lock Audit (D4).</p>
<p>Implementation is not authorized until D4 passes.</p>
<p>That's deliberate. We learned our lesson about building before validating.</p>]]></content>
        <author>
            <name>PRAXIS Team</name>
            <uri>https://github.com/ddawnlll</uri>
        </author>
        <category label="PRAXIS" term="PRAXIS"/>
        <category label="Engineering" term="Engineering"/>
        <category label="Lessons" term="Lessons"/>
        <category label="Design" term="Design"/>
    </entry>
</feed>