PrompTugal for iOS

Go / no-go before submission

Checked by review.B against the exact build number to be submitted, once for the TestFlight public link (Beta App Review) and once for the App Store version. Every line must be GO, or the conductor writes down why it is accepted. Release and testflight do not submit until review sends "GO <build>" to the conductor.

Build: 0.4.x (n) · Commit: … · Checked at: hh:mm UTC · Result: pending

Binary

#CheckHowState
G1The upload passed processing: no ITMS-90683 (purpose strings) and no ITMS-91053 (privacy manifests)App Store Connect build status "Ready to Submit"; testflight's tf.py statuspending
G2The built Info.plist has NSCameraUsageDescription, NSFaceIDUsageDescription, NSCalendarsWriteOnlyAccessUsageDescription, NSMicrophoneUsageDescription and NSSpeechRecognitionUsageDescriptionplutil -p on the archive's Info.plist (release)pending
G3Release build: no Debug screen, no debug switch, no launch arguments#if DEBUG in Destinations, PublicSettingsView, PublicShell (checked at 11:30 on dev)pending
G4Cold launch with no network: the agenda and My day show content within 10 s; no spinner forever and no raw error textrelease, on a simulator in airplane modepending
G5Full CI run green on iPhone and iPad for this committhe run's linkpending
G6Ask: a working demo key in the notes, or Ask is absent from the Release build (B1)the screen list in the build, plus the secret setpending
G7Vault: absent, or a working demo key (B2)as abovepending
G8No "Web Summit" on any screen that screenshots show (B3), and no ShortcutWebSummit or web-summit.sgit.ai in the public app (R1)git grep -i "web summit" in PTAgenda AgendaView, plus the screenshots themselvespending
G9The Settings footer shows the non-affiliation notethe pt.notAffiliated screenshot or UI testpending

Metadata

#CheckState
M1Name "PrompTugal: Lisbon Summit"; subtitle, keywords and promotional text match listing-en.md, listing-pt-PT.md and listing-pt-BR.mdpending
M2Every line marked "only if merged" (Ask, Languages, Now, Explore) was removed unless that feature is in this buildpending
M3The pt-PT and pt-BR listings exist only if the app has those localizations. A Portuguese store page with an English-only app is allowed, but then delete the Languages line.pending
M4Screenshots: 6.9", 6.5" and iPad 13". Native screens only, no event name or logo, no status bar with a carrier name, real content (not placeholder)pending
M5The support, marketing and privacy URLs answer 200. The privacy page describes the public app (R3), and the support page has a contact method.pending
M6The App Privacy answers match app-privacy.md for this build (with or without Ask), and agree with PrivacyInfo.xcprivacy. The network audit recheck finds only promptugal.news and openrouter.ai, with N1 to N3 done.pending
M7Age rating answered as in age-rating.md (4+). "Unrestricted web access" is No, and R1 is fixed.pending
M8The review notes are review-notes.md, with only the paragraphs for this build. Contact name, email and phone are set.pending
M9Price free; availability all regions; "Manually release"; Mac and Vision Pro availability untickedpending
M10What's new and the TestFlight "what to test" texts are set in all three languagespending

People

#CheckState
P1No open finding with severity "stuck" from the persona walk-through of this build (status/review.md)pending
P2The conductor's go recorded for this submissionpending

Run 1: summit candidate split/rc2 3de45dd (12:40 UTC): NO-GO, two blockers

#CheckState
G2All five purpose strings are in the project; pt-PT and pt-BR exist for camera, Face ID and calendar, but not for microphone or speechGO (risk: pt text missing for 2 strings, i18n)
G3Vault, All websites and Debug are #if DEBUG onlyGO
G6Ask is reachable from the Now card and from Settings > "Ask, with your own AI key"; the review key is in the notesGO
G7Vault absent in ReleaseGO
G8"Web Summit" appears only in the independence footer (a disclaimer) and in Safari link URLs; WebsitesPublic.json; the ShortcutWebSummit asset is removedGO
M6Native hosts are promptugal.news and openrouter.ai; cookies off; PrivacyInfo declares OtherUserContentNO-GO: N4, WebPage loads linked sites in the app (team)
M8Review notes in the build's scripts/testflight/NO-GO: rc2 has editor's old notes and the old What to Test ("PrompTugal for Web Summit Lisbon"). Copy store/review-notes.txt and store/what-to-test.txt over them (testflight).
N2Vault background task still registeredrisk (apps)
G1, G4, G5, M1–M5, M7, M9, M10, P1, P2Need the build, screenshots and App Store Connectpending

