Skip to content

fix(firmware): build CV1 custom MCUboot and block stock bootloader artifacts - #25104

Merged
Git-on-my-level merged 12 commits into
mainfrom
fw/cv1-custom-bootloader
Nov 11, 2026
Merged

Git-on-my-level merged 12 commits into
mainfrom
fw/cv1-custom-bootloader

Conversation

@Git-on-my-level

@Git-on-my-level Git-on-my-level commented Nov 11, 2026 •

Copy link
Copy Markdown
Member

Requested by David

CV1 release app-core HEX assets could replace the working Omi MCUboot with stock MCUboot. Without Omi's SD init/deinit sequence, an uninitialized SD drives the shared SPI3 MISO line and corrupts NOR reads; MCUboot can reject and erase a valid staged OTA. OTA ZIPs themselves never replace the bootloader.

This PR builds the existing Omi main through an MCUboot-only sysbuild overlay and requires the full padded [0, 0x10000) region to equal the qualified 3.0.19 hash 6cfd4a70a715c8885dd86db96eb97286590852dd4b0f28d9f7374faad235cad1. CI checks the public-key hash, production config, slot geometry, compiled SD sequence and identical hashes from two clean MCUboot compilations. Factory c80cf2fd...da086 remains an approved installed/restoration state. The initialized end at 0xCEBC is within the actual reservation; the lead retired the earlier 0xCE00 heuristic.

Release app-core HEX is constructed from that pinned bootloader and the exact signed app bytes in the staged OTA ZIP. It excludes storage, UICR and network-core addresses. Staging, promotion and publish strictly reparse every staged HEX and enforce the boot pin plus exact OTA/app equivalence, even if checksums/receipts are edited. Merged app-core images support manufacturing and wired repair of stock-loader units; deliberate app-only recovery remains available when preserving an approved loader. OTA defaults to app-only and the separately named CPUNET asset is unchanged.

Lead-run jig receipt, 2026-11-11: factory boot backup matched c80cf2fd; boot-only loadbin and readback installed 6cfd4a70, byte-identical to CI run 42986142335 at eec9bff0be368557cde464f9e43b62b47c28a98e. After restoring only the .21 app, BLE image-upload --mode confirm of released .24 omi.signed.bin (SHA-256 b92ef865d865ad47242a4f70d050225cc65f42705b9d9c2931d4402a0c852978) installed image-hash prefix 7083cb10: slot1 pending/permanent before reset, slot0 active/confirmed after, DIS 3.0.24, boot record v2/flags 0x1d, nor_fail=0 and sd_fail=0. Factory boot and .21 app were restored and verified. The committed audit records this receipt without probe/device identifiers. Production remains overwrite-only; unconfirmed-trial reversion is not required or claimed.

The audit classifies historical loaders and records the lead's removal of unsafe app HEX assets for .2/.3/.4/.5/.20/.21/.23/.24. Gettop shipment claims remain unverified. Stock .21 loaders SPU-lock the boot region before app entry; no safe durable OTA-only repair is established. Recommend controlled wired repair or RMA, with aggregate-only manufacturer sizing. A bootloader-only change does not require 3.0.25 and cannot reach fielded pendants over OTA. Firmware version, signing keys, partitions and protection settings are unchanged.

Validation:

  • Boot/parser/pin/overlay and packaging/promotion regressions pass (46 tests), including wrong approved loader, stock loader, app-only substitution, receipt/checksum tampering and forbidden flash regions.
  • Release-process offline smoke, 109 release-process guard tests, public documentation checks and all 34 repository preflight checks pass. Normal push hooks pass on the final head.
  • Build-only qualification run 42998565007, exact source 6848f819322422234e98fb0f4ba91c8f4abd5cad: production sysbuild, both compiled bootloader proofs, clean-rebuild byte comparison and evidence export pass. Downloaded artifact is byte-identical to historical .19; full hash/key/compiled SD sequence/source identity rechecked locally. The complete run is green: all 50 simulator scenarios and 40 fuzz seeds pass, QA staging and artifact upload pass, and local download inspection confirms the shipping loader plus exact OTA signed-app bytes, ending at 0x50A14, with no forbidden app-core addresses. ci-wait 25104 BasedHardware/omi is green on exact head 6848f8193224: 57 checks, zero pending and zero failed, clean/mergeable.
  • The new build-only QA app SHA-256 is 05808c764973e2ce8f9fce7d1f8099df74015816db64382ab19a169bef222b10; it is internally consistent with its HEX/OTA package. The lead's physical app receipt above covers the released .24 image b92ef865..., not this newly signed QA app. Any future publication still requires the normal exact-app bench receipt.
  • The simulator starts at app entry and does not execute MCUboot or model electrical MISO contention; the lead's jig receipt provides that physical install proof.
  • Final independent review found a manual/staging gate gap; one shared validator now requires the shipping pin and exact signed app map at staging, promotion, publish and manual inspection. Follow-up independent review of the full diff at 4ff0b5d05fe126197554cba2d640a78b6fc35819 and the final SDK evidence-export delta at 6848f819322422234e98fb0f4ba91c8f4abd5cad found no remaining P1/P2 findings. No merge, version bump, tag, release or publish dispatch is authorized by this PR.

All .github/ changes:

  • .github/workflows/firmware_release.yml: compile/prove before the unchanged simulator gate; pass public run identity; upload separate MCUboot evidence and failed-build diagnostics in the existing manual build-only job. QA packaging remains behind both gates.
  • .github/checks-manifest.yaml: register boot-region regressions in local and CI lanes.
  • .github/ci-budget.yaml: refreshed inventory and explicit rationale for one bootloader-only rebuild within the existing manual job allowance; no new trigger/job/runner.
  • .github/scripts/check-release-process-guards.py and .github/scripts/test_check_release_process_guards.py: load the packaging helper with its sibling gate, use scoped synthetic boot/HEX fixtures, and preserve the offline staging/publish smoke.
  • .github/failure-classes/FC-unqualified-bootloader-in-wire-image.json: reusable pin/region guard and regression surfaces for this failure class.

Failure-Class: new

Build the Omi SD initialization main through sysbuild, gate boot regions, and stage app-only recovery HEX while custom MCUboot awaits bench qualification.

Failure-Class: new
Strengthen compiled SD sequence evidence, record the actual compiler, and normalize disabled batch launchers.

Failure-Class: new
…covery limits

Record 3.0.19 static key/layout compatibility without preapproving it, strengthen compiled SD sequence regressions, and migrate the release-process smoke to the sibling boot gate.

Failure-Class: new
@mintlify

mintlify Bot commented Nov 11, 2026 •

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
omi 🟢 Ready View Preview Nov 11, 2026, 9:39 AM

💡 Tip: Enable Automations to automatically generate PRs for you.

@Git-on-my-level
Git-on-my-level marked this pull request as ready for review November 11, 2026 10:28
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 11, 2026 •

Copy link
Copy Markdown
Codex Review Summary: ✅ Completed

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-11T10:33:24.530298Z 6848f81 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@Git-on-my-level
Git-on-my-level merged commit 66b08e2 into main Nov 11, 2026
64 checks passed
@Git-on-my-level
Git-on-my-level deleted the fw/cv1-custom-bootloader branch November 11, 2026 10:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant