<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Frederik Schmittel</title>
    <description>The latest articles on DEV Community by Frederik Schmittel (@frederik_schmittel).</description>
    <link>https://dev.to/frederik_schmittel</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4122330%2F22a4b226-4219-4414-929d-f13f154330e6.png</url>
      <title>DEV Community: Frederik Schmittel</title>
      <link>https://dev.to/frederik_schmittel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/frederik_schmittel"/>
    <language>en</language>
    <item>
      <title>The Coding Agent Changed. The Engineering Method Stayed in the Repository.</title>
      <dc:creator>Frederik Schmittel</dc:creator>
      <pubDate>Sat, 12 Sep 2026 15:59:49 +0000</pubDate>
      <link>https://dev.to/frederik_schmittel/the-coding-agent-changed-the-engineering-method-stayed-in-the-repository-5ag1</link>
      <guid>https://dev.to/frederik_schmittel/the-coding-agent-changed-the-engineering-method-stayed-in-the-repository-5ag1</guid>
      <description>&lt;p&gt;Coding agents can already do meaningful repository work. The interesting engineering problem is increasingly how much autonomy we can give them while keeping scope, verification and delivery under deterministic control.&lt;/p&gt;

&lt;p&gt;I built RepoMethod to keep that method in Git instead of inside one model-specific prompt. This post walks through the real ChatGPT demo and the repository-level delivery contract behind it.&lt;/p&gt;

&lt;p&gt;Which repository state is the agent actually working from? Which files is it allowed to touch? What counts as finished? What happens when the normal tests are green but the requested change violates the agreed scope?&lt;/p&gt;

&lt;p&gt;I built RepoMethod around one idea:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The agent can change, but the engineering method should stay in the repository.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I tested that with ChatGPT against a deliberately ordinary Fastify TypeScript service. The feature was simple: &lt;code&gt;GET /tasks&lt;/code&gt; already supported pagination, while &lt;code&gt;GET /items&lt;/code&gt; did not. ChatGPT had to bring &lt;code&gt;/items&lt;/code&gt; in line with the existing pattern.&lt;/p&gt;

&lt;p&gt;The interesting part was not the implementation. It was getting ChatGPT, GitHub, a local execution environment and a repository-owned delivery contract to work together for real.&lt;/p&gt;

&lt;p&gt;RepoMethod: &lt;a href="https://github.com/frederik-schmittel/repomethod" rel="noopener noreferrer"&gt;https://github.com/frederik-schmittel/repomethod&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo repository: &lt;a href="https://github.com/frederik-schmittel/repomethod-demo" rel="noopener noreferrer"&gt;https://github.com/frederik-schmittel/repomethod-demo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The first useful discovery: connected GitHub is not the same thing as a local checkout
&lt;/h2&gt;

&lt;p&gt;My first attempt failed for an environment reason.&lt;/p&gt;

&lt;p&gt;ChatGPT could access the connected GitHub repository, but the sandbox could not rely on a normal &lt;code&gt;git clone&lt;/code&gt;. Direct GitHub network access failed, so the agent could modify repository content remotely but could not execute the full local RepoMethod workflow.&lt;/p&gt;

&lt;p&gt;It correctly refused to fake success:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DELIVERY: blocked — Classic workflow state, handoff, agent-gate and deliver.sh could not be executed in the available runtime.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That failure exposed the right mental model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub connector
  authoritative remote state
        ↓
local working copy
  disposable execution environment
        ↓
RepoMethod
  repository-owned engineering contract
        ↓
verified result
        ↓
GitHub publication
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The transport between GitHub and the local workspace may change as ChatGPT evolves. The invariant is what matters: RepoMethod must execute against a real local Git working state that corresponds to a known remote revision.&lt;/p&gt;

&lt;h2&gt;
  
  
  The prompt that worked
&lt;/h2&gt;

&lt;p&gt;The successful run made that execution boundary explicit instead of assuming a normal clone would exist.&lt;/p&gt;

&lt;p&gt;This is the reusable pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Work on the connected GitHub repository `OWNER/REPO`.

Use the connected GitHub repository as the authoritative source for the current repository state.

