Skip to content

EU AI Act first tranche: opt-in face recognition, Social mode gates, the Avenkin AI cue (Plan HP) - #680

Merged
straff2002 merged 17 commits into
mainfrom
feat/hp-eu-ai-act-p1
Oct 6, 2026
Merged

straff2002 merged 17 commits into
mainfrom
feat/hp-eu-ai-act-p1

Conversation

@straff2002

Copy link
Copy Markdown
Owner

Summary

First tranche of the October 2026 EU AI Act review (docs/eu-ai-act-review-2026-10.md, Plan HP). Nothing is taken away from any user; what the law asks for now is disclosed; and the storefront boundary the December 2027 items will need is built, tested and dormant.

Face recognition is opt-in. The switch now defaults off, with a one-time migration that keeps it on for any install that completed onboarding before this build or has a face enrolled, so an existing user loses nothing. There is finally a Settings screen for it (Devices & Privacy › Glasses › Enrolled Faces): the switch, who is enrolled with last-seen, swipe to forget, Forget Everyone. Enrolling a face now goes through the bound-approval card ("Remember this face as Maria? They won't be told."). An organisation profile can pin the feature off. The tool description now says what the feature actually does.

Social mode is never offered on a managed phone or under a Field Assist edition. A pure AssistiveModePolicy routes Social to Scene when refused; the Accessibility settings and the Assistive toggle say why, and the standing copy says it is for personal use, not work or school. It is registered in AIFeatureRegistry with its own switch.

Two switches now do what they claimed. Turning first aid off also stops camera triage (vision_assess kind:first_aid_triage), and a saved recording goes to Deepgram only when cloud diarization is actually on. Speaker identification is no longer tagged biometric: it is a typed name on a per-session cluster id and no voiceprint exists.

"Connecting to Avenkin AI." Said once per launch before the first answer in Direct mode and as a Gemini Live or OpenAI Realtime session connects, mirrored to the HUD. The first conversation an install ever has gets the longer introduction. A Voice setting can turn the cue off (an organisation can pin it on); the introduction, and the line for the other person, cannot be. A translation says "Starting Avenkin AI translation." to the wearer, and when it plays from the phone's loudspeaker the other person also hears, in the language they are being translated into, that this is a live AI translation. Two-way captions label the other person's half "AI translation". The system prompt now says to confirm being an AI whenever asked, whatever persona name or voice is set.

Live translation translates. LiveTranslationService.translate() was a stub that returned the untranslated words with a tag; it now goes through the on-device Apple translation engine the caption tier already uses, and speaks nothing when it cannot translate.

Dormant boundary. MarketAvailabilityPolicy (storefront country × capability × date, EEA list, every restriction nil) and a StoreKit StorefrontReader that today only adds "App Store region" to the support report. Nothing consults the policy yet.

Notice. privacy.html covers opt-in face recognition, Social mode, first-aid triage, the Clinical Assistant persona, a pasted voice ID, and the cue. PrivacyInfo.xcprivacy is deliberately unchanged: face prints never leave the phone and the manifest covers only data that does.

Verification

  • Full OpenGlassesTests on the iPhone 17 Pro simulator: 9,545 executed, 13 skipped, 0 failures after one fix (the store-ownership scrape caught the new migration file; it is on the exempt list with its reason). The security-regression classes from tests.yml ran inside that run.
  • -configuration Release simulator build: succeeded, no warnings in changed files. The phone was paired but not plugged in, so the device Release install is owed.
  • Scripts/check-privacy-logging.sh: passes. gitleaks over f3d90a0d..HEAD (CI form, 16 commits): no leaks. Transport/ and Contracts/ untouched.
  • Localizable.xcstrings untouched (every build ran with SWIFT_EMIT_LOC_STRINGS=NO); the new strings are English-only until the next catalog sync.

Owed after merge

  • Device check of the migration: an upgraded TestFlight install keeps face recognition on; a fresh install starts off.
  • Build-number bump on main, as usual.
  • The four owner decisions in the review §6 (EU storefront facts and dates; face recognition in or out of EU builds; Social mode redesign; triage in Field Assist editions).

🤖 Generated with Claude Code

straff2002 and others added 17 commits October 6, 2026 23:25
…d plan the first tranche

The review takes the positions the September governance plan left open: face recognition is a
remote biometric identification system, the Assistive Social mode is an emotion recognition
system, Article 50 has applied since 2 August 2026, and TestFlight is real-world use. Plan HP is
the first tranche: nothing taken away from any user, everything disclosed, and the storefront
boundary built dormant.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…o already had it

The default moves from on to off. A once-only launch migration seeds the
switch on where onboarding was finished before this build or a face is
enrolled, seeds it off on a fresh install, and leaves a value the wearer
already set alone. An organisation profile can now pin face recognition
off, never on.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…st edition

