Skip to content

I2849 — release next raises from the trunk the repository names, never from a branch name written in the tool

When `majordomus release next` (capability release.next) is given no --base, it measures the landing against the remote-tracking ref of the trunk this repository names, through the one rule the delivery report already uses (delivery::revision::trunk_ref), and refuses by name when the trunk cannot be told.

DONE wave 0 · p0 · implementation profile · parallel safe

Part of adopter-upgrades — An adopting repository survives a Majordomus upgrade, and what the tool vendors into it is adopter-neutral.

Objective

When `majordomus release next` (capability release.next) is given no --base, it measures the landing against the remote-tracking ref of the trunk this repository names, through the one rule the delivery report already uses (delivery::revision::trunk_ref), and refuses by name when the trunk cannot be told.

Why

Found by the code truth-sweep of master 707a04c7ce8 on 2026-10-17: the --base default was the literal `origin/master` in two places (cli.rs default_value and NextInput::base's unwrap_or), while worktree::identity::detect_trunk states the trunk is never hard-coded. In an adopting repository whose trunk is `main` the command refused, or answered about a ref that is not its trunk. The release seat ruled it P0 for v1.0.0-alpha.1.

Current state

--base defaults to `origin/master` on the command line and in the capability input.

Desired state

--base is optional on every surface; absent, release.next resolves it with delivery::revision::trunk_ref (the remote's default branch, else the identity's trunk, else the only remote-tracking branch), and a repository where none resolves is refused with the reason and the remedy (name it with --base).

Scope

  • apps/majordomus-cli/src/capability/builtin/release.rs
  • apps/majordomus-cli/src/commands/release.rs
  • apps/majordomus-cli/src/cli.rs

Out of scope

  • The other places the trunk name is written as a literal: planned as I2843 (one accessor plus a ratchet scan).

Dependencies

None. This issue is a root of the graph.

Acceptance criteria

  • In a clone whose remote default branch is main, release.next with no base raises from origin/main
  • A named base is used as named
  • A repository whose trunk cannot be told is refused, naming --base

Validation

  • bin/majordomus plan validate
  • cargo test --lib -- capability::builtin::release:: commands::release::
  • MJ_TEST_JOBS=4 bash test/run.sh 1060_the_version_is_allocated_at_landing

Evidence required

  • unnamed_base_is_the_trunk_test

Evidence

coverstypecommandresultat commit
unnamed_base_is_the_trunk_testcivalidate run 39192952944 at master dd4c0a87cba: rust (1-3) runs cargo test --lib, including capability::builtin::release::an_unnamed_base_is_the_trunk_the_repository_names and a_landing_whose_trunk_cannot_be_told_is_refused; bash test/run.sh 1060_the_version_is_allocated_at_landing locallysuccess; case 1060: 3 passed, 0 failed, 0 skipped on master dd4c0a87cbadd4c0a8

Timeline

started
2026-10-19T15:29:31Z
verified
—
completed
2026-10-19T15:29:52Z

Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.

Canonical record: .ai/repo/project/issues/I2849.yaml. Read it back with majordomus plan show I2849.

Searches the titles and descriptions of every page this site publishes.