claude-code: an agent proposes a shared instruction section, and every node takes it only on the operator's warrant (hq ADR 0274)
mesh/merge-gate fail: builds claude-code → ace, g14, novox, shanks; no bus step; a manifest the change touches fails the module check: claude-code uses the…
mesh/repo-check pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
mesh/delivery superseded: a newer head of the same pull request
mesh/merge-gate fail: builds claude-code → ace, g14, novox, shanks; no bus step; a manifest the change touches fails the module check: claude-code uses the…
mesh/repo-check pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
mesh/delivery superseded: a newer head of the same pull request
Shared instructions were the terminal's alone since hq issue 340, because the tool runner cannot tell an agent from the operator. The operator channel now proves who answered, so an agent may propose a section; each node proves the router's warrant against the exact text itself and keeps what it approved in its own file, so nothing written to the bus becomes active.
This commit is contained in:
@@ -433,6 +433,9 @@ type Config struct {
|
||||
// Terminal is the shared text the operator set at the controller's terminal, in this module's settings
|
||||
// (novox/hq issue 340): laid over what was registered for the mesh and the node, for every session here.
|
||||
Terminal []Item
|
||||
// Approved is the sections the operator approved through the operator channel (novox/hq ADR 0274), as this
|
||||
// node proved and keeps them, that reach this node.
|
||||
Approved []ApprovedSection
|
||||
}
|
||||
|
||||
// ConfigOf sorts the items that apply here by scope, each scope by kind and name.
|
||||
@@ -629,6 +632,15 @@ func InstructionSections(c Config) string {
|
||||
fmt.Fprintf(&b, "\n### %s\n\n%s\n", it.Name, strings.TrimSpace(it.Files[it.Name+".md"]))
|
||||
}
|
||||
}
|
||||
if len(c.Approved) > 0 {
|
||||
b.WriteString("\n## Instructions the operator approved\n\nProposed by an agent through the `claude-code` module and " +
|
||||
"approved by the operator on a channel that proves who answered (novox/hq ADR 0274). Changed or removed only the " +
|
||||
"same way: `claude_code_instructions_propose`.\n")
|
||||
for _, s := range c.Approved {
|
||||
fmt.Fprintf(&b, "\n### %s\n\n*Proposed from %s; approved %s.*\n\n%s\n", s.Name, s.From,
|
||||
s.Approved.UTC().Format("2006-01-02 15:04 UTC"), strings.TrimSpace(s.Text))
|
||||
}
|
||||
}
|
||||
return b.String()
|
||||
}
|
||||
|
||||
@@ -943,10 +955,21 @@ func SharedTextAtTheTerminal(kind string) string {
|
||||
return "a " + kind + " for every node or some reaches every session there as the mesh's own word, and this tool " +
|
||||
"cannot tell an agent from the operator. It is set at the controller's terminal only, under `" + key +
|
||||
"` in this module's settings, its text as a list of lines, on the control-node: mesh-cli settings set claude-code " +
|
||||
"'{\"" + key + "\": {\"<name>\": [\"line\", …]}}' [--node <node>] (novox/hq issue 340). The home scope, " +
|
||||
"'{\"" + key + "\": {\"<name>\": [\"line\", …]}}' [--node <node>] (novox/hq issue 340)." +
|
||||
proposeInstead(kind) + " The home scope, " +
|
||||
"one account's own directory, is still registered here. Nothing was registered"
|
||||
}
|
||||
|
||||
// proposeInstead is, for an instruction section, the way an agent may still bring one to every node: proposed for
|
||||
// the operator's approval (novox/hq ADR 0274).
|
||||
func proposeInstead(kind string) string {
|
||||
if kind != KindInstructions {
|
||||
return ""
|
||||
}
|
||||
return " An agent may instead propose it for the operator's approval with claude_code_instructions_propose: it " +
|
||||
"becomes active only when the operator approves it on a channel that proves who answered (novox/hq ADR 0274)."
|
||||
}
|
||||
|
||||
// Register puts an item (or, with unregister, removes it) at its scope: at the mesh scope one key, at the
|
||||
// node and home scopes one key per node — this node when none is given. Taken into this node's view at once,
|
||||
// so the answer says what it did here.
|
||||
|
||||
Reference in New Issue
Block a user