Skip to content

docs(features): refresh event firmware spec to shipped behavior - #132

Merged
jamesarich merged 3 commits into
masterfrom
event-spec-refresh
Jul 28, 2026
Merged

docs(features): refresh event firmware spec to shipped behavior#132
jamesarich merged 3 commits into
masterfrom
event-spec-refresh

Conversation

@jamesarich

@jamesarich jamesarich commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

🌟 Why

firmware-edition-event-behavior.md hasn't been touched since #73 (May 2026). Since then the Android implementation moved substantially past it, and the spec now describes a design that no client actually builds — which makes it actively misleading for the iOS and Web implementations it exists to guide.

The largest drift: the spec hardcodes an event registry table in the client, while events are now data-driven off meshtastic/api. Adding an event is a metadata change, not a client release. Anyone implementing from the current text would build the wrong architecture.

🛠️ What changed

Corrected

  • FAB = 20 was missing from the enum.
  • The hardcoded event registry table is replaced by the manifest contract: source of truth (resource/eventFirmware), backing repo, icon hosting, offline fallback, and a commented example of the shape.
  • Welcome messages in the old table ("Welcome to DEFCON! 💀📡") no longer match the manifest and are no longer duplicated here — the manifest is the source.
  • Tapping the branding opens an info sheet, not a welcome snackbar.
  • "Adding a New Event" no longer asks for a drawable, a localized string, and a mapping entry in client code — it's two files in meshtastic/api.
  • welcomeMessage/tagline are explicitly not localized. Moving them into data traded translation for per-event editability; the old text asked implementers to localize them.

New sections for behavior that shipped but was never specified

  • Behavior 2: Event Theme — the wash, the palette rule, fonts, and the "Use event theme" opt-out. Includes why the palette gets its own rule rather than a richer wash (a wash carries one color and must stay faint; DEF CON's navy at 12% over a dark surface is invisible and reads as broken theming).
  • Contrast is the client's responsibility — brand palettes are authored for the event's own materials and routinely fail on one of a client's two surfaces. Specifies walking candidates in preference order and taking the first clearing WCAG AA 3:1, plus the calm-primary / loud-accent split in intent.
  • Behavior 4: Post-Event Nudge — drive from the metadata date in the event's timezone, not a stored bit, so it self-clears on re-flash.

Behavior 3 (notifications) — now describes what the code does: keyed off any non-vanilla edition, including DIY_EDITION, which the old text said was "not treated as event". The state key is named after Android's nodeEventsAutoDisabledForEvent.

Two implementation divergences are called out under Known divergences rather than silently written into the rules — a user who had already turned new-node notifications off gets force-re-enabled on returning to vanilla, and a manual re-enable never clears the flag. Both look like bugs worth fixing rather than behavior to copy, so they're flagged for a deliberate cross-platform decision and added as a sub-task.

Added a Platform Status matrix so the gap between platforms is visible at a glance.

🧪 Verification

Every claim was checked against the Android implementation rather than the PR descriptions:

  • Enum values read from the pinned protobufs snapshot (2.7.26.130-g642aae4) and cross-checked against meshtastic/protobufs master.
  • Notification behavior read from MeshConfigFlowManagerImpl.applyEventFirmwareNotificationDefaults and the NotificationPrefs API — this is where both divergences surfaced.
  • Manifest shape and the live payload compared against data/eventFirmware.json and GET resource/eventFirmware.
  • Icon tiers, sheet contents, theme surfaces, and the post-event nudge read from EventBrandingIcon, EventInfoSheet, MainAppBar, and ConnectionsScreen.

🔗 Related

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Documentation
    • Rewrote event firmware edition client behavior guidance around a metadata-manifest workflow with hosted/offline fallback and caching/staleness rules.
    • Specified end-user visible event branding (event artwork, firmware display naming, and a persistent event info sheet), including icon resolution order.
    • Defined event theme behavior with a user opt-out (“Use event theme”) and clearer accessibility responsibility notes.
    • Clarified notification auto-disable based on non-vanilla firmware editions, including known platform-specific differences and reconnect behavior.
    • Added post-event prompts after the event end time (inclusive, time zone aware) and updated onboarding/checklists.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@jamesarich, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 55 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3a7ae1f2-aa02-4633-af1b-e7ad501ae37a

📥 Commits

Reviewing files that changed from the base of the PR and between dbdafa3 and 3d376e6.

📒 Files selected for processing (1)
  • .github/features/firmware-edition-event-behavior.md
📝 Walkthrough

Walkthrough

The firmware edition event specification now uses a hosted metadata manifest with offline fallback, defines branding and theme behavior, simplifies notification auto-disable rules, adds a time-zone-aware post-event update nudge, and revises implementation tracking.

Changes

Event firmware client behavior

Layer / File(s) Summary
Manifest-driven branding and theme behavior
.github/features/firmware-edition-event-behavior.md
Adds the FAB firmware edition, defines hosted and bundled metadata manifests, trust-boundary rules, and manifest-driven branding, icon resolution, event information sheets, theme application, opt-out behavior, and contrast requirements.
Notification auto-disable behavior
.github/features/firmware-edition-event-behavior.md
Specifies notification disabling for any non-vanilla firmware edition, state handling across reconnects, and documented Android divergences.
Post-event nudge and implementation tracking
.github/features/firmware-edition-event-behavior.md
Adds a time-zone-aware persistent firmware update prompt after eventEnd and revises event onboarding instructions, platform status, and sub-task tracking.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related issues

  • meshtastic/design issue 120 — Covers the same event firmware metadata, branding, theming, notification, caching, and post-event behavior.
  • meshtastic/design issue 124 — Relates to the event-specific firmware-update nudge, although that issue focuses on stable-release notification eligibility and delivery.

Poem

A rabbit reads the manifest bright,
With event colors glowing light.
Vanilla hops, themes bloom,
Update nudges fill the room—
New firmware paths now feel just right!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and accurately reflects the documentation refresh to match shipped event firmware behavior.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/features/firmware-edition-event-behavior.md:
- Around line 176-180: Clarify the Post-Event Nudge rule so clients prompt only
when the current local calendar date in the event’s IANA timeZone is later than
the date-only eventEnd; do not prompt on eventEnd itself, and retain the
existing behavior for missing or unparseable eventEnd values.
- Line 84: Update the connected-state behavior for MyNodeInfo.firmware_edition
so a transition between different non-vanilla editions replaces the active
branding metadata with the new manifest entry. Preserve activation for mapped
editions and deactivation for vanilla firmware or disconnects, ensuring no stale
artwork, names, or themes remain.
- Around line 36-43: Clarify the “data-driven, not hardcoded in clients”
statement to distinguish hosted metadata from the bundled offline fallback:
clients that can fetch GET /resource/eventFirmware receive new events without a
release, while offline clients continue using the release-bundled manifest and
require a client release to recognize additions. Apply the same clarification to
the corresponding section referenced around lines 184–189.
- Line 74: Update the firmware-edition behavior specification around the
optional fields and device-info behavior to define a non-empty fallback when
displayName is absent, such as the raw edition enum name; preserve the
documented minimal-entry degradation behavior while ensuring firmware labels are
never blank.
- Around line 40-45: Define validation and trust-boundary requirements for the
hosted eventFirmware manifest before clients consume entries: validate the
schema and required fields, sanitize rendered text, restrict links and font/icon
URLs to approved schemes and hosts, and enforce image type and size limits.
Require clients to reject invalid or untrusted entries before display,
deep-linking, font loading, or icon fetching, while preserving the offline
fallback behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0c7c7112-ce24-48a5-98c4-6324d7af36fc

📥 Commits

Reviewing files that changed from the base of the PR and between 7c10f0e and 081b066.

📒 Files selected for processing (1)
  • .github/features/firmware-edition-event-behavior.md

Comment thread .github/features/firmware-edition-event-behavior.md Outdated
Comment thread .github/features/firmware-edition-event-behavior.md
Comment thread .github/features/firmware-edition-event-behavior.md
Comment thread .github/features/firmware-edition-event-behavior.md
Comment thread .github/features/firmware-edition-event-behavior.md Outdated
… eventEnd rule

Addresses CodeRabbit review on #132.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/features/firmware-edition-event-behavior.md:
- Around line 214-216: Update the fenced code block containing the ended
expression in firmware-edition-event-behavior.md to include an explicit text
language identifier, using a ```text fence while preserving the block’s
contents.
- Around line 49-60: Update the manifest-cache refresh flow to re-evaluate the
currently connected firmware edition whenever cached data changes, not only when
firmware_edition changes. Atomically refresh the associated branding, theme, and
sheet contents so newly fetched events become visible without requiring
reconnection.
- Around line 64-70: Extend the trust-boundary requirements to firmware.zipUrl
in the post-event update flow: require the URL to match an approved firmware
origin, and verify the downloaded artifact’s signature before presenting or
consuming it. Preserve the existing behavior of dropping invalid manifest
entries and treating untrusted firmware as unavailable.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 893e2d9a-c050-455a-81fb-530dec264d42

📥 Commits

Reviewing files that changed from the base of the PR and between 081b066 and dbdafa3.

📒 Files selected for processing (1)
  • .github/features/firmware-edition-event-behavior.md

Comment thread .github/features/firmware-edition-event-behavior.md
Comment thread .github/features/firmware-edition-event-behavior.md
Comment thread .github/features/firmware-edition-event-behavior.md Outdated
…x MD040

Addresses the second CodeRabbit review on #132.
@jamesarich
jamesarich merged commit 915c391 into master Jul 28, 2026
2 checks passed
@jamesarich
jamesarich deleted the event-spec-refresh branch July 28, 2026 17:58
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