Repository navigation
Slice 042: rules your decisions imply, never a hint beside a pending one - #98
Merged
Merged
Conversation
… one The connectome research report's A1 and A4, reshaped by the evidence rather than implemented as written. The report puts a learned recommendation at the arbitration point, beside the decision the owner is about to make. Anchoring says a recommendation shown before a person forms their own view moves the decision, and this project's permission model rests on that decision being the owner's own; automation bias says suggestions get accepted without scrutiny; approval fatigue says the cause is volume, so the intervention that helps reduces volume rather than annotating it. So the learned signal proposes a rule, reviewed in a calm moment, and reports divergence after the fact. Both are decisions about the population of future asks rather than nudges on a pending one. A rule is proposed only when every past decision agreed. Nine allows and one deny proposes nothing, because that rule would permit the case the owner refused; it becomes a divergence instead. Unanimity makes that true by construction rather than by arithmetic. Two layers enforce the placement. Trinity.Permissions.Learner is not exported from its boundary, so a direct reference does not compile and the compiler enforces it rather than a reviewer. Permissions.proposals/1 is the only way in, and a census covers that, with a planted violation that annotates a pending approval through the facade and must be found. Not behind a flag: a setting that could put a recommendation back on the card would be the harm with a delay. Accepting writes an ordinary rule through the ordinary path and receipts it in a new policy chain scope with the count it rested on. Rule writes were not receipted at all before this. Its own scope because a rule outlives the session that prompted it, and the count because without it a reader cannot tell a rule the owner typed from one they accepted. Carried with it: CVE-2026-92106 in lazy_html, published today, fixed by taking 0.1.13; and a correction to slice 120, where I read a dangling-path report as two missing files and rewrote references to say so. Both files exist under process/; the paths were wrong and the check's regex was reporting a fragment. It is anchored now. mix gate: 816 passed (14 properties, 802 tests), 18 excluded. 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.
Trinity notices when you have answered the same question the same way enough times, and offers to write the rule so it stops asking. In its own section, read in a calm moment, and never beside a request you are about to decide.
That placement is the whole design
The connectome research report proposed showing a learned recommendation at the arbitration point. Three findings say that is the one place it must not go:
So the learned signal is spent on asking less often.
A rule is unanimous or it is not a rule
Nine allows and one refusal proposes nothing — that rule would permit the case you refused. It becomes a divergence to look at instead. Unanimity makes AC3 true by construction rather than by arithmetic.
Two layers hold the placement
Trinity.Permissions.Learneris not exported from its boundary, so a direct reference does not compile. The compiler enforces it, not a reviewer — and that is what the planted violation ran into first.Permissions.proposals/1is the only way in, and a census covers it. Mutation-tested: aleaked_hint/1planted inapproval_components.exfails the census by name and goes green when removed.Not behind a flag. A setting that could put a recommendation back on the approval card would be the same harm with a delay.
Accepting is receipted, and rule writes never were
Store.insert_rule/1inserted and nothing recorded it. An accepted proposal now writes to a newpolicychain scope with the count it rested on — its own scope because a rule outlives the session that prompted it, and the count because without it a reader cannot tell a rule you typed from one you accepted.Carried with this slice
lazy_html, published today: SVG/MathML script text serialised unescaped. Transitive test dependency, fixed by taking 0.1.13. Slice 120's licence check then caught the stale published list.process/; the paths were wrong and the check's regex was reporting a fragment out of the middle of a longer path. It is anchored now, and the references point where the files are.Screenshot in the slice record:
fs_readat 14 decisions andsession_searchat 8 offered as rules;fs_writeat 9 allowed / 1 denied reported as a disagreement and deliberately not offered.🤖 Generated with Claude Code