diff --git a/docs/issues/closed/2517-1669-encapsulate-statistics-repository-state/ISSUE.md b/docs/issues/closed/2517-1669-encapsulate-statistics-repository-state/ISSUE.md index e2240ded7..0a43f4b82 100644 --- a/docs/issues/closed/2517-1669-encapsulate-statistics-repository-state/ISSUE.md +++ b/docs/issues/closed/2517-1669-encapsulate-statistics-repository-state/ISSUE.md @@ -9,7 +9,7 @@ github-issue: 2517 spec-path: docs/issues/closed/2517-1669-encapsulate-statistics-repository-state/ISSUE.md branch: "2517-1669-encapsulate-statistics-repository-state" related-pr: 2527 -last-updated-utc: "2026-10-14 16:00" +last-updated-utc: "2026-10-14 16:55" semantic-links: skill-links: - create-issue @@ -130,7 +130,7 @@ module inside the same file, which keeps access to a private field. - Unifying the five repositories into a shared generic type. - Removing the unused SI-30 statistics traits (`UdpCoreStatsRepository`, `UdpServerStatsRepository`) in `udp-core` and `udp-server`: tracked by #2521 - (`docs/issues/open/2521-1669-remove-unused-udp-stats-traits/ISSUE.md`). + (`docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/ISSUE.md`). - Changelog entries: none of the five packages, nor the repository root, keeps a changelog. ## Architectural Decisions @@ -308,6 +308,8 @@ private field (the pinned `E0616`), with no unrelated reason to fail compilation landed with its package's `refactor(): [#2517] make the statistics repository lock private` commit. History is not rewritten; `manual-verification-evidence.md` carries the same note. +- 2026-10-14 16:55 UTC - GitHub Copilot (#2521 archive session) - #2521's spec moved to + `docs/issues/closed/` (PR #2532); updated the Out of Scope pointer to its new path. ## Acceptance Criteria diff --git a/docs/issues/open/2521-1669-remove-unused-udp-stats-traits/ISSUE.md b/docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/ISSUE.md similarity index 97% rename from docs/issues/open/2521-1669-remove-unused-udp-stats-traits/ISSUE.md rename to docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/ISSUE.md index a7bd3bd2f..c7d0027c9 100644 --- a/docs/issues/open/2521-1669-remove-unused-udp-stats-traits/ISSUE.md +++ b/docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/ISSUE.md @@ -2,14 +2,14 @@ schema-version: 1 doc-type: issue issue-type: task -status: in-progress +status: done priority: p3 epic: 1669 github-issue: 2521 -spec-path: docs/issues/open/2521-1669-remove-unused-udp-stats-traits/ISSUE.md +spec-path: docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/ISSUE.md branch: "2521-1669-remove-unused-udp-stats-traits" related-pr: 2529 -last-updated-utc: "2026-10-14 15:52" +last-updated-utc: "2026-10-14 16:25" semantic-links: skill-links: - create-issue @@ -254,10 +254,10 @@ Status values: `TODO`, `IN_PROGRESS`, `BLOCKED`, `DONE`. - [x] Manual verification scenarios executed and recorded in issue-local `manual-verification-evidence.md` - [x] Acceptance criteria reviewed after implementation and updated with evidence - [x] Evidence-based implementation completion review recorded: issue-local retrospective created for material discoveries, or progress log states why none was needed -- [ ] Reviewer validated acceptance criteria and updated checkboxes +- [x] Reviewer validated acceptance criteria and updated checkboxes - [ ] Independent reviewer reports recorded in issue-local `agent-review-reports.md` when reviewers received this folder-style specification -- [ ] Committer verified spec progress is up to date before commit -- [ ] Issue closed and spec moved from `docs/issues/open/` to `docs/issues/closed/` +- [x] Committer verified spec progress is up to date before commit +- [x] Issue closed and spec moved from `docs/issues/open/` to `docs/issues/closed/` ### Progress Log @@ -386,6 +386,13 @@ Status values: `TODO`, `IN_PROGRESS`, `BLOCKED`, `DONE`. torrust-tracker-rest-api-runtime-adapter --all-features` (stable 1.99.0; 52, 222 + 16, and 3 tests, plus doctests) and Clippy on all targets. The branch is not rebased again, because the review round cites its current commit ids. +- 2026-10-14 16:25 UTC - GitHub Copilot (archive session) - PR #2529 merged on 2026-10-14 at 16:22 UTC + (`90e8daf75`), closing #2521; the review round is audited in + `docs/pr-reviews/pr-2529-review/PR-REVIEW.md`. Cameron's review 5520537884 recomputed the + acceptance criteria and evidence and acknowledged the PR, which ticks the reviewer checkpoint. + The independent-reviewer-reports checkpoint stays open: no review agent received this + folder-style specification, so no `agent-review-reports.md` was needed. Moved the spec to + `docs/issues/closed/` and updated EPIC #1669. ## Acceptance Criteria diff --git a/docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/after/announce.json b/docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/after/announce.json similarity index 100% rename from docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/after/announce.json rename to docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/after/announce.json diff --git a/docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/after/metrics.json b/docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/after/metrics.json similarity index 100% rename from docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/after/metrics.json rename to docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/after/metrics.json diff --git a/docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/after/metrics.prometheus b/docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/after/metrics.prometheus similarity index 100% rename from docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/after/metrics.prometheus rename to docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/after/metrics.prometheus diff --git a/docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/after/stats.json b/docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/after/stats.json similarity index 100% rename from docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/after/stats.json rename to docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/after/stats.json diff --git a/docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/after/stats.prometheus b/docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/after/stats.prometheus similarity index 100% rename from docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/after/stats.prometheus rename to docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/after/stats.prometheus diff --git a/docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/announce.json b/docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/announce.json similarity index 100% rename from docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/announce.json rename to docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/announce.json diff --git a/docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/metrics.json b/docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/metrics.json similarity index 100% rename from docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/metrics.json rename to docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/metrics.json diff --git a/docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/metrics.prometheus b/docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/metrics.prometheus similarity index 100% rename from docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/metrics.prometheus rename to docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/metrics.prometheus diff --git a/docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/stats.json b/docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/stats.json similarity index 100% rename from docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/stats.json rename to docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/stats.json diff --git a/docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/stats.prometheus b/docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/stats.prometheus similarity index 100% rename from docs/issues/open/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/stats.prometheus rename to docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/evidence/baseline/stats.prometheus diff --git a/docs/issues/open/2521-1669-remove-unused-udp-stats-traits/manual-verification-evidence.md b/docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/manual-verification-evidence.md similarity index 98% rename from docs/issues/open/2521-1669-remove-unused-udp-stats-traits/manual-verification-evidence.md rename to docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/manual-verification-evidence.md index 645199d2e..bc9dfc77e 100644 --- a/docs/issues/open/2521-1669-remove-unused-udp-stats-traits/manual-verification-evidence.md +++ b/docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/manual-verification-evidence.md @@ -1,7 +1,7 @@ --- doc-type: manual-verification-evidence -issue-spec: docs/issues/open/2521-1669-remove-unused-udp-stats-traits/ISSUE.md -last-updated-utc: 2026-10-14 15:51 +issue-spec: docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/ISSUE.md +last-updated-utc: 2026-10-14 16:25 --- # Manual Verification Evidence diff --git a/docs/issues/open/1669-overhaul-packages/EPIC.md b/docs/issues/open/1669-overhaul-packages/EPIC.md index 5b54fd800..949c74412 100644 --- a/docs/issues/open/1669-overhaul-packages/EPIC.md +++ b/docs/issues/open/1669-overhaul-packages/EPIC.md @@ -6,7 +6,7 @@ epic: null github-issue: 1669 spec-path: docs/issues/open/1669-overhaul-packages/EPIC.md epic-owner: josecelano -last-updated-utc: "2026-10-14 15:06" +last-updated-utc: "2026-10-14 16:25" semantic-links: skill-links: - create-issue @@ -669,7 +669,7 @@ Status: TODO unless noted. - [ ] [#2482](https://github.com/torrust/torrust-tracker/issues/2482) Reorganize test support code shared between workspace packages _(sub-EPIC; findings 1 and 2 of the 2026-10-06 coupling report; amends DEC-13)_ - [ ] [#2475](https://github.com/torrust/torrust-tracker/issues/2475) Fix coupling-tool module name resolution for renamed dependencies and custom library names _(finding 3 of the 2026-10-06 coupling report)_ - [x] [#2517](https://github.com/torrust/torrust-tracker/issues/2517) Make the statistics repositories' metrics lock private _(Pre-publish API hygiene; five unpublished crates; found by #1348)_ — **DONE** (2026-10-14, PR #2527) -- [ ] [#2521](https://github.com/torrust/torrust-tracker/issues/2521) Remove the unused UDP statistics traits and services _(cleanup; `BanningStats` is removed by #2505)_ +- [x] [#2521](https://github.com/torrust/torrust-tracker/issues/2521) Remove the unused UDP statistics traits and services _(cleanup; `BanningStats` is removed by #2505)_ - [x] [#1881](https://github.com/torrust/torrust-tracker/issues/1881) SI-16: Migrate `contrib/bencode` to `torrust/torrust-bittorrent` as `torrust-bencode` _(Rule E; no blockers within this EPIC)_ - [x] Extract `torrust-clock` to standalone repository — [#1879](https://github.com/torrust/torrust-tracker/issues/1879) _(Rule E; requires completed clock rename and type move work)_ - [x] Extract `torrust-located-error` to standalone repository — [#1894](https://github.com/torrust/torrust-tracker/issues/1894) _(Rule E; requires completed rename SI-10 #1823)_ — **DONE** @@ -733,7 +733,7 @@ Details: | UDP type consolidation | [#1966](https://github.com/torrust/torrust-tracker/issues/1966) — SI-35: Consolidate duplicate UDP types | [docs/issues/closed/1966-1669-si-35-consolidate-duplicate-udp-types/ISSUE.md](../../closed/1966-1669-si-35-consolidate-duplicate-udp-types/ISSUE.md) | DONE | | | Error enum audit | [#2454](https://github.com/torrust/torrust-tracker/issues/2454) — Mark public error enums `#[non_exhaustive]` before first publish | [docs/issues/open/2454-1669-mark-public-error-enums-non-exhaustive/ISSUE.md](../2454-1669-mark-public-error-enums-non-exhaustive/ISSUE.md) | TODO | Pre-publish API checklist; per crate in dependency order, before its first publish | | Statistics lock privacy | [#2517](https://github.com/torrust/torrust-tracker/issues/2517) — Make the statistics repositories' metrics lock private | [docs/issues/closed/2517-1669-encapsulate-statistics-repository-state/ISSUE.md](../../closed/2517-1669-encapsulate-statistics-repository-state/ISSUE.md) | DONE | Pre-publish API hygiene; `udp-core`, `udp-server`, `http-core`, `tracker-core`, `swarm-coordination-registry` | -| Unused UDP stats traits | [#2521](https://github.com/torrust/torrust-tracker/issues/2521) — Remove the unused UDP statistics traits and services | [docs/issues/open/2521-1669-remove-unused-udp-stats-traits/ISSUE.md](../2521-1669-remove-unused-udp-stats-traits/ISSUE.md) | TODO | SI-30 repository traits and `statistics::services`; `BanningStats` is removed by #2505 | +| Unused UDP stats traits | [#2521](https://github.com/torrust/torrust-tracker/issues/2521) — Remove the unused UDP statistics traits and services | [docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/ISSUE.md](../../closed/2521-1669-remove-unused-udp-stats-traits/ISSUE.md) | DONE | SI-30 repository traits and `statistics::services`; `BanningStats` is removed by #2505 | Proposal note: After SI-14, there is a proposal to evaluate a dedicated repository for protocol crates so protocol packages can evolve with BEP/spec changes while tracker app packages evolve with domain/product changes. This is proposal-only for now (not committed scope) and is tracked in [#1835](https://github.com/torrust/torrust-tracker/issues/1835). @@ -756,7 +756,7 @@ After SI-14, there is a proposal to evaluate a dedicated repository for protocol - [docs/issues/open/2482-1669-reorganize-shared-test-support/EPIC.md](../2482-1669-reorganize-shared-test-support/EPIC.md) - [docs/issues/open/2475-1669-coupling-tool-resolve-lib-names-and-renames/ISSUE.md](../2475-1669-coupling-tool-resolve-lib-names-and-renames/ISSUE.md) - [docs/issues/closed/2517-1669-encapsulate-statistics-repository-state/ISSUE.md](../../closed/2517-1669-encapsulate-statistics-repository-state/ISSUE.md) -- [docs/issues/open/2521-1669-remove-unused-udp-stats-traits/ISSUE.md](../2521-1669-remove-unused-udp-stats-traits/ISSUE.md) +- [docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/ISSUE.md](../../closed/2521-1669-remove-unused-udp-stats-traits/ISSUE.md) - [docs/issues/closed/1930-1669-si-33-rest-api-contract-first-architecture/ISSUE.md](../../closed/1930-1669-si-33-rest-api-contract-first-architecture/ISSUE.md) - [docs/issues/closed/1910-1669-si-29-rename-udp-and-http-core-protocol-crates-to-remove-redundant-tracker/ISSUE.md](../../closed/1910-1669-si-29-rename-udp-and-http-core-protocol-crates-to-remove-redundant-tracker/ISSUE.md) > New subissues are created as analysis reveals the next improvement. The EPIC is never @@ -1015,6 +1015,8 @@ Previously referenced tools (screenshots from CodeScene already in the issue com `udp-server`. - 2026-10-14 15:06 UTC - GitHub Copilot - #2517 is done (PR #2527 merged); its spec moved to `docs/issues/closed/2517-1669-encapsulate-statistics-repository-state/`. +- 2026-10-14 16:25 UTC - GitHub Copilot - #2521 is done (PR #2529 merged); its spec moved to + `docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/`. ## Acceptance Criteria diff --git a/docs/pr-reviews/pr-2529-review/PR-REVIEW.md b/docs/pr-reviews/pr-2529-review/PR-REVIEW.md index 6c5608ca3..3b619300c 100644 --- a/docs/pr-reviews/pr-2529-review/PR-REVIEW.md +++ b/docs/pr-reviews/pr-2529-review/PR-REVIEW.md @@ -4,7 +4,7 @@ semantic-links: - process-pr-review related-artifacts: - .github/skills/dev/pr-reviews/process-pr-review/SKILL.md - - docs/issues/open/2521-1669-remove-unused-udp-stats-traits/ISSUE.md + - docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/ISSUE.md --- diff --git a/docs/pr-reviews/pr-2532-review/PR-REVIEW.md b/docs/pr-reviews/pr-2532-review/PR-REVIEW.md new file mode 100644 index 000000000..2551c6768 --- /dev/null +++ b/docs/pr-reviews/pr-2532-review/PR-REVIEW.md @@ -0,0 +1,119 @@ +--- +semantic-links: + skill-links: + - process-pr-review + related-artifacts: + - .github/skills/dev/pr-reviews/process-pr-review/SKILL.md + - docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/ISSUE.md + - docs/issues/closed/2517-1669-encapsulate-statistics-repository-state/ISSUE.md +--- + + + +# PR #2532 Review Audit + +Source: pull-request reviews and inline review threads for . + +## Ownership + +The PR author owns this tracked audit record. Reviewers, including repository review agents, +deliver findings through GitHub and have no repository-artifact obligation. + +- Post-merge workflow approval: N/A + +## Status Values + +- Relationship: `ORIGINAL`, `RE_RAISE_OF:` +- Disposition: `FIXED`, `NO_ACTION`, `SUPERSEDED`, `FOLLOW_UP` +- Thread state: `OPEN`, `RESOLVED`, `NON_RESOLVABLE`, `SUPERSEDED`. `OPEN` applies prospectively + to audits created or updated for approved follow-up work; historical audits remain valid without + bulk migration. +- Severity: `Blocker`, `Major`, `Minor`, `Nit`, `Suggestion`; append `(inferred)` when derived + from free prose. +- Author class: `Copilot`, `Human`, `Unknown` +- Category: `link-integrity`, `formatting`, `metadata`, `testing`, `correctness`, + `documentation`, `maintainability`, `security`, `other` +- An outdated thread whose concern was fixed is `FIXED`/`RESOLVED`, even when GitHub marks the + original thread outdated after the push. For in-PR feedback, use `NO_ACTION`/`SUPERSEDED` only + for a duplicate, superseded, or no-change concern. A post-merge `NO_ACTION` requires maintainer + approval to decline the follow-up work. + +## Findings + +Review 5521450385 (round 1, `copilot-pull-request-reviewer`, state `COMMENTED`, submitted +2026-10-14 16:48 UTC on the head whose tip commit was +`chore(issues): archive closed issue #2521 spec to docs/issues/closed`, +) left no inline comment and reports "0 open findings". Its +"Needs a closer look" sentence is nevertheless an independently actionable assertion, recorded as +`F1` with `Thread state=NON_RESOLVABLE`. The rest of the body summarizes the changes and is not a +further finding. + +Review 5522263962 (round 1, `da2ce7`, state `APPROVED`, submitted 2026-10-14 17:53 UTC on the head +whose tip commit was `docs(pr-reviews): [#2521] add the PR #2532 review audit`, +) approved and left one inline comment bracketed `[Nit][F2]`; +the row keeps that ID. Its body reports what it checked and repeats F2; neither is a further +finding. GitHub dismissed the approval as stale when the F2 fix was pushed. Review 5523636848 +(josecelano, `COMMENTED`, 19:39 UTC) is the container GitHub created for the F2 reply. + +| Finding ID | Review finding reference | Author class | Severity | Category | Relationship | Disposition | Thread state | +| ---------- | ------------------------ | ------------ | -------- | -------- | ------------ | ----------- | ------------ | +| F1 | `review-finding:pr-2532-f1` | Copilot | Nit (inferred) | link-integrity | ORIGINAL | FIXED | NON_RESOLVABLE | +| F2 | `review-finding:pr-2532-f2` | Human | Nit | correctness | ORIGINAL | FIXED | RESOLVED | + +## Finding Details + +### F1 - The archived #2517 spec still points at the old open path of the #2521 spec + +- PR number: 2532 +- Source review ID: 5521450385 +- Reviewer finding ID: N/A +- Source URL: +- Concern: "One live cross-reference in the archived #2517 specification still points to the removed open path": the Out of Scope note in `docs/issues/closed/2517-1669-encapsulate-statistics-repository-state/ISSUE.md` names `docs/issues/open/2521-1669-remove-unused-udp-stats-traits/ISSUE.md`, which this PR moves. +- Solution: The reference had been retained as a historical record, but it is a navigational "tracked by" pointer, so it now names the closed path; the #2517 spec's `last-updated-utc` and progress log record the change. Outside this audit, the two remaining mentions of the old path are `Current-tree verification` commands in the PR #2529 audit, which record the commands as they were run. +- Current-tree verification: outside this audit, whose Concern quotes the old path and whose verification names the search pattern, `rg -n 'open/2521-1669-remove-unused-udp-stats-traits'` matches only lines 132 and 145 of `docs/pr-reviews/pr-2529-review/PR-REVIEW.md`; line 133 of the #2517 spec names `docs/issues/closed/2521-1669-remove-unused-udp-stats-traits/ISSUE.md`. +- Resolution reference: `docs(issues): [#2521] point the archived #2517 spec at the closed #2521 spec` +- Follow-up PR URL: N/A +- Reply URL: + +### F2 - The F1 verification claim is contradicted by this audit's own lines + +- PR number: 2532 +- Source review ID: 5522263962 +- Reviewer finding ID: N/A +- Source URL: +- Concern: Once this audit was committed, the F1 search for the old open path matched four lines, not two: the two PR #2529 audit lines plus this audit's own F1 Concern (which quotes the old path) and F1 verification (which names the search pattern). The F1 Solution's "The two remaining mentions" sentence had the same problem. The validator does not check this prose. +- Solution: Both F1 claims are now scoped to the files outside this audit, and the verification names why the audit's own lines match. This entry avoids quoting the old path, so it adds no further match. +- Current-tree verification: the F1 search returns lines 132 and 145 of the PR #2529 audit and, in this audit, only the F1 Concern and F1 verification lines, as the scoped F1 claims now state. They are named by role because this audit's line numbers shift as entries are added. +- Resolution reference: `docs(pr-reviews): [#2521] scope the PR #2532 audit's old-path search to the files outside it` +- Follow-up PR URL: N/A +- Reply URL: + +## Processing Log + +- 2026-10-14 16:48 UTC - Review 5521450385 (`copilot-pull-request-reviewer`, `COMMENTED`) left no + inline comment; its body flags the #2517 spec reference. +- 2026-10-14 16:55 UTC - Committed the F1 fix at the maintainer's request. +- 2026-10-14 16:58 UTC - Pushed the fix and posted the PR conversation response. +- 2026-10-14 16:58 UTC - Created this audit. +- 2026-10-14 17:53 UTC - Review 5522263962 (`da2ce7`, `APPROVED`) left inline comment 4274337998. +- 2026-10-14 19:37 UTC - Committed the F2 fix at the maintainer's request. +- 2026-10-14 19:39 UTC - Pushed the F2 fix, which dismissed the approval as stale, and posted the + F2 reply. +- 2026-10-14 19:40 UTC - Added F2 to this audit. + +## Completion Rules + +- Re-derive the reply claim against the current tree before replying or resolving a thread. +- Reply on every resolvable thread before resolving it. +- For an outdated thread whose concern was fixed, record `Disposition=FIXED` and + `Thread state=RESOLVED`, even if GitHub marks the thread outdated after the push. For a + duplicate, superseded, or no-change in-PR thread, reply exactly + `Superseded by : .`, record `Disposition=NO_ACTION` and + `Thread state=SUPERSEDED`, then resolve it. A post-merge `NO_ACTION` requires maintainer + approval to decline the follow-up work. +- A consolidated PR conversation response may cover multiple review rounds only when it names + every review ID and every finding ID with its disposition and resolution reference. Record its + durable URL in each related row. +- Cite a fix by its unique Conventional Commit subject or durable reply URL, never by a branch SHA + that can change after a rebase. +- Refresh review threads using GraphQL and confirm that no unresolved actionable thread remains.