Follow-up to #497 (PR landing now).
#497 ships software `keep frost network sign-event`. The hardware path is rejected with `NotImplemented`:
```
hardware FROST network sign-event requires aggregate-receive plumbing on the hardware path;
run the same group with a software participant who can aggregate, or see follow-up issue.
```
Why
`cmd_frost_network_sign_hardware` (keep-cli/src/commands/frost_network/hardware.rs) publishes the local signature share to the relay and exits with "Waiting for coordinator to aggregate final signature". The 64-byte aggregated schnorr signature is never observed locally, so we cannot assemble the signed Nostr event on this side. `sign-event` requires the full sig to build the JSON `Event`.
Scope
- Define the wire protocol for a hardware participant to receive the aggregate from the coordinator (probably a new `kind = 21107` event tagged with the request_id, content = hex sig).
- Have `cmd_frost_network_sign_hardware` subscribe to that filter after publishing its share and wait (with timeout) for the aggregate.
- Add a parallel hardware sign-event entry point that reuses the same waiter and builds the signed event JSON.
- Tests: covers the wait-for-aggregate path, including timeout when the coordinator never publishes.
Related
Follow-up to #497 (PR landing now).
#497 ships software `keep frost network sign-event`. The hardware path is rejected with `NotImplemented`:
```
hardware FROST network sign-event requires aggregate-receive plumbing on the hardware path;
run the same group with a software participant who can aggregate, or see follow-up issue.
```
Why
`cmd_frost_network_sign_hardware` (keep-cli/src/commands/frost_network/hardware.rs) publishes the local signature share to the relay and exits with "Waiting for coordinator to aggregate final signature". The 64-byte aggregated schnorr signature is never observed locally, so we cannot assemble the signed Nostr event on this side. `sign-event` requires the full sig to build the JSON `Event`.
Scope
Related