Skip to content
Cockpit0.29.0
A snapshot: read at commit 707a04c7ce8 on 2026-10-18T00:06:01Z by majordomus 0.29.0. Nothing on this page is read again. See it live

I1504

One development transition is a capability, end to end

Where it stands

devtask.issue
Readiness
ready no dependency and no gate holds it; nobody has started it
Status
READY
Can start
startable
Milestone
Milestone status
ACTIVE
Wave
0
Waiting on
none
Holds back
Behind it in all
3
Evidence
0 of 3
A move writes the repository: it stamps one field of this issue's record and appends one event to the ledger, and a commit will carry both.
The same moves from a terminal

majordomus plan start I1504

majordomus plan verify I1504

majordomus plan done I1504

What it is

Objective
Declare one development transition — the plan's `done` — as a single `capability!` of kind command in the plan module, with a typed input schema, benchmark cases and a registered ledger event, and point lib/plan.sh at it instead of letting it write the YAML itself.
Why
This is the smallest change that tests the architecture ADR 0040 states, and the audit's own conclusion is that the first phase of work is not UI. Nothing in the target flow is new infrastructure: the capability macro, the input schemas, the generated OpenAPI, the MCP bridge and the Cockpit's schema-generated runner form all exist and all work — what is missing is an arrow from a development transition to any of them. The registry today has three command capabilities and not one of them is about development, which is why `tools/call majordomus_plan_done` answers `unknown tool`: there is no capability for a plan transition, and that error message is the architecture in one line. If this lands cleanly every later phase is the same shape, and if it does not, nothing later would have worked either.
Now
Plan transitions exist only in lib/plan.sh, which writes the issue YAML directly. The Rust side reads the same records through plan.* and, since the audit's base, through devtask.issue and devtask.milestone, and writes nothing. .ai/repo/development-semantics-baseline.txt carries `backing:plan` as an accepted entry.
Wanted
Moving one issue to done is decided in one place. The CLI, the MCP tool, the HTTP route, the OpenAPI operation and the Cockpit's generated form are each a projection of that one declaration, none of them hand-written, and the shell tool calls it the way lib/context.sh and lib/capture.sh already call the Rust binary.
Done when
unknown: the record declares no `completion`
Risk
High value, contained blast radius. The real risk is scope: a branch that ports lib/plan.sh wholesale proves nothing and cannot be reviewed. One transition, or stop.

Acceptance

  • The MCP tool exists and tools/call moves an issue to done
  • A non-GET operation for the transition appears in the generated OpenAPI without anyone editing the document
  • The Cockpit's existing generic runner drives it with no file under apps/majordomus-cli/src/cockpit changed
  • lib/plan.sh no longer writes the issue YAML itself
  • test/cases/99_plan_capabilities.sh still holds the two engines to byte equality
  • The development-semantics gate reports one fewer entry and refuses the baseline's return
Validation
bin/majordomus-cli capabilities validatebin/majordomus-cli generate --checkbash test/run.sh 99_plan_capabilitiesmajordomus plan validate
Evidence required
transition_is_a_capabilityprojection_not_handwrittentwo_engines_still_agree
Evidence present
unknown: the record carries no `evidence` entries

Scope

Touches
apps/majordomus-cli/src/capability/builtin/plan.rsapps/majordomus-cli/src/plan.rsshare/events.yamllib/plan.sh.ai/repo/development-semantics-baseline.txttest/cases
Not
The other transitions. Start and verify follow the same shape once this one is proved; widening before it is proved is the failure this issue is designed to catch.Any Cockpit page. The existing generic runner must drive the new capability with no Cockpit source edited; if it cannot, that is the finding.A second project model. The canonical records stay where they are and keep their shape.
Depends on
none
Priority
p0
Profile
deep-work
Parallel safe
false
Owner
unknown: the record declares no `owner`

The work so far

Branches
none
Merged
none
Commits
0
Trunk
master
Sessions
none
Created
2026-09-11
Updated
2026-09-11
Started
unknown: the record declares no `started_at`
Verified
unknown: the record declares no `verified_at`
Completed
unknown: the record declares no `completed_at`

Synchronisation

Adapter
scripts/github-sync
Repository
unknown: the derived plan's header carries no repository
External issue
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it
State there
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it

Findings

LevelCodeMessageReproduce
WARNscope_conflictshares apps/majordomus-cli/src/capability/builtin/plan.rs with I1512; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares apps/majordomus-cli/src/capability/builtin/plan.rs with I1800; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I1980; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I1990; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I1997; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares apps/majordomus-cli/src/capability/builtin/plan.rs with I1999; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2059; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2114; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2282; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2410; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2411; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2412; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2413; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2653; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2713; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2714; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2716; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2717; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2718; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares apps/majordomus-cli/src/capability/builtin/plan.rs with I2720; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2723; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2731; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2734; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares apps/majordomus-cli/src/capability/builtin/plan.rs with I2740; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares apps/majordomus-cli/src/plan.rs with I2742; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2747; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2760; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares test/cases with I2786; they may not run concurrentlymajordomus plan validate