<!-- https://ios.app.promptugal.news/admin/build-log/2026-11-07-0345.html · PrompTugal for iOS 0.4.106 -->

# Checkpoint 2, 03:45 UTC: platform, release and the site are on dev

> Three branches are merged: platform (iOS 18, the new project layout, CI, widget, App Intents and the vault package), release (unsigned builds of every dev push, TestFlight waiting only for secrets) and the editor's site work. Vault, team and design each have 14 to 22 commits waiting to merge, all green on their own CI. Collaboration and AI has not pushed yet.

Written by the editor from the status pages on each `night/*` branch and `git log` at 03:45 UTC. Times are UTC, which is Lisbon time.

## On dev now

Releases v0.1.4 to v0.1.10 went out between 02:52 and 03:40.

- **Platform** (merged 03:10 and 03:40). The app targets **iOS 18.0**. The project uses folder-synchronized groups, so a session adds a Swift file to its folder and pushes, with no project-file edit. A unit test target runs on an iPhone and an iPad simulator. The shared `HTTPClient` logs every request for the debug panel. Build info (commit, branch, site release) is compiled in. Also: entitlements (App Group, `webcredentials` and `applinks` for promptugal.news), a local StoreKit configuration, a "Now and next" widget, an App Intents extension ("Next session") and the vault package linked into the app. Default shortcuts are now **promptugal.news and the team site only**.
- **Release** (merged 03:24). `ios-release.yml` builds an unsigned archive, `.ipa` and simulator app on every push to `dev` that touches the app. On the platform project: minimum iOS 18.0, built for iPhone and iPad, app 1.7 MB, `.ipa` 892 KB. The TestFlight job runs and skips cleanly with "secret ASC_KEY_ID missing". The setup checklist for Dinis is [release-setup](../briefs/2026-11-08__overnight-push/release-setup.html).
- **Editor.** The site presents PrompTugal as the team's internal app in beta, with readers and teams as where it is going. Feature labels follow the code. The push dashboard reads each session's own branch. The CI page shows the latest iOS build. The screens page lists screens waiting on branches.

## Waiting to merge

| Session | Commits not on dev | Where it is |
| --- | --- | --- |
| Swift vault | 14 | The Swift reader **and writer** are tested on macOS CI over throwaway vaults written by sgit 0.27, and sgit reads back what Swift wrote. Every object is checked against its hash before decryption; commit signatures are verified; the cache holds ciphertext only. The passkey door is ported from the website. App code for Face ID, Secure Enclave key wrapping and passkey unlock is in `PrompTugal/Vault/` and type-checks; it is not in the app target yet. |
| Team features | 14 | One schedule on the website's format, the website-to-app bridge, reminders, team data with an offline cache, a day planner with clashes and walking time, the native top-up with StoreKit 2 (the Stripe top-up is hidden in the app), Add to Calendar and two App Intents. App build green. |
| Design and native UI | 22 | Design system, the app shell (iPad sidebar with ten sections, iPhone tabs), five native dashboards (My day, The team, Agents with the wake grid redrawn natively, Briefed, Newsroom), the news in native form with a graph explorer of 1,688 nodes, native observability charts, and the debug panels. Green on CI. Waiting for the root view to switch to the shell and for team's merge. |
| Collaboration and AI | no branch yet | Not pushed. |

## Found tonight, and fixed in the contracts

Checked against the live promptugal.news code:

- A schedule pick's `at` is an ISO 8601 string, not Unix milliseconds.
- A pick's `id` is the bare event slug (`ai-doom-or-boom`), not `events/<slug>`.
- The website keeps picks in the vault at `apps/agenda/picks.json`, merged as a union by id.
- The places file is `/api/v1/places.json` (83 places, no coordinates), so walking times are estimates.
- The team site publishes JSON only for `me.json` and each person's command centre. Wakes, reports, pulse, log and meetings have Markdown twins, which the app parses.

## Decisions waiting for Dinis

- **Removing a pick.** Sync with the vault is union-only, like the website, so a pick removed in the app comes back from the vault and stays on other devices. Fine for the summit. The fix is a list of removals in `agenda/picks`, which the website must also honour.
- **TestFlight secrets** and the steps in the release checklist.
- **A contact address** for "talk to us" on the plans page.

## To watch next hour

- Merges of team, vault and design. Feature labels on the site switch to "In the beta" as their screens land with real views.
- The app's root view moving to the shell.
- Collaboration and AI: first push.
