Skip to content

Unify create-* close-older fields via shared CloseOlderConfig embed - #54656

Open
pelikhan with Copilot wants to merge 10 commits into
mainfrom
copilot/deep-report-unify-closeolder-config
Open

Unify create-* close-older fields via shared CloseOlderConfig embed#54656
pelikhan with Copilot wants to merge 10 commits into
mainfrom
copilot/deep-report-unify-closeolder-config

Conversation

Copilot AI commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

create-issue, create-discussion, and create-pull-request each re-declared close-older enable/key fields independently, while downstream handler config consumed them in parallel paths. This change consolidates those fields into a single shared config embed and keeps existing YAML keys backward-compatible through parse-time aliasing.

  • Config model consolidation

    • Introduced shared CloseOlderConfig in pkg/workflow/create_entity_helpers.go:
      • Enabled *string
      • Key string
    • Embedded CloseOlderConfig into:
      • CreateIssuesConfig
      • CreateDiscussionsConfig
      • CreatePullRequestsConfig
  • Backward-compatible parsing

    • Added parse-time alias mapping so existing keys continue to work unchanged:
      • close-older-issues → shared Enabled
      • close-older-discussions → shared Enabled
      • close-older-pull-requests → shared Enabled
    • Preserved close-older-key behavior via shared Key.
  • Consumer unification

    • Updated safe-outputs handler registry to read:
      • c.CloseOlderConfig.Enabled
      • c.CloseOlderConfig.Key
    • Updated compile-time PR close-older enable check to use shared field.
  • Test updates

    • Added focused parser coverage for all three create handlers mapping to shared config.
    • Updated existing handler-config tests that constructed old per-entity fields directly.
type CloseOlderConfig struct {
    Enabled *string `yaml:"close-older-enabled,omitempty"`
    Key     string  `yaml:"close-older-key,omitempty"`
}

// Example usage in create config structs
type CreateIssuesConfig struct {
    // ...
    CloseOlderConfig `yaml:",inline"` // Enabled sourced from close-older-issues
}

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 21.7 AIC · ⌖ 8.32 AIC · ⊞ 9.5K ·
Comment /souschef to run again


Run: https://github.com/github/gh-aw/actions/runs/32558278813> Generated by 👨‍🍳 PR Sous Chef · gpt54 · 7.36 AIC · ⌖ 8.18 AIC · ⊞ 9.5K ·

Comment /souschef to run again


Branch refresh requested by PR Sous Chef.
Run: https://github.com/github/gh-aw/actions/runs/32569036201> Generated by 👨‍🍳 PR Sous Chef · gpt54 · 28.6 AIC · ⌖ 8.36 AIC · ⊞ 9.5K ·

Comment /souschef to run again

Copilot AI and others added 2 commits August 21, 2026 23:53
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copilot AI changed the title [WIP] Unify CloseOlderKey and CloseOlder config fields into a CloseOlderConfig embed Unify create-* close-older fields via shared CloseOlderConfig embed Aug 22, 2026
Copilot AI requested a review from pelikhan August 22, 2026 00:04
@pelikhan
pelikhan marked this pull request as ready for review August 22, 2026 00:19
Copilot AI balanced review requested due to automatic review settings August 22, 2026 00:19

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Consolidates close-older settings across create-issue, discussion, and pull-request configurations while preserving existing YAML keys.

Changes:

  • Adds shared CloseOlderConfig with parse-time aliases.
  • Updates handlers, permission checks, and tests to use the shared config.
  • Refreshes the generated network-audit workflow lock file.
Show a summary per file
File Description
pkg/workflow/create_entity_helpers.go Defines shared config and alias helper.
pkg/workflow/create_issue.go Embeds and parses shared issue settings.
pkg/workflow/create_discussion.go Embeds and parses shared discussion settings.
pkg/workflow/create_pull_request.go Embeds shared PR settings and updates permission logic.
pkg/workflow/safe_outputs_handler_registry.go Reads unified close-older fields.
pkg/workflow/create_close_older_config_test.go Tests legacy-key aliasing for all entities.
pkg/workflow/compiler_safe_outputs_config_test.go Updates discussion test fixtures.
pkg/workflow/compiler_safe_outputs_config_handlers_test.go Updates handler configuration tests.
.github/workflows/weekly-network-domains-audit.lock.yml Refreshes generated installation and timeout steps.

Review details

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

  • Files reviewed: 9/9 changed files
  • Comments generated: 0
  • Review effort level: Balanced

@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Design Decision Gate 🏗️ completed the design decision gate check.

🏗️ ADR gate enforced by Design Decision Gate 🏗️

@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

🧠 Matt Pocock Skills Reviewer has completed the skills-based review. ✅

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer

@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

PR Code Quality Reviewer completed the code quality review.

Reviewed PR #54656; no actionable blocking issues found in changed lines, so no review comments were needed beyond submitting the overall review.

🔎 Code quality review by PR Code Quality Reviewer

@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Test Quality Sentinel completed test quality analysis.

Test Quality Sentinel skipped because pre-fetch PR data was unavailable: unable to fetch test file diff

🧪 Test quality analysis by Test Quality Sentinel

@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Ponytail Reviewer completed successfully!

Ponytail review: PR #54656 diff reviewed for over-engineering only. The CloseOlderConfig consolidation is a legitimate DRY refactor removing duplicated Enabled/Key fields across three config structs; the setCloseOlderEnabledAlias helper is a minimal 4-line single-purpose function used 3x for backward-compat aliasing, not speculative. No dead code, unneeded deps, or speculative abstractions found. Lean already. Ship.

Generated by Ponytail Reviewer for #54656

@github-actions

Copy link
Copy Markdown
Contributor

PR Triage

Category: refactor · Risk: medium · Score: 55/100

Impact Urgency Quality
28/50 12/30 15/20

Recommended action: defer

Consolidates duplicated close-older config fields into a shared embed with backward-compatible aliasing. Reasonable maintainability improvement but touches 3 safe-output handlers (create-issue/discussion/pull-request) — worth a careful human review before merge. CI mostly green with 2 failures; no reviews yet.

Generated by 🔧 PR Triage Agent · auto · 40.8 AIC · ⌖ 8.21 AIC · ⊞ 8.3K ·

@github-actions

Copy link
Copy Markdown
Contributor

Comment Memory

reviewed_at: 2026-08-22T00:00:00Z
review_event: COMMENT
top_themes:
  - shared close-older config refactor
  - backward-compatible alias mapping
  - parser coverage added for all three create handlers
files_reviewed:
  - .github/workflows/weekly-network-domains-audit.lock.yml
  - pkg/workflow/compiler_safe_outputs_config_handlers_test.go
  - pkg/workflow/compiler_safe_outputs_config_test.go
  - pkg/workflow/create_close_older_config_test.go
  - pkg/workflow/create_discussion.go
  - pkg/workflow/create_entity_helpers.go
  - pkg/workflow/create_issue.go
  - pkg/workflow/create_pull_request.go
  - pkg/workflow/safe_outputs_handler_registry.go
comment_count: 0

Note

This comment is managed by comment memory.

It stores persistent context for this thread in the code block at the top of this comment.
Edit only the text inside the backtick fences; workflow metadata and the footer are regenerated automatically.

Learn more about comment memory

🔎 Code quality review by PR Code Quality Reviewer · gpt54 · 34.4 AIC · ⌖ 6.84 AIC · ⊞ 7K ·
Comment /review to run again

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict

No blocking issues in the changed lines.

Scope reviewed

I checked the shared close-older config refactor across parsing, handler serialization, and the new parser coverage. The aliasing keeps the external keys stable, and I did not find a changed-line regression that would justify blocking this PR.

🔎 Code quality review by PR Code Quality Reviewer · gpt54 · 34.4 AIC · ⌖ 6.84 AIC · ⊞ 7K
Comment /review to run again

@github-actions github-actions Bot mentioned this pull request Aug 22, 2026

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clean, well-scoped refactor. The CloseOlderConfig embed with setCloseOlderEnabledAlias correctly handles backward-compatible aliasing from entity-specific keys (close-older-issues, close-older-discussions, close-older-pull-requests) to the canonical close-older-enabled field before YAML unmarshaling. Tests cover all three entity parsers. No blocking issues found.

🧵 Reviewed using Impeccable skills by Impeccable Skills Reviewer · sonnet46 · 20 AIC · ⌖ 8.97 AIC · ⊞ 6.2K

@github-actions

Copy link
Copy Markdown
Contributor

ADR Required — Draft Created

Status: Draft ADR committed to this branch at docs/adr/54656-unify-close-older-config-via-shared-embed.md

This PR adds 114 lines of new business logic in pkg/workflow/ and crosses the ADR threshold. A draft ADR has been generated and pushed to the branch for review.

