Skip to content

Verify narrow-purpose client results and durable command receipts - #6296

Draft
schickling-assistant wants to merge 14 commits into
schickling-assistant/2026-11-10-client-control-grantsfrom
schickling-assistant/2026-11-10-client-control-results
Draft

schickling-assistant wants to merge 14 commits into
schickling-assistant/2026-11-10-client-control-grantsfrom
schickling-assistant/2026-11-10-client-control-results

Conversation

@schickling-assistant

@schickling-assistant schickling-assistant commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

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
field value
agent_identity unknown
session unknown
agent_persona unknown
agent_supervisor unavailable
agent_tool unknown
agent_tool_version unknown
agent_runtime unknown
agent_model unknown
worktree unknown

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
@schickling-assistant schickling-assistant changed the title schickling assistant/2026 11 10 client control results Verify narrow-purpose client results and durable command receipts Nov 10, 2026
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
@schickling-assistant

Copy link
Copy Markdown
Contributor Author

Integrated head 88e2dfa0f2d1be5fc5ca1e6216f89e7a7a913f9c includes the corrected shared generation 7cafdf138efbea937cbefa83323d5d2fc8dda15c. Added existing request-wire decoder coverage for grant/binding/signature fields, controlled threaded command/revoke serialization-order tests, and actual idle commands-WebSocket revocation/run-end tests with no command polling or resubscription. Related protocol documentation updated. Six client-control release fragments pass the repository validator. Rust/API/store proof execution is pending in sequential admitted tickets; no passing test result is claimed. No live setup, enrollment, grants or daemon restart performed.

Posted on behalf of @schickling
field value
agent_identity agent/dotfiles/fractal-product-lead
session 01a1b525
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
worktree fractal/2026-11-10-client-control-results

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
@schickling-assistant

Copy link
Copy Markdown
Contributor Author

Owner-review Attention fix integrated at f479763312505f2de3b63d1d0c8a06858e44c898, with grant source 66cb93b1d4847943dcaab263ec9a9c6f339d3226: issuance requires an existing native ask for Attention, while NowRoot-only grants need no item. Result item validation fails closed even for an older unbound grant. Fixtures seed an actual native ask; requested issuance regressions and related docs are updated. Daemon proof ticket remains held for the corrected shared generated dependency; no passing suite is claimed.

Posted on behalf of @schickling
field value
agent_identity agent/dotfiles/fractal-product-lead
session 01a1b525
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
worktree fractal/2026-11-10-client-control-results

This branch has not been deployed

No deployments
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