docs(plans): lead decision 65 and the S2c brief, within-role messages cite decisions
Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
@@ -1108,3 +1108,30 @@ which stay with him. Each item names who decided it and what happened.
|
||||
- Indexing the events scan stays a follow-up. Neither the
|
||||
consumption check nor the existing raise lookup has an index, and
|
||||
at slice 1 volumes that doesn't matter.
|
||||
65. **A within-role message cites a decision; it doesn't spend one
|
||||
(2026-10-05).** Source: Dewey, `agents/dewey/work/wui/SLICE1-VIEWS.md`
|
||||
section 10, probe `~/dewey-scratch/s2b-probe.w9pJ/probe.mjs`, run
|
||||
against 38828a2c and 4afab552.
|
||||
- Decision 64 said within-role actions pass no decision. That is
|
||||
true for `authorize`, but not for `message.send`, which stores its
|
||||
`decision` argument in `messages.decision`. The trail and the
|
||||
inbox read that column as "this message is about this decision".
|
||||
Since S2b, a within-role send that names a decision runs the full
|
||||
check, so the PM's DECISION message to the human about a pending
|
||||
`role.launch` refuses with `decision-mismatch`. Fixture messages
|
||||
101 and 102 are that case.
|
||||
- Ruling: when `message.send` is within-role for the sender and
|
||||
target, `decision` is a citation. The broker checks that the
|
||||
decision exists in the business and stores it. The broker doesn't
|
||||
class-match it, doesn't consume it, and doesn't put it in the
|
||||
`action.allowed` event, so the citation can't consume the decision
|
||||
or count as using it up. When `message.send` isn't within-role,
|
||||
`decision` is the authority, as decision 64 says, and the stored
|
||||
column names that approval.
|
||||
- Not chosen: a separate citation argument, which needs schema v3c
|
||||
for a slice 1 gap that the class split already closes. Dewey's
|
||||
option 2 also wasn't taken in place of this. S4 still sends the
|
||||
Discord DM for a blocking gated decision and records the delivery
|
||||
(REQ-DEC-4), but agents keep citing decisions in messages.
|
||||
- Row 44 (S2c, Rocko, reviewed by Darkwing) carries the change and
|
||||
Darkwing's README wording note from S2b round 2.
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
# Slice 1 S2c: a within-role message cites a decision (2026-10-05)
|
||||
|
||||
Status: written by Sage, lead, under lead decision 65. It follows
|
||||
`docs/plans/BRIEF-TEMPLATE.md`, and it amends no section of the slice 1
|
||||
brief.
|
||||
|
||||
## S2c: a within-role message cites a decision without consuming it
|
||||
|
||||
### Problem
|
||||
|
||||
S2b (4afab552) sends every agent `message.send` through
|
||||
`#consumeAuthority`. A within-role send that names a decision now gets
|
||||
the full check, so it refuses with `decision-mismatch` unless the
|
||||
decision approved `message.send` itself, and a match spends the
|
||||
decision. Before S2b, the `decision` argument on a within-role send was
|
||||
a citation, stored in `messages.decision`. The trail (`messages WHERE
|
||||
decision = ?`) and the inbox read that column. Dewey's probe shows the
|
||||
PM's DECISION message to the human about an open `role.launch` decision
|
||||
is written at 38828a2c and refused at 4afab552.
|
||||
|
||||
### Owner and reviewer
|
||||
|
||||
- Owner: rocko.
|
||||
- Reviewer: darkwing.
|
||||
|
||||
### Files owned
|
||||
|
||||
- `packages/bus/src/broker.mjs`, the `message.send` case and, if
|
||||
needed, `#checkAuthority`.
|
||||
- `packages/bus/tests/single-use.test.mjs` or one new test file under
|
||||
`packages/bus/tests/`.
|
||||
- `packages/bus/README.md`, the `message.send` and single-use
|
||||
paragraphs.
|
||||
|
||||
### What ships
|
||||
|
||||
- If `message.send` is within-role for the sender and target, the
|
||||
`decision` argument is a citation. The broker checks that the decision
|
||||
exists in the business, stores it in `messages.decision`, and writes
|
||||
the `action.allowed` event without a `decision` field. It doesn't
|
||||
class-match or consume the decision.
|
||||
- If `message.send` isn't within-role, nothing changes from S2b. The
|
||||
decision is the authority, it must match, and the send consumes it.
|
||||
- An open, unresolved decision can be cited.
|
||||
- README: correct "Within-role actions without a decision remain
|
||||
unchanged", per Darkwing's S2b round 2 note. State that every agent
|
||||
send writes `action.allowed` and that a within-role send's decision is
|
||||
a citation.
|
||||
- Tests:
|
||||
- Dewey's case: the PM cites an open gated `role.launch` decision in a
|
||||
DECISION message to the human, and the send succeeds.
|
||||
- The cited decision can still be used afterward by the action it
|
||||
approves.
|
||||
- Two within-role sends can cite the same decision.
|
||||
- A missing decision refuses with `decision-not-found`.
|
||||
- Every S2b refusal for a send that isn't within-role still holds.
|
||||
- Add a mutant that puts the citation into the event and one that
|
||||
sends within-role citations through the authority check. The tests
|
||||
must kill both.
|
||||
- Suites: `packages/bus` with the glob form on Node 24 and 26, plus
|
||||
every `scripts/test-*.sh`.
|
||||
|
||||
### Out of scope
|
||||
|
||||
- No schema change and no separate citation argument (decision 65).
|
||||
- The Discord DM for blocking gated decisions and its delivery record.
|
||||
Those belong to S4.
|
||||
|
||||
### Gate
|
||||
|
||||
Darkwing approves on the row's issue. Sage runs the integration gate in
|
||||
a worktree before committing. This has to land before S4 writes
|
||||
decision messages through the broker.
|
||||
Reference in New Issue
Block a user