fix(issue): sharpen rule 4 into a tracker-reachability test

Rule 4 ("Self-contained") forbade dangling pointers by example only, so
a reference reachable only through the producing chat slipped past it --
e.g. a shipped comment "Approach B (the mechanism refinement decided +
logged above)", whose "logged above" names no resolvable entry and whose
"Approach B" indexes an A/B fork the entry never reproduces.

Reframe rule 4 around one test: a reference is valid iff a reader who
lands on the entry alone (e.g. via a direct comment-anchor link) can
follow it to its target. A survey of the live tracker (63 issues / 96
comments) found 56 violations in six classes, now each named as an
unreachable form: chat references, weak intra-thread pointers
("above" / "logged above"), artifacts named by role, out-of-repo paths,
bare un-glossed codes, and locator-shaped tokens that resolve to nothing.
Carve-outs keep inline quotations, #N / SHA / URL / repo-path locators,
glossed codes, and restated forks legitimate. The constructive escape
hatch (log a chat decision to the tracker first, then cite that comment)
cross-references boss "The reference issue".

Align the Common-mistakes table, the Red-flags STOP gate, and the boss
cross-reference. Prescribe a comment's full URL rather than a bare
#issuecomment-NNNN fragment, which is not auto-linked on Gitea and so
does not itself satisfy the test.

Existing tracker entries are left unedited; the rule governs future
writing only.
This commit is contained in:
2026-06-29 10:53:04 +02:00
parent 5a9a2ae05c
commit 19db0a933a
+91 -17
View File
@@ -70,16 +70,76 @@ These apply to every issue, on create and on edit.
- Avoid: "parser bug" / "There is a problem with the parser." - Avoid: "parser bug" / "There is a problem with the parser."
- Use: "Preserve backslash escapes in quoted strings" - Use: "Preserve backslash escapes in quoted strings"
4. **Self-contained.** The issue is understandable on its own, 4. **Self-contained — the reachability test.** The issue stands on its
without the originating conversation. Every reference resolves own, without the conversation that produced it. Apply one test to
directly for any reader — an issue/PR number (`#42`), a commit every reference: *starting from this entry alone — a reader may have
SHA, a full URL, or a path that exists in the repo. No dangling arrived by a direct comment-anchor link, no chat and no sibling
pointers ("as discussed", "see the spec") and no tags, codes, or comments loaded — can they follow it to its target?* If not, it is a
acronyms that need outside knowledge to resolve; spell them out or dangling pointer: reproduce the content inline, or swap in a
link them. resolvable locator.
- Avoid: "Fixes the regression from the ledger refactor; see the
spec." **Reachable — use these:** content stated or quoted inline; an
- Use: "Fixes the regression behind `#38`, introduced in `a1b2c3d`." issue/PR number (`#42`, or cross-repo `Skills #11`); a commit SHA
(`a1b2c3d`, resolves on push); a full URL; a repo-relative path,
optionally with a line range (`parser.rs:84-90`); another comment by
its full URL (the link ending `#issuecomment-NNNN` — the bare fragment
only resolves in-page on that comment's own issue); a same-entry
section marker (`§5`); a convention-resolvable in-repo slug (a
`docs/specs/` slug, a cycle number).
**Unreachable — rewrite or inline; these never resolve from the
tracker:**
- **The producing chat by reference, in any phrasing** — "the
in-context discussion", "settled before the run", "the session /
cycle transcript", an in-context juror/panel verdict (`D3`). No
anchor can ever reach it; the irrecoverable case. (Quoting the
decision's words inline is fine — see the carve-out below.)
- **A weak prose pointer** — "above", "below", "earlier", "the prior
comment", "logged above", "as discussed" — with no resolvable
locator: the target comment's full URL, a `#N`, or a *same-entry*
`§` marker. A `§` pointing into another comment or file is itself
unreachable — link that comment's URL.
- **An artifact named by role, not locator** — "the OOS harness
issue", "see the ledger", a `Depends on` target — carrying no `#N` /
SHA / URL / repo path.
- **A path outside this repo** — `/mnt/...`, `~/.claude/...`, a Claude
auto-memory slug, another project's `BLOCKED.md`. Only a path in
*this* repo is reachable.
- **A bare code or ordinal whose defining set the entry does not
reproduce** — a plan-item / ledger / lens code (`I7`, `C16`), an
index ("decision #5"). Gloss it in place, or restate the set.
- **A locator-shaped token that resolves to nothing** — a template
placeholder (`#(A)`), or a `#`-number in the wrong format (`#0071` —
issue refs are unpadded integers like `#71`; a leading zero matches
nothing).
A chat decision becomes referenceable only by being **written to the
tracker first** — log it, then cite that comment; a chat is reachable
by being written down, never by being pointed at (the `boss`
reference-issue mechanic, `../boss/SKILL.md` § The reference issue).
**These stay self-contained** (don't strip them chasing the rule): an
inline dated verbatim quote of a chat decision ("`mach es so!` —
2026-06-29") — the reader sees the exact words, and only a surplus
"settled in-context" sentence *beside* it is the violation; an
enumerated fork `(A)`/`(B)` whose options are restated here; a
glossary code glossed inline; a provenance sentence whose fact is also
stated inline, so long as it embeds no unresolvable pointer (keep
"decided", drop or anchor "logged above"). Flag the *pointer* a
tracker-only reader can't resolve, never the content it reproduces.
- Avoid: "Approach B (the mechanism refinement decided + logged
above)." — "logged above" points to a sibling comment with no
resolvable URL, so a reader who landed on this comment can't reach
the refinement; the violation is the unresolvable pointer, and it
stands even when the mechanism is restated inline. The bare label
"Approach B" compounds it — it indexes an A/B fork this entry never
reproduces, so the letter means nothing to a reader who didn't see
the fork laid out.
- Use — drop the chat-native label, name the option on its own terms,
then inline or link the refinement: "The honest per-held-cycle bleed
(accrue each held cycle, dump at close) — refined in
`http://…/issues/148#issuecomment-2142`."
**Language:** title and body are English — an issue is a repo **Language:** title and body are English — an issue is a repo
artefact mirrored to Gitea ("would it be committed → English", per artefact mirrored to Gitea ("would it be committed → English", per
@@ -131,16 +191,28 @@ Notes:
| `-d` body with a guessed flag (`--body`) | tea rejects it | `--description`/`-d` | | `-d` body with a guessed flag (`--body`) | tea rejects it | `--description`/`-d` |
| Editing without viewing first | Clobbers others' edits | `tea issues <idx>`, then edit | | Editing without viewing first | Clobbers others' edits | `tea issues <idx>`, then edit |
| Reading/echoing tea's config | Token leak | tea is already authenticated | | Reading/echoing tea's config | Token leak | tea is already authenticated |
| Dangling reference ("see the spec", an internal code) | Reader can't resolve it | Link it: `#N`, SHA, URL, or repo path | | Pointer to the chat that produced the entry ("in-context", "the cycle transcript", a juror code) | The chat is invisible to a tracker reader — never reachable | Quote the words inline, or log the decision to the tracker and cite that comment's full URL |
| "above" / "below" / "the prior comment" with no anchor | A reader on a direct comment link can't tell which entry | Add the comment's full URL, a `#N`, or a *same-entry* `§` marker |
| Artifact or path named without a locator — "the harness issue", "see the ledger", `/mnt/...`, `~/.claude/...` | Nothing to navigate to from the tracker | Supply a `#N`, SHA, URL, or in-repo path — or reproduce the fact inline |
| Bare un-glossed code or ordinal (`I7`, `C16`, "decision #5") | Its defining set isn't in the entry | Gloss it inline, or restate the set |
## Red flags — STOP ## Red flags — STOP
- The word "you" anywhere in title or body - The word "you" anywhere in title or body
- A factual statement with neither evidence nor a "claim" flag - A factual statement with neither evidence nor a "claim" flag
- A title that is a noun phrase or ends with a period - A title that is a noun phrase or ends with a period
- A reference with no resolvable locator (`#N`, a commit SHA, a URL, - A reference with no resolvable locator (`#N`, a commit SHA, a URL, an
or an existing repo path), or an acronym/code needing outside existing repo path, a `docs/specs/` slug or cycle number, a same-entry
knowledge `§`, or the fact reproduced inline), or a bare never-glossed code whose
defining set isn't in the entry — in particular:
- a pointer to the chat that produced the entry ("in-context", "the
cycle transcript", a juror code); the chat is never tracker-reachable
- "above" / "below" / "the prior comment" / "as discussed" with no
resolvable locator — the comment's full URL, a `#N`, or a same-entry `§`
- an out-of-repo path (`/mnt`, `~/.claude`, a `memory <slug>`,
another project's `.md`) cited as the basis
- a `#`-token that resolves to nothing — a `#(A)` placeholder or a
wrong-format `#0071`
- About to `tea issues edit` without having viewed the issue - About to `tea issues edit` without having viewed the issue
- About to print or `cat` the tea config - About to print or `cat` the tea config
@@ -149,6 +221,8 @@ Notes:
- `~/dev/CLAUDE.md` — repo-English rule, label vocabulary, the - `~/dev/CLAUDE.md` — repo-English rule, label vocabulary, the
`closes #N` commit convention (the tracker is the forward-queue). `closes #N` commit convention (the tracker is the forward-queue).
- `../brainstorm/SKILL.md`, `../audit/SKILL.md`, `../boss/SKILL.md` — - `../brainstorm/SKILL.md`, `../audit/SKILL.md`, `../boss/SKILL.md` —
callers that file issues through these conventions (`boss` files callers that file issues through these conventions. `boss` files
skill-system feedback on the plugin's own tracker with an skill-system feedback with an autonomous-provenance body block
autonomous-provenance body block, § Skill-system feedback). (§ Skill-system feedback), and its § The reference issue is the
constructive escape hatch for rule 4: log a chat decision to the
tracker first, then cite that comment instead of pointing at the chat.