一键导入
writing-evergreen-comments
Write comments explaining WHAT and WHY, never temporal context or history
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Write comments explaining WHAT and WHY, never temporal context or history
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | Writing Evergreen Comments |
| description | Write comments explaining WHAT and WHY, never temporal context or history |
| when_to_use | When adding comments to code. When documenting during refactoring. When tempted to explain "what changed". When writing file headers. When reviewing comments that reference history. |
| version | 1.0.0 |
| languages | all |
Comments documenting change history or implementation improvements become stale and confusing. "// Refactored from legacy system" tells nothing about current purpose.
Core principle: Comments explain WHAT code does or WHY it exists, never how it's better than before.
Violating the letter of this rule is violating the spirit of documentation.
Use for:
Use ESPECIALLY when:
Comments describe present state, not past or transitions.
```typescript // Refactored from the old validation system // Now uses Zod instead of manual checking class Validator { validate(data: unknown) { } }// Improved error handling - used to just throw function processRequest() { }
// Recently moved from utils/ to core/ export function helper() { }
</Bad>
<Good>
```typescript
// Validates configuration against schema
class Validator {
validate(data: unknown) { }
}
// Returns error details to caller for proper handling
function processRequest() { }
// Shared utility for data transformation
export function helper() { }
Comments document code, not instruct developers.
```typescript // Use this pattern instead of the old approach // Copy this when implementing similar features class NewPattern { }// TODO: migrate all code to use this function improvedAPI() { }
</Bad>
<Good>
```typescript
// Handles async operations with automatic retry
class RetryableOperation { }
// Validates input before processing
function processInput() { }
Code quality shows in behavior, not comments claiming superiority.
```typescript // Better than the previous implementation // More efficient validation // Enhanced error messages class Validator { } ``` ```typescript // Validates schema in single pass, returns all errors class Validator { } ```Every file starts with 2-line header explaining purpose.
```typescript // ABOUTME: Validates user input against defined schemas // ABOUTME: Provides detailed error messages for debuggingexport class Validator { // ... }
</Good>
**Why ABOUTME:** Greppable pattern for finding file purposes.
```bash
grep -r "ABOUTME:" . --include="*.ts"
| Bad Comment | Why Bad | Good Comment |
|---|---|---|
// Refactored from legacy | Temporal context | // Handles user authentication |
// New error handling | References change | // Returns errors to caller |
// Improved performance | Claims improvement | // Caches results for 5min |
// Use this instead of X | Instructional | // Validates async |
// Wrapper around API | Implementation | // Fetches user data |
// Recently moved here | Temporal context | // Shared validation logic |
Rule: Remove old comments describing old behavior. Don't add new comments about the change.
```typescript // OLD: Used to validate with regex // NEW: Now uses schema validation for better accuracy function validate(input: string) { // Enhanced validation logic } ``` ```typescript // Validates input against schema, returns structured errors function validate(input: string) { // Business logic here } ```Critical: Never remove comments unless proven false.
// DO remove if provably wrong
// OLD COMMENT: Returns null on error
function process() {
throw new Error(); // ← Comment was false, remove it
}
// PRESERVE if still accurate
// Retries up to 3 times before failing
function fetch() {
// Even if you refactor, keep comment if behavior same
}
If you catch yourself writing:
STOP. Write comment describing current behavior and purpose.
| Excuse | Reality |
|---|---|
| "Developers need to know what changed" | Git history records changes. Comments describe current state. |
| "This explains why refactoring was done" | Explain WHY current code exists, not what it replaced. |
| "Future devs should use this pattern" | Code quality speaks for itself. Don't instruct. |
| "The old comment has useful context" | If false, delete. If true, rewrite in present tense. |
| "Need to mark this as 'new' temporarily" | If it's running, it's not temporary. Describe what it IS. |
Every file starts with 2-line header:
// ABOUTME: First line - what this file does
// ABOUTME: Second line - key details or context
// Rest of file...
Guidelines:
ABOUTME: Before committing comments:
// ABOUTME: New validation system
// ABOUTME: Refactored from old regex approach
// This replaces the old validator - use this instead
// Better error handling than before
class Validator {
// Enhanced validation logic (improved from v1)
validate(data: unknown) { }
}
// ABOUTME: Validates configuration against schemas
// ABOUTME: Returns all errors in single pass
// Validates data structure and types
// Returns structured errors with field paths
class Validator {
// Checks each field against schema rules
validate(data: unknown) { }
}
See skills/naming-by-domain for domain-focused naming (no temporal context in names either).
Fork, clone to ~/.clank, run installer, edit CLAUDE.md
RED-GREEN-REFACTOR for process documentation - baseline without skill, write addressing failures, iterate closing loopholes
Skills wiki intro - mandatory workflows, search tool, brainstorming triggers
Interactive idea refinement using Socratic method to develop fully-formed designs
Execute detailed plans in batches with review checkpoints
Execute implementation plan by dispatching fresh subagent for each task, with code review between tasks