PrompTugal for iOS

Developer area

Push dashboard

Sessions build PrompTugal in parallel, one push at a time: the overnight push, App Review readiness, then the split into three apps. Each session keeps a status page in the push’s brief pack; these tables are generated from those pages when the site is built (release v0.4.106), newest push first. Between merges, a session’s own branch (night/… or split/…) is newer than dev, so where the branch has a newer copy of its status page, that copy is read; “Read from” says which.

Sessions

Counts per status page

Three apps, one repository

SessionDoneIn progressNextBlockedNeeds from othersLast changeRead fromCommits not on devSummary
Apps status5111311:56 UTCdev0RiskMandate is green and on dev. PrompTugal run 316 is nearly done with no failures; I report to the conductor when it finishes.
Collab status: PTAsk and PTLanes3420023:27 UTCdev00.4.25 (23:45 UTC): live updates for the public app are on split/collab (merged from dev 1a50c81, no CI run yet): LiveUpdates in PTSync (kept feed items, refresh at launch and foreground with a 5-minute floor, one background hook, ephemeral URLSession, promptugal.news only), PTCore LiveContent (stories and agenda from the kept files) and a small change in PTAgenda ReaderStore to use them before the app's seed. A test pins every feed host to promptugal.news. Needs from apps: the glue file and Info.plist/project/apps.json lines under "Live updates wiring (0.4.25)" at the end. Ask is not touched (the Release build no longer ships it).
Deck (PTDeck, then PTExplore)0030412:09 UTCsplit/deck1PTDeck merges as is (via design's run). New priority from the conductor: PTExplore (talks, speakers, companies, organisations, places), written and pushed, not yet compiled. Both packages are on split/deck; one CI run next.
Design (three apps)3121311:36 UTCdev0PTNews is moved and pushed but has never compiled. Run 294 was cancelled by the conductor: team's PTWeb (6cccf88) is uncompiled, so the run would only repeat its errors. I do not redispatch until split/team is green; then I merge it and dispatch once. PublicShell is not started (waits for phase 4).
Editor73531610:54 UTCdev000:05 UTC: the site structure, the three-apps page, the Team app pages in the admin area and the review notes are done on split/editor, green on build, validator and tests. Waiting for platform's phase 1 and the later phases to point the feature labels at the new folders.
i18n status: English, Portuguese (Portugal) and Portuguese (Brazil)5000020:10 UTCdev0String Catalogs are on split/i18n for the PrompTugal app, its widget, its Siri phrases and the packages it shows: PTCore, PTAgenda, PTNews, PTAsk, PTVaultUI, PTWeb and PTExplore. The summit screens from split/rc are covered. A sweep for new strings follows after 15:00 UTC.
Platform status5121321:11 UTCsplit/platform5Fringe (4th app) is live in internal TestFlight: 0.4.98 (601) VALID in "Lisbon Tech Fringe | Internal Users". Wiring is on dev; nothing pending from platform.
Release status7221409:44 UTCdev13Handed off to conductor.B at 01:40 UTC. CI now plans per app: a Linux changes job picks the affected apps and packages, and ios.yml, ios-release.yml and screens.yml run matrices over them. Written against today's single project; first runs on split/release are in progress.
Review status5220023:21 UTCdev2review.B (App Review and synthetic users) for "PrompTugal: Lisbon Summit". Submitted at 23:20 UTC: 0.4.24 (205) is in App Review (automatic release after approval). TestFlight 0.4.23 (204) has been in Beta App Review since 16:11. Replies to likely App Review questions are in app-review-replies.md; next-version items are in next-version.md.
Team session: PTWeb and PTAgenda0000312:21 UTCdev0Summit priority (freeze 16:00 UTC): head d310767 is in split/rc 75203d5 (conductor's full run). Done: App Review fixes, NowModel (with NOW-M-1/2), PICK, My program (PROG-1), -PTSeedPicks, AgendaClock, agenda opens on today. Not yet seen compiled: everything after run 364 was cancelled or superseded; rc is the first run to cover it.
TestFlight status26711123:50 UTCsplit/testflight52TestFlight ops tool works: "status" ran (TestFlight ops #2) and shows build 4 in Beta App Review (IN_REVIEW), builds 5 and 6 only in the internal group. The first automatic upload from dev worked: build 152 (iOS release run 52, dev e5328ff), processed, export compliance answered, What to Test set, in the internal group.
UX (summit app)0000023:27 UTCsplit/ux13The participant experience spec for "PrompTugal: Lisbon Summit": four tabs (Now, My program, Explore, News), Ask reached from Now and Settings, every screen with an id and an owner, cut to what can be built by the 16:00 UTC freeze. Owners build from this page; ux reviews every screenshot set against it.
Vault: PTVaultUI2040211:39 UTCsplit/vault8(8 Nov, B) VaultCollabAccess checked against collab-seams 11acc2e: matches; waiting for CollabSeams on dev before dispatching CI. Vault/ is moved into PTVaultUI and green in CI (run #272, commit e5328ff). The background task id is now a parameter. Still to do: move VaultCollabAccess once collab's protocol is in PTCore.

Summit app: to the App Store today

SessionDoneIn progressNextBlockedNeeds from othersLast changeRead fromCommits not on devSummary
Release status: summit app0000014:49 UTCsplit/release13Release owns two things today: App Store screenshots from screens.yml (built, not yet run on the real screens) and the plan for the App Store path through the App Store Connect API (below, nothing executed). The API can do everything except the App Privacy answers; Dinis does those by hand, plus anything Apple refuses over the API.

App Review readiness: quality and security push

SessionDoneIn progressNextBlockedNeeds from othersLast changeRead fromCommits not on devSummary
Collaboration and AI (App Review readiness)0100317:07 UTCdev0Done and CI green: all seven items, with tests, on dev since 7d135e0. Follow-up done: Lisbon.day(_:) in my three call sites; run 252 (cc3f4ae) green on Release build, app build, SGitVault tests and iPhone and iPad unit tests. Ready to merge.
Design (App Review readiness)0000017:02 UTCdev0Done. All design items are fixed, merged with dev 8c6bfcb and fully green: build run 249, unit tests on iPhone and iPad plus the Release build in run 251.
Editor5010217:04 UTCdev0Done and green, all merges checked. After design (9024bc0): 24 of 25 features in the beta, Reading credit 'Debug builds only'. Review notes, support and privacy pages match the app's real UI text. Waiting only on Dinis: support email, response time, demo keys, the Ask label call.
platform · App Review readiness0000018:06 UTCdev0Done: items 1–8, design's Q9 and team's Q6/Q8. Final CI run 263 (aa64031, head of night/platform): all green, Release build green, 212 tests in 61 suites on iPhone and on iPad (3 known issues: team's StoreKit tests, no products on the CI simulator). Ready for the conductor to merge.
Team · App Review readiness0100416:29 UTCdev0Done, and CI is green. All eight items on the team list are fixed, with tests, on night/team 853425b. That commit includes dev, and run 242 passed on iPhone and iPad and in the Release build. It is ready for the conductor to merge. Still with others: platform (the notification delegate in PrompTugalApp.init, and the StoreKit file for the test scheme) and design (a few shell items). Three product questions for Dinis.
vault · App Review readiness0100015:07 UTCdev0Done and green, ready to merge: all seven vault items (S1 signatures enforced and signers pinned, S3, S5, S6, Q7, S7, the reviewer demo vault script). CI: runs 206 and 213 (build + package tests), 221 (iPhone and iPad unit tests incl. VaultAppTests), round trip 14.

Overnight push: the team’s PrompTugal app

SessionDoneIn progressNextBlockedNeeds from othersLast changeRead fromCommits not on devSummary
Collaboration and AI5120209:52 UTCdev0Done for tonight and on dev: Ask (OpenRouter chat with tools, dictation, key check, opt-in history), Where is everyone, Messages (lanes, inbox, newsroom notes) and team notes through vaults, on iPhone and iPad. The table below says what works without keys and what needs which key.
Design and native UI4000209:08 UTCdev0Done for the night. The shell is the app's root on iPhone and iPad; five native dashboards, a wall screen, news in every form with a native graph, observability, and the debug panels are on dev, green, and checked on real screenshots of every screen on both devices.
Editor25230409:17 UTCdev0Done for the night. The morning summary is final (09:20). Twelve build-log checkpoints; the site is PrompTugal's internal-beta product site with features, screens and screenshots read from the code and CI. iPad screenshots go live with the next release.
iOS platform0040010:01 UTCdev0Done. CI builds and tests the integrated app on an iPhone and an iPad simulator (124 of 124 unit tests pass on both) and screenshots all 13 screens on both devices; the project, targets, entitlements, privacy manifest and widget/Siri extensions are in place. Dinis must set the signing team and register the App ID capabilities before a device build or TestFlight.
Release engineering17000009:13 UTCdev0Done. Every dev build is packaged by CI without keys (unsigned .ipa, simulator app, archive). Signing and the internal TestFlight upload are wired and tested up to the point where Dinis's 8 secrets are needed. His checklist is at the top of release-setup.md.
Team features10000309:22 UTCdev0Done and on dev, with unit tests green on iPhone and iPad: one schedule on the website's format, synced with the web view and the vault; reminders before picks and stand-ups; team data and identity; the day planner and "next 3 hours"; the meter with a native StoreKit top-up. The bridge is checked against the live website.
Swift vault14000207:35 UTCdev0Done for the night: a native Swift sgit vault client is on dev and green on iPhone and iPad. It reads and writes vaults, and sgit reads back what it writes. Face ID, Secure Enclave keys, passkey door, picks mirror and collab's append lanes run on it. Blocked: a live push (no access token) and passkey sign-in (the website's association file).

Counts are the bullet points under each heading of the status page. “Last change” is the time of the last commit that touched it. “Commits not on dev” counts the commits on the session’s branch that this release does not have yet.

Waiting on someone

Blocked, and needs from others

  • Apps status (blocked, Three apps, one repository): Nothing.
  • Apps status (needs from others, Three apps, one repository): Platform: the apps.json entries are mine for now; please keep them when you merge.
  • Apps status (needs from others, Three apps, one repository): Design: Apps/PrompTugal/Shell/ (PublicShell, Destinations, settings) is a folder-synchronized group, so new files there need no project edit.
  • Apps status (needs from others, Three apps, one repository): Phase 4: widgets and intents extensions go into Apps/PrompTugal/ with platform. Not created tonight.
  • Deck (PTDeck, then PTExplore) (needs from others, Three apps, one repository): apps: add XCLocalSwiftPackageReference for Packages/PTDeck to Apps/PrompTugal, then add "PTDeck" to the promptugal app's packages in apps.json (I left it out so check_apps.py stays green: it compares the project with the list).
  • Deck (PTDeck, then PTExplore) (needs from others, Three apps, one repository): apps: for a true second screen, the Info.plist scene manifest needs a configuration for UIWindowSceneSessionRoleExternalDisplayNonInteractive with delegate class PTDeck.ExternalDisplaySceneDelegate. Without it iOS mirrors the iPad screen (the console shows on the TV). Needs a real iPad and display to confirm.
  • Deck (PTDeck, then PTExplore) (needs from others, Three apps, one repository): design: register screen id decks, view DeckScreen() (it has its own navigation stack: ownsNavigation: true), iPad group "Tools".
  • Deck (PTDeck, then PTExplore) (needs from others, Three apps, one repository): editor / site: publish deck JSON and speaker notes when ready (format above). Until then notes are empty.
  • Design (three apps) (blocked, Three apps, one repository): Nothing yet. Phase 2 is the gate.
  • Design (three apps) (needs from others, Three apps, one repository): Conductor: answers to the five questions in section 1.4.
  • Design (three apps) (needs from others, Three apps, one repository): Platform: RemoteFeed, LoadPhase, FeedCache, enum Wire {} with LooseText, LooseScalar, WireDate into PTCore, plus Event, Story, Lisbon, FeedClient from Content.swift.
  • Design (three apps) (needs from others, Three apps, one repository): Collab: AskView.swift:196 and AIContext.swift:320 use TeamFeatures; PTAsk cannot, and the public app has no TeamFeatures.
  • Editor (blocked, Three apps, one repository): Nothing yet.
  • Editor (needs from others, Three apps, one repository): Apps (or conductor): add INFOPLIST_KEY_UIFileSharingEnabled = YES; and INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES; to both configurations of the PrompTugal app target in Apps/PrompTugal/PrompTugal.xcodeproj, as the root project has. Otherwise the support page's "edit the website shortcuts in Files" section is false for the public app, and I will have to remove it before READY.
  • Editor (needs from others, Three apps, one repository): Platform/apps (phase 4): the sidebar artwork (Shortcut.imageset, for example ShortcutPrompTugal) has to be in Apps/PrompTugal/Resources/Assets.xcassets or in a package resource, or the new app's sidebar will have no icons. The site is fine either way.
  • Editor (needs from others, Three apps, one repository): Design: which features the PrompTugal app has. The site assumes News, Agenda, Websites, Ask, Vault, reminders, the graph and a privacy cover, and no team screens. Tell me the screen ids in its Destinations list and the root view that marks it (today the feature labels use AppShell( and .teamFeatures()).
  • Editor (needs from others, Three apps, one repository): Collab: confirm that Ask in the PrompTugal app has no team, teammate or agent context. The privacy page and the review notes say so.
  • Editor (needs from others, Three apps, one repository): Release: how screens.yml will name the two apps' screenshots, so the home page picks the PrompTugal app's.
  • Editor (needs from others, Three apps, one repository): The conductor: merge this branch after phase 4, or earlier? The privacy and support pages describe the public app without lanes, so they are true only once Apps/PrompTugal exists. The apps page already says "not finished" until the three projects exist.
  • Platform status (blocked, Three apps, one repository): Nothing.
  • Platform status (needs from others, Three apps, one repository): Team: Schedule/LisbonDay.swift is now in PTCore (Lisbon.day). Do not move it again.
  • Platform status (needs from others, Three apps, one repository): Design: the rest of Dashboards/WireModels.swift (Wire.Me, Person and so on) stays in the app for now. Wire, LooseText, LooseScalar and WireDate are in PTCore.
  • Platform status (needs from others, Three apps, one repository): Everyone: pushes to split/ do not start ios.yml. Start it with workflow_dispatch on your branch.
  • Release status (blocked, Three apps, one repository): Nothing.
  • Release status (needs from others, Three apps, one repository): Platform: while apps.json "team" points at the root project, its bundle must be the real bundle of that project (news.promptugal.reader). If it says news.promptugal.team before phase 4, uploads refuse (this is the guard working). Change the bundle in the same commit that moves the project.
  • Release status (needs from others, Three apps, one repository): Platform: add .github/scripts/ to the all list in apps.json (CI helper scripts). check_apps.py should print one error per line and exit non-zero; CI runs it as its own job.
  • Release status (needs from others, Three apps, one repository): Platform: scripts/apps/affected.py output: I accept a JSON list of app keys, or an object with an apps list. Tell me if it differs.
  • Release status (needs from others, Three apps, one repository): Design: each app's screenshots need a shared scheme named <Scheme>Screens in its project (or set screensScheme and screensCount in apps.json).
  • Team session: PTWeb and PTAgenda (needs from others, Three apps, one repository): design or platform: Shell/AppShell.swift:97 accepts only url.scheme == "promptugal". When the Team app switches to ptteam (phase 4) it must compare with AppLinks.scheme, or reminder taps and deep links stop opening.
  • Team session: PTWeb and PTAgenda (needs from others, Three apps, one repository): platform: Event, FeedClient.site, Lisbon, HTTPClient public in PTCore (question 2). PTWeb and PTAgenda Package.swift with resources: for PTWeb.
  • Team session: PTWeb and PTAgenda (needs from others, Three apps, one repository): design: review WebPage.swift and WebsiteView.swift after the move (only public, import, and WebBridgeHub changes).
  • TestFlight status (blocked, Three apps, one repository): Nothing.
  • TestFlight status (needs from others, Three apps, one repository): Only if the external plan comes back: Dinis, for the review notes (REVIEW_CONTACT_PHONE is the one not set): contact first name, last name, email and phone; contact address for the support page; response time promise; demo OpenRouter key and its cap; demo vault key; demo lane name.
  • Vault: PTVaultUI (needs from others, Three apps, one repository): Platform: each app's entry point passes its own task id to VaultBackground.register(taskIdentifier:): news.promptugal.reader.vault-refresh for the public app, a news.promptugal.team... id for Team. Add both to each app's Info. Today PrompTugalApp.init calls VaultBackground.register(); the call changes to take the id.
  • Vault: PTVaultUI (needs from others, Three apps, one repository): Platform: PTVaultUI's Package.swift lists SGitVault and PTCore only if PTCore is really needed. My map says SGitVault alone is enough, but the contracts graph allows both.
  • Collaboration and AI (App Review readiness) (needs from others, App Review readiness: quality and security push): Team: done; I use Lisbon.day(_:). TeamStore still fetches with URLSession.shared (Q8); my team context now goes through TeamStore, so routing it through HTTPClient will put those requests in Debug → Network too.
  • Collaboration and AI (App Review readiness) (needs from others, App Review readiness: quality and security push): Vault: my ownVaultId treats the reader vault (by readerVaultId or role "reader") as mine and "imported" as never mine. If your S5 fix adds an explicit "mine" marker for a pasted own key, tell me and I will use it.
  • Collaboration and AI (App Review readiness) (needs from others, App Review readiness: quality and security push): Design: DebugMode.defaultOn false in Release is yours; my views follow it.
  • Editor (needs from others, App Review readiness: quality and security push): Dinis: a support email address (support page, review notes, and LaneReport.contactAddress in the app, where Report… sends) and the response time for reports; the call on Ask in the privacy labels (see privacy-labels.md).
  • Editor (needs from others, App Review readiness: quality and security push): Platform: if Dinis declares Ask's data as collected, the privacy manifest's NSPrivacyCollectedDataTypes (empty today) must list the same type.
  • Team · App Review readiness (needs from others, App Review readiness: quality and security push): Platform (Q6): add ReminderScheduler.installNotificationDelegate() to PrompTugalApp.init, next to the background task registrations. Optional: replace its private lisbonDay with Lisbon.day.
  • Team · App Review readiness (needs from others, App Review readiness: quality and security push): Platform (Q3, tests): set PrompTugal/Store/PrompTugal.storekit as the StoreKit configuration of the scheme's Test action, or add it to the PrompTugalTests resources. StoreKitTest then loads products on CI and the three StoreKit tests run in full instead of recording a known issue.
  • Team · App Review readiness (needs from others, App Review readiness: quality and security push): Design:
  • Team · App Review readiness (needs from others, App Review readiness: quality and security push): Collab (Q8): AIContext.lisbonDay → Lisbon.day; the base URL → TeamEndpoints.base; the team data → TeamStore / TeamModels.
  • Collaboration and AI (needs from others, Overnight push: the team’s PrompTugal app): Design (shell, 3 small changes, your call):
  • Collaboration and AI (needs from others, Overnight push: the team’s PrompTugal app): Platform: a streaming call on HTTPClient (bytes(for:label:) that logs on completion) would let OpenRouterClient drop its own bookkeeping. Not urgent.
  • Design and native UI (needs from others, Overnight push: the team’s PrompTugal app): Platform: keep -PTDestination, -PTSampleData and -PTMe in the screenshot job; every screen carries pt.destination.<id>.
  • Design and native UI (needs from others, Overnight push: the team’s PrompTugal app): Editor: the design system and "What native taught us, for the website" above are ready to publish.
  • Editor (needs from others, Overnight push: the team’s PrompTugal app): Team: PrompTugal/Websites.json still ships riskmandate.ai, sgit.ai and newsroom.sgit.ai as default shortcuts. The conductor says the team session drops them (item 7 of its brief).
  • Editor (needs from others, Overnight push: the team’s PrompTugal app): Design: the site expects collab's collab.plans → TeamPlansView() (any id works, the site checks the view).
  • Editor (needs from others, Overnight push: the team’s PrompTugal app): Design: please keep screen ids in Destinations.swift stable. The site's feature list checks for team.schedule, team.people, agents.activity, news.home, news.newsroom, news.graph, briefed, collab.lanes, collab.ai, team.store, vault, debug and obs.native, and treats a PendingFeatureView as not built.
  • Editor (needs from others, Overnight push: the team’s PrompTugal app): Dinis: a contact address for "talk to us" on the plans page. promptugal.news publishes no contact route (its rules forbid publishing contact details), so the page links to GitHub issues on this repo until there is one.
  • Team features (needs from others, Overnight push: the team’s PrompTugal app): Platform: the bridge on WebsiteBrowser (configure, attach, pageDidFinish, handlesNavigation); ReaderStore → the schedule and agendaDidLoad; the widget from the schedule; the news.promptugal.reader.refresh background task calling TeamFeatures.shared.refreshTeam(); NSCalendarsWriteOnlyAccessUsageDescription; the Time Sensitive Notifications entitlement; App-Bound Domains.
  • Team features (needs from others, Overnight push: the team’s PrompTugal app): Design: .teamFeatures() at the root, my entry views in Destinations, the bridge on WebPage, NextHoursCard on My day and the Wall.
  • Team features (needs from others, Overnight push: the team’s PrompTugal app): Vault: loadPicks() / savePicks(_:), used by ScheduleVaultLink.
  • Swift vault (needs from others, Overnight push: the team’s PrompTugal app): Website (promptugal.news): list the app under webcredentials.apps in https://promptugal.news/.well-known/apple-app-site-association (<TeamID>.news.promptugal.reader). Then the passkey flag can be turned on.
  • Swift vault (needs from others, Overnight push: the team’s PrompTugal app): Anyone with a token: an access token for a throwaway vault, to prove one live push.

Build log · Three apps · App Review readiness · The overnight plan · Contracts