Files
sencho/docs/tutorials
Anso 87db3f121e feat(drift): say how to resolve drift and dismiss it (#2116)
* feat(drift): let a team dismiss a drift finding on the ledger

Drift findings can now be dismissed until they change, for a set number of
days, or permanently. The dismissal lives on the finding's own row in the
drift ledger on the node that owns the stack, so the ledger's detected to
resolved lifecycle retires it: once the finding clears its row is closed, and
a recurrence is a new finding with no dismissal.

Each live finding is published with a stable id, a fingerprint of its
structured facts (kind, service, compose value, running value, never the
message), a count, and a per-kind policy. The Git managed-path conflict is
not dismissable. Dismissing and restoring need exact deploy authority on the
stack, the dismiss route re-reads the stack and refuses a finding that
changed or cleared since it was seen, and the drift status and finding count
keep counting dismissed findings.

Image mismatch findings also carry whether the running image was built after
the one compose names, read from the images' build times. Anything that
cannot be proven reads as unknown.

* feat(drift): resolve and dismiss drift findings from the Drift tab

Each drift finding now names its fix and carries the verb that runs it:
redeploy to match compose (confirmed first, through the editor's own deploy
handler), start a missing service, or open the stack editor or Git source
where the change is a decision about compose rather than the runtime. When the
running image is provably newer than the one compose names, the editor leads
and the redeploy confirm says it moves the service back to an older image.
Verbs the account cannot run are dropped instead of left to answer 403.

Findings can be dismissed until they change, for 7 days, or permanently, and
restored from the dismissed list. The status keeps its verdict and counts the
dismissed findings. A report from an older remote node, which cannot record a
dismissal, offers no Dismiss.

* docs(drift): document resolving and dismissing drift findings

Describe the verb each finding kind offers, the redeploy confirm, dismissing
and restoring, and who can run what. Rework the drift tutorial around the
redeploy button on the finding, with fresh screenshots of the finding, the
overflow menu, the confirm, the resolved state, and the Activity timeline.

* fix(drift): scope dismissals and late answers to the stack they belong to

Dismissing a finding now writes only that finding's own ledger row instead of
reconciling the whole stack from a snapshot that may be behind a concurrent
check, so it can no longer resolve or insert sibling findings or stamp the
check time. The Drift tab ignores a re-check, dismissal, or restore that
finishes after the operator moved to another stack or node, and closes an open
redeploy confirm on a switch.

Open stack editor needs permission to edit the stack, so a deployer is not
shown a button that does nothing. The dismissal hook takes either a hub surface
or a node endpoint, a restore that finds nothing re-reads the list, a dismissal's
mode and expiry are one type, and the drift dismiss route bounds the count like
the other dismissal routes. Adds tests for the dismissal lifecycle, the race,
the failure paths, and the handler wiring.

* docs(drift): say which buttons need permission to edit or deploy
2026-10-11 22:50:30 -04:00
..