Skip to content

writ decommission: --all removes everything writ deployed, a named removal re-converges the rest, and an implicit project is refused by name #851

Open

Description

@David-Noble-at-work

Feature: #463 — writ command surface: layers, segments, adoption. Ruled 2026-09-06 (recorded on #463) alongside
the selection model in #850.

Today

writ decommission <project>... requires at least one name, reads the store's inventory, removes exactly what those
projects' runs put into effect (links unlinked, copies archived, a user-replaced target refused), and stops. It does
not re-converge the remaining projects, so a target the removed project overlaid is gone until the next deploy. Its
examples still show all as a project name from the Tuckr era.

The rulings

  1. --all decommissions everything writ deployed on this machine. The bare form stays refused; destruction is
    explicit.
  2. A named removal re-converges. After the named projects' entries are removed, the remaining selection is
    converged, so a target that both common and the removed project claimed reverts to common's version. apt remove re-resolves; so does this.
  3. Persistent. The removed project's store entries go, so it leaves the selection (The implicit projects are common and one per configured layer repository; a repository-named project in any layer deploys unnamed #850) and no later deploy or
    upgrade brings it back unless it is named again.
  4. An implicit project is refused by name — common and the repository-named projects would return on the next
    bare deploy. The refusal names the verb that retires what a layer contributes: writ repo unset <layer>.
  5. No --from <layer>. A per-layer exclusion would be a fourth kind of persistent state that no repository
    records. Remove the files from the repository, or unset the layer.
  6. The all example goes.

Acceptance

  • writ decommission --all removes every entry in the store; writ decommission with neither names nor --all
    is refused
  • after writ decommission noblefamily, a target both common and noblefamily claimed holds common's version,
    asserted end to end
  • writ decommission common and writ decommission <repository-name> are refused, naming writ repo unset
  • a following writ upgrade regenerates nothing of the removed project
  • the command's help and docs/guides/writ/manage-environments.md state all of the above; the all example is gone

Related

#850 (the selection model), #849 (the design record), #792 (writ repo remove leaves the clone; the unset verb this
issue points at), #762 (the lifecycle surface).

Activity

  1. David-Noble-at-work commented on Sep 8, 2026

    @David-Noble-at-work
    ContributorAuthor

    The layer-journey scenario (#855, cmd/writ/scenario_layer_journey_test.go, landed in #859) is this issue's acceptance test: steps 2.7–2.8 runs the ruled interface and skips by this issue's number until the binary has it, on all six legs of the scenario job. When this lands, that skip turns into a pass without the scenario changing — and if it does not, the failure message names the step.

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

Metadata

Metadata

Labels

Epic:WritDeploymentwrit deployment: layers, adoption, and drifttaskImplementation work item

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions