Pre-release checklist for the signal-creation wizard (feature/signal-wizard, merged into dev).
The create-signal flow was refactored from a single cramped overlay into an eight-step wizard. Code is verified and merged; the items below are what still needs a human before this ships to users.
1. Bulgarian translation review — required before release
26 new bg keys were written by Claude, not by a native speaker. They are grammatical but unreviewed, and they are the entire user-facing voice of the new flow. Everything is in lib/l10n/app_bg.arb (app_en.arb is the reference).
The two worth checking first:
newSignalHintUrgency — "Червената тревога известява всички доброволци наблизо, така че я пазете за истински спешни случаи." This is the guardrail on Red Alert, the one field that pushes to every nearby subscriber. If the wording is weak, Red gets overused and stops meaning anything.
newSignalPinPlaced — "Щифтът е поставен". Щифт is the literal mechanical "pin"; the map sense may read oddly. Shown on the review screen next to the coordinates.
Full list to review:
| Group |
Keys |
| Navigation |
next, back, skip, change |
| Step counter |
newSignalStepCounter |
| Step titles |
newSignalStep{Location,Photo,Details,Animal,Type,Urgency,Help,Review} |
| Step questions |
newSignalQuestion{Location,Photo,Details,Animal,Type,Urgency,Help,Review} |
| Step hints |
newSignalHint{Location,Photo,Details,Urgency,Review,Help} |
| Review / discard |
newSignalAddPhoto, newSignalNoPhoto, newSignalNotProvided, newSignalPinPlaced, newSignalDiscard{Title,Message,Confirm,Keep} |
| Validation |
pleaseSelectLocation |
Both ARB files are in sync at 403 keys. A duplicate removePhoto key was removed while in there.
Verified on device: the full flow was walked in bg-BG on the Galaxy Tab A8 — every step, the review screen and the discard dialog rendered in Bulgarian with no English fallthrough.
2. The bug this fixes for Bulgarian users
The old form's category dropdown rendered the raw English Signal.signalTypes constants instead of Signal.getLocalizedSignalTypes, so Bulgarian reporters picked their category out of an English list ("Unneutered animals", "Blood donation"). The wizard uses the localized list. Confirmed on device — the step now reads "Спешен случай / Изгубено или намерено / Кръводаряване / Бездомно / Некастрирани животни / Диви животни / Друго".
3. Integration test has never been executed
integration_test/signal_submission_test.dart was rewritten to drive the wizard by stable Semantics identifiers instead of positional finders. It compiles and is analyzer-clean, but it has not been run — it needs a device plus integration_test/test_credentials.json.
Context: the previous version could not have been passing either. It located fields by find.byType(TextField).at(1) and never answered urgency, animal type or help tags, all of which became required with the tags work.
It also now forces test mode on before app.main(). Neither it nor the tests beside it ever did, so a run wrote to the live signals collection and fanned the test signal out to nearby volunteers. map_interaction_test.dart and notification_test.dart still have that problem and should get the same guard.
4. Device verification already done
| Device |
Result |
| Galaxy Tab A8 (Android 14) |
Full flow, submit, photo upload, bg-BG pass |
| Galaxy J6+ (Android 10, 720×1480) |
Full flow, small-screen layout, 3-tag cap |
| iPad 6th gen (iPadOS 17.7.11) |
Full flow via WebDriverAgent, profile build |
| iPhone 17 simulator |
Launch, map render, anonymous sign-in gate |
Checked on each: per-step Next gating; auto-advance on Animal and Urgency but not on the pre-filled Category or the multi-select tags step; Back preserving answers without re-triggering auto-advance; Red Alert confirmation, including that declining leaves urgency unset; review → change location → map → back to review with the pin updated; discard prompt only on a dirty draft.
Four Firestore docs were verified in signals_test — correct geohash (precision 9) matching the confirmed pin, helpNeededTags order preserved, and one photo submission with a real Storage URL in photoUrls.
Not covered: the camera capture path on iOS. The simulator has no camera, and the iPad run used gallery/skip. The equivalent gallery → Storage upload path is verified on Android.
5. Housekeeping
- Four test signals remain in
signals_test from the device runs — safe to leave, or delete.
- The iPad needs Help a Paw reinstalled from the App Store. Automated verification required a profile build, which uses bundle id
com.helpapaw.helpapaw and replaced the store app.
new_signal_form.dart is deleted, deliberately. It was restored once in 91d94d8 as "deleted by mistake"; it is the 476-line overlay the wizard replaces, nothing has referenced it since map_page switched to the location bar, and left in place it no longer compiles against submitSignal's current signature.
- Stale note to remove from
CLAUDE.md: the recorded desktop_webview_auth SIGSEGV at plugin registration did not reproduce — the app launched cleanly on both the simulator and the iPad. The go-ios-tunnel ↔ CoreDevice conflict beside it is real, but it only blocks debug builds; a profile build sidesteps it and is fully automatable.
Pre-release checklist for the signal-creation wizard (
feature/signal-wizard, merged intodev).The create-signal flow was refactored from a single cramped overlay into an eight-step wizard. Code is verified and merged; the items below are what still needs a human before this ships to users.
1. Bulgarian translation review — required before release
26 new
bgkeys were written by Claude, not by a native speaker. They are grammatical but unreviewed, and they are the entire user-facing voice of the new flow. Everything is inlib/l10n/app_bg.arb(app_en.arbis the reference).The two worth checking first:
newSignalHintUrgency— "Червената тревога известява всички доброволци наблизо, така че я пазете за истински спешни случаи." This is the guardrail on Red Alert, the one field that pushes to every nearby subscriber. If the wording is weak, Red gets overused and stops meaning anything.newSignalPinPlaced— "Щифтът е поставен". Щифт is the literal mechanical "pin"; the map sense may read oddly. Shown on the review screen next to the coordinates.Full list to review:
next,back,skip,changenewSignalStepCounternewSignalStep{Location,Photo,Details,Animal,Type,Urgency,Help,Review}newSignalQuestion{Location,Photo,Details,Animal,Type,Urgency,Help,Review}newSignalHint{Location,Photo,Details,Urgency,Review,Help}newSignalAddPhoto,newSignalNoPhoto,newSignalNotProvided,newSignalPinPlaced,newSignalDiscard{Title,Message,Confirm,Keep}pleaseSelectLocationBoth ARB files are in sync at 403 keys. A duplicate
removePhotokey was removed while in there.Verified on device: the full flow was walked in
bg-BGon the Galaxy Tab A8 — every step, the review screen and the discard dialog rendered in Bulgarian with no English fallthrough.2. The bug this fixes for Bulgarian users
The old form's category dropdown rendered the raw English
Signal.signalTypesconstants instead ofSignal.getLocalizedSignalTypes, so Bulgarian reporters picked their category out of an English list ("Unneutered animals", "Blood donation"). The wizard uses the localized list. Confirmed on device — the step now reads "Спешен случай / Изгубено или намерено / Кръводаряване / Бездомно / Некастрирани животни / Диви животни / Друго".3. Integration test has never been executed
integration_test/signal_submission_test.dartwas rewritten to drive the wizard by stableSemanticsidentifiers instead of positional finders. It compiles and is analyzer-clean, but it has not been run — it needs a device plusintegration_test/test_credentials.json.Context: the previous version could not have been passing either. It located fields by
find.byType(TextField).at(1)and never answered urgency, animal type or help tags, all of which became required with the tags work.It also now forces test mode on before
app.main(). Neither it nor the tests beside it ever did, so a run wrote to the livesignalscollection and fanned the test signal out to nearby volunteers.map_interaction_test.dartandnotification_test.dartstill have that problem and should get the same guard.4. Device verification already done
bg-BGpassChecked on each: per-step Next gating; auto-advance on Animal and Urgency but not on the pre-filled Category or the multi-select tags step; Back preserving answers without re-triggering auto-advance; Red Alert confirmation, including that declining leaves urgency unset; review → change location → map → back to review with the pin updated; discard prompt only on a dirty draft.
Four Firestore docs were verified in
signals_test— correctgeohash(precision 9) matching the confirmed pin,helpNeededTagsorder preserved, and one photo submission with a real Storage URL inphotoUrls.Not covered: the camera capture path on iOS. The simulator has no camera, and the iPad run used gallery/skip. The equivalent gallery → Storage upload path is verified on Android.
5. Housekeeping
signals_testfrom the device runs — safe to leave, or delete.com.helpapaw.helpapawand replaced the store app.new_signal_form.dartis deleted, deliberately. It was restored once in91d94d8as "deleted by mistake"; it is the 476-line overlay the wizard replaces, nothing has referenced it sincemap_pageswitched to the location bar, and left in place it no longer compiles againstsubmitSignal's current signature.CLAUDE.md: the recordeddesktop_webview_authSIGSEGV at plugin registration did not reproduce — the app launched cleanly on both the simulator and the iPad. The go-ios-tunnel ↔ CoreDevice conflict beside it is real, but it only blocks debug builds; a profile build sidesteps it and is fully automatable.