Skip to content

Session Handoff [board-templates]: Merge the 2.4 Promotion (#266), Then Clean Up and Sweep Worktrees #258

Open

Description

@ptr727

Next steps, in priority order

  1. Merge the 2.4 promotion, #266, on the maintainer's go-ahead, through merge-and-release with a merge commit, never --delete-branch. It met every Merge Gate item except that go-ahead at head 9c2568d. Re-read the head and the gate first, since a Dependabot merge on either branch moves it. A release is a separate dispatch, asked for separately. Done when main carries 2.4 and Lint the C++ in Lambdas on the Generated Code After the Compile Test #256 closes on the merge.
  2. Clean up after the merge. Remove the promote/develop-to-main branch and its worktree, and the detached dial-flash worktree, which holds a copy of secrets.yaml. The auto-mode classifier blocked a cleanup-shaped command here, so this may need the maintainer.
  3. Run the hub's report-only worktree sweep, carried from round 1 and still not done: uv run --no-project --script scripts/pr_review.py cleanup --sweep --repo ptr727/<repo> --checkout ~/repos/<repo> from a hub checkout, for the clones holding several worktrees (the MeshCore, ZephCore and Zephyr forks, ProjectTemplate, homeassistant-purpleair). Present what it lists. Nothing is deleted without --apply and the maintainer's go-ahead. The classifier denied it this round as destructive, so the maintainer runs it or allows it.
  4. Optional, compile-lint the deployed device configs. The lint flags double math in top-level configs that CI never builds, such as garage-gate-fan-controller.yaml. Run the VS Code task "ESPHome: Compile and Lint" on each when it is next touched.
  5. Optional Dial bench checks, unchanged: an NFC tag read, and battery power hold, Power Off, and restart on battery, recorded in the template header, README and OPERATIONS.md "M5Stack Dial".

External blockers

  • Step 1 needs the maintainer's explicit go-ahead to merge main.
  • Steps 2 and 3 need the maintainer to run or allow cleanup-shaped commands.
  • Step 5 needs an NFC tag and a battery for the Dial.

Internal dependencies

State

The parked decision queue

0 open decision issues in this repository at close.

What the last round did

  • Landed #261: the example devices set api_reboot_timeout and wifi_reboot_timeout to 0s, and CI fails one that leaves either out. The Dial's periodic reboot was the API timeout, confirmed from its console.
  • Landed #262, closing Lint the C++ in Lambdas on the Generated Code After the Compile Test #256 at the promotion: tools/compile-lint, a syntax-only recheck of each build's generated main.cpp with -Wdouble-promotion that attributes diagnostics to YAML lambda lines, args: entries and component files. It runs in every CI compile leg and as the VS Code task "ESPHome: Compile and Lint". The double-promotion sites it found are fixed with f suffixes and explicit static_cast<double>() on float printf and args: arguments, the maintainer's choice.
  • Landed #264, #265 and #267 for the promotion review's findings: a cancelled compile leg fails the required check, inline matches are confined to the diagnostic's column, a dot directory is not owned code, and any unexpected lint failure exits 2 with its traceback. OPERATIONS.md gained a camera bench-network note and a corrected lint-container note.

What not to repeat

  • A finding that id() rewrites must skip C++ string literals is false. ESPHome's Lambda.parts runs re.split(LAMBDA_PROG, comment_remover(value)) over the whole lambda, strings included. Declined twice, on Promote M5Stack Boards, Reboot Timeouts, and the Compile Lint to Main #263 and Promote M5Stack Boards, Reboot Timeouts, and the Compile Lint to Main #266.
  • A finding that an on_boot RTC sync touches LVGL widgets before they exist is false, again. In the Dial's main.cpp, every widget is created before App.setup() runs any boot trigger.
  • The hub tags have no v, so a # vX.Y.Z version-comment finding on a hub pin is false.
  • A cached local build hides warnings. The first CI run found warnings that the cached builds had not shown, because they predated the YAML. Lint a fresh compile before claiming the tree is clean.
  • A promotion whose head is develop cannot absorb a conflict with main. Resolve on a branch off main per the branching skill's promotion procedure, and replace the promotion PR.
  • pgrep -f '<pattern>' inside a watcher matches the watcher's own command line, so a bounded watcher ran its whole bound. Watch a PID instead.
  • Pushes touching a workflow file need SSH. The HTTPS token lacks workflow scope.

New learnings

  • In the agent shell grep is a ugrep wrapper, so a regex a workflow runs is tested with /usr/bin/grep. Recorded in the host notes.
  • The compile lint's mechanics, what it sets aside and how to fix each finding are in OPERATIONS.md "Compile Lint".

Activity

  1. added
    handoffA link in the session handoff chain, one open issue per track
    on Oct 25, 2026
  2. ptr727 commented on Oct 25, 2026

    @ptr727
    OwnerAuthor

    Closing answers from the maintainer, recorded after this round was written:

    • File the pr_review.py wait early exit on the hub: filed as ProjectTemplate#3451.
    • Track the esp32_camera_web_server shutdown assert here for a later upstream report or pull request: filed as #259.
    • The host note about the small /tmp volume went into the maintainer's host notes.
    • Added next step, first for the next session on this host: run the hub's report-only worktree sweep, pr_review.py cleanup --sweep --repo <owner>/<repo> --checkout <base-clone>, across the maintainer's repositories, and present what it lists for approval. Nothing is deleted without the maintainer's go-ahead (--apply). Most of the space sits in Zephyr and ZephCore worktrees.

    Parked decision queue at close: 0 open decision issues.

  3. ptr727 commented on Oct 25, 2026

    @ptr727
    OwnerAuthor

    Round 1, closed 2026-10-25: Session Handoff [board-templates]: Add M5Stack Dial Templates, Then Lint Lambdas (#256)

    Next steps, in priority order

    1. Add M5Stack Dial templates (the maintainer's next session). A board template plus an LVGL example device in test/, following the CoreS3 pattern from #257: display, touch and board plumbing in the template, drawing in the example, every built-in part covered and exercised on screen, a reusable add-on as its own overlay. Done when CI compiles it, the bench unit runs it, and the README and OPERATIONS.md entries name what was confirmed on hardware.
    2. Work #256, the compile-time C++ lint of lambdas on the generated main.cpp, as its own change after the Dial. The CoreS3 and Dial example devices are its real corpus. Done per the issue's own "Done When".
    3. Promote develop to main when the maintainer asks. Develop carries version 2.4 (CoreS3) unpromoted.

    External blockers

    • None for step 1 beyond the hardware: a Dial must be on the dev box's USB, and its owner should confirm it is free to flash.
    • The dev box intermittently loses the CoreS3 bench unit on the LAN while another host still reaches it. Cause not established. Safe meanwhile: flash over USB with the camera off, as below.

    Internal dependencies

    State

    • #257 merged into develop. Its worktree and branch are cleaned up, and the base clone is on develop, level with origin. Re-derive with git worktree list and gh pr list.
    • The CoreS3 bench unit on the dev box runs the merged example device with both reboot timeouts overridden to 0s. No battery is fitted. Its efuse leaves the flash voltage to GPIO45.
    • No release was dispatched.
    • HomeAutomation-Config #1375 was filed for a usbdev documentation gap.

    The parked decision queue

    0 open decision issues in this repository at close.

    What the last round did

    • Landed #257: templates/m5stack-cores3.yaml, templates/m5stack-cores3-camera.yaml, test/m5stack-cores3.yaml, a README entry, an OPERATIONS.md section, version 2.4. Every Merge Gate item was met before merge.
    • Filed HomeAutomation-Config #1375.

    What not to repeat

    • A USB flash of a CoreS3 running the camera overlay leaves it looping in its bootloader, and only a power cycle recovers it. Turn Camera Enable off over the API first, and flash only if that call succeeded. Chaining the flash after a failed call cost a power cycle.
    • Putting a build cache in /tmp or the scratchpad filled the small /tmp volume on the dev box and broke every command until cleared. Keep caches under ~/.cache.
    • Reading a usbfs console capture's opening boot banner as a reset. It is buffered output, so look for the ROM's rst: line.
    • Calibrating touch from finger taps. The offsets were finger contact. The dead taps were the FT6336 monitor scan, now held off by the template.
    • pr_review.py wait on a fresh push can return at once with checks=5/5 before the queued jobs register. Watch the workflow run itself.
    • Auto exposure at VGA on the GC0308 returned one flat frame. M5Stack's manual QVGA settings work.

    New learnings

    • The CoreS3 hardware traps (GPIO45 flash strap, FT6336 monitor scan, AXP2101 rails, GC0308 format, I2S sharing, touch mapping) are recorded in OPERATIONS.md "M5Stack CoreS3".
    • The usbdev stale-buffer behavior is in HomeAutomation-Config #1375.
  4. changed the title [-]Session Handoff [board-templates]: Add M5Stack Dial Templates, Then Lint Lambdas (#256)[/-] [+]Session Handoff [board-templates]: Lint Lambdas (#256), Then Promote Both M5Stack Boards[/+] on Oct 25, 2026
  5. ptr727 commented on Oct 25, 2026

    @ptr727
    OwnerAuthor

    Round 2, closed 2026-10-25: Session Handoff [board-templates]: Lint Lambdas (#256), Then Promote Both M5Stack Boards

    Next steps, in priority order

    1. Work #256, the compile-time C++ lint of lambdas on the generated main.cpp, as its own change. The CoreS3 and Dial example devices are its real corpus. Done per the issue's own "Done When".
    2. Promote develop to main when the maintainer asks, after Lint the C++ in Lambdas on the Generated Code After the Compile Test #256. Develop carries version 2.4 against main's 2.3, and the maintainer wants that one promotion to carry the bump for both M5Stack boards. Do not bump version.json again for the Dial.
    3. Run the hub's report-only worktree sweep, carried from the last round's closing answers and not yet done: pr_review.py cleanup --sweep --repo <owner>/<repo> --checkout <base-clone> across the maintainer's repositories, then present what it lists for approval. Nothing is deleted without the maintainer's go-ahead (--apply).
    4. Optional bench checks on the Dial, when the hardware is at hand: read an NFC tag, and run it on a battery to test the power hold, the Power Off button, and whether a restart keeps power. Update the template header, README and OPERATIONS.md "M5Stack Dial" with what is confirmed.

    External blockers

    • Step 4 needs an NFC tag and a battery for the Dial, which the maintainer did not have at hand.

    Internal dependencies

    State

    • #260 squash-merged into develop. Its branch and worktree are cleaned up, and the base clone is on develop, level with origin. Re-derive with git worktree list and gh pr list.
    • The Dial is on the dev box's USB-B cable and runs the merged example device, the CoreS3 is still on USB-A. Both are free, and no other session holds them.
    • No release was dispatched.

    The parked decision queue

    0 open decision issues in this repository at close.

    What the last round did

    • Landed #260: templates/m5stack-dial.yaml, test/m5stack-dial.yaml, a README entry, a release note under 2.4, an OPERATIONS.md section, and RFID in cspell.json.
    • Confirmed on a Dial V1 (StampS3): USB and OTA flash, display, touch mapping, backlight and idle sleep, encoder at one step per detent, front button, buzzer, RTC write.

    What not to repeat

    • A Copilot finding that the clock cannot render from the RTC without SNTP is false. Every ESPHome time source reads one system clock, and bm8563.read_time sets it, so time.has_time: sntp_time holds after an RTC read.
    • A CodeRabbit finding that an on_boot or light on_state touches LVGL widgets before they exist is false. The generated setup() runs lv_init() and creates every widget before App.setup() runs any component or boot trigger.
    • timeout around docker run leaves the container running. Pass --init and put the timeout inside the container command.
    • pr_review.py wait on an attested head returns in seconds while the checks still run. Wait on gh pr checks instead. The related early exit is already filed as ProjectTemplate#3451.
    • ESPHome's Dial device page treats GPIO46 as a "Hold Button" input. It is the power hold output, see OPERATIONS.md "M5Stack Dial".

    New learnings

    • The Dial hardware traps (GPIO46 power hold, the GPIO8 shared reset, FT3267 on ft5x06 absent from the I2C scan, the buzzer on its own LEDC timer) are recorded in OPERATIONS.md "M5Stack Dial".
  6. changed the title [-]Session Handoff [board-templates]: Lint Lambdas (#256), Then Promote Both M5Stack Boards[/-] [+]Session Handoff [board-templates]: Merge the 2.4 Promotion (#266), Then Clean Up and Sweep Worktrees[/+] on Oct 25, 2026
  7. ptr727 commented on Oct 25, 2026

    @ptr727
    OwnerAuthor

    Closing answers from the maintainer, recorded after round 3 was written:

    • Promotion merged and released, at the maintainer's go-ahead ("Merge and dispatch a release"). #266 merged into main as 6f058ae, which closed Lint the C++ in Lambdas on the Generated Code After the Compile Test #256. Release 2.4.10 was published from that commit by publish-release run 40220650506 (success). Next step 1 is done.
    • Cleanup done: the promotion and dial-flash worktrees are removed, and the base clone is on current develop.
    • Still left for the maintainer, which next steps 2 and 3 now reduce to:
      • Delete the promote/develop-to-main branch, local and remote. pr_review.py cleanup handles only branches merged into develop.
      • Run the report-only cleanup --sweep, which the auto-mode classifier blocks for the agent.

    Parked decision queue at close: 0 open decision issues.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    handoffA link in the session handoff chain, one open issue per track

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions