Clean Code Standard
This skill is the authoritative clean code standard for this repository's shared skills. It defines stable rule IDs (CC-*), how to apply them in reviews, and how to extend them safely via language overlays and explicit exceptions.
Modern Best Practices: Prefer small, reviewable changes and durable change context. Use BCP 14 normative language consistently (RFC 2119 + RFC 8174). Treat security-by-design and secure defaults as baseline (OWASP Top Ten 2025, NIST SSDF). Prefer GitHub rulesets over branch-protection-only governance. Build observable systems with OpenTelemetry. For current tool choices, consult data/sources.json and prefer official docs first.
Judgment over dogma: This standard's CC-* rules are durable (coupling/cohesion, naming, small interfaces, explicit errors). Numeric folklore — hard function-length caps, "comments are a smell," DRY applied absolutely — is not. Robert C. Martin's Clean Code (2nd ed., 2025) and John Ousterhout's A Philosophy of Software Design disagree in a published, public debate on function size and commenting (see references/code-quality-operational-playbook.md § 14); apply the rule ID's intent, not a book's specific numeric prescription, and know when not to refactor (§ 14.3 of the same reference).
Quick Reference
| Task |
Tool/Framework |
Command |
When to Use |
| Cite a standard |
CC-* rule ID |
N/A |
PR review comments, design discussions, postmortems |
| Categorize feedback |
CC-NAM, CC-ERR, CC-SEC, etc. |
N/A |
Keep feedback consistent without "style wars" |
| Add stack nuance |
Language overlay |
N/A |
When the base rule is too generic for a language/framework |
| Allow an exception |
Waiver record |
N/A |
When a rule must be violated with explicit risk |
| Reuse shared checklists |
assets/checklists/ |
N/A |
When you need product-agnostic review/release checklists |
| Reuse utility patterns |
references/*-utilities.md |
N/A |
When extracting shared auth/logging/errors/resilience/testing utilities |
When to Use This Skill
- Defining or enforcing clean code rules across teams and languages.
- Reviewing code: cite
CC-* IDs and avoid restating standards in reviews.
- Building automation: map linters/CI gates to
CC-* IDs.
- Resolving recurring review debates: align on rule IDs, scope, and exceptions.
When NOT to Use This Skill
Workflow
- Decide whether the request is about a base rule, an overlay, or an exception.
- Route security, review-process, or refactoring mechanics to the adjacent skill if that is the real problem.
- Anchor the guidance in existing
CC-* rules before proposing new wording or automation.
- Apply the relevant standard, overlay, or waiver pattern with explicit scope and rationale.
- Cross-check against the navigation references before adding or revising durable standards.
Rule Application Checklist
When citing or enforcing CC-* rules in a review:
ASCII Flow
Clean-code request
-> Identify behavior that must stay unchanged
-> Find duplication, unclear boundaries, or unsafe complexity
-> Refactor in the smallest coherent slice
-> Preserve public contracts and naming consistency
-> Add or adjust tests for changed control flow
-> Run focused verification and report residual risk
Decision Tree: Base Rule vs Overlay vs Exception
Feedback needed: [What kind of guidance is this?]
├─ Universal, cross-language rule? → Add/modify `CC-*` in `references/clean-code-standard.md`
│
├─ Language/framework-specific nuance? → Add overlay entry referencing existing `CC-*`
│
└─ One-off constraint or temporary tradeoff?
├─ Timeboxed? → Add waiver with expiry + tracking issue
└─ Permanent? → Propose a new rule or revise scope/exception criteria
Optional: AI/Automation
- Map automation findings to
CC-* IDs (linters, SAST, dependency scanning) so humans can review impact, not tooling noise.
- Keep AI-assisted suggestions advisory; human reviewers approve/deny with rule citations (https://conventionalcomments.org/).
- Prefer GitHub rulesets, SARIF-capable scanners, and repository-native code scanning for durable enforcement/reporting.
Reviewing AI-Generated Code
AI-generated code requires the same CC-* standards plus additional vigilance for these patterns:
| Pattern |
CC-* Mapping |
Detection |
| Hallucinated imports |
CC-DEP-* |
npm info / pip index / type-check fails |
| Stale or deprecated APIs |
CC-DEP-* |
Compiler warnings, changelog checks |
| Missing error paths |
CC-ERR-* |
No catch/finally, no null guards, no timeout |
| Premature abstraction |
CC-COMPLEXITY-* |
Wrappers with single call site, unused generics |
| Confident wrong comments |
CC-NAMING-* |
Docstrings that don't match implementation |
| Security anti-patterns |
CC-SEC-* |
String concatenation in queries, hardcoded tokens |
For detailed hallucination detection steps, see references/code-quality-operational-playbook.md § 11.3.
Navigation
Resources
- references/clean-code-standard.md
- references/code-quality-operational-playbook.md — Legacy operational playbook (RULE-01–RULE-13)
- references/clean-code-operational-checklist.md
- references/clean-coder-operational-checklist.md
- references/code-complete-operational-checklist.md
- references/pragmatic-programmer-operational-checklist.md
- references/practice-of-programming-operational-checklist.md
- references/working-effectively-with-legacy-code-operational-checklist.md
- references/art-of-clean-code-operational-checklist.md
- references/refactoring-operational-checklist.md
- references/design-patterns-operational-checklist.md
- references/functional-programming-patterns.md — Result/Either types, pipe/compose, immutability, pure functions, railway-oriented programming, CC-* rule mapping
- references/code-complexity-metrics.md — Cyclomatic/cognitive complexity, Halstead metrics, nesting depth, tooling (ESLint, Biome, Oxlint, SonarQube, Ruff), refactoring triggers
- data/sources.json — Current external references for review, security-by-design, observability, and modern tooling (official docs first)
- CONVENTIONS.md — Skill structure and validation conventions
- SKILL-TEMPLATE.md — Copy-paste starter for new skills
- sources-schema.json — JSON schema for
data/sources.json
- skill-dependencies.json — Related-skills dependency graph
Templates
- assets/checklists/backend-api-review-checklist.md
- assets/checklists/secure-code-review-checklist.md
- assets/checklists/frontend-performance-a11y-checklist.md
- assets/checklists/mobile-release-checklist.md
- assets/checklists/ux-design-review-checklist.md
- assets/checklists/ux-research-plan-template.md
Utility Patterns
- references/utility-patterns.md — When and how to extract a utility instead of duplicating code (the decision guide above the concrete utilities below)
- references/auth-utilities.md
- references/error-handling.md
- references/config-validation.md
- references/resilience-utilities.md
- references/logging-utilities.md
- references/observability-utilities.md
- references/testing-utilities.md
- references/llm-utilities.md
Related Skills
Freshness Protocol
IMPORTANT: When users ask recommendation questions about clean code standards, linters, formatters, static analysis, or code quality tools, you MUST verify current guidance with web search and official docs before answering. If web search is unavailable, say so and answer using data/sources.json, clearly flagging that the recommendation may be stale.
Trigger Conditions
- "What's the best linter for [language]?"
- "What should I use for [code quality/static analysis]?"
- "What's the latest in clean code practices?"
- "Current best practices for [code standards/formatting]?"
- "Is [ESLint/Prettier/Biome] still relevant?"
- "[Biome] vs [ESLint] vs [other]?"
- "Best static analysis tool for [language]?"
- "Should we switch from [legacy tool] to [new tool]?"
- "What should we use in CI for code scanning or code quality gates?"
Required Verification Workflow
- Check official docs first for the named tool(s): current docs, release notes/changelog, migration guidance, and supported workflows.
- Check the official standard/spec when relevant: RFCs, OWASP, NIST, OpenTelemetry, GitHub Docs.
- Use web search for cross-tool comparisons or current adoption trends only after confirming the primary-source facts.
- Prefer at most one neutral secondary comparison source when the user explicitly wants market positioning or tradeoff analysis.
What to Report
After verifying, provide:
- Current default choice: What you would adopt now for the user’s stack and why
- Current landscape: Which tools are current, maintained, and commonly paired together
- Migration risk: Flat config changes, rule-coverage gaps, formatter/linter consolidation, CI/reporting implications
- Deprecated/declining: Tools or approaches losing relevance for this use case
- Recommendation: Based on fresh official data, not static memory
Example Topics (verify with fresh search)
- JavaScript/TypeScript linters (ESLint, Biome, oxlint)
- Formatters (Prettier, dprint, Biome)
- Python quality (Ruff,
ty, mypy, pylint)
- Go linting (golangci-lint, staticcheck)
- Rust analysis (clippy, cargo-deny)
- Code quality metrics and reporting tools
- Code scanning and security automation (CodeQL, Semgrep, SARIF workflows)
- GitHub enforcement controls (rulesets, CODEOWNERS, protected branches)
Known Traps
- Treating “clean code” as style preference only and ignoring correctness, observability, security, and change safety.
- Enforcing blanket abstraction rules that increase indirection and reduce runtime clarity in the name of cleanliness.
- Mixing language-specific formatter and linter opinions into universal guidance without preserving the stable CC rule intent.
- Letting tool defaults silently redefine the team standard when the explicit repository rule IDs say otherwise.
- Auditing code solely from static style output and missing failure-mode, data-boundary, and operability risks.
Common Anti-Patterns
- Replacing concrete, understandable code with layered abstractions just to satisfy a cleanliness aesthetic.
- Treating short functions, DRY, or naming rules as absolute even when they harm cohesion, locality, or domain clarity.
- Using “clean code” to block pragmatic duplication that preserves boundaries or avoids premature frameworks.
- Turning rule IDs into checklist theater with no explanation of why the rule matters for maintainability or safety.
- Applying one language ecosystem’s conventions wholesale to another without adaptation for tooling, runtime, and team workflow.
Fact-Checking
- Known bugs, regressions, framework/compiler/runtime footguns, and version-specific crash or workaround guidance must be verified against current primary web sources before being treated as current fact.
- Use web search/web fetch to verify current external facts, versions, pricing, deadlines, regulations, or platform behavior before final answers.
- Prefer primary sources; report source links and dates for volatile information, and distinguish facts from inference.
- If web access is unavailable, state the limitation and mark guidance as unverified.
Learnings Loop
Before applying this skill on a non-trivial task, read learnings.consolidated.md in this directory (and learnings.md if present).
After applying it, if you encountered a pattern worth remembering, a mistake worth preventing, or a domain fact that surprised you, append one dated bullet to learnings.md via agents-skills-feedback-loop/scripts/append_learning.py. Do not modify SKILL.md itself.
1---
2name: software-clean-code-standard
3description: "Defines clean-code standards and CC-* rules. Use when reviewing code, setting team standards, citing lint findings, or measuring erosion, complexity mass, and verbosity."
4compatibility: Portable core. Works on Claude Code and Codex.
5version: "1.2"
6last_validated: 2026-08-21
7---
8
9# Clean Code Standard
10
11This skill is the authoritative clean code standard for this repository's shared skills. It defines stable rule IDs (`CC-*`), how to apply them in reviews, and how to extend them safely via language overlays and explicit exceptions.
12
13**Modern Best Practices**: Prefer small, reviewable changes and durable change context. Use BCP 14 normative language consistently (RFC 2119 + RFC 8174). Treat security-by-design and secure defaults as baseline (OWASP Top Ten 2025, NIST SSDF). Prefer GitHub rulesets over branch-protection-only governance. Build observable systems with OpenTelemetry. For current tool choices, consult `data/sources.json` and prefer official docs first.
14
15**Judgment over dogma**: This standard's `CC-*` rules are durable (coupling/cohesion, naming, small interfaces, explicit errors). Numeric folklore — hard function-length caps, "comments are a smell," DRY applied absolutely — is not. Robert C. Martin's *Clean Code* (2nd ed., 2025) and John Ousterhout's *A Philosophy of Software Design* disagree in a published, public debate on function size and commenting (see [references/code-quality-operational-playbook.md § 14](references/code-quality-operational-playbook.md#14-judgment-over-dogma)); apply the rule ID's intent, not a book's specific numeric prescription, and know when *not* to refactor (§ 14.3 of the same reference).
16
17---
18
19## Quick Reference
20
21| Task | Tool/Framework | Command | When to Use |
22|------|-----|---------|-------------|
23| Cite a standard | `CC-*` rule ID | N/A | PR review comments, design discussions, postmortems |
24| Categorize feedback | `CC-NAM`, `CC-ERR`, `CC-SEC`, etc. | N/A | Keep feedback consistent without "style wars" |
25| Add stack nuance | Language overlay | N/A | When the base rule is too generic for a language/framework |
26| Allow an exception | Waiver record | N/A | When a rule must be violated with explicit risk |
27| Reuse shared checklists | `assets/checklists/` | N/A | When you need product-agnostic review/release checklists |
28| Reuse utility patterns | `references/*-utilities.md` | N/A | When extracting shared auth/logging/errors/resilience/testing utilities |
29
30## When to Use This Skill
31
32- Defining or enforcing clean code rules across teams and languages.
33- Reviewing code: cite `CC-*` IDs and avoid restating standards in reviews.
34- Building automation: map linters/CI gates to `CC-*` IDs.
35- Resolving recurring review debates: align on rule IDs, scope, and exceptions.
36
37## When NOT to Use This Skill
38
39- **Deep security audits** → [software-security-appsec](../software-security-appsec/SKILL.md) for OWASP/SAST deep dives beyond `CC-SEC-*` baseline.
40- **Review workflow mechanics** → [software-code-review](../software-code-review/SKILL.md) for PR workflow, reviewer assignment, and feedback patterns.
41- **Refactoring execution** → [qa-refactoring](../qa-refactoring/SKILL.md) for step-by-step refactoring patterns and quality gates.
42- **Architecture decisions** → [software-architecture-design](../software-architecture-design/SKILL.md) for system-level tradeoffs beyond code-level rules.
43
44## Workflow
45
461. Decide whether the request is about a base rule, an overlay, or an exception.
472. Route security, review-process, or refactoring mechanics to the adjacent skill if that is the real problem.
483. Anchor the guidance in existing `CC-*` rules before proposing new wording or automation.
494. Apply the relevant standard, overlay, or waiver pattern with explicit scope and rationale.
505. Cross-check against the navigation references before adding or revising durable standards.
51
52## Rule Application Checklist
53
54When citing or enforcing `CC-*` rules in a review:
55
56- [ ] Rule ID cited explicitly (not paraphrased) — e.g. `CC-SEC-001`, `CC-ERR-003`
57- [ ] Scope stated: file, module, service, or whole repo
58- [ ] Language overlay applied if the repo is language-specific and the base rule is ambiguous
59- [ ] Blocking vs advisory: correctness/security findings block merge; style findings are advisory
60- [ ] Waiver path documented if the rule genuinely cannot be satisfied without architectural change
61
62## ASCII Flow
63
64```text
65Clean-code request
66 -> Identify behavior that must stay unchanged
67 -> Find duplication, unclear boundaries, or unsafe complexity
68 -> Refactor in the smallest coherent slice
69 -> Preserve public contracts and naming consistency
70 -> Add or adjust tests for changed control flow
71 -> Run focused verification and report residual risk
72```
73
74## Decision Tree: Base Rule vs Overlay vs Exception
75
76```text
77Feedback needed: [What kind of guidance is this?]
78 ├─ Universal, cross-language rule? → Add/modify `CC-*` in `references/clean-code-standard.md`
79 │
80 ├─ Language/framework-specific nuance? → Add overlay entry referencing existing `CC-*`
81 │
82 └─ One-off constraint or temporary tradeoff?
83 ├─ Timeboxed? → Add waiver with expiry + tracking issue
84 └─ Permanent? → Propose a new rule or revise scope/exception criteria
85```
86
87---
88
89## Optional: AI/Automation
90
91- Map automation findings to `CC-*` IDs (linters, SAST, dependency scanning) so humans can review impact, not tooling noise.
92- Keep AI-assisted suggestions advisory; human reviewers approve/deny with rule citations (https://conventionalcomments.org/).
93- Prefer GitHub rulesets, SARIF-capable scanners, and repository-native code scanning for durable enforcement/reporting.
94
95### Reviewing AI-Generated Code
96
97AI-generated code requires the same CC-* standards plus additional vigilance for these patterns:
98
99| Pattern | CC-* Mapping | Detection |
100|---------|-------------|-----------|
101| Hallucinated imports | CC-DEP-* | `npm info` / `pip index` / type-check fails |
102| Stale or deprecated APIs | CC-DEP-* | Compiler warnings, changelog checks |
103| Missing error paths | CC-ERR-* | No catch/finally, no null guards, no timeout |
104| Premature abstraction | CC-COMPLEXITY-* | Wrappers with single call site, unused generics |
105| Confident wrong comments | CC-NAMING-* | Docstrings that don't match implementation |
106| Security anti-patterns | CC-SEC-* | String concatenation in queries, hardcoded tokens |
107
108For detailed hallucination detection steps, see [references/code-quality-operational-playbook.md § 11.3](references/code-quality-operational-playbook.md#113-hallucination-detection-checklist).
109
110---
111
112## Navigation
113
114**Resources**
115- [references/clean-code-standard.md](references/clean-code-standard.md)
116- [references/code-quality-operational-playbook.md](references/code-quality-operational-playbook.md) — Legacy operational playbook (RULE-01–RULE-13)
117- [references/clean-code-operational-checklist.md](references/clean-code-operational-checklist.md)
118- [references/clean-coder-operational-checklist.md](references/clean-coder-operational-checklist.md)
119- [references/code-complete-operational-checklist.md](references/code-complete-operational-checklist.md)
120- [references/pragmatic-programmer-operational-checklist.md](references/pragmatic-programmer-operational-checklist.md)
121- [references/practice-of-programming-operational-checklist.md](references/practice-of-programming-operational-checklist.md)
122- [references/working-effectively-with-legacy-code-operational-checklist.md](references/working-effectively-with-legacy-code-operational-checklist.md)
123- [references/art-of-clean-code-operational-checklist.md](references/art-of-clean-code-operational-checklist.md)
124- [references/refactoring-operational-checklist.md](references/refactoring-operational-checklist.md)
125- [references/design-patterns-operational-checklist.md](references/design-patterns-operational-checklist.md)
126- [references/functional-programming-patterns.md](references/functional-programming-patterns.md) — Result/Either types, pipe/compose, immutability, pure functions, railway-oriented programming, CC-* rule mapping
127- [references/code-complexity-metrics.md](references/code-complexity-metrics.md) — Cyclomatic/cognitive complexity, Halstead metrics, nesting depth, tooling (ESLint, Biome, Oxlint, SonarQube, Ruff), refactoring triggers
128- [data/sources.json](data/sources.json) — Current external references for review, security-by-design, observability, and modern tooling (official docs first)
129- [CONVENTIONS.md](CONVENTIONS.md) — Skill structure and validation conventions
130- [SKILL-TEMPLATE.md](SKILL-TEMPLATE.md) — Copy-paste starter for new skills
131- [sources-schema.json](sources-schema.json) — JSON schema for `data/sources.json`
132- [skill-dependencies.json](skill-dependencies.json) — Related-skills dependency graph
133
134**Templates**
135- [assets/checklists/backend-api-review-checklist.md](assets/checklists/backend-api-review-checklist.md)
136- [assets/checklists/secure-code-review-checklist.md](assets/checklists/secure-code-review-checklist.md)
137- [assets/checklists/frontend-performance-a11y-checklist.md](assets/checklists/frontend-performance-a11y-checklist.md)
138- [assets/checklists/mobile-release-checklist.md](assets/checklists/mobile-release-checklist.md)
139- [assets/checklists/ux-design-review-checklist.md](assets/checklists/ux-design-review-checklist.md)
140- [assets/checklists/ux-research-plan-template.md](assets/checklists/ux-research-plan-template.md)
141
142**Utility Patterns**
143
144- [references/utility-patterns.md](references/utility-patterns.md) — When and how to extract a utility instead of duplicating code (the decision guide above the concrete utilities below)
145- [references/auth-utilities.md](references/auth-utilities.md)
146- [references/error-handling.md](references/error-handling.md)
147- [references/config-validation.md](references/config-validation.md)
148- [references/resilience-utilities.md](references/resilience-utilities.md)
149- [references/logging-utilities.md](references/logging-utilities.md)
150- [references/observability-utilities.md](references/observability-utilities.md)
151- [references/testing-utilities.md](references/testing-utilities.md)
152- [references/llm-utilities.md](references/llm-utilities.md)
153
154**Related Skills**
155- [../software-code-review/SKILL.md](../software-code-review/SKILL.md) — Review workflow and judgment; cite `CC-*` IDs
156- [../software-security-appsec/SKILL.md](../software-security-appsec/SKILL.md) — Security deep dives beyond baseline `CC-SEC-*`
157- [../qa-refactoring/SKILL.md](../qa-refactoring/SKILL.md) — Refactoring execution patterns and quality gates
158- [../software-architecture-design/SKILL.md](../software-architecture-design/SKILL.md) — System-level tradeoffs and boundaries
159
160---
161
162## Freshness Protocol
163
164**IMPORTANT**: When users ask recommendation questions about clean code standards, linters, formatters, static analysis, or code quality tools, you MUST verify current guidance with web search and official docs before answering. If web search is unavailable, say so and answer using `data/sources.json`, clearly flagging that the recommendation may be stale.
165
166### Trigger Conditions
167
168- "What's the best linter for [language]?"
169- "What should I use for [code quality/static analysis]?"
170- "What's the latest in clean code practices?"
171- "Current best practices for [code standards/formatting]?"
172- "Is [ESLint/Prettier/Biome] still relevant?"
173- "[Biome] vs [ESLint] vs [other]?"
174- "Best static analysis tool for [language]?"
175- "Should we switch from [legacy tool] to [new tool]?"
176- "What should we use in CI for code scanning or code quality gates?"
177
178### Required Verification Workflow
179
1801. Check official docs first for the named tool(s): current docs, release notes/changelog, migration guidance, and supported workflows.
1812. Check the official standard/spec when relevant: RFCs, OWASP, NIST, OpenTelemetry, GitHub Docs.
1823. Use web search for cross-tool comparisons or current adoption trends only after confirming the primary-source facts.
1834. Prefer at most one neutral secondary comparison source when the user explicitly wants market positioning or tradeoff analysis.
184
185### What to Report
186
187After verifying, provide:
188
189- **Current default choice**: What you would adopt now for the user’s stack and why
190- **Current landscape**: Which tools are current, maintained, and commonly paired together
191- **Migration risk**: Flat config changes, rule-coverage gaps, formatter/linter consolidation, CI/reporting implications
192- **Deprecated/declining**: Tools or approaches losing relevance for this use case
193- **Recommendation**: Based on fresh official data, not static memory
194
195### Example Topics (verify with fresh search)
196
197- JavaScript/TypeScript linters (ESLint, Biome, oxlint)
198- Formatters (Prettier, dprint, Biome)
199- Python quality (Ruff, `ty`, mypy, pylint)
200- Go linting (golangci-lint, staticcheck)
201- Rust analysis (clippy, cargo-deny)
202- Code quality metrics and reporting tools
203- Code scanning and security automation (CodeQL, Semgrep, SARIF workflows)
204- GitHub enforcement controls (rulesets, CODEOWNERS, protected branches)
205
206## Known Traps
207
208- Treating “clean code” as style preference only and ignoring correctness, observability, security, and change safety.
209- Enforcing blanket abstraction rules that increase indirection and reduce runtime clarity in the name of cleanliness.
210- Mixing language-specific formatter and linter opinions into universal guidance without preserving the stable CC rule intent.
211- Letting tool defaults silently redefine the team standard when the explicit repository rule IDs say otherwise.
212- Auditing code solely from static style output and missing failure-mode, data-boundary, and operability risks.
213
214## Common Anti-Patterns
215
216- Replacing concrete, understandable code with layered abstractions just to satisfy a cleanliness aesthetic.
217- Treating short functions, DRY, or naming rules as absolute even when they harm cohesion, locality, or domain clarity.
218- Using “clean code” to block pragmatic duplication that preserves boundaries or avoids premature frameworks.
219- Turning rule IDs into checklist theater with no explanation of why the rule matters for maintainability or safety.
220- Applying one language ecosystem’s conventions wholesale to another without adaptation for tooling, runtime, and team workflow.
221
222## Fact-Checking
223
224- Known bugs, regressions, framework/compiler/runtime footguns, and version-specific crash or workaround guidance must be verified against current primary web sources before being treated as current fact.
225- Use web search/web fetch to verify current external facts, versions, pricing, deadlines, regulations, or platform behavior before final answers.
226- Prefer primary sources; report source links and dates for volatile information, and distinguish facts from inference.
227- If web access is unavailable, state the limitation and mark guidance as unverified.
228
229## Learnings Loop
230
231Before applying this skill on a non-trivial task, read `learnings.consolidated.md` in this directory (and `learnings.md` if present).
232
233After applying it, if you encountered a pattern worth remembering, a mistake worth preventing, or a domain fact that surprised you, append one dated bullet to `learnings.md` via `agents-skills-feedback-loop/scripts/append_learning.py`. Do not modify `SKILL.md` itself.