From 954e5ef86a41afe51948b55f6ba7e7612103ed1a Mon Sep 17 00:00:00 2001 From: Loretta Date: Mon, 15 Jun 2026 18:01:44 +0200 Subject: [PATCH] Switch archive policy to year-month buckets (LLMP-DEC-67) Updated all docs, skills, and examples to use year-month archive files (`*__.md`) for `_ISSUES.md`, `_TODO.md`, and `LLM_PROTOCOL_DECISIONS.md`. Decision Log rolling window now governed by LLMP-DEC-67 (last 15 entries active). Clarified archive file handling, updated uniqueness checks, and revised references throughout. Closed and documented resolution for `FBANKAPP-DMODEL-I-P6X4` in `DATAMODEL_ISSUES.md`. --- .github/LLM_PROTOCOL_DECISIONS.md | 6 +++--- .github/LLM_PROTOCOL_DECISIONS_2026_04.md | 2 +- .github/REPO_PREFIXES.md | 4 ++-- .github/skills/docs-archive/SKILL.md | 16 ++++++++-------- .github/skills/docs-check/SKILL.md | 2 +- .../skills/docs-check/references/TOPIC_CODES.md | 4 ++-- .github/skills/docs-discovery/SKILL.md | 14 +++++++------- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.github/LLM_PROTOCOL_DECISIONS.md b/.github/LLM_PROTOCOL_DECISIONS.md index 4052bfa..0e704a1 100644 --- a/.github/LLM_PROTOCOL_DECISIONS.md +++ b/.github/LLM_PROTOCOL_DECISIONS.md @@ -49,7 +49,7 @@ Active as of **2026-04-26**. For the full evolution history, see the dated table - **`docs-check`** (reactive) — end-of-code-modifying-response skill: evaluates loaded `.md` for drift vs code, missing topic coverage, csproj-glob registration gaps, and new issue/TODO candidates. Emits the `[DOCUMENTATION CHECK]` section (or `[DOCUMENTATION CHECK] None.` single-line). Read-only on loaded docs; all patches as proposals per Rule #5. - **`protocol-audit`** (user-gated) — audits `.github/copilot-instructions.md` files discovered via runtime walk of `own-dep-repos` from the invocation point (LLMP-DEC-58 redesign — was central-`REPOS.md` driven before). Common invariants C1-C4 for all (C1: 5 required `@repo` fields incl. `prefix`; C3: `prefix` format check, repurposed in LLMP-DEC-58); Primary-only (P1-P10) for files content-classified as primary; Inherit-only (I1-I3) for inherit files; Cross-cutting (X1, X2, X3). Reports PASS/FAIL per invariant-file cell with patch suggestions. Does NOT auto-apply patches. - **`adr-author`** (user-gated) — Architecture Decision Record authoring; structured interview producing `docs/adr/NNNN-.md` (product decisions) or new `LLMP-DEC-N` row (meta-protocol decisions). -- **`docs-archive`** (user-gated) — rotates `Status: Closed` entries from active `_ISSUES.md` / `_TODO.md` / `LLM_PROTOCOL_DECISIONS.md` into year-bucketed archive files; archive-time collision-check on random suffix. +- **`docs-archive`** (user-gated) — rotates `Status: Closed` entries from active `_ISSUES.md` / `_TODO.md` / `LLM_PROTOCOL_DECISIONS.md` into year-month bucket archive files; archive-time collision-check on random suffix. **Docs-sync enforcement (`[DOCUMENTATION CHECK]` at end of code-modifying responses)**: - **Keep all .md in sync** — if code and loaded docs disagree, notify and ask (do NOT silently edit). @@ -62,7 +62,7 @@ Active as of **2026-04-26**. For the full evolution history, see the dated table **Decision Log governance (this file)**: - **Append-only.** Never rewrite or delete entries. Reversals and refinements get *new* entries that reference the superseded one by ID (e.g., "LLMP-DEC-26 superseded by LLMP-DEC-27"). - **Entries have `LLMP-DEC-N` IDs** (topic=LLMP, type=DEC — see TOPIC_CODES.md). Sequential, append-only, never renumber. Reference entries by ID for unambiguous citation from code comments, other `.md` files, or cross-repo. -- **Archive policy** (LLMP-DEC-65): active log keeps **last 15 entries** (rolling window); older entries rotate to **year-month bucket** archive files (`LLM_PROTOCOL_DECISIONS__.md`, e.g., `_2026_04.md`). Sparse files OK — only month-buckets with archived entries get a file. Triggered manually via `docs-archive` skill on user request, or automatically when active count > 15. IDs stay unique across archives. **Supersedes** the original "annual at ~50" policy from LLMP-DEC-25. +- **Archive policy** (LLMP-DEC-67): active log keeps **last 15 entries** (rolling window); older entries rotate to **year-month bucket** archive files (`LLM_PROTOCOL_DECISIONS__.md`, e.g., `_2026_04.md`). Sparse files OK — only month-buckets with archived entries get a file. Triggered manually via `docs-archive` skill on user request, or automatically when active count > 15. IDs stay unique across archives. **Supersedes** the original "annual at ~50" policy from LLMP-DEC-25. - **`Affected` column** uses the scope codes defined below. - **User consent required** for every new entry. - **No skill / template version labels.** Skills and templates are continuously iterated; the Decision Log entry IS the version history. Reference changes by date or `LLMP-DEC-N` ID, not by synthetic version numbers (`v1.1`, `v2.0`, etc.) — neither in skill content, frontmatter metadata, nor in conversation when discussing changes. LLMP-DEC-45 removed legacy `metadata: version` fields from all SKILL.md files; LLMP-DEC-47 codifies the principle explicitly to prevent the linguistic regression of using `vN.M` as colloquial shorthand for "recent changes". @@ -114,7 +114,7 @@ The "primary" vs "inherit" distinction is defined in `protocol-audit/references/ > **Earlier entries archived**: LLMP-DEC-1..52 (2026-04-20 through 2026-04-26) → see [`LLM_PROTOCOL_DECISIONS_2026_04.md`](./LLM_PROTOCOL_DECISIONS_2026_04.md) per the **last-15-active retention policy** (LLMP-DEC-67). The active table below contains only the most recent 15 entries (rolling window). Cross-link integrity preserved: when a recent entry references `LLMP-DEC-X` (X ≤ 49), open the archive file to read the full text — IDs are stable, never reassigned. > -> **Year-month buckets** (LLMP-DEC-65 policy): future archive files use `LLM_PROTOCOL_DECISIONS__.md` (e.g., `_2026_05.md` for May 2026 entries). Cross-month archives are sparse files keyed on the entry's date column. The retention rule scans on `docs-archive` invocation: archive when active count > 15, target by entry date. +> **Year-month buckets** (LLMP-DEC-67 policy): future archive files use `LLM_PROTOCOL_DECISIONS__.md` (e.g., `_2026_05.md` for May 2026 entries). Cross-month archives are sparse files keyed on the entry's date column. The retention rule scans on `docs-archive` invocation: archive when active count > 15, target by entry date. | ID | Date | Decision | Rationale | Affected | |---------------|------------|-------------------------------------------------------|---------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------| diff --git a/.github/LLM_PROTOCOL_DECISIONS_2026_04.md b/.github/LLM_PROTOCOL_DECISIONS_2026_04.md index 1492871..5a06efe 100644 --- a/.github/LLM_PROTOCOL_DECISIONS_2026_04.md +++ b/.github/LLM_PROTOCOL_DECISIONS_2026_04.md @@ -1,6 +1,6 @@ # LLM Protocol Decisions — Archive: 2026-04 -Archived entries from `LLM_PROTOCOL_DECISIONS.md` per the **last-15-active retention policy** (LLMP-DEC-65). All entries here have IDs in the LLMP-DEC namespace; year-month bucket = **2026-04** (entries dated 2026-04-XX). +Archived entries from `LLM_PROTOCOL_DECISIONS.md` per the **last-15-active retention policy** (LLMP-DEC-67). All entries here have IDs in the LLMP-DEC namespace; year-month bucket = **2026-04** (entries dated 2026-04-XX). > **Archive files are NOT auto-loaded** by `docs-discovery` or any session-start pre-load. Read on-demand when historical context is needed (e.g., a recent entry references LLMP-DEC-X — open this file to read the full text). IDs are preserved (never reassigned). Format identical to the active log. > diff --git a/.github/REPO_PREFIXES.md b/.github/REPO_PREFIXES.md index d4e8978..c765380 100644 --- a/.github/REPO_PREFIXES.md +++ b/.github/REPO_PREFIXES.md @@ -75,11 +75,11 @@ The `` suffix is **4 characters from `[A-Z0-9]`** (36⁴ ≈ 1.7 million c **Generation rules**: 1. Each new entry receives a fresh random suffix at creation time. -2. Before finalizing: the agent globs existing entries (active topic file + all year-bucketed archive files for that topic) and verifies the suffix is not yet used. +2. Before finalizing: the agent globs existing entries (active topic file + all year-month bucket archive files for that topic) and verifies the suffix is not yet used. 3. If collision detected (extremely rare — birthday-paradox 50% probability at ~1300 entries per topic-type-prefix triple): regenerate the suffix. 4. The suffix is **append-only** once assigned — never renumbered, never recycled, never reassigned to a different entry. -**At archive time** (`docs-archive` skill): performs collision-check before moving entries to year-bucketed archive files. If collision detected with an existing archive entry: skill aborts, signals the user, awaits manual resolution — no silent corruption. +**At archive time** (`docs-archive` skill): performs collision-check before moving entries to year-month bucket archive files. If collision detected with an existing archive entry: skill aborts, signals the user, awaits manual resolution — no silent corruption. ## LLMP exception diff --git a/.github/skills/docs-archive/SKILL.md b/.github/skills/docs-archive/SKILL.md index 9e1f2b7..e059fb4 100644 --- a/.github/skills/docs-archive/SKILL.md +++ b/.github/skills/docs-archive/SKILL.md @@ -1,6 +1,6 @@ --- name: docs-archive -description: Rotate entries from active `_ISSUES.md` / `_TODO.md` / `LLM_PROTOCOL_DECISIONS.md` files into **year-month bucket** archive companions (`*__.md`). Two rotation criteria: (Rule A) for `_ISSUES.md` / `_TODO.md` — `Status: Closed` entries archive-eligible (Status field per `TOPIC_CODES.md` 3-value vocabulary); (Rule B) for `LLM_PROTOCOL_DECISIONS.md` — **last-15-active rolling window**: entries beyond the 15 most recent rotate by entry-date (LLMP-DEC-65, supersedes the original "annual at ~50" from LLMP-DEC-25). Year-month bucket from the entry's date. Active files retain a header pointer to archives. Archive files are NOT auto-loaded by `docs-discovery`; agents read them on-demand when historical context becomes relevant. Invoke explicitly ("archive ISSUES", "rotate logs", "archive DEC log") or via LLM-suggest-back when a loaded file is bloated. +description: Rotate entries from active `_ISSUES.md` / `_TODO.md` / `LLM_PROTOCOL_DECISIONS.md` files into **year-month bucket** archive companions (`*__.md`). Two rotation criteria: (Rule A) for `_ISSUES.md` / `_TODO.md` — `Status: Closed` entries archive-eligible (Status field per `TOPIC_CODES.md` 3-value vocabulary); (Rule B) for `LLM_PROTOCOL_DECISIONS.md` — **last-15-active rolling window**: entries beyond the 15 most recent rotate by entry-date (LLMP-DEC-67, supersedes the original "annual at ~50" from LLMP-DEC-25). Year-month bucket from the entry's date. Active files retain a header pointer to archives. Archive files are NOT auto-loaded by `docs-discovery`; agents read them on-demand when historical context becomes relevant. Invoke explicitly ("archive ISSUES", "rotate logs", "archive DEC log") or via LLM-suggest-back when a loaded file is bloated. compatibility: Designed for Claude Code and GitHub Copilot (VS). Uses the host agent's Read/Write/Edit/Glob/Grep tools. metadata: author: Fullepi @@ -8,7 +8,7 @@ metadata: # docs-archive -Lifecycle skill for the workspace's append-only artifact files. Active files grow without bound as work accumulates; this skill consolidates eligible entries into **year-month bucket** archive companions (`*__.md`), keeping the active file as a focused "currently relevant" view. Two rotation criteria: **Status-based** (Rule A) for `_ISSUES.md` / `_TODO.md` per LLMP-DEC-44 vocabulary, and **last-15-active rolling window** (Rule B) for `LLM_PROTOCOL_DECISIONS.md` per LLMP-DEC-65 (supersedes the original yearly-at-~50 rule from LLMP-DEC-25). +Lifecycle skill for the workspace's append-only artifact files. Active files grow without bound as work accumulates; this skill consolidates eligible entries into **year-month bucket** archive companions (`*__.md`), keeping the active file as a focused "currently relevant" view. Two rotation criteria: **Status-based** (Rule A) for `_ISSUES.md` / `_TODO.md` per LLMP-DEC-44 vocabulary, and **last-15-active rolling window** (Rule B) for `LLM_PROTOCOL_DECISIONS.md` per LLMP-DEC-67 (supersedes the original yearly-at-~50 rule from LLMP-DEC-25). ## When to invoke @@ -24,7 +24,7 @@ When a `_ISSUES.md` / `_TODO.md` / `LLM_PROTOCOL_DECISIONS.md` file is loaded an - The file is long enough that loading has noticeable token cost - Closed-to-open ratio is high (e.g., > 50% closed) -Phrase: *"`LOGGING_ISSUES.md` has N closed entries (Fixed/Resolved/...) still in the active file — consider running `docs-archive` to consolidate into year-bucketed archives. (Confirm if you want me to invoke.)"* +Phrase: *"`LOGGING_ISSUES.md` has N closed entries (Fixed/Resolved/...) still in the active file — consider running `docs-archive` to consolidate into year-month bucket archives. (Confirm if you want me to invoke.)"* User confirmation required. Never auto-invoke. @@ -52,7 +52,7 @@ The Decision Log's entries (`LLMP-DEC-N`) generally do NOT carry `Status` fields Instead: **active log keeps last 15 entries** (rolling window — the 15 most-recent `LLMP-DEC-N` IDs). Older entries rotate to archive by **entry date** (year-month bucket from the `Date` column). -Per LLMP-DEC-65 (supersedes the original "annual at ~50 entries" rule from LLMP-DEC-25). Foundational decisions (Rules #1-6, ID format spec, governance, etc.) survive in the **`## Current protocol state (quick reference)` summary** at the top of the active log even after their dated entry archives — that summary is the source of truth for "what's currently active" (LLMP-DEC-25 design + LLMP-DEC-60 governance). +Per LLMP-DEC-67 (supersedes the original "annual at ~50 entries" rule from LLMP-DEC-25). Foundational decisions (Rules #1-6, ID format spec, governance, etc.) survive in the **`## Current protocol state (quick reference)` summary** at the top of the active log even after their dated entry archives — that summary is the source of truth for "what's currently active" (LLMP-DEC-25 design + LLMP-DEC-60 governance). ### Why two rules @@ -97,7 +97,7 @@ For each affected file: 1. **Build archive file content** for each **year-month bucket** present: - Filename: `__.md` (e.g., `LOGGING_ISSUES_2026_04.md`, `LLM_PROTOCOL_DECISIONS_2026_04.md`). - - Header: topic + "Archived entries from `` per LLMP-DEC-65 retention policy. IDs preserved (never reassigned). Format identical to active file." + - Header: topic + "Archived entries from `` per LLMP-DEC-67 retention policy. IDs preserved (never reassigned). Format identical to active file." - Entries: archive-eligible entries dated within that year-month, in original chronological/ID order. - **Sparse files OK**: only month-buckets containing at least one archived entry get a file. No empty placeholder files. @@ -131,11 +131,11 @@ If `LLM_PROTOCOL_DECISIONS.md` is being archived (Rule B): 2. **Identify entries beyond the rolling window**: count active table rows under `## YYYY`. If count > 15, the oldest entries (lowest `LLMP-DEC-N` IDs) above the cap are archive-eligible. 3. **Group archive-eligible entries by year-month** based on each entry's `Date` column. 4. **Filename**: `LLM_PROTOCOL_DECISIONS__.md` (one file per year-month bucket present in the eligible set; sparse OK). -5. **Pointer block** at top of `## YYYY` section in the active log: brief sentence + reference to all known archive files for this log (e.g., "Earlier entries (LLMP-DEC-1..49) archived to `LLM_PROTOCOL_DECISIONS_2026_04.md` per LLMP-DEC-65"). Update / append as more archives accumulate. +5. **Pointer block** at top of `## YYYY` section in the active log: brief sentence + reference to all known archive files for this log (e.g., "Earlier entries (LLMP-DEC-1..49) archived to `LLM_PROTOCOL_DECISIONS_2026_04.md` per LLMP-DEC-67"). Update / append as more archives accumulate. 6. **Cross-link integrity**: when active entries reference archived entries by ID (e.g., LLMP-DEC-58 references LLMP-DEC-43), the references remain functional — readers open the archive file. IDs are append-only and stable. -7. **Governance section** in the summary stays synchronized with the LLMP-DEC-65 last-15-active + year-month bucket rule. If the rule itself changes, governance text + this Step 7 + the frontmatter description all update together (cross-LLMP-DEC governance). +7. **Governance section** in the summary stays synchronized with the LLMP-DEC-67 last-15-active + year-month bucket rule. If the rule itself changes, governance text + this Step 7 + the frontmatter description all update together (cross-LLMP-DEC governance). -Per LLMP-DEC-65 (supersedes the original "annual at ~50 entries" rule from LLMP-DEC-25). Only the new (LLMP-DEC-65) is in effect. +Per LLMP-DEC-67 (supersedes the original "annual at ~50 entries" rule from LLMP-DEC-25). Only the new (LLMP-DEC-67) is in effect. ## Edge cases diff --git a/.github/skills/docs-check/SKILL.md b/.github/skills/docs-check/SKILL.md index d2efc10..ed8561e 100644 --- a/.github/skills/docs-check/SKILL.md +++ b/.github/skills/docs-check/SKILL.md @@ -81,7 +81,7 @@ propose a draft entry. ### Draft entry format -- **Proposed ID**: `---` per the workspace registries — `` from `AyCode.Core/.github/REPO_PREFIXES.md` (use the active repo's prefix), `` and `` from the active repo's `references/TOPIC_CODES.md` (consumer repos may host their own; otherwise fall back to AyCode.Core's canonical). Types: `I` (issue), `T` (TODO), `B` (bug — confirmed broken), `C` (critical — severity override). `` = 4-character random alphanumeric `[A-Z0-9]`; generate then verify uniqueness against the topic's active companion + year-bucketed archive files; regenerate on rare collision (~1.7M-combination space per `--` triple). Marked `[tentative]` since the user verifies prefix/topic choices at apply-time. +- **Proposed ID**: `---` per the workspace registries — `` from `AyCode.Core/.github/REPO_PREFIXES.md` (use the active repo's prefix), `` and `` from the active repo's `references/TOPIC_CODES.md` (consumer repos may host their own; otherwise fall back to AyCode.Core's canonical). Types: `I` (issue), `T` (TODO), `B` (bug — confirmed broken), `C` (critical — severity override). `` = 4-character random alphanumeric `[A-Z0-9]`; generate then verify uniqueness against the topic's active companion + year-month bucket archive files; regenerate on rare collision (~1.7M-combination space per `--` triple). Marked `[tentative]` since the user verifies prefix/topic choices at apply-time. - **Priority**: `P1` (high) / `P2` (important) / `P3` (nice-to-have). Note: `C` type already implies emergency; priority is still stated for precision. - **Rationale**: 1-2 sentences. What's wrong or what's planned. - **Affected**: file/class/method reference (with line number if known) diff --git a/.github/skills/docs-check/references/TOPIC_CODES.md b/.github/skills/docs-check/references/TOPIC_CODES.md index d4ddf18..56b89f0 100644 --- a/.github/skills/docs-check/references/TOPIC_CODES.md +++ b/.github/skills/docs-check/references/TOPIC_CODES.md @@ -58,7 +58,7 @@ The framework (this file) does NOT enumerate higher-layer topics — that would ## ID format rules 1. **Format**: `---` — all uppercase, hyphen-separated. The `` component identifies the owning repo per `AyCode.Core/.github/REPO_PREFIXES.md` (and per each repo's own `@repo.prefix` field). **LLMP exception**: `LLMP-DEC-N` entries (workspace-meta Decision Log) skip the prefix and use sequential `N` instead of `` — single-file serialization avoids parallel-branch collision. -2. **Random suffix**: `` is a 4-character alphanumeric suffix from `[A-Z0-9]` (~1.7M combinations per `--` triple). Generated at entry creation; the agent globs existing entries (active topic file + all year-bucketed archive files) and verifies uniqueness; regenerate on rare collision. +2. **Random suffix**: `` is a 4-character alphanumeric suffix from `[A-Z0-9]` (~1.7M combinations per `--` triple). Generated at entry creation; the agent globs existing entries (active topic file + all year-month bucket archive files) and verifies uniqueness; regenerate on rare collision. 3. **Append-only**: once assigned, IDs never change. If an entry is reversed or superseded, add a NEW entry that references the prior one — do not renumber, do not re-randomize. 4. **Hash anchor** (markdown cross-file refs): lowercase with hyphens preserved (`LOGGING_ISSUES.md#accore-log-i-k7m2` — GitHub auto-converts). Always use the full prefixed form; bare hash anchors without prefix are ambiguous across repos. 5. **No sub-category in ID**: legacy sub-prefixes like `PROTO-`, `DISPATCH-`, `CONN-`, `DS-` are NOT allowed at ID level. Capture sub-category in the entry body header: `## ACCORE-SIG-I-K7M2 [PROTO]: ...`. @@ -138,7 +138,7 @@ The body carries the **nuance**; the Status field only signals archive-eligibili ### Lifecycle: archive -`Closed` entries are eligible for rotation into year-bucketed archive files (`_.md`) via the `docs-archive` skill. Year derived from a date in the entry body. Archive operation is user-invoked — closed entries don't disappear automatically. See `AyCode.Core/.github/skills/docs-archive/SKILL.md`. +`Closed` entries are eligible for rotation into year-month bucket archive files (`__.md`) via the `docs-archive` skill. Year-month derived from a date in the entry body. Archive operation is user-invoked — closed entries don't disappear automatically. See `AyCode.Core/.github/skills/docs-archive/SKILL.md`. ## Change history diff --git a/.github/skills/docs-discovery/SKILL.md b/.github/skills/docs-discovery/SKILL.md index cf1e5bc..9796c9b 100644 --- a/.github/skills/docs-discovery/SKILL.md +++ b/.github/skills/docs-discovery/SKILL.md @@ -118,24 +118,24 @@ If any `{DOMAIN}.md` is loaded (e.g., `LOGGING.md`), ALSO glob and load its comp These are **paired docs** and must be loaded as a set. Skipping ISSUES/TODO risks reintroducing fixed bugs or conflicting with ongoing refactors. -## Archive files (`*_.md`) +## Archive files (`*__.md`) -Closed entries from `_ISSUES.md` / `_TODO.md` / `LLM_PROTOCOL_DECISIONS.md` may be rotated into year-bucketed archive files by the `docs-archive` skill. Examples: -- `LOGGING_ISSUES_2025.md` -- `BINARY_TODO_2026.md` -- `LLM_PROTOCOL_DECISIONS_2026.md` +Closed entries from `_ISSUES.md` / `_TODO.md` / `LLM_PROTOCOL_DECISIONS.md` may be rotated into year-month bucket archive files by the `docs-archive` skill. Examples: +- `LOGGING_ISSUES_2025_03.md` +- `BINARY_TODO_2026_01.md` +- `LLM_PROTOCOL_DECISIONS_2026_04.md` ### Default behaviour: NOT auto-loaded The Step 2 glob patterns target **active** companions only — unsuffixed names. Year-suffixed variants are excluded by default. Practically: -- `**/docs/{TOPIC}/{TOPIC}_ISSUES.md` matches; `**/docs/{TOPIC}/{TOPIC}_ISSUES_2025.md` does NOT. +- `**/docs/{TOPIC}/{TOPIC}_ISSUES.md` matches; `**/docs/{TOPIC}/{TOPIC}_ISSUES_2025_03.md` does NOT. - If a generic `{TOPIC}_*.md` pattern inadvertently matches year-suffixed files, filter them out before passing to Step 4 (Load). ### On-demand read (no user-confirm needed — read-only operation) Read an archive file when ANY of these signals appears: -- A loaded entry references an archived ID (e.g., `Superseded by ACCORE-LOG-I-K7M2` where the random-suffixed ID resolves only to a `_.md` archive) +- A loaded entry references an archived ID (e.g., `Superseded by ACCORE-LOG-I-K7M2` where the random-suffixed ID resolves only to a `__.md` archive) - A code comment or other doc references an ID resolving only to an archive file - The user's request describes a behaviour pattern matching an archived `Fixed` entry's Description (regression suspicion) - The investigation feels like "this was solved before" — read the topic's archive(s) before re-deriving