Skip to content

docs: ADR-049 MaintenanceRequest (MR) — entry door for signaling incoming node maintenance - #1577

Open
jtschelling wants to merge 15 commits into
NVIDIA:mainfrom
jtschelling:feature/jsc-92-ef-adr
Open

docs: ADR-049 MaintenanceRequest (MR) — entry door for signaling incoming node maintenance#1577
jtschelling wants to merge 15 commits into
NVIDIA:mainfrom
jtschelling:feature/jsc-92-ef-adr

Conversation

@jtschelling

@jtschelling jtschelling commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds ADR-049, the design for the MaintenanceRequest (MR) CRD and reconciler — the inbound counterpart to ExternalRemediationRequest (ADR-040). An external system or operator creates an MR to tell NVSentinel that maintenance is incoming for a node and it should be prepared (cordoned, drained) before the work begins, without side-stepping the quarantine/drain pipeline.

Key design points

  • Emit as authored. On create, the MR reconciler emits spec.healthEvent unchanged (the creator picks recommendedAction) and injects the MR name + UID into metadata; the pipeline routes it to the matching remediation (CUSTOM/external-remediation -> ERR, RESTART_VM -> RebootNode, ...). MR carries a startTime recording when the maintenance window opens.
  • Deletion is the clear. The reconciler watches the resulting child maintenance CR (associated by a label) and, when the child reaches Status.CompletionTime, deletes the MR. Deleting the MR — automatically on completion, or manually by an operator — runs the finalizer, which emits a matching isHealthy=true event to retract the fault. One clearing path, no owner-reference/GC machinery.
  • Simple lifecycle. Present = maintenance active, absent = cleared. A single HealthEventEmitted condition; no retained/completed objects.
  • New component lifecycle-manager. The reconciler needs a controller-runtime manager, a validating webhook, a platform-connector emitter, and read access to the maintenance CRs it watches. This fits neither janitor (a pure API controller) nor csp-health-monitor (a poll/emit loop), so it lives in a new dedicated component.
  • Webhook rejects an isHealthy=true opening event, freezes spec.healthEvent after creation, and best-effort-rejects a duplicate MR for a node.

The ADR also documents the pipeline dependencies MR relies on (a fault-quarantine ruleset that matches MR-emitted events, and fault-remediation propagating the association label onto whatever child CR it creates).

Dependencies

  • ADR-040 (ExternalRemediationRequest) — shipped.
  • The fault-remediation association-label propagation and a matching fault-quarantine ruleset must land with MR (the external-remediation ERR-producing action is only needed for the CUSTOM case).

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The ADR defines the ExternalFault Kubernetes CRD for externally initiated node remediation. It specifies the API schema, reconciliation state machine, health-event delivery, maintenance-CR linkage, clearing and deletion behavior, validation, RBAC, deployment integration, and testing requirements.

Changes

ExternalFault remediation API

Layer / File(s) Summary
ExternalFault API and lifecycle contract
docs/designs/049-external-fault.md
Defines the ExternalFault schema, conditions, completion semantics, deployment integration, and example manifest.
Reconciliation and remediation flow
docs/designs/049-external-fault.md
Defines reconciler hosting options, state transitions, health-event delivery over the platform-connector socket, maintenance-CR ownership, remediation sequencing, clearing, deletion behavior, and design tradeoffs.
Validation, permissions, and testing
docs/designs/049-external-fault.md
Specifies admission validation, RBAC, references, and reconciler, end-to-end, cancellation, failure, non-CUSTOM action, and duplicate-rejection test coverage.

Estimated code review effort: 2 (Simple) | ~10 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title describes ADR-049 and inbound node maintenance signaling, which is related, but it names MaintenanceRequest instead of the defined ExternalFault CRD.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai 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.

Actionable comments posted: 5

🧹 Nitpick comments (1)
docs/designs/049-external-fault.md (1)

232-237: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add language identifiers to the fenced blocks.

markdownlint-cli2 reports MD040 for the RBAC and sequence-diagram blocks. Use text for these fences.

Also applies to: 241-243, 249-285, 289-303

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/designs/049-external-fault.md` around lines 232 - 237, Add the `text`
language identifier to the fenced code blocks in the external fault design
document, including the RBAC and sequence-diagram blocks referenced by the
comment, while preserving their existing contents.

Source: Linters/SAST tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/designs/049-external-fault.md`:
- Around line 224-226: Update the external-fault design section describing
duplicate-node handling: retain the informer-backed lister check only as an
early rejection, remove claims that it prevents races, and specify an
API-server-enforced uniqueness claim or reconciler-side per-node leader
mechanism to guarantee a single active EF per node under concurrent creates.
- Around line 219-223: Update the external-fault validation design so opening
health events with isHealthy=true are rejected, and make the entire
spec.healthEvent immutable after creation rather than only nodeName. Ensure all
event fields, including agent, checkName, metadata, and related payload data,
remain unchanged for the clearing event.
- Around line 166-169: Update the operator-delete flow described under “Operator
delete” to coordinate fault retraction and queued child creation before removing
the cleanup finalizer. Ensure deletion emits or otherwise guarantees the
matching isHealthy=true recovery for an opening CUSTOM event, cancels queued
child creation with deduplication, and retains the finalizer until cancellation
succeeds and downstream processing guarantees no new child ERR can be created.
- Around line 173-192: Update the fault-remediation flow and event metadata
contract to include the originating ExternalFault UID alongside
externalFaultName, and require both name and UID to match before creating or
linking an ExternalRemediationRequest. When the referenced EF is missing or the
UID differs, do not create an unowned ERR; fail closed or retry according to the
existing reconciliation behavior.
- Around line 154-160: Update the ExternalFault reconciliation state machine to
explicitly retry opening whenever FaultReported is not True, including the
Unknown state after a failed initial emission. Define stable idempotency keys
using the ExternalFault UID plus the operation phase for both opening and
clearing, and use those keys when publishing downstream events so retries cannot
create duplicate ERRs.

---

Nitpick comments:
In `@docs/designs/049-external-fault.md`:
- Around line 232-237: Add the `text` language identifier to the fenced code
blocks in the external fault design document, including the RBAC and
sequence-diagram blocks referenced by the comment, while preserving their
existing contents.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 0fb7556d-1748-4e88-8078-a7643cff1223

📥 Commits

Reviewing files that changed from the base of the PR and between a22fe4b and 0b56ace.

📒 Files selected for processing (1)
  • docs/designs/049-external-fault.md

Comment thread docs/designs/049-external-fault.md Outdated
Comment thread docs/designs/049-external-fault.md Outdated
Comment thread docs/designs/049-external-fault.md Outdated
Comment thread docs/designs/049-external-fault.md Outdated
Comment thread docs/designs/049-external-fault.md Outdated
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Merging this branch will increase overall coverage

Impacted Packages Coverage Δ 🤖
github.com/nvidia/nvsentinel/commons/pkg/lambda 12.93% (ø)
github.com/nvidia/nvsentinel/fault-quarantine/pkg/evaluator 42.70% (+0.45%) 👍
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/cmd/csp-health-monitor 0.00% (ø)
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/cmd/maintenance-notifier 0.00% (ø)
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/config 0.00% (ø)
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/csp/lambda 0.00% (ø)
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/datastore 0.00% (ø)
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/event 0.00% (ø)
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/model 0.00% (ø)
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/triggerengine 0.00% (ø)
github.com/nvidia/nvsentinel/health-monitors/syslog-health-monitor 0.00% (ø)
github.com/nvidia/nvsentinel/health-monitors/syslog-health-monitor/pkg/syslog-monitor 0.00% (ø)
github.com/nvidia/nvsentinel/janitor-provider/pkg/csp 0.00% (ø)
github.com/nvidia/nvsentinel/janitor-provider/pkg/csp/lambda 0.00% (ø)
github.com/nvidia/nvsentinel/labeler/pkg/labeler 58.23% (+0.24%) 👍
github.com/nvidia/nvsentinel/labeler/pkg/metrics 0.00% (ø)
github.com/nvidia/nvsentinel/tests 0.00% (ø)

Coverage by file

Changed files (no unit tests)

Changed File Coverage Δ Total Covered Missed 🤖
github.com/nvidia/nvsentinel/commons/pkg/lambda/client.go 12.82% (ø) 1225 157 1068
github.com/nvidia/nvsentinel/commons/pkg/lambda/instances.go 12.76% (ø) 439 56 383
github.com/nvidia/nvsentinel/commons/pkg/lambda/maintenance_events.go 14.01% (ø) 207 29 178
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/cmd/csp-health-monitor/main.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/cmd/maintenance-notifier/main.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/config/config.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/csp/lambda/informer.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/csp/lambda/lambda.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/datastore/datastore.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/event/lambda_normalizer.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/event/normalizer.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/model/maintenance_event.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/triggerengine/trigger.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/health-monitors/syslog-health-monitor/main.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/health-monitors/syslog-health-monitor/pkg/syslog-monitor/fake_journal.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/health-monitors/syslog-health-monitor/pkg/syslog-monitor/journal_iface.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/health-monitors/syslog-health-monitor/pkg/syslog-monitor/journal_real.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/health-monitors/syslog-health-monitor/pkg/syslog-monitor/journal_stub.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/health-monitors/syslog-health-monitor/pkg/syslog-monitor/syslogmonitor.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/health-monitors/syslog-health-monitor/pkg/syslog-monitor/types.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/janitor-provider/pkg/csp/client.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/janitor-provider/pkg/csp/lambda/lambda.go 0.00% (ø) 0 0 0
github.com/nvidia/nvsentinel/labeler/pkg/labeler/labeler.go 64.42% (+0.26%) 756 487 (+2) 269 (-2) 👍
github.com/nvidia/nvsentinel/labeler/pkg/metrics/metrics.go 0.00% (ø) 0 0 0

