Skip to content

fix(mobile): temporarily disable age gating - #7708

Merged
brow merged 1 commit into
mainfrom
disable-mobile-age-block
Sep 17, 2026
Merged

brow merged 1 commit into
mainfrom
disable-mobile-age-block

Conversation

@brow

@brow brow commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

Disable the mobile launch age gate to restore access for users locked out after updating. The production provider now allows access immediately without calling the platform age API, while preserving the existing push snapshot restoration path.

This is a temporary disable of age enforcement on both mobile platforms. The original gate implementation remains available for a separate follow-up.

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

Copy link
Copy Markdown

🔐 Codex Security Review

Status: review required for the current range.

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

@brow

brow commented Sep 17, 2026

Copy link
Copy Markdown
Contributor Author

@codex review

@brow

brow commented Sep 17, 2026

Copy link
Copy Markdown
Contributor Author

@builderbot review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 17, 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-17T15:02:47.772527Z b5b9ecd 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 brow changed the title fix(mobile): disable launch age blocking fix(mobile): disable age gate Sep 17, 2026
@brow brow changed the title fix(mobile): disable age gate fix(mobile): temporarily disable age gating Sep 17, 2026
@brow
brow marked this pull request as ready for review September 17, 2026 14:59
@brow
brow requested a review from a team as a code owner September 17, 2026 14:59

@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.

Verdict: APPROVE

Reviewed: 6b1e45d2f6084a3754a09bb1b800f370ce5399dd..b5b9ecd2d23af1f702e684b01dd031cb2a673c59 (exact head b5b9ecd2d23af1f702e684b01dd031cb2a673c59)

Risk: medium — this deliberately changes the mobile launch gate on both platforms and must preserve recovery of push state left suspended by prior enforcement.

Behavior/contracts traced: production Riverpod provider → App launch rendering → AgeSignalPushBootstrap → serialized community snapshot restoration and the iOS age-gate writer; Android's intentionally inapplicable snapshot bridge; retained injectable enforcement implementation; locked-out and already-admitted journeys; platform parity and failure/retry behavior.

Findings: no blocking or non-blocking code defects found.

The production provider now starts synchronously in allowed, and repeated request() calls are inert (mobile/lib/features/age_gate/age_signal_provider.dart:254-266). That bypasses the checking/retry/restriction replacements and mounts the normal authenticated or pairing journey immediately (mobile/lib/app.dart:297-314,335-405) without invoking either native age channel. Because the shared Dart provider is the platform boundary, the behavior is consistent on iOS and Android while the prior enforcement notifier remains available through explicit test overrides.

The allowed state still drives the strict restoration path and mounts BuzzPushBootstrap (mobile/lib/features/age_gate/age_signal_push_bootstrap.dart:74-127). The serialized snapshot sync reloads persisted communities, clears the age-check suspension fence, and writes through the acknowledged age-gate path (mobile/lib/shared/community/community_provider.dart:230-291); iOS replacement/fence settlement remains intact, while Android remains intentionally inapplicable. Restoration failure remains retried rather than silently converting to success.

The production-seam regression proves immediate normal content, no checking semantics, one relay initialization, zero native age calls, zero suspension, and strict restoration retry after an injected failure (mobile/test/features/age_gate/age_gate_app_test.dart:99-156). The provider regression proves repeated requests remain allowed without channel calls (mobile/test/features/age_gate/age_signal_provider_test.dart:16-39). Causal mutation back to AgeSignalNotifier.new made the new expectations fail (allowed became checking; native requests became 2), then restoring exact bytes passed the focused suite.

Author action: none.

Verification owner: CI/release gate for the remaining exact-head jobs; reviewer/tooling or mobile release validation for optional native launch observation.

Validation at matching exact head:

  • PASS — git diff --check; complete three-file diff and callers/consumers reviewed; no open GitHub review threads.
  • PASS — just mobile-check (574 files format-clean; Flutter analyze reported no issues).
  • PASS — full just mobile-test using the repository gateway configuration: 2237 passed / 4 skipped, plus 3 passed in the unconfigured-build suite.
  • PASS — 34/34 focused age-gate tests after causal mutation/restoration.
  • PASS — DCO, Semgrep OSS, zizmor, and the completed relevant mobile configured/unconfigured tests plus Swift build/test/simulator gates reported by exact-head CI. Some aggregate/build jobs were still running at submission; those gates retain merge-readiness ownership.

Manual/native evidence: not run. No physical-device/simulator launch or signed release artifact was independently observed in this review.

Residual risk: packaging/runtime wiring on a native launch remains unwitnessed despite production-seam widget coverage. Users previously confirmed restricted retain the durable push opt-out written by the old path; this patch restores app access but conservatively does not silently re-consent push, so they must explicitly re-enable it.

@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.

Reviewed exact head b5b9ecd2d23af1f702e684b01dd031cb2a673c59 against base 6b1e45d2f6084a3754a09bb1b800f370ce5399dd.

The temporary bypass is narrowly contained at the production provider seam: production begins synchronously allowed and does not call the native age channel, while explicit test overrides retain coverage of the dormant enforcement implementation. The existing bootstrap still follows strict push-snapshot restoration, including retry behavior, so a prior suspended/empty snapshot can recover without silently changing durable push consent.

Regression evidence at this head covers immediate normal app mounting, no checking/restriction UI, zero native age requests, one relay initialization, no new suspension, strict restoration retry, and repeated no-op requests. Independent exact-head validation passed formatting, Flutter analysis, the canonical full mobile suite (2237 passed / 4 skipped plus 3 unconfigured-build tests), 34 focused tests, and a causal mutation that failed when the production notifier was restored. No concrete author-actionable defect remains.

Confidence gaps, not author actions: no physical-device or signed-release launch was observed. Final exact-head GitHub jobs, including Clients / Mobile, were still running when this review was submitted; those named CI/release gates own that residual verification.

— :bot: Jude’s code review agent

@brow
brow enabled auto-merge (squash) September 17, 2026 15:17
@rileycrane

Copy link
Copy Markdown

No concrete blocking findings.
The production provider starts allowed and never calls the native age API. Startup still restores push snapshots with retries. The updated tests exercise the real provider and check normal app mounting, zero native age requests, and restoration retry.

One recovery caveat: users whose previous restriction persisted push notifications as disabled regain app access, but must explicitly re-enable notifications. This patch does not reset that preference.

Mobile and Mobile Swift CI passed. This was a source review; I did not independently run tests or a device upgrade workflow.

@rileycrane
rileycrane self-requested a review September 17, 2026 15:20

@rileycrane rileycrane 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.

LGTM

@brow
brow merged commit d1cae93 into main Sep 17, 2026
119 of 122 checks passed
@brow
brow deleted the disable-mobile-age-block branch September 17, 2026 16:30
wpfleger96 pushed a commit that referenced this pull request Sep 21, 2026
* origin/main: (75 commits)
  fix(workflows): make deletion persistent and retryable (#7735)
  fix(mobile): preserve thread replies through refresh failures (#7757)
  fix(mobile): keep iOS message menu actions responsive after rebuilds (#7758)
  fix(relay): exclude ephemeral activity from message quota (#7736)
  release: push gateway chart 0.3.1 (#7749)
  fix(push): label plaintext push gateway service as HTTP (#7717)
  Replace personal and internal data in desktop test fixtures (#7748)
  Add mobile VISION (#7710)
  fix(mobile): keep relay sessions stable during push lease updates (#7745)
  fix(desktop): keep managed agent avatars usable across communities (#7732)
  fix(mobile): fail open when age checks are unavailable (#7714)
  fix(ci): don't run desktop tests for purely mobile client changes (#7709)
  fix(mobile): temporarily disable age gating (#7708)
  feat(db): expose connection setup metrics (#7286)
  Isolate S3 storage metrics from the relay (#7543)
  fix(web): route mobile invite downloads to app stores (#7702)
  feat(mobile): show build number with version in settings (#7697)
  release(mobile-infra): buzz-push-gateway 0.3.0 (#7685)
  Add authenticated WebSocket recovery telemetry (#7546)
  Instrument database pool roles (#7356)
  ...

# Conflicts:
#	crates/buzz-db/src/runtime/migration.rs
wpfleger96 pushed a commit that referenced this pull request Sep 21, 2026
* origin/main: (81 commits)
  fix(mobile): avoid opening empty threads on message tap (#7756)
  fix(workflows): make deletion persistent and retryable (#7735)
  fix(mobile): preserve thread replies through refresh failures (#7757)
  fix(mobile): keep iOS message menu actions responsive after rebuilds (#7758)
  fix(relay): exclude ephemeral activity from message quota (#7736)
  release: push gateway chart 0.3.1 (#7749)
  fix(push): label plaintext push gateway service as HTTP (#7717)
  Replace personal and internal data in desktop test fixtures (#7748)
  Add mobile VISION (#7710)
  fix(mobile): keep relay sessions stable during push lease updates (#7745)
  fix(desktop): keep managed agent avatars usable across communities (#7732)
  fix(mobile): fail open when age checks are unavailable (#7714)
  fix(ci): don't run desktop tests for purely mobile client changes (#7709)
  fix(mobile): temporarily disable age gating (#7708)
  feat(db): expose connection setup metrics (#7286)
  Isolate S3 storage metrics from the relay (#7543)
  fix(web): route mobile invite downloads to app stores (#7702)
  feat(mobile): show build number with version in settings (#7697)
  release(mobile-infra): buzz-push-gateway 0.3.0 (#7685)
  Add authenticated WebSocket recovery telemetry (#7546)
  ...

Signed-off-by: Hayt <9e1c23a3fd83f61da34420e4e88ff1b16e45cafcc0cd9019eb07d4ecfa8ca9b0@buzz.block.builderlab.xyz>
wpfleger96 pushed a commit that referenced this pull request Sep 21, 2026
* origin/main: (75 commits)
  fix(workflows): make deletion persistent and retryable (#7735)
  fix(mobile): preserve thread replies through refresh failures (#7757)
  fix(mobile): keep iOS message menu actions responsive after rebuilds (#7758)
  fix(relay): exclude ephemeral activity from message quota (#7736)
  release: push gateway chart 0.3.1 (#7749)
  fix(push): label plaintext push gateway service as HTTP (#7717)
  Replace personal and internal data in desktop test fixtures (#7748)
  Add mobile VISION (#7710)
  fix(mobile): keep relay sessions stable during push lease updates (#7745)
  fix(desktop): keep managed agent avatars usable across communities (#7732)
  fix(mobile): fail open when age checks are unavailable (#7714)
  fix(ci): don't run desktop tests for purely mobile client changes (#7709)
  fix(mobile): temporarily disable age gating (#7708)
  feat(db): expose connection setup metrics (#7286)
  Isolate S3 storage metrics from the relay (#7543)
  fix(web): route mobile invite downloads to app stores (#7702)
  feat(mobile): show build number with version in settings (#7697)
  release(mobile-infra): buzz-push-gateway 0.3.0 (#7685)
  Add authenticated WebSocket recovery telemetry (#7546)
  Instrument database pool roles (#7356)
  ...
wpfleger96 pushed a commit that referenced this pull request Sep 21, 2026
* origin/main: (75 commits)
  fix(workflows): make deletion persistent and retryable (#7735)
  fix(mobile): preserve thread replies through refresh failures (#7757)
  fix(mobile): keep iOS message menu actions responsive after rebuilds (#7758)
  fix(relay): exclude ephemeral activity from message quota (#7736)
  release: push gateway chart 0.3.1 (#7749)
  fix(push): label plaintext push gateway service as HTTP (#7717)
  Replace personal and internal data in desktop test fixtures (#7748)
  Add mobile VISION (#7710)
  fix(mobile): keep relay sessions stable during push lease updates (#7745)
  fix(desktop): keep managed agent avatars usable across communities (#7732)
  fix(mobile): fail open when age checks are unavailable (#7714)
  fix(ci): don't run desktop tests for purely mobile client changes (#7709)
  fix(mobile): temporarily disable age gating (#7708)
  feat(db): expose connection setup metrics (#7286)
  Isolate S3 storage metrics from the relay (#7543)
  fix(web): route mobile invite downloads to app stores (#7702)
  feat(mobile): show build number with version in settings (#7697)
  release(mobile-infra): buzz-push-gateway 0.3.0 (#7685)
  Add authenticated WebSocket recovery telemetry (#7546)
  Instrument database pool roles (#7356)
  ...
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
atishpatel pushed a commit to atishpatel/buzz that referenced this pull request Sep 21, 2026
…p-20260915

* origin/main: (28 commits)
  fix(mobile): avoid opening empty threads on message tap (block#7756)
  fix(workflows): make deletion persistent and retryable (block#7735)
  fix(mobile): preserve thread replies through refresh failures (block#7757)
  fix(mobile): keep iOS message menu actions responsive after rebuilds (block#7758)
  fix(relay): exclude ephemeral activity from message quota (block#7736)
  release: push gateway chart 0.3.1 (block#7749)
  fix(push): label plaintext push gateway service as HTTP (block#7717)
  Replace personal and internal data in desktop test fixtures (block#7748)
  Add mobile VISION (block#7710)
  fix(mobile): keep relay sessions stable during push lease updates (block#7745)
  fix(desktop): keep managed agent avatars usable across communities (block#7732)
  fix(mobile): fail open when age checks are unavailable (block#7714)
  fix(ci): don't run desktop tests for purely mobile client changes (block#7709)
  fix(mobile): temporarily disable age gating (block#7708)
  feat(db): expose connection setup metrics (block#7286)
  Isolate S3 storage metrics from the relay (block#7543)
  fix(web): route mobile invite downloads to app stores (block#7702)
  feat(mobile): show build number with version in settings (block#7697)
  release(mobile-infra): buzz-push-gateway 0.3.0 (block#7685)
  Add authenticated WebSocket recovery telemetry (block#7546)
  ...

Signed-off-by: Brainy Bumble <0ed7657b57c0e8a9f5288390dd6c8d5d0a3a06abe9b01b9006814f52077d6cdf@buzz.block.builderlab.xyz>
shellz-n-stuff added a commit that referenced this pull request Sep 21, 2026
…ecurity

* origin/main: (22 commits)
  feat(relay): add admin HTTP routes for member restriction management (#7302)
  fix(relay): fire kick live side effects at convergence; persist target; fence re-add race with held lock (#7298)
  feat(relay): add atomic complete read-state snapshots (#7572)
  fix(desktop): register macOS badges for new and existing installs (#7783)
  fix(mobile): avoid opening empty threads on message tap (#7756)
  fix(workflows): make deletion persistent and retryable (#7735)
  fix(mobile): preserve thread replies through refresh failures (#7757)
  fix(mobile): keep iOS message menu actions responsive after rebuilds (#7758)
  fix(relay): exclude ephemeral activity from message quota (#7736)
  release: push gateway chart 0.3.1 (#7749)
  fix(push): label plaintext push gateway service as HTTP (#7717)
  Replace personal and internal data in desktop test fixtures (#7748)
  Add mobile VISION (#7710)
  fix(mobile): keep relay sessions stable during push lease updates (#7745)
  fix(desktop): keep managed agent avatars usable across communities (#7732)
  fix(mobile): fail open when age checks are unavailable (#7714)
  fix(ci): don't run desktop tests for purely mobile client changes (#7709)
  fix(mobile): temporarily disable age gating (#7708)
  feat(db): expose connection setup metrics (#7286)
  Isolate S3 storage metrics from the relay (#7543)
  ...

Signed-off-by: Alex Rosenzweig <arosenzweig@squareup.com>
TheSentinel454 added a commit that referenced this pull request Sep 21, 2026
…ness-overload

* origin/main: (74 commits)
  feat(relay): add admin HTTP routes for member restriction management (#7302)
  fix(relay): fire kick live side effects at convergence; persist target; fence re-add race with held lock (#7298)
  feat(relay): add atomic complete read-state snapshots (#7572)
  fix(desktop): register macOS badges for new and existing installs (#7783)
  fix(mobile): avoid opening empty threads on message tap (#7756)
  fix(workflows): make deletion persistent and retryable (#7735)
  fix(mobile): preserve thread replies through refresh failures (#7757)
  fix(mobile): keep iOS message menu actions responsive after rebuilds (#7758)
  fix(relay): exclude ephemeral activity from message quota (#7736)
  release: push gateway chart 0.3.1 (#7749)
  fix(push): label plaintext push gateway service as HTTP (#7717)
  Replace personal and internal data in desktop test fixtures (#7748)
  Add mobile VISION (#7710)
  fix(mobile): keep relay sessions stable during push lease updates (#7745)
  fix(desktop): keep managed agent avatars usable across communities (#7732)
  fix(mobile): fail open when age checks are unavailable (#7714)
  fix(ci): don't run desktop tests for purely mobile client changes (#7709)
  fix(mobile): temporarily disable age gating (#7708)
  feat(db): expose connection setup metrics (#7286)
  Isolate S3 storage metrics from the relay (#7543)
  ...

Signed-off-by: tornquist <tornquist@squareup.com>
wpfleger96 pushed a commit that referenced this pull request Sep 21, 2026
…rcement

* origin/main: (87 commits)
  feat(relay): add admin HTTP routes for member restriction management (#7302)
  fix(relay): fire kick live side effects at convergence; persist target; fence re-add race with held lock (#7298)
  feat(relay): add atomic complete read-state snapshots (#7572)
  fix(desktop): register macOS badges for new and existing installs (#7783)
  fix(mobile): avoid opening empty threads on message tap (#7756)
  fix(workflows): make deletion persistent and retryable (#7735)
  fix(mobile): preserve thread replies through refresh failures (#7757)
  fix(mobile): keep iOS message menu actions responsive after rebuilds (#7758)
  fix(relay): exclude ephemeral activity from message quota (#7736)
  release: push gateway chart 0.3.1 (#7749)
  fix(push): label plaintext push gateway service as HTTP (#7717)
  Replace personal and internal data in desktop test fixtures (#7748)
  Add mobile VISION (#7710)
  fix(mobile): keep relay sessions stable during push lease updates (#7745)
  fix(desktop): keep managed agent avatars usable across communities (#7732)
  fix(mobile): fail open when age checks are unavailable (#7714)
  fix(ci): don't run desktop tests for purely mobile client changes (#7709)
  fix(mobile): temporarily disable age gating (#7708)
  feat(db): expose connection setup metrics (#7286)
  Isolate S3 storage metrics from the relay (#7543)
  ...

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

# Conflicts:
#	crates/buzz-auth/src/nip98.rs
#	crates/buzz-relay/Cargo.toml
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