An agent skill for writing and revising work messages the way Turkish IT people (developers, analysts, testers) write them, in Turkish and in English, without changing what the message says.
Türkçe, İngilizce, devce: yazılımcıların konuştuğu dil. Türkçe özet aşağıda.
Coding agents write technically correct Turkish that no Turkish developer would send:
| An agent writes | A developer writes |
|---|---|
| Dağıtım sonrasında önbelleği temizlediğimizde sorun çözüldü. | Deploy sonrası cache'i temizleyince düzeldi. |
| İşlem hattı başarısız olmuş, günlükleri inceliyorum. | Pipeline fail olmuş, loglara bakıyorum. |
| Söz konusu hata, bağlantı havuzunun tükenmesinden kaynaklanmaktadır. | Hata connection pool'un dolmasından kaynaklanıyor. |
And English that is correct but reads like a textbook or a press release:
| Before | After |
|---|---|
| Actually I have checked the logs and I think this problem is happening because cache is not cleared after deployment. | Checked the logs. I think this happens because the cache isn't cleared after deployment. |
| It is important to note that the service does not retry failed requests. | The service doesn't retry failed requests. |
It is as much about what it leaves alone:
| Input | Output |
|---|---|
| localde çalışıyor ama CI'da patlıyor, env farkı olabilir | unchanged |
| Checked the logs. Cache is stale. | unchanged |
| We should consider adding an index; the query might be doing a full scan. | unchanged ("should consider" is not "need to", "might" is not "is") |
| PR'yi merge etmeden önce testleri bekleyelim. | unchanged (your team's "PR'yi" is as valid as "PR'ı") |
| Önbellek süresi varsayılan olarak 60 saniyedir. | unchanged in documentation, where Turkish terms belong |
It covers commit messages, PR descriptions, review comments, issues, Jira tickets, Slack and Teams messages, incident notes, and translation of these between Turkish and English.
- Not an AI-detector evasion tool. Nothing in it is aimed at detectors.
- Not a "humanizer" that adds typos, slang or hesitation. The target is a competent colleague.
- Not a translator of English terms into Turkish, or of Turkish words into English. Which terms stay English is taken from how developers write, and everyday words (hata, dosya, sürüm, düzeltmek) stay Turkish.
- Not a style enforcer. Where Turkish developers vary (
commit'iorcommiti,PR'ıorPR'yi,merge ettimormergeledim), your variant stands. - Not a general Turkish writing skill. For articles and blog posts, look at turkish-humanify.
Claude Code, as a plugin:
/plugin marketplace add Murat7Ay/devce
/plugin install devce@devce
Any agent that reads SKILL.md skills (Codex, Cursor, Gemini CLI, Copilot, opencode and others):
npx skills add Murat7Ay/devcegh skill install Murat7Ay/devceOr copy skills/devce/ into your agent's skills directory (~/.claude/skills/, ~/.agents/skills/ or the project's .agents/skills/).
The fidelity checker needs Python 3.8 or later and nothing else. The skill works without it; the agent then checks by hand.
The skill loads when you ask an agent to write, fix or translate a developer message:
- "Bunu Slack'e yazacağım, bir bakar mısın?"
- "Bu değişiklikler için commit mesajı yaz."
- "Fix my English, this is a review comment."
- "Bunu global ekibin kanalına İngilizce yazmam lazım."
Say where the text is going. The same sentence is right for Slack and wrong for a customer email.
Where usage varies, the skill follows what it sees in your messages and repository. To make it certain, put your conventions in the project's CLAUDE.md or AGENTS.md:
## Team writing conventions
- Commit messages: English, Conventional Commits.
- Slack and PR comments: Turkish.
- We write PR'ı / PR'a, and apostrophes on English terms (commit'i, branch'e).If you only want the core behaviour, this paragraph in CLAUDE.md or AGENTS.md gets a good part of it:
## Writing messages for me
- In Turkish, keep English workflow terms with Turkish suffixes (PR'ı açtım, cache'i
temizleyince düzeldi, pipeline fail olmuş). Everyday words stay Turkish (hata, dosya,
sürüm, düzeltmek, güncellemek). No "çekme isteği", "önbellek", "yerelde" outside documentation.
- In English, be short and plain. No openers, no closing summary, no headers in a short message.
- If my text is already short and clear, leave it exactly as it is.
- Never change certainty (olabilir, galiba, -mış, might, I think), obligation (should consider
vs need to), numbers, identifiers, or who did what.
- Keep my own spelling of suffixes and my own level of formality.The skill adds the term data, the suffix and verb rules, the mapping of Turkish certainty markers to English, the channel conventions and the checker.
One procedure, in skills/devce/SKILL.md:
- Context: language, channel, and the conventions already in use.
- Triage: decide whether anything needs to change. Often nothing does.
- Lock: note what cannot change: literals, certainty, obligation, who did what, time, scope, tone.
- Edit: only for a named rule. Rules are marked fix, keep (your variant stands) or default (used only when drafting).
- Audit: compare original and result claim by claim, and run the checker on longer text.
The language rules live in two reference files that are loaded only when that language is being written, so the skill costs little context.
scripts/check_fidelity.py compares an original with its rewrite. A changed code span, URL, path, identifier, number or quoted string is an error. A change in certainty, obligation, negation or approximation markers, in Turkish or English, is a warning:
$ python skills/devce/scripts/check_fidelity.py original.txt rewrite.txt
FAIL 2 errors, 1 warnings, 30% of words changed
error number changed or removed: 60
error number added: 30
warning uncertainty removed: original has olabilir; rewrite has none
Here the original said "60 saniyeye düşürüldü ... olabilir" and the rewrite said "30 saniyeye düşürüldü" with the hedge gone.
The term rules are based on counts, not on impressions. In a sample of 3,962 Turkish issue and PR threads from GitHub written before 2022:
| Developers write | Text units | Rather than | Text units |
|---|---|---|---|
| PR, pull request | 434 | çekme isteği | 14 |
| branch | 129 | dal | 13 |
| cache | 49 | önbellek | 4 |
| endpoint | 51 | uç nokta | 5 |
| hata | 2,004 | error | 176 |
| düzeltmek | 738 | fixlemek | 35 |
The sample stops before 2022 because Turkish text on GitHub since 2025 is dominated by agent-written PR bodies. Issue-search hits for "yerelde" went from 34 before 2022 to 4,506 from 2025 on; "localde" went from 325 to 111.
What you should know before relying on it:
- The sample is public GitHub text, biased toward chatty threads and student projects. Private Slack usage could not be observed. Some spoken collocations (deploy almak, log basmak) are marked as unverified in the rules.
- Every rule carries an evidence label: measured, sourced, or practitioner knowledge. The English rules specific to Turkish speakers are mostly the last kind; research on Turkish developers' English does not exist.
- Naturalness has not been validated by a panel of Turkish developers. The evals below measure whether meaning survives and whether good text is left alone, not whether the result sounds right to you.
- The checker cannot prove that meaning is preserved. It catches changed literals reliably and flags changed certainty words for a second look.
The full research report, including what was rejected and why, is in docs/RESEARCH.md.
67 cases across Turkish IT topics, developer English, already-good input, translation, drafting and adversarial input. Three gates, all deterministic: fidelity, restraint, target. See evals/README.md.
First results, cases passing all gates out of 67:
| Model | Without skill | With skill |
|---|---|---|
| Claude Sonnet | 49 | 65 and 67 (two runs) |
| Claude Haiku | 36 | 53, 47 and 52 (three runs) |
Without the skill, the commonest failure on both models was rewriting text that was already fine. With it, Sonnet passed all or nearly all cases; Haiku improved but stayed unreliable, so use a stronger model for this skill.
These are early numbers with real limits: the skill was revised between runs using failures from the same cases, each run handled all cases in one agent context, baselines were run once, and only one Turkish developer has reviewed a sample of outputs for naturalness so far. Details and the outputs themselves are in evals/README.md and evals/runs/.
skills/devce/ the skill: SKILL.md, references/, scripts/check_fidelity.py
evals/ cases, reference outputs, grader, runner, trigger queries, first run outputs
tests/ unit tests for the checker
research/ corpus builder, term counter, counts
docs/RESEARCH.md research report and architecture decision
Agent'lar Türkçe yazınca ortaya "çekme isteği", "önbellek", "yerelde çalışıyor", "-mektedir" gibi şeyler çıkıyor. Dil bilgisi doğru ama kimse böyle yazmıyor. İngilizce yazınca da uzun, resmi, ders kitabı gibi oluyor.
devce bunu düzeltmek için yazılmış bir skill:
- Türkçe mesajlarda workflow terimleri İngilizce kalır, ekler okunuşa göre gelir: "PR'ı açtım", "cache'i temizleyince düzeldi". Gündelik kelimeler Türkçe kalır: hata, dosya, sürüm, düzeltmek.
- İngilizce mesajlar kısa ve sade olur.
- Zaten düzgün olan metne dokunmaz.
- Anlamı değiştirmez: "olabilir" "kesin" olmaz, "bakabiliriz" "bakmamız lazım" olmaz, "fail olmuş" "fail oldu" olmaz. Sayılar, identifier'lar, URL'ler aynen kalır.
- Ekibin yazım tercihine karışmaz: "commit'i" de olur "commiti" de, "PR'ı" da olur "PR'yi" de.
Kötü bir çıktı görürseniz issue açın: ne yazdınız, ne geldi, siz olsanız ne yazardınız. Detaylar CONTRIBUTING.md içinde.
See CONTRIBUTING.md. Reports from Turkish developers of outputs that sound wrong, or that changed the meaning, are the most valuable contribution.