piker/ai
Gud Boi b95e7c796e .data: reconnect after websocket reader close errors
A Binance Ping racing local socket closure makes trio-websocket's
reader send a Pong while wsproto is LOCAL_CLOSING. That reader
nursery error escapes proxy_msgs(), then tears down brokerd and
pikerd instead of restoring quote delivery.

Classify NoBsWs.recon_errors around the entire websocket context,
with collapse_eg() outside it so a singleton reader exit group
reaches the reconnect handler. Invalidate the stale connected
event and socket reference before retrying. Keep retry sleep
unshielded so parent cancellation stops recovery promptly.

Deats,
- Add real loopback websocket coverage: TCP, handshake, Ping,
  reader dispatch and wsproto's actual Pong validation.
- Control only the first client Ping's protocol-state ordering,
  withholding its Close frame to prevent a peer response racing
  the deterministic LOCAL_CLOSING reproducer.
- Require fresh data on a replacement connection, plus exactly
  one connection when cancelling at the reader or retry boundary.
- Use RuntimeError for the unexpected-failure control:
  LocalProtocolError is now a recoverable connection failure.
- Preserve the original unexpected exception with bare raise,
  and assert its identity in the test. Log recoverable errors
  with the websocket URL and the underlying traceback.

This is a local follow-up, not another downstream cherry-pick.
The earlier wrapper suppressed escaped communication failures;
97eb8347 deliberately re-raised them. Retain that outer error
visibility rather than restoring suppression without recovery.
The isolated baseline reproduces the live Pong failure; all 13
selected Binance/websocket cases pass with this fix. Human live
qualification remains separate from these loopback regressions.

Follow-up-to: 97eb834799
Original-equivalent: d50ab6124c
Related-history: 3d83b61f3f
Prompt-IO: ai/prompt-io/opencode/20261028T160846Z_7242dcb9_websocket_close.md

(this patch was generated in some part by `opencode` using
`gpt-6.1-sol` (`openai`))
2026-10-28 12:48:06 -04:00
..
claude-code Add `ai/` integration docs w/ `/commit-msg` usage 2026-03-05 15:30:34 -05:00
prompt-io .data: reconnect after websocket reader close errors 2026-10-28 12:48:06 -04:00
README.md Add `ai/` integration docs w/ `/commit-msg` usage 2026-03-05 15:30:34 -05:00
ib-recovery-candidate.md Document bounded IB recovery and downstream replay 2026-10-23 11:36:29 -04:00

README.md

AI Tooling Integrations

Documentation and usage guides for AI-assisted development tools integrated with this repo.

Each subdirectory corresponds to a specific AI tool or frontend and contains usage docs for the custom skills/prompts/workflows configured for it.

Originally introduced in PR #69; track new integration ideas and proposals in issue #79.

Integrations

Tool Directory Status
Claude Code claude-code/ active

Adding a New Integration

Create a subdirectory named after the tool (use lowercase + hyphens), then add:

  1. A README.md covering setup, available skills/commands, and usage examples
  2. Any tool-specific config or prompt files
ai/
├── README.md                  # <- you are here
├── claude-code/
│   └── README.md
├── opencode/                  # future
│   └── README.md
└── <your-tool>/
    └── README.md

Conventions

  • Skill/command names use hyphen-case (commit-msg, not commit_msg)
  • Each integration doc should describe what the skill does, how to invoke it, and any output artifacts it produces
  • Keep docs concise; link to the actual skill source files (under .claude/skills/, etc.) rather than duplicating content