Answer AS14 and AS17 in design 47 G, so the assigner resolves providers and asks a held revert without choosing
§708 says the named seat is found by its definition's delivers and its holder from the placements' holds, so no entry field is added for it; §709 carries the manifest's contributes into the catalog entry and gives the edge kind contribution its contract meaning; §710 writes the held revert's ask in the backup ask's shape, with one message to the operator. Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
---
|
||||
layer: to-be
|
||||
status: in-progress
|
||||
design: 47
|
||||
milestone: G
|
||||
updated: 2026-11-12
|
||||
decisions:
|
||||
- "ADR 0656"
|
||||
- "ADR 0571"
|
||||
- "ADR 0564"
|
||||
- "ADR 0539"
|
||||
- "ADR 0330"
|
||||
- "ADR 0259"
|
||||
- "ADR 0126"
|
||||
- "ADR 0112"
|
||||
- "ADR 0084"
|
||||
---
|
||||
|
||||
# 47, milestone G: the provider a requirement points to, and the ask of a held revert
|
||||
|
||||
One file of milestone G's part of [design 47](../47-delivery-from-commit-to-delivered.md); the part opens at
|
||||
[G.md](G.md). Its design lines are numbered across every file of the part and cited as "design 47 G §n".
|
||||
|
||||
*§708 to §710 answer the assigner's develop questions on build-map rows AS14 and AS17 (2026-11-12), which the lead's
|
||||
answer A-167 ([G-20](G-20-lead-answers.md)) sent to a design line: which field names the seat whose holder provides a
|
||||
requirement, which field says a requirement carries contributed values and the edge's kind word (§357), and the form
|
||||
of the assigner's ask when a revert is held (§300). Each is the design's choice within the record it cites, tested
|
||||
against [the principles](../../../00-META/principles.md).*
|
||||
|
||||
## The provider a requirement points to
|
||||
|
||||
- §708 **The named seat is the seat that delivers the requirement's provision; no catalog entry field names it.**
|
||||
(ADR 0330 §2; ADR 0126 §3; ADR 0084 §3, §4; ADR 0571 §4; design 27 *A module provider*) This completes §357's
|
||||
order for the assigner's `Compute`. A catalog entry's `requires` stay bare provision names. For each requirement
|
||||
R of a placed module on node N, in this order:
|
||||
1. **The named seat's holder.** The seat whose definition's field `delivers` (mesh-sdk `seatdef`) is R, among the
|
||||
seat definitions the entry's catalog graph revision names in its `definitions` (each read whole through the
|
||||
seat `mesh-catalog`'s verb `seat-definitions`, as every part reads the catalog half). Its holder is read from
|
||||
the same revision's placements, from their `holds`, as the assigner's state `seat-holders` keeps them: the key
|
||||
`<seat>` for a seat held once for the mesh, `<seat>.<N>` for a node seat. A seat that delivers R and that no
|
||||
placement holds holds the entry, naming the seat; no other step is tried (design 27, step 1).
|
||||
2. **A pin.** The placed module's `bindings` entry for R, else N's placement `pins` entry for R.
|
||||
3. **The provider on N.** The one module placed on N whose catalog entry's `provides` names R.
|
||||
4. **The only provider.** The one module placed on any node whose catalog entry's `provides` names R.
|
||||
|
||||
Each step that answers gives the entry the edge of kind `provisioning`, its `node`, `module` and `fp` the
|
||||
provider's and its `provision` R. Where no step answers and more than one candidate is placed, the entry carries
|
||||
`held`, a list with one item per requirement held: `requirement` R, `seat` (the unheld seat, step 1 only) and
|
||||
`candidates`, each `{node, module}`, sorted; the assigner writes no want from a held entry, so the node keeps what
|
||||
it runs, and the field is read with the entry through the seat `mesh-wants`' verbs. An optional requirement
|
||||
(ADR 0330 §3) with no candidate is left absent: no edge, no hold. A hard requirement with no candidate is held
|
||||
with `candidates` empty. Why: the seat definition already carries `delivers`, and the assigner already keeps who
|
||||
holds which seat from the placements, so nothing new is declared and no part outside the assigner's inputs is read
|
||||
(ADR 0656 §2; principles 1 and 7); a hold is said in the graph, never only in a log (principle 3; design 47 G
|
||||
A-167). How it is checked: unit (assignment graph), one row per step, the seat's holder winning over a provider
|
||||
on N, an unheld delivering seat holding the entry with `seat` named, two candidates and none on N held with both
|
||||
named, an optional requirement with none left absent.
|
||||
|
||||
- §709 **A requirement carries contributed values where the manifest's `contributes` names it; its edge is of kind
|
||||
`contribution`.** (ADR 0656 §2; §174, §175, §357, §442) This completes §357's contribution edge. The catalog entry
|
||||
gains `contributes`: the requirement names the manifest's `contributes` object has as keys, sorted, its local
|
||||
names not carried; the indexer fills it, since it alone reads a manifest (§442). `requires` keeps naming every
|
||||
requirement, those only `contributes` names included, as mesh-sdk's `catalogue.Manifest.Wants` lists them, since
|
||||
contributing to a requirement is requiring it. For each requirement in `contributes` that §708 resolves, the
|
||||
consumer's entry carries, beside its `provisioning` edge, an edge of kind `contribution` to the same provider, its
|
||||
`provision` the requirement. The kind word is `contribution`, the glossary's and the seat `mesh-wants`' `Edge`
|
||||
`kind` (provisioning, contribution or acting); the assigner's `EdgeContribution` joins `EdgeProvisioning` and
|
||||
`EdgeActing`. The `Edge` fields' descriptions in the seat `mesh-wants`' definition become: `provision`, for
|
||||
provisioning and contribution, the requirement; `seat`, for acting only, the seat whose rule gave the edge. A seat
|
||||
contribution (the manifest's `contributions`, a piece given to a seat's holder on the node) gives no edge in G.
|
||||
Why: the manifest already says which requirements carry contributed values, and the edge kind already has its word
|
||||
in the glossary and the contract (principles 7 and 8). How it is checked: unit (indexer), a manifest whose
|
||||
`contributes` names `route` gives an entry whose `contributes` and `requires` both name it; unit (assignment
|
||||
graph), that entry gets a `provisioning` and a `contribution` edge to the route's provider, and an entry with no
|
||||
`contributes` gets none of kind `contribution`.
|
||||
|
||||
## The ask of a held revert
|
||||
|
||||
- §710 **The assigner asks the operator about a held revert as it asks about a failed backup.** (ADR 0539 §16;
|
||||
ADR 0259 §3, §4; ADR 0564 §2; §297, §300, §363, §461, §541, §700, §706) This completes §300. When a node's have
|
||||
says the phase `held` for a revert, with the reason `restore point missing` (§300, a missing point or no
|
||||
`restored`) or `restore point damaged` (§567), the assigner:
|
||||
- **Asks**, through mesh-sdk's `operatorchannelclient` on the seat `operator-channel`, as its other asks are made,
|
||||
an ask of the new kind `revert`, kept in its state `asks` under `revert.<node>.<module>.<fingerprint hex>`, the
|
||||
fingerprint the reverted build's; like the backup ask it needs no proof of who answered, so the view may answer
|
||||
it. Its headline: "The revert of <module> on <node> has no restore point". Its explanation names the reverted
|
||||
fingerprint, the kept data, its form and the node's reason in its own words, and says "<module> keeps running
|
||||
its newer build until you answer. Started on the live data, the older build reads data written in the newer
|
||||
form." Two options, each of level acknowledge: `hold`, "Keep it held", does "the node keeps running the newer
|
||||
build, and the revert waits"; `live`, "Start it on the live data", does "the node starts the older build on the
|
||||
live data as it is, with nothing restored". It expires after the assigner's `AskLasts`, `OnExpiry` "the module
|
||||
keeps running its newer build". The answer is read from the router's record of the ask (§700).
|
||||
- **Raises the condition**, through mesh-sdk's finding writer (§461), with the finding `revert-held` (scope
|
||||
`delivery`, id `<node>.<module>`), so the condition keeper's key is `delivery.<node>.<module>.revert-held`;
|
||||
severity `warning`; its summary "The revert of <module> on <node> is held: <reason> (<kept data>, form <form>);
|
||||
the ask about it waits for your answer"; its `needs` "Nothing for you to do.", so the operator's one message is
|
||||
the ask (§706).
|
||||
- **On the answer**: `live` writes the node's want again with the want's new field `revert` `live` and `words`
|
||||
"the operator answered \"live\" to the revert ask (asking <n>)", as the backup's answer is written; the node
|
||||
agent, reading `revert` `live` from its own want and from nothing else, starts the reverted build with no
|
||||
`restore` and no aside taken, calls no catch-up tool, and applies as any want. `hold` writes nothing: the hold
|
||||
stands. The finding is cleared once the reverted build runs, or when a newer want of that module on that node
|
||||
replaces the held one, which also drops the ask (§363). An ask that ends unanswered is raised again at once
|
||||
while the hold stands; one answered `hold` is not asked again.
|
||||
- **Its tools**: `assigner_read_asks` reads the ask and `assigner_read_findings` the finding, both existing;
|
||||
`assigner_ask_again` raises it again by hand.
|
||||
|
||||
Why: ADR 0539 §16 has the assigner ask, raise the condition and write the want again naming the answer for a hold
|
||||
before an apply, and the backup ask is that shape already built (principle 7); the finding writer is the one way
|
||||
G's parts raise a condition (§383); the ask alone reaches the operator, as O-9 had it for §706 (principle 3, the
|
||||
hold is still loud in the condition). How it is checked: whole (assigner, a fixture node agent saying `held` with
|
||||
`restore point missing`): the ask under `revert.<node>.<module>.<hex>` with both options and the finding raised;
|
||||
`hold` writes no want and the newer build keeps running; `live` writes the want with `revert` `live` and its
|
||||
words, and the finding clears once the have names the reverted build; a newer want drops the ask and clears the
|
||||
finding; an unanswered ask raised again. Unit (node-engine): a want with `revert` `live` starts the reverted build
|
||||
with no `restore` call; unit (`meshwantsclient`): a `revert` other than `live` is refused.
|
||||
@@ -3,7 +3,7 @@ layer: to-be
|
||||
status: in-progress
|
||||
design: 47
|
||||
milestone: G
|
||||
updated: 2026-11-11
|
||||
updated: 2026-11-12
|
||||
decisions:
|
||||
- "ADR 0500"
|
||||
- "ADR 0673"
|
||||
@@ -72,6 +72,10 @@ decisions:
|
||||
- "ADR 0259"
|
||||
- "ADR 0235"
|
||||
- "ADR 0233"
|
||||
- "ADR 0330"
|
||||
- "ADR 0126"
|
||||
- "ADR 0112"
|
||||
- "ADR 0084"
|
||||
---
|
||||
# 47, milestone G — every line milestone G builds
|
||||
|
||||
@@ -82,7 +86,7 @@ file on 2026-11-10, and is cited as "design 47 G §n". A sentence that holds a d
|
||||
stayed in the main file, and G builds what it says from G's delivery. A section named in italics is in this part, or,
|
||||
when it is not here, in the main file.
|
||||
|
||||
The part is eighteen files, each read whole, its design lines numbered across them:
|
||||
The part is twenty-one files, each read whole, its design lines numbered across them:
|
||||
|
||||
- [G-1-pipelines-registration-and-steps](G-1-pipelines-registration-and-steps.md): pipelines per module: registration, watched branches, steps and policy, what holds a delivery, approval, groups, dependencies, a publish.
|
||||
- [G-2-pipelines-sizes-checks-and-tools](G-2-pipelines-sizes-checks-and-tools.md): pipelines per module: any size, the pipeline makes the check, who may say what, health, recovery, tools, kept data, how G itself is delivered, the choices under ADR 0666 and ADR 0667.
|
||||
@@ -104,6 +108,7 @@ The part is eighteen files, each read whole, its design lines numbered across th
|
||||
- [G-18-fix-round-six-seven](G-18-fix-round-six-seven.md): the fix round of §587 to §676: the approval mark once no verb names its callers, the keeper's snapshots, the recovery module's verbs, the node-engine's kept entries, the gate before a marked verb's running, develop's D-16 to D-49, and a delivery's wait on another machine's network (§677 to §705).
|
||||
- [G-19-outside-wait-and-refusals](G-19-outside-wait-and-refusals.md): a delivery's wait on an outside cause, written whole once (§706, in place of §705), and the finding writer's own refusals in every bundle (§707, amending §580).
|
||||
- [G-20-lead-answers](G-20-lead-answers.md): the lead's one-line answers to develop's questions, each tested against the principles (A-1 on).
|
||||
- [G-21-provider-and-revert-ask](G-21-provider-and-revert-ask.md): the provider a requirement points to, the named seat and the contribution edge (§708, §709, completing §357), and the assigner's ask of a held revert (§710, completing §300).
|
||||
- [G-22-lead-answers-2](G-22-lead-answers-2.md): the lead's answers continued, from A-182.
|
||||
|
||||
Design 34's milestone [every-event](../34-milestones/every-event.md) and design 46's milestone [7-approval-mark](../46-milestones/7-approval-mark.md) ship in milestone G's release, built in its repositories beside G's lines (lead-47, 2026-11-11 15:30 CET); where one of their lines and a line of G differ, G's later line holds and the other is corrected in place (§624 to §626).
|
||||
|
||||
Reference in New Issue
Block a user