Run 2: split/rc3 98767dd (12:40 UTC): GO on everything checkable in the repository

#CheckState
M6, N4WebPage sends other sites to Safari (team ae618cf, with tests); native hosts are promptugal.news and openrouter.ai; cookies off; PrivacyInfo declares OtherUserContentGO
M8scripts/testflight/review-notes.txt and what-to-test.txt are byte-identical to store/ (testflight a11b10f); no "Web Summit" in What to TestGO
G2All five purpose strings, each in en, pt-PT and pt-BR (i18n b009f5e); the pt texts read correctlyGO
G3, G6, G7, G8Same as run 1; the only other code change is @MainActor in TalkScreens.swift (a fix for the Release build)GO
N2Vault background taskaccepted for this version
G5Full run 391 (id 42480839902) on 98767ddpending: queued at 12:33
G1, G4, M1–M5, M7, M9, M10, P1The uploaded build's processing, a cold launch offline, screenshots, the App Store Connect entries, the persona pass on the screenshotspending: on the build and on release's plan
P2The conductor's gopending

Verdict: rc3 can be submitted once run 391 is green, the upload passes processing, and release's screenshots pass G8 and M4.

Run 3: split/rc4 ce58c5e, the delta from rc3 (12:45 UTC)

#CheckState
G4Offline first launch: agenda-seed.json (201 items) ships in the synced Resources group, but AgendaHub.seedAgenda is never assigned (AgendaSources.swift:133 default { [] }; AgendaSeed in PrompTugalApp.swift:49 is unused). So the agenda is still empty offline on first launch.must-fix (apps): AgendaHub.seedAgenda = { AgendaSeed.events() } in PrompTugalApp.init()
G8, M4Program titles in the seed and the live feed contain "Web Summit" (9 items, for example the Registration row that Now shows first). Allowed in the app, not in screenshots.risk (release): choose screenshot states without these rows
Localization sweep (i18n 5e4ef2b)String(localized:bundle: .module) in AgendaView, ShellParts, PTAgenda and PTNews; catalogs extendedGO
Hosts, WebPage, notes, purpose stringsUnchanged since rc3GO
G5Full run 42481029792 on ce58c5epending

Run 4: split/rc4 d8a5020 (12:50 UTC): GO on everything checkable in the repository

#CheckState
G4AgendaHub.seedAgenda = { AgendaSeed.events() } is set in PrompTugalApp.init(), before ReaderStore is created. The seed's shape (items of date, time, title, place, kind, official, page) matches the live AgendaFeed, so it decodes the same way. Still needs one airplane-mode fresh install on the build.GO in code
N2The vault background task is now #if DEBUG only (in rc4)done
Everything elseAs in runs 2 and 3GO
G5Full run 393 (42481160021) on d8a5020pending (started 12:37)
G1, M1–M10, P1, P2Processing, screenshots (watch the "Web Summit" program titles), App Store Connect entries, the conductor's gopending

Run 5: split/rc5 bea15bb, release's screenshot pipeline and App Store Connect plan (13:00 UTC)

rc5 is rc4 plus release's screenshot filter (-PTHideTerm, DEBUG only, a no-op in Release, with tests) and a seed decode test. The app code a user runs is the same as rc4 d8a5020.

