From f7abd0598191f63a9e8b9173dd69b1d752675259 Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 4 Nov 2026 01:48:12 +0100 Subject: [PATCH] A node composition that drops the provisioner client's account what runs names is said (issue 774) Applied, a node's own composition naming no account refuses every filled write and hands no module, which on ace went unsaid from 01:29 to 01:33 but for the refusals themselves. The pass now says it once, naming the account what runs names. A placed client keeps its account by the previous commit; this says the case that is left, a client no longer composed here. Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn --- internal/selfcompose/selfcompose.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/internal/selfcompose/selfcompose.go b/internal/selfcompose/selfcompose.go index a8f81a0..45a07f6 100644 --- a/internal/selfcompose/selfcompose.go +++ b/internal/selfcompose/selfcompose.go @@ -915,6 +915,13 @@ func (c *Composer) compose(ctx context.Context) []agent.Update { } c.paid() pass.Held = held + // The provisioner client's account the node runs with, dropped by this pass, is said: every filled write is refused + // under a declaration that names none (filling.JudgeAccount), and no module is handed to it (issue 774, ace, + // 2026-11-04 01:29). A placed client keeps its account while it is held (compose.Node.RunningProvisioner). + if was, now := ownProvisioner(running), ownProvisioner(mapValues(compositions)); was != "" && now == "" && nodeWanted { + c.sayOnceEach(fmt.Sprintf("the node's own composition names no provisioner client's account, where what runs names %s: "+ + "once applied, every filled write is refused and no module is handed to the provisioner", was)) + } // A module refused alone is held: it keeps what it runs, its have says why, and every other module is applied (issue // 1126: one module's refusal froze the whole node). done := c.waiting("the agent marking each held module's have") @@ -1699,3 +1706,21 @@ func (c *Composer) ComposedToday(ctx context.Context, module, fp string) (string } return "", false } + +// ownProvisioner is the provisioner client's account the node's own composition among cs names, or "". +func ownProvisioner(cs []delivery.Composed) string { + for _, c := range cs { + if c.Module == "" { + return c.Own.Provisioner + } + } + return "" +} + +func mapValues(m map[string]delivery.Composed) []delivery.Composed { + out := make([]delivery.Composed, 0, len(m)) + for _, k := range slices.Sorted(maps.Keys(m)) { + out = append(out, m[k]) + } + return out +}