crates/dwarves-embed/proto/mimir_release.proto
// mimir_release.proto — the forge's 🚀 MÍMIR RELEASE plan (2026-10-15).
//
// The release order, each repo's dependencies, the convergence and what is
// affected since the last release — read from Mímir (nornir's `Mimir` dependency
// verbs: BuildOrder · DepsOf · ChangedSinceLastRelease · AffectedByChange) BY THE
// FORGE, on its jera queue. The UI never scans a checkout and never dials nornir:
// it asks here, and the forge answers AT ONCE — the kept plan, or the job it put
// on the queue (`queued` / `running`). The UI asks again (each a short call) until
// the plan is there.
//
// The SAME file is compiled by the forge (`crates/dwarves`, server + client) and by
// the UI's thin client (`crates/dwarves-embed`, client): a test keeps the copies
// byte-identical.
syntax = "proto3";
package dwarf.v1;
service MimirRelease {
rpc Plan (MimirReleaseAsk) returns (MimirReleaseAnswer);
}
message MimirReleaseAsk {
// The workspace whose release is planned (nornir's workspace name).
string workspace = 1;
// Compute it again even when a plan is kept (the kept one still comes back,
// marked by its age, while the new one is on the queue).
bool fresh = 2;
}
message MimirReleaseAnswer {
// `done` (plan_json is the plan) · `queued` / `running` (job_id names the jera
// job; plan_json may carry the last kept plan) · `failed` (note says why) ·
// `refused` (the question cannot be asked: note says why).
string state = 1;
string job_id = 2;
string note = 3;
// The plan as JSON (see dwarves::mimir_release::assemble), or empty.
string plan_json = 4;
// How long the job has waited / run (queued / running), in ms.
uint64 waited_ms = 5;
// How old the plan in plan_json is, in ms.
uint64 age_ms = 6;
}