Cow Flasher and Configurator — remote releases and mode support¶
2026-09-22. Implemented and pushed after owner authorization. Owner subsequently authorized promotion: default branches were fast-forwarded and pushed (Remote master418d3b5, Configurator main7384691, Flasher main45346f7). Web deployments triggered; see project logs for final verification. The plan below is historical; delivery details follow.
Delivered branches¶
- Cow_Remote
feature/unified-normal-recording-usb—418d3b5780123127b9a1e7e405f640140670668c. Unified6.16 Release built without warnings,64,060-byte binary SHA2560925ecc91c80afebb352fb1b9e6d6266de9ef4512c5707ec3860762fc9272fa7. Includes asynchronous verified/CRC recording storage, rejected legacy recordings, neutral output during storage, auto-stop at capacity, Play press/arming fixes, load/save indicators, stale V1 playback packet neutralization and explicit USB persistence replies. Source, release artifacts, build script, tests and release notes committed. - The_Real_Cow_Configurator
feature/remote-operating-mode—7384691a20bfaf389e007d77010c87395eb9746e. Mode UI, capability detection, active/saved/restart state, verified saves, import/export, serialized continuous-reader USB transport and bounded diagnostic polling. Browser tests passed against mocked Web Serial; physical USB pending. - The_Real_Cow_Flasher
feature/recording-and-unified-firmware—45346f769d2fa8fe716080cef151c56a4ff51e14. Exact original Record6.6 and new Unified6.16 binaries, hashes/changelogs/labels, documentation, version1.2.0, manifest/browser tests. Normal6.15 remains recommended default; unified is explicitly a hardware-validation preview. Legacy Record6.6 retains its known recording flaws; it was not silently replaced.
All remote refs independently matched local commits and working trees were clean after push. Record3754b32 was already pushed. No physical board flashed; real EEPROM brownout, V1/V2/panel compatibility, DFU, timing and IDE parity remain acceptance work. Configurator main was pushed first, followed by Remote master and Flasher main.
Inspected state¶
- Active Flasher: EmbeddedEra/The_Real_Cow_Flasher main 182e0161252921b78c379177cd212f684283d038. The similarly named The_Real_Cow_Flasher_1 last changed July 2025 and is not the proposed target.
- Configurator: EmbeddedEra/The_Real_Cow_Configurator main 0b1fc4aba3399878043820695719adead789fc7e.
- Read-only snapshots are under /tmp with suffix -plan-20260922. Neither has AGENTS.md or CLAUDE.md in its tracked tree.
- Flasher already lists Normal Cow_Remote_6.15.0.bin; latest recording is Remote_Record_6.5.2.bin. The two intended additions are assumed to be Remote_Record_6.6.0.bin and Cow_Remote_6.16.0.bin (unified), based on this conversation.
- Record6.6 is pushed at Cow_Remote Record3754b32, built/tested; SHA256 17d8d5c0a7d9d43f8579692f72864603c295c2d3e8984028903bfc7bcafd3687. Unified6.16 exists locally, builds/tests but remains uncommitted/unpushed and has outstanding findings. Its current hash18f5317b1afb7d63e6a9a2926749bbb750812ffe0bc340271e40c927f0b2f4a9 is a review snapshot, not a final release identity. Both recording implementations have inherited review findings; publication is not an assertion that they have been corrected. See cow-remote-unified-review.
Flasher plan¶
- Finalize release candidates and record source commit, exact version, Release compiler/build and SHA256. Do not replace a published binary in place with different bytes; use a new version if follow-up fixes alter published Record6.6.
- Copy approved exact artifacts into Firmware/. Add filename/changelog objects to firmware.json. Suggested user-visible labels: Recording remote6.6 — USB speed limits; Unified remote6.16 — Normal/Recording selectable in Configurator. Optional label metadata keeps filenames unchanged.
- Record6.6 notes: four USB caps, recording relocated0x40 to0x80, old recordings discarded, still60seconds, recording-only controls. Unified notes: one firmware/two modes, save+restart activation, shared speed caps, mode-specific controls, migration defaults and downgrade configuration/pairing implications. Separate USB bootloader support from the older Record lineage; do not claim parity without testing.
- index.html currently sorts all versions descending and selects index0 automatically. Unified6.16 would become the default. Keep it out of the public manifest until ready, or explicitly classify it as a preview with deliberate selection and a stable default. Do not let numeric version alone promote an unfinished release.
- Update FIRMWARE_LOADING.md and relevant instructions. Correct its stale example: actual manifest uses objects, not filename strings. Explain that flashing itself leaves EEPROM but firmware startup migration may invalidate recordings/change configuration.
- Validate manifest links, case-sensitive paths, changelog display, expected ordering/default, local-file path and exact served binary hashes. Browser smoke checks and real DFU/reconnect tests before distribution. Normal6.15 stays available; no receiver firmware addition implied.
Configurator plan¶
index.html contains the remote form, fields list, serial helper, DUMP parsing, save/reset and JSON import/export. Four speed caps already exist, so they do not need another UI implementation.
- Add an Operating mode selector (Normal/Recording), read-only active mode and saved mode, and explicit unsaved/restart-required status. No automatic restart. Capabilities come from a complete validated remote DUMP containing valid ACTIVE_MODE, MODE and SAVED_MODE values, not a guess based only on version. Mode unsupported on older Normal/Record builds and robots: disable/hide it and never transmit MODE. Clear capability/status on disconnect, failed identification and device changes.
- DUMP reports ACTIVE_MODE (boot active), MODE (pending), SAVED_MODE (config RAM representation of saved state). Send MODE=NORMAL/RECORDING only on supported remotes and validate the echoed mode. SAVE persists; activation requires power cycle. RESET persists Normal but leaves active mode unchanged; LOAD discards pending changes. Separate observational DUMP refresh from explicit LOAD so merely checking status does not discard staged choices.
- Fix remote transaction handling before adding success messaging. sendCmd defaults to no response reading, leaving replies queued; its read loop stops after any full chunk and reader.read can wait forever despite its nominal timeout. Use a bounded single-reader/serialized command flow, preserve partial lines, assemble a complete DUMP, handle delayed/multi-chunk responses and do not let unrelated stale replies count as success. Keep robot diagnostics compatible with reader ownership.
- Exact firmware errors are MODE_BUSY, MODE_ERROR, CONFIG_BUSY and command-specific *_ERROR, not generic ERR. MODE success emits MODE=
and SAVE_AND_RESTART_REQUIRED. SAVE/LOAD/RESET currently emit no success acknowledgement. Therefore do not simply set waitResponse=true for every command: that can hang. Prefer explicit success replies in the unfinished unified firmware as part of its final protocol contract, or use bounded legacy-compatible error collection and explicit LOAD+DUMP persisted readback after save. DUMP alone is a RAM report and not independent proof of EEPROM durability. Hardware power-cycle test remains required. - On failure stop subsequent persistence steps and show the reason; never claim the whole operation was rolled back when earlier settings were already staged. Verify reloaded mode equals request before reporting saved, and preserve restart notice rather than overwriting with a generic connection/success message.
- Export/import only the requested mode, not active/saved runtime status. Validate enum values; legacy files without mode leave the selection unchanged; imported mode must not override connected-device capability. Keep mode out of unrelated tuning presets.
- Use Configurator's existing semantic-release workflow for final versioning; do not manually assign a conflicting app version.
Acceptance and delivery order¶
- Freeze/fix unified firmware and USB response contract; decide final release versions. Recording integrity/control fixes need their own authorized implementation and validation.
- Implement Configurator support on feature/remote-operating-mode, with mocked Web Serial checks: split/late/stale responses, timeout/disconnect, busy/errors, persistence failures, successful save then restart, RESET/LOAD, imported invalid/legacy files, reconnect from unified to older remote or robot. Test no false success or unintended MODE command.
- Prepare Flasher on feature/recording-and-unified-firmware with verified artifacts/changelogs and deliberate default behavior.
- Browser test current Normal6.15, Record6.6, Unified final candidate and robot compatibility. Bench-check both modes, actual power-cycle persistence, recording and flash/reconnect. Publish Configurator compatibility before or with final firmware availability.
Review evidence¶
Tool-free Claude Fable5.1 (claude-fable-5-1), medium effort, reviewed supplied Configurator source;65seconds, CLI list-price estimate$1.35630275 (not extra subscription spending). Primary verified findings and corrected the suggested generic ERR matcher, blanket acknowledgement waits, insufficient capability check, stale disconnect state, and manual version bump. No tools/MCP/fallback; no active background worker at launch. Recent Claude observation:1% five-hour,3% sharedweekly,2% Fable. Private artifacts ~/engineering/review-artifacts/cow-apps-plan/.
Live promotion verification¶
2026-09-22: All three default-branch pushes verified. Cow Remote master418d3b5. Configurator release v1.13.0 generated mainfb80dca; Pages run35801182059 succeeded, live HTML version/mode UI verified. Flasher main45346f7 Pages run35801150110 succeeded; live catalog and both downloaded image hashes verified. Hardware qualification remains pending and preview label/default choice remain intact.
Configurator turn caps — 2026-11-05¶
Implemented requested Cow Remote 6.17.0 SLOW_TURN_MAX / FAST_TURN_MAX support on Configurator sandbox, commit 4cde4c2. Each field and command is gated by its own DUMP key; validation, re-DUMP verification, snapshots, reset backups, file import/export and upload logging include supported values. Existing presets and robot handling are unchanged.
All files in tests/ (one browser integration suite) passed using uv run --with playwright==1.62.0 python tests/browser_mode.py; includes 6.17 success/rejection/ranges/backup/defaults and reconnect to 6.16 with no new commands and unchanged 9-command progress. git diff --check passed. Local commit only; no push or deployment. Physical USB/firmware rounding not tested. Primary Codex worked locally; no helpers ran because the available helper interface cannot enforce the tool restrictions required by SOP-025.