#CheckState
M4, 2.3.3screens.yml builds the Debug configuration, where DebugMode.defaultOn is true (PTCore/Design/Components.swift:293). Every screen therefore gets the native, web or hybrid badge in its toolbar (surfaceKind, PublicShell.swift:91, :151, :228). The iPad sidebar lists Debug, and also Vault and All websites, because debugOnlyScreens exist in every DEBUG build and are not marked debugOnly. Store images would show screens and badges that are not in the submitted build.must-fix before screenshots: (1) the screens test adds -debug.enabled NO (a UserDefaults launch argument; DebugMode reads that key); (2) design marks Vault and All websites debugOnly: true, so the switch hides them too. Then check one iPad image for the sidebar. (release, design)
M4-PTHideTerm "Web Summit" drops program rows and news that contain the term, only in DEBUG. The images show real content minus a few rows, which is acceptable under 2.3.3.GO
Content rights (ASC plan step 10)The plan says "no third-party content". The app shows the summit's public program (third-party content, republished by our newsroom), and Ask shows answers from third-party AI models.change: answer USES_THIRD_PARTY_CONTENT (and that we have the rights to show it) (release)
ASC plan steps 5, 6, 13They read review's files. The files to read are store/listing-*.md (the fenced blocks), store/review-notes.txt and store/what-to-test.txt. The Ask and Languages lines now stay in all three languages, because Ask ships and the pt-PT and pt-BR strings are in the build.GO
ASC plan step 9Answers as in age-rating.md. "Unrestricted web access: No" is now true (N4 fixed).GO
ASC plan step 15Advertising identifier: No (the app reads no IDFA). Any "uses encryption" prompt: no, already in the build.answer ready
AvailabilityThe plan has no step for Mac (Apple silicon) and Vision Pro availability. age-rating.md says untick both.add a step (by hand if the API has none) (release)
G5Run 393 on rc4 d8a5020check

Run 6: the binary is rc4 d8a5020, the screenshots come from rc5 706b153 (13:05 UTC)

The conductor's decision: the binary is rc4 d8a5020. rc5 differs from it only in DEBUG code, test code and the ReaderStore pass-through, which is a no-op in Release. The screenshots are taken from rc5 706b153.

#CheckState
M4706b153: the screens test passes -debug.enabled NO (the DebugMode.key UserDefaults key, read by @AppStorage), so there are no toolbar badges and no Debug row. Vault and All websites are debugOnly: true, so the same switch hides them. In a Release binary they do not exist at all (#if DEBUG).GO in code; one iPad sidebar image to check when screens run on 706b153
M4-PTSampleData is ignored by the public app (no sample source), so the images show the real program from promptugal.news, minus the rows that contain "Web Summit"GO
Binaryrc4 d8a5020: runs 2 to 4 GO; no user-visible difference from rc5GO in the repository
G5Run 393 on d8a5020queued at 13:05 (not started)
G1, G4Processing; a fresh install in airplane mode on the uploaded buildpending
M1–M10release applies the ASC corrections (content rights, IDFA No, Mac and Vision Pro unticked, texts from store/)pending: check release's dry-run output

Run 7: binary rc4 56a630e, screenshots rc5 3e6cd9f (13:16 UTC)

#CheckState
Binarygit diff d8a5020 56a630e -- Apps Packages touches only PTExploreTests, PTWebTests and the PTExplore test target's dependency in Package.swift. The product code is byte-identical to d8a5020, so runs 2 to 6 still apply.GO in the repository
G5Run 393: every app build and app test green; two package test targets did not compile (fixed in 56a630e). Run 394 (42484035275) on 56a630e: pending at 13:16.pending
Screenshotsrc5 3e6cd9f = 706b153 plus rc4's test fixesas run 6

Run 8: status at 13:58 UTC

#CheckState
G5Run 394 on rc4 56a630e: 22 of 28 jobs green, including the PrompTugal Release build, the Debug build, and the unit tests on iPhone and iPad. PTVaultUI, PTNews, PTAsk, PTWeb and PTAgenda package tests are running; nothing has failed.in progress
ASC planrelease.md on rc5 7766e2a has review's corrections: content rights USES_THIRD_PARTY_CONTENT, IDFA No, Mac and Vision Pro availability unticked by hand (15b), texts from store/.GO (plan)
ASC dry runNot run yetpending
M4Screens on rc5: not run yet. release.md plans about 15:40 on dev.pending (see note)

Note: screenshots at 15:40 plus about 25 minutes leaves little room before the 16:00 freeze, if an image needs a fix. Run screens.yml on rc5 7766e2a now. It has the debug-off fix and the hide_term filter, and its product code matches the binary.

Run 9: screenshots, screens #34 on rc5 7766e2a (14:05 UTC): NO-GO

Artifact appstore-screens-7766e2a…-promptugal: 63 images (7 screens, 3 sizes, en-US, pt-PT, pt-BR).

#FindingOwnerState
S1The system alert "PrompTugal Would Like to Send You Notifications" covers 60 of 63 images. Only en-US 01-now (3 sizes) is clean.team (product), release (test)blocker
S1aCause in the product: MyProgramView.swift:84-86 asks for notification permission in .task(id: picksOn) (picksOn is true by default) whenever My program is built, with no tap. The TabView builds it at launch. That contradicts the review notes, the privacy page and askOnceWhenUseful (ask on the first pick).teamfix in the binary: keep currentAuthorization() and reschedule(), drop requestAuthorization()
S1bCause in the test: -PTSeedPicks fires askOnceWhenUseful. ScreensTests must tap the springboard's Allow before each screenshot.releasefix
S2The en-US 12-hour time column wraps ("11:05 A" / "M") on Now, iPhone and iPaddesignfix: lineLimit(1) and a wider column, or 24-hour Lisbon time
S3iPad sidebar: Now, My program, Explore, News; More: Ask, Settings, Reminders. No Vault, All websites, Debug or badges.GO
S4No "Web Summit" in the clean imagesGO so far (pt not visible)
S5pt-PT and pt-BR UI language: cannot be checked, because every pt image is coveredpending the re-run

Review notes step 4 now says the permission is asked on the first pick or from the Reminders toggle (store/review-notes.txt). testflight copies it again.

Run 10: submission candidate split/rc7 7f961a0 (14:08 UTC): GO in the repository

The delta from rc4 56a630e is the rc5 parts already passed (screenshot filter, debug-off, debugOnly rows, ScreensTests alert dismissal), plus:

#CheckState
S1aMyProgramView .task(id: picksOn) no longer asks for notification permission; it only reads the authorization and reschedules. Permission is now asked in three places: the "Remind me before each talk" toggle when switched on (a tap), the first pick (askOnceWhenUseful, a tap), and the web bridge's native "Turn on reminders?" alert (a tap). That matches review-notes step 4 and the privacy page.GO
S2Now's time column is as wide as a hidden "88:88 AM" (lineLimit(1), fixedSize), so the time never wraps and the rows line upGO in code; check in the next screens run (other screens' time columns too)
Tests@MainActor on WebPageHostTests (test only)GO
G5Full run 396 (42487965688)pending
M4Screens on rc7, with the alert answered "Allow"pending, then the full image and persona pass

rc7 moved to 0279acc (14:06): the only change from 7f961a0 is Packages/PTAgenda/Tests/PTAgendaTests/PickTests.swift (@MainActor, test only). Run 10 holds. The full run is now 397 (42488067819).

rc7 moved to 535e9ba (14:17), the last product change before the freeze. PTExplore/ExploreScreens.swift row time: lineLimit(1), fixedSize() and minWidth: 64 replace the fixed 64 pt width. Layout only, so time ranges and 12-hour times no longer wrap. Run 10 holds; check Explore rows in the next screens run. The full run is now 398 (42488960402).

Run 11: metadata against rc7 535e9ba (14:35 UTC)

#CheckState
M2The descriptions promised "Plan my day … walking times" and named "My day". rc7 has no planner in the public app (PlannerView is reachable only from the Team app's MyDayView), and the tab is My program. The three descriptions and the pt What to Test lines now say My program, time order, clashes marked and free time, and search across talks, speakers, companies and places, which matches ExploreScreens' search prompt.fixed in store/
M1store/listing.json: the three locales with ASC field names, generated and checked (limits, keyword bytes, no markers, no trademark)GO, for release
G5Run 398 on 535e9ba: queued (the runners are busy with screens #36)pending
M4Screens #36 on rc7 535e9ba: three size jobs in progresspending
ASC dry runNo output yet in release.mdpending

Run 12: release's ASC dry run (run 42490544114, 14:36 UTC)

#Finding (from the real record)DecisionOwner
A1The primary locale is en-GB, the record's only localizationKeep en-GB as primary (it holds the existing name). listing.json now has en-GB with the same English text as en-US ("program" kept, because "programme" pushes the subtitle to 31). Keep en-US too, for the US storefront. Screenshots: en-GB reuses the en-US set.review (done), release
A2The App Store version is a stub "1.0" in PREPARE_FOR_SUBMISSIONSet the version string to the binary's marketing version (0.4.x) before attaching the buildrelease
A3What's New on a first versionDrop it: App Store Connect takes no What's New on the first release. listing.json has whatsNewOnFirstVersion: false; the text stays for the next version.release
A4Review details, categories, screenshots and content rights are not setAs planned: review-notes.txt, News and Business, USES_THIRD_PARTY_CONTENT; screenshots from screens #36 once they passrelease
A5Age rating existsOverwrite with age-rating.md (4+), and read it back after savingrelease
M1listing.json diffs cleanly for en-US, pt-PT and pt-BRGO

Run 13: screens #36 on rc7 535e9ba, the iPhone 6.9" set (14:45 UTC)

21 images (7 screens, en-US, pt-PT, pt-BR).

#ImageFindingState
S1allNo notification alert, no debug badges or rowsGO
S201-now, 02-team.schedule, 03-exploreThe time is on one line (12-hour en-US, 24-hour pt)GO
S5all ptThe UI is fully localized (pt-PT: Agora, O meu programa, Explorar, Notícias, Definições; pt-BR: Meu programa, Palestrantes, Reportagens). Content stays in English, as the sources publish it.GO
S604-explore.talkThe Registration item: "bring your ticket QR from the Web Summit app". Also the empty state "Connect to load this talk's times". -PTHideTerm does not reach PTExplore.leave out
S705-news.homeThe lead story's summary: "Brazil's three days at Web Summit". The filter checks titles only.leave out, or filter summaries and re-run
S807-explore.graphThe node label "websummit.com/…" is legibleleave out (labels are not controlled)
S901, 02, 03, 06Clean, native, and they show the core: now and next, my program with a clash, the agenda, peopleGO as the store set (4 per locale and size)
P02 (pt-BR)The date chips truncate ("9 de nov. d…")polish, next version
P02 (pt-PT)"palestra": "sessão" is more Europeanpolish, next version

The 6.5" and iPad 13" artifacts get the same check when they land.

Run 14: screens #36, all sizes; ASC metadata applied (14:50 UTC)

#CheckState
M4The store set is 01-now, 02-team.schedule, 03-explore and 06-explore.people, for APP_IPHONE_69, APP_IPHONE_65 and APP_IPAD_PRO_3GEN_129, in en-US, pt-PT and pt-BR. All 36 checked: no alert, no debug UI, no "Web Summit", times on one line, iPad sidebar clean, pt localized. iPad images are landscape 2752×2064. en-GB reuses en-US.GO: release may upload
M1, M2ASC metadata applied (ios-submit 42491156901): en-GB (primary), en-US, pt-PT, pt-BR; name accepted; content rights; categories; review detailsGO; check against a dry run
M7Age rating applied and read back (ios-submit 42491470177): every boolean false (including unrestrictedWebAccess, userGeneratedContent, messagingAndChat, advertising, socialMedia), every content level NONE, kidsAgeBand unset. That matches age-rating.md: 4+.GO
M6, M9Dinis's hand steps: App Privacy (Other User Content, not linked, no tracking), Mac and Vision Pro unticked, IDFA Nopending
G5Run 398queued
G1, G4The rc7 build is uploaded and processed; airplane-mode fresh installpending

Run 15: dev = rc7 535e9ba (15:07 UTC)

#CheckState
G5Run 398 on 535e9ba: 28 of 28 green; dev is 535e9ba (release v0.4.22)GO
M4Screenshots applied in ASC: 12 sets (4 locales × 3 sizes) × 4 images (ios-submit 42491790589)GO
M8scripts/testflight/review-notes.txt on dev still has the old step 4 ("asked only then"). Since rc7, the first pick asks too.fix: copy store/review-notes.txt; re-apply the ASC review notes if they were set from the old copy
G1, G4Build number, processing, version string, airplane-mode fresh installpending
M6, M9Dinis: App Privacy, Mac and Vision Pro, IDFApending (pinged)

15:09: the ASC version string is 0.4.22 (ios-submit 42493272621). dev is tagged v0.4.22 = 535e9ba plus the version commit. iOS release #103 (42493212548) is building and uploading. Open: build number and processing, airplane check, review-notes step 4 on dev, Dinis's hand steps.

15:10: M8: the ASC App Review notes were applied from store/review-notes.txt at 5d64ad7 (step 4 is new) and confirmed equal at 15:08. testflight 56b60f0 has the recopied file, merged to dev after release #103 uploads, and Beta App Review uses the same file. GO once merged. G4 (airplane-mode fresh install) goes to Dinis on a device. If that cannot happen before 17:30, review accepts it on the code evidence: AgendaHub.seedAgenda is set in PrompTugalApp.init, ReaderStore reads the seed when the cache is empty, and PrompTugalTests checks that the bundled seed decodes (more than 150 events).

15:13: release #103 is still archiving PrompTugal (45f44d8). Open for the final GO: build number and processing VALID; Dinis: App Privacy, Mac and Vision Pro, IDFA; G4 airplane check (or code evidence after 17:30).

15:22: release #103 (v0.4.22) did not upload (release-notes.sh SIGPIPE). dev is tagged v0.4.23 = 3125e3e, with app code identical to 535e9ba (only the release-notes fix, testflight text and version commits). Release #104 (42494256284) uploads it, and the ASC version string is 0.4.23. Run 15 holds for the app; the final GO is on 0.4.23.

15:40: release #104 (3125e3e) is still archiving PrompTugal. Open: build number and processing VALID, attached to 0.4.23; Dinis's hand steps; G4.

16:03: uploaded: PrompTugal 0.4.23 (204) from iOS release #104 (v0.4.23, 3125e3e; app code = 535e9ba). An ios-submit dry run (submit, 0.4.23, build 204, confirm=false) is running: wait-build, compliance, submit plan. Open: processing VALID (G1), the dry-run plan, Dinis's hand steps (M6, M9), G4.

FINAL: GO for PrompTugal 0.4.23 (204), conditional on Dinis's three hand steps (16:05 UTC)

#CheckState
G10.4.23 (204) processed VALID, no ITMS; export compliance usesNonExemptEncryption = false; version 0.4.23 PREPARE_FOR_SUBMISSIONGO
G2, G3, G6, G7, G8, G9Purpose strings (5, each in en, pt-PT, pt-BR); no debug UI in Release; Ask reachable with the review key; Vault absent; no trademark on screen except the independence noteGO (runs 2 to 10)
G4Airplane-mode fresh install: accepted on code evidence (seed wired in PrompTugalApp.init, ReaderStore falls back to it when the cache is empty, PrompTugalTests checks it decodes). Dinis should still confirm it on the TestFlight build.GO (evidence)
G5Run 398 on 535e9ba: 28/28; 3125e3e has identical app codeGO
M1–M5, M7, M8, M10Listings in four locales applied; 12 screenshot sets × 4; URLs live; age rating 4+ read back; review notes (two hosts, demo key, step 4); content rights; categoriesGO
M6App Privacy: Other User Content, App Functionality, not linked, no tracking; every other type not collected; tracking Nocondition: Dinis
M9Mac (Apple silicon) and Vision Pro availability unticked; IDFA question: Nocondition: Dinis
P1No open "stuck" persona finding on the submitted screensGO

Verdict: submit 0.4.23 (204) for App Review as soon as Dinis confirms M6 and M9. The same build and the same review notes are GO for the TestFlight public link (Beta App Review).

16:05, dry run 42497866805: (a) 204 VALID, no ITMS lines in the job log (testflight is checking the email); (b) usesNonExemptEncryption already false; (c) the confirm run attaches 204, then creates and submits the review submission; (d) no blocking items beyond the plan. asc.py cannot see App Privacy, IDFA or Mac and Vision Pro: those rest on Dinis. If one is missing, Apple refuses the submit with a clear error, and nothing is lost. The final GO stands.

16:11: TestFlight external SUBMITTED for Beta App Review (run 42498490708). 0.4.23 (204) is in "PrompTugal External Users"; What to Test is 1,104 characters (store/what-to-test.txt); the notes are 3,470 characters (store/review-notes.txt, 3,418, plus the demo key). The App Store submit waits on Dinis's three steps and his release-type choice.

Run 16: rc8 4f58965, Ask removed from the App Store build (21:50 UTC)

Dinis's decision: no Ask (OpenRouter) in the App Store app, and the label reads "Data Not Collected".

#CheckState
Codeorigin/dev...origin/split/rc8 has 5 files. The Ask destination is #if DEBUG with debugOnly; the Now card and the Settings row are #if DEBUG and only with debug mode on; the Settings summary has no "Ask" in Release; askAnywhere is gone from the shell; PrivacyInfo.xcprivacy has NSPrivacyCollectedDataTypes empty. The new string "Reminders, about, privacy, support" is in en, pt-PT and pt-BR.GO
HostsRelease talks to one host, promptugal.news (network-audit.md, rc8 section)GO
M6App Privacy: "No, we do not collect data from this app" (app-privacy.md)Dinis
M1, M2Listings: the Ask section is removed in all four locales; "AI" and "IA" are out of the keywords; the description's newsroom line says "independent newsroom in Portugal"; the privacy line says "No data collected". listing.json regenerated and checked.GO; release re-applies
M8review-notes.txt: the Ask step, the demo key, dictation and the openrouter line are removed; "one host only: promptugal.news" (2,450 characters, no placeholders left). what-to-test.txt: the Ask line is removed.GO; testflight recopies, release re-applies the review details
M4Screens #36: the iPad images list "Ask" in the sidebar's More group (all 4 ids, all locales). The iPhone images show no Ask: the Now card is below the fold, and Ask was never a tab.re-run screens on rc8 (iPad at least), then re-upload the iPad sets
Siteprivacy.html still describes Ask. True for the app's DEBUG builds and the TestFlight build 204, but it will confuse a reviewer next to "Data Not Collected".editor: say Ask is not in the App Store version
TestFlightBuild 204, already in Beta App Review, still has Ask (with the demo key in its notes). Fine for the beta.note

Run 17: screens #37 on rc8 4f58965 (22:16 UTC)

#CheckState
M4 (iPad 13")The sidebar is Now, My program, Explore, News; More: Settings, Reminders. No Ask in en-US, pt-PT or pt-BR. All 4 ids clean: no alert, no debug UI, no "Web Summit", times on one line.GO: replace the iPad sets
M4 (iPhone 6.5")4 ids × 3 locales clean, no AskGO
M4 (iPhone 6.9")The #36 sets already uploaded contain no Ask (it was never a tab, and the Now card is below the fold); #37's 6.9" set is still runningGO to keep #36; check #37 if it is swapped in
Code, textsrc8 GO (run 16); dev v0.4.24 has the same app code as 4f58965; scripts/testflight texts match store/ (no Ask); ASC listing and review notes re-applied without Ask (42526747980)GO
Open for the final GO on 0.4.24Release #105's build processed VALID and attached; Dinis: App Privacy "Data Not Collected", Mac and Vision Pro unticked, IDFA Nopending

22:20: #37 iPhone 6.9" (1320×2868), 4 ids × 3 locales: clean, no Ask. All three sizes from screens #37 are GO to upload together (en-GB = en-US).

FINAL: GO for PrompTugal 0.4.24 (205), conditional on Dinis's three hand steps (22:25 UTC)

Replaces the 16:05 GO for 0.4.23 (204), which was never submitted to the App Store. Build 204 stays in Beta App Review for TestFlight.

#CheckState
G10.4.24 (205) VALID; usesNonExemptEncryption = false; version 0.4.24 PREPARE_FOR_SUBMISSION; release type AFTER_APPROVAL (automatic, as recommended for the summit)GO
Coderc8 4f58965 = rc7 plus Ask DEBUG-only and an empty PrivacyInfo collected types list (run 16); full run 42526421784 green; dev v0.4.24 has the same app codeGO
G4Airplane check: code evidence, as for 204 (the seed path is unchanged in rc8)GO (evidence)
M1, M2, M8Listing (4 locales) and review notes re-applied without Ask (42526747980): one host, no data collectedGO
M4Screenshots from #37 (rc8): 12 sets × 4, the iPad sets without Ask (42529518751)GO
M7Age rating 4+ (unchanged; no generated content now)GO
M6App Privacy: "No, we do not collect data from this app", so the label reads Data Not Collectedcondition: Dinis
M9Mac (Apple silicon) and Vision Pro unticked; IDFA: Nocondition: Dinis

Verdict: submit 0.4.24 (205) as soon as Dinis confirms M6 and M9.

SUBMITTED: 0.4.24 (205) in App Review (23:20 UTC)

ios-submit run 42534623695: "Submitted 0.4.24 (205) for App Review", release type AFTER_APPROVAL. The last blocker was the missing copyright line, which Dinis set by hand (README says "2026 PrompTugal"; the plan's step 12 had not been run). TestFlight build 0.4.23 (204) has been in Beta App Review since 16:11. Replies to likely App Review questions are ready in app-review-replies.md.

Copyright: listing.json now has a top-level "copyright": "2026 PrompTugal" (generated by make_listing_json.py), so asc.py store-metadata sets it on every version. Lesson from 0.4.24: the copyright is now part of the listing checks.

Run 18: rc9 640e631 against acceptance-0.4.25.md (23:40 UTC)

origin/dev...origin/split/rc9, 33 files in Apps and Packages.

RuleFindingState
P1 One hostNative fetches only from promptugal.news. PTCore LiveContent keeps only https stories on promptugal.news; PTSync LiveUpdates is not linked yet (rc10). The graph's "websummit.com" is a display label in a doc comment, not a fetch. Metro, traffic and Carris links open Safari. But ShellLink.allowedHosts (PTCore/Shell/ShellParts.swift:47) still allows web-summit.sgit.ai, so a promptugal://open/…?url=https://web-summit.sgit.ai/… link (from any website or app) opens the team site in an in-app WebPage.must-fix (small): the public app allows promptugal.news only (an injectable host set, or a check in PublicShell.route). Owner: team or design
P2 No identifiers or cookiesCookie-off config unchanged; no IDFV/IDFA/ATT; no remote packages; the onboarding answer is stored as @AppStorage("onboarding.seen") onlyGO
P3 Data Not CollectedPrivacyInfo.xcprivacy: tracking false, collected types empty. PTAsk is unlinked, so no AI path.GO; editor still to update privacy.html
P4 No permission without a tapProducts: PTAgenda, PTCore, PTDeck, PTExplore, PTNews, PTNowNext, PTWeb (PTAsk, PTVaultUI and SGitVault unlinked). The purpose strings are calendar write-only alone. No AVAudio/Speech/DataScanner/AVCapture/LAContext reference in the linked sources. The permission calls: reminders toggle, "Allow reminders" button, first pick, the bridge's native alert, Add to Calendar, all after a tap. Onboarding ("Choose talks" / "Not now") asks the OS for nothing and opens Explore.GO; confirm with plutil -p on the built app and processing
P5 Build = listingOnboarding copy matches the listing ("Your picks never leave your phone"). NextHoursCard is not on any screen yet. BGTaskSchedulerPermittedIdentifiers still lists news.promptugal.reader.refresh with fetch, and nothing registers it (the vault task went; collab's glue is due in rc10). webcredentials:promptugal.news has no user left.risk: register the refresh in rc10 or drop the identifier and fetch; remove webcredentials (apps)
P6 QualityThe agenda seed is not refreshed in rc9; refresh it before the release build. Full run 42535357582: pending.pending