Conversation
Auto-committed by dispatcher when developer hit max_turns. Build was clean (vet + build); work preserved as draft PR for human triage. Session: c7fc64e5-8fd9-4291-93c3-62c82b012286
The developer's max_turns salvage on #7 included a `pyrycode-relay` Mach-O binary because `go build ./...` (a documented salvage gate) emits it at repo root and `.gitignore` listed `dist/` + `bin/` containers but not the bare binary name. Add `/pyrycode-relay` anchored to repo root and `git rm` the existing copy so the PR ships only source. Same shape as the canonical `.codegraph` self-ref symlink fix shipped 2026-05-09 in agent-dispatcher's consumers — auto-commit safety net plus gitignore gap equals unwanted artifact in tree. Two instances within 24 hours, hardened rule: audit `.gitignore` against every artifact path the agent's build commands can produce in the working tree. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…exist Conflicts resolved: - docs/PROJECT-MEMORY.md: keep #7 heartbeat row + main's three frame-forwarder rows (#25 split the old 'Frame forwarding | Not started' row into specific entries) - docs/knowledge/INDEX.md: keep heartbeat (#7) + phone-forwarder (#25) entries; client-endpoint description uses main's post-#25 wording - docs/knowledge/features/ws-conn-adapter.md: heartbeat policy clarification (#7 ships, ping policy lives in heartbeat.go) + main's read-loop/size-cap notes - docs/knowledge/features/client-endpoint.md (×2): combine — handler hands conn to StartPhoneForwarder (#25) AND launches heartbeat goroutine alongside (#7); out-of-scope section keeps both #25 inner-frame note and #7 heartbeat policy - internal/relay/client_endpoint.go: heartbeat goroutine (cancelHB defer first under LIFO) launches BEFORE StartPhoneForwarder call replaces the old CloseRead+Done placeholder. WSConn is concurrent-safe (closeOnce + writeMu). Build clean (go vet + go build); tests pass (internal/relay 1.577s). Combined diff to be reviewed by code-review (security-sensitive label triggers the security-review pass per architect/security-review.md). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Code Review: #7Decision: PASS FindingsNone blocking. Notes (informational)
SummaryImplementation matches the spec one-to-one. The defer ordering is correct in both endpoints ( Security-sensitive checklist: spec carries a PASS security review section (architect's pre-implementation pass); the diff introduces no tokens/secrets/log leaks (close reason is the fixed literal
Knowledge artefacts (ADR-0007, The salvaged |
- Add docs/knowledge/codebase/7.md (per-ticket implementation summary per the convention bootstrapped in #1). - Revert salvage commit's append to PROJECT-MEMORY.md "What's Built"; per-ticket files are the new index. - Patterns established: LIFO defer ordering for per-conn goroutines, active-conn vs stillborn-conn close-code split (ADR-0005 / ADR-0007). - Lessons: nhooyr's Conn.Close 5s close-handshake gates goroutine exit; a peer that doesn't read cannot pong (test-shape implication). Heartbeat feature doc, ADR-0007, INDEX entry, and the three feature docs (heartbeat, ws-conn-adapter, server-endpoint, client-endpoint) were already authored by the salvage commit and are unchanged.
Auto-salvaged from
max_turnsThe developer agent hit
max_turns(71 turns, $6.14) on #7 while work was in progress. The dispatcher auto-committed the uncommitted changes and opened this draft PR for human triage.Build status at salvage: clean (
go vet ./...+go build ./...all passed). Tests were not run as a salvage gate — failing tests are often the signal the agent was chasing.Last messages from the agent (may include unresolved findings):
To investigate:
claude --resume c7fc64e5-8fd9-4291-93c3-62c82b012286feature/7This PR is a draft — auto-merge is disabled until a reviewer marks it ready (or closes it). Ticket label
error:max_turns_salvagedindicates triage required.Closes #7