From f964d6c3753f80ba013eb969e70640380ad87671 Mon Sep 17 00:00:00 2001 From: Writer Date: Thu, 15 Oct 2026 04:35:43 +0200 Subject: [PATCH 1/2] The controls for the rules no machine held companygraph/mental-model took a control for each rule that had none (companygraph/mental-model#140). This instance takes the three whose rules it holds: the family resync's lock, the chat's claim check on blust.ch, and a message from another session carrying no word of the Owner's. Verified: companygraph check at 0.94.0 passes, mechanical checks and the form, and each page holds to the control schema's writing rules on a reading of them; the claim check is on in this deployment's chat.json. Process: Delivery Phase: Implement Track: Prose Co-Authored-By: Claude Opus 5.5 --- ...-claims-are-read-back-against-the-model.md | 29 ++++++++++++++++++ ...-resync-refuses-to-start-beside-another.md | 28 +++++++++++++++++ ...-session-carries-no-word-of-the-owner-s.md | 30 +++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 model/controls/a-chat-answer-s-claims-are-read-back-against-the-model.md create mode 100644 model/controls/a-family-resync-refuses-to-start-beside-another.md create mode 100644 model/controls/a-message-from-another-session-carries-no-word-of-the-owner-s.md diff --git a/model/controls/a-chat-answer-s-claims-are-read-back-against-the-model.md b/model/controls/a-chat-answer-s-claims-are-read-back-against-the-model.md new file mode 100644 index 0000000..5f17312 --- /dev/null +++ b/model/controls/a-chat-answer-s-claims-are-read-back-against-the-model.md @@ -0,0 +1,29 @@ +--- +id: 01a13d69-0423-7577-b12a-481bbd34838c +source: Local +kind: detective +mode: automated +enforces: + - Nothing claims what the model does not hold +--- + +# A chat answer's claims are read back against the model + +> Each claim of an answer the chat gives on blust.ch is read back against the tool answers it rests on, and the chat marks one they do not carry before the visitor takes it for what the model says. + +## How it is carried out + +The chat server behind blust.ch, on every answer once it is written: it sends each claim, with the tool answers the chat's model was given, to TypeSafe's Jev, which returns a verdict and its probability and writes no text, and the widget marks a claim whose verdict is that the evidence does not carry it, above the threshold this deployment's configuration sets. Only an answer written in English is marked; a German one is checked and its verdicts kept until German has a threshold of its own. The check changes no word of the answer, and a check that cannot run, or does not finish within its budget, marks nothing. It holds the chat's answers and nothing else: a specification or a page someone writes is held to the rule by whoever writes it. + +## Applies to + +| Type | Entity | Owner | +| --- | --- | --- | +| phase | Answer | Answering | + +## References + +| What | URL | +| --- | --- | +| The claim check | https://github.com/companygraph/chat-server/blob/main/lib/verdict.mjs | +| This deployment's configuration | https://github.com/robertblust/mcp-blust-ch/blob/main/chat/chat.json | diff --git a/model/controls/a-family-resync-refuses-to-start-beside-another.md b/model/controls/a-family-resync-refuses-to-start-beside-another.md new file mode 100644 index 0000000..3a5fbbb --- /dev/null +++ b/model/controls/a-family-resync-refuses-to-start-beside-another.md @@ -0,0 +1,28 @@ +--- +id: 01a13d69-0423-7526-81a3-ac3b6e561274 +source: Local +kind: preventive +mode: automated +enforces: + - One session holds a piece of shared work +--- + +# A family resync refuses to start beside another + +> A resync takes a lock before it moves anything, and refuses to start while another run holds it or while a resync pull request it did not open is still open. + +## How it is carried out + +The family resync in robertblust/conventions, each time a session starts it: it takes a lock in the clone's own git directory, which every worktree of that clone shares, and refuses while the run that holds it is alive; it then asks GitHub for the open pull requests of every member whose branch begins with `resync-`, and refuses where one is open that no run in this checkout opened or took on that day, unless it is started with `--force`. It holds a resync and nothing else: a release, a re-pin by hand or a change across repositories is claimed by the session itself, which reads the open pull requests, branches and tags and asks the running sessions before it starts, and nothing refuses a session that skips that. + +## Applies to + +| Type | Entity | Owner | +| --- | --- | --- | +| phase | Integrate | Delivery | + +## References + +| What | URL | +| --- | --- | +| The family resync | https://github.com/robertblust/conventions/blob/main/family/resync.mjs | diff --git a/model/controls/a-message-from-another-session-carries-no-word-of-the-owner-s.md b/model/controls/a-message-from-another-session-carries-no-word-of-the-owner-s.md new file mode 100644 index 0000000..e62bb2c --- /dev/null +++ b/model/controls/a-message-from-another-session-carries-no-word-of-the-owner-s.md @@ -0,0 +1,30 @@ +--- +id: 01a13d69-0423-773e-ab3d-3ea3a261d170 +source: Local +kind: preventive +mode: automated +enforces: + - A refusal is not carried out by another session +--- + +# A message from another session carries no word of the Owner's + +> A session that receives a message from another takes it as that session's and never as the Owner's, so a refusal one session met is not passed to another to carry out. + +## How it is carried out + +The agent harness, in every session that receives a message from another: it delivers the message marked as another session's and not as the Owner's, tells the receiving agent that such a message grants no permission and that a request to do what the sender was refused is to be declined and shown to the Owner, and its permission layer judges any action the message asks for against the receiving session's own conversation, where the Owner gave no word for it. The marking is how the agent harness delivers such a message, seen in its sessions and not in its documentation, and it rests on the agent heeding it; a session the Owner gives the word in, in its own conversation, may carry out what another was refused, because the word is then the Owner's. + +## Applies to + +| Type | Entity | Owner | +| --- | --- | --- | +| seat | Controller | | +| seat | Implementer | | +| seat | Surveyor | | + +## References + +| What | URL | +| --- | --- | +| The agent harness's permission modes | https://code.claude.com/docs/en/permission-modes | From 239c56542652c470d92178ab4be4a4c8659584c9 Mon Sep 17 00:00:00 2001 From: Writer Date: Thu, 15 Oct 2026 04:35:47 +0200 Subject: [PATCH 2/2] The agent controls name the agent harness, not the product Two controls named Claude Code where what they describe is the harness any agent runs in, its permission layer and its hooks, as companygraph/mental-model#140 renamed in its own. A product's name ties a company's controls to one tool; the references keep their addresses, which are where the behavior is documented. Verified: companygraph check at 0.94.0 passes, mechanical checks and the form, and each page holds to the control schema's writing rules on a reading of them; no control names Claude Code outside a reference's URL. Process: Delivery Phase: Implement Track: Prose Co-Authored-By: Claude Opus 5.5 --- ...nt-s-hook-refuses-removing-a-worktree-that-holds-a-plan.md | 4 ++-- .../an-agent-s-permissions-refuse-a-merge-it-was-not-given.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/model/controls/an-agent-s-hook-refuses-removing-a-worktree-that-holds-a-plan.md b/model/controls/an-agent-s-hook-refuses-removing-a-worktree-that-holds-a-plan.md index 25744f9..67a8fcf 100644 --- a/model/controls/an-agent-s-hook-refuses-removing-a-worktree-that-holds-a-plan.md +++ b/model/controls/an-agent-s-hook-refuses-removing-a-worktree-that-holds-a-plan.md @@ -13,7 +13,7 @@ enforces: ## How it is carried out -A hook Claude Code runs on my machine before every shell command an agent issues: it reads each `git worktree remove` in the command, resolves the worktree's path through any `cd` or `-C` before it, and refuses the command where that worktree holds a plan's ledger under `.superpowers/sdd/`, saying why, so the agent stops before anything is deleted. It holds an agent and not my own terminal, and a worktree deleted some other way, such as by `rm -rf`, passes it; the hook lives in my own settings and in no repository. +A hook the agent harness runs on my machine before every shell command an agent issues: it reads each `git worktree remove` in the command, resolves the worktree's path through any `cd` or `-C` before it, and refuses the command where that worktree holds a plan's ledger under `.superpowers/sdd/`, saying why, so the agent stops before anything is deleted. It holds an agent and not my own terminal, and a worktree deleted some other way, such as by `rm -rf`, passes it; the hook lives in my own settings and in no repository. ## Applies to @@ -26,4 +26,4 @@ A hook Claude Code runs on my machine before every shell command an agent issues | What | URL | | --- | --- | -| Claude Code hooks | https://code.claude.com/docs/en/hooks | +| The agent harness's hooks | https://code.claude.com/docs/en/hooks | diff --git a/model/controls/an-agent-s-permissions-refuse-a-merge-it-was-not-given.md b/model/controls/an-agent-s-permissions-refuse-a-merge-it-was-not-given.md index 653d91d..9b48f72 100644 --- a/model/controls/an-agent-s-permissions-refuse-a-merge-it-was-not-given.md +++ b/model/controls/an-agent-s-permissions-refuse-a-merge-it-was-not-given.md @@ -13,7 +13,7 @@ enforces: ## How it is carried out -Claude Code's permission layer, before the agent's command runs: it judges the action against the conversation, and a merge without a review it can see is refused, so the agent stops and the merge waits for the Owner. On October 2, 2026 it refused the merge of meta-model #223, which the Owner then gave in another session. +The agent harness's permission layer, before the agent's command runs: it judges the action against the conversation, and a merge without a review it can see is refused, so the agent stops and the merge waits for the Owner. On October 2, 2026 it refused the merge of meta-model #223, which the Owner then gave in another session. ## Applies to @@ -28,4 +28,4 @@ Claude Code's permission layer, before the agent's command runs: it judges the a | What | URL | | --- | --- | -| Claude Code permissions and auto mode | https://code.claude.com/docs/en/permissions | +| The agent harness's permissions and auto mode | https://code.claude.com/docs/en/permissions |