Do not depend on `git clone` or direct GitHub network access working in the sandbox. Establish a local working copy from the current `main` state using the connected repository as the source of truth.

If that local workspace is not already a Git working tree, initialize Git and record the materialized `main` snapshot as the clean baseline before feature work. The repository method must operate against a real local Git working tree.

Read `AGENTS.md` and the installed RepoMethod instructions first. Follow the repository-owned method as authoritative.

Use RepoMethod Classic.

Implement FEATURE, using EXISTING_REFERENCE as the reference implementation.

Before writing implementation code:
- inspect the existing reference behavior and relevant tests
- create the RepoMethod feature spec
- initialize and follow the Classic workflow

Keep the change minimal.
Run the repository-defined verification and complete RepoMethod delivery.
Do not invent a substitute workflow or fabricate a delivery verdict.

Create a task branch from current `main`.
Only after successful RepoMethod delivery, commit and publish the verified feature state.
Do not create a pull request or merge anything.

Report the branch, remote commit SHA, verification result and final `DELIVERY:` verdict.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the demo, the concrete values were:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;repository&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;frederik-schmittel/repomethod-demo&lt;/span&gt;
&lt;span class="na"&gt;feature&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GET /items pagination&lt;/span&gt;
&lt;span class="na"&gt;reference&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GET /tasks&lt;/span&gt;
&lt;span class="na"&gt;feature slug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;items-pagination&lt;/span&gt;
&lt;span class="na"&gt;branch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;task/items-pagination&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That prompt does not tell ChatGPT how to implement pagination. The repository already contains that knowledge. The extra detail is about execution integrity: source state, local baseline, real RepoMethod execution and publication only after verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  The repository defined the real checks
&lt;/h2&gt;

&lt;p&gt;RepoMethod had already been installed and committed as part of the repository baseline.&lt;/p&gt;

&lt;p&gt;The repository verification command was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;npm run lint
npm run typecheck
npm test
npm run build
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That lived in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.repomethod/verify-command
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ChatGPT then read the repository instructions, inspected the existing &lt;code&gt;/tasks&lt;/code&gt; route and tests, created &lt;code&gt;specs/items-pagination.md&lt;/code&gt;, initialized RepoMethod Classic and implemented the smallest matching change in &lt;code&gt;/items&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The implementation itself was intentionally boring. It reused the existing pagination helpers instead of inventing a second pagination design.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first full gate failed — and that was useful
&lt;/h2&gt;

&lt;p&gt;The first RepoMethod verification did not pass immediately.&lt;/p&gt;

&lt;p&gt;The TypeScript implementation was fine, but the generated evidence report was not explicitly bound to the feature spec. RepoMethod rejected it as stale evidence and used the Classic retry path.&lt;/p&gt;

&lt;p&gt;After that evidence binding was corrected, the retry verification passed.&lt;/p&gt;

&lt;p&gt;This matters because RepoMethod was checking more than whether the application compiled. It was checking whether the repository's evidence, scope and acceptance contract were internally consistent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The successful run
&lt;/h2&gt;

&lt;p&gt;The repository checks passed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Test Files  4 passed (4)
Tests       21 passed (21)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then RepoMethod checked the delivery contract:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OK: 2 files in scope
OK: 5/5 acceptance criteria confirmed (5 strict)
OK: 2/2 evidence files present
OK: report names items-pagination.md
[agent-gate] all gates passed
exit_code=0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final delivery verdict was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DELIVERY: done — gate green, workflow completed, completion node succeeded, scope clean, fresh handoff, plan artifacts committed, no open blocker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The verified feature was then published to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task/items-pagination
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Published branch head:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;6b780da58592e4152eba3f9d3116ee375023532a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No pull request was created and nothing was merged.&lt;/p&gt;

&lt;p&gt;The important boundary is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT writes the implementation. The repository owns the delivery contract.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The more interesting test: green tests, blocked delivery
&lt;/h2&gt;

&lt;p&gt;After the valid feature was published, I deliberately asked ChatGPT for one additional change.&lt;/p&gt;

&lt;p&gt;The feature spec and scope had to remain unchanged. ChatGPT was told to add a short pagination note to &lt;code&gt;README.md&lt;/code&gt;, then rerun the same RepoMethod workflow without quietly expanding the scope.&lt;/p&gt;

