Penling penguin markPenling
How Penling works

From goal to merged PR - with the reasoning intact.

Penling structures work into specs, hands the specs to AI for execution, and keeps the full evolutionary history of every decision along the way. Here's what that looks like in practice.

01
Define the goal
A named milestone for the project.
· Human
02
Spec the focus area
Definition, expected results, conditions, boundaries.
· Human
03
Generate a plan
LLM generates a step-by-step implementation strategy.
· AI + Human
04
Build via MCP
Agent picks up the plan and starts committing code.
· AI + Human
05
Ship the PR
Verified against spec, every contributor attributed.
· AI + Human
STEP 01 + 02 · SPEC

Goals get broken into focus areas. Focus areas are the spec.

A focus area isn't a ticket or a story. It's a structured contract: what you're building, what a passing result looks like, under what conditions, and what's out of scope.

Every build that follows inherits this contract. The agent can't start without it - and neither can the reviewer who reads the PR.

  • Definition - what you're building, in plain English.
  • Expected results - numbered, testable, no vagueness.
  • Conditions - the environment and constraints the agent must satisfy.
Real working ToDo AppGoalsBasic UIFocus area
In progressFA-014· 2 OF 4 CHECKS VERIFIED

Create the basic framework with a heading, text input, and Add ToDo button

Definition

A focused HTML page with the minimum scaffolding for editing todos. No routing framework required - just the visible surface.

Expected results
01 ·Page renders a heading Paul's Todo App
02 ·Input has placeholder Add a todo…
03 ·Button carries the label Add ToDo
04 ·All tests pass in tests/page.unit.test.js
Conditions

Run without a server runtime. All files are static HTML. All tests in tests/page.unit.test.js must pass before this build can close.

Boundaries

Do not add routing or a multi-page framework.

Do not implement submission logic beyond a styled form element.

Do not change the page title from Paul's Todo App.

STEP 03 · PLAN

An LLM proposes an implementation plan. You shape it before it ships.

The AI drafts a step-by-step strategy from the focus area. It doesn't guess - it derives from the spec: what to build, what order to do it in, what to verify along the way.

Before anything runs, you review. Human edits are tracked and attributed. When you publish, the plan becomes the agent's mandate.

  • Human edits are tracked and shown in the plan history.
  • Multiple plans can be drafted - only the published one runs.
  • Plan version is locked to the build that executes it.
FA-014PlansPlan v3 · draft
DraftPlan v3· GENERATED 8 MIN AGO · 2 HUMAN EDITS

Implementation plan

01
Insert <!DOCTYPE html> with <head>, <body>, and <h1>Paul's Todo App</h1>
AI
02
Add styled text input with maxlength=25 and placeholder attributeEdited · set maxlength cap
AI + Paul
03
Add <button>Add ToDo</button> with type="submit"
AI
04
Add aria-label attributes to pass accessibility checks
AI
05
Run tests/page.unit.test.js and confirm all assertions passEdited · added test gate
AI + Paul
06
Confirm all 4 checks resolve and close the build
AI
Publishing notifies your MCP agents
STEP 04 · BUILD

Any MCP-compatible agent picks up the plan and starts building.

Penling exposes four MCP tools. Drop the server config into your agent runtime - Claude Code, VS Code, Cursor, your own agent framework - and it connects automatically.

No lock-in. One Penling server, any runtime. The agent claims the build, streams progress, resolves checks, and asks a human if it gets stuck.

  • One Penling server, any MCP-compatible agent.
  • Builds out in your runtime - your machine, your cloud.
  • Clarifications pause the agent until a human responds.
mcp_config.jsonvia MCP
{
  "mcpServers": {
    "penling": {
      "command": "npx",
      "args": [
        "@penling/mcp-server",
        "--build", "19"
      ],
      "env": {
        "PENLING_TOKEN": "${PENLING_TOKEN}"
      }
    }
  }
}

// Four tools your agent gets:
// claim_build       - lock the build before writing code
// report_event      - stream progress back to Penling
// resolve_check     - close an acceptance check with evidence
// open_clarification - pause and ask a human a question
STEP 05 · OBSERVE

Every move the agent makes streams back to Penling.

As the agent works, the MCP server reports events back: commits, test runs, check resolutions, clarifications, PR opens. Everything is timestamped and attributed.

Subscribe via the Penling API and you can watch a build evolve in real time - in Penling, in Slack, in Datadog, in your own dashboard.

  • Webhooks for every event type.
  • Streaming subscriptions via Server-Sent Events.
  • Replayable history - scrub pages from any point.
Build #1 · live event stream
Penling API · /builds/19/events
Live build telemetry
Streaming
07:29:14build.completebuild_id=19 checks=19/19 pr=4
07:28:51pr.openedpr=4 branch=feat/rwta-2-landing-page
07:28:44check.verifiedcheck=4 fa=FA-014 evidence=tests/page.unit.test.js
07:27:30commit.pushedcommit=4c39b82 files=3 agent=claude-4
07:25:12check.verifiedcheck=3 fa=FA-014 evidence=audit/aria.json
07:24:08clarif.resolvedclarif=2 by=paul duration=24m
07:21:44check.verifiedcheck=2 fa=FA-014 evidence=screenshot.png
07:19:33clarif.openedclarif=2 agent=claude-4 fa=FA-014
07:17:09commit.pushedcommit=a1f2c34 files=2 agent=claude-4
07:16:22build.claimedagent=claude-4 plan=v3 fa=FA-014
curl · SSEsubscribe
curl -H "Authorization: Bearer $TOKEN" \
     -H "Accept: text/event-stream" \
     https://api.penling.dev/v1/builds/19/events

// Every build event streams in real time.
// Subscribe in Penling, Slack, or Datadog.
STEP 06 · SHIP

A PR opens, verified against the spec, with every contributor named.

When the build closes, Penling locks the evidence and opens a PR. Every check traces to a file. Every commit traces to a human or an AI. The reviewer sees the spec, the plan, and the proof - all in one place.

MergedPR #4github.com/example/todo-app
RWTA-2: build landing page HTML
⎇ feat/rwta-2-landing-page
4c39b82fix: set maxlength on input per Paul's edit
AI
a1f2c34feat: add aria-label attributes for accessibility
AI
9e3d211feat: add todo button and input scaffolding
AI
0b87cc1chore: init page with heading structure
PJ
Tests19 / 19
Checks4 / 4
Planv3
PenlingBuild #1
Build #1 · evidence
19 / 19 passing· EVIDENCE LOCKED · COMMIT 4c39b82

Verification snapshot

CheckEvidence
Page renders heading elementtests/page.unit.test.js:12
Input field accepts text entrytests/page.unit.test.js:28
Add ToDo button present and labelledtests/page.unit.test.js:44
Accessibility audit passesaudit/aria.json
What you get

One workflow. End-to-end documented.

4-part

Spec per focus area

Definition, results, conditions, and boundaries - every time.

Plans per spec

Draft as many as you need. Only the published one runs.

MCP

Native agent runtime

Any MCP-compatible agent. No wrapper, no lock-in.

100%

Available

Every event streams. Every build is replayable from any point.

Ready to ship with structure?

Define your work focus area, generate an implementation plan, connect our MCP agent, and watch a validated Pull Request land in your repository.

Start free trialSee pricing