What to do next
  1. Review docs/adr/54656-unify-close-older-config-via-shared-embed.md — verify the Context, Decision, Alternatives, and Consequences sections accurately reflect the intent.
  2. Revise any sections where the draft misrepresents the real trade-offs or motivation.
  3. Change the status from Draft to Accepted once the team has reviewed the ADR.
  4. Merge — the ADR file will merge alongside the implementation.
Why ADRs matter

Architecture Decision Records create a permanent, searchable record of why a decision was made — not just what was done. Future contributors reading CloseOlderConfig will understand the trade-off between the aliasing approach and a breaking YAML change without having to re-derive it from git blame.

ADR sections required (Michael Nygard template)
Section Purpose
Context Situation, constraints, problem being solved
Decision Active voice: what was decided and the primary rationale
Alternatives Considered ≥2 genuine options evaluated and why each was rejected
Consequences Positive, negative, and neutral outcomes

Important

This PR should not merge until the ADR status is changed from Draft to Accepted.

🏗️ ADR gate enforced by Design Decision Gate 🏗️ · sonnet46 · 95.5 AIC · ⌖ 30.4 AIC · ⊞ 9.5K ·
Comment /review to run again

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Skills-Based Review 🧠

Applied /codebase-design and /tdd — commenting with minor improvements requested. The refactor is clean and well-structured.

📋 Key Themes & Highlights

Key Themes

  • Leaky internal key: close-older-enabled is tagged as "internal canonical key" in comments but is a real public YAML key due to the inline embed — users can write it directly. Either document it or prevent it.
  • Orphaned source key in BoolFields: both the original entity-specific key (e.g. close-older-issues) and the new alias (close-older-enabled) are listed in BoolFields, causing redundant coercion. The source key should either be cleaned up after aliasing or the duplication explained.
  • Handler-local env key naming: Enabled is unified at the struct level but mapped to three different downstream names (close_older_issues, close_older_discussions, close_older_pull_requests). Worth a clarifying comment.
  • Missing edge-case tests: the new tests cover the happy path but not Enabled == nil (absent) or Enabled == "false" (explicitly disabled).

Positive Highlights

  • ✅ Excellent backward-compatibility design via parse-time aliasing — existing YAML is unaffected
  • setCloseOlderEnabledAlias is a clean, single-purpose helper — easy to test and reason about
  • ✅ Three focused parser tests with clear Arrange/Act/Assert structure
  • isCloseOlderPullRequestsEnabled updated consistently with the consolidated field

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · sonnet46 · 46.1 AIC · ⌖ 10.2 AIC · ⊞ 7.6K
Comment /matt to run again

HandleExpires bool
}

// CloseOlderConfig holds shared close-older settings across create entity handlers.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/codebase-design] close-older-enabled is described as "Internal canonical key" but is a valid public YAML key via the inline embed — any user who writes close-older-enabled: true in their workflow YAML will have it accepted silently.

💡 Options to address the leaky seam

The yaml:"close-older-enabled,omitempty" tag on an inline-embedded field means the key is always accepted in YAML, regardless of intent. Options:

  1. Document it as a supported alias — drop "Internal" from the comment, add it to schema docs.
  2. Validate and reject it — in the preprocess hook, detect close-older-enabled and emit a validation error pointing users to the entity-specific key.
  3. Use the yaml:"-" tag and populate programmatically — keep the field unexported to YAML, set it only through the alias function.

Option 3 is the cleanest for a truly internal field, but requires a small struct-tag change.

@copilot please address this.

Enabled *string `yaml:"close-older-enabled,omitempty"` // Internal canonical key; populated from entity-specific close-older-* keys before unmarshaling.
Key string `yaml:"close-older-key,omitempty"` // Optional explicit deduplication key for close-older matching. When set, uses gh-aw-close-key marker instead of workflow-id markers.
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/codebase-design] setCloseOlderEnabledAlias silently skips when configData is nil, but never removes the source key after copying — if downstream YAML unmarshaling checks for close-older-issues as a bool field and close-older-enabled as a bool field, the same boolean coercion runs twice on the same value.

💡 Why this matters

BoolFields in CreateParseOptions lists both close-older-issues and close-older-enabled. The preprocess step coerces both to string form. Since setCloseOlderEnabledAlias copies the value without deleting the original, the coercion over close-older-issues is redundant — the field no longer exists on the struct, so it is harmless today, but a future handler that re-adds a field named close-older-issues would have it populated unexpectedly.

Consider either:

  • Deleting the source key after aliasing: delete(configData, sourceKey)
  • Or adding a comment explaining why the source key stays (no struct field → harmless orphan).

@copilot please address this.