&lt;p&gt;The ordinary engineering checks still passed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Test Files  4 passed (4)
Tests       21 passed (21)

[verify] npm run build
&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tsc &lt;span class="nt"&gt;-p&lt;/span&gt; tsconfig.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the repository-owned feature contract said &lt;code&gt;README.md&lt;/code&gt; was out of scope.&lt;/p&gt;

&lt;p&gt;RepoMethod returned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VIOLATION: README.md
exit_code=1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Final verdict:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DELIVERY: blocked — VIOLATION: README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The blocked change was not committed and was not pushed. The remote branch stayed on the last accepted commit.&lt;/p&gt;

&lt;p&gt;That was the strongest part of the experiment.&lt;/p&gt;

&lt;p&gt;The application was still correct. The tests were still green. But the requested change violated the committed engineering contract, so delivery stopped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Green tests were necessary, but they were not sufficient evidence that an autonomous coding agent had respected the task.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to reproduce the workflow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install RepoMethod into the repository.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;repomethod doctor
repomethod &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Define the repository's real verification commands in &lt;code&gt;.repomethod/verify-command&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Commit that installed/configured RepoMethod state so feature work starts from a clean Git baseline.&lt;/li&gt;
&lt;li&gt;Connect the repository to ChatGPT.&lt;/li&gt;
&lt;li&gt;Start a fresh chat and tell ChatGPT to treat GitHub as the authoritative remote state, establish a real local Git working state, read the repository instructions and use RepoMethod Classic.&lt;/li&gt;
&lt;li&gt;Give it the feature and an existing reference implementation where possible. Let the repository answer implementation details instead of encoding them all into the prompt.&lt;/li&gt;
&lt;li&gt;Require the real repository verification and real RepoMethod delivery workflow to execute.&lt;/li&gt;
&lt;li&gt;Only publish after the final result is actually:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DELIVERY: done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Compare the published branch against the pinned base if the environment had to use a non-standard publication path.&lt;/li&gt;
&lt;li&gt;To test the failure path, request an extra change outside the existing feature scope and explicitly forbid the agent from rewriting the spec to make the request legal. Then rerun delivery.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The useful distinction is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;repository tests green
≠
automatically acceptable delivery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What is stable, and what may change
&lt;/h2&gt;

&lt;p&gt;The exact ChatGPT mechanics used in this run are environment-specific. In this session, direct clone and push were unavailable, so the agent had to use the connected GitHub tooling to establish and publish the working state through a fallback path.&lt;/p&gt;

&lt;p&gt;A future ChatGPT version may make that much simpler.&lt;/p&gt;

&lt;p&gt;The method should not depend on that transport detail.&lt;/p&gt;

&lt;p&gt;The stable requirements are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;know the authoritative remote revision;&lt;/li&gt;
&lt;li&gt;execute against a real local Git baseline;&lt;/li&gt;
&lt;li&gt;read and follow the repository-owned method;&lt;/li&gt;
&lt;li&gt;run the repository's actual verification commands;&lt;/li&gt;
&lt;li&gt;let RepoMethod decide &lt;code&gt;done&lt;/code&gt; or &lt;code&gt;blocked&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;publish only the already verified result.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why I prefer keeping the engineering method in the repository rather than in a model-specific prompt.&lt;/p&gt;

&lt;p&gt;The agent ecosystem will keep changing. The repository is the durable boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;RepoMethod&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/frederik-schmittel/repomethod" rel="noopener noreferrer"&gt;https://github.com/frederik-schmittel/repomethod&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo repository&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/frederik-schmittel/repomethod-demo" rel="noopener noreferrer"&gt;https://github.com/frederik-schmittel/repomethod-demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Successful demo branch&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/frederik-schmittel/repomethod-demo/tree/task/items-pagination" rel="noopener noreferrer"&gt;https://github.com/frederik-schmittel/repomethod-demo/tree/task/items-pagination&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/KZkrTzIjGQc" rel="noopener noreferrer"&gt;https://youtu.be/KZkrTzIjGQc&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>programming</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
