Skip to content

writ deploy with no project refuses, though common is implicit and the config path handles zero projects #843

Closed

Description

@David-Noble-at-work

common is implicit: cmd/writ/writ/config.go:37-40 prepends it to every project list, and
docs/guides/writ/platform-awareness.md says "users don't need to specify common". Both are right,
and writ deploy noblefactor proves it — the plan carries every common file.

But writ deploy with no project at all refuses:

$ writ deploy
Error: requires at least 1 arg(s), only received 0

while the code it never reaches handles exactly that case:

if len(projects) == 0 || slices.Contains(projects, "common") {
    return projects              // config.go:37
}
return append([]string{"common"}, projects...)

The command's arity check contradicts its own configuration logic. The effect on 2026-09-06: the
first base-layer deploy — six files, all under common — had to be typed as writ deploy common,
which the guide says nobody should need to type.

Fix

Drop the minimum-args check; with no projects, deploy common alone, and say so in the banner:
Deploying common (implicit) [home]. writ upgrade should behave the same if it shares the check.


Epic: #447


Feature: #463

Ruled 2026-09-23 (schedule #916, lane 9, PR D)

The argument requirement goes. Bare writ deploy deploys the implicit project set (common, and one project per
configured layer repository once #850 lands) on every scope defined on this platform (#926): everything implicit,
everywhere defined. The owner, 2026-09-21: "common should always deploy."

Activity

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

    @David-Noble-at-work
    ContributorAuthor

    Ruled 2026-09-06 on #463 and carried by #850: the implicit set is common plus one project per configured layer repository, and a bare writ deploy converges it — #850's first acceptance item. This issue is the bug that ruling closes; the MinimumNArgs(1) it names is the one line between them. Restated 2026-09-07 by the user against build 155067ae: "it should be true that i can say writ deploy --allow-dirty." Still refuses today with requires at least 1 arg(s), only received 0.

    noblefactor-ops's README states the ruled form, writ deploy, and names this issue as the interim; when this lands that sentence goes.

  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: step 2.1 (the shim in deploy() names the implicit set until then) 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

Assignees

No one assigned

    Labels

    Epic:WritDeploymentwrit deployment: layers, adoption, and driftThread:WritDeploydeploying converges the machinebugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions