<?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: alifurkan gökçe</title>
    <description>The latest articles on DEV Community by alifurkan gökçe (@alifurkangokce).</description>
    <link>https://dev.to/alifurkangokce</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%2F4113316%2F268dd4e4-d748-452f-8eab-7b1c4f6e5222.png</url>
      <title>DEV Community: alifurkan gökçe</title>
      <link>https://dev.to/alifurkangokce</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alifurkangokce"/>
    <language>en</language>
    <item>
      <title>My open-source project's first contribution came from an AI agent. It disclosed itself.</title>
      <dc:creator>alifurkan gökçe</dc:creator>
      <pubDate>Tue, 08 Sep 2026 06:20:53 +0000</pubDate>
      <link>https://dev.to/alifurkangokce/my-open-source-projects-first-contribution-came-from-an-ai-agent-it-disclosed-itself-25o1</link>
      <guid>https://dev.to/alifurkangokce/my-open-source-projects-first-contribution-came-from-an-ai-agent-it-disclosed-itself-25o1</guid>
      <description>&lt;p&gt;Last week I published a small open-source tool — a linter for the instruction files coding agents read (&lt;code&gt;CLAUDE.md&lt;/code&gt;, &lt;code&gt;AGENTS.md&lt;/code&gt;, skills). Then two things happened in two days, and together they changed how I think about reviewing contributions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first pull request wasn't from a human
&lt;/h2&gt;

&lt;p&gt;A PR appeared. Clean diff, two tests, and a scoping decision argued in a comment rather than silently made. The description ended with this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This pull request was implemented and validated autonomously by OpenAI Codex using the &lt;code&gt;LunaMeerkats&lt;/code&gt; account. No human review or authorship is being claimed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The change itself was a real bug in my code: my file walker skipped any directory whose name started with &lt;code&gt;.git&lt;/code&gt;, which also swallowed &lt;code&gt;.github&lt;/code&gt;. Since &lt;code&gt;.git&lt;/code&gt; was already in the ignore list, that prefix test only ever excluded &lt;code&gt;.github&lt;/code&gt; — leaving the Copilot instruction-file support unreachable since the day it shipped. Documented in my README, typed, wired up, and dead.&lt;/p&gt;

&lt;p&gt;What made it easy to merge wasn't the code, it was the reasoning. The PR claimed its change introduced no new findings, and argued &lt;em&gt;why&lt;/em&gt;: every other consumer of that walker is path- or basename-scoped, so widening the walk couldn't reach them. I verified it the hard way anyway — diffed the finding sets before and after on three real repositories, identical on all three — but I was checking a stated argument, not guessing at intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then a human read the source and filed eleven issues
&lt;/h2&gt;

&lt;p&gt;A day later someone went through the code and opened eleven issues. Not drive-by complaints: each one had a &lt;code&gt;file:line&lt;/code&gt; diagnosis, a repro, and often the fix. Two were serious. An unreadable &lt;code&gt;Makefile&lt;/code&gt; took the whole scan down with an unhandled exception — while the &lt;code&gt;package.json&lt;/code&gt; branch four lines above it was already wrapped in a &lt;code&gt;try&lt;/code&gt;. And &lt;code&gt;--fix&lt;/code&gt; wrote replacements through &lt;code&gt;String.replace&lt;/code&gt; with a string pattern, so a &lt;code&gt;$&amp;amp;&lt;/code&gt; or &lt;code&gt;$`&lt;/code&gt; in a path spliced surrounding text into the user's file instead of the text I'd shown them. A linter that silently corrupts the file it's checking is about the worst thing I could have shipped.&lt;/p&gt;

&lt;p&gt;All eleven are fixed. Two releases in a day, each regression test verified to fail on the unpatched source first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I took from it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Disclosed agent contributions can clear the bar, and the bar shouldn't move.&lt;/strong&gt; I reviewed that PR line by line, tested the claim it made about itself, and merged it on its merits. If it had been sloppy I'd have closed it, exactly as I would for a human. What made it reviewable was the disclosure plus an argument I could check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The most valuable thing a project receives isn't a star — it's someone who reads the source.&lt;/strong&gt; Mine had nine stars when a stranger sat down with it and found eleven real defects. No metric I track would have told me that much.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And the irony is doing work.&lt;/strong&gt; A tool that exists to stop agents from trusting stale information had its own bugs found by an agent and a careful human, in that order.&lt;/p&gt;

&lt;p&gt;The project is MIT and runs entirely locally: &lt;a href="https://github.com/alifurkangokce/driftlint" rel="noopener noreferrer"&gt;driftlint&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Curious how others are handling this: if a PR discloses that an agent wrote it, does that change your review, and should it?&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>devops</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Three ways your coding agent silently never reads your instructions</title>
      <dc:creator>alifurkan gökçe</dc:creator>
      <pubDate>Mon, 07 Sep 2026 06:53:57 +0000</pubDate>
      <link>https://dev.to/alifurkangokce/three-ways-your-coding-agent-silently-never-reads-your-instructions-1bgc</link>
      <guid>https://dev.to/alifurkangokce/three-ways-your-coding-agent-silently-never-reads-your-instructions-1bgc</guid>
      <description>&lt;p&gt;You write instructions for your coding agent. It ignores one of them. You rewrite it more forcefully, in bold, with "IMPORTANT" in front. It still ignores it.&lt;/p&gt;

&lt;p&gt;Before blaming the model, check whether it ever saw the text. Each of the three cases below is documented behaviour of a tool you already use, each one drops part of your instructions on the floor, and none of them prints a warning.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Cursor ignores &lt;code&gt;.md&lt;/code&gt; files in &lt;code&gt;.cursor/rules&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Project rules in Cursor must use the &lt;code&gt;.mdc&lt;/code&gt; extension. &lt;a href="https://cursor.com/docs/context/rules" rel="noopener noreferrer"&gt;Cursor's own docs&lt;/a&gt; put it plainly: a plain &lt;code&gt;.md&lt;/code&gt; file there is ignored by the rules system, because it has nowhere to declare the &lt;code&gt;description&lt;/code&gt;, &lt;code&gt;globs&lt;/code&gt; and &lt;code&gt;alwaysApply&lt;/code&gt; frontmatter that tells Cursor when to apply it.&lt;/p&gt;

&lt;p&gt;So a file sitting in exactly the right directory, with exactly the right content, does nothing. No error at startup, no "rule skipped" line, nothing in the UI.&lt;/p&gt;

&lt;p&gt;Ten-second check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find .cursor/rules &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;'*.md'&lt;/span&gt; 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any output is a rule that isn't loading. Rename to &lt;code&gt;.mdc&lt;/code&gt; and add the frontmatter.&lt;/p&gt;

&lt;p&gt;A detail that makes this worse: people who set up &lt;code&gt;.md&lt;/code&gt; rules a while ago report that they &lt;em&gt;used to&lt;/em&gt; work. If that's right, a working setup stopped working at some point during an update, and nothing announced it — so "I checked this once" is not protection.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Codex truncates your AGENTS.md files — as a set, not one by one
&lt;/h2&gt;

&lt;p&gt;Codex reads the AGENTS.md files that apply to your working directory: a global one, the repo root, and the nested ones on the path. It concatenates them, and the 32 KB truncation applies to &lt;strong&gt;that combined payload&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is the part that catches people, because every individual file looks fine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AGENTS.md              12 KB   ✓ fine
packages/api/AGENTS.md 12 KB   ✓ fine
packages/web/AGENTS.md 12 KB   ✓ fine
                       -----
                       36 KB   ✗ 4 KB never reaches the model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nobody wrote a "too big" file. The rule you carefully put at the bottom of the last one simply isn't there when the model reads.&lt;/p&gt;

&lt;p&gt;Check it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; AGENTS.md &lt;span class="nt"&gt;-not&lt;/span&gt; &lt;span class="nt"&gt;-path&lt;/span&gt; &lt;span class="s1"&gt;'*/node_modules/*'&lt;/span&gt; | xargs &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add your global &lt;code&gt;~/.codex/AGENTS.md&lt;/code&gt; to the total, and remember only the files on the path to your working directory get concatenated — a file under &lt;code&gt;packages/web&lt;/code&gt; doesn't count against you while you're working in &lt;code&gt;packages/api&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I hit a real one while testing this: a checkout with four AGENTS.md files totalling 65.6 KB, 33.6 KB of it truncated away, no single file anywhere near the limit.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Claude Code truncates skill descriptions at 1,536 characters
&lt;/h2&gt;

&lt;p&gt;Skills load their body on demand, which is the point — but the model only knows a skill exists from its listing, and &lt;a href="https://code.claude.com/docs/en/skills" rel="noopener noreferrer"&gt;the docs are specific&lt;/a&gt;: the combined &lt;code&gt;description&lt;/code&gt; and &lt;code&gt;when_to_use&lt;/code&gt; text is truncated at &lt;strong&gt;1,536 characters&lt;/strong&gt; in that listing.&lt;/p&gt;

&lt;p&gt;Write a thorough description with five trigger examples and the last two are gone. The skill still exists, still works when invoked by name, and quietly stops being chosen on its own — which reads exactly like "the model is being lazy".&lt;/p&gt;

&lt;p&gt;Put the key use case in the first sentence. Detail belongs in the body, which costs nothing until the skill runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern
&lt;/h2&gt;

&lt;p&gt;All three share a shape worth internalising: &lt;strong&gt;the failure is invisible from the inside.&lt;/strong&gt; Your file is on disk. Your editor shows it. Code review shows it. The agent read a subset of it and had no way to tell you which part.&lt;/p&gt;

&lt;p&gt;Regular documentation rots the same way, but a human reader notices when a doc is stale — the paths look wrong, the commands don't exist any more. An agent doesn't notice. It follows the text with complete confidence, including the part that stopped being true in March.&lt;/p&gt;

&lt;p&gt;That second half is measurable. I scanned 118 popular open-source repositories with agent context files: &lt;strong&gt;59% contained at least one hard dead reference&lt;/strong&gt; — a file path or a script the instructions still name and the repo no longer has. Careful teams, well-maintained projects; the rot is just silent.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to actually do
&lt;/h2&gt;

&lt;p&gt;The manual checks above take a minute and catch a lot. Beyond that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep one source of truth for CLAUDE.md and AGENTS.md. Claude Code reads the first, most other tools read the second, and &lt;a href="https://github.com/anthropics/claude-code/issues/6235" rel="noopener noreferrer"&gt;asking for both is the most-upvoted request on the Claude Code tracker&lt;/a&gt; — 5,200+ reactions, marked &lt;em&gt;not planned&lt;/em&gt;. An &lt;code&gt;@AGENTS.md&lt;/code&gt; import inside CLAUDE.md works; a symlink works when the content is genuinely identical; two hand-maintained copies drift within a week.&lt;/li&gt;
&lt;li&gt;Treat instruction files as code: they make claims about paths, scripts and links that CI can verify.&lt;/li&gt;
&lt;li&gt;Re-check after tool updates, not just after your own edits. Case 1 is the reason.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the automated version I wrote &lt;a href="https://github.com/alifurkangokce/driftlint" rel="noopener noreferrer"&gt;driftlint&lt;/a&gt; (disclosure: mine, MIT, zero runtime dependencies, no account, nothing leaves your machine):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @alifurkangokce/driftlint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It checks all three limits above plus the drift half: dead file paths with did-you-mean fixes, removed npm scripts and make targets, markdown links whose target or heading moved, hooks and MCP servers pointing at scripts that don't exist, and CLAUDE.md ↔ AGENTS.md copies that have diverged.&lt;/p&gt;

&lt;p&gt;But the tool is secondary. The idea worth keeping is the first one: when an agent ignores an instruction, check whether it was ever handed the instruction. Half the time, it wasn't.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
