Skip to content
•7 min read

Why I Engineered—and Then Abandoned—the Dyad Accountability System

A post-mortem on building an AI-policed, Markdown-driven peer accountability protocol, what it taught me about human motivation, and why we ultimately replaced it.

The Genesis: When Good Intentions Meet Soft Excuses

Every founder, indie hacker, and deep-work practitioner knows the familiar arc of accountability partnerships.

You find a like-minded peer. You start with immense enthusiasm: "Let’s do a quick daily standup on Telegram!" or "Let’s share a Notion board!"

Within three weeks, the subtle rot sets in:

  • The Politeness Trap: Neither of you wants to be the jerk. When your partner posts "Made good progress researching the landing page," you nod, hit the 👍 reaction, and move on—even though "researching" is often code for browsing Twitter with a notebook open.
  • Operational Bloat: You spend more time dragging cards across kanban columns, fiddling with tags, and logging status updates than executing the actual work.
  • Guilt and Ghosting: Someone misses two days in a row due to a personal emergency or burnout. The shame spiral begins. Rather than face the system, they quietly disengage, and the partnership fizzles out without ceremony.

Determined to break this cycle, my accountability partner and I decided to engineer a solution like software engineers: strip away the UI, eliminate the social awkwardness, automate the refereeing, and enforce binary falsifiability.

We named it the Dyad Accountability System.


How Dyad Was Built

We designed Dyad around one guiding axiom: If an accountability update takes more than 120 seconds of human effort, the system is broken.

Instead of SaaS dashboards, Dyad was architected around flat Markdown files synced over a shared repository, monitored and parsed by an autonomous CLI script (dyad.py) and an AI referee prompt (agent_prompt.md).

dyad/
├── 00-Foundations/
│   ├── North-Stars.md             # Long-term OKRs, annual targets & anti-goals
│   └── Rules-of-Engagement.md     # Timetables, SLAs, and friction definitions
├── 01-Templates/
│   ├── Sprint-Template.md         # Master Monday-Friday tracking structure
│   └── Sunday-Review-Template.md  # Retrospective and sync call agenda
├── Partner-A/
│   └── 2026-W42-Sprint.md         # Active weekly sprint
├── Partner-B/
│   └── 2026-W42-Sprint.md         # Active weekly sprint
└── 02-Weekly-Reviews/
    └── 2026-W42-Review.md         # AI-synthesized scorecard & call agenda

1. The Disinterested Stranger Test (Binary Falsifiability)

In Dyad, subjective effort did not count. Every committed task had to pass what we called the Disinterested Stranger Test: could an impartial stranger on the street verify whether the task was finished without asking you a single question?

  • ❌ Rejected: "Work on marketing copy." (Unprovable, subjective)
  • ✅ Approved: "Publish 1,200-word SEO article to staging blog." (Verifiable URL exists)
  • ❌ Rejected: "Refactor auth flow." (Vague boundary)
  • ✅ Approved: "PR #42 merged with 4 passing unit tests." (Objective commit/test proof)

2. The Strict Two-Task Cap

Cognitive exhaustion usually stems from sprawling to-do lists that disguise procrastination. Dyad imposed a strict hard ceiling: exactly two core deliverables per day. If you tried to log three tasks, the system rejected your commit. Constraint forced ruthless prioritization.

3. Standardized Friction Taxonomy

When a deliverable failed, partners weren't allowed to write emotional excuses. They had to tag the post-mortem with exactly one root cause:

  • [FRICTION: SCOPE]: Underestimated task complexity mid-flight.
  • [FRICTION: DEPENDENCY]: Blocked on a third party, API outage, or outside approval.
  • [FRICTION: ENERGY]: Physical fatigue, poor sleep, cognitive drain.
  • [FRICTION: AMBIGUITY]: Unclear next physical step; analysis paralysis.
  • [FRICTION: DISTRACTION]: Interrupted by reactive fires or context switching.

4. The AI as the "Bad Cop"

To prevent social friction from degrading the partnership, we offloaded the awkward tasks to an autonomous AI agent running three scheduled passes:

  • 08:45 AM (Goal Scrutinizer): Read morning commitments, audited tasks for vague verbs (plan, research, continue), and generated surgical rewrites if goals lacked verification criteria.
  • 07:30 PM (Evening Blocker Monitor): Checked completion marks, ensured friction tags were recorded, and checked for the dreaded "Never Miss Twice" rule (two consecutive misses triggered an automated escalation ping and an 08:00 AM emergency triage call).
  • Sunday 06:00 PM (Retro Synthesizer): Computed exact completion percentages, charted the week's friction hotspots, pre-scaffolded the next week's sprint files, and compiled a structured 30-minute agenda for our Sunday sync.

