Clean Code Gauntlet
Effort: heavy — असली compute: coverage और complexity runs, साथ में एक bounded mutation pass, फिर एक taste model; इसे ship होने वाले बदलावों पर खर्च करें। हटाता है: पूरे diffs की line-by-line इंसानी review, और वे fake-green tests जिनके पीछे regression छिप जाता है।
यह क्यों है
गंदा code agents को भटकाता है, और लंबे prompt में दबे नियम context के बीच में
धुँधला जाते हैं — deterministic जाँचें कभी नहीं धुँधलातीं। इसलिए Clean Code को
एक gauntlet की तरह चलाओ जिसे code को पार करना है, गद्य की तरह नहीं जिसे
model को याद रखना है।
नापो, review मत करो। उन नंबरों पर gate लगाओ जो tool गिनता है: coverage,
cyclomatic complexity (किसी function के अंदर से गुज़रते स्वतंत्र रास्तों की गिनती),
module का size, mutation kills। इंसान और model सिर्फ नमूने audit करते हैं —
पूरे diffs कभी नहीं।
चेन (क्रम में चलाओ; हर stage नाकामी पर ज़ोर से रुकती है)
- Sniper tests green. सिर्फ वे test files चलाओ जो diff के छुए हिस्से को cover
करती हैं — देखो sniper-testing। Red baseline का
मतलब है रुको और ठीक करो; red पर कभी mutate या grade मत करो।
- CRAP threshold के नीचे असली coverage data पर (नीचे gate देखो)।
पार हुआ → function को refactor करके नीचे लाओ, या उसे पूरा cover करो। Bar कभी
नीचे मत करो।
- Mutation testing: scope में शून्य survivors. Survivor TESTS को दोषी ठहराता
है, code को नहीं — उस test को मज़बूत करो जिसे उसे पकड़ना चाहिए था।
- हल्का taste review — model सिर्फ वही परखता है जो नंबर नहीं परख सकते।
यह गिनने वाले tools
| Stack |
Tools |
| Python |
coverage.py + radon + mutmut |
| JS/TS |
c8 (या istanbul) + Stryker |
| Go |
go test -cover + gocyclo + go-mutesting |
| Rust |
cargo-tarpaulin + cargo-mutants |
| Java |
JaCoCo + PIT |
| बाक़ी |
कोई भी coverage % + कोई भी cyclomatic-complexity counter |
हर stage का एक command आकार:
- Coverage:
coverage run -m pytest <sniper files> && coverage report (JS/TS: npx c8 vitest run <files>)
- Complexity:
radon cc -s <changed files>
- Mutation:
mutmut run --paths-to-mutate <changed files> (JS/TS: npx stryker run --mutate "<glob>")
CRAP gate
CRAP(m) = comp(m)^2 * (1 - cov(m)/100)^3 + comp(m)
- 100% coverage पर score सिमटकर ख़ुद complexity रह जाता है।
- 30 क्लासिक "crappy" रेखा है (शून्य coverage पर complexity 5 वहाँ पहुँच जाती है)।
- इंसान हर function में मोटे तौर पर 4–5 complexity रखते हैं। Agent 6–8 SIRF
क़रीब-100% coverage पर रख सकता है — वो ढील coverage से चुकती है।
- High-CRAP function के ठीक दो ही निकास हैं: refactor करके नीचे लाओ, या पूरा
cover करो। Pass होने के लिए threshold कभी नीचे मत करो।
क़र्ज़ किसका है — AUTHORED / WORSENED / UNCHANGED
Absolute score छिपा देता है कि क़र्ज़ किसका है। हर complexity और CRAP delta को
बदलाव-से-पहले वाले baseline के आगे बाँटो:
- AUTHORED — functions जो इस बदलाव ने बनाए। पूरी bar लागू।
- WORSENED — पहले से मौजूद functions जिन्हें इस बदलाव ने बदतर किया। Delta
इसी बदलाव के खाते में; उसे baseline पर या उससे बेहतर लौटना ही है।
- UNCHANGED — पहले से मौजूद क़र्ज़ जिसे बदलाव ने छुआ ही नहीं। Report करो, file
करो, इस बदलाव के खाते में कभी मत डालो — और इसे gauntlet टालने का बहाना भी कभी
मत बनाओ।
Mutation के नियम (सीमित, कभी लापरवाह नहीं)
- साझा working tree कभी नहीं। Committed HEAD से काटे गए scratch checkout में
mutate करो। Target या test files गंदी हैं = मना करो; पहले commit।
- Cost नापी जाती है, कभी मानी नहीं जाती। Scoped suite को एक बार time करो,
कुछ भी ख़र्चने से PEHLE ETA = baseline x mutant count report करो। Dry run की
पेशकश करो।
- सीमित और resumable. Mutants और मिनटों पर सीमा। Budget-रोक एक checkpoint के
साथ pause है, failure नहीं — resume करके पूरा करो।
- Coverage-first. सिर्फ covered lines mutate करो; uncovered line एक coverage
gap है जिसे CRAP gate पहले ही पकड़ चुका।
- सिर्फ scope में। जो diff ने छुआ वही mutate करो, पूरा repo कभी नहीं।
- सचमुच equivalent mutant को मारने की जगह खंडित किया जा सकता है — खंडन लिखकर,
कभी चुपचाप skip करके नहीं।
- आपके stack के लिए कोई mutation tool नहीं? Landing report में वो दर्ज करो और
CRAP gate पर टिको — चुपचाप skip कभी नहीं।
Taste review (आख़िर में, और हल्का)
Deterministic gates पहले चलते हैं; model वहीं ख़र्चो जहाँ reasoning ही इकलौता
औज़ार है। Reviewer builder से अलग family का model है — builder अपना काम खुद कभी
grade नहीं करता। वो सिर्फ design और taste परखता है: naming, गड्ड-मड्ड concerns,
interface की चौड़ाई, और छह smells — rigidity, fragility, immobility, needless
complexity, needless repetition, opacity. हिसाब-किताब gates पहले ही निपटा चुके।
Review जो craft floor थामे रखता है: functions छोटे, एक काम करते हुए, कम
arguments, कोई flag arguments नहीं, ईमानदार नाम; deep modules — छोटा interface
जो असली logic छिपाए; tests तेज़, स्वतंत्र, दोहराने लायक, हर एक में एक behavior
assert.
सख़्त नियम (कोई एक टूटा तो skill fail)
- Pass निकलवाने के लिए threshold नीचे करना या mutation set कमज़ोर करना — कभी नहीं।
- साझा working tree को mutate करना, या बेलगाम चलाना — कभी नहीं।
- UNCHANGED क़र्ज़ मौजूदा बदलाव के खाते में डालना — कभी नहीं।
- जो test fail हो ही नहीं सकता वो theater है — mutation testing ही साबित करती है
कि कौन से tests असली हैं।
- असली cost बताओ — machine का समय सस्ता है, regressions नहीं। घंटा बचाने के लिए
green कभी मत गढ़ो।
इनके साथ अच्छा चलता है
Scaffold credit: Robert C. Martin, Clean Code (2008); Alberto Savoia &
Bob Evans, the CRAP metric (2007); John Ousterhout, deep modules
(A Philosophy of Software Design, 2018); Pocock, M., & Martin, R. C.
(2026, Aug 19). LIVE: Uncle Bob on Software Fundamentals in the Age of AI
[Video]. YouTube. https://www.youtube.com/watch?v=zcLPGC-tvgk — source of
the agent CRAP band and coverage-first mutation. The composition and hard
rules here are BACKS AIOS.
1---2name: clean-code-gauntlet-53description: तब इस्तेमाल करें जब कोई भी build — agent, service, library — hardened या land करनी हो और line-by-line review की जगह एक deterministic quality bar चाहिए; sniper tests, CRAP score (complexity x coverage) और bounded mutation testing चलाता है, फिर हल्का taste review. Trigger words: clean code, gauntlet, unc, uncle bob, crap score, crap, mutation testing, harden, complexity, coverage, quality bar, साफ़ code, गुणवत्ता की कसौटी, सख़्त जाँच.4license: MIT5---67# Clean Code Gauntlet8**Effort:** heavy — असली compute: coverage और complexity runs, साथ में एक bounded mutation pass, फिर एक taste model; इसे ship होने वाले बदलावों पर खर्च करें। हटाता है: पूरे diffs की line-by-line इंसानी review, और वे fake-green tests जिनके पीछे regression छिप जाता है।910## यह क्यों है1112गंदा code agents को भटकाता है, और लंबे prompt में दबे नियम context के बीच में13धुँधला जाते हैं — deterministic जाँचें कभी नहीं धुँधलातीं। इसलिए Clean Code को14**एक gauntlet की तरह चलाओ जिसे code को पार करना है**, गद्य की तरह नहीं जिसे15model को याद रखना है।1617**नापो, review मत करो।** उन नंबरों पर gate लगाओ जो tool गिनता है: coverage,18cyclomatic complexity (किसी function के अंदर से गुज़रते स्वतंत्र रास्तों की गिनती),19module का size, mutation kills। इंसान और model सिर्फ नमूने audit करते हैं —20पूरे diffs कभी नहीं।2122## चेन (क्रम में चलाओ; हर stage नाकामी पर ज़ोर से रुकती है)23241. **Sniper tests green.** सिर्फ वे test files चलाओ जो diff के छुए हिस्से को cover25 करती हैं — देखो [sniper-testing](../sniper-testing/SKILL.md)। Red baseline का26 मतलब है रुको और ठीक करो; red पर कभी mutate या grade मत करो।272. **CRAP threshold के नीचे** असली coverage data पर (नीचे gate देखो)।28 पार हुआ → function को refactor करके नीचे लाओ, या उसे पूरा cover करो। Bar कभी29 नीचे मत करो।303. **Mutation testing: scope में शून्य survivors.** Survivor TESTS को दोषी ठहराता31 है, code को नहीं — उस test को मज़बूत करो जिसे उसे पकड़ना चाहिए था।324. **हल्का taste review** — model सिर्फ वही परखता है जो नंबर नहीं परख सकते।3334## यह गिनने वाले tools3536| Stack | Tools |37| --- | --- |38| Python | coverage.py + radon + mutmut |39| JS/TS | c8 (या istanbul) + Stryker |40| Go | go test -cover + gocyclo + go-mutesting |41| Rust | cargo-tarpaulin + cargo-mutants |42| Java | JaCoCo + PIT |43| बाक़ी | कोई भी coverage % + कोई भी cyclomatic-complexity counter |4445हर stage का एक command आकार:46- Coverage: `coverage run -m pytest <sniper files> && coverage report` (JS/TS: `npx c8 vitest run <files>`)47- Complexity: `radon cc -s <changed files>`48- Mutation: `mutmut run --paths-to-mutate <changed files>` (JS/TS: `npx stryker run --mutate "<glob>"`)4950## CRAP gate5152```53CRAP(m) = comp(m)^2 * (1 - cov(m)/100)^3 + comp(m)54```5556- 100% coverage पर score सिमटकर ख़ुद complexity रह जाता है।57- 30 क्लासिक "crappy" रेखा है (शून्य coverage पर complexity 5 वहाँ पहुँच जाती है)।58- इंसान हर function में मोटे तौर पर 4–5 complexity रखते हैं। Agent 6–8 SIRF59 क़रीब-100% coverage पर रख सकता है — वो ढील coverage से चुकती है।60- High-CRAP function के ठीक दो ही निकास हैं: refactor करके नीचे लाओ, या पूरा61 cover करो। **Pass होने के लिए threshold कभी नीचे मत करो।**6263## क़र्ज़ किसका है — AUTHORED / WORSENED / UNCHANGED6465Absolute score छिपा देता है कि क़र्ज़ किसका है। हर complexity और CRAP delta को66बदलाव-से-पहले वाले baseline के आगे बाँटो:6768- **AUTHORED** — functions जो इस बदलाव ने बनाए। पूरी bar लागू।69- **WORSENED** — पहले से मौजूद functions जिन्हें इस बदलाव ने बदतर किया। Delta70 इसी बदलाव के खाते में; उसे baseline पर या उससे बेहतर लौटना ही है।71- **UNCHANGED** — पहले से मौजूद क़र्ज़ जिसे बदलाव ने छुआ ही नहीं। Report करो, file72 करो, इस बदलाव के खाते में कभी मत डालो — और इसे gauntlet टालने का बहाना भी कभी73 मत बनाओ।7475## Mutation के नियम (सीमित, कभी लापरवाह नहीं)7677- **साझा working tree कभी नहीं।** Committed HEAD से काटे गए scratch checkout में78 mutate करो। Target या test files गंदी हैं = मना करो; पहले commit।79- **Cost नापी जाती है, कभी मानी नहीं जाती।** Scoped suite को एक बार time करो,80 कुछ भी ख़र्चने से PEHLE ETA = baseline x mutant count report करो। Dry run की81 पेशकश करो।82- **सीमित और resumable.** Mutants और मिनटों पर सीमा। Budget-रोक एक checkpoint के83 साथ pause है, failure नहीं — resume करके पूरा करो।84- **Coverage-first.** सिर्फ covered lines mutate करो; uncovered line एक coverage85 gap है जिसे CRAP gate पहले ही पकड़ चुका।86- **सिर्फ scope में।** जो diff ने छुआ वही mutate करो, पूरा repo कभी नहीं।87- सचमुच equivalent mutant को मारने की जगह खंडित किया जा सकता है — खंडन लिखकर,88 कभी चुपचाप skip करके नहीं।89- **आपके stack के लिए कोई mutation tool नहीं?** Landing report में वो दर्ज करो और90 CRAP gate पर टिको — चुपचाप skip कभी नहीं।9192## Taste review (आख़िर में, और हल्का)9394Deterministic gates पहले चलते हैं; model वहीं ख़र्चो जहाँ reasoning ही इकलौता95औज़ार है। Reviewer builder से अलग family का model है — builder अपना काम खुद कभी96grade नहीं करता। वो सिर्फ design और taste परखता है: naming, गड्ड-मड्ड concerns,97interface की चौड़ाई, और छह smells — rigidity, fragility, immobility, needless98complexity, needless repetition, opacity. हिसाब-किताब gates पहले ही निपटा चुके।99100Review जो craft floor थामे रखता है: functions छोटे, एक काम करते हुए, कम101arguments, कोई flag arguments नहीं, ईमानदार नाम; deep modules — छोटा interface102जो असली logic छिपाए; tests तेज़, स्वतंत्र, दोहराने लायक, हर एक में एक behavior103assert.104105## सख़्त नियम (कोई एक टूटा तो skill fail)106107- Pass निकलवाने के लिए threshold नीचे करना या mutation set कमज़ोर करना — कभी नहीं।108- साझा working tree को mutate करना, या बेलगाम चलाना — कभी नहीं।109- UNCHANGED क़र्ज़ मौजूदा बदलाव के खाते में डालना — कभी नहीं।110- जो test fail हो ही नहीं सकता वो theater है — mutation testing ही साबित करती है111 कि कौन से tests असली हैं।112- असली cost बताओ — machine का समय सस्ता है, regressions नहीं। घंटा बचाने के लिए113 green कभी मत गढ़ो।114115## इनके साथ अच्छा चलता है116117- [sniper-testing](../sniper-testing/SKILL.md) — stage 1 के लिए test का दायरा चुनता है118- [red-first](../red-first/SKILL.md) — हर build से पहले आने वाला failing contract119- [blind-eval](../blind-eval/SKILL.md) — जब सवाल taste हो, तब keep-or-revert120- [blind-tribunal](../blind-tribunal/SKILL.md) — उतरने से पहले भरा-पूरा graded verdict121122> Scaffold credit: Robert C. Martin, *Clean Code* (2008); Alberto Savoia &123> Bob Evans, the CRAP metric (2007); John Ousterhout, deep modules124> (*A Philosophy of Software Design*, 2018); Pocock, M., & Martin, R. C.125> (2026, Aug 19). LIVE: Uncle Bob on Software Fundamentals in the Age of AI126> [Video]. YouTube. https://www.youtube.com/watch?v=zcLPGC-tvgk — source of127> the agent CRAP band and coverage-first mutation. The composition and hard128> rules here are BACKS AIOS.