Issue and pull request references are pervasive in this repository's code, comments, and docstrings. The maintainer's instruction is that they never belong there. This issue records the rule that already says so, measures what has to come out, and answers why the rule did not hold, since the scrub is worth little if the same text comes back on the next change.
The rule
It exists, and it is stated once, in .agents/skills/comment-and-doc-style/SKILL.md, "Comments":
Applies to code and workflow (#) comments alike.
- Comment only when the code does not explain itself, or the logic is genuinely complex. Self-evident code needs no comment.
- State only the non-obvious why, for the human reading this project's code now. No cross-project references, no historic or design narrative, no rule citations. Governance lives in the fleet's own instruction set, not echoed inline.
An issue reference is the concrete form of two of those three bans at once. (#973) is historic narrative, and ptr727/Blog #110 is a cross-project reference as well.
What has to come out
Measured on the tree at d0e722f, matching a # followed by two to five digits on a word boundary:
| Where |
Lines |
*.py |
107 |
*.md |
157 |
*.sh, *.ps1, *.yml, *.json |
10 |
The Python side splits 70 references inside a string or docstring against 27 inside a # comment. The heaviest files are scripts/tests/test_handoff.py (27), scripts/tests/test_pr_review.py (22), scripts/pr_review.py (21), host-setup/agent-safety/claude/gh-write-guard.py (11), and spec/audit.py (8).
Why the rule did not hold
Four causes, each independently sufficient, listed strongest first.
1. The tree teaches the opposite of the rule, at scale. 107 references across twelve Python files is not an oversight, it is a house style. Anyone editing near scripts/pr_review.py, whose every constant carries a rationale block ending in an issue number, reads that as the convention and matches it, which is the correct instinct applied to the wrong exemplar. No amount of rule text competes with the surrounding file until the surrounding file changes, so the scrub is the fix and the rule text is only what stops the regrowth.
2. The rule bans the category and never names the instance. "No historic or design narrative" is an abstraction. A writer adding (#973) is not thinking "I am narrating design history", they are thinking "I am citing the evidence for this claim", which reads as rigor rather than as narrative. The rule never says that an issue number, a pull request number, or a commit reference is what that abstraction is made of, so it does not fire at the moment it is violated.
3. Nothing detects it. The prose gate carries thirteen rules and none of them reads a reference. The only rule that touches comments at all is comment-added, which gates comment growth rather than comment content, and the comments label that stands it down waves the whole diff through, references included. The rule's own text further puts the largest cluster out of reach: "A docstring is not a comment line", and 70 of the 107 Python references are in strings and docstrings.
4. The rule is two pointers deep and lives only in a skill. CODESTYLE.md "General" says comments philosophy lives in GOVERNANCE.md. GOVERNANCE.md "Documentation Style Conventions" has a ### Comments subsection whose entire content is "The full comment philosophy, what earns one, structure, capitalization, growth discipline, is in the comment-and-doc-style Skill referenced above." So a reader following the canonical docs reaches two stubs before any rule text, and the rule binds only where that skill actually loads. It did not load in the session that raised this.
The open question, which is the maintainer's
The rule's own scope line reads "Applies to code and workflow (#) comments alike". It does not reach Markdown, and comment-added excludes Markdown explicitly. The example that prompted this was a line in .agents/skills/pr-review-conduct/SKILL.md, which is a document rather than code, so it is outside the rule as written.
That makes the Markdown side a decision rather than a scrub:
- Some of the 157 Markdown references are plainly legitimate.
TODO.md carries 34 and is a tracker, and reports/ is generated by spec/audit.py rather than authored.
- Some are the same defect the code side has, a rule or a skill citing the issue that produced it.
A scrub that treats those alike either deletes a tracker's reason for existing or leaves the defect in the files agents read most.
Suggested shape of the work
- Decide the Markdown scope above.
- Scrub the code side, replacing each reference with the constraint it was standing in for, or deleting the clause where the reference was the whole of its value.
- Add the instance to the rule, so it names an issue, pull request, or commit reference as what the existing ban covers.
- Consider a prose-gate rule that reads a reference in a comment, a docstring, and a string, since causes 1 and 3 together are what let this reach 107 lines.
Step 3 without steps 1 and 2 leaves the exemplar intact, and the tree wins that argument every time.
Issue and pull request references are pervasive in this repository's code, comments, and docstrings. The maintainer's instruction is that they never belong there. This issue records the rule that already says so, measures what has to come out, and answers why the rule did not hold, since the scrub is worth little if the same text comes back on the next change.
The rule
It exists, and it is stated once, in
.agents/skills/comment-and-doc-style/SKILL.md, "Comments":An issue reference is the concrete form of two of those three bans at once.
(#973)is historic narrative, andptr727/Blog #110is a cross-project reference as well.What has to come out
Measured on the tree at
d0e722f, matching a#followed by two to five digits on a word boundary:*.py*.md*.sh,*.ps1,*.yml,*.jsonThe Python side splits 70 references inside a string or docstring against 27 inside a
#comment. The heaviest files arescripts/tests/test_handoff.py(27),scripts/tests/test_pr_review.py(22),scripts/pr_review.py(21),host-setup/agent-safety/claude/gh-write-guard.py(11), andspec/audit.py(8).Why the rule did not hold
Four causes, each independently sufficient, listed strongest first.
1. The tree teaches the opposite of the rule, at scale. 107 references across twelve Python files is not an oversight, it is a house style. Anyone editing near
scripts/pr_review.py, whose every constant carries a rationale block ending in an issue number, reads that as the convention and matches it, which is the correct instinct applied to the wrong exemplar. No amount of rule text competes with the surrounding file until the surrounding file changes, so the scrub is the fix and the rule text is only what stops the regrowth.2. The rule bans the category and never names the instance. "No historic or design narrative" is an abstraction. A writer adding
(#973)is not thinking "I am narrating design history", they are thinking "I am citing the evidence for this claim", which reads as rigor rather than as narrative. The rule never says that an issue number, a pull request number, or a commit reference is what that abstraction is made of, so it does not fire at the moment it is violated.3. Nothing detects it. The prose gate carries thirteen rules and none of them reads a reference. The only rule that touches comments at all is
comment-added, which gates comment growth rather than comment content, and thecommentslabel that stands it down waves the whole diff through, references included. The rule's own text further puts the largest cluster out of reach: "A docstring is not a comment line", and 70 of the 107 Python references are in strings and docstrings.4. The rule is two pointers deep and lives only in a skill.
CODESTYLE.md"General" says comments philosophy lives inGOVERNANCE.md.GOVERNANCE.md"Documentation Style Conventions" has a### Commentssubsection whose entire content is "The full comment philosophy, what earns one, structure, capitalization, growth discipline, is in thecomment-and-doc-styleSkill referenced above." So a reader following the canonical docs reaches two stubs before any rule text, and the rule binds only where that skill actually loads. It did not load in the session that raised this.The open question, which is the maintainer's
The rule's own scope line reads "Applies to code and workflow (
#) comments alike". It does not reach Markdown, andcomment-addedexcludes Markdown explicitly. The example that prompted this was a line in.agents/skills/pr-review-conduct/SKILL.md, which is a document rather than code, so it is outside the rule as written.That makes the Markdown side a decision rather than a scrub:
TODO.mdcarries 34 and is a tracker, andreports/is generated byspec/audit.pyrather than authored.A scrub that treats those alike either deletes a tracker's reason for existing or leaves the defect in the files agents read most.
Suggested shape of the work
Step 3 without steps 1 and 2 leaves the exemplar intact, and the tree wins that argument every time.