Issue 1806 (build modules ran with no CPU limit; shanks reached 1650%). ADR 0553 (accepted, operator) and ADR 0554 (accepted). Change A, group fix/build-cpu-yields with mesh-host and mesh-catalog. Change B (the composer, fix/build-cpu-yields-compose) merges only after A's mesh-host runs on every node (ADR 0553 §5).
buildcpu: the share, quota, threads per step (share ÷ the module's own capacity), the words, and reading what the cgroup holds. No share word → no thread limit.
buildstep.NodeLimits reads those words.
Seat.Yields on node-build-go/node/image (Decision names ADR 0553); no composer change in A, so A changes no composed bytes.
Tests: buildcpu_test.go, TestNodeLimits. Suites and vet clean. Try try-1793022717406822322 passed.
Issue 1806 (build modules ran with no CPU limit; shanks reached 1650%). ADR 0553 (accepted, operator) and ADR 0554 (accepted). Change A, group fix/build-cpu-yields with mesh-host and mesh-catalog. Change B (the composer, fix/build-cpu-yields-compose) merges only after A's mesh-host runs on every node (ADR 0553 §5).
- `declaration.Process.Yields` (decoder type), `YieldSlice = "meshyield.slice"`.
- `buildcpu`: the share, quota, threads per step (share ÷ the module's own capacity), the words, and reading what the cgroup holds. No share word → no thread limit.
- `buildstep.NodeLimits` reads those words.
- `Seat.Yields` on node-build-go/node/image (Decision names ADR 0553); no composer change in A, so A changes no composed bytes.
Tests: buildcpu_test.go, TestNodeLimits. Suites and vet clean. Try try-1793022717406822322 passed.
Reviewed-by: review-buildcpu@shanks at 17b7cc480d6d772572e0b7d7b81b6e832a6b3c59
The operator's desktop slows while it builds: the Go build runtime took 1650% of
shanks' 24 processors with nothing holding it back. A build seat's holder now
runs its runtime at idle priority under its node's cpu-cap share (declaration
Yields, composed from Seat.Yields and the module's cpu-cap setting), and
buildcpu/buildstep give each step its part of that cap in threads.
Review round 1: the decoder type ships before any composer can emit it, so a
routine SDK bump never sends yields to an engine that refuses them; the
composer half moves to a later change. Every yielding process of a node goes
into one top-level slice, meshyield.slice, so the three build modules share one
quota instead of taking one each; the share is one node value, node-tools'
build-cpu-share, and each step's threads divide it by every build slot of the
node (words from the composer, a conservative fallback without them).
Review round 2: change A must not slow builds before any slice exists, so a
module given no share sets no GOMAXPROCS. The slice's quota bounds the total;
threads only size one step, from the node's share over the module's own
capacity (shanks: 24 x 50% / 3 = 4). The share is the node-engine's own config.
Deliverynovox/mesh-sdk@17b7cc480d6d — merged since 2026-10-26T14:22:49Z
Source — source.main moved to novox/mesh-sdk@75be8acbad. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
2026-10-26 14:22 (new) → proposed (announced): novox/mesh-sdk#94's head announced
2026-10-26 14:22 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail; or the check gates no merge (check-gates-merge false)
2026-10-26 14:22 ready → merged (merged): on the trunk its modules follow: merged there
The commit's note under refs/notes/mesh-plan keeps every transition of this change up to its merge: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-sdk@17b7cc480d6d` — **merged** since 2026-10-26T14:22:49Z
**Source** — source.main moved to novox/mesh-sdk@75be8acbad4d. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Group** `fix/build-cpu-yields`: novox/mesh-catalog@2aecbe80553c, novox/mesh-host@a78239b2aa05, novox/mesh-sdk@17b7cc480d6d
**Transitions**
- 2026-10-26 14:22 (new) → proposed (announced): novox/mesh-sdk#94's head announced
- 2026-10-26 14:22 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail; or the check gates no merge (check-gates-merge false)
- 2026-10-26 14:22 ready → merged (merged): on the trunk its modules follow: merged there
The commit's note under `refs/notes/mesh-plan` keeps every transition of this change up to its merge: `git log --notes=mesh-plan`.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Issue 1806 (build modules ran with no CPU limit; shanks reached 1650%). ADR 0553 (accepted, operator) and ADR 0554 (accepted). Change A, group fix/build-cpu-yields with mesh-host and mesh-catalog. Change B (the composer, fix/build-cpu-yields-compose) merges only after A's mesh-host runs on every node (ADR 0553 §5).
declaration.Process.Yields(decoder type),YieldSlice = "meshyield.slice".buildcpu: the share, quota, threads per step (share ÷ the module's own capacity), the words, and reading what the cgroup holds. No share word → no thread limit.buildstep.NodeLimitsreads those words.Seat.Yieldson node-build-go/node/image (Decision names ADR 0553); no composer change in A, so A changes no composed bytes.Tests: buildcpu_test.go, TestNodeLimits. Suites and vet clean. Try try-1793022717406822322 passed.
Reviewed-by: review-buildcpu@shanks at
17b7cc480dDelivery
novox/mesh-sdk@17b7cc480d6d— merged since 2026-10-26T14:22:49ZSource — source.main moved to novox/mesh-sdk@75be8acbad. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.main, the wants and the haves.Group
fix/build-cpu-yields: novox/mesh-catalog@2aecbe8055, novox/mesh-host@a78239b2aa, novox/mesh-sdk@17b7cc480dTransitions
The commit's note under
refs/notes/mesh-plankeeps every transition of this change up to its merge:git log --notes=mesh-plan.mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.