What Worked Remarkably Well

In the beginning, Dyad felt like magic:

  • It completely cured fuzzy commitments. The moment you realize an AI and your partner will scrutinize your log at 8:45 AM, you stop writing "work on project." You start defining crisp outcomes: commit hashes, deployed preview URLs, exported PDFs.
  • It removed social hesitation. When a commitment was poorly framed or missed, the AI called it out dispassionately. We never had to worry about sounding passive-aggressive or condescending to each other.
  • The friction logs revealed behavioral patterns. Within two weeks, it became glaringly obvious that 70% of my missed tasks were tagged with [FRICTION: SCOPE]. I wasn't lazy; I was systematically terrible at estimating task boundaries.

Where the System Began to Break

Despite its clean architectural elegance on paper, real work is messy, non-linear, and emotional. Over several sprints, structural cracks emerged:

1. Falsifiability Bias vs. High-Leverage Ambiguity

The Disinterested Stranger standard heavily biased our task selection toward things that were easy to prove rather than things that mattered most. Writing a script or publishing an article is trivially falsifiable; grappling with an ambiguous market strategy, having an exploratory architecture discussion, or pausing to rethink customer discovery is inherently fuzzy.

Dyad subtly incentivized us to pick mechanical tasks over creative, open-ended breakthroughs just to get a clean [x] before 7:00 PM.

2. Tooling Friction and Sync Glitches

We intentionally avoided heavyweight apps in favor of Markdown and Git/cloud drive synchronization. But that created its own friction: merge conflicts, file-locking delays, local execution requirements (python dyad.py --audit), and checking in from a phone while traveling. When you're running late, opening a text editor to format a strict Markdown template with verification links feels cumbersome.

3. Optimization Theatre

We fell into the classic developer trap: optimizing the machinery of accountability instead of doing the work. Tweaking the regex in dyad.py, refining the prompt tokens in agent_prompt.md, and calibrating the friction taxonomy became an alluring form of meta-work.

When your productivity framework requires an operating manual and a custom Python CLI, you're teetering on productivity theatre.

4. The Loss of Empathetic Context

An AI referee has no intuition for context. When an unexpected family obligation hits or your server cluster crashes, the system doesn't care—it flags you for missing an SLA or prompts a robotic root-cause autopsy. Over time, that rigid binary lens turns what should be an empowering human alliance into a punitive chore.


Why We Switched (and What We Use Now)

We eventually moved dyad/ into an archive directory (legacy-dyad-accountability-system/) and redesigned our rhythm from the ground up.

The realization was simple: accountability is not a database problem; it is an attention and trust problem.

Here is what we shifted toward:

| Dimension | Legacy Dyad System | Current Evolution | | :--- | :--- | :--- | | Interface | Strict Markdown files + local CLI runner | Low-friction real-time channels (async voice memos & lightweight threads) | | Task Framing | Rigid 2-task binary deliverables with proof URLs | Directional outcomes + focus sprints (protecting uninterrupted deep work blocks) | | Facilitator | Autonomous AI referee policing rule infractions | Human peer-led calibration with AI acting as an on-demand thinking partner | | Failure Response | Rigid friction tags & mandatory intervention calls | Qualitative debriefs focusing on energy management and leverage | | Sync Cadence | Synchronous 30-min structured retro with pre-baked 5-Whys | Weekly strategic alignment call focused on high-level leverage and bottlenecks |

Instead of enforcing an adversarial system where an AI plays bad cop, our current setup treats accountability as shared momentum:

  1. We share what we are shipping today via quick, unpolished notes or voice memos.
  2. We focus on whether we tackled the highest-leverage problem, not whether a task met a strict grammatical syntax.
  3. We use AI not as an unyielding warden checking checkboxes, but as a sparring partner to help unpack complex technical trade-offs before we commit to them.

The Takeaway

Building the Dyad Accountability System wasn't a wasted effort. It forced us to clarify our North Stars, understand our real bottlenecks, and confront how easily vague intentions masquerade as productive work.

If you struggle with vague commitments or finding the courage to give honest feedback to a peer, running a strict, falsifiable system like Dyad for 30 days is an incredible crucible. It will ruthlessly expose where your time actually goes.

Just remember: systems exist to serve the work, not the other way around. The moment the overhead of keeping the score exceeds the joy of playing the game, it's time to simplify.

Milan KambojDesign engineer & software builder

More writing

View all