A request about a person is answered as a scene instead, so no
emotional-state prompt is sent where the app is a work tool. Social mode
gets its own switch, on by default for personal users, and joins the AI
feature inventory as a biometric feature that keeps nothing. The service
publishes why Social mode was refused so the screens can say so.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
vision_assess refuses the first-aid triage kind while the first-aid
switch is off, in the same words the other switched-off tools use, so the
inventory's claim that the switch covers triage is now true. Other
assessment kinds are unaffected.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…tched on

The batch transcriber used to upload whenever a key was present and
HIPAA mode was off. It now takes the same gate as every other diarization
path: the opt-in, a key, and HIPAA mode off. Speaker naming is screened as
not biometric, with the reason recorded beside it: a typed name on a
per-session cluster id, and no voiceprint.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… report says so

A dormant market policy decides whether face recognition, emotion
inference or business first-aid triage is offered on a storefront. Its
restriction table is empty, so every capability stays available
everywhere until it is filled in before December 2027. The storefront is
read from StoreKit and, for now, only printed as one line in the support
report.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…once per session

Two new surfaces join the assessment one, each with its own sentence and
its own once-per-session mark. Nothing speaks them yet.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…op body

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…nrolled and Forget

Settings, Devices & Privacy, Glasses, Enrolled Faces holds the face
recognition switch (read-only with the organisation's name when a profile
pins it off), says the person isn't told and that lawful use is the
wearer's responsibility, lists each enrolled person with when they were
last seen, forgets one by swiping and everyone after a confirmation. The
near-tie message now names this screen instead of "Settings". Row and copy
formatting is a pure type, tested headless.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…told

face_recognition remember is classed as biometric enrolment, a new effect
class that needs a bound approval on every seam whatever agent mode says,
so the shared approval card and the spoken prompt ask "Remember this face
as Maria? They won't be told." before anything is stored. Forget, list and
switching recognition on or off stay unasked. A summary that already ends
its sentence no longer gets a second full stop before "Approve?". The tool
description now says recognition runs only after it is switched on and only
for people the wearer enrolled.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…anslated words

The translator returned "[es→en]" and the original sentence, and the app
spoke that to the person in front of the wearer as a translation. Each
recognised sentence now goes through an injected translator; the app gives
it the on-device Apple Translation engine the translated captions already
use, so nothing leaves the phone. With no translator, or when translation
fails or lands after the session stopped, nothing is spoken. The service
also reports when a session starts, for the translation disclosure.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… it is AI to both people

Once per launch, Direct mode says "Connecting to Avenkin AI." before its
first answer (before any thinking sound), and Gemini Live and OpenAI
Realtime say it through the app's voice before the session takes the audio
route. The install's first conversation ever gets a longer introduction
behind its own done-marker. A translation start says "Starting Avenkin AI
translation." Both short lines follow a new switch under Voice, on by
default, which an organisation profile can pin on but never off; the
introduction ignores it. Lines are mirrored to the HUD.

When a live translation plays from the phone's loudspeaker, the other
person hears once per launch, in the translation's target language where
the catalog has it and in English otherwise, that it is a live AI
translation. Their half of the two-way caption split is labelled "AI
translation" the same way.

The default system prompt says the assistant confirms it is an AI whenever
asked, whatever its name or voice; the persona editor says a name doesn't
change that; agent onboarding introduces an Avenkin AI assistant. Face
recognition pinned off and the cue pinned on are shown read-only rather
than hidden on a managed phone.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…n a work phone

The Assistive Mode settings gain a Social Mode switch and a standing
footer: Social mode describes how a person in front of you seems to feel,
and is for personal use, not at work or at school. On a phone managed by
an organisation, or in a Field Assist edition, the switch is locked and
both the settings and the Assistive toggle say Social mode isn't
available there. The refusal-to-copy mapping is a pure type, tested.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…e and the AI cue

privacy.html (effective 7 October 2026) says face recognition is off by
default, approved per enrolment and that the person isn't told, and points
deletion at the Enrolled Faces screen. New paragraphs cover Social mode,
first-aid triage, the Clinical Assistant persona, a pasted ElevenLabs
voice, and the "Connecting to Avenkin AI" cue and its switch.

First-aid coaching and triage had only a release switch, so the switch the
notice names now exists: "First-Aid Coaching and Triage" under Devices &
Privacy, Hardware & Privacy. The privacy manifest is unchanged on purpose:
face prints never leave the phone, and it covers only data that does.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… decisions

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…seconds"

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ith its reason

It writes two booleans and reads the face database, whose owner is already registered.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
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