I2670 — A build-cache offer is a typed model and its selection is a pure, explained function
Model an offer (protocol, provider, scope, non-secret endpoint, bucket, priority, capacity, health) and select among offers deterministically with the reason.
READY wave 0 · p1 · implementation profile · runs alone
Part of development-runtime — The runtime has a development surface.
Ready. Every dependency is done, so majordomus plan start I2670 will be accepted.
Objective
Model an offer (protocol, provider, scope, non-secret endpoint, bucket, priority, capacity, health) and select among offers deterministically with the reason.
Why
The owner, 2026-10-13, with full clearance: set up MinIO, an sccache server and every mesh node, verified and validated. The cluster compiles the same Rust on every machine from a cold cache; two declared offload hosts were under their disk minimum that day. See ADR 0157.
Current state
Measured on master b29cf4e487 on 2026-10-13: no build-cache, S3 or minio concept exists in source, schema or docs; sccache appears only in the container build (deploy/render.rs) and ADRs 0055 and 0139.
Desired state
A typed Offer and a select() that ranks healthy, scope, priority, headroom, round-trip time and node id, and returns the choice with the passed-over candidates; no offer is a normal answer; no secret field exists in the type.
Scope
- apps/majordomus-cli/src/mesh/build_cache/
- share/schemas/majordomus/mesh-declaration/
Out of scope
- Discovery transport: I2671
- Any command or endpoint: I2672
Dependencies
None. This issue is a root of the graph.
What waits on this
- I2671BLOCKED A provider offers its cache as a signed, expiring mesh record, and a stopped provider goes stale
- I2672BLOCKED The offers and the selection are one read, projected to CLI, MCP, HTTP and OpenAPI
- I2673BLOCKED The sccache client configuration is derived from the selected offer, local disk first
- I2674BLOCKED A node is provisioned as an S3 cache provider, idempotently, with no secret in the repository
Acceptance criteria
- Selection is deterministic for any ordering of the same offers
- A stale or unhealthy offer is never chosen over a healthy one and is listed as passed over
- No offers selects none and says so
- The serialized form cannot carry a credential
Validation
- bin/majordomus plan validate
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib mesh::build_cache
Evidence required
- build_cache_model_unit_tests
Evidence
None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.
Timeline
- started
- —
- verified
- —
- completed
- —
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/I2670.yaml. Read it back with majordomus plan show I2670.