JIMDRURY.
Jim Drury
Flat pink editorial graphic of a read-only CI instruments window with complexity, coverage and mutation gauges under a padlock, kept behind a dashed trust boundary from a stippled sphere labelled agent
agents

Uncle Bob stopped reading code. Fine, but who owns the instruments?

9 MIN READ
- Robert C. Martin (@unclebobmartin), 1 Oct 2026, on X

What he actually said (it's more sensible than the headline)

A TypeScript aside

The instruments are files, and the agents edit files

- Qin, Schmotz et al., ELLIS Institute Tübingen, LLM Agents Can Easily Tamper With Their Own Traces, arXiv, 24 Sep 2026
Where the dials should live

Scroll or pinch to zoom. Drag to pan. Use the zoom in, zoom out, and fit buttons to adjust the view from the keyboard.

flowchart LR
  subgraph host["Agent host: the agents can write here"]
    A["Coding agent"] --> R["Repo: src and tests"]
    A --> L["Local session trace"]
  end
  subgraph outside["Outside the agents' reach"]
    CI["CI computes complexity, coverage and mutation score"]
    O["CODEOWNERS review on instrument files"]
    G["Gateway log of every model call"]
  end
  R -- "pull request" --> CI
  R -- "touches lint, test or CI config" --> O
  A -- "model API calls" --> G

Rendering diagram…

The agents can propose changes to anything on the left. Only humans should be able to change what's on the right.

What I'd lock down

CODEOWNERS: the agents propose, a human approves
# Instrument files belong to humans.
# Pair this with branch protection: "Require review from Code Owners".
/eslint.config.js        @your-org/eng-leads
/tsconfig*.json          @your-org/eng-leads
/vitest.config.ts        @your-org/eng-leads
/stryker.config.mjs      @your-org/eng-leads
/.github/workflows/      @your-org/eng-leads
/.github/CODEOWNERS      @your-org/eng-leads
eslint.config.js: Uncle Bob's agent threshold, written down
// eslint.config.js
import tseslint from "typescript-eslint";

export default tseslint.config(...tseslint.configs.strict, {
  rules: {
    // Humans get 4, agents get 10 (his numbers). Pick yours, then lock the file.
    complexity: ["error", { max: 10 }],
    "max-depth": ["error", 4],
    "@typescript-eslint/no-explicit-any": "error",
    "@typescript-eslint/ban-ts-comment": [
      "error",
      { "ts-expect-error": "allow-with-description" },
    ],
  },
});
<The AGENTS.md line I'd add anyway>

Never edit eslint.config.js, tsconfig*.json, vitest.config.ts, stryker.config.mjs, .github/CODEOWNERS or anything under .github/workflows to make a check pass. If a threshold looks wrong, stop and say so in the PR description, with the number you'd propose and why.

</The AGENTS.md line I'd add anyway>

Thoughts

Similar Articles