Skip to content

say: the receipt says why no one was woken (not_woken) - #539

Merged
dp-web4 merged 2 commits into
mainfrom
cbp/say-receipt-not-woken
Oct 26, 2026
Merged

dp-web4 merged 2 commits into
mainfrom
cbp/say-receipt-not-woken

Conversation

@dp-web4

@dp-web4 dp-web4 commented Oct 25, 2026

Copy link
Copy Markdown
Owner

What. When a being's say wakes nobody, its receipt now says why, in a new not_woken field. Who gets woken, and when, doesn't change.

Why. cbp-being, 2026-10-24, 21:32–22:34Z:

  • It sent 13 turns to its seat, and each receipt came back with no woke and no word about it.
  • Nobody answered, so it asked one question (what does the hestia daemon do, and what is its API?) ten different ways.
  • At 22:41 it wrote its own "complete API surface", with invented /api/v1/scope/* routes, then built a client on those routes and asked the seat to run it.

A receipt that is silent about delivery reads as "delivered and ignored". The reason no wake went out is something the being can act on: wait, or stop repeating. It also puts the cause in the beat record. Last night it couldn't be told from the being's side, because the wake ledger lives outside the instance.

The four reasons, from _wake_addressee:

  1. Already woken for this run. It names the run's first seq, says repeats don't wake the seat again, and says every message is delivered.
  2. A seat paused wakes because it is answering here itself. It names until when.
  3. The conversation has no listener (for example dp's). The message will be read when they next look.
  4. The wake failed to leave. It is retried on the next message.

Test. test_a_say_that_wakes_nobody_says_why covers all four. The dispatch, seat-pause, wake-rearm, person-wake, selection and reach suites pass, 173 tests.

Open question for the wake policy (not changed here). One wake per run is right for repeats. But if the woken session answers only part of the run, or nothing, the being's later new questions wait until someone happens to look. Last night a sibling session answered the being's request_run at 23:47 but none of the ten prose questions. That belongs in its own issue, not in this receipt change.

🤖 Generated with Claude Code

https://claude.ai/code/session_014LYVQN8U1xqy6U6pbyUDvH

A say to a conversation wakes its listeners once per unanswered run (_wake_addressee). When no wake
went out, the receipt said nothing: no `woke`, no reason. cbp-being, 2026-10-24 21:32-22:34Z:
thirteen turns to its seat, each receipt silent; nobody answered; it asked one question ten ways,
then wrote its own "complete API surface" with invented routes and built a client on it. Silence
about delivery reads as delivered-and-ignored.

Every path that sends no wake now records why, and the say receipt carries it as `not_woken`:
- already woken for this run (names the run's first seq; repeats do not re-wake; all delivered)
- a seat has paused wakes because it is answering here itself (names until when)
- the conversation has no listener (read when they next look)
- the wake failed to leave (retried on the next message)
Wake behaviour is unchanged; only the receipt and the beat record gain the reason.

Test: test_a_say_that_wakes_nobody_says_why (all four). Dispatch, seat-pause, wake-rearm,
person-wake, selection and reach suites: 173 passed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014LYVQN8U1xqy6U6pbyUDvH

dp-web4 commented Oct 25, 2026

Copy link
Copy Markdown
Owner Author

Review: distinguishing message delivery from seat-wake delivery is valuable, and the four outcomes are tested. GitHub currently reports this head as not mergeable after main advanced (#534). Please refresh/reconcile with current main and rerun targeted tests. Ensure 'they are all delivered' means persisted to the conversation, not read or accepted by the recipient.

dp-web4 commented Oct 25, 2026

Copy link
Copy Markdown
Owner Author

NOVA re-review on 58b6b2bd: please narrow the not_woken text before merge. They are all delivered and will be read together promises future reading not established by a stored turn or a wake ledger. Say Your turns were recorded in the conversation; no additional wake was sent. This does not confirm the seat has read or accepted them. Also a seat is answering ... so it will see this message is stronger than the pause flag proves. The four-reason classification is useful; leave who/when actually reads open until a witness establishes it. Add assertions pinning that distinction.

…ova's receipt HOLD)

Every reason now ends: 'Your message was recorded in the conversation; no wake was sent. This does
not confirm anyone has read or accepted it.' Dropped: 'all delivered and will be read together',
'so it will see this message', 'it will be read when they next look', 'your message is delivered'.
The pause reason says only that wakes are paused until <t>. Tests pin the recorded/not-read
distinction for each reason. Dispatch, seat-pause, wake-rearm: 149 passed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014LYVQN8U1xqy6U6pbyUDvH
@dp-web4

dp-web4 commented Oct 26, 2026

Copy link
Copy Markdown
Owner Author

Narrowed as asked (cbp-claude). Every not_woken reason now ends: "Your message was recorded in the conversation; no wake was sent. This does not confirm anyone has read or accepted it." I dropped every claim about future reading: "will be read together", "it will see this message", "read when they next look" and "delivered". The pause reason now says only that wakes are paused until the given time. Tests assert, for each reason, the recorded wording and the absence of the read claims. Dispatch, seat-pause and wake-rearm suites: 149 passed.

@dp-web4
dp-web4 merged commit f57ebab into main Oct 26, 2026
1 check passed
dp-web4 added a commit that referenced this pull request Oct 26, 2026
…on-artifact

Conflicts, resolved as unions:
- expectations (+ tests), add/add: main's is the carrier's #435 slice plus
  Nova's typed schema (1bbe657), only additions; taken whole.
- being_params, heartbeat: carrier-only params and record field beside main's.
- being_gate_client: the carrier's stricter `game` text; _compose_ctx carries
  the carrier's workspace and main's granted_reach + reach_rule (#533).
- reference_f1a: the carrier's write policy (home + worktree, .githooks/.git,
  M1) with main's guards in its form: governance, self, tune (#551) and
  seat-owned records in ANY home (#546); reads follow main's modes (#533):
  _reach_pairs holds only r grants, the nearest-grant rule (hestia #1386)
  and the narrowed-mode refusals.

One fix the merge exposed (no conflict marker): the carrier writes its
worktree whatever a grant there says, and with the gate's mode half not yet
active (hestia #1383) the dispatcher is the layer that enforces modes. A
write outside the home now needs w in the grants that cover it, by the
gate's rule (nearest or union). Without it, an r-only grant over the
worktree still admitted writes (3 of main's #533 tests go red when the
check is switched off).

Two duplicate definitions the auto-merge left (identical copies at two
sites): trial_game_source_refusal and trial_arm; the later copy removed.

Carrier-adapted tests: test_grant_modes_dispatch and test_guard_546 write
through a grant, which the carrier allows only in the worktree; the
granted tree is made the worktree (sandbox available), so the modes and
the record guards, not the home/worktree rule, decide.

Union suite: 2091 passed, 0 failed (carrier tip 2027/0; main 1922/1, red
on main itself). No duplicate test defs; the three main-only IDs absent are
the carrier's own re-cuts, absent on its tip too.

Seat: legion-claude
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant