Skip to content

Fix mobile heart and warning emoji with native font fallback - #7842

Merged
brow merged 6 commits into
mainfrom
fix-mobile-heart-emoji
Sep 24, 2026
Merged

brow merged 6 commits into
mainfrom
fix-mobile-heart-emoji

Conversation

@brow

@brow brow commented Sep 23, 2026 •

Copy link
Copy Markdown
Contributor

Mobile heart and warning reactions and message text render as monochrome symbols because bundled Inter supplies U+2764 and U+26A0. Remove only those two character mappings from both regular and italic Inter fonts so Flutter uses native font fallback. No production Dart or Markdown parsing changes are needed.

The reproducible font-processing script verifies that every other mapping and font table is unchanged, apart from the required checksum. Glyphs, metrics, language coverage and symbols such as © ® ™ ↑ ↓ − ∕ are preserved; the bundled Inter license is retained.

Validated on an actual iPhone 17 Pro simulator running iOS 26.5. Reaction hearts and warnings remain centered within 0.33 logical pixels of the pill center. Native screenshot checks cover reactions and plain, emoji, explicit text-style, bold, italic, and enlarged emoji-only message hearts and warnings, plus pixel-identical preserved text samples.

Fallback behavior: on iOS 26.5, plain ❤ / ⚠ and explicit text-style ❤︎ / ⚠︎ also render as color emoji. Native font metrics add one logical pixel to each of the three mixed-message lines in this fixture. Android visual behavior has not been validated.

Reactions

Before After
Monochrome hearts and warnings in reactions Centered native color hearts and warnings in reactions

Message text

Before After
Monochrome message hearts and warnings with preserved symbols Native color message hearts and warnings with preserved symbols

Images are cropped native simulator screenshots of production widgets with synthetic content. Before uses the original bundled fonts; after uses the processed fonts.

Added tests: the existing mobile CI test lane now checks both bundled fonts against the verified generated artifacts, preventing restoration of the old mappings or unintended font changes.

Validation: the two asset tests, font-table verification, byte-identical regeneration, native screenshot regression checks, and Flutter analysis pass. The screenshot test fails against the original rendering. Pre-push checks, including the full mobile suite, pass. Full repository validation also passes. The enlarged emoji-only screenshot check passes and rejects the old normal-sized fixture. GitHub CI, Codex review, and the security review pass for commit 538167a. Both prior Codex findings are addressed and resolved.

Signed-off-by: Tom Brow <tomb@block.xyz>
@brow

brow commented Sep 23, 2026

Copy link
Copy Markdown
Contributor Author

@codex review

@brow

brow commented Sep 23, 2026

Copy link
Copy Markdown
Contributor Author

@builderbot review

@github-actions

github-actions Bot commented Sep 23, 2026 •

Copy link
Copy Markdown

🔐 Codex Security Review

Status: review required for the current range.

The current range is 4544ba1713d8d7f5959d7d63886ff3927357e1ac...538167a78837d26bbebd9da47726ab118350e3cf.
A new review must complete for this exact range. When manual authorization
is required, a Block organization member must comment exactly
@buzz-security-review 538167a78837d26bbebd9da47726ab118350e3cf to authorize a new review.
Any previous review applies only to its recorded range.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 23, 2026 •

Copy link
Copy Markdown

Codex Review Summary

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

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-24T14:03:47.019187Z 538167a 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.

brow added a commit that referenced this pull request Sep 23, 2026
@brow

brow commented Sep 23, 2026

Copy link
Copy Markdown
Contributor Author

@buzz-security-review 57d7692

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. You're on a roll.

Reviewed commit: 57d769291e

ℹ️ 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".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

brow added a commit that referenced this pull request Sep 24, 2026
@brow brow changed the title fix(mobile): render hearts with native color emoji fonts Fix monochrome mobile heart reactions Sep 24, 2026
@brow

brow commented Sep 24, 2026

Copy link
Copy Markdown
Contributor Author

@codex review

@brow

brow commented Sep 24, 2026

Copy link
Copy Markdown
Contributor Author

@buzz-security-review d9a5bdd

@github-actions github-actions Bot added the codex-security-review-current The posted Codex security review matches its recorded range. label Sep 24, 2026
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Bravo.

Reviewed commit: d9a5bdd6e9

ℹ️ 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".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

brow added a commit that referenced this pull request Sep 24, 2026
@brow brow changed the title Fix monochrome mobile heart reactions Fix mobile heart rendering with native font fallback Sep 24, 2026
Signed-off-by: Tom Brow <tomb@block.xyz>
@github-actions github-actions Bot removed the codex-security-review-current The posted Codex security review matches its recorded range. label Sep 24, 2026
@brow

brow commented Sep 24, 2026

Copy link
Copy Markdown
Contributor Author

@codex review

@brow

brow commented Sep 24, 2026

Copy link
Copy Markdown
Contributor Author

@buzz-security-review 965d702

@github-actions github-actions Bot added the codex-security-review-current The posted Codex security review matches its recorded range. label Sep 24, 2026

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 965d7027c2

ℹ️ 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".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread mobile/test/visual/verify_heart_screenshots.py
brow added a commit that referenced this pull request Sep 24, 2026
Signed-off-by: Tom Brow <tomb@block.xyz>
@brow brow changed the title Fix mobile heart rendering with native font fallback Fix mobile heart and warning emoji with native font fallback Sep 24, 2026
Signed-off-by: Tom Brow <tomb@block.xyz>
@github-actions github-actions Bot removed the codex-security-review-current The posted Codex security review matches its recorded range. label Sep 24, 2026
@brow

brow commented Sep 24, 2026

Copy link
Copy Markdown
Contributor Author

@codex review

@brow

brow commented Sep 24, 2026

Copy link
Copy Markdown
Contributor Author

@buzz-security-review cf5c5d9

@github-actions github-actions Bot added the codex-security-review-current The posted Codex security review matches its recorded range. label Sep 24, 2026

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: cf5c5d9b76

ℹ️ 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".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread mobile/test/visual/heart_sim_app.dart Outdated
Signed-off-by: Tom Brow <tomb@block.xyz>
brow added a commit that referenced this pull request Sep 24, 2026
@brow

brow commented Sep 24, 2026

Copy link
Copy Markdown
Contributor Author

🤖 Actual iPhone 17 Pro simulator captures on iOS 26.5 using production widgets. Only the heart and warning character mappings are removed from bundled Inter fonts.

Reactions before

Monochrome hearts and warnings.

before-reactions

Reactions after

Centered native red hearts and yellow warnings.

after-reactions

Messages before

Original fonts with monochrome hearts and warnings.

before-messages

Messages after

Native color emoji in plain, emoji, explicit text-style, bold, italic, and enlarged emoji-only messages (production 36sp path). Preserved symbols and languages remain pixel-identical apart from preceding line-height changes.

after-messages

@github-actions github-actions Bot removed the codex-security-review-current The posted Codex security review matches its recorded range. label Sep 24, 2026
@brow

brow commented Sep 24, 2026

Copy link
Copy Markdown
Contributor Author

@codex review

@brow

brow commented Sep 24, 2026

Copy link
Copy Markdown
Contributor Author

@buzz-security-review 538167a

@github-actions github-actions Bot added the codex-security-review-current The posted Codex security review matches its recorded range. label Sep 24, 2026
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Another round soon, please!

Reviewed commit: 538167a788

ℹ️ 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".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@brow
brow marked this pull request as ready for review September 24, 2026 14:00
@brow
brow requested a review from a team as a code owner September 24, 2026 14:00
@github-actions github-actions Bot removed the codex-security-review-current The posted Codex security review matches its recorded range. label Sep 24, 2026

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Carl, an automated reviewer, commenting via Wes’s GitHub account.

Review clear: no actionable defects found at 538167a78837d26bbebd9da47726ab118350e3cf.

  • Independent binary inspection confirms both Inter assets remove only U+2764 and U+26A0 from all four Unicode cmap records. Other mappings and font tables are unchanged apart from the required checksum adjustment; table and whole-font checksums validate.
  • Traced the assets through the global theme, regular/italic message rendering, reaction widgets, and enlarged emoji-only messages. The digest tests pin the shipped assets in the existing mobile lane, and the visual fixture uses production widgets.
  • Existing exact-head Mobile CI succeeded. This review was source-only: no builds/tests, regeneration, or native screenshot checks were executed. Android appearance and broader OS/text-scaling layouts remain unvalidated. The documented iOS text-selector color fallback and line-height changes are not treated as defects.

@jedwards27 jedwards27 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

:bot: Jude’s code review agent

Verdict: APPROVE

Reviewed exact head 538167a78837d26bbebd9da47726ab118350e3cf against base b6a26556ec904cdebe0fbc7e6c25b4ea2cf294d1. No author-actionable defects found.

Integrated review evidence

  • Reproduced both generated fonts from the pinned pristine source using the pinned fonttools==4.60.1; regular and italic outputs were byte-identical to the committed assets. Independent inspection confirmed that every Unicode cmap loses exactly U+2764 and U+26A0, non-cmap tables remain byte-identical, and whole-font checksums are valid.
  • Verified the asset regression seam with both a passing full-digest test and a mutation control that failed for the independently replaced regular asset. The shipped assets are bound through mobile/pubspec.yaml:70-75 and the global Inter theme at mobile/lib/shared/theme/app_theme.dart:90-98.
  • Traced production rendering through ReactionRow / NativeEmojiGlyph, MessageContent markdown styles, and both channel/thread scaleEmojiOnly callers. The visual fixture instantiates the production widgets and exercises the 36sp emoji-only branch (mobile/test/visual/heart_sim_app.dart:56-75).
  • just mobile-check mobile-test passed at the pinned head: 2,410 tests passed, 4 skipped, plus the unconfigured-build suite. Exact-head Mobile and Mobile Swift CI also passed, including Android APK and iOS simulator/unsigned release builds.
  • Native iOS evidence was independently reproduced on iPhone 17 Pro / iOS 26.5. A fresh 1206×2622 screenshot showed colored, unclipped heart/warning fallback in selected and unselected reaction pills; plain, emoji, and VS15 message text; bold/italic spans; and enlarged emoji-only rendering. Preserved symbols/languages remained visually intact. Screenshot SHA-256: d8cedc3fe66a1a3f86c274c4d2f526748bfd74529f53fd268b82b1064fd0eec1.
  • Upgrade and rollback behavior is documented and reproducible in mobile/assets/fonts/README.md:11-28,49-52.

Residual confidence gaps

  • Android native appearance remains unobserved; CI proves packaging/build, not platform glyph selection, color, metrics, wrapping, or VS15 behavior. Author action: none. Verification owner: Android/release QA on a representative emulator or device before broad rollout.
  • Large text scales, dark mode, and a native accessibility/semantics snapshot were not exercised. The change is asset-only and default-scale iOS production-widget rendering is sound. Author action: none. Verification owner: mobile release QA/accessibility sweep.
  • The checked-in pixel verifier is device/OS/coordinate-specific and supplemental rather than CI-bound. Author action: none. Verification owner: future font-upgrade reviewer rerunning the documented native fixture.
  • Reviewer post-build worktree cleanliness was not verified because concurrent cleanup removed the worktree registration after native evidence capture. Exact-head and clean state were recorded before the native build; this is reviewer hygiene, not a PR defect. Author action: none. Verification owner: review workflow owner.

Residual risk is platform-specific fallback behavior outside iOS 26.5, not unresolved author rework.

@brow
brow merged commit 9462d88 into main Sep 24, 2026
86 checks passed
@brow
brow deleted the fix-mobile-heart-emoji branch September 24, 2026 14:30
wpfleger96 pushed a commit that referenced this pull request Sep 24, 2026
…n-surface

* origin/main:
  fix(ci): consume the published MinIO image (#7870)
  fix(mobile): converge sidebar managers on relay head with resume re-read (#7806)
  fix(ci): bootstrap the reusable MinIO image in GHCR (#7869)
  Discover alternate Buzz ACP commands (#6948)
  fix(hooks): surface nextest failures and stale pnpm deps in pre-push (#7850)
  feat(acp): run one prepared task from a file or stdin (#7851)
  Fix mobile heart and warning emoji with native font fallback (#7842)
  chore(mesh): upgrade MeshLLM to 0.76.2 (#7559)
  feat(agents): humanize uncurated Databricks model ids with a label grammar (#7844)
  fix: route databricks claude fqns to anthropic messages (#7829)
  feat(relay): add opt-in newest-first thread windows (#7823)
  refactor: move agent Git bootstrap into ACP harness (#7819)
  Use worker snapshots for relay storage metrics (#7845)
  fix(hooks): strip repo-local git env from pre-push test lanes (#7841)
  fix(mobile-infra): render push grant lifetimes as decimal in chart 0.3.2 (#7820)

Signed-off-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz>
wpfleger96 pushed a commit that referenced this pull request Sep 24, 2026
…rcement

* origin/main:
  fix(ci): consume the published MinIO image (#7870)
  fix(mobile): converge sidebar managers on relay head with resume re-read (#7806)
  fix(ci): bootstrap the reusable MinIO image in GHCR (#7869)
  Discover alternate Buzz ACP commands (#6948)
  fix(hooks): surface nextest failures and stale pnpm deps in pre-push (#7850)
  feat(acp): run one prepared task from a file or stdin (#7851)
  Fix mobile heart and warning emoji with native font fallback (#7842)
  chore(mesh): upgrade MeshLLM to 0.76.2 (#7559)
  feat(agents): humanize uncurated Databricks model ids with a label grammar (#7844)

Co-authored-by: Will Pfleger <pfleger.will@gmail.com>
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>

# Conflicts:
#	Cargo.lock
#	crates/buzz-relay/Cargo.toml
wpfleger96 pushed a commit that referenced this pull request Sep 24, 2026
…ead-counters

Co-authored-by: Will Pfleger <pfleger.will@gmail.com>
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>

* origin/main:
  chore(release): release Buzz Desktop version 0.5.25 (#7867)
  fix(ci): consume the published MinIO image (#7870)
  fix(mobile): converge sidebar managers on relay head with resume re-read (#7806)
  fix(ci): bootstrap the reusable MinIO image in GHCR (#7869)
  Discover alternate Buzz ACP commands (#6948)
  fix(hooks): surface nextest failures and stale pnpm deps in pre-push (#7850)
  feat(acp): run one prepared task from a file or stdin (#7851)
  Fix mobile heart and warning emoji with native font fallback (#7842)
  chore(mesh): upgrade MeshLLM to 0.76.2 (#7559)

Signed-off-by: Hayt <211b96e6a2b7f45fd4047988976c7bbbeeda0c15f3ae7b32eec20834b5a55118@buzz.block.builderlab.xyz>
wpfleger96 pushed a commit that referenced this pull request Sep 24, 2026
…c-agent-commit-identity

* origin/main:
  fix(mobile): keep retired sections manager out of successor cache (#7873)
  Select one feature flag provider at compile time (#7677)
  chore(release): release Buzz Desktop version 0.5.25 (#7867)
  fix(ci): consume the published MinIO image (#7870)
  fix(mobile): converge sidebar managers on relay head with resume re-read (#7806)
  fix(ci): bootstrap the reusable MinIO image in GHCR (#7869)
  Discover alternate Buzz ACP commands (#6948)
  fix(hooks): surface nextest failures and stale pnpm deps in pre-push (#7850)
  feat(acp): run one prepared task from a file or stdin (#7851)
  Fix mobile heart and warning emoji with native font fallback (#7842)
  chore(mesh): upgrade MeshLLM to 0.76.2 (#7559)
  feat(agents): humanize uncurated Databricks model ids with a label grammar (#7844)

Signed-off-by: Hayt <211b96e6a2b7f45fd4047988976c7bbbeeda0c15f3ae7b32eec20834b5a55118@buzz.block.builderlab.xyz>

# Conflicts:
#	Cargo.lock
TheSentinel454 added a commit that referenced this pull request Sep 24, 2026
…undation-local

* origin/main: (50 commits)
  feat(desktop): relay admin console for the /api/admin/v1 operator surface (#4768)
  fix(mobile): keep retired sections manager out of successor cache (#7873)
  Select one feature flag provider at compile time (#7677)
  chore(release): release Buzz Desktop version 0.5.25 (#7867)
  fix(ci): consume the published MinIO image (#7870)
  fix(mobile): converge sidebar managers on relay head with resume re-read (#7806)
  fix(ci): bootstrap the reusable MinIO image in GHCR (#7869)
  Discover alternate Buzz ACP commands (#6948)
  fix(hooks): surface nextest failures and stale pnpm deps in pre-push (#7850)
  feat(acp): run one prepared task from a file or stdin (#7851)
  Fix mobile heart and warning emoji with native font fallback (#7842)
  chore(mesh): upgrade MeshLLM to 0.76.2 (#7559)
  feat(agents): humanize uncurated Databricks model ids with a label grammar (#7844)
  fix: route databricks claude fqns to anthropic messages (#7829)
  feat(relay): add opt-in newest-first thread windows (#7823)
  refactor: move agent Git bootstrap into ACP harness (#7819)
  Use worker snapshots for relay storage metrics (#7845)
  fix(hooks): strip repo-local git env from pre-push test lanes (#7841)
  fix(mobile-infra): render push grant lifetimes as decimal in chart 0.3.2 (#7820)
  fix(agent): preserve Databricks Opus UC reasoning and tool continuation (#7840)
  ...
Signed-off-by: tornquist <tornquist@squareup.com>
TheSentinel454 added a commit that referenced this pull request Sep 24, 2026
…t/osc-event-write-chokepoint

* commit 'a6a3032e446e6e66e8e41a229ef655ea79f36202': (50 commits)
  feat(desktop): relay admin console for the /api/admin/v1 operator surface (#4768)
  fix(mobile): keep retired sections manager out of successor cache (#7873)
  Select one feature flag provider at compile time (#7677)
  chore(release): release Buzz Desktop version 0.5.25 (#7867)
  fix(ci): consume the published MinIO image (#7870)
  fix(mobile): converge sidebar managers on relay head with resume re-read (#7806)
  fix(ci): bootstrap the reusable MinIO image in GHCR (#7869)
  Discover alternate Buzz ACP commands (#6948)
  fix(hooks): surface nextest failures and stale pnpm deps in pre-push (#7850)
  feat(acp): run one prepared task from a file or stdin (#7851)
  Fix mobile heart and warning emoji with native font fallback (#7842)
  chore(mesh): upgrade MeshLLM to 0.76.2 (#7559)
  feat(agents): humanize uncurated Databricks model ids with a label grammar (#7844)
  fix: route databricks claude fqns to anthropic messages (#7829)
  feat(relay): add opt-in newest-first thread windows (#7823)
  refactor: move agent Git bootstrap into ACP harness (#7819)
  Use worker snapshots for relay storage metrics (#7845)
  fix(hooks): strip repo-local git env from pre-push test lanes (#7841)
  fix(mobile-infra): render push grant lifetimes as decimal in chart 0.3.2 (#7820)
  fix(agent): preserve Databricks Opus UC reasoning and tool continuation (#7840)
  ...

Signed-off-by: tornquist <tornquist@squareup.com>

# Conflicts:
#	crates/buzz-db/src/store/event.rs
brow added a commit that referenced this pull request Sep 25, 2026
…ction

* origin/main: (21 commits)
  docs(vision): add /buzz/v1 read endpoints to the protocol contract (#7879)
  🤖 fix(justfile): point just staging at the current staging relay (#7881)
  fix(relay-admin): make thread deletions atomic and fence expired action leases under row lock (#7853)
  feat(desktop): relay admin console for the /api/admin/v1 operator surface (#4768)
  fix(mobile): keep retired sections manager out of successor cache (#7873)
  Select one feature flag provider at compile time (#7677)
  chore(release): release Buzz Desktop version 0.5.25 (#7867)
  fix(ci): consume the published MinIO image (#7870)
  fix(mobile): converge sidebar managers on relay head with resume re-read (#7806)
  fix(ci): bootstrap the reusable MinIO image in GHCR (#7869)
  Discover alternate Buzz ACP commands (#6948)
  fix(hooks): surface nextest failures and stale pnpm deps in pre-push (#7850)
  feat(acp): run one prepared task from a file or stdin (#7851)
  Fix mobile heart and warning emoji with native font fallback (#7842)
  chore(mesh): upgrade MeshLLM to 0.76.2 (#7559)
  feat(agents): humanize uncurated Databricks model ids with a label grammar (#7844)
  fix: route databricks claude fqns to anthropic messages (#7829)
  feat(relay): add opt-in newest-first thread windows (#7823)
  refactor: move agent Git bootstrap into ACP harness (#7819)
  Use worker snapshots for relay storage metrics (#7845)
  ...

Signed-off-by: Tom Brow <tomb@block.xyz>
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.

3 participants