Answer IX5 to IX7 in design 47 G: the validation's run, its pending wait, and every branch's merges and groups
A-213 sent the validation before take-in and the per-branch take-in to design lines: the indexer needs the run's job and verdict, what holds a revision while the run is out, and how a branch other than the trunk gets its merges and its groups, none of which a line said. Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
This commit is contained in:
@@ -7,6 +7,8 @@ updated: 2026-11-12
|
||||
decisions:
|
||||
- "ADR 0666"
|
||||
- "ADR 0656"
|
||||
- "ADR 0633"
|
||||
- "ADR 0579"
|
||||
- "ADR 0571"
|
||||
- "ADR 0564"
|
||||
- "ADR 0539"
|
||||
@@ -17,7 +19,7 @@ decisions:
|
||||
- "ADR 0084"
|
||||
---
|
||||
|
||||
# 47, milestone G: the provider a requirement points to, and the ask of a held revert
|
||||
# 47, milestone G: the provider a requirement points to, the ask of a held revert, the edge an acting rule gives, and the take-in of every watched branch
|
||||
|
||||
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".
|
||||
@@ -27,7 +29,10 @@ answer A-167 ([G-20](G-20-lead-answers.md)) sent to a design line: which field n
|
||||
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). §711 answers the indexer's develop question on build-map row IX8
|
||||
(2026-11-12), which the lead's answer A-212 (G-22, the lead's second answers file) sent to a design line: which acting steps
|
||||
give an edge of kind 5 (§47), between which entries, and what a catalog entry's `acts` holds. Each is the design's
|
||||
give an edge of kind 5 (§47), between which entries, and what a catalog entry's `acts` holds. §712 to §715 answer
|
||||
the indexer's develop questions on rows IX5 to IX7 (2026-11-12), which A-213 sent to design lines: the validation's
|
||||
run before take-in, what holds a pending revision while it runs, and how a watched branch other than the trunk gets
|
||||
its merges, its pending revision and its groups. 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
|
||||
@@ -156,3 +161,92 @@ choice within the record it cites, tested against [the principles](../../../00-M
|
||||
`grant` on `every` gives kind 5 to every other entry but none to itself nor to the build module and package it is
|
||||
built from; a rule `compose` on `kind:image` gives edges only to entries with an image artifact; a rule `build`
|
||||
gives no kind 5; an entry with no rule has no `acts`.
|
||||
|
||||
## The validation before take-in, and the take-in of every watched branch
|
||||
|
||||
- §712 **The validation is one `run` of the indexer's manifest validator over two cases, refusing only what the revision causes.**
|
||||
(ADR 0666 §5, §6; ADR 0579 §2; ADR 0578 §2; §16, §206, §338, §354, §467, §481, §493, A-213) This completes §16's ask.
|
||||
For a pending revision of watched branch B (§713), the running indexer asks the seat `node-build-go` the accepted
|
||||
kind `run`, on `mesh.seat.node-build-go.accept.run.indexer` (§481; its callers §338), its step key
|
||||
`indexer.<node>.<id>` (§467), `<id>` `validate-<s>-<n>`, `<s>` the stream sequence of the newest merge the revision
|
||||
covers and `<n>` the count of asks for it, from 1. Its job:
|
||||
- **`program`**: the indexer's own program `cmd/mesh-judge`, under the Go module the `package` of the indexer
|
||||
entry's Go artifact names, at that entry's `path`, built at the revision's head of that entry's `repository`;
|
||||
the indexer entry is the entry of B's revision being validated that claims the seat `mesh-catalog`, else, when
|
||||
B watches no indexer, the trunk's current revision's. No repository or module name is fixed in code (ADR 0666
|
||||
§5); the program's own directory is the indexer's own code.
|
||||
- **`heads`**: none, since the manifest validator reads only its request; **`args`**: none; **`reader`** "manifest validator of
|
||||
<B> at <s>".
|
||||
- **`input`**: the manifest validator's request, served by the seat `mesh-catalog`'s verb `input` and kept in `inputs` as §354
|
||||
has it, any size (ADR 0666 §16): case `change`, every module of B's current revision by its entry's manifest,
|
||||
each one the pending merges carry replaced by the merged message's manifest bytes, one added for a new
|
||||
directory; case `trunk`, every module of B's current revision as it stands (the name is the validator's, not the
|
||||
branch); `seats` the definitions the merges' trees carry (the main file, *Validated with the seat definitions
|
||||
its merges carry*); `packages` and `predefined` as the take-in's own manifest validator has them; no `machines`.
|
||||
- **Its verdict.** The revision is refused when the case `change` refuses a manifest the revision adds or changes
|
||||
(its digest differs from the `trunk` case's) with a problem the `trunk` case lacks, or names a problem `(between
|
||||
manifests)` the `trunk` case lacks (ADR 0579 §2). A problem only in unchanged manifests refuses nothing; their
|
||||
entries keep their verdicts (ADR 0579 §1). A refusal sets the pending value's `refused` to each manifest and its
|
||||
problems, said in `take-in.pending` (§493).
|
||||
|
||||
Why: the manifest validator already answers two cases for exactly this rule, as the checker ran it, and the build seat's `run`
|
||||
is the one way a program built from heads runs (principle 7; ADR 0666 §6). How it is checked: whole (indexer, a
|
||||
fixture Go build module): a revision whose changed manifest gains a problem stays pending, `refused` naming it; a
|
||||
revision whose unchanged manifest has one is taken in; the job names the indexer entry's repository, path and the
|
||||
revision's head, and no heads.
|
||||
|
||||
- §713 **A pending revision names its ask, and resumes on the ask's end; a run that could not validate is no
|
||||
refusal.** (ADR 0666 §6, §18, §24; ADR 0633 §5; §16, §18, §19, §24, §269, §483, A-213; the main file *A wait is
|
||||
bounded, said and recoverable*) This completes §16's wait, and amends the main file's *A revision that names another
|
||||
indexer moves only that indexer* in that every revision now waits there for its validation. Every merge of a watched branch is first written to
|
||||
`pending` as the main file has it (key `m.<sequence>`, or a group's key, §715), its value gaining `validation`:
|
||||
`ask` (the `run` ask's id), `asked` (when) and `input` (its digest). The indexer puts the ask, acknowledges the
|
||||
merged message, and the take-in ends there. It hears the end through a durable consumer of its own of the seat
|
||||
`node-build-go`'s event `step-ended` (§24), taking only ends whose step key starts with `indexer.`, and reads the
|
||||
answer from that step key; at its start it reads each pending value's `validation` and its step key, so an end said
|
||||
while it was down is not lost. An end whose ask is not the one the pending value names now is dropped, written in
|
||||
its journal. A later merge of B while an ask is out joins the pending revision (the main file) and is asked anew
|
||||
with the next `<n>`. On the end:
|
||||
- **accepted**: the revision is taken in as the main file has it, by the indexer it names (§16), and its keys go;
|
||||
- **refused**: it stays pending with `refused` (§712), asked again only as part of a later merge of B, as a
|
||||
revert is (§19);
|
||||
- **could not validate**: the step ended `could not run`, the program exited other than 0, or its answer holds not
|
||||
both cases: it stays pending with `validation`'s new field `failed`, the build seat's words, said in
|
||||
`take-in.pending`, never as a refusal and never as passed (ADR 0666 §18; principle 3). It is asked again by a
|
||||
later merge of B and by the indexer's new tool `indexer_validate_again` (key; class `act`, §391's default callers,
|
||||
written in the hand-act log), which also reads the ask's state.
|
||||
|
||||
An ask no build node takes waits on the work queue, said by `build-capacity-waits` after 60 minutes (§483); every
|
||||
case is timed by `take-in-waits` at 60 minutes (§19). `indexer_pending` shows `validation` whole. Why: a take-in that
|
||||
holds no call open survives a restart from its own state, and only an answer the manifest validator gave refuses (principles 1,
|
||||
3 and 4). How it is checked: whole (indexer): a restart while the ask is out takes the revision in on the end; a
|
||||
`could not run` end leaves it pending with `failed` and `indexer_validate_again` asks `<n>`+1; an end of a replaced
|
||||
ask is dropped.
|
||||
|
||||
- §714 **Every watched branch's merges come on the forge bridge's stream, each naming its branch.** (ADR 0666 §6,
|
||||
§11; §11, §13, §18, §493, A-90, A-93, A-208) This completes A-208's per-branch take-in. The forge bridge publishes
|
||||
the merged message of every landed commit of every watched branch the registrations name, heard on `branch-moved`
|
||||
and read by the seat `git`'s verb `branch` as §11 has it, the trunk's included, since from G no merge is the gate's
|
||||
(ADR 0666 §11). The merged message (`forgemsg.Forge`) gains `base`, the watched branch it landed on; the forge
|
||||
bridge's filters to the trunk alone (its merged message and its forge-made merge) go. The indexer's `pending` keeps
|
||||
its key `m.<sequence>`, the stream's sequence being one across branches, and its value names `base`; a merge waits
|
||||
only behind a pending value of its own `base` (§18), and is taken in by A-93's take-in of that branch. A value
|
||||
written before G names no `base` and is the trunk's, the only branch the forge bridge published before G. The
|
||||
gate's `source-moved` takes nothing in. Why: one take-in for every branch, from the stream every merge already
|
||||
comes on, and no second source of the same merges (principles 1 and 7). How it is checked: whole (forge bridge,
|
||||
indexer): a merge on `beta` publishes a merged message with `base` `beta`, pending behind a pending `beta` revision
|
||||
while a `main` merge is taken in.
|
||||
|
||||
- §715 **A group gathers per watched branch, and its end names that branch.** (ADR 0666 §13; ADR 0633 §5; §42 to
|
||||
§46, §293, §714, A-208) This completes §43 and §44 for a branch other than the trunk. A group's members on watched
|
||||
branch B are those whose `base` in the seat `mesh-delivery`'s verb `groups` is B (its `Member` carries `base`). The
|
||||
forge bridge sets the group on each landed member's merged message of any watched branch, and publishes
|
||||
`forge.group.merged` (`forgemsg.ForgeGroupEnd`, gaining `base`) once `groups` says every member with that `base`
|
||||
has landed, once per `base`. The indexer gathers the members in `pending` under `g.<group>.<base>`, each part
|
||||
escaped as a key name, and takes them in as one source revision of B on that end, after §712's validation; a key
|
||||
`g.<group>` written before G is the trunk's. `indexer_pending`, `indexer_take_in_pending`, `indexer_drop_pending` and
|
||||
`bridge_group_end_again` take the `base`; a group that never ends on B is said at 30 minutes (§45). Why: a group
|
||||
is delivered on the branch its members land on, read from the one verb that knows its members (principles 1
|
||||
and 7). How it is checked: whole (forge bridge, indexer): two members landing on `beta` give one `forge.group.merged`
|
||||
with `base` `beta` and one `beta` source revision; a group whose `beta` member never lands raises `take-in-waits`
|
||||
at 30 minutes.
|
||||
|
||||
@@ -108,6 +108,6 @@ The part is twenty-one files, each read whole, its design lines numbered across
|
||||
- [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), and the edge an acting rule gives (§711, completing §47's kind 5).
|
||||
- [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), the edge an acting rule gives (§711, completing §47's kind 5), the validation before take-in (§712, §713, completing §16) and the take-in and groups of every watched branch (§714, §715).
|
||||
|
||||
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