---
name: comment-policy
description: Use when writing or editing code, adding/changing comments, or before committing a code diff — delivers FR-22's tripwire + retrieval-pointer comment policy at write time. Do NOT use for prose/doc edits, non-code tickets, or as a review gate (that's `code-review`).
source_inspiration: conceptual-only
license_status: clean-room-original
fusebase_flow_version: 3.11
risk_level: low
invocation: automatic
expected_outputs:
  - Code diffs whose comments are tripwire-only or retrieval-pointer-only
  - WHAT-restating / recorded-elsewhere / changelog comments removed at write time
related_workflows:
  - greenlight-implement.md
  - eight-phase-flow.md
hook_dependencies:
  - none
---

# Comment policy (FR-22 write-time carrier)

> **Style:** Mode-B-lite. The write-time home of FR-22. Loads for code-writing agents (and their sub-agents) so the rule reaches the writer's context at the moment comments are written — not just at review. Rule body aligns with FR-22 in `FLOW_RULES.md`; rationale + evidence live in `docs/comment-policy.md`.

## Purpose

Flow source is read by AI agents, not humans line-by-line. WHAT-restating prose, rationale already homed in a decision/ticket/memory, and changelog comments serve an absent audience and cost context budget on every load. The base "match surrounding comment density" instruction is a one-directional ratchet and every Stop-hook gate is comment-blind, so over-commenting is invisible to the loop. This skill delivers the explicit override at write time.

## When to invoke

- Writing or editing code in any language.
- Adding, changing, or reviewing your own comments before a commit.
- About to commit a code diff (final comment pass).
- A handoff or task involves implementation, refactor, or scaffold.

## Do not invoke when

- Editing prose / docs / specs / decisions / handoffs (these are human-or-AI-read narrative, not code).
- The ticket is non-code (config-only rename, doc-only change with no source edit).
- You want review-time enforcement — that is `code-review` (the review dimension), not this write-time carrier.

## Required inputs

| Input | Where it lives | If missing |
|---|---|---|
| The code diff being written | working tree | nothing to apply the policy to — skip |
| Trust-critical carve-out set | `policies/comment-policy.yml: trust_critical_globs` | treat all paths as routine (carve-outs are opt-in per project) |
| Rationale / audit prompt | `docs/comment-policy.md` (framework-dev) · `references/audit-prompt.md` (consumer-reachable) | proceed from the two-kinds rule below |

## Procedure

Write only two kinds of comment; remove everything else.

### 1. Tripwire (keep)

A constraint an editing agent could violate without realizing, that is **not obvious from local code**. One line by default; ≤~4 lines **only** for security / auth / concurrency / platform-quirk.

```
# empirical floor — don't lower below 0.82 (decision B2)
threshold = 0.82
```

```
# additive — reordering breaks back-compat with serialized v1 payloads
FIELDS = (...)
```

### 2. Retrieval pointer (keep)

A ≤1-line tag naming the external WHY-home so an agent whose context is just the open file knows where the rationale lives.

```
COOLDOWN_S = 30        # (backlog 156)
```

### 3. Remove (everything else)

| Remove | Why | Replace with |
|---|---|---|
| WHAT-restating prose (`# loop over users`) | the code already says it; the reader is an agent | nothing |
| Rationale/diagnosis already in a decision/ticket/memory | duplicate of an external record | the ≤1-line pointer |
| Changelog / history (`# changed 2026-06-04: was X`) | the change is in git | nothing |

## Delegation push block (for code-writing sub-agents)

When you delegate any code-writing/implementation slice to a sub-agent, paste this block into its prompt (push — sub-agents do not reliably auto-load this skill):

```
COMMENT POLICY (FR-22) — applies to all code you write:
Write ONLY two kinds of comment; remove everything else.
1) TRIPWIRE — a constraint an editor could break unknowingly, not obvious from local code (≤1 line; ≤4 lines only for security/auth/concurrency/platform).
2) RETRIEVAL POINTER — a ≤1-line tag naming the external WHY-home, e.g. "(decision B2)" or "backlog 156".
REMOVE: comments that restate what the code does; rationale already recorded in a decision/ticket/memory; changelog/history (it's in git).
Do NOT match surrounding comment density upward. Keep pointers — they are not duplicates.
```

## Two subtleties (do not over-simplify)

- **Do NOT "match surrounding comment density" upward.** Trim toward this policy even in comment-heavy files. This clause is what breaks the harness density-ratchet — without it the policy is silently overridden.
- **Storage ≠ retrieval — the pointer is NOT a duplicate.** When an agent opens a file the external records aren't in its context, so deleting the one-line pointer orphans a correct record the agent now has no trigger to open. Kill the prose; keep the pointer.

## Content gate forbidden — artifact-level checks encouraged

Two distinct enforcement layers; do not conflate them (conflating them led maintainers to build *nothing*):

| Layer | Inspects | Verdict |
|---|---|---|
| **Comment CONTENT** (tripwire-vs-restate) | the words inside a comment | **FORBIDDEN as a gate** — semantic, not pattern-matchable; a regex/lint gate trains agents to write worse comments to pass it. Enforced write-time (this skill) + review-time (`code-review`) only. |
| **Process ARTIFACTS** (handoff-contains-block; review-ran signal) | whether the handoff carries the FR-22 push block; whether the review marker was emitted | **ENCOURAGED** — inspects process artifacts, never comment semantics; fully FR-22-safe. E.g. `comment_policy_review_applied` (warn-only) in `policies/required-artifacts.yml`, detected by `stop.py`. |

The "no gate" rule is about comment content only. It does **not** forbid the safe artifact-level checks that make FR-22 delivered-by-construction and visible to the loop.

## Carve-out (trust-critical paths)

Trust-critical paths — auth / identity / session / gate code, DB migrations, and anything in `policies/comment-policy.yml: trust_critical_globs` — keep their multi-line tripwires. Apply the rule fully to CRUD / routine code. The set is **project-settable** (architecture-dependent: whether a separate instruction layer is read *instead of* source varies by project). Run `references/audit-prompt.md` against a project to derive its set before adopting.

## Output artifacts

| Artifact | Path or location | Mode |
|---|---|---|
| Comment-policy-compliant code diff | working tree | (behavioral; no separate artifact) |

## Failure cases

| Failure mode | Detection | Response |
|---|---|---|
| Diff carries WHAT-restate / changelog / duplicate-rationale comments | self-review before commit; `code-review` at review-time | strip the prose; keep tripwires + pointers |
| A pointer was deleted as a "duplicate" | external record now has no in-context trigger | restore the ≤1-line pointer |
| Tempted to add a regex/lint comment gate | this skill or a hook proposes pattern-matching comments | refuse — FR-22 forbids it; enforcement is write-time + `code-review`, never a gate |

## Escalation path

- Carve-out set unknown for this project → run `references/audit-prompt.md`; ask the operator in chat text (FR-19) which globs to set in `policies/comment-policy.yml`.
- Cleaning existing over-commented files → a separate explicit Lightweight pass (FR-21); not retroactive, comments strip from build output so no deploy.

## Anti-patterns

- Do not become a regex/lint/gate comment-matcher — tripwire-vs-restate is semantic, not pattern-matchable (FR-22).
- Do not match surrounding comment density upward.
- Do not strip a retrieval pointer as if it were a duplicate.
- Do not apply to prose/doc files — this is the code carrier.
- Do not retroactively rewrite existing files outside an explicit Lightweight pass.

## Clean-room note

Original Fusebase Flow content. Designed after reviewing public AI coding workflow patterns; no third-party code, prompts, skill files, or hook scripts are copied. See `docs/source-map.md`.
