Skip to content

Project 01 · Vibe Coding vs Harness Engineering

Difficulty: Beginner · Duration: ~2 hours · Prerequisites: Lectures 01–02

Objective

Run the same feature implementation task twice — first in vibe-coding mode with a vanilla agent and no harness, then with a minimal harness — and compare reliability, scope adherence, and time-to-verify.

This project makes the contrast concrete: vibe coding is fast, intuitive, and loosely controlled; harness engineering is bounded, verifiable, and recoverable.

The task

You will implement a simple user authentication module with two endpoints:

  • POST /auth/login — validate credentials, return a session token
  • POST /auth/logout — invalidate the session token

The codebase is a minimal TypeScript Express application provided in starter/.

Phase 1: The Vibe-Coding Run

Setup

bash
git clone https://github.com/nboitout/agentic-sdlc
cd projects/project-01/starter
npm install

Instructions

Open Claude Code (or your preferred agent) in the starter/ directory. Give it this prompt and nothing else:

Implement user authentication with POST /auth/login and POST /auth/logout.
Login should validate against the users array in src/data.ts.
Logout should invalidate the session token.

What to observe

Run the agent and take notes on:

  • [ ] Does it stay within the expected files?
  • [ ] Does it run tests before finishing?
  • [ ] Does it document what it did?
  • [ ] How many attempts before tests pass?

Record your observations in baseline-notes.md.

Phase 2: The Harnessed Run

Setup

Reset to the starter state:

bash
git checkout -- .

Add the harness

Copy the minimal harness pack into the project:

bash
cp ../../resources/templates/AGENTS.md .
cp ../../resources/templates/feature_list.json .
cp ../../resources/templates/progress.md .

Edit feature_list.json to add your task:

json
{
  "features": [
    {
      "id": "feat-001",
      "title": "User authentication endpoints",
      "status": "pending",
      "scope": ["src/auth/", "tests/auth/"],
      "acceptance": [
        "POST /auth/login returns 200 + token on valid credentials",
        "POST /auth/login returns 401 on invalid credentials",
        "POST /auth/logout returns 200 and invalidates token",
        "All tests pass: npm test"
      ]
    }
  ]
}

Instructions

Give the agent the same core prompt, but now AGENTS.md, feature_list.json, and progress.md are present in the directory. The agent will read them automatically.

What to observe

Run the agent and take the same notes:

  • [ ] Does it stay within src/auth/ and tests/auth/?
  • [ ] Does it run npm test before finishing?
  • [ ] Does it update progress.md?
  • [ ] How many attempts before tests pass?

Phase 3: Measure the difference

Fill in the comparison table:

MetricBaselineHarnessed
Files modified (total)
Out-of-scope edits
Tests run automatically?
Attempts to pass tests
Progress documented?
Time to completion

Reflection questions

  1. What was the most surprising difference between the two runs?
  2. Which harness primitive had the biggest impact? (scope / verification / state)
  3. What would you add to AGENTS.md based on what you observed?

Next: Project 02 — Building a Minimal Harness →

Released under the MIT License.