Skip to content

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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

  1. Freeze/fix unified firmware and USB response contract; decide final release versions. Recording integrity/control fixes need their own authorized implementation and validation.
  2. 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.
  3. Prepare Flasher on feature/recording-and-unified-firmware with verified artifacts/changelogs and deliberate default behavior.
  4. 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.