VoiceDebrief iOS / built
What is built
The reality file for this repository. If it is not listed here as built, it does not exist. The plan describes intentions; this page describes facts, and it is updated in the same commit as the code it describes.
Status words, as the VoiceDebrief family uses them: built is in the repository and tested; unverified is written but has not yet been proven by a run; proposed does not exist.
Built
| What | Where | How it is tested |
|---|---|---|
| The app skeleton built | Apps/VoiceDebrief/: a universal iPhone and iPad target, iOS 26.0, SwiftUI, bundle ai.voicedebrief.app | Unit tests in Apps/VoiceDebrief/Tests/, run by CI on an iPhone and an iPad simulator |
| Record or open a voice note unverified | Engine/VoiceRecorder.swift, DebriefView: record to a temporary .m4a, or choose an audio file. .m4a, .mp3 and .wav; not WhatsApp's Ogg Opus | Recording worked in the same first run on a Mac. Choosing a file has not been tried |
| Transcript on the device unverified | Engine/SpeechFileTranscriber.swift: SpeechAnalyzer with a SpeechTranscriber, the model downloaded on first use, one line per phrase with its time. The language is chosen before the run | First real run, 13 November 2026, build 0.1.1 (5) on an Apple silicon Mac: a 22.6-second English note recorded in the app was transcribed in 0.6 seconds, two lines, accurate bar small slips. One note, one language, one device: not yet a judgement |
| Debrief on the device unverified | Engine/OnDeviceModel.swift, DebriefSession: Apple's Foundation Models, the three-section prompt from voicedebrief.ai, a long note read in parts sized from the model's reported context and merged. A refusal or a missing model leaves the transcript standing | The chunking, prompts and format check have unit tests. The model's output has none. On a Mac with Apple Intelligence switched off the app said so and kept the transcript, as designed. First debrief, 13 November 2026, build 0.1.1 (5) on an iPhone: a short English note came back with the three headings and nothing invented, though it turned "let's see if we recorded fine" into an action. A second, one-line note on a Mac showed the model's habits: quotation marks copied from the prompt, a renamed heading (which the app flagged), the note repeated back as a key point. The prompt was changed for 0.1.2 and notes under 25 words are no longer summarised. Long notes and Portuguese are untried |
| Live text and a level display while recording unverified | Engine/LiveTranscriber.swift: the microphone through AVAudioEngine into a second SpeechAnalyzer with the progressive preset, shown as it changes; bars from the recorder's meter. A preview only: the kept transcript is still made from the recorded file | Compiles in CI; the level mapping has a unit test. Never run on a device. If the live text cannot start the recording carries on and says why |
| Send a note to the developer unverified | Engine/DeveloperLane.swift, LaneCrypto.swift (copied from PrompTugal__App__iOS): with an sgi1. lane link pasted in, a button after a run sends the audio in parts and the run as JSON to an sgit append lane on dev.send.sgraph.ai, each message encrypted to the link's RSA key with sgit's hybrid envelope. A lane is built into the test build (a vault id, a write-only token and a public key, committed on purpose); a pasted link takes its place. Nothing is sent without the button | Unit tests: the link, the parts, the message format, and a round trip through the encryption with a throwaway key. The receiving end was proven on 13 November 2026 with a message sealed the same way and read back. No note has been sent from the app yet |
| Create a vault unverified | Packages/SGitVault/Sources/SGitVault/VaultCreate.swift: a random key (24 and 8 characters, as sgit generates them) or a given one; an empty tree, one signed commit, the branch current at its derived address, the branch index. No clone branch | Unit tests against a folder; and ios-vault.yml has sgit clone the vault Swift created and verify its signatures. Never run against the live server from Swift |
| Vaults in the app unverified | Engine/VaultBook.swift, SecretStore.swift, UI/VaultsView.swift: the access token, vault keys and the commit-signing key in the Keychain (this device only); create, add by key, forget; head, files, history, branches; a file fetched and decrypted when opened; the engine's traffic log | Unit tests with an in-memory store: token, signing key, the folder a debrief becomes. Nothing here has run on a device |
| Save a debrief to a vault unverified | VaultBook.save: debriefs/YYYY/MM/DD/<id>/ with debrief.md, transcript.md, run.json and the audio (up to 3.8 MB), one signed commit on current | The file layout has a unit test. No debrief has been saved yet |
| Diagnostics unverified | DiagnosticsView: speech languages, model status, context size and languages, the last run's timings; exported as JSON without the words of the transcript or debrief | The export's "no words" rule has a unit test |
| The About screen built | StatusView: what the build holds, what is in test and what does not exist, the version, links | The list it shows is checked by tests: the transcript and debrief may not be called built before they are proven |
| The vault engine built | Packages/SGitVault/, copied from PrompTugal__App__iOS (see SOURCE.md there): read and write sgit vaults, key derivation, the passkey door, account unlock | Its own tests on the CI Mac, against fixture vaults and vectors generated by sgit's Python |
| A door on any site built | VaultDoor.door(fromSecret:site:): the derivation of door.js with the site constant as a parameter, and VaultDoor.pkiSite | The vector published at newsroom.sgit.ai/passkey/vectors.json: passphrase, vault id, read key and write key |
| The build pipeline built | .github/workflows/ios.yml: the vault tests, a simulator build, a Release device build, unit tests on iPhone and iPad | It is the test |
| TestFlight upload built | scripts/release/testflight.sh and the last step of ios.yml: on a green push to dev that touches the app, archive unsigned, sign, and upload with automatic signing | Run 4 of ios.yml (13 November 2026) uploaded 0.1.0 (4) and App Store Connect accepted it. The owner installed it from TestFlight on an iPhone the same day and it opened |
| Vault interop built | .github/workflows/ios-vault.yml: Swift writes vaults, sgit-ai clones and verifies them; on changes to the write path and weekly | It is the test |
| The site built | website/: markdown pages, a builder and a gate with no dependencies | node website/admin/validate.mjs: pages current, links, no key-shaped strings, house style |
Not built
Most of what a user would call the product.
| What | Status |
|---|---|
| Receiving a voice note from the share sheet (WhatsApp) | proposed |
| Decoding WhatsApp's Ogg Opus | proposed |
| A library: listing and reopening saved debriefs in the app | proposed |
| Translation, classification, citations of time in the debrief | proposed |
| The passkey ceremony, the account, the recovery code | proposed |
| Creating an account, adding a door, merge, audio over 3.8 MB in a vault | proposed |
The key bundle (PKIKit) and signed debriefs | proposed |
| Saving a debrief, sync between devices | proposed |
| The share extension, App Intents | proposed |
| Credit, charging per minute, top-up | proposed |
| A build confirmed on an iPad | unverified: confirmed on an iPhone and a Mac |
| The App Store | proposed |
Known limits of what is built
- Live vault writes from Swift are unproven. The vault engine's writes and its vault creation have been tested against a folder and read back by
sgit, never against the live server. On 13 November 2026sgititself created and pushed a vault todev.send.sgraph.aiwith the owner's access token, so the server and token work; the Swift path has not been run there. The first vault created from the app is that test. - Installed, not yet judged. Build 0.1.0 (4) was installed from TestFlight on an iPhone and on an Apple silicon Mac and opened on both. The transcript and debrief arrive in the next build, and whether Apple's models are good enough on real voice notes is the open question of the whole project.
- The model's language may not match the note's. The debrief is asked for in the language that was transcribed. Whether Apple's model writes European Portuguese well, or at all, is not known.
- The four spikes in the plan have not been run: passkey bytes in a native app, the quality of Apple's models on real voice notes, live vault writes, and Ogg Opus decoding. Each can change the plan.
Open work
Tracked as files under issues/ in the repository.