@@ -72,8 +72,8 @@ var handlerRegistry = map[string]handlerBuilder{
AddStringSlice("assignees", c.Assignees).
AddIfNotEmpty("target-repo", c.TargetRepoSlug).
AddTemplatableBool("group", c.Group).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/codebase-design] In safe_outputs_handler_registry.go, the discussion handler passes c.CloseOlderConfig.Enabled as the close_older_discussions env key, the issue handler as close_older_issues, and the PR handler as close_older_pull_requests — three different downstream keys from one shared Enabled field.

💡 Semantic coupling concern

The unified CloseOlderConfig.Enabled field carries a single boolean intent ("close older entities"), but it is mapped to three different downstream environment variable names by the callers. This means the shared field's semantic meaning is actually split across call sites — a subtlety that could confuse future contributors who see Enabled and assume the downstream key is also unified.

A short comment at each mapping site (e.g. // entity-specific env key name per AWF handler contract) would make this explicit, or alternatively document it on the CloseOlderConfig type itself.

@copilot please address this.


func TestParseCreateIssuesConfigMapsCloseOlderConfig(t *testing.T) {
compiler := NewCompiler(WithFailFast(true))
config := compiler.parseCreateIssuesConfig(map[string]any{

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/tdd] The new tests in create_close_older_config_test.go cover the happy path (alias maps to Enabled/Key) but do not test the absence case: when neither close-older-issues nor close-older-enabled is set, config.CloseOlderConfig.Enabled should be nil.

💡 Suggested additional test cases
func TestParseCreateIssuesConfigNoCloseOlderWhenAbsent(t *testing.T) {
    compiler := NewCompiler(WithFailFast(true))
    config := compiler.parseCreateIssuesConfig(map[string]any{
        "create-issue": map[string]any{},
    })
    require.NotNil(t, config)
    assert.Nil(t, config.CloseOlderConfig.Enabled, "Enabled should be nil when not set")
    assert.Empty(t, config.CloseOlderConfig.Key)
}

Also worth testing: close-older-issues: false maps to Enabled = strPtr("false") (not nil), which is what isCloseOlderPullRequestsEnabled depends on to correctly return false.

@copilot please address this.

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot Please address the current forward-progress items on this branch, then run the pr-finisher skill and leave a concise maintainer handoff.

Open review feedback:

  • Matt Pocock review follow-ups requested in the latest review comments.

Open failing checks:

  • ACTION_REQUIRED workflow runs approved for CGO and CWI.

Please review the latest feedback, make any needed follow-up changes, rerun the exact validations needed after the fix, and summarize any remaining human follow-up.

Run: https://github.com/github/gh-aw/actions/runs/32543132845

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 21.7 AIC · ⌖ 8.32 AIC · ⊞ 9.5K ·
Comment /souschef to run again

Copilot AI and others added 2 commits August 22, 2026 01:38
… add absence/false-case tests

Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>
…e review

Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>

Copilot AI commented Aug 22, 2026

Copy link
Copy Markdown
Contributor Author

@copilot Please address the current forward-progress items on this branch, then run the pr-finisher skill and leave a concise maintainer handoff.

Open review feedback:...

Addressed the review follow-ups in commits b1525ba and 5e9aab4:

  • CloseOlderConfig.Enabled is now tagged yaml:"-" and populated only via closeOlderEnabledFromConfigData in each handler's postUnmarshal, so close-older-enabled is no longer accepted as a public YAML key (fixes the leaky-seam concern).
  • Removed setCloseOlderEnabledAlias's write into configData, eliminating the redundant double bool-coercion path.
  • Added a comment at each safe_outputs_handler_registry.go call site noting the shared field is remapped to per-handler env keys.
  • Added tests for the absence case, the explicit-false case, and a regression test confirming close-older-enabled is rejected as a public key.
  • Updated ADR-54656 to describe the new post-unmarshal population approach instead of the old configData aliasing.
  • Hardened closeOlderEnabledFromConfigData to also tolerate a raw bool per code-review feedback.

Validation: go build ./..., full go test ./pkg/workflow/..., make fmt, and codeql_checker all pass with no findings.

Remaining human follow-up: none identified for this PR's code changes. The ADR status is still Draft per the design-decision-gate bot; a maintainer should review/accept docs/adr/54656-unify-close-older-config-via-shared-embed.md before merge. I don't have access to trigger CI re-runs or approve ACTION_REQUIRED workflow runs (CGO/CWI) from this sandbox — a maintainer will need to approve those runs.

Copilot AI requested a review from gh-aw-bot August 22, 2026 01:42
@github-actions

Copy link
Copy Markdown
Contributor

PR Triage

  • Category: refactor
  • Risk: low
  • Priority score: 38/100 (impact 10, urgency 20, quality 8)
  • Recommended action: defer
  • CI status: failing

Generated by 🔧 PR Triage Agent · auto · 82.9 AIC · ⌖ 6.65 AIC · ⊞ 8.3K ·

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@-

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 7.36 AIC · ⌖ 8.18 AIC · ⊞ 9.5K ·
Comment /souschef to run again

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot this PR looks close, but it still needs a maintainer-ready finish.

  • Please confirm the current HEAD is still up to date with main, rerun the exact validations needed for the latest follow-up, and leave a concise maintainer handoff with commands and outcomes.
  • Then run the pr-finisher skill before handing back.

Run: https://github.com/github/gh-aw/actions/runs/32569036201

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 28.6 AIC · ⌖ 8.36 AIC · ⊞ 9.5K ·
Comment /souschef to run again

Copilot AI commented Aug 22, 2026

Copy link
Copy Markdown
Contributor Author

@copilot this PR looks close, but it still needs a maintainer-ready finish.

  • Please confirm the current HEAD is still up to date with main, rerun the exact validations needed for the latest follow...

Confirmed HEAD (8989476) is already up to date with main (fast-forward check passes, no divergence). Reran validations on the current HEAD:

  • make fmt — clean, no diff
  • go build ./... — passes
  • TEST_UNIT_RUN_FULL=1 make test-unit — full suite passes, 0 failures
  • go test ./pkg/workflow/... -run CloseOlder — all 8 close-older tests pass
  • make recompile — 287/287 workflows compiled, no lockfile diff

The 4 open review threads from github-actions[bot] are already resolved in code (commits b1525ba, 5e9aab4): CloseOlderConfig.Enabled is yaml:"-" and populated only via closeOlderEnabledFromConfigData, per-call-site comments were added in safe_outputs_handler_registry.go, and absence/explicit-false/rejected-public-key tests exist in create_close_older_config_test.go. I don't have thread-resolution access from this sandbox, so a maintainer will need to mark them resolved.

Maintainer handoff:

  • ✅ Reviews — all 4 threads addressed in code; need human resolve-click since I can't resolve threads via API here.
  • ✅ Checks (local) — fmt/build/test-unit/recompile all green on HEAD.
  • ❓ Checks (CI) — no CI has run against this HEAD yet (get_status returns empty); needs a maintainer re-trigger.
  • ✅ Mergeable — branch is up to date with main, no conflicts detected locally.

No code changes were needed this pass since the substantive fixes already landed. Nothing further actionable from this sandbox.

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot sous-chef triage: please review this PR, refresh the branch if needed, address any unresolved review feedback, and use the pr-finisher skill before handing back for maintainer review.

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 3.89 AIC · ⌖ 8.31 AIC · ⊞ 7K ·
Comment /souschef to run again

Copilot AI commented Aug 22, 2026

Copy link
Copy Markdown
Contributor Author

@copilot sous-chef triage: please review this PR, refresh the branch if needed, address any unresolved review feedback, and use the pr-finisher skill before handing back for maintainer review.

Gene...

No changes since my last pass on this PR: HEAD (8989476) is still up to date with main, and the same 4 github-actions[bot] review threads remain the only open feedback — all already resolved in code via commits b1525ba/5e9aab4 (CloseOlderConfig.Enabled is yaml:"-"-only, per-call-site comments added, absence/false/rejected-key tests added). I don't have thread-resolution access from this sandbox, so those need a maintainer click-to-resolve. Local validation (fmt/build/test-unit/recompile) was reconfirmed green in my previous pass on this same HEAD; no code changed since then to warrant a re-run. Nothing further is actionable from this sandbox — ready for maintainer review/merge.

@github-actions

Copy link
Copy Markdown
Contributor

PR Triage

Category: refactor | Risk: medium | Priority: medium | Score: 42/100
Recommended action: defer

Unifies close-older config fields across create-* safe outputs. CI green (2 success), APPROVED. Low urgency.

Automated triage — run 32572524009

Generated by 🔧 PR Triage Agent · auto · 65.4 AIC · ⌖ 6.04 AIC · ⊞ 8.3K ·

@github-actions

Copy link
Copy Markdown
Contributor

🛠️ Agentic Maintenance updated this pull request branch.

View workflow run

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[deep-report] Unify CloseOlderKey/CloseOlder* config fields into a CloseOlderConfig embed

4 participants