Agent Codeyard

Features

Code generation is one step of engineering. These are the problems around it that the workflow answers, each with a real record it left and the docs page with the detail.

  1. Requirements before implementation
  2. Architecture before parallel work
  3. Isolated feature execution
  4. Evidence per acceptance criterion
  5. Independent review
  6. Risk-proportionate workflow
  7. Safe unattended execution
  8. Human authority

Requirements before implementation

From implementer.md and project-grill.md. Every step in the docs.

An agent that meets an open decision invents an answer, and the invention is then reviewed as if it were the requirement. The workflow settles the requirements before the code, once per project and again per feature.

Requirements before the code: the Project Grill agrees the project's requirements with you once; per feature the implementer reads the Issue and its context and decides whether it is clear. When it needs clarification the run stops, you answer, and it reads again; when it is clear it implements.needs clarification: the run stops, you answer, it reads againProject Grillstart-planning.shRequirementsPROJECT_REQUIREMENTS.mdRead the Issuecomments, requirements, ADRsDecideclear or needs clarificationImplementclear
  1. Project Grillstart-planning.sh

    Questions you about goals, users and scope, once per project.

  2. Requirementsdocs/PROJECT_REQUIREMENTS.md

    An Issue cannot override them silently.

  3. Read the Issuewith your comments, the requirements, the architecture, the ADRs and the code
  4. Decideclear or needs clarification

    Needs clarification: nothing changes, the questions go into the handoff note, and the run stops with status 3.

  5. You answeronly when asked

    In the handoff note or on the Issue; the next session reads again.

  6. ImplementClarification: clear

Once per project

  • start-planning.sh: the Project Grill questions you about goals, users and scope until the requirements are agreed, and writes docs/PROJECT_REQUIREMENTS.md.
  • An Issue cannot override them silently: where it would, the conflict is a question for you, with a proposed ADR or an update of the requirements as one option.

Once per feature

  • The implementer reads the Issue, your comments on it, the requirements, the architecture, the ADRs and the code, and decides: clear, or needs clarification.
  • Needs clarification: it changes nothing, writes its questions with options and a recommendation, and the run stops with status 3. You answer in the handoff note or on the Issue.
.agents/prompts/implementer.md · Clarification, excerpt- **Clear:** implement. Write `**Clarification:** clear` into the handoff
  note, with one line on why, so that the record shows the step was taken.
- **Needs clarification:** change nothing in the repository. Write each
  question under "Open questions" in the handoff note, with the decision it
  settles and, where you can, the options and your recommendation. [...]
  Nothing is reviewed or committed until the owner answers.

Only decisions that affect the scope, the user experience, a public interface, the data model, the architecture, security, compatibility or the acceptance criteria are questions for you; names and private helpers are not. Only comments of the owner, members and collaborators reach the agents. On #16, the clarification gate itself, the owner's two comments settled the design and the run took 26 minutes from start to pull request (PR #213).

docs
Clarify the requirements, Implement the feature
built in
PR #22 (planning), #213 (clarification), #185 (your comments)

Architecture before parallel work

From AGENTS.md and the planning scripts. Every step in the docs.

Features built in parallel drift apart unless they share one approved design. The architecture, the ADRs and the roadmap are written, reviewed and approved before the first feature starts, and every feature session reads them first.

The planning line: plan, independent review of the plan, a decision per finding, your approval. A later change goes back through the review and your approval. Then the features start, and every feature session reads the approved documents first.a later change: review and approval againPlanstart-planning.shPlan reviewreview-planning.shA decision per findingrevise-planning.shYour approvalfinish-planning.shFeaturesread it first
  1. Planstart-planning.sh

    The planner writes docs/architecture.md, the first ADRs and docs/roadmap.md from the agreed requirements.

  2. Independent review of the planreview-planning.sh

    An agent of another provider reviews it, read-only.

  3. A decision per findingrevise-planning.sh

    Every finding of the plan review gets a recorded decision.

  4. Your approvalfinish-planning.sh

    Tied to the version of the documents you approved. A later change goes through review and approval again.

  5. Features

    Built in parallel, each session reads the approved architecture, ADRs and roadmap first.

AGENTS.md · Source precedence1. Explicit current human instruction
2. Accepted ADRs
3. Current GitHub issue acceptance criteria
4. AGENTS.md
5. Current architecture documentation
6. Active feature plan
7. Handoff documents
8. Previous agent assumptions

If a material conflict remains, stop and report it.

An accepted ADR outranks the Issue, so a feature cannot quietly change the design: an implementer that would have to stops and reports the conflict, a new ADR enters as Proposed, and every added, changed or removed ADR needs your approval before the merge. The reviewer classifies each feature's impact on the architecture; major or breaking makes the feature high risk and needs you too.

files
docs/architecture.md, docs/decisions/, docs/roadmap.md
docs
Create the project plan, Approve the plan
built in
PR #22 (planning), #100 (the merge approval gate)

Isolated feature execution

Rules in AGENTS.md. Working directories in the docs.

Two agents writing in one checkout overwrite each other, and an agent writing on main leaves nothing to review. Each feature is built on its own branch, in its own Git worktree beside the main checkout.

# a branch feature/<issue>-<slug> and a worktree beside the main checkout
$ ./scripts/start-feature.sh 241
# a new session continues from the handoff note, not the earlier conversation
$ ./scripts/start-feature.sh 241 --resume
# after the merge, from the primary checkout
$ ./scripts/cleanup-worktree.sh 241
The line of one feature: start creates its branch and worktree; the work happens there, with one writer, and a new session resumes from the handoff note; you merge; cleanup removes the merged worktree and branch.a new session: --resume, from the handoff noteStartstart-feature.shWork in the worktreeone writerMergeby youCleanupcleanup-worktree.sh
  1. Startstart-feature.sh

    A branch feature/<issue>-<slug> and a worktree beside the main checkout.

  2. Work in the worktreeone writer

    A new session continues with --resume, from the handoff note.

  3. Mergeby you
  4. Cleanupcleanup-worktree.sh

    Removes the merged worktree and branch, after it copied their run records.

  • One writer per worktree. Parallel agents need separate worktrees and branches.
  • Resumable. The handoff note, .agents/handoffs/<issue>.md, says what is done, in progress, remaining and rejected; the files are the truth, the note the summary.
  • Prepared. An optional setup script copies ignored files, such as installed dependencies, into a new worktree.
  • Cleaned up. cleanup-worktree.sh removes merged worktrees and branches, after it copied their run records.

A worktree separates working files; it is not a sandbox for databases, services or credentials. PR #249, for example, came from the branch feature/241-write-the-features-examples.

scripts
start-feature.sh, cleanup-worktree.sh
built in
PR #57 (cleanup), #71 (setup script), #77 (resume)

Evidence per acceptance criterion

Configured in verify.conf. Verification and completion in the docs.

An agent session that ends normally says nothing about whether the work is finished. The implementer records, per acceptance criterion, whether it is met and what shows it, and one command records which content the checks passed for.

Evidence before review: the implementer writes the completion record, verify.sh records a pass for the content, and the completion gate reads the record. Partial starts the implementer again; blocked stops the run until you answer; complete or awaiting_evidence goes on to the review.partial: the implementer is started againblocked: the run stops, you answerImplementcompletion/<n>.jsonVerifyverify.shCompletion gatecomplete | awaiting_evidenceReviewclaims against the diff
  1. Implement.agents/completion/<issue>.json

    Per acceptance criterion: met or not, and what shows it.

  2. Verifyverify.sh

    Every check of verify.conf; the pass is bound to the content fingerprint.

  3. Completion gatecomplete | awaiting_evidence

    Partial: the implementer is started again.

  4. You answerblocked

    The run stops with the question.

  5. Revieweach claimed criterion against the diff
github.com/taspinar/agent-codeyard/pull/249 · excerptCompletion: complete
- met: Every statement links to or matches its source; no invented figure or testimonial. (documentation/src/pages/{features,examples,about}.astro: each feature section names its file and key with repoFile links and the PRs that built it; [...])
[...]
- met: ./scripts/verify.sh passes. (./scripts/verify.sh run as the last step of the session; result in the final message.)

Verification:
- ./scripts/verify.sh passed
The statuses of the completion record .agents/completion/<issue>.json and what the scripts do with them, from .agents/prompts/implementer.md.
statusmeaningnext
completeEvery criterion met or not applicable, nothing remainsreview, commit, pull request
awaiting_evidenceEverything that can be shown now is shown; a criterion waits for CI, your approval or the mergepull request; the Issue closes when the evidence exists
partialWork remains, whatever the reasonthe implementer is started again
blockedA decision only you can makethe run stops with the question

verify.sh runs every check of scripts/verify.conf, and its pass is bound to a content fingerprint and reused while nothing changes. Every commit needs the full verification; a partial run of some groups, which a repair round may use, is never a verification and cannot be cited. The reviewer holds each claimed criterion against the diff, and an unsupported claim comes back as a finding.

checks
<name> [<group>]: <command> in scripts/verify.conf
fingerprint
scripts/lib/fingerprint.sh
built in
PR #74 (recorded verification), #126 (completion gate), #168 (evidence that cannot exist yet)

Independent review

Configured in agents.conf. Agent roles in the docs.

An agent that reviews its own work, or the work of its own model family, shares its blind spots. The reviewer of a feature comes from another provider than the implementer, runs read-only, and reviews exactly the content the verification passed for.

The review loop: the verified content is reviewed read-only by another provider, the triage proposes a decision per finding, and you approve the triage, or an unattended run approves it without asking. FIX_NOW findings are fixed, verified and reviewed in a new round; then the feature is committed.FIX_NOW: the fixes, verified, then a new roundVerifyverify.shReviewanother provider, read-onlyTriageFIX_NOW · DEFER · ACCEPTApprove the triageby you; a run, without askingCommitfinish-feature.sh
  1. Verifyverify.sh
  2. Reviewanother provider than the implementer, read-only

    Exactly the content the verification passed for.

  3. TriageFIX_NOW · DEFER · ACCEPT

    Critical and major findings are always FIX_NOW; DEFER needs a follow-up Issue, ACCEPT a rationale.

  4. Approve the triageby you; an unattended run approves it without asking

    FIX_NOW: apply-triage.sh hands the fixes to an implementer, the result is verified and reviewed in a new round.

  5. Commitfinish-feature.sh
github.com/taspinar/agent-codeyard/issues/241#issuecomment-6531925164 · round 1, excerptReviewed tree: b619ba7025060eef51cd7cb7c53eb3513cc1161a

Verification: passed for the reviewed tree at 2026-10-30T19:37:53Z
Reviewer: codex (gpt-6-luna), read-only

[...]
### M1. Examples do not link each candidate to its source files
[...]
## Verdict

CHANGES REQUIRED

review-feature.sh refuses a review by the implementer's own provider; as shipped, Claude implements and Codex reviews. A triage agent proposes one decision per finding: FIX_NOW, DEFER with a follow-up Issue, or ACCEPT with a rationale. Critical and major findings are always fixed. The decisions are published on the Issue, and every later round receives them, so an accepted finding is not raised again as new.

The roles of a feature in the shipped .agents/agents.conf. The --agent and --model options of a script override it for one run.
roleprovider and modelaccess
implementerclaude opuswrites; unattended in a run
implementer@highclaude fablewrites; unattended in a run
reviewercodex gpt-6-lunaread-only
triageclaude sonnetread-only
triage-implementerclaude opuswrites; unattended in a run
triage-implementer@highclaude fablewrites; unattended in a run
enforced by
review-feature.sh (provider independence), scripts/lib/review-data.sh (findings across rounds)
docs
Review the implementation, Decide what to do with review findings
built in
PR #12 and #14 (triage), #164 (your decisions), #222 (earlier rounds)

Risk-proportionate workflow

Configured in risk.conf. Risk policy in the docs.

A typo and a change to the merge gate do not deserve the same process. Every feature gets a risk level, low, medium or high, computed from what it changes; the level picks the model of each writing role and what the review rounds require.

How the level is set: the classes of the changed paths, the escalations and your hint each give a level; the highest counts and nothing lowers it. The review can raise it again: an impact on the architecture classified as major or breaking makes the feature high.major or breaking impact: highChanged pathsrisk.confEscalationstests, check lists, policiesYour hintrisk: high | --riskLevelthe highest; never loweredReviewimpact on the architecture
  1. Changed paths.agents/policies/risk.conf

    The highest class of any changed path; a path no class names gets the default.

  2. Escalationstests, check lists, fixtures, manifests, policies, prompts, schemas

    A changed existing one makes the feature high.

  3. Your hintrisk: high | risk: medium | --risk

    Before the first session.

  4. Levelthe highest counts; nothing lowers it

    It picks the model of each writing role and what the review rounds require.

  5. Reviewclassifies the impact on the architecture

    Major or breaking makes the feature high.

github.com/taspinar/agent-codeyard/pull/249 · excerptRisk: medium
- documentation/src/pages/about.astro: no class of .agents/policies/risk.conf names it; the default is medium
[...]
- profile: none

Triage mode: full (the default; .agents/policies/risk.conf of the base has no 'medium: triage:' line)
The sources of the level; the highest one counts. From scripts/lib/risk.sh and the header of risk.conf, read from the base branch, so a feature cannot relax the rules it is classified by.
sourcewhat raises the level
PathsThe highest class of any changed path; a path no class names gets the default. As shipped: default medium, the workflow's own gate files high, no low class.
EscalationsAlways high: a changed or removed line of an existing test or of the check lists, any change to a shared test fixture, a changed existing manifest, and a changed existing file under .agents/policies/, .agents/prompts/ or .agents/schemas/.
The reviewerAn impact on the architecture classified as major or breaking.
YouThe Issue label risk: high or risk: medium, or --risk, before the first session.

Any source can raise the level; nothing lowers it. A low level exists only under profile: light, which adds a low class for documentation and process files and lets a low feature go without a review, said in the commit and the pull request, with your approval of the merge. Under both profiles every commit needs the full verification and only you merge. High always keeps every control.

key
profile: light | standard; per level, <level>: verification | review | triage: <value>
model per level
implementer@high: claude fable in agents.conf
try it
./scripts/check-risk.sh in a feature worktree prints the level and its reasons
built in
PR #194 (the level), #202 and #211 (models per level), #214 (profiles), #229 (your hint)

Safe unattended execution

Limits in run-feature.sh, profiles in scripts/lib/agent.sh. Run a feature unattended in the docs.

An unattended run has nobody to ask and nobody watching. run-feature.sh takes a feature from its Issue to an open pull request without questions, inside fixed limits, and leaves a record of every step.

An unattended run: run-feature.sh starts the implementer under the unattended profile, verifies, and runs the review rounds, with the fixes of each round, until an open pull request; there the run ends, and you merge. An agent that needs your decision stops the run with status 3.FIX_NOW: the fixes, then the next roundStartrun-feature.shImplementat most 4 sessionsVerifyat most 3 repairsReviewat most 5 roundsPull requestthe run endsMergeby you
  1. Startrun-feature.sh
  2. Implementunattended profile; by default at most 4 sessions

    BLOCKED: the run exits with status 3; the same command continues after your answer.

  3. Verifyby default at most 3 repairs of a failing verification
  4. Reviewread-only; at most 5 rounds

    FIX_NOW: the fixes, then the next round.

  5. Pull requestopen; the run ends here and never removes a worktree
  6. Mergeby you
  • Bounded permissions. A writing agent runs under the unattended profile: anything that would ask is denied, and it gets no MCP servers or apps from your configuration. Reviewers and triage run read-only.
  • Bounded effort. At most 5 review rounds in a run, and by default 4 implementer sessions, 3 retries of a failing agent call and 3 repairs of a failing verification.
  • Stops instead of guesses. An agent that needs your decision ends with a BLOCKED: line and the run exits with status 3. Running the same command again continues where the feature stands.
  • Never merges. The run ends at an open pull request and never removes a worktree.
.agents/records/feature-241.jsonl · run of PR #249, excerpt{"schema":"run-record/v1",[...]"time":"2026-10-30T19:27:28Z",
 "type":"agent-start","role":"implementer","profile":"unattended",
 "agent":"claude","model":"opus","level":"medium",[...]}
{"schema":"run-record/v1",[...]"time":"2026-10-30T19:37:53Z",
 "type":"verification","status":0,"seconds":14,"reused":false,[...]}
{"schema":"run-record/v1",[...]"time":"2026-10-30T19:38:09Z",
 "type":"completion-gate","check":1,"sessions":1,[...]"status":"complete",[...]}
{"schema":"run-record/v1",[...]"time":"2026-10-30T19:38:12Z",
 "type":"agent-start","role":"reviewer","profile":"read-only",
 "agent":"codex","model":"gpt-6-luna","level":"medium",[...]}

Every run leaves such a record on your machine: each step and its duration, the agent, model and level, the verification seconds, the findings and why a run stopped. report-runs.sh summarises it per feature and analyze-runs.sh lets a read-only analyst propose changes; the analysis of 28 October 2026 is how Codeyard found what to change in itself.

records
.agents/records/feature-<issue>.jsonl in the primary checkout, ignored by Git, format run-record/v1 (docs/development.md)
docs
What is recorded on your machine
built in
PR #136 to #140 (records), #223 (stops)

Human authority

Configured in guardrails.conf. Changes that need the owner in the docs.

No script merges. The decisions that matter stay with you: the requirements, the plan, the answers to questions, and the merge, and some pull requests only you may approve.

Your decisions: you agree the requirements and approve the plan; a feature asks you only when it needs a decision; a pull request that changes a protected path, has a major or breaking impact or no review needs your approval of exactly its commit; and only you merge.protected path, major impact or no reviewRequirementsyou agree themPlanfinish-planning.shQuestionsyou answer, when askedPull requestrules from the base branchMergeonly you
  1. Requirementsyou agree them with the Project Grill
  2. Planfinish-planning.sh
  3. Questionsyou answer, only when a feature asks
  4. Pull requestthe rules are read from the base branch

    A protected path, a major or breaking impact, or no review: your approval of exactly this commit.

  5. Mergeonly you; no script merges

Your approval is needed when a feature changes a protected path, when the reviewer classifies its impact on the architecture as major or breaking, or when there is no review. Always protected: every ADR, the CI workflows, the files that carry out the gate, and a changed or removed line of the check lists. The rules are read from the base branch, so a feature cannot loosen its own gate.

github.com/taspinar/agent-codeyard/pull/222 · excerptMerge approval:
- required from the project owner, for exactly this commit
[...]
- scripts/review-feature.sh: the file defines or carries out the workflow and its gate
- the independent review classified the impact on the architecture as major: [...]

Codeyard enforces

  • The risk level, and that no agent lowers it
  • A reviewer of another provider, read-only
  • Verification before review and before commit
  • The completion gate and the triage rules
  • Rules read from the base branch

Your GitHub settings enforce

  • A ruleset on main that requires a pull request and the CI check; doctor.sh warns when it is missing
  • Code-owner review, once you replace the placeholder in CODEOWNERS
  • An approval the agent cannot give itself: needs a separate agent identity, not built yet
checks
check-guardrails.sh locally, and the Guardrails job of guardrails.yml on every pull request
settings
GitHub setup in the docs
built in
PR #100 (the gate), #200 (approval requests and the content tree)