feat(cat-tx-ptt): key the transmitter via CAT command or serial RTS/DTR#71
Merged
Conversation
Task 1.1 reserved FR-052, but gridtracker-udp-reporting (merged same day) already claimed FR-052-FR-055 in REQUIREMENTS.md. Next free number is FR-056 as of QA's pre-implementation audit. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds two new PTT methods (ptt.method = CatCommand | SerialRtsDtr) alongside the existing audio-only VOX keying, plus a shared failsafe watchdog and a Settings-page PTT configuration UI (FR-056/FR-057). Includes a critical caller-side fix found during hardware acceptance: QsoCallerService/QsoAnswererService never called KeyUpAsync after a normal transmission, so every real TX cycle relied on the 20s watchdog to release PTT instead of releasing promptly after tailTimeMs, breaking FT8 slot timing on every transmission (dev-tasks/2026-07-12-cat-tx-ptt-missing-keyup-after-transmit.md). Verified against real hardware: two complete, ADIF-logged QSOs with zero watchdog-forced releases (openspec/changes/cat-tx-ptt/hardware-acceptance.md). Gate 16 (R3, confirmed two-way QSO) is satisfied. Gate 14 (CAT-command PTT) and Gates 15.2-15.4 (DTR line, CAT-disabled independence, forced watchdog trip) remain outstanding manual hardware gates - tracked in tasks.md section 18.6, not blocking this merge but blocking archival of the change. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…w tests PR #71's CI failed on ubuntu-latest only (Windows/macOS green): the two new "cancelled mid-KeyDownAsync" regression tests asserted sut.Keying immediately after WaitForStateAsync returned. SetStateAndNotify(TxCq/TxAnswer) runs before TransmitAsync sets _keying = true, so the two writes have no atomicity between them - a narrow but genuine race, reliably exposed by CI's Linux scheduling, not present in the production KeyUpAsync fix itself (_keying is already volatile; this was a test-timing assumption, not a visibility bug). Fix is test-only: poll Keying to the expected value with the same 10ms-loop pattern WaitForStateAsync already uses for State, in both QsoCallerServiceTests and QsoAnswererServiceTests. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…r Gate G3 CI's Gate G3 (traceability check) failed after the Keying-race fix cleared the ubuntu-latest leg: FR-057 (Settings-page PTT configuration UI, added to REQUIREMENTS.md by this branch) had no test mapped to it. PttTestEndpointTests already covered it in substance but its DisplayNames only carried the "cat-tx-ptt 17.7" free-text prefix, not an "FR-057:" requirement-ID prefix the traceability tool's regex recognises (TestAssemblyScanner.LeadingIds requires the ID immediately before the colon, e.g. "FR-057: cat-tx-ptt 17.7, ..."). Verified locally with the exact command CI runs (dotnet run --project tools/TraceabilityCheck ... --report traceability.md): now reports "PASS: all requirements are mapped and all references are valid." Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
frank001
added a commit
that referenced
this pull request
Jul 12, 2026
…#71 19.1-19.3 (commit/push/PR) were still unticked even though the branch was already merged to main; ticked them and recorded the PR/CI evidence. §14, §15, and §18.6 remain correctly unticked pending real hardware gates. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
ptt.method = "CatCommand"(via the existing CAT link) and"SerialRtsDtr"(via a serial port's RTS/DTR line) — alongside the existing audio-only VOX keying, backed by a shared failsafe watchdog (PttWatchdog) and a Settings-page configuration UI (FR-056/FR-057).QsoCallerService/QsoAnswererServicenever calledKeyUpAsyncafter a normal transmission, so every real TX cycle relied onPttWatchdog's 20 s failsafe to ever release PTT instead of releasing promptly — breaking FT8 slot timing on every transmission. Full root-cause and fix indev-tasks/2026-07-12-cat-tx-ptt-missing-keyup-after-transmit.md.SerialRtsDtr, zero watchdog-forced releases across either session. Full evidence inopenspec/changes/cat-tx-ptt/hardware-acceptance.md.Test plan
dotnet build— 0 warnings/errorsdotnet test— full solution, 1174/1174 passingopenspec validate --strict --all— 54/54hardware-acceptance.md§16.1–16.3tasks.md§18.6/§14. Does not block this merge; blocks archiving the change.🤖 Generated with Claude Code