Skip to content

feat(biometric): probe.biometric_signal + port-range fallback (v0.9.8)#111

Merged
pbertsch merged 1 commit into
mainfrom
feat/biometric-signal
May 13, 2026
Merged

feat(biometric): probe.biometric_signal + port-range fallback (v0.9.8)#111
pbertsch merged 1 commit into
mainfrom
feat/biometric-signal

Conversation

@pbertsch
Copy link
Copy Markdown
Contributor

Summary

  • Fix iOS 26+ biometric no-match: faceCapture.no-match notifyutil notifications no longer resolve LAContext.evaluatePolicy on iOS 26 / Xcode 26.5. Added a new probe.biometric_signal {result: bool} JSON-RPC command that the CLI sends after platform-level biometric commands. Apps call awaitBiometricResult() from flutter_probe_agent (new public function) instead of local_auth.authenticate() in PROBE_AGENT builds — the result is delivered via a Dart Completer, bypassing LAContext entirely.
  • Port-range fallback: ProbeServer now tries ports 48686–48695 when the preferred port is busy. For each busy port, it checks GET /probe/status to detect whether another probe agent is already running, then logs PROBE_PORT_BUSY=<n> (another probe agent is running) or PROBE_PORT_BUSY=<n> accordingly. New /probe/status endpoint returns {"agent":"flutter_probe","version":"..."} without requiring a token.

Test plan

  • go test ./... — all 16 packages pass
  • dart analyze lib/ — no issues in probe_agent
  • 18/18 auth tests pass on iPhone 17 Pro (iOS 26.4) simulator including all 4 biometric tests (biometric_match.probe × 2, biometric_no_match.probe × 2) running in sequence
  • biometric match → navigates to Dashboard ✓
  • biometric no match → shows "Authentication failed" banner ✓
  • retry after no-match → biometric match → Dashboard ✓
  • cold-start match via restart the app

🤖 Generated with Claude Code

…h (v0.9.8)

iOS 26 / Xcode 26.5 changed faceCapture.no-match so notifyutil no longer
resolves LAContext.evaluatePolicy. The CLI now sends probe.biometric_signal
after platform biometric commands; apps call awaitBiometricResult() from
flutter_probe_agent to receive the result via a Dart Completer, bypassing
the LAContext entirely in PROBE_AGENT builds.

Also adds port-range fallback to ProbeServer: on bind failure, tries the
next 10 ports (48686-48695) and emits PROBE_PORT_BUSY=<n> with a "(another
probe agent is running)" hint when the occupied port responds to
GET /probe/status with the probe-agent signature.
@pbertsch pbertsch requested a review from a team as a code owner May 13, 2026 02:42
@pbertsch pbertsch merged commit 88ee2da into main May 13, 2026
13 checks passed
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