Repository navigation
Verify narrow-purpose client results and durable command receipts - #6296
Conversation
agent-identity: agent/dotfiles/fractal-product-lead agent-persona: generalist agent-supervisor: unavailable agent-tool: OMP agent-tool-version: 18.12.5 agent-runtime: OMP 18.12.5 agent-model: openai-codex/gpt-6.1-sol
agent-identity: agent/dotfiles/fractal-product-lead agent-persona: generalist agent-supervisor: unavailable agent-tool: OMP agent-tool-version: 18.12.5 agent-runtime: OMP 18.12.5 agent-model: openai-codex/gpt-6.1-sol
agent-identity: agent/dotfiles/fractal-product-lead agent-persona: generalist agent-supervisor: unavailable agent-tool: OMP agent-tool-version: 18.12.5 agent-runtime: OMP 18.12.5 agent-model: openai-codex/gpt-6.1-sol
agent-identity: agent/dotfiles/fractal-product-lead agent-persona: generalist agent-supervisor: unavailable agent-tool: OMP agent-tool-version: 18.12.5 agent-runtime: OMP 18.12.5 agent-model: openai-codex/gpt-6.1-sol
# Conflicts: # docs/st3/client-v0/device-commands.md
|
Integrated head Posted on behalf of @schickling
|
agent-identity: agent/dotfiles/fractal-product-lead agent-persona: generalist agent-supervisor: unavailable agent-tool: OMP agent-tool-version: 18.12.5 agent-runtime: OMP 18.12.5 agent-model: openai-codex/gpt-6.1-sol
|
Owner-review Attention fix integrated at Posted on behalf of @schickling
|
Problem
A test-client result must authenticate visible state under one command grant without becoming message-send authority, and every acceptance row needs durable store evidence.
Goal
D-1/D-2 existing-protocol command enforcement for enrolled iOS/web/TUI; D-6 direct enrolled-key canonical verification; D-7 exactly one durable terminal receipt and bounded rejected-attempt receipts.
Decisions
Retain phone.inspect/phone.navigate. Verify generated purpose client.device-result.v1, JCS state digest, exact command/device/session/grant/run, outer outcome/error/result, allowed screen, command/grant windows and terminal replay. Never add control.messages; an integration test accepts a result then calls the real message.send action with that SAME key/signature and active grant and expects refusal. Existing command HTTP routes/capability/commands collection had been orphaned during API splitting; this layer wires them back, including grant lifecycle and paired Unix clients.
Authenticated-agent D-3/D-4 admission refusals write a durable receipt ONLY inside the local-only fixture principal. Error details return command_id and receipt_claim_id. Malformed/unauthenticated/non-fixture requests never write such claims. The existing 2048 retained command/refusal rows and five-minute window bound writes; saturation is distinct receipt-capacity. Durable claims outlive that window. Unsigned terminal states record null signatures; failed persistence does not evict an unreceipted command.
Verification
Added core signed-result/receipt tests for active acceptance, wrong key, binding/purpose/kind/run/grant/command/session, replay, malformed result, expiry, revoke, every admission refusal, bounded receipt capacity and independent stored-signature verification. Added real action message-domain and commands-collection lifecycle tests. Tests NOT RUN yet: shared canonical generation remains queued for admitted build capacity. Release fragments PASS through repository validate() API; requested CLI validate form exited2 because this revision has no such subcommand. No CI dispatch/rerun or live setup/pairing/enrollment/grant/daemon action.
Complexity
Reuse existing device commands, collections, mission authority and trusted operation claims; no second transport or signing authority.
Concerns
Command correlation remains ephemeral by contract; durable receipts and budgets survive restart. Signature envelope nonce/timestamp metadata do not establish freshness; daemon command/grant windows do.
Friction & bottlenecks
Canonical codegen dependency awaits shared build admission; generated sources are never hand-merged with other branches.
Follow-ups
Human setup/apply/enrollment and live journey gates remain separate and pending. Source acceptance is local-only.
References
Depends on #6289 → #6288 → #6274, and merged local-only source #6279. Stack #6290. Own source commit6e691bef6f; current merge headde87a820a9. No additional held store/mission/mailbox paths changed in this layer.
Final seeded ask ruling
The journey is NowRoot → Attention (seeded native ask) → inspect. Grants allow only NowRoot/Attention and optional item_id binds the seed. Conversation returns screen-not-granted; answer/close/read-state/message.send verbs return verb-not-granted. Other ask IDs are refused under an item-bound grant. Tests cover these exact cases.
Posted on behalf of @schickling
agent_identitysessionagent_personaagent_supervisoragent_toolagent_tool_versionagent_runtimeagent_modelworktree