Specifications as Execution Contracts

Greenlight before agents implement

Share

"Build X" tickets produce unreviewable agent output. Reviewers argue product in the PR because there was never a merged rubric. Ambiguous specs become rework and midnight Slack - especially when agents widen the volume of code before intent is settled.

Here's what this piece covers: the leadership problem of prompt-and-pray delivery, what commit 74f9ffa (2026-07-07) adopted into the methodology, contract properties I still require, the named pattern, and three habits before you let agents open an implementation branch.

Part of the Field Notes: agentic delivery series - engineering-led delivery needs a contract, not a chat thread.


1. The leadership problem

Agents are excellent at filling space. Without a greenlit specification, they fill the wrong space. The anti-pattern is prompt and pray - no acceptance criteria, no out-of-scope, no verification plan.

Wrong: "Write better docs."
Right: "74f9ffa: contract properties and a post-greenlight lifecycle - what agents may implement after Owner approval."

A narrative wiki page is not an execution contract. A contract is testable, versioned, and explicit about what stays out.


2. What the git history shows

On 2026-07-07, commit 74f9ffa - Selectively adopt Zazz spec and feature methodology for SBD - landed the contract model in agentic-framework:

Artifact Role
docs/methodology/specifications.md What a deliverable SPEC must contain
docs/methodology/spec-driven-development.md Lifecycle after greenlight
spec-builder skill Template + content rules for contracts
spec-driven skill In-place amendments, change log, AC/TDD loop

Same day, handoff/confluence skills continued the operating surface (c3543ec nearby). The proof point in product work: ~47 SPEC files under global-services/docs/ (team-tracked count from our metrics snapshot; light verify today finds ~45 *SPEC*.md matches - treat as approximate).

flowchart TD P[Proposal / uncertain direction] --> S[SPEC draft via spec-builder] S --> G[Owner greenlight] G --> I[AC/TDD implementation] I --> F[Steering / QA / PR feedback] F -->|contract change| S2[In-place SPEC update + change log] S2 --> I F -->|no contract change| M[Human signoff and merge]

Weak vs strong criteria - the reusable teaching example:

Weak:  The dashboard works correctly.

Strong: When the API returns no records, the dashboard renders the empty
        state with no table rows and no error banner. Verified by the
        empty-result component test and one browser check.

3. What I built

Contract properties every SPEC carries: scope in/out, dependencies, acceptance criteria, test strategy and evidence, halt conditions, standards to load, paste-ready implementation prompt, and an Implementation And Review Change Log.

Authority gate - Owner greenlight before implementation. Small fixes may start at SPEC; uncertain direction starts at proposal. Spec approval is the authority gate, not a courtesy review after code exists.

Lifecycle after greenlight - accepted steering updates the SPEC in place; the change log is the audit trail, not a second requirements source. qa-testing produces evidence against criteria; pr-review grades the PR against the governing SPEC.

What broke: SPECs that read like marketing cause agents to over-build. Missing verification sections make "done" undefined - and human reviewers invent the rubric in the PR thread.


4. Named pattern: spec as execution contract

Spec as execution contract - testable, versioned, explicit out-of-scope; what agents may implement after greenlight.
Property Decision it supports
Scope / exclusions What not to build
Acceptance criteria Binary pass/fail
Test strategy + evidence What "done" looks like in CI and review
Halt conditions When the agent must stop and ask
Change log How the current contract got there

What broke: treating the SPEC as disposable once coding starts. After greenlight, the body remains the executable truth - amend it, do not invent a parallel Slack truth.


5. What I'd do as a lead

Three habits - steal one this month:

  1. No agent implementation branch without a merged SPEC path in the repo. Chat is not the contract.
  2. Template every program with spec-builder. Same sections every time; stop free-form "agent prompts" as the only artifact.
  3. Quarterly audit: open PRs without a SPEC link. If reviewers cannot find the rubric, the process failed before the diff.

Further reading