Repository navigation
Session Handoff [rv3028-rtc]: RV3028 A0h year mark (#103) and 12-hour mode (#104) upstream; all three projects pass the acceptance matrix #53
Copy link
Copy link
Closed
Labels
handoffA link in the session handoff chain, one open issue per trackA link in the session handoff chain, one open issue per track
Description
Next steps
- Follow up on rtc: write the RV3028 time with an A0h year mark, and only 2000-2099 liquidraver/ZephCore#103 (RV3028 A0h year mark, 2000-2099 write range). Read new reviews and comments and answer each. Done when the owner merges or declines, or nothing new has arrived. Under the freeze below, change code only if a reviewer requires it or a hardware test fails. Any change goes to the iteration branch first (fork rtc: write the RV3028 time with an A0h year mark, and refuse years outside 2000-2099 (iteration branch) #50), then is re-squashed into the clean branch
rv3028-year-markerand pushed with--force-with-lease, only on Pieter's go. - Follow up on rtc: select 24-hour mode before a time write, and take no time in 12-hour mode liquidraver/ZephCore#104 (12-hour mode). Same procedure; iteration PR fork rtc: select 24-hour mode before a time write, and take no time in 12-hour mode (iteration branch) #52, clean branch
rtc-24h-mode. - If rtc: write the RV3028 time with an A0h year mark, and only 2000-2099 liquidraver/ZephCore#103 or rtc: select 24-hour mode before a time write, and take no time in 12-hour mode liquidraver/ZephCore#104 merges: re-check the other for conflicts. Both touch
ZephyrRTCDiscover.c,ZephyrRTCDiscover.hand thezephcore,rtc-i2cbinding, in different functions. rtc: select 24-hour mode before a time write, and take no time in 12-hour mode liquidraver/ZephCore#104's binding text still carries the old "year 00h before the other time bytes" sentence, which rtc: write the RV3028 time with an A0h year mark, and only 2000-2099 liquidraver/ZephCore#103 rewrites; the second to merge needs that reconciled. After a merge, sync the fork'sdev(Pieter clicks Sync fork) and close the matching iteration PR (rtc: write the RV3028 time with an A0h year mark, and refuse years outside 2000-2099 (iteration branch) #50 or rtc: select 24-hour mode before a time write, and take no time in 12-hour mode (iteration branch) #52) unmerged. - Tell the Zephyr and MeshCore sessions about anything that changes the shared position. Their PRs are drivers: rtc: rv3028: reject time accesses cut short by a switchover zephyrproject-rtos/zephyr#121389 and Read and write the RV3028 clock atomically, and reject switchover-garbled transfers 🤖🤖 meshcore-dev/MeshCore#3421.
External blockers
- The liquidraver/ZephCore owner reviews and merges rtc: write the RV3028 time with an A0h year mark, and only 2000-2099 liquidraver/ZephCore#103 and rtc: select 24-hour mode before a time write, and take no time in 12-hour mode liquidraver/ZephCore#104. Nothing to do but answer.
- Pieter's go is needed for any upstream write: a force-push, a description edit, a new PR.
- Syncing the fork's
devhas to be done by Pieter (Sync fork); the agent's fast-forward push ofdevwas refused by the permission check.
Internal dependencies
- rtc: write the RV3028 time with an A0h year mark, and only 2000-2099 liquidraver/ZephCore#103 before rtc: select 24-hour mode before a time write, and take no time in 12-hour mode liquidraver/ZephCore#104 is the natural merge order: rtc: select 24-hour mode before a time write, and take no time in 12-hour mode liquidraver/ZephCore#104's description mentions rtc: write the RV3028 time with an A0h year mark, and only 2000-2099 liquidraver/ZephCore#103 rewriting the binding sentence. Either order works, but the second needs that sentence reconciled.
- Acceptance-test freeze: all three projects agreed (Pieter's direction) to freeze the position and act only on a failed hardware acceptance test or a reviewer requirement. New findings go to a parked list for Pieter, not into code.
State
- Upstream PRs:
- rtc: write the RV3028 time with an A0h year mark, and only 2000-2099 liquidraver/ZephCore#103: open, MERGEABLE, head 535a37c on dev a2e8d5f. Copilot: approval recommended.
- rtc: select 24-hour mode before a time write, and take no time in 12-hour mode liquidraver/ZephCore#104: open, head 7286e50 on dev a2e8d5f, just opened, no reviews yet.
- Fork iteration PRs, open by design, never merged:
- rtc: write the RV3028 time with an A0h year mark, and refuse years outside 2000-2099 (iteration branch) #50, branch
work/rv3028-year-marker, head 04bf64d. - rtc: select 24-hour mode before a time write, and take no time in 12-hour mode (iteration branch) #52, branch
work/rtc-24h-mode, head c18e1f0. Both review threads (Copilot, CodeRabbit) are fixed and resolved, and a local pass is attested.
- rtc: write the RV3028 time with an A0h year mark, and refuse years outside 2000-2099 (iteration branch) #50, branch
- Fork issue rtc: select 24-hour mode at adoption, and refuse a 12-hour read #51: the 12-hour defect. It closes when rtc: select 24-hour mode before a time write, and take no time in 12-hour mode liquidraver/ZephCore#104 lands.
- Parked, unpushed branch
work/rv3028-status-direct-clear(4169a6d): RV3028 Status clears as a direct write instead of a read-modify-write. Pieter accepted rtc: write the RV3028 time with an A0h year mark, and only 2000-2099 liquidraver/ZephCore#103's read-modify-write as a ZephCore platform difference, so it stays parked. One run of it coincided with a CDC zero stream that did not reproduce. - Local test branch
test/rtc-accept-103(8e53697, 1a6e37d): the acceptance harness. Never push it. - Test board: the RAK4631 with the RAK12002 RTC runs the 12-hour build (c18e1f0). Its prefs hold the agreed on-air settings, and its RTC holds the correct time.
- Other repositories in this work: drivers: rtc: rv3028: reject time accesses cut short by a switchover zephyrproject-rtos/zephyr#121389 (head 82e160257cc) and Read and write the RV3028 clock atomically, and reject switchover-garbled transfers 🤖🤖 meshcore-dev/MeshCore#3421 (head 0f038054), each driven by its own session.
Parked decision queue
- Which RAK4631 has which sensors? Pieter's earlier correction says the ZephCore test board has GNSS, the RTC and one environment sensor, and the MeshCore session's board has two sensors. The Zephyr session says Pieter calls the ZephCore board "the one with 2 sensors". The note in local memory follows the earlier correction until he answers.
- The parked direct-write Status branch: keep it parked, or drop it? Pieter accepted the read-modify-write difference, so there is no need to act.
What the last round did
- Agreed the RV3028 rule across all three projects: write 06h := A0h, then one 7-byte burst; writes only 2000-2099; read A0h-FEh as not set and FFh as a failed read. The cross-project and 12-hour paragraphs are carried word for word in the PRs.
- Opened rtc: write the RV3028 time with an A0h year mark, and only 2000-2099 liquidraver/ZephCore#103, then re-squashed it onto a2e8d5f after upstream's "comment diet vol.2" trimmed the RTC comments; its comments were trimmed to match.
- Built the 12-hour fix. Fork rtc: select 24-hour mode at adoption, and refuse a 12-hour read #51 and rtc: select 24-hour mode before a time write, and take no time in 12-hour mode (iteration branch) #52, then upstream rtc: select 24-hour mode before a time write, and take no time in 12-hour mode liquidraver/ZephCore#104. Copilot and CodeRabbit findings fixed: zero bits checked in the time block, and the "next sync" log line promised only for the adopted RTC.
- Ran the shared acceptance matrix (A-H, G2 with a real USB power cut). All PASS on ZephCore's exact submitted code: A-G on 535a37c via a test harness, A3 and H on exact builds. Zephyr (25/25) and MeshCore also passed on their exact commits.
- Measured on the chip: writing 1 to an RV3028 Status flag leaves it unchanged (CLKF, BSF, UF, TF, AF, EVF and PORF, read back immediately and 1.1 s later).
What not to repeat
- Chaining several flashes in one tool call. One call died mid-sequence and left the board as an unknown USB device until a replug. Do one flash or reboot per call.
- Endless review rounds on wording. Comment sentences that explained more than the code could back up drew a new finding every pass, over many rounds. State the rule, keep the reasons in the PR text, and close out with "minimal edits, one final recorded pass, leftovers listed as known".
- A generic devicetree property for the 12-hour fix produced a long tail of findings about descriptors that could be misdeclared in future. If it's touched again, consider RV3028-specific handling, as Zephyr does.
- Asking Pieter for a physical step in prose. He missed the unplug request, and a 10-minute capture timed out. Put every action request in a dialog.
- Restarting a shared retry counter to fix a log count broke the documented 13-attempt cap.
New learnings
- RV3028 Status: writing 1 to a flag has no effect, so a torn read written back is harmless; recorded in this chain and in rtc: write the RV3028 time with an A0h year mark, and only 2000-2099 liquidraver/ZephCore#103/#121389.
- I2C cut reads: a read cut short ends in 1s (MSB first), so an always-zero bit 0 such as Control 2's RESET detects any cut; recorded in rtc: select 24-hour mode before a time write, and take no time in 12-hour mode liquidraver/ZephCore#104's description.
pr_review.py attestchecks the receipt against targetdev(the fork's), so record passes under--target devonce the fork is synced, as well as against upstream.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
handoffA link in the session handoff chain, one open issue per trackA link in the session handoff chain, one open issue per track
Activity
ptr727 commentedon Oct 7, 2026
Parked decision 1 answered by Pieter: the ZephCore test board has GNSS, the RTC and one environment sensor; the MeshCore session's board has GNSS, the RTC and two sensors. Next session: Pieter will label the boards and cables A to E, so every session uses the same names from then on.
ptr727 commentedon Oct 7, 2026
2026-10-07 update: the upstream maintainer asked for much less of both PRs (liquidraver#103 (comment)). On Pieter's direction this was done as new PRs, so the coordinated versions stay as the record:
rtc-year-range9b68b7ework/rtc-year-range, from #50's head)rv3028-boot-24h2eb082dwork/rv3028-boot-24h, from #52's head)#50 and #52 are closed with pointers; their branches are kept. ZephCore now keeps its existing year-00h write (no A0h mark), and on a refused write the chip keeps its time. Zephyr and MeshCore sessions were told about the divergence; any edit to their PR text needs Pieter's go.
Verification. Local strict review was recorded on both clean branches. liquidraver#105: harness 14/14 PASS (local
test/rtc-accept-year-range, never push), including a cut year-00h write giving no time, and A on the exact build. liquidraver#106: harness 6/6 PASS (localtest/rtc-accept-boot-24h), and H plus A on the exact build. The ZephCore board runs 2eb082d, with lpxz/927.875/tx 1 intact; its clock is about 8 s ahead from a testtime, which the next sync fixes.Known point, kept on Pieter's decision: on liquidraver#106, a failed clear (a 10h read failure or FFh, or a refused write) falls back to the old hours decoding.
Next: follow liquidraver#105 and liquidraver#106 until they merge or are declined, using the same procedure as before (dirty branch first, then re-squash, then force-with-lease only on Pieter's go). The two PRs now touch different functions, so merge order no longer matters.
ptr727 commentedon Oct 7, 2026
2026-10-07 ~10:15 PT, liquidraver#106 review answered. The owner ("this is the size I was after") and Copilot asked for the same fix: run the 12-hour clear only for
RTC_FOUND, not forRTC_FOUND_GARBLED. The owner also asked for one ARCHITECTURE.md clause. Both are done inrv3028-boot-24ha4fb95c (force-with-lease from 2eb082d, on Pieter's go), with the dirty branch at #55's 3c10138. The binding and header now say "cleanly identified". Two local review rounds are recorded (round 2: no findings). On hardware, the harness passed 6/6, and the exact a4fb95c build's first boot cleared a real 12-hour chip and restored the correct time. The owner reply and the Copilot thread reply are posted, and the thread is resolved.Correction to the comment above: liquidraver#105 and liquidraver#106 DO conflict in
ZephyrRTCDiscover.c, becausertc_clear_12h()sits next to liquidraver#105'srtc_time_block()comment edit. They now also both touch the same ARCHITECTURE.md line. The owner asked for liquidraver#106 to be rebased ontodevonce liquidraver#105 is in, which is the next step. Do it on #55's dirty branch first, then re-squash, then force-with-lease on Pieter's go.Bench note: the RAK's 1200-baud touch failed 13 times in a row this session; it reset the board straight back into the app. One time the bootloader came up as 'Shared', not attached, with Windows holding the drive. A USB replug fixed that, and a double-tap RST brought up a bootloader that WSL attached, so serial DFU worked.
ptr727 commentedon Oct 8, 2026
2026-10-08 ~07:45 PT, liquidraver#106 rebased and the owner's second request done. The owner merged liquidraver#105 and asked for two things: a rebase with both conflicts resolved keep-both-sides, and no time taken when the 12-hour clear fails (liquidraver#106 (comment)). The second reverses the earlier "Known point, kept on Pieter's decision".
work/rv3028-boot-24h(rtc: clear the RV3028 12-hour bit at boot (iteration branch) #55) has upstream dev 290b0c2 merged in, then three commits, now at e5623aa.rv3028-boot-24his at db69172, one commit on 290b0c2, with the same tree as e5623aa. It was force-pushed with lease on Pieter's go. PR rtc: clear the RV3028 12-hour bit at boot liquidraver/ZephCore#106 is MERGEABLE, its description is updated, and the reply is rtc: clear the RV3028 12-hour bit at boot liquidraver/ZephCore#106 (comment).RTC_FOUND_GARBLED, so no time is taken. FLASH +88 B, RAM +0 against dev.test/rtc-accept-boot-24h, which is never pushed). Cases H5-H8 exercise the failure paths through a test-only fault hook in that worktree, left uncommitted.Board: USB-A runs b3b4c0a, an image byte-identical to db69172, with lpxz, 927.875 and tx 1 intact. Its clock is a few seconds behind, which the next sync fixes. The touch into the bootloader failed 6 of 6 times again, and a double-tap RST worked.
Next:
liquidraver-ZephCore-devbase(detached, used for baseline builds) can be removed.ptr727 commentedon Oct 8, 2026
Lane closed out, 2026-10-08 ~10:30 PT: the RV3028 contribution is finished. This is the final link of track
rv3028-rtc, closed with no successor on Pieter's direction.Outcome
rtc-year-range,work/rtc-year-range,rv3028-boot-24handwork/rv3028-boot-24hdeleted on the fork and locally, with their worktrees.Left behind, on purpose
test/rtc-accept-103,test/rtc-accept-year-rangeandtest/rtc-accept-boot-24h, with theiraccept*worktrees. They were never pushed. Delete them when they are no longer needed for reference.devis at 290b0c2. Upstreamdevhas moved on, so the next Sync fork brings in c1d2185.Parked decision queue
0 issues carry
decisionon this fork. The one parked item, the DS3231/DS3232 12-hour case, is tracked as a defect in #34 rather than as a decision.What not to repeat
git checkout HEAD~0detached HEAD, so two amends never reached the branch, and the first lease push sent stale b3b4c0a. Checkgit status -sbnames the branch before any force-push.New learnings
cmpits zephyr.bin with the one tested on hardware. Byte-identical carries the hardware result over. Recorded here only.