Commit graph

731 commits

Author SHA1 Message Date
Meta Vens
c5a2c68cb8 self: silent-stop kinds cover every kind the CLI queues nothing for on our stop; capture fixtures killshell and deadline-race; tests kill hand mutants H2 and H5
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 07:44:59 +00:00
Meta Vens
21f92068fb self: public_surface snapshot carries Usage's kind fields
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 07:55:40 +01:00
Meta Vens
7c0313b068 self: a stop of ours owes no turn only for a shell task (task_type local_bash, Bash or Monitor); every other or unread kind owes its turn when stopped
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 07:48:13 +01:00
Meta Vens
62ce2ba12d self: idleness reads the CLI's own background-task level and its notification-to-turn rule; at idle the oldest waiting conversation goes first
Cut: State.tasks, Event::TaskStarted, the tool_use_id keying of task lines and the notification replay, and TaskNotified's tasks.remove gate. running is a copy of the CLI's last background_tasks_changed, replaced whole; a notification owes a turn when the task was backgrounded and the session did not stop it with TaskStop (or KillShell, KillBash: the stream shows the alias as the model named it); Polled and Inbox carry other_first, so a served conversation's newer brief no longer outruns an older brief of another. Fixtures bg-fgto, bg-kill and bg-monitor pin the three falsified cases; the probe's fake API gains a generic tool step and a timed scenario.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 06:48:03 +01:00
Meta Vens
625c171781 probe: background-task captures with the real claude 2.1.312 (bg-fgto, bg-kill, bg-monitor)
A foreground task moved to the background at its timeout, a task stopped with TaskStop, and a persistent Monitor; scrubbed to /probe/work, the key is the fake one.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 06:41:38 +01:00
Meta Vens
d655b59ce8 self: a session serves one conversation at a time; another conversation's brief is written only at idle, and every result belongs to the conversation being served
decide owns idleness (no turn open, nothing outstanding, no backgrounded task running, no notification owed its turn) and the switch of
conversation; read_usage reads the task lines for liveness only; the CLI's replay of a task notification is no echo of ours. SelfInbox
serves one Conversation and attributes a result by the span, not by the order of the stream. Deleted: briefless_open, briefless_answers,
turn_conversation, turn_allows, may_tell, one_conversation_told, note_task, tasks, notified, the Persona pointer line and its plumbing.
ScheduleWakeup and CronCreate are denied to the Self session. Tests replay the real-order captures with briefs spliced in.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 05:31:38 +01:00
Meta Vens
970086f6a0 probe: background-task captures with the real claude 2.1.312 (bg-idle, bg-fold, bg-other, bg-race, bg-agent, bg-late)
The harness runs the CLI against the fake Messages API with a fake key and a throwaway config dir: bg and agent plan steps, a
Monitor step, --disallowedTools through DENY. Captured: an Agent call with run_in_background gives task_started
(is_backgrounded true, the call's tool_use_id) and a task_notification with the same id; a background Bash ending while no turn is open
makes the CLI begin its own turn (init, a request, no echo); ScheduleWakeup and CronCreate are absent from the init tools when denied;
a Monitor is a backgrounded task with the same two lines, so it needs no denial. Host paths scrubbed to /probe/work.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 05:14:03 +01:00
Meta Vens
3402cb839d self: a notification is pending by its task's id alone and a turn that took in its conversation's briefs takes it in; tests for the survivors
A notification with no tool_use_id registers nothing (the open-turn gate still holds it by its request). Tests: the notified conversation's brief joins its turn, a notification of another conversation stays pending through a brief turn, two conversations' notifications open a turn no brief may join, an idle non-request line opens no turn, a resolved claim is read by its own key, a claimed cut spec stays on the start line.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 03:46:44 +01:00
Meta Vens
8bdb84d94b self: a briefless turn is open from a request with nothing echoed until its result; the start message states the routing rules
A request with no line of ours echoed is a turn that took in no brief, notification or not; until its result only the conversation it continues, or the notification's task's, is written. Nothing told yet means no other conversation exists.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 03:20:23 +01:00
Meta Vens
08a80697d3 self_run tests: the fake claude scripts that loop end when their stdin closes
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 03:16:27 +01:00
Meta Vens
a1370cf424 persona: a reply that cannot be placed is a text-free pointer in the public session
A reply that answers no brief, or briefs of two conversations, was read by nothing and re-paged on every Persona read. It is now a route in the public conversation marked as a pointer: the line carries the reply id and a fixed note, never its text, and the Persona reads the reply by id. Heard, it is resolved like any reply.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 03:16:27 +01:00
Meta Vens
7182ff107b self: a notification's result is its task's turn's; a briefless turn holds other conversations; a resolved claim's conversation is read by key
The stream's task_started and task_notification events carry the tool_use_id of the call that started the task. The actuator records, per task, the briefs the starting turn was answering; a briefless result after a notification answers those (any notification it cannot place answers none). While a notification's turn is open, only the conversation it is attributed to may be written. A restart reads a resolved claim's conversation by key and opens the gate for it alone. The flush result is the note to the successor, in the journal: it is no reply. The start message states the rules.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 03:16:26 +01:00
Eureka Hands
4bc00e36f9 self tests: the gate follows the conversation of a line written and unechoed when a result arrives
Kills the conversation_of mutants (== to !=, body to None) that the previous pass left.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 01:08:45 +00:00
Eureka Hands
34db62e3ca persona tests: a reply to no brief is told nowhere; the rotation margin ends a start; an idle session tells its own retell, revision or notice; a reply that fails to resolve twice is retried once
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 00:20:18 +00:00
Eureka Hands
f8403165e5 self: a result that took in no brief answers nothing once two conversations were told; the flush answers no brief; the start line holds one conversation
A reply to no brief is told in no session and stays in force (ruling briefless-result-routing). A restart drops a claim that is not of the start set conversation.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 00:20:09 +00:00
Meta Vens
1f8dae184e mind-body: Brief.conversation is crate-visible like its type; start_self_run's inputs stay flat
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 00:10:18 +01:00
Meta Vens
8b61cca7da self: one Self turn answers one conversation
The start set is one conversation's; poll and tell gate briefs by the conversation of those unanswered;
a result that took in no brief continues the turn before; the start message says so.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 00:07:20 +01:00
Meta Vens
b675ba75c1 persona tests: a reply is told only in its brief's conversation, end to end
DM invariant across three sessions, a reply alone opening its DM once per start, the oldest waiting thing deciding,
pre-deploy briefs going public, a two-conversation reply told nowhere, the yield, one origin per turn, the open-brief mark.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 00:07:20 +01:00
Meta Vens
98e61aff3e persona: a reply is told only in its brief's conversation; a start opens a DM's session for a reply alone
reply_routes derives each in-force reply's conversation from the origins of the briefs it answers (nothing stores it);
next_session lets the oldest waiting thing decide, carry's batch no longer owns rooms, conversation or origin;
an empty batch takes the session's origin; the brief records the turn's origin; a session with nothing of its own yields to another conversation's reply.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 00:07:20 +01:00
Meta Vens
c4303e8657 recall: origin_phrase is the one render of an origin
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 00:06:44 +01:00
Meta Vens
5eb1452ca4 pipeline: a follow-up records the origin of the Persona turn that admitted it
PipelineFollowUp gains origin (absent is not written, so the golden sample is unchanged);
MemoryOrigin's doc says it is a brief's too; the header facts carry it; schemas regenerated.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 00:06:44 +01:00
Meta Vens
26303f045b persona: once she answered a line, its heard replies never return to waiting; resolution is retried silently
A heard reply whose resolution did not take (admit failed, or the keyed read errs) went back through untell and was told again. The answered
replies now wait in answered_replies, retried at each result and at close (settle_replies), one by one so no refusal holds another hostage;
untell serves only the lines she did not answer. Tests pin the retry, the close retry, the reply resolved elsewhere on a refused line, and the
unreadable in-force read on that path (told again, kept as retell).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 23:55:25 +01:00
Meta Vens
987c6ec74d persona: the mind says whether a heard reply took; tests kill the keyless read and the lost resolution
hear_replies attempts each resolution and untell asks the mind which replies are still in force, so an Ok/Err reading of the
admission is no second opinion. The out-of-force test holds replies past the first line so a read by kind alone would retell the
resolved one.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 23:15:25 +01:00
Meta Vens
8ab5959d46 persona: a reply out of force leaves for good; replies resolve one by one; idle and waiting-duplicate paths pinned
untell checks a reply is still in force before it waits again, and hear_replies resolves each reply on its own, so one refused
resolution neither retells a reply nobody can answer nor holds the rest of its batch. Tests: out-of-force retell, a reply reaching an
idle session with no chat pending, and a reply waiting across a read while a line is not echoed (a stalled child).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 22:57:42 +01:00
Meta Vens
5269260d12 persona tests: each reply line carries its own words
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 21:26:13 +00:00
Meta Vens
8f184f9028 self_run: REPLY_TEXT_LIMIT is the actuator's, not the public surface
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 20:59:58 +00:00
Meta Vens
aab49c5d35 eureka-state: schema list names reply before selection
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 20:42:10 +00:00
Meta Vens
3953194f24 persona-hears-her-self: her Self admits each result as a reply; her Persona hears, tells and resolves it; the run-end notice, slot read and closure text die
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 20:34:07 +00:00
Meta Vens
8f5ff3e415 eureka-state: schema list counts the reply kind
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 20:18:59 +00:00
Meta Vens
3ef5da5e0d reply kind: one result of her Self session, as its actuator heard it (eureka-pipeline, huginn-mind, schemas, golden)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 20:17:45 +00:00
196be4f11c Merge pull request 'chat-retrieval-map: anchors to main, answered questions, stale Persona premise' (#7) from eureka/chat-retrieval-map-status into main 2026-11-05 10:59:03 +00:00
8d7e8ccffb chat-retrieval-map: correct anchors, record answered questions and the stale Persona premise
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 10:58:43 +00:00
25199c9eba Merge pull request 'docs: chat retrieval authority map and cut' (#1) from eureka/chat-retrieval-map into main 2026-11-05 10:58:27 +00:00
16d3d123e8 Merge remote-tracking branch 'origin/main' into pr1 2026-11-05 10:58:26 +00:00
809a93c4a6 Merge pull request 'The MCP admit goes through the one strict door; refusals name the field' (#5) from hands/eureka-body-typed-research into main 2026-11-04 22:16:42 +00:00
Meta Vens
4a7bb5fafc eureka-state door: a custom message with an expected clause is not passed on
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 23:03:19 +01:00
Meta Vens
27ab1fcbcf eureka-state door: pin schema_words by behaviour
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:58:42 +01:00
Meta Vens
b63de715ae eureka-state tests: an unknown kind names documents[i].kind
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:47:07 +01:00
Meta Vens
51853c1ac1 eureka-state door: a decode refusal names the field path, never a value
Documents decode one by one through serde_path_to_error, so the refusal says
documents[i].path and what is wrong, in the schema's words: a field name, the
allowed variants, the expected type. Serde's own text quotes the input, so it
is not passed through.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:45:48 +01:00
Meta Vens
eeeded257b eureka-state door: drop the unused Display on Refusal
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:20:56 +01:00
Meta Vens
5b6305c522 eureka-state door: tidy test module
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:10:10 +01:00
Meta Vens
1aa3176796 eureka-state: close the moved door's test modules
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:07:59 +01:00
Meta Vens
e808c619fd eureka-state: one text door; the MCP admit decodes through it
The strict decode that refuses unknown keys by path moves from the huginn
binary to eureka_state::door; the CLI re-exports it and the MCP admit takes
documents as a Value (schema still Vec<PipelineDocument>) and decodes through
it, answering InvalidInput before any call. A research note with extra keys is
refused by path and nothing is stored.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:06:41 +01:00
869edfdf28 Merge pull request 'Persona wake: the brake counts only Self runs the Mind started itself' (#4) from hands/wake-brake-unasked into main 2026-11-04 19:13:39 +00:00
Meta Vens
4da767d4e3 Persona wake brake: restore LF line endings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 20:11:58 +01:00
Meta Vens
aab071f5a2 Persona wake brake: tests for the full read and the newest-first order
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 20:03:50 +01:00
Meta Vens
31bf575f11 Persona wake brake tests: close the source run
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 18:44:50 +01:00
Meta Vens
73037c296e Persona wake brake tests: close the claimed Self runs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 18:43:43 +01:00
Meta Vens
531fece922 Persona wake brake tests: view by full id
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 18:42:45 +01:00
Meta Vens
e1b3c7dadb Persona wake brake tests: claim real follow-ups
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 18:41:43 +01:00