Please note that the "Total", "Covered", and "Missed" counts above refer to code statements instead of lines of code. The value in brackets refers to the test coverage of that file in the old version of the code.

Changed unit test files

  • github.com/nvidia/nvsentinel/commons/pkg/lambda/client_test.go
  • github.com/nvidia/nvsentinel/commons/pkg/lambda/instances_test.go
  • github.com/nvidia/nvsentinel/commons/pkg/lambda/maintenance_events_test.go
  • github.com/nvidia/nvsentinel/fault-quarantine/pkg/evaluator/rule_evaluator_test.go
  • github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/csp/lambda/lambda_test.go
  • github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/datastore/datastore_test.go
  • github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/event/lambda_normalizer_test.go
  • github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/event/processor_test.go
  • github.com/nvidia/nvsentinel/health-monitors/csp-health-monitor/pkg/triggerengine/trigger_test.go
  • github.com/nvidia/nvsentinel/health-monitors/syslog-health-monitor/main_test.go
  • github.com/nvidia/nvsentinel/health-monitors/syslog-health-monitor/pkg/syslog-monitor/syslogmonitor_test.go
  • github.com/nvidia/nvsentinel/janitor-provider/pkg/csp/client_test.go
  • github.com/nvidia/nvsentinel/janitor-provider/pkg/csp/lambda/lambda_test.go
  • github.com/nvidia/nvsentinel/labeler/pkg/labeler/labeler_test.go
  • github.com/nvidia/nvsentinel/tests/external_remediation_test.go

@coderabbitai coderabbitai 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.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/designs/049-external-fault.md`:
- Around line 29-31: Update the deployment requirements for Options 1 and 2 to
mandate leader election or an equivalent single-active-replica guarantee
whenever an EF host runs more than one replica. Explicitly cover Janitor’s
--leader-elect setting and the csp-health-monitor chart’s scalable replica
configuration, while preserving Option 3’s existing leader-election requirement.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: db7fdddc-3445-4e45-a25d-a5572582ec94

📥 Commits

Reviewing files that changed from the base of the PR and between 0b56ace and 97d8a4d.

📒 Files selected for processing (1)
  • docs/designs/049-external-fault.md

Comment thread docs/designs/049-external-fault.md Outdated
Comment thread docs/designs/049-external-fault.md Outdated
Comment thread docs/designs/049-external-fault.md Outdated
Comment thread docs/designs/049-external-fault.md Outdated
Comment thread docs/designs/049-external-fault.md Outdated
Comment thread docs/designs/049-external-fault.md Outdated
Comment thread docs/designs/049-external-fault.md Outdated
Comment thread docs/designs/049-external-fault.md Outdated
Comment thread docs/designs/049-external-fault.md Outdated
@lalitadithya
lalitadithya requested a review from natherz97 August 11, 2026 06:32
Comment thread docs/designs/049-external-fault.md Outdated
Comment thread docs/designs/049-external-fault.md Outdated
- **Pros:** health monitors are native emitters — `csp-health-monitor` already mounts the platform-connector socket and holds a `healthpub.Publisher`, so capability (2) is free. It also already detects CSP maintenance signals (AWS/GCP), the canonical EF trigger, so the component that observes external faults would also own their lifecycle — a good fit with EF's "synthetic monitor" framing.
- **Cons:** `csp-health-monitor` is a poll/emit loop, **not** a controller-runtime app — no manager, no CRD reconcilers, no webhook server, and no leader election (it runs as a multi-replica Deployment). Hosting EF here means grafting on the entire controller-runtime + webhook stack (capability 1). It also splits the EF↔ERR pair across components: `csp-health-monitor` would import janitor's CRD types and `Owns`-watch a janitor-owned CRD, and the EF webhook would either need a new server here or stay behind in janitor.

### Option 3 — standalone component

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.

I'm working on an ADR which will add a validation-controller that reconciles a ValidationRequest: #1496. We could combine both of these validation and maintenance controllers into a single node lifecycle component. What do you think?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

i think thats a good idea. i've reworked the deployment logic for this ADR, i think it will fit nicely with the ValidationRequest reconciler. Having two open ADRs for this makes merge timing a bit difficult so i've intentionally not mentioned #1496 in this ADR

Comment thread docs/designs/049-external-fault.md Outdated
Comment thread docs/designs/049-external-fault.md Outdated

EF only *emits* a health event; whether that event flows through quarantine → drain → ERR depends on the rest of the pipeline being configured to act on it. Two pieces must be in place for the happy path to fire, and neither is implied by the EF reconciler itself:

1. **A `fault-quarantine` ruleset that matches EF-emitted events.** `fault-quarantine` cordons only events matching one of its rulesets; a generic external-remediation event (e.g. a CSP-maintenance `CUSTOM` event) matches none of the default agent/check-specific rulesets and is skipped, so no cordon/drain occurs. The EF-emitted event must carry fields that match an existing ruleset, or a dedicated ruleset for EF-originated events must be added.

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.

The fault-quarantine module is receiving a new ruleset which maps unhealthy events to a set of validation tests which will be run after an unquarantine event occurs for the given node. We could wire this functionality into EFs to support nodes being re-validated after the given maintenance completes. I think we can track that as a follow-up but would be useful in situations where CSPs perform maintenance without terminating the underlying node objects (such as with GCP GB200 maintenance).

…not forced to CUSTOM); child-agnostic clear on child CompletionTime
…Time; deletion-as-clear via finalizer; host in new lifecycle-manager component
@jtschelling jtschelling changed the title docs: ADR-049 ExternalFault (EF) — entry door for external-initiated node handoff docs: ADR-049 MaintenanceRequest (MR) — entry door for signaling incoming node maintenance Aug 12, 2026
Comment thread docs/designs/049-maintenance-request.md Outdated
| `spec.healthEvent.isHealthy` is `false` (an opening event must *raise* a fault, not clear one) | ✓ | ✓ |
| Node named by `nodeName` exists in the cluster | ✓ | — |
| `spec.healthEvent` is immutable (the whole event is frozen after creation) | — | ✓ |
| No other MaintenanceRequest for the same node | ✓ | — |

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I'm not sure about these checks, we could have nodes have MRs starting at different times though right?

@jtschelling jtschelling Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

we could have nodes have MRs starting at different times though right?

Do you mean node X has 2 MR's created at the same time, one starting at T and the other starting at T+1?

- The MR path depends on pipeline wiring that does not exist purely for MR: a `fault-quarantine` ruleset that matches MR-emitted events, and `fault-remediation` association-label propagation on whatever child CR it creates (only the `CUSTOM` case additionally needs the not-yet-built ERR-producing action). These must land with, or before, MR.
- The webhook's duplicate and node-existence checks use an informer-backed lister — a best-effort guard, not a transactional uniqueness constraint.

## Alternatives Considered

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

can we add an alternative to understand why we can't use KOM to handle this use case? Is it because it is too generic and representing this in CEL would be to complex?

@nitz2407

Copy link
Copy Markdown
Contributor

I think this is overlapping with different already available modules:

  • csp-health-monitor
  • KOM
  • ExternalRemediationRequest (ADR-040)

Is this really needed since we already have overlapping modules, can't we extend them?

Comment thread docs/designs/049-maintenance-request.md Outdated
Comment thread docs/designs/049-maintenance-request.md Outdated
Comment on lines +156 to +157
startTime: "2026-05-13T03:00:00Z"
healthEvent:

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.

why do we need startTime in spec? does it represent when was the maintenance requested? won't that be equal to generatedTimestamp of CR?

Comment on lines +172 to +174
generatedTimestamp: "2026-05-13T02:00:00Z"
id: he-mst-c6d92aa1-2f6e-4e8b-9e3d-b75f86b1aaaa
version: 1

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.

I couldn't understand, Why do we need generatedTimestamp, ID and version in spec.healthevent? event IDs are automatically created whenever we insert event in DB

**Negative / tradeoffs:**
- **A forgotten MR leaves a node cordoned indefinitely.** Nothing reclaims it, so MRs become an operational surface that needs monitoring (e.g. alert on MRs well past their `startTime`). This is the main cost of dropping automatic cleanup.
- Deleting an MR always emits the clear, even if the remediation it triggered is still in flight — the node un-cordons while that remediation continues independently.
- MRs are not retained after completion, so there is no built-in historical record of completed maintenance.

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.

since we are not automatically deleting the MR now, this point is not valid anymore, right?

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.

5 participants