Skip to content

Move an Application between Projects by declaring it in the new one first #334

Closed

Description

@ExtraToast

Parent

#324

What

Let an Application move between Projects with no pairing field (chapter 40): while two Projects declare one Id, the declaration outside the active Instance's namespace is the target and a Move is derived. The old Project removing it while the Move is open is E_MOVE_OPEN, and that Project is isolated with its source still rendered. A declaration left behind after retirement renders nothing, and the next fragment that still declares it is E_DUPLICATE_APPLICATION_ID. A negative fixture covers each order of publication.

Lands in TypeScript only, after emf/ is deleted (#347), with the rendered-tree and diagnostics oracles it affects, in one pull request. The intent, effective and dependencies goldens are dropped (#346), so it adds none.

Behaviour (draft ledger row)

An Application declared by two Projects composes once, as the target of a Move from the Project holding its active Instance, in every order the fragments arrive. The old Project cannot drop it before the Move retires, and cannot keep it after.

Blocked by

#341, the map whose rewrite plan replaces the closed placement ticket #328 (see #350).

Activity

  1. added
    type: featureNew user-facing or operator-facing capability.
    area: deployhomelab-deploy, deploy-v2, manifests, and rollout flow.
    priority: P2Medium; normal planned work.
    status: blockedCannot move forward until an external dependency is resolved.
    on Oct 9, 2026
  2. ExtraToast commented on Oct 27, 2026

    @ExtraToast
    ContributorAuthor

    Resume here (updated 2026-10-27)

    State: merged as 30bc5414 (PR #650).

    Next step: none here. 1.0.0 now waits on #665 and the maintainer (#379).

    Blocked by: nothing.

    Decisions:

    • No pairing field. Of an Id exactly two Projects declare, the declaration in the namespace ClusterState records its active Instance in is the one it moves out of (src/check/departures.ts).
    • The old declaration resolves departing: true, with no routes, Client, alerts, dashboards, migration or Move, and its workloads created once.
    • E_MOVE_OPEN fires when the old Project stops declaring the Application before the source retires.
    • After retirement, a leftover declaration renders nothing; it is not refused. Chapter 40 was reworded to match.
    • Ledger row: REQ-115.

    Open, written in the PR for the maintainer:

    • the Release Gate must keep target and flippedAt on its record after retirement (delivery repo);
    • a stateless Move has no flip Job yet, because nobody has chosen the image that would run it.
  3. removed
    status: blockedCannot move forward until an external dependency is resolved.
    on Oct 27, 2026
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

    area: deployhomelab-deploy, deploy-v2, manifests, and rollout flow.priority: P2Medium; normal planned work.type: featureNew user-facing or operator-facing capability.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions