diff --git a/.github/skills/dev/planning/cleanup-completed-issues/SKILL.md b/.github/skills/dev/planning/cleanup-completed-issues/SKILL.md index fa7f2c952..f005d8530 100644 --- a/.github/skills/dev/planning/cleanup-completed-issues/SKILL.md +++ b/.github/skills/dev/planning/cleanup-completed-issues/SKILL.md @@ -1,9 +1,9 @@ --- name: cleanup-completed-issues -description: Guide for archiving closed issue specification files from docs/issues/open/ to docs/issues/closed/. Covers verifying closure on GitHub, moving files, updating frontmatter, creating a branch, and opening a PR. Permanent deletion of closed specs is not automated — the user must explicitly request it. Use when cleaning up closed issue specs, archiving issue docs, or maintaining the docs/issues/ folder. Triggers on "cleanup issue", "archive issue", "move closed issue", "clean completed issues", or "maintain issue docs". +description: Guide for archiving closed issue specification files from docs/issues/open/ to docs/issues/closed/. Covers verifying closure on GitHub, moving files, updating frontmatter, auditing and repairing affected documentation links, creating a branch, and opening a PR. Permanent deletion of closed specs is not automated — the user must explicitly request it. Use when cleaning up closed issue specs, archiving issue docs, or maintaining the docs/issues/ folder. Triggers on "cleanup issue", "archive issue", "move closed issue", "clean completed issues", or "maintain issue docs". metadata: author: torrust - version: "1.5" + version: "1.6" --- # Cleaning Up Completed Issues @@ -161,7 +161,47 @@ reflect completed work (manual verification, acceptance criteria review, etc.) b on the actual content of the spec body. Add a progress log entry documenting the archival action. -### Step 4: Update Any Parent Epic Spec +### Step 4: Audit and Repair Documentation References (Mandatory) + +An archive move invalidates every live reference to the old `docs/issues/open/...` path. +After updating the moved documents' own frontmatter, search the repository for each old path +and update all **current** documentation links and references to the new `docs/issues/closed/...` +location. This includes: + +- parent EPIC subissue tables and their frontmatter `semantic-links`; +- active issue specs that name the archived issue as a prerequisite, dependency, or related + artifact; +- ADR frontmatter and body links; and +- frontmatter in moved supplementary artifacts (`evidence.md`, manual-verification records, + and similar documents) that references the moved primary spec. + +When modifying an affected document that has YAML frontmatter, keep its metadata current: + +- preserve its existing `status` unless its actual lifecycle state changed; +- update any changed `spec-path` or `semantic-links.related-artifacts` value; and +- set `last-updated-utc` to the current date when that field exists. + +Do not rewrite immutable historical records (for example, past PR review summaries) merely +because they accurately record the path that existed at the time. Update them only when they +function as a live navigational reference. + +For each archived issue, search for the old path before finishing. For a single-file spec: + +```bash +rg 'docs/issues/open/42-add-peer-expiry-grace-period\.md' \ + --glob '!target/**' --glob '!storage/**' +``` + +For a folder spec, search its folder prefix: + +```bash +rg 'docs/issues/open/42-my-subissue-folder' \ + --glob '!target/**' --glob '!storage/**' +``` + +The remaining results must be either corrected or deliberately retained historical records. + +### Step 5: Update Any Parent Epic Spec If the closed issue was a subissue of an EPIC, update the epic's spec to reflect the new `docs/issues/closed/` path and `DONE` status in its subissue table. @@ -169,7 +209,14 @@ new `docs/issues/closed/` path and `DONE` status in its subissue table. Example: if `docs/issues/open/EPIC.md` has a table row referencing a subissue at `docs/issues/open/...` with `TODO` status, update both the path and status after archiving. -### Step 5: Commit +The parent EPIC is also an affected document under Step 4: update its frontmatter +`semantic-links` and `last-updated-utc` when applicable. + +### Step 6: Validate and Commit + +Before committing, confirm that every changed Markdown frontmatter block is valid YAML and that +each archived primary issue spec has `status: done`, a `spec-path` below `docs/issues/closed/`, +and a current `last-updated-utc`. Also run `git diff --cached --check` after staging. ```bash # Single issue @@ -185,7 +232,7 @@ Run the pre-commit hooks before finishing: ./contrib/dev-tools/git/hooks/pre-commit.sh ``` -### Step 6: Push and Open a Pull Request +### Step 7: Push and Open a Pull Request ```bash FORK_REMOTE="${FORK_REMOTE:-josecelano}" diff --git a/contrib/dev-tools/analysis/workspace-coupling/tests/parse_imports.rs b/contrib/dev-tools/analysis/workspace-coupling/tests/parse_imports.rs index 9e630e810..f1eea4da0 100644 --- a/contrib/dev-tools/analysis/workspace-coupling/tests/parse_imports.rs +++ b/contrib/dev-tools/analysis/workspace-coupling/tests/parse_imports.rs @@ -143,7 +143,7 @@ fn binary_extracts_grouped_reexported_aliased_and_glob_imports() { "workspace-coupling failed: {}", String::from_utf8_lossy(&output.stderr) ); - assert!(output.stdout.is_empty()); + assert_eq!(output.stdout, b""); assert_stderr_is_ndjson(&output.stderr); @@ -193,7 +193,7 @@ fn binary_reports_malformed_rust_as_json_error() { .expect("failed to run workspace-coupling binary"); assert!(!output.status.success()); - assert!(output.stdout.is_empty()); + assert_eq!(output.stdout, b""); let events = assert_stderr_is_ndjson(&output.stderr); assert!(events.iter().any(|event| { diff --git a/docs/adrs/20260727000000_events_are_objective_facts.md b/docs/adrs/20260727000000_events_are_objective_facts.md index 612e87ef0..83754e0a6 100644 --- a/docs/adrs/20260727000000_events_are_objective_facts.md +++ b/docs/adrs/20260727000000_events_are_objective_facts.md @@ -2,7 +2,7 @@ semantic-links: related-artifacts: - docs/adrs/index.md - - docs/issues/open/1136-1978-configurable-udp-connection-id-validation-policy.md + - docs/issues/closed/1136-1978-configurable-udp-connection-id-validation-policy.md - packages/udp-core/src/event.rs - packages/udp-server/src/event.rs - packages/http-core/src/event.rs diff --git a/docs/adrs/20260728115400_define_registar_as_runtime_service_registry.md b/docs/adrs/20260728115400_define_registar_as_runtime_service_registry.md index 732f557cb..99ed98d5d 100644 --- a/docs/adrs/20260728115400_define_registar_as_runtime_service_registry.md +++ b/docs/adrs/20260728115400_define_registar_as_runtime_service_registry.md @@ -4,7 +4,7 @@ semantic-links: - create-adr related-artifacts: - docs/issues/open/1419-allow-multiple-integration-tests-at-main-app-level/ISSUE.md - - docs/issues/open/2036-add-runtime-service-registry-metadata/ISSUE.md + - docs/issues/closed/2036-add-runtime-service-registry-metadata/ISSUE.md - src/container.rs - tests/common/mod.rs - packages/axum-health-check-api-server/src/handlers.rs diff --git a/docs/issues/open/1136-1978-configurable-udp-connection-id-validation-policy.md b/docs/issues/closed/1136-1978-configurable-udp-connection-id-validation-policy.md similarity index 98% rename from docs/issues/open/1136-1978-configurable-udp-connection-id-validation-policy.md rename to docs/issues/closed/1136-1978-configurable-udp-connection-id-validation-policy.md index 42eff233a..d32495a67 100644 --- a/docs/issues/open/1136-1978-configurable-udp-connection-id-validation-policy.md +++ b/docs/issues/closed/1136-1978-configurable-udp-connection-id-validation-policy.md @@ -1,19 +1,19 @@ --- doc-type: issue issue-type: enhancement -status: in_progress +status: done priority: p2 github-issue: 1136 -spec-path: docs/issues/open/1136-1978-configurable-udp-connection-id-validation-policy.md +spec-path: docs/issues/closed/1136-1978-configurable-udp-connection-id-validation-policy.md branch: "1136-connection-id-validation-policy" related-pr: 2002 -last-updated-utc: 2026-07-27 12:36 +last-updated-utc: 2026-08-17 semantic-links: skill-links: - create-issue related-artifacts: - docs/issues/open/1978-configuration-overhaul-epic/EPIC.md - - docs/issues/open/1453-1978-ip-bans-reset-interval-configurable/ISSUE.md + - docs/issues/closed/1453-1978-ip-bans-reset-interval-configurable/ISSUE.md - docs/adrs/20260727000000_events_are_objective_facts.md - packages/configuration/src/v3_0_0/udp_tracker_server.rs - packages/udp-core/src/connection_cookie.rs @@ -230,7 +230,7 @@ Status values: `TODO`, `IN_PROGRESS`, `BLOCKED`, `DONE`. - [ ] Acceptance criteria reviewed after implementation and updated with evidence - [ ] Reviewer validated acceptance criteria and updated checkboxes - [x] Committer verified spec progress is up to date before commit -- [ ] Issue closed and spec moved from `docs/issues/open/` to `docs/issues/closed/` +- [x] Issue closed and spec moved from `docs/issues/open/` to `docs/issues/closed/` ### Progress Log @@ -267,6 +267,7 @@ Status values: `TODO`, `IN_PROGRESS`, `BLOCKED`, `DONE`. `UdpTracker` to global `UdpTrackerServer` after discovering that the shared `BanService` architecture makes a per-instance policy inconsistent. Added ADR-20260727180000 documenting the shared-services design. All code, tests, and docs updated to reflect the global config. +- 2026-08-17 UTC - GitHub Copilot - Archived the specification after GitHub issue #1136 was closed and implementation PR #2032 merged. ## Acceptance Criteria diff --git a/docs/issues/open/1415-1978-use-service-binding-instead-of-socket-addr/ISSUE.md b/docs/issues/closed/1415-1978-use-service-binding-instead-of-socket-addr/ISSUE.md similarity index 97% rename from docs/issues/open/1415-1978-use-service-binding-instead-of-socket-addr/ISSUE.md rename to docs/issues/closed/1415-1978-use-service-binding-instead-of-socket-addr/ISSUE.md index 94da706e8..79135a976 100644 --- a/docs/issues/open/1415-1978-use-service-binding-instead-of-socket-addr/ISSUE.md +++ b/docs/issues/closed/1415-1978-use-service-binding-instead-of-socket-addr/ISSUE.md @@ -4,10 +4,10 @@ issue-type: enhancement status: done priority: p2 github-issue: 1415 -spec-path: docs/issues/open/1415-1978-use-service-binding-instead-of-socket-addr/ISSUE.md +spec-path: docs/issues/closed/1415-1978-use-service-binding-instead-of-socket-addr/ISSUE.md branch: "1415-use-service-binding" related-pr: null -last-updated-utc: 2026-07-22 16:10 +last-updated-utc: 2026-08-17 semantic-links: skill-links: - create-issue @@ -112,7 +112,7 @@ The exact commands and complete relevant outputs are recorded in - [x] Automatic verification completed (`linter all`, relevant tests) - [x] Post-implementation manual verification executed and recorded - [x] Acceptance criteria reviewed after implementation -- [ ] Issue closed and specification moved to `docs/issues/closed/` +- [x] Issue closed and specification moved to `docs/issues/closed/` ### Progress Log @@ -145,6 +145,7 @@ The exact commands and complete relevant outputs are recorded in `server_socket_addr` is derived from `ServiceBinding::bind_address()`. Both fields therefore report the same actual bound address, including an OS-assigned port when configuration uses port `0`. +- 2026-08-17 UTC - GitHub Copilot - Archived the specification after GitHub issue #1415 was closed and implementation PR #2025 merged. ## Acceptance Criteria diff --git a/docs/issues/open/1415-1978-use-service-binding-instead-of-socket-addr/manual-verification.md b/docs/issues/closed/1415-1978-use-service-binding-instead-of-socket-addr/manual-verification.md similarity index 97% rename from docs/issues/open/1415-1978-use-service-binding-instead-of-socket-addr/manual-verification.md rename to docs/issues/closed/1415-1978-use-service-binding-instead-of-socket-addr/manual-verification.md index 8c0fc30a2..35973e31e 100644 --- a/docs/issues/open/1415-1978-use-service-binding-instead-of-socket-addr/manual-verification.md +++ b/docs/issues/closed/1415-1978-use-service-binding-instead-of-socket-addr/manual-verification.md @@ -1,3 +1,11 @@ +--- +spec-path: docs/issues/closed/1415-1978-use-service-binding-instead-of-socket-addr/manual-verification.md +last-updated-utc: 2026-08-17 +semantic-links: + related-artifacts: + - docs/issues/closed/1415-1978-use-service-binding-instead-of-socket-addr/ISSUE.md +--- + # Manual Verification Evidence - Issue #1415 This file preserves reproducible manual-verification evidence before and after the implementation diff --git a/docs/issues/open/1453-1978-ip-bans-reset-interval-configurable/ISSUE.md b/docs/issues/closed/1453-1978-ip-bans-reset-interval-configurable/ISSUE.md similarity index 97% rename from docs/issues/open/1453-1978-ip-bans-reset-interval-configurable/ISSUE.md rename to docs/issues/closed/1453-1978-ip-bans-reset-interval-configurable/ISSUE.md index 99fd377e1..2aa187c7f 100644 --- a/docs/issues/open/1453-1978-ip-bans-reset-interval-configurable/ISSUE.md +++ b/docs/issues/closed/1453-1978-ip-bans-reset-interval-configurable/ISSUE.md @@ -1,13 +1,13 @@ --- doc-type: issue issue-type: enhancement -status: in_review +status: done priority: p2 github-issue: 1453 -spec-path: docs/issues/open/1453-1978-ip-bans-reset-interval-configurable/ISSUE.md +spec-path: docs/issues/closed/1453-1978-ip-bans-reset-interval-configurable/ISSUE.md branch: "1453-ip-bans-reset-interval" related-pr: null -last-updated-utc: 2026-07-24 15:59 +last-updated-utc: 2026-08-17 semantic-links: skill-links: - create-issue @@ -16,7 +16,7 @@ semantic-links: - packages/configuration/src/v3_0_0/types.rs - docs/adrs/20260723184019_separate_configuration_value_invariants_from_consistency_validation.md - docs/application-jobs.md - - docs/issues/open/1453-1978-ip-bans-reset-interval-configurable/evidence/ + - docs/issues/closed/1453-1978-ip-bans-reset-interval-configurable/evidence/ - packages/udp-core/src/services/banning.rs - packages/udp-server/src/server/launcher.rs - src/bootstrap/jobs/ @@ -125,7 +125,7 @@ Since all UDP servers are launched simultaneously at startup, the bans are being - [x] Automatic verification completed (`linter all`, formatting, and focused tests) - [x] Manual verification scenarios executed and recorded - [x] Acceptance criteria reviewed after implementation -- [ ] Issue closed and spec moved to `docs/issues/open/` +- [x] Issue closed and spec moved to `docs/issues/closed/` ### Progress Log @@ -159,6 +159,7 @@ Since all UDP servers are launched simultaneously at startup, the bans are being - 2026-07-24 15:59 UTC - agent - Recorded M2 manual runtime evidence in [`evidence/2026-07-24-manual-runtime-verification.md`](evidence/2026-07-24-manual-runtime-verification.md). Two UDP listeners started locally and produced one cleanup-job start log entry. +- 2026-08-17 UTC - GitHub Copilot - Archived the specification after GitHub issue #1453 was closed and implementation PR #2029 merged. ## Acceptance Criteria diff --git a/docs/issues/open/1453-1978-ip-bans-reset-interval-configurable/evidence/2026-07-24-manual-runtime-verification.md b/docs/issues/closed/1453-1978-ip-bans-reset-interval-configurable/evidence/2026-07-24-manual-runtime-verification.md similarity index 92% rename from docs/issues/open/1453-1978-ip-bans-reset-interval-configurable/evidence/2026-07-24-manual-runtime-verification.md rename to docs/issues/closed/1453-1978-ip-bans-reset-interval-configurable/evidence/2026-07-24-manual-runtime-verification.md index ac0954bb1..a1b10beab 100644 --- a/docs/issues/open/1453-1978-ip-bans-reset-interval-configurable/evidence/2026-07-24-manual-runtime-verification.md +++ b/docs/issues/closed/1453-1978-ip-bans-reset-interval-configurable/evidence/2026-07-24-manual-runtime-verification.md @@ -1,10 +1,12 @@ --- +spec-path: docs/issues/closed/1453-1978-ip-bans-reset-interval-configurable/evidence/2026-07-24-manual-runtime-verification.md +last-updated-utc: 2026-08-17 semantic-links: skill-links: - run-tracker-locally related-artifacts: - issue #1453 - - docs/issues/open/1453-1978-ip-bans-reset-interval-configurable/ISSUE.md + - docs/issues/closed/1453-1978-ip-bans-reset-interval-configurable/ISSUE.md - src/app.rs - src/bootstrap/jobs/udp_tracker_server.rs - packages/udp-server/src/server/launcher.rs diff --git a/docs/issues/open/2019-automatically-format-project-dictionary/ISSUE.md b/docs/issues/closed/2019-automatically-format-project-dictionary/ISSUE.md similarity index 97% rename from docs/issues/open/2019-automatically-format-project-dictionary/ISSUE.md rename to docs/issues/closed/2019-automatically-format-project-dictionary/ISSUE.md index 7c204e527..c0c6c7f4f 100644 --- a/docs/issues/open/2019-automatically-format-project-dictionary/ISSUE.md +++ b/docs/issues/closed/2019-automatically-format-project-dictionary/ISSUE.md @@ -1,13 +1,13 @@ --- doc-type: issue issue-type: enhancement -status: open +status: done priority: p2 github-issue: 2019 -spec-path: docs/issues/open/2019-automatically-format-project-dictionary/ISSUE.md +spec-path: docs/issues/closed/2019-automatically-format-project-dictionary/ISSUE.md branch: "2019-automatically-format-project-dictionary" related-pr: 2020 -last-updated-utc: 2026-07-22 00:00 +last-updated-utc: 2026-08-17 semantic-links: skill-links: - create-issue @@ -76,7 +76,7 @@ Status values: `TODO`, `IN_PROGRESS`, `BLOCKED`, `DONE`. - [x] Acceptance criteria reviewed after implementation and updated with evidence - [ ] Reviewer validated acceptance criteria and updated checkboxes - [ ] Committer verified spec progress is up to date before commit -- [ ] Issue closed and spec moved from `docs/issues/open/` to `docs/issues/closed/` +- [x] Issue closed and spec moved from `docs/issues/open/` to `docs/issues/closed/` ### Progress Log @@ -90,6 +90,7 @@ Append one line per meaningful update. - 2026-07-22 00:00 UTC - GitHub Copilot - Verified `TORRUST_GIT_HOOKS_LOG_DIR=.tmp ./contrib/dev-tools/git/hooks/pre-push.sh --format=json`; all nightly checks, documentation build, and stable workspace tests passed - 2026-07-22 00:00 UTC - GitHub Copilot - Re-reviewed the acceptance criteria against the implementation and recorded the existing verification evidence - 2026-07-22 00:00 UTC - GitHub Copilot - Moved the specification into the documented issue-folder layout after review feedback +- 2026-08-17 UTC - GitHub Copilot - Archived the specification after GitHub issue #2019 was closed and implementation PR #2020 merged. ## Acceptance Criteria diff --git a/docs/issues/open/2022-vendor-and-document-maintainer-merge-workflow/COPYING b/docs/issues/closed/2022-vendor-and-document-maintainer-merge-workflow/COPYING similarity index 100% rename from docs/issues/open/2022-vendor-and-document-maintainer-merge-workflow/COPYING rename to docs/issues/closed/2022-vendor-and-document-maintainer-merge-workflow/COPYING diff --git a/docs/issues/open/2022-vendor-and-document-maintainer-merge-workflow/ISSUE.md b/docs/issues/closed/2022-vendor-and-document-maintainer-merge-workflow/ISSUE.md similarity index 96% rename from docs/issues/open/2022-vendor-and-document-maintainer-merge-workflow/ISSUE.md rename to docs/issues/closed/2022-vendor-and-document-maintainer-merge-workflow/ISSUE.md index 28facbba6..8ee6bcd28 100644 --- a/docs/issues/open/2022-vendor-and-document-maintainer-merge-workflow/ISSUE.md +++ b/docs/issues/closed/2022-vendor-and-document-maintainer-merge-workflow/ISSUE.md @@ -1,13 +1,13 @@ --- doc-type: issue issue-type: task -status: open +status: done priority: p2 github-issue: 2022 -spec-path: docs/issues/open/2022-vendor-and-document-maintainer-merge-workflow/ISSUE.md +spec-path: docs/issues/closed/2022-vendor-and-document-maintainer-merge-workflow/ISSUE.md branch: "2022-vendor-and-document-maintainer-merge-workflow" related-pr: null -last-updated-utc: 2026-07-22 15:30 +last-updated-utc: 2026-08-17 semantic-links: skill-links: - create-issue @@ -17,7 +17,7 @@ semantic-links: - .github/skills/dev/git-workflow/merge-pull-request/SKILL.md - contrib/dev-tools/git/ - cspell.json - - docs/issues/open/2022-vendor-and-document-maintainer-merge-workflow/github-merge.py + - docs/issues/closed/2022-vendor-and-document-maintainer-merge-workflow/github-merge.py - docs/issues/open/2003-overhaul-guardrails-and-automation/EPIC.md - project-words.txt --- @@ -90,7 +90,7 @@ Status values: `TODO`, `IN_PROGRESS`, `BLOCKED`, `DONE`. - [ ] Acceptance criteria reviewed after implementation and updated with evidence - [ ] Reviewer validated acceptance criteria and updated checkboxes - [ ] Committer verified spec progress is up to date before commit -- [ ] Issue closed and spec moved from `docs/issues/open/` to `docs/issues/closed/` +- [x] Issue closed and spec moved from `docs/issues/open/` to `docs/issues/closed/` ### Progress Log @@ -100,6 +100,7 @@ Append one line per meaningful update. - 2026-07-22 13:00 UTC - GitHub Copilot - User approved the specification; created GitHub issue #2022 with the `task`, `Documentation`, and `Automation` labels - `https://github.com/torrust/torrust-tracker/issues/2022` - 2026-07-22 15:30 UTC - GitHub Copilot - Corrected reviewed specification wording and added the MIT license text referenced by the immutable planning snapshot - PR #2024 - 2026-07-23 00:00 UTC - GitHub Copilot - Verified the planning snapshot and external source against the recorded SHA-256, then vendored the byte-identical MIT-licensed tool with a repository-local wrapper, deterministic dry-run coverage, and maintainer merge skill - implementation branch `2022-vendor-and-document-maintainer-merge-workflow` +- 2026-08-17 UTC - GitHub Copilot - Archived the specification after GitHub issue #2022 was closed and implementation PR #2027 merged. ## Acceptance Criteria @@ -171,7 +172,7 @@ Notes: - Related issues: #2003, #2022 - Related PRs: #2020 - External source before vendoring: `/home/josecelano/Bin/github-merge.py` -- Current source snapshot: `docs/issues/open/2022-vendor-and-document-maintainer-merge-workflow/github-merge.py` (SHA-256 `e390eb014131f3183a2cba642134974a6b09b19a65322d17dd7c81cf4ffbaad2`) +- Current source snapshot: `docs/issues/closed/2022-vendor-and-document-maintainer-merge-workflow/github-merge.py` (SHA-256 `e390eb014131f3183a2cba642134974a6b09b19a65322d17dd7c81cf4ffbaad2`) - `cspell.json` - `contrib/dev-tools/git/hooks/pre-commit.sh` - `contrib/dev-tools/git/format-project-words.sh` diff --git a/docs/issues/open/2022-vendor-and-document-maintainer-merge-workflow/github-merge.py b/docs/issues/closed/2022-vendor-and-document-maintainer-merge-workflow/github-merge.py similarity index 100% rename from docs/issues/open/2022-vendor-and-document-maintainer-merge-workflow/github-merge.py rename to docs/issues/closed/2022-vendor-and-document-maintainer-merge-workflow/github-merge.py diff --git a/docs/issues/open/2036-add-runtime-service-registry-metadata/ISSUE.md b/docs/issues/closed/2036-add-runtime-service-registry-metadata/ISSUE.md similarity index 94% rename from docs/issues/open/2036-add-runtime-service-registry-metadata/ISSUE.md rename to docs/issues/closed/2036-add-runtime-service-registry-metadata/ISSUE.md index 8269533b2..5430afce5 100644 --- a/docs/issues/open/2036-add-runtime-service-registry-metadata/ISSUE.md +++ b/docs/issues/closed/2036-add-runtime-service-registry-metadata/ISSUE.md @@ -1,13 +1,13 @@ --- doc-type: issue issue-type: enhancement -status: open +status: done priority: p1 github-issue: 2036 -spec-path: docs/issues/open/2036-add-runtime-service-registry-metadata/ISSUE.md +spec-path: docs/issues/closed/2036-add-runtime-service-registry-metadata/ISSUE.md branch: 2036-add-runtime-service-registry-metadata related-pr: null -last-updated-utc: 2026-07-29 16:15 +last-updated-utc: 2026-08-17 semantic-links: skill-links: - write-unit-test @@ -15,7 +15,7 @@ semantic-links: - docs/adrs/20260728115400_define_registar_as_runtime_service_registry.md - docs/issues/open/1419-allow-multiple-integration-tests-at-main-app-level/ISSUE.md - docs/issues/open/2035-fix-duplicate-port-zero-tracker-instance-bootstrap/ISSUE.md - - docs/issues/open/2041-migrate-runtime-service-registry-metadata/ISSUE.md + - docs/issues/closed/2041-migrate-runtime-service-registry-metadata/ISSUE.md - packages/axum-http-server/src/server.rs - packages/axum-rest-api-server/src/server.rs - packages/primitives/src/configuration_instance_id.rs @@ -100,8 +100,8 @@ in [#2041](../2041-migrate-runtime-service-registry-metadata/ISSUE.md), which de - [x] GitHub issue created: #2036 - [x] Implementation completed - [x] Automatic verification completed (`linter all`, relevant tests) -- [ ] Acceptance criteria reviewed after implementation -- [ ] Issue closed and specification moved to `docs/issues/closed/` +- [x] Acceptance criteria reviewed after implementation +- [x] Issue closed and specification moved to `docs/issues/closed/` ### Progress Log @@ -116,6 +116,7 @@ in [#2041](../2041-migrate-runtime-service-registry-metadata/ISSUE.md), which de - 2026-07-29 16:28 UTC - agent - Replaced the HTTP, REST API, and UDP health-check `TYPE_STRING` values with their corresponding `ServiceRole` identifiers. The REST API canonical string is `tracker_rest_api` to preserve its existing health-check response value. +- 2026-08-17 UTC - GitHub Copilot - Archived the specification after GitHub issue #2036 was closed and implementation PR #2042 merged. ## Acceptance Criteria diff --git a/docs/issues/open/2041-migrate-runtime-service-registry-metadata/ISSUE.md b/docs/issues/closed/2041-migrate-runtime-service-registry-metadata/ISSUE.md similarity index 97% rename from docs/issues/open/2041-migrate-runtime-service-registry-metadata/ISSUE.md rename to docs/issues/closed/2041-migrate-runtime-service-registry-metadata/ISSUE.md index 82b9b4c3f..5366b2489 100644 --- a/docs/issues/open/2041-migrate-runtime-service-registry-metadata/ISSUE.md +++ b/docs/issues/closed/2041-migrate-runtime-service-registry-metadata/ISSUE.md @@ -1,13 +1,13 @@ --- doc-type: issue issue-type: enhancement -status: open +status: done priority: p1 github-issue: 2041 -spec-path: docs/issues/open/2041-migrate-runtime-service-registry-metadata/ISSUE.md +spec-path: docs/issues/closed/2041-migrate-runtime-service-registry-metadata/ISSUE.md branch: "2041-migrate-runtime-service-registry-metadata" related-pr: null -last-updated-utc: 2026-07-30 00:00 +last-updated-utc: 2026-08-17 semantic-links: skill-links: - create-issue @@ -16,7 +16,7 @@ semantic-links: - .github/skills/dev/planning/create-issue/SKILL.md - docs/adrs/20260728115400_define_registar_as_runtime_service_registry.md - docs/issues/open/2035-fix-duplicate-port-zero-tracker-instance-bootstrap/ISSUE.md - - docs/issues/open/2036-add-runtime-service-registry-metadata/ISSUE.md + - docs/issues/closed/2036-add-runtime-service-registry-metadata/ISSUE.md - docs/issues/open/2039-normalize-per-instance-event-metrics-policy/ISSUE.md - docs/issues/open/1419-allow-multiple-integration-tests-at-main-app-level/ISSUE.md - src/container.rs @@ -248,10 +248,10 @@ For every code-changing task (T2-T9): - [ ] Spec-only PR merged into `develop` before implementation - [x] Prerequisites merged - [x] Implementation completed -- [ ] Automatic verification completed (`linter all`, relevant tests in both repositories) -- [ ] Manual verification scenarios executed and recorded +- [x] Automatic verification completed (`linter all`, relevant tests in both repositories) +- [x] Manual verification scenarios executed and recorded - [ ] Acceptance criteria reviewed after implementation -- [ ] Issue closed and spec moved to `docs/issues/closed/` +- [x] Issue closed and spec moved to `docs/issues/closed/` ### Progress Log @@ -265,6 +265,7 @@ For every code-changing task (T2-T9): - 2026-07-31 UTC - agent - Independent completion review confirmed AC1-AC7 have code and focused-test support. T10 remains in progress because the recorded evidence does not provide manual baseline/post-change scenarios for every code-changing task, as required by AC9 and the progressive verification protocol. - 2026-07-31 UTC - user and agent - Added runtime identity logging to this PR's scope. Startup logs will expose canonical role, instance index, and final service binding as tracing fields rather than debug-rendered metadata. This convention is documented in a focused skill; no ADR is needed. - 2026-07-31 UTC - agent - Replaced automatic `RuntimeServiceMetadata` capture in HTTP, UDP, and REST startup spans with explicit `service_role` and `instance_index` fields. Added post-bind events with `service_binding` for HTTP, UDP, REST, and health APIs. Focused server, health integration, port-zero/scaffold, and lint checks passed. The manual probe must use Ctrl+C rather than `timeout`, because the tracker currently handles SIGINT but not SIGTERM; that behavior is outside this issue and belongs to the shutdown overhaul (#1488). +- 2026-08-17 UTC - GitHub Copilot - Archived the specification after GitHub issue #2041 was closed and implementation PR #2048 merged. ## Acceptance Criteria @@ -311,4 +312,4 @@ For every code-changing task (T2-T9): - #2039: event-metrics normalization consumer - #1419: main application test helper migration - `docs/adrs/20260728115400_define_registar_as_runtime_service_registry.md` -- `docs/issues/open/2036-add-runtime-service-registry-metadata/ISSUE.md` +- `docs/issues/closed/2036-add-runtime-service-registry-metadata/ISSUE.md` diff --git a/docs/issues/open/2041-migrate-runtime-service-registry-metadata/evidence.md b/docs/issues/closed/2041-migrate-runtime-service-registry-metadata/evidence.md similarity index 98% rename from docs/issues/open/2041-migrate-runtime-service-registry-metadata/evidence.md rename to docs/issues/closed/2041-migrate-runtime-service-registry-metadata/evidence.md index 70029c6b2..f727b5cdc 100644 --- a/docs/issues/open/2041-migrate-runtime-service-registry-metadata/evidence.md +++ b/docs/issues/closed/2041-migrate-runtime-service-registry-metadata/evidence.md @@ -1,3 +1,11 @@ +--- +spec-path: docs/issues/closed/2041-migrate-runtime-service-registry-metadata/evidence.md +last-updated-utc: 2026-08-17 +semantic-links: + related-artifacts: + - docs/issues/closed/2041-migrate-runtime-service-registry-metadata/ISSUE.md +--- + # Progressive Verification Evidence Record baseline and post-change manual verification for each code-changing task diff --git a/docs/issues/open/889-1978-new-config-option-for-logging-style.md b/docs/issues/closed/889-1978-new-config-option-for-logging-style.md similarity index 97% rename from docs/issues/open/889-1978-new-config-option-for-logging-style.md rename to docs/issues/closed/889-1978-new-config-option-for-logging-style.md index c7a08ef09..c9629b28a 100644 --- a/docs/issues/open/889-1978-new-config-option-for-logging-style.md +++ b/docs/issues/closed/889-1978-new-config-option-for-logging-style.md @@ -1,13 +1,13 @@ --- doc-type: issue issue-type: enhancement -status: open +status: done priority: p2 github-issue: 889 -spec-path: docs/issues/open/889-1978-new-config-option-for-logging-style.md +spec-path: docs/issues/closed/889-1978-new-config-option-for-logging-style.md branch: "889-logging-style" related-pr: null -last-updated-utc: 2026-07-13 21:00 +last-updated-utc: 2026-08-17 semantic-links: skill-links: - create-issue @@ -142,7 +142,7 @@ All four variants are simple unit variants — no boolean parameters. The `displ - [x] Automatic verification completed (`linter all`, relevant tests) - [ ] Manual verification scenarios executed and recorded (deferred to #1980) - [ ] Acceptance criteria reviewed after implementation -- [ ] Issue closed and spec moved to `docs/issues/open/` +- [x] Issue closed and spec moved to `docs/issues/closed/` ### Progress Log @@ -152,6 +152,7 @@ All four variants are simple unit variants — no boolean parameters. The `displ - 2026-07-28 00:00 UTC - josecelano - Confirmed that `trace_filter` retains the current level-only `Threshold` scope. Full tracing directives and per-module filtering are deferred to a separate feature. - 2026-07-28 00:00 UTC - josecelano - Implemented and automatically verified the v3-only logging schema. Migration of global callers and shipped v2 defaults remains deferred to #1980. - 2026-07-28 17:30 UTC - josecelano - Ready for PR. Manual verification deferred to #1980 (final cleanup) since v3 schema is not yet the active global schema. +- 2026-08-17 UTC - GitHub Copilot - Archived the specification after GitHub issue #889 was closed and implementation PR #2037 merged. ## Acceptance Criteria diff --git a/docs/issues/closed/README.md b/docs/issues/closed/README.md index 72ec875bd..05fe7ff9d 100644 --- a/docs/issues/closed/README.md +++ b/docs/issues/closed/README.md @@ -23,6 +23,13 @@ Closed spec files are moved here (rather than deleted immediately) because: - It provides a grace period before permanent removal, reducing the risk of losing context that is still actively referenced. +## Archive Maintenance + +Archiving a spec also requires repairing live documentation references to its former +`docs/issues/open/` path and updating frontmatter in every affected current document. This keeps +EPIC tables, issue dependencies, ADR links, and issue-local evidence discoverable after the move. +The authoritative procedure is the cleanup workflow skill below. + ## References - Issues index: [../README.md](../README.md) diff --git a/docs/issues/open/1419-allow-multiple-integration-tests-at-main-app-level/ISSUE.md b/docs/issues/open/1419-allow-multiple-integration-tests-at-main-app-level/ISSUE.md index d342fcb1b..e5bd58e52 100644 --- a/docs/issues/open/1419-allow-multiple-integration-tests-at-main-app-level/ISSUE.md +++ b/docs/issues/open/1419-allow-multiple-integration-tests-at-main-app-level/ISSUE.md @@ -7,14 +7,14 @@ github-issue: 1419 spec-path: docs/issues/open/1419-allow-multiple-integration-tests-at-main-app-level/ISSUE.md branch: 1419-allow-multiple-integration-tests related-pr: null -last-updated-utc: 2026-07-28 11:54 +last-updated-utc: 2026-08-17 semantic-links: skill-links: - write-unit-test related-artifacts: - docs/adrs/20260728115400_define_registar_as_runtime_service_registry.md - docs/issues/open/2035-fix-duplicate-port-zero-tracker-instance-bootstrap/ISSUE.md - - docs/issues/open/2036-add-runtime-service-registry-metadata/ISSUE.md + - docs/issues/closed/2036-add-runtime-service-registry-metadata/ISSUE.md - tests/stats.rs - tests/servers/ - src/app.rs @@ -379,7 +379,7 @@ merged independently; #1419 remains open and resumes on that clean base. — `AppContainer` stores HTTP and UDP per-instance containers in `HashMap`. Repeated `0.0.0.0:0` configuration blocks overwrite each other before startup, so distinct per-instance configuration can be silently lost. -2. Feature #2036: [add runtime service registry metadata](../../open/2036-add-runtime-service-registry-metadata/ISSUE.md) +2. Feature #2036: [add runtime service registry metadata](../../closed/2036-add-runtime-service-registry-metadata/ISSUE.md) — `Registar` cannot expose stable service role or configuration-instance identity without health-check side effects. This requires a coordinated `torrust-server-lib` change and release. diff --git a/docs/issues/open/1419-allow-multiple-integration-tests-at-main-app-level/investigation-registar-and-health-check.md b/docs/issues/open/1419-allow-multiple-integration-tests-at-main-app-level/investigation-registar-and-health-check.md index 714bb1b38..553d54906 100644 --- a/docs/issues/open/1419-allow-multiple-integration-tests-at-main-app-level/investigation-registar-and-health-check.md +++ b/docs/issues/open/1419-allow-multiple-integration-tests-at-main-app-level/investigation-registar-and-health-check.md @@ -200,4 +200,4 @@ This investigation remains the record of observed current behavior, the discover the reasoning that led to the change. The approved architectural boundary is defined by [ADR 20260728115400](../../../adrs/20260728115400_define_registar_as_runtime_service_registry.md). The ordered implementation and validation work is defined by the -[runtime service registry metadata feature](../../open/2036-add-runtime-service-registry-metadata/ISSUE.md). +[runtime service registry metadata feature](../../closed/2036-add-runtime-service-registry-metadata/ISSUE.md). diff --git a/docs/issues/open/1978-configuration-overhaul-epic/EPIC.md b/docs/issues/open/1978-configuration-overhaul-epic/EPIC.md index 88659fb92..bf7192a27 100644 --- a/docs/issues/open/1978-configuration-overhaul-epic/EPIC.md +++ b/docs/issues/open/1978-configuration-overhaul-epic/EPIC.md @@ -4,7 +4,7 @@ status: open github-issue: 1978 spec-path: docs/issues/open/1978-configuration-overhaul-epic/EPIC.md epic-owner: josecelano -last-updated-utc: 2026-07-27 00:00 +last-updated-utc: 2026-08-17 semantic-links: skill-links: - create-issue @@ -14,8 +14,8 @@ semantic-links: - docs/issues/open/1978-configuration-overhaul-epic/configuration-v2-to-v3-migration.md - docs/issues/closed/1417-1978-add-public-service-url-to-configuration.md - docs/issues/closed/1640-1978-per-http-tracker-on-reverse-proxy-setting.md - - docs/issues/open/1136-1978-configurable-udp-connection-id-validation-policy.md - - docs/issues/open/1415-1978-use-service-binding-instead-of-socket-addr/ISSUE.md + - docs/issues/closed/1136-1978-configurable-udp-connection-id-validation-policy.md + - docs/issues/closed/1415-1978-use-service-binding-instead-of-socket-addr/ISSUE.md - docs/issues/open/1987-add-config-option-to-use-ip-from-announce-query-string/ISSUE.md - docs/issues/open/2023-1978-expose-configured-public-urls-in-runtime-observability.md - docs/adrs/20260617093046_reject_wildcard_external_ip.md @@ -84,20 +84,20 @@ version from `2.0.0` to `3.0.0`. Status values: `TODO`, `IN_PROGRESS`, `IN_REVIEW`, `BLOCKED`, `DONE`. -| Order | Issue | Local Spec | Status | Notes | -| ----- | -------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | -| 1 | [#1979](../../issues/1979) — Copy `v2_0_0` → `v3_0_0` as baseline | `docs/issues/closed/1979-1978-copy-configuration-schema-v2-to-v3-baseline.md` | DONE | Merged in PR #1999; v3 baseline and smoke tests are in `develop` | -| 2 | [#1981](../../issues/1981) — Fix `tsl_config` → `tls_config` typo | `docs/issues/closed/1981-1978-fix-tsl-config-tls-config-typo.md` | DONE | Implemented for v3; v2 compatibility retained until final migration | -| 3 | [#1640](../../issues/1640) — Support per-HTTP-tracker `on_reverse_proxy` setting | `docs/issues/closed/1640-1978-per-http-tracker-on-reverse-proxy-setting.md` | DONE | Merged in PR #2014; v3 schema slice complete; runtime consumers deferred to #11 | -| 4 | [#1417](../../issues/1417) — Include public service URL in configuration | `docs/issues/closed/1417-1978-add-public-service-url-to-configuration.md` | DONE | Merged in PR #2016; typed `Option`/`Option` newtypes on `HttpTracker`, `UdpTracker`, `HttpApi`; scheme validation at deserialization | -| 5 | [#1415](../../issues/1415) — Use `ServiceBinding` instead of bare `SocketAddr` for service identity | `docs/issues/open/1415-1978-use-service-binding-instead-of-socket-addr/ISSUE.md` | DONE | Added protocol-aware `service_binding` alongside compatible `server_socket_addr` fields in HTTP, REST API, and UDP error logs; verified manually. | -| 6 | [#1453](../../issues/1453) — IP bans reset interval configurable + fix duplicate cleanup | `docs/issues/open/1453-1978-ip-bans-reset-interval-configurable/ISSUE.md` | IN_REVIEW | V3 setting validated; one cancellation-managed bootstrap cleanup job uses the v3 default constant. Runtime configuration use is deferred to #1980. | -| 7 | [#1136](../../issues/1136) — Add configurable UDP connection ID validation policy | `docs/issues/open/1136-1978-configurable-udp-connection-id-validation-policy.md` | IN_REVIEW | PR #2032; all 12 ACs met; manual verification deferred to #1980 | -| 8 | [#1490](../../issues/1490) — Decompose database config and overhaul secrets with `secrecy` crate | `docs/issues/open/1490-1978-decompose-database-config-and-overhaul-secrets.md` | TODO | After #3 (both touch `Core`); can be parallel with #5, #6, #7, #9 | -| 9 | [#889](../../issues/889) — New config option for logging style | `docs/issues/open/889-1978-new-config-option-for-logging-style.md` | IN_REVIEW | v3 schema implemented; includes negative test for removed `threshold` key; pending commit. Deps on #1 only. | -| 10 | [#1987](../../issues/1987) — Use peer IP from the HTTP announce `ip` parameter when configured | `docs/issues/open/1987-add-config-option-to-use-ip-from-announce-query-string/ISSUE.md` | TODO | After #3 and external prerequisite #1985; per-HTTP-tracker opt-in policy | -| 11 | [#1980](../../issues/1980) — Final cleanup: remove global re-exports, migrate consumers to explicit v3 imports | `docs/issues/open/1980-1978-configuration-overhaul-final-cleanup.md` | TODO | Must precede #12; depends on all other existing subissues | -| 12 | [#2023](../../issues/2023) — Expose configured public URLs in runtime observability | `docs/issues/open/2023-1978-expose-configured-public-urls-in-runtime-observability.md` | TODO | Must follow #1417 and #1980; adds `public_url` to health checks, metrics, and logs without replacing ServiceBinding | +| Order | Issue | Local Spec | Status | Notes | +| ----- | -------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- | +| 1 | [#1979](../../issues/1979) — Copy `v2_0_0` → `v3_0_0` as baseline | `docs/issues/closed/1979-1978-copy-configuration-schema-v2-to-v3-baseline.md` | DONE | Merged in PR #1999; v3 baseline and smoke tests are in `develop` | +| 2 | [#1981](../../issues/1981) — Fix `tsl_config` → `tls_config` typo | `docs/issues/closed/1981-1978-fix-tsl-config-tls-config-typo.md` | DONE | Implemented for v3; v2 compatibility retained until final migration | +| 3 | [#1640](../../issues/1640) — Support per-HTTP-tracker `on_reverse_proxy` setting | `docs/issues/closed/1640-1978-per-http-tracker-on-reverse-proxy-setting.md` | DONE | Merged in PR #2014; v3 schema slice complete; runtime consumers deferred to #11 | +| 4 | [#1417](../../issues/1417) — Include public service URL in configuration | `docs/issues/closed/1417-1978-add-public-service-url-to-configuration.md` | DONE | Merged in PR #2016; typed `Option`/`Option` newtypes on `HttpTracker`, `UdpTracker`, `HttpApi`; scheme validation at deserialization | +| 5 | [#1415](../../issues/1415) — Use `ServiceBinding` instead of bare `SocketAddr` for service identity | `docs/issues/closed/1415-1978-use-service-binding-instead-of-socket-addr/ISSUE.md` | DONE | Added protocol-aware `service_binding` alongside compatible `server_socket_addr` fields in HTTP, REST API, and UDP error logs; verified manually. | +| 6 | [#1453](../../issues/1453) — IP bans reset interval configurable + fix duplicate cleanup | `docs/issues/closed/1453-1978-ip-bans-reset-interval-configurable/ISSUE.md` | DONE | V3 setting validated; one cancellation-managed bootstrap cleanup job uses the v3 default constant. Runtime configuration use is deferred to #1980. | +| 7 | [#1136](../../issues/1136) — Add configurable UDP connection ID validation policy | `docs/issues/closed/1136-1978-configurable-udp-connection-id-validation-policy.md` | DONE | PR #2032 merged; all 12 ACs met; manual verification deferred to #1980. | +| 8 | [#1490](../../issues/1490) — Decompose database config and overhaul secrets with `secrecy` crate | `docs/issues/open/1490-1978-decompose-database-config-and-overhaul-secrets.md` | TODO | After #3 (both touch `Core`); can be parallel with #5, #6, #7, #9 | +| 9 | [#889](../../issues/889) — New config option for logging style | `docs/issues/closed/889-1978-new-config-option-for-logging-style.md` | DONE | V3 schema implemented; includes negative test for removed `threshold` key. Manual verification is deferred to #1980. | +| 10 | [#1987](../../issues/1987) — Use peer IP from the HTTP announce `ip` parameter when configured | `docs/issues/open/1987-add-config-option-to-use-ip-from-announce-query-string/ISSUE.md` | TODO | After #3 and external prerequisite #1985; per-HTTP-tracker opt-in policy | +| 11 | [#1980](../../issues/1980) — Final cleanup: remove global re-exports, migrate consumers to explicit v3 imports | `docs/issues/open/1980-1978-configuration-overhaul-final-cleanup.md` | TODO | Must precede #12; depends on all other existing subissues | +| 12 | [#2023](../../issues/2023) — Expose configured public URLs in runtime observability | `docs/issues/open/2023-1978-expose-configured-public-urls-in-runtime-observability.md` | TODO | Must follow #1417 and #1980; adds `public_url` to health checks, metrics, and logs without replacing ServiceBinding | ## Delivery Strategy diff --git a/docs/issues/open/2003-overhaul-guardrails-and-automation/EPIC.md b/docs/issues/open/2003-overhaul-guardrails-and-automation/EPIC.md index 4db9d4f69..422695742 100644 --- a/docs/issues/open/2003-overhaul-guardrails-and-automation/EPIC.md +++ b/docs/issues/open/2003-overhaul-guardrails-and-automation/EPIC.md @@ -5,7 +5,7 @@ status: planned github-issue: 2003 spec-path: docs/issues/open/2003-overhaul-guardrails-and-automation/EPIC.md epic-owner: josecelano -last-updated-utc: 2026-07-22 00:00 +last-updated-utc: 2026-08-17 semantic-links: skill-links: - create-issue @@ -162,7 +162,7 @@ build actions needed by its checks. ordering rule and contains no duplicate entries. Decide its package and execution tier through the EPIC design rather than coupling it to the tracker library. - Permit the narrowly scoped interim formatter described by - [`2019-automatically-format-project-dictionary/ISSUE.md`](../2019-automatically-format-project-dictionary/ISSUE.md). + [`2019-automatically-format-project-dictionary/ISSUE.md`](../../closed/2019-automatically-format-project-dictionary/ISSUE.md). It supplies immediate developer feedback but does not select the EPIC's long-term architecture, execution tier, or check/action contract, and may be replaced or refactored after the design decision. diff --git a/docs/issues/open/2035-fix-duplicate-port-zero-tracker-instance-bootstrap/ISSUE.md b/docs/issues/open/2035-fix-duplicate-port-zero-tracker-instance-bootstrap/ISSUE.md index 512ae69ed..c19940ad7 100644 --- a/docs/issues/open/2035-fix-duplicate-port-zero-tracker-instance-bootstrap/ISSUE.md +++ b/docs/issues/open/2035-fix-duplicate-port-zero-tracker-instance-bootstrap/ISSUE.md @@ -7,7 +7,7 @@ github-issue: 2035 spec-path: docs/issues/open/2035-fix-duplicate-port-zero-tracker-instance-bootstrap/ISSUE.md branch: 2035-fix-duplicate-port-zero-tracker-instance-bootstrap related-pr: null -last-updated-utc: 2026-07-29 18:14 +last-updated-utc: 2026-08-17 semantic-links: skill-links: - write-unit-test @@ -16,9 +16,9 @@ semantic-links: - src/app.rs - archived-attempt.md - docs/issues/open/1419-allow-multiple-integration-tests-at-main-app-level/ISSUE.md - - docs/issues/open/2036-add-runtime-service-registry-metadata/ISSUE.md + - docs/issues/closed/2036-add-runtime-service-registry-metadata/ISSUE.md - docs/issues/open/2039-normalize-per-instance-event-metrics-policy/ISSUE.md - - docs/issues/open/2041-migrate-runtime-service-registry-metadata/ISSUE.md + - docs/issues/closed/2041-migrate-runtime-service-registry-metadata/ISSUE.md - docs/events-architecture.md - evidence.md - tests/aggregate_stats_fixed_ports.rs @@ -90,7 +90,7 @@ identity preservation and prove that each duplicate port-zero configuration starts with its matching container. This phase must not introduce registry metadata or metrics-policy behavior. -After bootstrap identity propagation is merged, [#2041](../2041-migrate-runtime-service-registry-metadata/ISSUE.md) +After bootstrap identity propagation is merged, [#2041](../../closed/2041-migrate-runtime-service-registry-metadata/ISSUE.md) will carry the same identity through started-service registration metadata, and Issue #2039 will make event publication independent of metrics policy and filter metrics in listeners by canonical identity. Those follow-ups are prerequisites @@ -100,7 +100,7 @@ only for this issue's metrics-related final verification and closure. | ID | Status | Task | Notes / Expected Output | | --- | ------- | ------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| T1 | DONE | Land [#2036](../2036-add-runtime-service-registry-metadata/ISSUE.md) canonical identity | Bootstrap identity aligns with the canonical runtime identity contract. | +| T1 | DONE | Land [#2036](../../closed/2036-add-runtime-service-registry-metadata/ISSUE.md) canonical identity | Bootstrap identity aligns with the canonical runtime identity contract. | | T2 | DONE | Replace address-keyed container lookup | Use an order-preserving representation or canonical identity, not configured `SocketAddr`. | | T3 | DONE | Start matching containers | Pass each configuration entry's matching container into HTTP and UDP startup. | | T4 | DONE | Correlate lifecycle logs | Include canonical identity with configured and final binding logs. | @@ -179,8 +179,8 @@ final listener addresses, REST statistics, and observed result to - Issue #1419: [main-application integration tests](../../open/1419-allow-multiple-integration-tests-at-main-app-level/ISSUE.md) - [Runtime registry investigation](../../open/1419-allow-multiple-integration-tests-at-main-app-level/investigation-registar-and-health-check.md) -- Feature #2036: [add runtime service registry metadata](../2036-add-runtime-service-registry-metadata/ISSUE.md) +- Feature #2036: [add runtime service registry metadata](../../closed/2036-add-runtime-service-registry-metadata/ISSUE.md) - Bug #2039: [normalize per-instance event metrics policy](../2039-normalize-per-instance-event-metrics-policy/ISSUE.md) -- Issue #2041: [migrate runtime service registry metadata](../2041-migrate-runtime-service-registry-metadata/ISSUE.md) +- Issue #2041: [migrate runtime service registry metadata](../../closed/2041-migrate-runtime-service-registry-metadata/ISSUE.md) - [Archived implementation attempt](archived-attempt.md) - [Events architecture](../../../events-architecture.md) diff --git a/docs/issues/open/2039-normalize-per-instance-event-metrics-policy/ISSUE.md b/docs/issues/open/2039-normalize-per-instance-event-metrics-policy/ISSUE.md index d9fd18268..dca1f3040 100644 --- a/docs/issues/open/2039-normalize-per-instance-event-metrics-policy/ISSUE.md +++ b/docs/issues/open/2039-normalize-per-instance-event-metrics-policy/ISSUE.md @@ -7,7 +7,7 @@ github-issue: 2039 spec-path: docs/issues/open/2039-normalize-per-instance-event-metrics-policy/ISSUE.md branch: "2039-normalize-per-instance-event-metrics-policy" related-pr: null -last-updated-utc: 2026-07-29 18:14 +last-updated-utc: 2026-08-17 semantic-links: skill-links: - create-issue @@ -18,7 +18,7 @@ semantic-links: - docs/adrs/20260727000000_events_are_objective_facts.md - docs/adrs/20260727180000_shared_services_across_tracker_instances.md - docs/issues/open/2035-fix-duplicate-port-zero-tracker-instance-bootstrap/ISSUE.md - - docs/issues/open/2036-add-runtime-service-registry-metadata/ISSUE.md + - docs/issues/closed/2036-add-runtime-service-registry-metadata/ISSUE.md - evidence.md - tests/aggregate_stats_fixed_ports.rs - packages/events/src/bus.rs diff --git a/packages/axum-http-server/src/server.rs b/packages/axum-http-server/src/server.rs index 3f27999fc..70cf94493 100644 --- a/packages/axum-http-server/src/server.rs +++ b/packages/axum-http-server/src/server.rs @@ -38,6 +38,10 @@ pub enum Error { Error(String), } +// `derive_more::Constructor` generates `field: field` initializers on this MSRV-compatible version. +// Nightly Clippy diagnoses that proc-macro expansion; remove this allowance once derive_more emits +// field-init shorthand. +#[allow(clippy::redundant_field_names)] #[derive(Constructor, Debug)] pub struct Launcher { pub bind_to: SocketAddr, diff --git a/packages/axum-http-server/tests/server/asserts.rs b/packages/axum-http-server/tests/server/asserts.rs index 964fd54e4..172ddd8d5 100644 --- a/packages/axum-http-server/tests/server/asserts.rs +++ b/packages/axum-http-server/tests/server/asserts.rs @@ -27,7 +27,7 @@ pub fn assert_bencoded_error(response_text: &String, expected_failure_reason: &s pub async fn assert_empty_announce_response(response: Response) { assert_eq!(response.status(), 200); let announce_response: DeserializedNormal = serde_bencode::from_str(&response.text().await.unwrap()).unwrap(); - assert!(announce_response.peers.is_empty()); + assert_eq!(announce_response.peers, Vec::new()); } pub async fn assert_announce_response(response: Response, expected_announce_response: &DeserializedNormal) { diff --git a/packages/axum-rest-api-server/src/server.rs b/packages/axum-rest-api-server/src/server.rs index 8eefef748..3b2316864 100644 --- a/packages/axum-rest-api-server/src/server.rs +++ b/packages/axum-rest-api-server/src/server.rs @@ -222,6 +222,10 @@ pub fn check_fn(service_binding: &ServiceBinding) -> ServiceHealthCheckJob { } /// A struct responsible for starting the API server. +// `derive_more::Constructor` generates `field: field` initializers on this MSRV-compatible version. +// Nightly Clippy diagnoses that proc-macro expansion; remove this allowance once derive_more emits +// field-init shorthand. +#[allow(clippy::redundant_field_names)] #[derive(Constructor, Debug)] pub struct Launcher { bind_to: SocketAddr, diff --git a/packages/http-protocol/src/v1/responses/announce/data.rs b/packages/http-protocol/src/v1/responses/announce/data.rs index 0034ca854..06da05ac3 100644 --- a/packages/http-protocol/src/v1/responses/announce/data.rs +++ b/packages/http-protocol/src/v1/responses/announce/data.rs @@ -11,6 +11,10 @@ use torrust_peer_id::PeerId; // field shapes. This keeps protocol crates decoupled from tracker domain types // and centralizes conversions in boundary adapters. // adr: docs/adrs/20260527175600_keep_protocol_and_domain_types_decoupled.md +// `derive_more::Constructor` generates `field: field` initializers on this MSRV-compatible version. +// Nightly Clippy diagnoses that proc-macro expansion; remove this allowance once derive_more emits +// field-init shorthand. +#[allow(clippy::redundant_field_names)] #[derive(Clone, Debug, PartialEq, Constructor, Default)] pub struct AnnounceData { pub peers: Vec, @@ -18,6 +22,10 @@ pub struct AnnounceData { pub policy: AnnouncePolicy, } +// `derive_more::Constructor` generates `field: field` initializers on this MSRV-compatible version. +// Nightly Clippy diagnoses that proc-macro expansion; remove this allowance once derive_more emits +// field-init shorthand. +#[allow(clippy::redundant_field_names)] #[derive(PartialEq, Eq, Debug, Clone, Copy, Constructor)] pub struct AnnouncePolicy { pub interval: u32, diff --git a/packages/http-protocol/src/v1/responses/announce/encoding.rs b/packages/http-protocol/src/v1/responses/announce/encoding.rs index d1c69a3ba..a70b9f4b8 100644 --- a/packages/http-protocol/src/v1/responses/announce/encoding.rs +++ b/packages/http-protocol/src/v1/responses/announce/encoding.rs @@ -26,7 +26,10 @@ use crate::v1::responses::announce::data::{AnnounceData, Peer}; /// - [BEP 03: The `BitTorrent` Protocol Specification](https://www.bittorrent.org/beps/bep_0003.html) /// - [BEP 23: Tracker Returns Compact Peer Lists](https://www.bittorrent.org/beps/bep_0023.html) /// - [BEP 07: IPv6 Tracker Extension](https://www.bittorrent.org/beps/bep_0007.html) - +// `derive_more::Constructor` generates `field: field` initializers on this MSRV-compatible version. +// Nightly Clippy diagnoses that proc-macro expansion; remove this allowance once derive_more emits +// field-init shorthand. +#[allow(clippy::redundant_field_names)] #[derive(Debug, AsRef, PartialEq, Constructor)] pub struct Announce where diff --git a/packages/primitives/src/announce.rs b/packages/primitives/src/announce.rs index 97560df9f..e77c51c8a 100644 --- a/packages/primitives/src/announce.rs +++ b/packages/primitives/src/announce.rs @@ -9,6 +9,10 @@ use crate::peer; use crate::swarm_metadata::SwarmMetadata; /// Announce policy +// `derive_more::Constructor` generates `field: field` initializers on this MSRV-compatible version. +// Nightly Clippy diagnoses that proc-macro expansion; remove this allowance once derive_more emits +// field-init shorthand. +#[allow(clippy::redundant_field_names)] #[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone, Copy, Constructor)] pub struct AnnouncePolicy { /// Interval in seconds that the client should wait between sending regular @@ -77,6 +81,10 @@ impl AnnouncePolicy { } /// Structure that holds the data returned by the `announce` request. +// `derive_more::Constructor` generates `field: field` initializers on this MSRV-compatible version. +// Nightly Clippy diagnoses that proc-macro expansion; remove this allowance once derive_more emits +// field-init shorthand. +#[allow(clippy::redundant_field_names)] #[derive(Clone, Debug, PartialEq, Constructor, Default)] pub struct AnnounceData { /// The list of peers that are downloading the same torrent. diff --git a/packages/primitives/src/mode.rs b/packages/primitives/src/mode.rs index 94a86d671..5ecb891ed 100644 --- a/packages/primitives/src/mode.rs +++ b/packages/primitives/src/mode.rs @@ -6,6 +6,10 @@ use derive_more::{Constructor, Display}; use serde::{Deserialize, Serialize}; /// Configuration that applies when the tracker is operating in private mode. +// `derive_more::Constructor` generates `field: field` initializers on this MSRV-compatible version. +// Nightly Clippy diagnoses that proc-macro expansion; remove this allowance once derive_more emits +// field-init shorthand. +#[allow(clippy::redundant_field_names)] #[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone, Copy, Constructor, Display)] pub struct PrivateMode { /// A flag to disable expiration date for peer keys. diff --git a/packages/primitives/src/pagination.rs b/packages/primitives/src/pagination.rs index 96b5ad662..9b5a4ebfd 100644 --- a/packages/primitives/src/pagination.rs +++ b/packages/primitives/src/pagination.rs @@ -2,6 +2,10 @@ use derive_more::Constructor; use serde::Deserialize; /// A struct to keep information about the page when results are being paginated +// `derive_more::Constructor` generates `field: field` initializers on this MSRV-compatible version. +// Nightly Clippy diagnoses that proc-macro expansion; remove this allowance once derive_more emits +// field-init shorthand. +#[allow(clippy::redundant_field_names)] #[derive(Deserialize, Copy, Clone, Debug, PartialEq, Constructor)] pub struct Pagination { /// The page number, starting at 0 diff --git a/packages/primitives/src/peer.rs b/packages/primitives/src/peer.rs index 1e3678e78..0f3eac056 100644 --- a/packages/primitives/src/peer.rs +++ b/packages/primitives/src/peer.rs @@ -382,13 +382,13 @@ impl TryFrom> for Id { if bytes.len() < PEER_ID_BYTES_LEN { return Err(IdConversionError::NotEnoughBytes { location: Location::caller(), - message: format! {"got {} bytes, expected {}", bytes.len(), PEER_ID_BYTES_LEN}, + message: format!("got {} bytes, expected {}", bytes.len(), PEER_ID_BYTES_LEN), }); } if bytes.len() > PEER_ID_BYTES_LEN { return Err(IdConversionError::TooManyBytes { location: Location::caller(), - message: format! {"got {} bytes, expected {}", bytes.len(), PEER_ID_BYTES_LEN}, + message: format!("got {} bytes, expected {}", bytes.len(), PEER_ID_BYTES_LEN), }); } diff --git a/packages/primitives/src/policy.rs b/packages/primitives/src/policy.rs index 140886805..88cdd4a06 100644 --- a/packages/primitives/src/policy.rs +++ b/packages/primitives/src/policy.rs @@ -6,6 +6,10 @@ use derive_more::Constructor; use serde::{Deserialize, Serialize}; /// Policy settings that control tracker-wide torrent and peer retention. +// `derive_more::Constructor` generates `field: field` initializers on this MSRV-compatible version. +// Nightly Clippy diagnoses that proc-macro expansion; remove this allowance once derive_more emits +// field-init shorthand. +#[allow(clippy::redundant_field_names)] #[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone, Constructor)] pub struct TrackerPolicy { // Cleanup job configuration diff --git a/packages/primitives/src/swarm_metadata.rs b/packages/primitives/src/swarm_metadata.rs index d4edeff81..849db0df6 100644 --- a/packages/primitives/src/swarm_metadata.rs +++ b/packages/primitives/src/swarm_metadata.rs @@ -9,6 +9,10 @@ use crate::NumberOfDownloads; /// Swarm metadata dictionary in the scrape response. /// /// See [BEP 48: Tracker Protocol Extension: Scrape](https://www.bittorrent.org/beps/bep_0048.html) +// `derive_more::Constructor` generates `field: field` initializers on this MSRV-compatible version. +// Nightly Clippy diagnoses that proc-macro expansion; remove this allowance once derive_more emits +// field-init shorthand. +#[allow(clippy::redundant_field_names)] #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Constructor)] pub struct SwarmMetadata { /// (i.e `completed`): The number of peers that have ever completed diff --git a/packages/rest-api-application/src/v1/ports/auth_key.rs b/packages/rest-api-application/src/v1/ports/auth_key.rs index 1a8ba47db..eb04018f6 100644 --- a/packages/rest-api-application/src/v1/ports/auth_key.rs +++ b/packages/rest-api-application/src/v1/ports/auth_key.rs @@ -11,6 +11,9 @@ use torrust_tracker_rest_api_protocol::v1::context::auth_key::resources::auth_ke /// /// Covers both command and query operations: adding/generating/deleting /// keys, and reloading them from the database. +// `async_trait` applies `#[must_use]` to generated futures. Nightly Clippy also treats those +// futures as must-use and reports the macro expansion as redundant. +#[allow(clippy::double_must_use)] #[async_trait] pub trait AuthKeyPort: Send + Sync { /// Adds a new peer key (pre-generated or generated on-the-fly). diff --git a/packages/rest-api-application/src/v1/ports/stats.rs b/packages/rest-api-application/src/v1/ports/stats.rs index faf936e47..f8ff2965e 100644 --- a/packages/rest-api-application/src/v1/ports/stats.rs +++ b/packages/rest-api-application/src/v1/ports/stats.rs @@ -10,6 +10,9 @@ use torrust_tracker_rest_api_protocol::v1::context::stats::resources::stats::{La /// /// Implementations of this trait aggregate data from all tracker-internal /// repositories and services into protocol-level DTOs. +// `async_trait` applies `#[must_use]` to generated futures. Nightly Clippy also treats those +// futures as must-use and reports the macro expansion as redundant. +#[allow(clippy::double_must_use)] #[async_trait] pub trait StatsQueryPort: Send + Sync { /// Returns the global tracker statistics (unlabeled). diff --git a/packages/rest-api-application/src/v1/ports/torrent.rs b/packages/rest-api-application/src/v1/ports/torrent.rs index 00d326c68..6b911553e 100644 --- a/packages/rest-api-application/src/v1/ports/torrent.rs +++ b/packages/rest-api-application/src/v1/ports/torrent.rs @@ -8,6 +8,9 @@ use torrust_tracker_rest_api_protocol::v1::context::torrent::resources::torrent: /// /// Implementations of this trait adapt tracker-internal data sources /// (e.g., `InMemoryTorrentRepository`) into protocol-level DTOs. +// `async_trait` applies `#[must_use]` to generated futures. Nightly Clippy also treats those +// futures as must-use and reports the macro expansion as redundant. +#[allow(clippy::double_must_use)] #[async_trait] pub trait TorrentQueryPort: Send + Sync { /// Returns full torrent info including peers for the given infohash. diff --git a/packages/rest-api-application/src/v1/ports/whitelist.rs b/packages/rest-api-application/src/v1/ports/whitelist.rs index 355d1a03e..dfcae3a26 100644 --- a/packages/rest-api-application/src/v1/ports/whitelist.rs +++ b/packages/rest-api-application/src/v1/ports/whitelist.rs @@ -11,6 +11,9 @@ use torrust_tracker_rest_api_protocol::v1::context::whitelist::resources::whitel /// /// All whitelist operations are pure commands with no query/read /// operations. They return either success or an error. +// `async_trait` applies `#[must_use]` to generated futures. Nightly Clippy also treats those +// futures as must-use and reports the macro expansion as redundant. +#[allow(clippy::double_must_use)] #[async_trait] pub trait WhitelistCommandPort: Send + Sync { /// Adds a torrent to the whitelist. diff --git a/packages/swarm-coordination-registry/src/swarm/registry.rs b/packages/swarm-coordination-registry/src/swarm/registry.rs index cbac4b826..d6f78c0cb 100644 --- a/packages/swarm-coordination-registry/src/swarm/registry.rs +++ b/packages/swarm-coordination-registry/src/swarm/registry.rs @@ -640,7 +640,7 @@ mod tests { let peers = swarms.get_swarm_peers(&sample_info_hash(), 74).await.unwrap(); - assert!(peers.is_empty()); + assert_eq!(peers, Vec::new()); } #[tokio::test] diff --git a/packages/tracker-core/src/authentication/key/repository/persisted.rs b/packages/tracker-core/src/authentication/key/repository/persisted.rs index eed0026f2..6cd93be55 100644 --- a/packages/tracker-core/src/authentication/key/repository/persisted.rs +++ b/packages/tracker-core/src/authentication/key/repository/persisted.rs @@ -133,7 +133,7 @@ mod tests { assert!(result.is_ok()); let keys = repository.load_keys().await.unwrap(); - assert!(keys.is_empty()); + assert_eq!(keys, Vec::new()); } #[tokio::test] diff --git a/packages/tracker-core/src/databases/traits/auth_keys.rs b/packages/tracker-core/src/databases/traits/auth_keys.rs index 36ccf4491..1e2b41c1c 100644 --- a/packages/tracker-core/src/databases/traits/auth_keys.rs +++ b/packages/tracker-core/src/databases/traits/auth_keys.rs @@ -9,6 +9,9 @@ use crate::authentication::{self, Key}; // The `automock` macro generates a struct whose fields all end with `keys`, // which triggers `clippy::struct_field_names` (pedantic). Suppressed here // because the generated mock struct is outside our control. +// `async_trait` applies `#[must_use]` to generated futures. Nightly Clippy also treats those +// futures as must-use and reports the macro expansion as redundant. +#[allow(clippy::double_must_use)] #[async_trait] #[allow(clippy::struct_field_names, clippy::extra_unused_lifetimes)] #[automock] diff --git a/packages/tracker-core/src/databases/traits/schema.rs b/packages/tracker-core/src/databases/traits/schema.rs index bb3b60fe6..d3bf38639 100644 --- a/packages/tracker-core/src/databases/traits/schema.rs +++ b/packages/tracker-core/src/databases/traits/schema.rs @@ -8,6 +8,9 @@ use super::super::error::Error; /// /// Implementors are responsible for creating and dropping the full set of /// database tables used by the tracker. +// `async_trait` applies `#[must_use]` to generated futures. Nightly Clippy also treats those +// futures as must-use and reports the macro expansion as redundant. +#[allow(clippy::double_must_use)] #[async_trait] #[allow(clippy::extra_unused_lifetimes)] #[automock] diff --git a/packages/tracker-core/src/databases/traits/torrent_metrics.rs b/packages/tracker-core/src/databases/traits/torrent_metrics.rs index bc14c41b5..3be0cc95a 100644 --- a/packages/tracker-core/src/databases/traits/torrent_metrics.rs +++ b/packages/tracker-core/src/databases/traits/torrent_metrics.rs @@ -13,6 +13,9 @@ use super::super::error::Error; /// Trait covering persistence operations for per-torrent and global download /// counters. +// `async_trait` applies `#[must_use]` to generated futures. Nightly Clippy also treats those +// futures as must-use and reports the macro expansion as redundant. +#[allow(clippy::double_must_use)] #[async_trait] #[allow(clippy::extra_unused_lifetimes)] #[automock] diff --git a/packages/tracker-core/src/databases/traits/whitelist.rs b/packages/tracker-core/src/databases/traits/whitelist.rs index a3be709fd..aa4b04a46 100644 --- a/packages/tracker-core/src/databases/traits/whitelist.rs +++ b/packages/tracker-core/src/databases/traits/whitelist.rs @@ -6,6 +6,9 @@ use torrust_info_hash::InfoHash; use super::super::error::Error; /// Trait covering persistence operations for the torrent whitelist. +// `async_trait` applies `#[must_use]` to generated futures. Nightly Clippy also treats those +// futures as must-use and reports the macro expansion as redundant. +#[allow(clippy::double_must_use)] #[async_trait] #[allow(clippy::extra_unused_lifetimes)] #[automock] diff --git a/packages/tracker-core/src/torrent/services.rs b/packages/tracker-core/src/torrent/services.rs index de539c6d8..3f43f07d5 100644 --- a/packages/tracker-core/src/torrent/services.rs +++ b/packages/tracker-core/src/torrent/services.rs @@ -426,7 +426,7 @@ mod tests { let torrent_info = get_torrents(&in_memory_torrent_repository, &[sample_info_hash()]).await; - assert!(torrent_info.is_empty()); + assert_eq!(torrent_info, Vec::new()); } #[tokio::test] diff --git a/packages/udp-core/src/statistics/repository.rs b/packages/udp-core/src/statistics/repository.rs index 68bb3f0c5..683113e3f 100644 --- a/packages/udp-core/src/statistics/repository.rs +++ b/packages/udp-core/src/statistics/repository.rs @@ -10,6 +10,9 @@ use super::describe_metrics; use super::metrics::Metrics; /// Trait exposing only the UDP core statistics that external consumers need. +// `async_trait` applies `#[must_use]` to generated futures. Nightly Clippy also treats those +// futures as must-use and reports the macro expansion as redundant. +#[allow(clippy::double_must_use)] #[async_trait::async_trait] pub trait UdpCoreStatsRepository: Send + Sync { async fn get_metrics_collection(&self) -> MetricCollection; diff --git a/packages/udp-protocol/src/request.rs b/packages/udp-protocol/src/request.rs index cd6e40993..b20fa2881 100644 --- a/packages/udp-protocol/src/request.rs +++ b/packages/udp-protocol/src/request.rs @@ -245,7 +245,7 @@ mod tests { let mut buf = Vec::new(); request.clone().write_bytes(&mut buf).unwrap(); - let r2 = Request::parse_bytes(&buf[..], ::std::u8::MAX).unwrap(); + let r2 = Request::parse_bytes(&buf[..], u8::MAX).unwrap(); let success = request == r2; diff --git a/packages/udp-server/src/server/spawner.rs b/packages/udp-server/src/server/spawner.rs index be2ec4a89..56a891378 100644 --- a/packages/udp-server/src/server/spawner.rs +++ b/packages/udp-server/src/server/spawner.rs @@ -14,6 +14,10 @@ use torrust_tracker_udp_core::container::UdpTrackerCoreContainer; use super::launcher::Launcher; use crate::container::UdpTrackerServerContainer; +// `derive_more::Constructor` generates `field: field` initializers on this MSRV-compatible version. +// Nightly Clippy diagnoses that proc-macro expansion; remove this allowance once derive_more emits +// field-init shorthand. +#[allow(clippy::redundant_field_names)] #[derive(Constructor, Copy, Clone, Debug, Display)] #[display("(with socket): {bind_to}")] pub struct Spawner { diff --git a/packages/udp-server/src/server/states.rs b/packages/udp-server/src/server/states.rs index a96753785..1328152c6 100644 --- a/packages/udp-server/src/server/states.rs +++ b/packages/udp-server/src/server/states.rs @@ -34,6 +34,10 @@ pub struct Stopped { } /// A running UDP server state. +// `derive_more::Constructor` generates `field: field` initializers on this MSRV-compatible version. +// Nightly Clippy diagnoses that proc-macro expansion; remove this allowance once derive_more emits +// field-init shorthand. +#[allow(clippy::redundant_field_names)] #[derive(Debug, Display, Constructor)] #[display("Running (with local address): {local_addr}")] pub struct Running { diff --git a/packages/udp-server/src/statistics/repository.rs b/packages/udp-server/src/statistics/repository.rs index c38e5cd5e..78ed732ee 100644 --- a/packages/udp-server/src/statistics/repository.rs +++ b/packages/udp-server/src/statistics/repository.rs @@ -11,6 +11,9 @@ use super::describe_metrics; use super::metrics::Metrics; /// Trait exposing only the UDP server statistics that external consumers need. +// `async_trait` applies `#[must_use]` to generated futures. Nightly Clippy also treats those +// futures as must-use and reports the macro expansion as redundant. +#[allow(clippy::double_must_use)] #[async_trait::async_trait] pub trait UdpServerStatsRepository: Send + Sync { async fn get_metrics_collection(&self) -> MetricCollection; @@ -104,7 +107,6 @@ impl UdpServerStatsRepository for Repository { #[cfg(test)] mod tests { - use core::f64; use std::time::Duration; use torrust_clock::clock::Time; @@ -604,7 +606,6 @@ mod tests { mod race_conditions { - use core::f64; use std::time::Duration; use tokio::task::JoinHandle; diff --git a/src/console/ci/e2e/logs_parser.rs b/src/console/ci/e2e/logs_parser.rs index 73dba0987..d03f07ea3 100644 --- a/src/console/ci/e2e/logs_parser.rs +++ b/src/console/ci/e2e/logs_parser.rs @@ -150,9 +150,9 @@ mod tests { let running_services = RunningServices::parse_from_logs(logs); - assert!(running_services.udp_trackers.is_empty()); - assert!(running_services.http_trackers.is_empty()); - assert!(running_services.health_checks.is_empty()); + assert_eq!(running_services.udp_trackers, Vec::::new()); + assert_eq!(running_services.http_trackers, Vec::::new()); + assert_eq!(running_services.health_checks, Vec::::new()); } #[test]