Repository navigation
Slice 027: publish the effect catalogue, and make two censuses falsifiable - #86
Merged
Merged
Conversation
…fiable From the male CNS connectome research report, implemented where it fits: A2 (a small enumerable population carries all authority to act), A5 (the compass tracks state and does not command) and A8 (a closed, versioned, publicly checkable catalogue). The fit judgment for all nine motifs, including the two declined, is recorded privately. This slice changes nothing about what the tree permits. Two of its three claims were already true and neither was checked, which is the shape of the work: it makes existing claims falsifiable. docs/effects-catalog.md is generated from the configured core tools and their behaviour callbacks, one row each with the risk tier, the effect class, whether the name is in the closed external-effect catalogue, and whether the tool can escalate. Its version is a SHA-256 over its own rows, so two trees with the same effect surface carry the same version and nobody types a number. The check runs inside scripts/prod_check.sh, which the gate runs, and it is proven to fail: changing one cell of the committed artifact turns the release check red. The artifact is a claim about what ships, so --write and --check refuse outside MIX_ENV=prod. The first generated catalogue was built under test and named the test scaffolding beside fs_read, five entries longer than production. A gate running in test would have compared a test surface against a production one and failed forever, and the obvious way to make that pass would have been to commit the test surface as though it were the product. The effects census now carries a reason per allowed caller rather than a bare list of two paths, and a test refuses a reason too short to be one. A third caller should have something to argue against. A second census asserts that no module in permissions, effects or authority reads session state. The distinction it holds is the point: a session id is a scope key and narrows a grant, while what the session has been saying is state and would steer a decision. Every message is a place an injected instruction can sit, so a gate that reads conversation state is a gate an attacker can argue with, and the argument need not convince a person, only move one boolean. The planted reader justified itself immediately. The census's first regex excluded a dot before Sessions and so could not see the fully qualified call the plant makes; without the plant it would have reported the decision path clean while measuring nothing. Slice 020's census then caught this work: the new task's moduledoc named a test tool as an example, and nothing under lib/ may reference test scaffolding. The census is right and the example was not worth it. mix gate: 683 passed, 18 excluded; coverage 80.31%, unchanged. Signed-off-by: Ayla Croft <aylacroft@proton.me>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
From the male CNS connectome research report of 2026-09-13, implemented where it fits: A2 (a small enumerable population carries all authority to act), A5 (the compass tracks state and does not command) and A8 (a closed, versioned, publicly checkable catalogue).
This slice changes nothing about what the tree permits. Two of its three claims were already true and neither was checked. It makes existing claims falsifiable.
What it adds
docs/effects-catalog.md, generated from the configured core tools and their behaviour callbacks: one row per tool with the risk tier, the effect class, whether the name is in the closed external-effect catalogue, whether it can escalate, and the module. The version is a SHA-256 over its own rows, so two trees with the same effect surface carry the same version.mix trinity.effects.catalog --checkis step 3 ofscripts/prod_check.sh, which the gate runs. It is proven to fail, not assumed to: changing one cell of the committed artifact turns the release check red, and restoring it turns it green.--writeand--checkrefuse outsideMIX_ENV=prod. The first generated artifact was built under:testand named test scaffolding besidefs_read, five entries longer than production. A gate running in:testwould have compared a test surface against a production one and failed forever, and the obvious fix would have been to commit the test surface as though it were the product.The effects census carries a reason per allowed caller, not a bare list of two paths, and a test refuses a reason too short to be one.
A new census asserts no module in permissions, effects or authority reads session state. The distinction is the point: a session id is a scope key and narrows a grant; what the session has been saying is state and would steer a decision. Every message is a place an injected instruction can sit, so a gate that reads conversation state is one an attacker can argue with, and the argument need not convince a person, only move one boolean.
Two things the tree caught
The planted reader justified itself immediately: the census's first regex excluded a dot before
Sessionsand could not see the fully qualified call the plant makes. Without the plant it would have reported the decision path clean while measuring nothing.Slice 020's census then caught this work. The new task's moduledoc named a test tool as an example, and nothing under
lib/may reference test scaffolding. The census is right and the example was not worth it.Verification
🤖 Generated with Claude Code