Skip to content

The implicit projects are common and one per configured layer repository; a repository-named project in any layer deploys unnamed #850

Closed

Description

@David-Noble-at-work

Feature: #463 — writ command surface: layers, segments, adoption. A design point ruled 2026-09-06 (recorded on
#463), to become code, a design-record entry (#849), and an integration test.

The rule

The project selection of a deploy is: common, plus one project per configured layer repository, named for the
repository, plus every project named on the command line. A repository-named project may live in any layer's
Home — a personal Home/devlore-cli is the personal layer's overrides for working with that repository — and it
deploys with its suffix chain like every other project.

With base = noblefactor-ops, team = devlore-cli, personal = personal, on Darwin, a bare writ deploy overlays, per
layer in order:

Home/common{,.Unix,.Darwin}
Home/noblefactor-ops{,.Unix,.Darwin}
Home/devlore-cli{,.Unix,.Darwin}
Home/personal{,.Unix,.Darwin}

and writ deploy noblefamily adds Home/noblefamily{,.Unix,.Darwin} on top, from every layer that has it.

Today

withCommonProject (from the implicit-common plan, 2026-08-09) injects common into deploy and upgrade selection and
nothing else. writ deploy requires at least one project argument (cobra.MinimumNArgs(1)), so the bare form in the
ruling does not run at all. The repository's name is the layer registration's business: #793 rules that a clone is
named the way git clone names it, and that name is the one this rule uses.

Acceptance

  • writ deploy with no argument deploys the implicit set alone; writ upgrade selects the same way; decommission
    stays explicit
  • the implicit set is common plus the configured layers' repository names, resolved from the registrations
    (a path-registered layer contributes its directory's name, a URL-registered one its clone's name per writ names a cloned repository by its layer; it should name it the way git clone does #793)
  • a repository-named project in any layer is included, with its suffix chain
  • a project named on the command line is added, from every layer that carries it; an unknown name is an error
    naming it
  • an integration test: three fixture layers, personal/Home/devlore-cli present, common present in all three,
    noblefamily in personal only; a bare deploy links the first two and not the third; deploy noblefamily
    links all three; the plan narrates which projects were implicit and which were named
  • the design record (The writ design record states the layer overlay, the implicit common project, the suffix chain, and the manifest union in one place #849) states the rule and the example; docs/guides/writ/repositories.md and
    platform-awareness.md agree

Related

#849 (the design record), #793 (clone naming), #814 (manifests combine across all of these directories too),
the implicit-common plan docs/plans/implicit-common-project.md.

Selection is persistent (USER, 2026-09-06)

Deploy adds a named project to the machine's selection and converges the whole set; the reading to confirm is that the store is the record (a project is selected while it has entries). Open before ruling: a project that deploys no file on this platform (only a .Windows variant, deployed on a Mac) records nothing and would not be remembered — if that matters, selection needs its own record. No --only. Decommission is #851.

Ruled 2026-09-23 (schedule #916, lane 10, PR D; waits on #843, lane 9)

The rule above stands as recorded. With #843 the bare form runs, and with #926 it runs on every scope defined on
this platform.

Activity

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

    @David-Noble-at-work
    ContributorAuthor

    #843 is the open bug this closes — writ deploy with no project refusing on MinimumNArgs(1) while config.go:37 already handles the empty list. Restated by the user 2026-09-07 against build 155067ae. noblefactor-ops's README states the bare form and names #843 as the interim.

  2. 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.1, 2.6 and the seven layer subsets 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.

  3. David-Noble-at-work commented on Sep 26, 2026

    @David-Noble-at-work
    ContributorAuthor

    Ruled 2026-09-26 (lane 10, PR B with lanes 4 and 9)

    The bare form is writ deploy common, and it remembers everything it deployed. The record is the selection: a
    project stays selected while the record holds a file of it; a project that put no file on this machine has nothing
    to be remembered by. No selection record beside the receipts. (An earlier version of this comment read the ruling
    the other way; this is the correction.) Lane 10 was taken into PR B beside lane 9 on 2026-09-24; PR D is retired.
    Plan: docs/plans/task/850-implicit-projects.md.

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 driftThread:WritDeploydeploying converges the machinetaskImplementation work item

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions