{
 "about": "Generated by website/admin/ideas.mjs from issues/, website/articles/, the reality files and the release history. Do not edit.",
 "statuses": [
  {
   "id": "seen-working",
   "label": "Seen working",
   "meaning": "Built, and a run proved it: CI, a device or a server."
  },
  {
   "id": "built-untried",
   "label": "Built, untried",
   "meaning": "In the app or the repository, but not yet proven by a run on a device."
  },
  {
   "id": "in-progress",
   "label": "In progress",
   "meaning": "Begun: part of it is built or a release has touched it."
  },
  {
   "id": "proposed",
   "label": "Proposed",
   "meaning": "Asked for or described; nothing of it is built."
  },
  {
   "id": "parked",
   "label": "Parked",
   "meaning": "Waiting: on the owner, on Apple, or scheduled for later."
  }
 ],
 "counts": {
  "seen-working": 27,
  "built-untried": 88,
  "in-progress": 40,
  "proposed": 60,
  "parked": 6
 },
 "ideas": [
  {
   "id": "issue-001",
   "kind": "issue",
   "number": "001",
   "app": "VoiceDebrief",
   "title": "Signing and TestFlight",
   "status": "in-progress",
   "why": "The issue says: \"Done: the App Store Connect record and internal group; the secrets ASC_KEY_ID, ASC_ISSUER_ID, ASC_KEY_P8_BASE64 and APPLE_TEAM_ID; scripts/release/testflight.sh...\"",
   "summary": "Done: the App Store Connect record and internal group; the secrets ASC_KEY_ID, ASC_ISSUER_ID, ASC_KEY_P8_BASE64 and APPLE_TEAM_ID; scripts/release/testflight.sh and the TestFlight step of ios.yml. Run 4 of ios.yml uploaded 0.1.0 (4) on 13 November 2026 and App Store Connect accepted it.",
   "detail": [
    "Done: the App Store Connect record and internal group; the secrets ASC_KEY_ID, ASC_ISSUER_ID, ASC_KEY_P8_BASE64 and APPLE_TEAM_ID; scripts/release/testflight.sh and the TestFlight step of ios.yml. Run 4 of ios.yml uploaded 0.1.0 (4) on 13 November 2026 and App Store Connect accepted it.",
    "Still to do:",
    "- confirmed on an iPhone (13 November 2026); an iPad and an Apple silicon Mac (as an iPad app) are still to confirm, then this issue moves to done/; - later, when the app gains capabilities (Associated Domains, App Groups) and extensions: enable them on the app id and sign each extension with its own entitlements."
   ],
   "statusLine": "Status: open, nearly done. Milestone: 1.",
   "places": [],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/001-signing-and-testflight.md",
   "source": "The project"
  },
  {
   "id": "issue-002",
   "kind": "issue",
   "number": "002",
   "app": "VoiceDebrief",
   "title": "The four spikes",
   "status": "proposed",
   "why": "Open, with nothing built yet: \"Status: open. Milestone: 0. Each can change the plan; see section 10 of the plan.\"",
   "summary": "| Spike | Question | Needs | |---|---|---| | S1 | Does a native app with relying party pki.sgit.ai get PRF bytes, and the same bytes as Safari? | Issue 003, a TestFlight build, two devices | | S2 | What do Apple's models do on real voice notes (locales, pt-PT, accuracy, context, refusals, speed)? Runs first | A TestFlight build with a diagnostics screen, ten real notes | | S3 | Do SGitVault's...",
   "detail": [
    "| Spike | Question | Needs | |---|---|---| | S1 | Does a native app with relying party pki.sgit.ai get PRF bytes, and the same bytes as Safari? | Issue 003, a TestFlight build, two devices | | S2 | What do Apple's models do on real voice notes (locales, pt-PT, accuracy, context, refusals, speed)? Runs first | A TestFlight build with a diagnostics screen, ten real notes | | S3 | Do SGitVault's writes work against the live server? | Issue 004 | | S4 | Does WhatsApp's Ogg Opus decode through AVAudioConverter? | Twenty real files |"
   ],
   "statusLine": "Status: open. Milestone: 0. Each can change the plan; see section 10 of the plan.",
   "places": [
    "Settings: Diagnostics"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/002-spikes.md",
   "source": "The project"
  },
  {
   "id": "issue-003",
   "kind": "issue",
   "number": "003",
   "app": "VoiceDebrief",
   "title": "The passkey's relying party (decision D1)",
   "status": "parked",
   "why": "The issue's status: \"Status: open, needs the owner's decision.\"",
   "summary": "The plan assumes pki.sgit.ai, so the app's passkey, door, master vault and key are the same as the web register's. That needs https://pki.sgit.ai/.well-known/apple-app-site-association listing this app under webcredentials, and the Associated Domains capability on the app id. It makes that site vouch for this app.",
   "detail": [
    "The plan assumes pki.sgit.ai, so the app's passkey, door, master vault and key are the same as the web register's. That needs https://pki.sgit.ai/.well-known/apple-app-site-association listing this app under webcredentials, and the Associated Domains capability on the app id. It makes that site vouch for this app.",
    "The alternative is voicedebrief.ai (or this site), which gives a separate door and identity."
   ],
   "statusLine": "Status: open, needs the owner's decision.",
   "places": [
    "Settings: Identity"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/003-passkey-relying-party.md",
   "source": "The owner"
  },
  {
   "id": "issue-006",
   "kind": "issue",
   "number": "006",
   "app": "VoiceDebrief",
   "title": "What SGitVault still lacks",
   "status": "in-progress",
   "why": "The issue's status: \"Status: open, partly done. Milestone: 4. See section 6.3 of the plan.\"",
   "summary": "Done in v0.1.5: create a vault, and create at a given key (what a door needs).",
   "detail": [
    "Done in v0.1.5: create a vault, and create at a given key (what a door needs).",
    "Still to do:",
    "Create a vault; create with a derived id (doors); createAccount and addDoor (a port of newsroom-vault.js); a file-level merge; presigned upload for audio over 4 MB. Extend ios-vault.yml so that Swift also reads what sgit wrote."
   ],
   "statusLine": "Status: open, partly done. Milestone: 4. See section 6.3 of the plan.",
   "places": [],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/006-vault-engine-gaps.md",
   "source": "The project"
  },
  {
   "id": "issue-007",
   "kind": "issue",
   "number": "007",
   "app": "VoiceDebrief",
   "title": "Stop SGitVault being two copies (decision D8)",
   "status": "parked",
   "why": "The issue's status: \"Status: open, to schedule.\"",
   "summary": "Packages/SGitVault is a copy from PrompTugal__App__iOS. Extract it into a repository both apps depend on before the copies diverge. Until then every change is recorded in Packages/SGitVault/SOURCE.md.",
   "detail": [
    "Packages/SGitVault is a copy from PrompTugal__App__iOS. Extract it into a repository both apps depend on before the copies diverge. Until then every change is recorded in Packages/SGitVault/SOURCE.md."
   ],
   "statusLine": "Status: open, to schedule.",
   "places": [],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/007-shared-vault-package.md",
   "source": "The project"
  },
  {
   "id": "issue-008",
   "kind": "issue",
   "number": "008",
   "app": "VoiceDebrief",
   "title": "Credit, charging per use, top-up",
   "status": "in-progress",
   "why": "Open, and named by the release notes of v0.1.20.",
   "summary": "On the pattern of newsroom.sgit.ai's SG Meter: £5.00 of starting credit, a balance allowed below zero, nothing blocked, a charge can be declined with a reason.",
   "detail": [
    "On the pattern of newsroom.sgit.ai's SG Meter: £5.00 of starting credit, a balance allowed below zero, nothing blocked, a charge can be declined with a reason.",
    "Done (in test, not yet seen on a device)",
    "- A ledger in micro-credits (a millionth of a pound), append-only, one JSON file on the device. - A price list in one place (PriceList in Model/Prices.swift), every figure a placeholder, whole pence, nothing free: a transcript 3p a started minute, a debrief 5p, creating a vault 10p, and 1p each for a clean passage, opening a file, adding a word, adding a vault, a file saved to a vault, sending, adding a recipient, pushing or pulling a vault, adding a server. The owner accepted the figures for now, and that a note saving itself, push and pull are charged. - Takings by feature on the credit screen: uses, charged, declined, given back, by period. - A counter on Record and Library, a row in Settings, and the credit screen: balance, top-up, entries newest first, prices. - Below zero: nothing is held back; a warmer colour and one sentence on the credit screen. - PaymentProvider, with a...",
    "The owner's decisions",
    "1. The prices. Reading and deleting are charged at 1p (the owner's word); listing a vault, discarding a recording in progress and the settings are not. 2. The starting credit (£5.00 now). 3. What happens below zero (nothing now). 4. The top-up amounts and product ids (one pack, ai.voicedebrief.app.credit.500, £5.00 now). 5. Whether running a note again is charged again (it is now).",
    "Still to do",
    "- The owner: sign the Paid Applications Agreement and create the consumable product. Then switch Payments.appStoreIsOn on and try a sandbox purchase from a TestFlight build. - The other half of a profit and loss by feature: a cost per feature, and an opt-in summary (feature keys and totals, no note content) sent to the owner over a lane. Proposed on the credit page. - The same ledger in the sgit app (Apps/SGit), with its own price list. - The ledger in the user's vault, one log per device, after the account (011, 014, 018). - Ask App Review, before the first submission, about a balance that is paid after it goes negative.",
    "Enforcement, said plainly"
   ],
   "statusLine": "Status: open. A first version is in the app with a simulated top-up; no money changes hands. Waits on the owner for the prices and for the products in App Store Connect. Everything is on the credit page.",
   "places": [
    "The balance in the top bar",
    "Settings: Recipients"
   ],
   "versions": [
    "v0.1.20"
   ],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/008-credits.md",
   "source": "The owner"
  },
  {
   "id": "issue-009",
   "kind": "issue",
   "number": "009",
   "app": "VoiceDebrief",
   "title": "Read WhatsApp's Ogg Opus (spike S4)",
   "status": "proposed",
   "why": "Open, with nothing built yet: \"Status: open.\"",
   "summary": "AVAudioFile does not open Ogg containers, so a .opus or .ogg voice note fails with a message that says so. Build the Ogg page and packet parser and feed the Opus packets to AVAudioConverter (kAudioFormatOpus); bundle libopus only if that fails. Done when twenty real WhatsApp files decode.",
   "detail": [
    "AVAudioFile does not open Ogg containers, so a .opus or .ogg voice note fails with a message that says so. Build the Ogg page and packet parser and feed the Opus packets to AVAudioConverter (kAudioFormatOpus); bundle libopus only if that fails. Done when twenty real WhatsApp files decode."
   ],
   "statusLine": "Status: open.",
   "places": [],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/009-ogg-opus.md",
   "source": "The project"
  },
  {
   "id": "issue-010",
   "kind": "issue",
   "number": "010",
   "app": "VoiceDebrief",
   "title": "Judge Apple's models on real voice notes (spike S2)",
   "status": "parked",
   "why": "The issue's status: \"Status: open, with the owner. This can stop the project.\"",
   "summary": "Build 0.1.1 records or opens a voice note, transcribes it and writes a debrief. On an iPhone, an iPad and a Mac, with about ten real notes (English and Portuguese, short and long): is the transcript accurate, is the debrief usable, does European Portuguese work, what does the Diagnostics screen report, how long does each step take? Share the Diagnostics report after a few runs: it holds timings...",
   "detail": [
    "Build 0.1.1 records or opens a voice note, transcribes it and writes a debrief. On an iPhone, an iPad and a Mac, with about ten real notes (English and Portuguese, short and long): is the transcript accurate, is the debrief usable, does European Portuguese work, what does the Diagnostics screen report, how long does each step take? Share the Diagnostics report after a few runs: it holds timings and sizes, never the words."
   ],
   "statusLine": "Status: open, with the owner. This can stop the project.",
   "places": [
    "Settings: Diagnostics"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/010-judge-the-models.md",
   "source": "The owner"
  },
  {
   "id": "issue-012",
   "kind": "issue",
   "number": "012",
   "app": "VoiceDebrief",
   "title": "The lab, first experiment (L01): one prompt, tools on and off",
   "status": "in-progress",
   "why": "The issue says: \"Built and in the test build: the Lab under Settings, L01, four read-only tools, six presets, the export. Compiled and unit tested in CI; never run against a...\"",
   "summary": "A Lab section: one prompt to the on-device model with a chosen set of tools, and everything shown: what the model was given, each tool call, the answer, the time. This is also the first slice of the model \"door\" (issue 013). Find out how reliably the on-device model calls tools before building anything on it.",
   "detail": [
    "A Lab section: one prompt to the on-device model with a chosen set of tools, and everything shown: what the model was given, each tool call, the answer, the time. This is also the first slice of the model \"door\" (issue 013). Find out how reliably the on-device model calls tools before building anything on it.",
    "Where it stands (13 November 2026)",
    "Built and in the test build: the Lab under Settings, L01, four read-only tools, six presets, the export. Compiled and unit tested in CI; never run against a model. Open until the owner runs the presets on an iPhone, an iPad and a Mac and sends back the exported runs. What the runs show decides L02."
   ],
   "statusLine": "Status: open. See the articles \"The lab\" and \"Two decision engines\".",
   "places": [
    "Settings: Experiments, the Lab",
    "The repository: CI"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/012-lab-one-prompt.md",
   "source": "The project"
  },
  {
   "id": "issue-013",
   "kind": "issue",
   "number": "013",
   "app": "VoiceDebrief",
   "title": "Doors: a harness inside the app",
   "status": "proposed",
   "why": "Open, with nothing built yet: \"Status: open. See the article \"A harness inside the app\" and https://sharness.ai.\"",
   "summary": "Network, file system, vault, keys, model, run: each a small component with a policy and a record. First the model door (with issue 012), then the vault door (which has its log). A view that draws requests passing through the doors, for iPad and Mac.",
   "detail": [
    "Network, file system, vault, keys, model, run: each a small component with a policy and a record. First the model door (with issue 012), then the vault door (which has its log). A view that draws requests passing through the doors, for iPad and Mac.",
    "Where it stands (13 November 2026)",
    "The model door's first slice exists (ModelDoor, Engine/LabModelDoor.swift): a policy and a record, used by the Lab only. Next: the debrief pipeline through the same door (the main session owns DebriefSession), the vault door from its log, and the drawing."
   ],
   "statusLine": "Status: open. See the article \"A harness inside the app\" and https://sharness.ai.",
   "places": [
    "Settings: Experiments, the Lab"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/013-harness-doors.md",
   "source": "The project"
  },
  {
   "id": "issue-014",
   "kind": "issue",
   "number": "014",
   "app": "VoiceDebrief",
   "title": "Several vaults and several lanes, by name (build C of the design)",
   "status": "proposed",
   "why": "Open, with nothing built yet: \"Status: open. The owner wants to send memos to several vaults and several conductors.\"",
   "summary": "Register vaults and lanes with names; choose where a note goes; saved and sent states on each note; \"also save to vault\". Adding a lane should be as easy as pasting or scanning a link.",
   "detail": [
    "Register vaults and lanes with names; choose where a note goes; saved and sent states on each note; \"also save to vault\". Adding a lane should be as easy as pasting or scanning a link."
   ],
   "statusLine": "Status: open. The owner wants to send memos to several vaults and several conductors.",
   "places": [],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/014-vaults-and-lanes-register.md",
   "source": "The owner"
  },
  {
   "id": "issue-015",
   "kind": "issue",
   "number": "015",
   "app": "VoiceDebrief",
   "title": "The larger Apple model on Private Cloud Compute, as an option",
   "status": "parked",
   "why": "The issue's status: \"Status: open, blocked. Needs the entitlement from Apple (the owner applies) and the iOS 27 SDK in CI (the simulators on the runner are iOS 26.5: check which...\"",
   "summary": "CI's SDK, checked (13 November 2026)",
   "detail": [
    "CI's SDK, checked (13 November 2026)",
    "The macos-26 runner's newest Xcode is 26.6 (build 17F113, Swift 6.3.3) with the iOS 26.5 SDK. There is no iOS 27 SDK, so PrivateCloudComputeLanguageModel cannot be compiled there and the Lab has no row for it. Apple's documentation also marks LanguageModelSession.GenerationError as deprecated in iOS 27 (what replaces it was not checked): OnDeviceModel.swift switches on the old type and will need a look when the SDK moves."
   ],
   "statusLine": "Status: open, blocked. Needs the entitlement from Apple (the owner applies) and the iOS 27 SDK in CI (the simulators on the runner are iOS 26.5: check which Xcode it has). Opt-in per note or as a mode, never silent.",
   "places": [
    "Settings: Experiments, the Lab",
    "The repository: CI"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/015-private-cloud-compute.md",
   "source": "The owner"
  },
  {
   "id": "issue-016",
   "kind": "issue",
   "number": "016",
   "app": "VoiceDebrief",
   "title": "Pictures of every screen, and synthetic users",
   "status": "in-progress",
   "why": "Open, and named by the release notes of v0.1.29.",
   "summary": "Carry over screens.yml from PrompTugal__App__iOS: one XCUITest per screen with sample data, PNGs for iPhone and iPad. Then synthetic users walking them. The screenshots are also how the agent sees its own work.",
   "detail": [
    "Carry over screens.yml from PrompTugal__App__iOS: one XCUITest per screen with sample data, PNGs for iPhone and iPad. Then synthetic users walking them. The screenshots are also how the agent sees its own work.",
    "Progress",
    "- Stage 1, pictures: done. screens.yml, the UI test target VoiceDebriefUITests, the scheme VoiceDebriefScreens, and the launch arguments -VDSampleData and -VDScreen. Run 1 produced 68 pictures (17 screens, iPhone and iPad, light and dark). How to fetch them: website/develop/index.md, \"Seeing the screens\". - Stage 2, synthetic users: round 1 done. website/reviews/round-1/index.md: what is plainly wrong, four users, 21 findings (15 open, 6 artefacts of the pictures), issues 029 to 038. Round 2, and what the pictures could not show, are issue 038. - Round 2 done (14 November 2026): website/reviews/round-2/index.md. Three of round 1's open findings fixed, six in part, six unchanged; two of four users changed their minds; twelve new findings, issues 039 to 041. - The Lab's two screens (lab, lab.prompt) were added when the Lab reached dev. Adding a screen is four small edits, listed on the..."
   ],
   "statusLine": "Status: open. See the article \"Synthetic users\".",
   "places": [
    "Settings: Experiments, the Lab",
    "The repository: pictures of every screen"
   ],
   "versions": [
    "v0.1.29"
   ],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/016-screens-and-synthetic-users.md",
   "source": "The project"
  },
  {
   "id": "issue-018",
   "kind": "issue",
   "number": "018",
   "app": "VoiceDebrief",
   "title": "The user's key pair, the device key, and vouching (with issue 005)",
   "status": "in-progress",
   "why": "The issue says: \"Built: PKIKit (issue 005, done), the Identity screen under Settings, the user's key pair in iCloud Keychain, the device key, the vouching statement and its...\"",
   "summary": "A user key pair (sgit bundle: RSA-OAEP 4096 and ECDSA P-256) that travels through iCloud Keychain; a device key that stays on the device (Secure Enclave where possible) and is wiped on reinstall; a statement in the vault, signed by the user key, vouching for the device key. Optionally, a delegation from pki.sgit.ai (/authorize/, kinds pki.sgit.ai/authorize/v1 and pki.sgit.ai/delegation/v1) so that...",
   "detail": [
    "A user key pair (sgit bundle: RSA-OAEP 4096 and ECDSA P-256) that travels through iCloud Keychain; a device key that stays on the device (Secure Enclave where possible) and is wiped on reinstall; a statement in the vault, signed by the user key, vouching for the device key. Optionally, a delegation from pki.sgit.ai (/authorize/, kinds pki.sgit.ai/authorize/v1 and pki.sgit.ai/delegation/v1) so that a registered person stands behind the app's key. The app must work without the register.",
    "Where it stands",
    "Built: PKIKit (issue 005, done), the Identity screen under Settings, the user's key pair in iCloud Keychain, the device key, the vouching statement and its place in a vault, the sign-in request and the check of the delegation that comes back. pki-interop.yml proves the formats against sgit and pki.sgit.ai's own code.",
    "Left, and whose it is:",
    "- The owner, on two devices: does the identity made on one appear on the other; does the device key say Secure Enclave on an iPhone; does a vouching statement get written to a vault and read back; does the round trip with pki.sgit.ai end with a delegation the app accepts. - The owner: the automatic return from pki.sgit.ai. It needs the Apple team id, for website/.well-known/apple-app-site-association, and the Associated Domains capability on the app id ai.voicedebrief.app. Then: the entitlement applinks:ios.app.voicedebrief.ai (and webcredentials: for the in-app sheet) in VoiceDebrief.entitlements, and PKIDelegation.returnsToTheApp set to true. Until then the answer is pasted in. - The session that owns VaultBook: issue 028, so that debriefs are signed by the device key. - Not started: walking the register's links from the pinned root for an issuer that is not the root; a \"strong\"..."
   ],
   "statusLine": "Status: open: written and proven in CI, not yet run on a device. Decided by the owner, 13 November 2026. See the article \"Where each key lives\".",
   "places": [
    "Vaults tab",
    "Settings: Identity",
    "The repository: CI"
   ],
   "versions": [
    "v0.1.29"
   ],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/018-identity.md",
   "source": "The owner"
  },
  {
   "id": "issue-019",
   "kind": "issue",
   "number": "019",
   "app": "VoiceDebrief",
   "title": "Lanes are recipients, and the app has an inbox",
   "status": "in-progress",
   "why": "The issue says: \"Built: recipients with names; add by QR code (camera or a picture) or pasted link; one Send button per recipient on a note; a recipient's QR code shown so it...\"",
   "summary": "Sending a note to somebody is a main activity, not a developer tool with caveats. A lane is a recipient: a person, another device, a cloud session. Recipients have names, are easy to add (paste or scan a link), and a finished note offers \"send to <name>\" as a first-class button. Per recipient, sending may be made automatic.",
   "detail": [
    "Sending a note to somebody is a main activity, not a developer tool with caveats. A lane is a recipient: a person, another device, a cloud session. Recipients have names, are easy to add (paste or scan a link), and a finished note offers \"send to <name>\" as a first-class button. Per recipient, sending may be made automatic.",
    "Two-way: each device has a vault, so each can have a lane of its own that others write to. The app gets an inbox that looks and feels like one, where messages arriving and leaving can be seen.",
    "State, 13 November 2026 (v0.1.9, untried on a device)",
    "Built: recipients with names; add by QR code (camera or a picture) or pasted link; one Send button per recipient on a note; a recipient's QR code shown so it can be passed on; tools/conductor/ for the receiving side, so a new session or person can make an inbox and hand out its QR code.",
    "The owner's two-step exchange, of which the first half is built: 1. The conductor gives its QR code (its lane: where to write, and its public key). The app scans it. Built. 2. The app gives its own QR code back (its public key, and a lane on its own vault), so the conductor can write to the app and, if wanted, be given a vault key encrypted to it. Not built: it needs the app's key pair (issue 018) and an inbox on the app's vault (011).",
    "Also not built: remembering on a note who it was sent to; sending automatically per recipient; a link that opens the app (a URL scheme or universal link), which would let \"tap this link\" replace \"scan this code\".",
    "Extends 014 (names and a register). Replaces the design's position that a lane send is asked every time: the owner now wants it encouraged, with automatic sending as an option per recipient."
   ],
   "statusLine": "Status: open. Asked for by the owner in a voice note, 13 November 2026 (6 min 44 s, recorded on an iPad).",
   "places": [
    "Library, then a note",
    "Settings: Recipients",
    "The repository: tools/conductor"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/019-recipients-and-inbox.md",
   "source": "The owner's voice note"
  },
  {
   "id": "issue-020",
   "kind": "issue",
   "number": "020",
   "app": "VoiceDebrief",
   "title": "Show the flow as it happens",
   "status": "proposed",
   "why": "Open, with nothing built yet: \"Status: open. Asked for by the owner, 13 November 2026.\"",
   "summary": "A small animated drawing of what is happening now: the microphone, the speech model, Apple Intelligence on the device, Apple Intelligence in the cloud, the vault, the other device, a lane. Each lights up as data moves through it. Small beside the recording on an iPad, below it on an iPhone; pressing it opens a larger version with the sequence of events. It can be small, but it must give the sense...",
   "detail": [
    "A small animated drawing of what is happening now: the microphone, the speech model, Apple Intelligence on the device, Apple Intelligence in the cloud, the vault, the other device, a lane. Each lights up as data moves through it. Small beside the recording on an iPad, below it on an iPhone; pressing it opens a larger version with the sequence of events. It can be small, but it must give the sense of movement.",
    "The drawings at website/architecture/ are the static form of this. The record of events it needs is what issue 013 (doors) produces; today only the vault engine keeps one."
   ],
   "statusLine": "Status: open. Asked for by the owner, 13 November 2026.",
   "places": [],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/020-show-the-flow.md",
   "source": "The owner"
  },
  {
   "id": "issue-021",
   "kind": "issue",
   "number": "021",
   "app": "VoiceDebrief",
   "title": "Analyse while recording: a semantic graph, a title, pictures",
   "status": "proposed",
   "why": "Open, with nothing built yet: \"Status: open. Asked for by the owner, 13 November 2026. Laboratory work first (see 012).\"",
   "summary": "The model is on the device and costs nothing to ask, so there is no reason to wait for Stop.",
   "detail": [
    "The model is on the device and costs nothing to ask, so there is no reason to wait for Stop.",
    "1. A graph as you speak. At intervals, ask the model for what the words so far contain: facts, ideas, flows, names, entities, and how they connect. Draw it as it grows, so the speaker can connect the dots or correct it. Two levels of detail; more room on an iPad. 2. Two graphs compared. The same note through the on-device model and through Private Cloud Compute (015). 3. The screen reflects what is known. The title, the main areas and the note's page come from the graph. 4. Pictures. Past a certain size, a separate model session writes an image prompt and an image is made from it. Note: Apple's image generation is a system sheet (Image Playground), not a call the app can make silently, so find out what is possible first. 5. Can the model write SVG or HTML? An icon for a note; a variation of the debrief as a small page the app renders. Try it and record what comes back.",
    "Follows Two decision engines: one question at a time, through function calls, the code owning the state."
   ],
   "statusLine": "Status: open. Asked for by the owner, 13 November 2026. Laboratory work first (see 012).",
   "places": [],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/021-analysis-while-recording.md",
   "source": "The owner"
  },
  {
   "id": "issue-022",
   "kind": "issue",
   "number": "022",
   "app": "VoiceDebrief",
   "title": "Finishing saves to the vault; discarding is the awkward path",
   "status": "in-progress",
   "why": "The issue says: \"Built (untried on a device): the control that ends a recording is green with a tick and says the note is kept; Discard is a small red word at the top of the...\"",
   "summary": "Unless the user cancels, a finished note is saved to the vault. No button to remember.",
   "detail": [
    "Unless the user cancels, a finished note is saved to the vault. No button to remember.",
    "The control that ends a recording is green and says what happens: finish, process, save. The red control is only for throwing a recording away: placed away from the thumb, and taking two presses (or a held press) so it cannot be done by accident.",
    "State, 13 November 2026",
    "Built (untried on a device): the control that ends a recording is green with a tick and says the note is kept; Discard is a small red word at the top of the screen, away from the thumb, and asks before deleting. Built since (untried on a device): saving to the vault on finish, with a switch and a vault picker in Settings, and the note recording where it was saved or why not. Still to do: retry a failed save without being asked; not save twice when a note is run again; audio over 3.8 MB (023, now in the engine on work/sgit-app).",
    "Needs: a default vault (011, 014); a queue for saves made with no network; audio over 3.8 MB (006): the owner's 6 min 44 s note was 1.7 MB, so the limit is about a quarter of an hour."
   ],
   "statusLine": "Status: open. Decided by the owner, 13 November 2026. Answers open question 1 of the design.",
   "places": [],
   "versions": [
    "v0.1.13"
   ],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/022-finish-saves-to-the-vault.md",
   "source": "The owner"
  },
  {
   "id": "issue-023",
   "kind": "issue",
   "number": "023",
   "app": "VoiceDebrief",
   "title": "Files over 4 MB in a vault (presigned upload and download)",
   "status": "in-progress",
   "why": "Open, and named by the release notes of v0.1.19.",
   "summary": "Today VaultBook.largestAudio is 3.8 MB (about a quarter of an hour at the app's bit rate) and a longer note is saved to the vault without its audio. The audio is still on the device; it is the vault copy that is missing.",
   "detail": [
    "Today VaultBook.largestAudio is 3.8 MB (about a quarter of an hour at the app's bit rate) and a longer note is saved to the vault without its audio. The audio is still on the device; it is the vault copy that is missing.",
    "How sgit does it (read from sgit_ai, network/api/Vault__API.py and core/actions/push/Vault__Batch.py)",
    "An encrypted blob over 4 MB (LARGE_BLOB_THRESHOLD) does not go in the batch. Instead:",
    "1. POST /api/vault/presigned/initiate/{vault_id} with the write-key header and {file_id, file_size_bytes, num_parts} (num_parts 0 lets the server choose, 10 MB a part). The answer is {upload_id, part_urls: [{part_number, upload_url}], part_size}. 2. PUT each part of the ciphertext to its upload_url; keep the ETag of each answer. 3. POST /api/vault/presigned/complete/{vault_id} with {file_id, upload_id, parts: [{part_number, etag}]}. On failure, POST /api/vault/presigned/cancel/{vault_id} with {upload_id, file_id}. 4. The tree entry for the file carries large: true.",
    "Reading: GET /api/vault/presigned/read-url/{vault_id}/{file_id} gives {url, expires_in}; the blob is fetched from that URL, in ranges of 8 MB. A server without the route answers presigned_not_available, 400, 404 or 501, and sgit falls back to the ordinary read.",
    "To do",
    "- SGitVault: the four calls, the large flag when writing a tree and when reading one, download by range, the fallback. Raise the reader's 16 MB limit for large blobs. Record it in SOURCE.md. - VaultBook.save: no size limit on the audio; progress for a long upload; a failed upload can be retried and never touches the note on the device. - ios-vault.yml: Swift writes a vault with a file over 4 MB and sgit reads it, and the reverse. - The presigned URL's host must be reachable: check it is https, as sgit does."
   ],
   "statusLine": "Status: open. Asked for by the owner, 13 November 2026: no recording may be left out of the vault because it is long. The audio saved is the compressed .m4a; that is settled for now.",
   "places": [
    "Vaults tab"
   ],
   "versions": [
    "v0.1.19"
   ],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/023-large-files-in-a-vault.md",
   "source": "The owner"
  },
  {
   "id": "issue-024",
   "kind": "issue",
   "number": "024",
   "app": "VoiceDebrief",
   "title": "A clean text instead of a summary, with questions where the note is unclear",
   "status": "in-progress",
   "why": "Open, and the reality file lists for it: A clean text, with questions.",
   "summary": "Checked against Apple's documentation and developer forum, 13 November 2026: item 1 below is not possible today. AnalysisContext.contextualStrings exists, but only DictationTranscriber uses it; SpeechTranscriber, which the app uses, ignores it. So the words go to the language model instead (items 2 and 3, built). Not built: playing a question's audio, the glossary in a vault, doing this while...",
   "detail": [
    "Checked against Apple's documentation and developer forum, 13 November 2026: item 1 below is not possible today. AnalysisContext.contextualStrings exists, but only DictationTranscriber uses it; SpeechTranscriber, which the app uses, ignores it. So the words go to the language model instead (items 2 and 3, built). Not built: playing a question's audio, the glossary in a vault, doing this while recording.",
    "The transcript hears \"vault\" as \"vote\" and \"volt\"; the summary then repeats the mistake and loses detail. Proposed instead of, or beside, the debrief:",
    "1. Fix it at the source. Give the speech model the user's own words (vault, lane, sgit, names) if SpeechAnalyzer accepts contextual strings. To be verified against Apple's documentation. 2. A clean text. The note rewritten in full sentences, a passage at a time, nothing left out: false starts and repetitions removed, known terms corrected from a glossary. The glossary is the start of the semantic graph (021) and lives in the vault, so it follows the user between devices. 3. Questions. The model marks the passages it could not make sense of, as structured output, and the app asks the speaker about those: by showing the passage and playing its audio. The answers go into the glossary. 4. Nothing is replaced. The transcript as heard is always kept; the clean text shows what it changed.",
    "To find out: how often the on-device model \"corrects\" something that was right; whether it can mark its own doubt usefully; whether a passage at a time is fast enough to do while recording."
   ],
   "statusLine": "Status: open. The owner's idea, 13 November 2026. A first version is in v0.1.8, untried on a device.",
   "places": [
    "A note: Clean text"
   ],
   "versions": [],
   "features": [
    "A clean text, with questions"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/024-clean-text-and-clarifications.md",
   "source": "The owner"
  },
  {
   "id": "issue-025",
   "kind": "issue",
   "number": "025",
   "app": "VoiceDebrief",
   "title": "The version in plain sight, release notes worth reading, and a briefing on opening",
   "status": "in-progress",
   "why": "The issue says: \"Items 3 and 4 begun (untried on a device): the app notices an update and links its page; a briefing card says what happened since the last opening, worked out...\"",
   "summary": "Items 3 and 4 begun (untried on a device): the app notices an update and links its page; a briefing card says what happened since the last opening, worked out by the code. The model writing it in its own words, and the vault's state (\"the vault is fine\"), are not done. Item 2's pictures are the screens session's per-version pages.",
   "detail": [
    "1. The version is easy to find in the app and links to the release notes. Started: a line on the record screen (untried on a device). 2. Release notes become short articles: what changed, with pictures of the new screens where possible. The pictures can come from the screens work (issue 016). 3. The app notices it has been upgraded and says what is new. 4. On opening, a short briefing written by the on-device model: what is new, what is in the library, whether the vault is in step (\"I just checked the vault, the vault is fine\"). Keep it small."
   ],
   "statusLine": "Status: open. Asked for by the owner in a voice note, 13 November 2026 (build 0.1.9).",
   "places": [
    "Library tab",
    "Record tab: the briefing card",
    "The version badge in the top bar"
   ],
   "versions": [
    "v0.1.35"
   ],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/025-version-and-release-notes-in-the-app.md",
   "source": "The owner's voice note"
  },
  {
   "id": "issue-026",
   "kind": "issue",
   "number": "026",
   "app": "VoiceDebrief",
   "title": "Act on a note at once: send without waiting, controls that do not move",
   "status": "in-progress",
   "why": "The issue says: \"Built (untried on a device): the Send buttons are a bar fixed at the bottom of the note, in the same place whatever the note above is doing; pressing one before...\"",
   "summary": "What was wrong: after the green button the note fills in, the transcript and then the debrief push the Send button down the screen, and it cannot be pressed until they are done.",
   "detail": [
    "What was wrong: after the green button the note fills in, the transcript and then the debrief push the Send button down the screen, and it cannot be pressed until they are done.",
    "Built (untried on a device): the Send buttons are a bar fixed at the bottom of the note, in the same place whatever the note above is doing; pressing one before the note is finished sends it the moment it is, so the phone can be put away.",
    "Built since (untried on a device): finish and send in one press from the record screen, to any of the person's own recipients, staying on the record screen for the next note; sends queued one after another; the note remembers who it went to. Not built: sending to several recipients at once; a default recipient. For driving, the controls should be reachable without looking: see 021 and the voice session in 027."
   ],
   "statusLine": "Status: open. Asked for by the owner in a voice note, 13 November 2026 (build 0.1.9): \"When I record a voice memo, I am going to send it to somebody. That is the point.\"",
   "places": [
    "Library, then a note",
    "Record tab",
    "Settings: Recipients"
   ],
   "versions": [
    "v0.1.30"
   ],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/026-act-on-a-note-at-once.md",
   "source": "The owner's voice note"
  },
  {
   "id": "issue-027",
   "kind": "issue",
   "number": "027",
   "app": "VoiceDebrief",
   "title": "Show where the work happens; small remarks from the model; talking to the app",
   "status": "in-progress",
   "why": "The issue says: \"Item 1 begun (untried on a device): two lines on the record screen, on this device and network, green while busy. Lane sends are shown; vault push and pull...\"",
   "summary": "Item 1 begun (untried on a device): two lines on the record screen, on this device and network, green while busy. Lane sends are shown; vault push and pull, pki.sgit.ai and Apple's model downloads are not yet. Items 2 to 4 not started.",
   "detail": [
    "1. On the device, or over the network? Make it obvious, with something large and plain, when the app is using Apple's model on the device, when it is using the network, and for what. The owner: \"Even I was confused just now.\" This is the visible half of the doors (013) and of the flow drawing (020). 2. Settings for it. What may use the network, and when. 3. Small remarks. Not every use of the model is a big one: a line of commentary as things happen (\"that was a short memo\", \"sent to Maria\"), which also gives confidence that something is happening. 4. Talk to the app. A continuous voice session in which the app tells apart a memo, an instruction to the app (\"check the vault for new notes\", \"send that to Maria\") and something to answer; instructions become tool calls, each through a door, each shown. The owner calls this the killer feature. It follows Two decision engines: the code owns..."
   ],
   "statusLine": "Status: open. Asked for by the owner in a voice note, 13 November 2026. Laboratory work first.",
   "places": [
    "Record tab"
   ],
   "versions": [
    "v0.1.31"
   ],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/027-show-where-work-happens-and-talk-to-the-app.md",
   "source": "The owner's voice note"
  },
  {
   "id": "issue-028",
   "kind": "issue",
   "number": "028",
   "app": "VoiceDebrief",
   "title": "The device key signs every commit, and the vault says whose device it is",
   "status": "in-progress",
   "why": "Open, and the reality file lists for it: The device's key pair; Vouching for a device; Debriefs signed by the device key; the vouching row in a vault's own screen.",
   "summary": "Issue 018 built the device key (Engine/IdentityDeviceKey.swift): a P-256 key in the Secure Enclave where there is one, otherwise in the Keychain for this device only, wiped on the first use after a reinstall. It is a VaultCommitSigner. Today VaultBook.commitSigner() still makes its own software key (commit-signer in the Keychain) and signs every debrief with that. So a vault holds commits by two...",
   "detail": [
    "Issue 018 built the device key (Engine/IdentityDeviceKey.swift): a P-256 key in the Secure Enclave where there is one, otherwise in the Keychain for this device only, wiped on the first use after a reinstall. It is a VaultCommitSigner. Today VaultBook.commitSigner() still makes its own software key (commit-signer in the Keychain) and signs every debrief with that. So a vault holds commits by two keys from one device, and only the identity's own commit is signed by the key the vouching statement names.",
    "What to change, in VaultBook",
    "1. commitSigner() returns any VaultCommitSigner and hands out the device key:",
    "swift func commitSigner() throws -> any VaultCommitSigner { try IdentityBook.shared.deviceSigner() }",
    "Tests that need a signer without a Keychain can keep SoftwareCommitSigner, or make a device key over memory: IdentityDeviceKey.current(store: IdentityMemoryKeyStore(), defaults: …, useSecureEnclave: false). The commit-signer Keychain item can then be deleted on first run. Commits it signed stay checkable: its public half is in each vault under bare/keys/.",
    "2. A way to commit arbitrary files, which save(run:audioURL:to:) can then be written on top of:",
    "swift func write(_ files: [String: Data], message: String, to vault: SavedVault) async throws -> String",
    "Engine/IdentityVaultAccess.swift is the one file in the identity that knows the shape of VaultBook. It writes the vouching statement with what VaultBook exposes today, without its bookkeeping. Replace the body of IdentityVaultAccess.write with a call to the method above and delete the rest of it."
   ],
   "statusLine": "Status: open. For the work/local-vaults session, which owns VaultBook and VaultsView. From the work/identity session (issue 018), which was asked not to edit those files.",
   "places": [
    "Vaults tab",
    "Settings: Identity"
   ],
   "versions": [],
   "features": [
    "The device's key pair",
    "Vouching for a device",
    "Debriefs signed by the device key; the vouching row in a vault's own screen"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/028-device-key-signs-commits.md",
   "source": "The project"
  },
  {
   "id": "issue-031",
   "kind": "issue",
   "number": "031",
   "app": "VoiceDebrief",
   "title": "Say what Send does, on the note",
   "status": "built-untried",
   "why": "The issue says: \"Built (untried on a device): one line in the bar saying what goes and that the developer asks first; the built-in recipient named the developer of this test...\"",
   "summary": "Built (untried on a device): one line in the bar saying what goes and that the developer asks first; the built-in recipient named the developer of this test build, quieter and last; your own recipients first; the bar only on a note being made or a finished one with words.",
   "detail": [
    "Finding 3. Every note screen. Found by the privacy user (it decided them against the app), the driver and the user who lost a recording.",
    "The owner asked for the send bar (issue 026: sending is the point of a memo), and it stays. What the three users could not tell from the screen: that pressing it asks first (it does), who \"The developer\" is, whether the audio goes with the words, and where it goes. The bar is also shown on a note that was interrupted and on one with no transcript. To a person who has not chosen a recipient, the largest control on a private note sends it to a stranger.",
    "To do, in order of cheapness: one line under or in the bar saying it asks first and what goes (\"asks first; sends the audio and the words, encrypted to their key\"); name the built-in recipient as what it is on a test build, in lower case (\"the developer of this test build\"); once a person has added a recipient of their own, put that one first. Consider not offering the built-in recipient as the primary control until it has been used once on purpose.",
    "Round 2: fixed in the main (the name, the quieter look, the line saying what goes and that it asks first, not shown on an interrupted note). Left: the confirmation names the key but not the server, who the developer is, or how long a sent note is kept; the bar and its small print cover about a fifth of an iPhone screen; the \"Add\" control is cut off at the right edge; \"The developer\" has a capital in the queued-send line."
   ],
   "statusLine": "Status: open. From review round 1 (13 November 2026, website/reviews/round-1/index.md). Owner: the main session (SendBar in RecipientsView.swift).",
   "owner": "the main session (SendBar in RecipientsView",
   "places": [
    "A note: the send bar",
    "Library, then a note",
    "Settings: Recipients"
   ],
   "versions": [],
   "features": [
    "Reviews from the pictures"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/031-say-what-send-does.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-032",
   "kind": "issue",
   "number": "032",
   "app": "VoiceDebrief",
   "title": "Explain the balance where it is shown",
   "status": "in-progress",
   "why": "The issue says: \"Changed by the main session (the credit session had finished): the counter reads \"Test credit £4.85\" with a test-tube icon, and its spoken label says no money...\"",
   "summary": "Changed by the main session (the credit session had finished): the counter reads \"Test credit £4.85\" with a test-tube icon, and its spoken label says no money is taken and recording never stops; the credit screen's first sentence states the starting balance and that recording never stops.",
   "detail": [
    "Finding 4. Screens record, library. Found by three of four users.",
    "\"£4.85\" sits in the top bar of the first screen and goes down as the app is used. Nothing beside it says that this is a test, that no money is taken and that nothing stops when it reaches zero; that is said only on the Credit screen. Three users read it as paying per memo, and one asked what happens to a 40-minute recording when it runs out.",
    "To do: either mark the counter as a test where it is shown (a word, or a different look from money), or keep it off the record screen until charging is real. The Credit screen's opening sentence could also state the starting balance, which is nowhere on it.",
    "Round 2: unchanged, and reported again by all three users who see the record screen. One asked whether recording stops when it reaches zero."
   ],
   "statusLine": "Status: open. From review round 1 (13 November 2026, website/reviews/round-1/index.md). Owner: the credit session (CreditView, the counter in the top bar).",
   "owner": "the credit session (CreditView, the counter in the top bar)",
   "places": [
    "Record tab",
    "The balance in the top bar"
   ],
   "versions": [
    "v0.1.29"
   ],
   "features": [
    "Reviews from the pictures"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/032-explain-the-balance.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-033",
   "kind": "issue",
   "number": "033",
   "app": "VoiceDebrief",
   "title": "The log cannot tell a server from the device",
   "status": "in-progress",
   "why": "Open, and the reality file lists for it: Reviews from the pictures.",
   "summary": "Finding 5, with 12. Screens traffic, vaults-end. Found by the developer (it blocked the task: see every request) and by the privacy user.",
   "detail": [
    "Finding 5, with 12. Screens traffic, vaults-end. Found by the developer (it blocked the task: see every request) and by the privacy user.",
    "A request row reads \"GET folder, not cached (mutable)\" with a size and \"0 ms\". There is no host, no status, no clock time and nothing to say which action caused it, so a request to a server and a read from the device look the same. The totals on the Vaults screen call local reads \"Requests 18\" and \"Downloaded 28.4 KB\" for a vault that is \"On this device only\", and have no figure for what was sent, which is the one a careful person wants.",
    "To do: in each request row, where it went (the server's host, or \"this device\"), the status, and the time of day; group rows under the action that caused them; in the totals, count the device and each server apart, and add what was uploaded. Timings under a millisecond should not print as \"0 ms\". Sending a note to a recipient makes requests too and they appear in no log: see issues 013 and 020.",
    "Round 2: unchanged. \"Requests 18, Downloaded 1.6 MB\" on a vault that needs no network; the privacy user noticed that 1.6 MB is the size of the recording."
   ],
   "statusLine": "Status: open. From review round 1 (13 November 2026, website/reviews/round-1/index.md). Owner: the session that owns the vaults (TrafficView, VaultActivitySection, VaultTrafficLog in SGitVault).",
   "owner": "the session that owns the vaults (TrafficView, VaultActivitySection, VaultTrafficLog in SGitVault)",
   "places": [
    "Settings: Recipients",
    "Settings: Every step the vault engine took"
   ],
   "versions": [],
   "features": [
    "Reviews from the pictures"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/033-the-log-cannot-tell-a-server-from-the-device.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-035",
   "kind": "issue",
   "number": "035",
   "app": "VoiceDebrief",
   "title": "A readable width on iPad",
   "status": "in-progress",
   "why": "The issue says: \"Built for this session's screens and the finished sessions' (library, note, settings, diagnostics, about, recipients, words, lab, credit, identity): a...\"",
   "summary": "Built for this session's screens and the finished sessions' (library, note, settings, diagnostics, about, recipients, words, lab, credit, identity): a readableWidth() modifier, 720 points, centred. Not yet: VaultsView (the vaults session), file paths breaking at a slash.",
   "detail": [
    "Finding 7, with 14. Every list on iPad: library, the note screens, vaults, vault.detail, settings, diagnostics, about, credit, recipients.",
    "In landscape on iPad a list runs from one edge of the detail column to the other, about 1,150 points, with a label at the far left and its value at the far right. Only the record screen holds its content to a readable width, as the design asks of every screen (\"so that a wide window is not a stretched phone\").",
    "To do: one modifier, used by every list, that holds content to a readable width and centres it; file paths in a vault should break at a slash, not in the middle of a name.",
    "Round 2: fixed for a note, the Library and Settings. The Vaults screens remain."
   ],
   "statusLine": "Status: open. From review round 1 (13 November 2026, website/reviews/round-1/index.md). Owner: the main session for the shell and the note, library and settings screens; the vaults session for VaultsView.",
   "owner": "the main session for the shell and the note, library and settings screens; the vaults session for VaultsView",
   "places": [
    "Library, then a note",
    "Library tab",
    "Record tab"
   ],
   "versions": [],
   "features": [
    "Reviews from the pictures"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/035-a-readable-width-on-ipad.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-036",
   "kind": "issue",
   "number": "036",
   "app": "VoiceDebrief",
   "title": "States that say what to do next",
   "status": "built-untried",
   "why": "The issue says: \"Built (untried on a device): row states say what to do or why; an untranscribed note is \"Voice note, not yet transcribed\"; a cut title ends with an ellipsis...\"",
   "summary": "Built (untried on a device): row states say what to do or why; an untranscribed note is \"Voice note, not yet transcribed\"; a cut title ends with an ellipsis; Recent says the day; Settings says \"as you speak\" and that an interrupted note is saved once run again; the promise is on the record screen before recording; the language is named; \"1 line\". Not done: Diagnostics' \"Machine\" line (check what a...",
   "detail": [
    "Finding 8, with 13 and 14. Screens record, library, settings, diagnostics, note details.",
    "Small things that left a user without a next step or with a wrong reading:",
    "- \"Not finished\" and \"Transcript only\" on a row explain nothing. The first needs \"interrupted: open to run it again\"; the second needs to say the note was too short to summarise, or that the model was not available. - \"Recent\" on the record screen shows a time and no day: yesterday's interrupted note reads as today's. - An interrupted note is titled \"Recording\", which on the record screen reads as something happening now. - A title is the first twelve words with nothing to mark the cut, and on an iPhone a row's title is cut mid-word and its state wraps onto a third line. - \"Save each finished note to a vault\" is silent about a note that was interrupted. - \"Every recording is kept on this device the moment it stops\" on Settings; the recording screen says \"as you speak\", which is the stronger and truer sentence. - No promise before recording: \"saved as you speak\" appears only once a...",
    "Round 2: fixed in the main. Left: a Library title cut in the middle of a word where Recent cuts at a word; a time just after midnight printed \"0:03\" beside a length; lengths as \"49.0 s\" in a row and \"00:49\" in the player; an interrupted row with no length; \"Transcribe and debrief again\" and the transcript hint on a note that has no transcript; nothing while recording that says how much is saved so far."
   ],
   "statusLine": "Status: open. From review round 1 (13 November 2026, website/reviews/round-1/index.md). Owner: the main session (NoteRow, RecordView, SettingsView, DiagnosticsView).",
   "owner": "the main session (NoteRow, RecordView, SettingsView, DiagnosticsView)",
   "places": [
    "Library, then a note",
    "Library tab",
    "Record tab"
   ],
   "versions": [
    "v0.1.29"
   ],
   "features": [
    "Reviews from the pictures"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/036-states-that-say-what-to-do.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-037",
   "kind": "issue",
   "number": "037",
   "app": "VoiceDebrief",
   "title": "A vault, for someone who has never met one",
   "status": "in-progress",
   "why": "Open, and the reality file lists for it: Reviews from the pictures.",
   "summary": "Finding 9, with 12. Screens vaults, vault.detail, note.finished-end. Found by three of four users.",
   "detail": [
    "Finding 9, with 12. Screens vaults, vault.detail, note.finished-end. Found by three of four users.",
    "The design says the Vaults tab \"opens with what a vault is in three lines and one button\", with the technical parts behind \"Technical\". The tab opens with a list, a form and the words \"random key\", \"signed commit\", \"server\", \"token\", and the two non-technical users took the end of a note (\"Save this note to the vault ... as one signed commit\") to mean the note was not yet safe. What the privacy user could not find out:",
    "- whether this note is already in a vault (the note says only \"Kept on this device\", while saving each finished note is switched on); - whether notes saved automatically go to a server by themselves once the vault has one (they do not: say so where the server is chosen); - that a server stores only what it cannot read (said in a footer on the Vaults tab, not on the vault); - that the vault \"On this device only\" is a second copy on the same phone, not a backup.",
    "Also: the address filled in for a new server (\"https://dev.send.sgraph.ai\", in the same dark text as a saved row, directly under the saved server) reads as a second server; and \"sgit clone followed by this key\" gives no command and is true only once the vault is on a server.",
    "Round 2: unchanged. Added: the switch \"Save each finished note to a vault\" does not say where that vault is or whether one with a server sends by itself; neither a note nor the confirmation before deleting says whether the note is in a vault; no one place lists everything that can leave the phone, and backups are not mentioned."
   ],
   "statusLine": "Status: open. From review round 1 (13 November 2026, website/reviews/round-1/index.md). Owner: the vaults session (VaultsView, SaveToVaultSection).",
   "owner": "the vaults session (VaultsView, SaveToVaultSection)",
   "places": [
    "Vaults tab"
   ],
   "versions": [],
   "features": [
    "Reviews from the pictures"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/037-a-vault-for-someone-who-has-never-met-one.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-038",
   "kind": "issue",
   "number": "038",
   "app": "VoiceDebrief",
   "title": "What the pictures could not show",
   "status": "in-progress",
   "why": "Open, and the reality file lists for it: Reviews from the pictures.",
   "summary": "Finding 15, and the artefacts 16 to 20. Round 1 was limited by its own pictures.",
   "detail": [
    "Finding 15, and the artefacts 16 to 20. Round 1 was limited by its own pictures.",
    "- No picture of a confirmation. The app asks before sending, deleting and discarding; three users reported that it does not, because no picture shows it. Photograph each dialog (a test that taps the control, then shoots). - Note screens are shown pushed under the Library tab. In the app, stopping opens the note on the Record tab. Show note.working there. - The sample vault has a new random key in every launch, so its id, head and times differ between pictures of \"the same\" vault. Keep no key in the source, but make one sample world per run: write the sample folder once and let each launch reuse it (a path passed as a launch argument). - Different pictures use different sample notes (3 in Settings, 4 in Library). Use one set, and say in the picture's name when a state is added. - Not photographed: the Lab after a run, a vault that has a server, a recipient added by hand, the Identity...",
    "Round 2 done: the confirmations, a queued send, a queue of notes, recordings of the length they claim, and a note being made on the Record tab are pictured. Still to do: one sample world per run, the Lab after a run, a vault with a server, a recipient added by hand, an identity, portrait on iPad, the largest text size, and settings in UserDefaults.",
    "Round 3 done: finish and send, the two lines of where the work happens in four states, the briefing, a sent note and the alerts are pictured. Added to what is still to do: the record screen just after \"Finish and send\" (its card), a send that failed, and a note saved to a vault by the app rather than by the sample."
   ],
   "statusLine": "Status: open. From review round 1 (13 November 2026, website/reviews/round-1/index.md). Owner: the screens session (work/screens: UITests/ScreensTests.swift, App/LaunchSample.swift).",
   "owner": "the screens session (work/screens: UITests/ScreensTests",
   "places": [
    "Library, then a note",
    "Library tab",
    "Record tab"
   ],
   "versions": [],
   "features": [
    "Reviews from the pictures"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/038-what-the-pictures-could-not-show.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-039",
   "kind": "issue",
   "number": "039",
   "app": "VoiceDebrief",
   "title": "A copy off the phone that anyone can make",
   "status": "built-untried",
   "why": "The issue says: \"Built (untried on a device): \"Share or save the recording\" on every note with audio, through the share sheet (Save to Files, AirDrop, any app); the footer says...\"",
   "summary": "Built (untried on a device): \"Share or save the recording\" on every note with audio, through the share sheet (Save to Files, AirDrop, any app); the footer says it leaves the device unencrypted.",
   "detail": [
    "New finding 1. Screens note.finished-end, vaults. Found by the user who lost a recording elsewhere; with the player in place it is the one thing that still decided them against keeping a recording only here.",
    "A note's words can be shared (\"Share the debrief and transcript\"). Its audio cannot: there is no export, no \"Save to Files\", no share of the recording. The only other copy is a vault, and the sample's vault is \"On this device only\": a second copy on the same phone. Beyond that is a form for a server's address and an access token, which this user could not fill in. An interrupted note, the one most at risk, is not saved to a vault until it has been run again.",
    "To do: share the recording itself from the note (the system share sheet, so Files, AirDrop and Mail all work), on every note that has audio, including an interrupted one. Say on the vault, in plain words, that a vault on this device is not a backup until it has a server."
   ],
   "statusLine": "Status: open. From review round 2 (14 November 2026, website/reviews/round-2/index.md). Owner: the main session (the note screen); the vaults session for what a vault on a server adds.",
   "owner": "the main session (the note screen); the vaults session for what a vault on a server adds",
   "places": [
    "Library, then a note"
   ],
   "versions": [
    "v0.1.29"
   ],
   "features": [
    "Reviews from the pictures"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/039-a-copy-off-the-phone.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-040",
   "kind": "issue",
   "number": "040",
   "app": "VoiceDebrief",
   "title": "A way to say no in each confirmation",
   "status": "built-untried",
   "why": "The issue says: \"Built (untried on a device): the three (send to the developer, delete a note, throw a recording away) are alerts now, which always show Cancel or Keep recording...\"",
   "summary": "Built (untried on a device): the three (send to the developer, delete a note, throw a recording away) are alerts now, which always show Cancel or Keep recording beside the destructive button.",
   "detail": [
    "New finding 3. Screens note.finished-send, note.finished-delete, record.recording-discard. Found by three of four users.",
    "Each confirmation is pictured with one button: \"Send the audio, transcript and debrief\", \"Delete the note and its recording\", \"Throw it away\". The code gives each a second button with the cancel role (\"Cancel\", \"Keep recording\"), but on the iPhone simulator of iOS 26 a confirmation dialog is drawn as a small panel beside the control and the cancel button is not drawn: a tap outside is the way out. Three users said they could not see how to back out, and for \"Throw it away\" while recording that is the wrong moment to guess.",
    "To do: check on a device whether the cancel button is shown. If it is not, use an alert, which always shows both buttons, for the three that destroy or send something."
   ],
   "statusLine": "Status: open. From review round 2 (14 November 2026, website/reviews/round-2/index.md). Owner: the main session (NoteDetailView, RecordView, SendBar).",
   "owner": "the main session (NoteDetailView, RecordView, SendBar)",
   "places": [
    "A note: the send bar",
    "Library, then a note",
    "Record tab"
   ],
   "versions": [
    "v0.1.29"
   ],
   "features": [
    "Reviews from the pictures"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/040-a-way-to-say-no.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-041",
   "kind": "issue",
   "number": "041",
   "app": "VoiceDebrief",
   "title": "Diagnostics describes a pasted lane that nothing uses",
   "status": "in-progress",
   "why": "The issue says: \"Fixed: the field and the sentence are gone; Diagnostics shows the built-in lane's vault and key as facts and says it cannot be changed there...\"",
   "summary": "Fixed: the field and the sentence are gone; Diagnostics shows the built-in lane's vault and key as facts and says it cannot be changed there; DeveloperLaneSection is deleted.",
   "detail": [
    "New finding 2. Screen diagnostics-end. Found by the privacy user and the developer, and checked in the code.",
    "The \"Lane\" section on Diagnostics has a field for an sgi1. lane link and says: \"After each run a button can send that note, encrypted, to the developer's lane ... This build has a lane built in; a link pasted here is used instead.\" Since recipients arrived (issue 019) a note is sent from the send bar to a recipient. DeveloperLane.current(pasted:) is read only by DeveloperLaneSection, and nothing shows that section any more. So the pasted link changes nothing, and the screen says the app does something it does not, which the reality discipline forbids. The privacy user read it as a way for the destination of \"Send to the developer\" to change silently.",
    "To do: remove the field and the sentence from Diagnostics (the place to add a destination is Recipients), keep the built-in lane's vault and key fingerprint there as facts, and delete DeveloperLaneSection if nothing uses it."
   ],
   "statusLine": "Status: open. From review round 2 (14 November 2026, website/reviews/round-2/index.md). Owner: the main session (DiagnosticsView, NoteParts).",
   "owner": "the main session (DiagnosticsView, NoteParts)",
   "places": [
    "A note: the send bar",
    "Settings: Recipients",
    "Settings: Diagnostics"
   ],
   "versions": [
    "v0.1.29"
   ],
   "features": [
    "Reviews from the pictures"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/041-diagnostics-describes-a-lane-nothing-uses.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-042",
   "kind": "issue",
   "number": "042",
   "app": "VoiceDebrief",
   "title": "Telling speakers apart",
   "status": "parked",
   "why": "The issue's status: \"Status: open, researched, needs the owner's decision. From the recordings made with a second person on 13 November 2026, which came out as one unbroken voice...\"",
   "summary": "What Apple's frameworks do (checked 14 November 2026)",
   "detail": [
    "What Apple's frameworks do (checked 14 November 2026)",
    "- iOS 26 has no speaker separation. SpeechAnalyzer offers SpeechTranscriber (words, with times), DictationTranscriber and SpeechDetector (is anyone speaking). None says who is speaking. Third-party comparisons and developers building on it agree; no Apple statement says otherwise. - Nothing found for iOS 27 either. A developer who searched the WWDC 2026 session catalogue reported no mention of diarization; the forum thread has no answer from Apple. This could still change in a later SDK. - Apple's other frameworks (Sound Analysis, Vision, Natural Language) have no voice-identity feature either.",
    "The options",
    "| Option | What it is | Cost | |---|---|---| | A. Wait for Apple | Nothing to build | Unknown wait; possibly never | | B. A third-party model on the device | For example Hugging Face's AnySpeechRecognizer (SpeakerDiarizer, NVIDIA's Streaming Sortformer on Core ML, up to four speakers, built to sit inside SpeechAnalyzer), Argmax's SpeakerKit, or FluidAudio, which the open-source Swift Scribe app uses | Breaks decision 4 (Apple SDK only) and needs a written reason; a model download of about 250 MB; Sortformer is under NVIDIA's open model licence; untested on an iPhone by its authors | | C. Ask the language model | Give Apple's model the transcript and ask it where the turns are | No new code or model; unreliable: it has no audio, only words. Useful for \"two people were talking\", not for who said what | | D. Ask the people | A \"conversation\" mode in which the app records, and the person...",
    "Recommendation",
    "D now, as the cheap and honest version: a conversation mode where the prompt stops saying \"my own voice note\", and the person can name speakers on the transcript. Try B in the Lab only if the owner agrees to a written exception to decision 4 for an on-device model, since everything stays on the device. Revisit A at each SDK.",
    "Sources: Apple's WWDC25 session 277 on SpeechAnalyzer; developer forum thread 829621 (\"Native diarization in '27?\"); Hugging Face, \"Introducing AnySpeechRecognizer and AnyDecisionModel\"; Argmax's SpeakerKit; the Swift Scribe project."
   ],
   "statusLine": "Status: open, researched, needs the owner's decision. From the recordings made with a second person on 13 November 2026, which came out as one unbroken voice, and from the clinic article.",
   "places": [
    "Settings: Identity",
    "Settings: Experiments, the Lab"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/042-speaker-separation.md",
   "source": "The owner"
  },
  {
   "id": "issue-043",
   "kind": "issue",
   "number": "043",
   "app": "VoiceDebrief",
   "title": "A send that can be seen, stopped and not lost",
   "status": "built-untried",
   "why": "The issue says: \"Built (untried on a device): pendingSend and sendProblem kept on the note on disk; waiting sends resumed at launch and when the note is ready; Do not send on...\"",
   "summary": "Built (untried on a device): pendingSend and sendProblem kept on the note on disk; waiting sends resumed at launch and when the note is ready; Do not send on the card; rows say waiting, not sent or sent with a time; the briefing says could not be sent; an already-sent recipient asks first.",
   "detail": [
    "New findings 1, 2, 3, 7 and 13. Screens record.recording, record.working, library, record-briefing, note.finished. Found by four of five users, and in the code.",
    "Finishing and sending in one press (issue 026) is what the fifth user wanted: two taps from a thought to \"Maria has it\". That stands. Around it:",
    "1. No way back where the press is made. \"Finish and send to <name>\" is directly under the tick and sends with no question. The send waits until the note is written up, and cancelQueuedSend exists, but only the send bar on the note calls it. The card on the record screen (\"Your last note will be sent to ...\") has \"Dismiss\" only. Give that card a \"Do not send\" that cancels the queued send, and keep it until the send has started. The privacy user decided against the app on this alone. 2. A waiting send is lost if the app is closed. queuedSends, queuedLanes and outbox in DebriefSession are in memory. Keep what was asked for on the note (to whom, when asked), and send it when the note is finished or the app next opens. 3. A failed send leaves no trace. sharing = .failed is one value for one note, replaced by the next send. Record the failure on the note, as saveProblem does for a vault, show...",
    "Not asked for: a question before \"Finish and send\". One press is the point; a way back is what is missing."
   ],
   "statusLine": "Status: open. From review round 3 (14 November 2026, website/reviews/round-3/index.md). Owner: the main session (RecordView, SendBar, DebriefSession, NoteRow, Briefing).",
   "owner": "the main session (RecordView, SendBar, DebriefSession, NoteRow, Briefing)",
   "places": [
    "A note: the send bar",
    "Library, then a note",
    "Library tab"
   ],
   "versions": [
    "v0.1.40"
   ],
   "features": [
    "Reviews from the pictures"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/043-a-send-that-can-be-seen-stopped-and-not-lost.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-044",
   "kind": "issue",
   "number": "044",
   "app": "VoiceDebrief",
   "title": "Two symbols with no words at the top of the first screen",
   "status": "built-untried",
   "why": "The issue says: \"Built (untried on a device): the counter and the badge are text (\"Test credit £4.85\", \"v0.1.x\"), not labels that the bar shows as symbols; Discard is on the...\"",
   "summary": "Built (untried on a device): the counter and the badge are text (\"Test credit £4.85\", \"v0.1.x\"), not labels that the bar shows as symbols; Discard is on the right while recording, the language menu hidden then.",
   "detail": [
    "New finding 4. Screens record, record.recording, library. Found by all five users.",
    "CreditCounter is a label \"Test credit £4.85\" with a test-tubes symbol; VersionBadge is a label with the version and a sparkle. In the navigation bar of an iPhone only the symbols are drawn, so the first screen has test tubes and a sparkle with no words, and nobody knew what either does. While recording, \"Discard\" sits between them and the title. On the library screen they are on the other side.",
    "The amount that three users read as paying per memo (issue 032) is gone from the picture, which is why that finding was not repeated; so is the sentence that explained it.",
    "To do, one of: draw the title as well as the symbol (.labelStyle(.titleAndIcon), if the bar has room beside \"Discard\"); or take both out of the bar and give them a line of their own under the title, where \"Test credit £4.85\" and \"v0.1.36\" can be read; or keep only one in the bar. While recording, show neither: the only thing at the top should be \"Discard\"."
   ],
   "statusLine": "Status: open. From review round 3 (14 November 2026, website/reviews/round-3/index.md). Owner: the main session (RecordView, LibraryView, VersionBadge); the credit session (CreditCounter).",
   "owner": "the main session (RecordView, LibraryView, VersionBadge); the credit session (CreditCounter)",
   "places": [
    "Library tab",
    "Record tab",
    "The balance in the top bar"
   ],
   "versions": [
    "v0.1.40"
   ],
   "features": [
    "Reviews from the pictures"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/044-two-symbols-with-no-words.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-045",
   "kind": "issue",
   "number": "045",
   "app": "VoiceDebrief",
   "title": "Two sentences that say the wrong thing",
   "status": "in-progress",
   "why": "The issue says: \"Fixed: Settings says an interrupted recording is always kept and goes to the vault once transcribed; the status screen says vault keys are in iCloud Keychain by...\"",
   "summary": "Fixed: Settings says an interrupted recording is always kept and goes to the vault once transcribed; the status screen says vault keys are in iCloud Keychain by default.",
   "detail": [
    "New findings 5 and 6. Screens settings, about-end.",
    "1. Settings, under Library: \"A note that was interrupted is saved once it has been run again.\" It means saved to the vault. The user who once lost a recording read it as \"an interrupted recording is not saved\", against \"The recording is kept\" on the note itself, and said it nearly decided them against the app. Say what is meant: \"An interrupted note's recording is kept on this device; it is written to the vault once it has been run again.\" 2. What this build does, under vaults (Roadmap.swift): \"The vault's key is kept on this device only.\" Since v0.1.33 vault keys are kept in iCloud Keychain as well, unless the switch under Keys on the Vaults tab is off (VaultBook.keysInICloud, true by default), and a vault's own screen says \"In iCloud Keychain, on your devices\". The status screen must not claim what the app does not do: say where the keys are kept, or read it from the switch."
   ],
   "statusLine": "Status: open. From review round 3 (14 November 2026, website/reviews/round-3/index.md). Owner: the main session (SettingsView, Roadmap); the vaults session for the wording about keys.",
   "owner": "the main session (SettingsView, Roadmap); the vaults session for the wording about keys",
   "places": [
    "Vaults tab",
    "Settings tab"
   ],
   "versions": [
    "v0.1.40"
   ],
   "features": [
    "Reviews from the pictures"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/045-two-sentences-that-say-the-wrong-thing.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-046",
   "kind": "issue",
   "number": "046",
   "app": "VoiceDebrief",
   "title": "Every empty screen says what to do next",
   "status": "proposed",
   "why": "Open, with nothing built yet: \"Status: open. Asked for by the owner, 14 November 2026, through the Sherpa brief: \"an empty state for every screen that says what to do next\". From the Sherpa...\"",
   "summary": "The rule, from SGit Vaults' own first screen, which already does it: an empty screen says what this place is for in one sentence, then the one thing to do, as a button where one fits. It does not only say that nothing is here.",
   "detail": [
    "The rule, from SGit Vaults' own first screen, which already does it: an empty screen says what this place is for in one sentence, then the one thing to do, as a button where one fits. It does not only say that nothing is here.",
    "| Screen | Today | Proposed | |---|---|---| | VoiceDebrief, Record (record-empty) | Says what recording does; the button is there. | Holds. | | VoiceDebrief, Library (library-empty) | \"No notes yet. A note is kept here the moment its recording stops.\" Says what, not what to do. | \"No notes yet. Record one on the Record tab: it is kept here the moment you stop, then transcribed and debriefed on this device.\" With a button that opens Record, if the shell can be asked to change tab. | | VoiceDebrief, Vaults (vaults-empty) | \"None yet.\" in the list, then the Create form. | \"No vaults yet. A vault keeps your notes encrypted, on this device first; once you have one, every finished note is saved into it.\" Above the Create form, as SGit Vaults does it. | | VoiceDebrief, Recipients (recipients, with only the built-in one) | Says what sending does; the add form follows. | Holds: one line could say...",
    "Done when each \"Proposed\" row is in the app, or its owner has said why not."
   ],
   "statusLine": "Status: open. Asked for by the owner, 14 November 2026, through the Sherpa brief: \"an empty state for every screen that says what to do next\". From the Sherpa session's reading of the empty pictures (screens.yml run 39, sgit-app-screens.yml run 19). Owner: each screen's own session; the Sherpa session writes the words.",
   "owner": "each screen's own session; the Sherpa session writes the words",
   "places": [
    "Settings: Identity",
    "Settings: Recipients",
    "The repository: pictures of every screen"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/046-an-empty-state-that-says-what-to-do-next.md",
   "source": "The owner"
  },
  {
   "id": "issue-047",
   "kind": "issue",
   "number": "047",
   "app": "VoiceDebrief",
   "title": "The lab, second experiment (L02): the control centre",
   "status": "in-progress",
   "why": "The issue says: \"Built and in the Lab: sentences in (spoken, typed, or fourteen test sentences); two engines, the fixed phrases and the on-device model with one tool for each of...\"",
   "summary": "Giving instructions is a different mode from thinking aloud. In a control mode the screen shows the actions and the reactions, not the transcript: an instruction is heard, an action is proposed, and the person says do it, not this, or edits it. No black magic: choose, see the pipeline, then trigger it. The phrases that trigger an action are listed and can be changed.",
   "detail": [
    "Giving instructions is a different mode from thinking aloud. In a control mode the screen shows the actions and the reactions, not the transcript: an instruction is heard, an action is proposed, and the person says do it, not this, or edits it. No black magic: choose, see the pipeline, then trigger it. The phrases that trigger an action are listed and can be changed.",
    "Where it stands (14 November 2026)",
    "Built and in the Lab: sentences in (spoken, typed, or fourteen test sentences); two engines, the fixed phrases and the on-device model with one tool for each of seven actions; a card for each proposal with its state and Do it, Not this, Edit; actions that may go ahead without asking; the phrase list, editable and kept on the device; a tally and a JSON log. Compiled and unit tested; never run against a model.",
    "What it does not do yet",
    "- It carries out two actions only, the two that are safe to undo: opening a section (through LabActionHost.openSection, a closure the session that owns RootView sets) and finding a note (a read-only search, listed on the card; it does not open the note). Finish the recording, send, save, record for a time and cancel are recorded only: they touch DebriefSession and the send path, which other sessions own. - Opening a section leaves the Lab screen, which stops the listening: a control mode that stays up while the app moves beneath it needs a place of its own in the shell. - The model is asked about every settled piece of speech, with no pause rule of its own and no state handed to it (whether a recording is running, who the recipients are). - Portuguese: the phrases and the test sentences are English only.",
    "What decides the next step",
    "The owner runs the test sentences on an iPhone, an iPad and a Mac and sends back the log. If the model proposes the right action often enough and fast enough, wire the actions that are safe to undo first. If it does not, the phrases are the engine and the model is not asked.",
    "Third action: record a note for someone (14 November 2026)"
   ],
   "statusLine": "Status: open. From three voice notes the owner recorded while driving, 14 November 2026, relayed by the parent session. See the articles \"The lab\" and \"Two decision engines\".",
   "places": [
    "Settings: Recipients",
    "Settings: Experiments, the Lab"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/047-lab-control-centre.md",
   "source": "The owner's voice note"
  },
  {
   "id": "issue-048",
   "kind": "issue",
   "number": "048",
   "app": "VoiceDebrief",
   "title": "The lab, fourth experiment (L04): live labels",
   "status": "in-progress",
   "why": "The issue says: \"Built in the Lab as its own screen, with its own listening (the live words) and a field to type sentences into. Compiled and unit tested; no loop has been run...\"",
   "summary": "While a note is being recorded, ask Apple's model every few seconds to fill a small set of labels from the transcript so far, and show them as a grid of chips that update live: who it is for (matched to contacts and agents, with their avatar), topic, title, urgency, and a couple of others from a list. The owner can override by voice in the middle of a recording, and the override sticks: the code...",
   "detail": [
    "While a note is being recorded, ask Apple's model every few seconds to fill a small set of labels from the transcript so far, and show them as a grid of chips that update live: who it is for (matched to contacts and agents, with their avatar), topic, title, urgency, and a couple of others from a list. The owner can override by voice in the middle of a recording, and the override sticks: the code owns the state, and the model proposes through function calls, one tool for each label, with no long history. Send a window of the transcript and measure whether sending all of it is fast enough. Show the timing of every loop.",
    "Where it stands (14 November 2026)",
    "Built in the Lab as its own screen, with its own listening (the live words) and a field to type sentences into. Compiled and unit tested; no loop has been run against a model.",
    "What it does not do yet, and why",
    "- It is not on the Record screen and labels do not travel with a note. The board of labels is a plain value that can be saved, with the matched recipient and the title ready to be read from it; putting it on RecordView and into a note belongs to the session that owns them. - It keeps no recording. The Lab's listening hears the words and nothing else. - The switches for which labels are on the L04 screen, not in Settings, which this session does not own. - Tokens are estimated at four characters each. Apple's framework has a token counter, but it is not known to be in the iOS 26.5 SDK that CI builds with. - A new session is made for every loop, tools and all. L03 keeps a session ready between requests; if the loops are slow, that is the first thing to try, and the log will say whether it is needed. - English only: the spoken phrases that set a label.",
    "What to measure, from the log",
    "Time to the first label and time in all, at each window size, on an iPhone, an iPad and a Mac. Whether the model calls the label tools at all. How often a label it offers is right, and how often it churns a label that was already right. Whether \"everything so far\" fails once a note is long."
   ],
   "statusLine": "Status: open. From the owner's five-minute voice note of 14 November 2026, 19:07, relayed by the parent session. See the articles \"The lab\" and \"Two decision engines\".",
   "places": [
    "Record tab",
    "Settings: Recipients",
    "Settings: Experiments, the Lab"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/048-lab-live-labels.md",
   "source": "The owner's voice note"
  },
  {
   "id": "issue-100",
   "kind": "issue",
   "number": "100",
   "app": "SGit Vaults",
   "title": "The sgit app, milestone one",
   "status": "in-progress",
   "why": "The issue's Idea status line: \"Much of milestone one is built: see website/sgit-app/built/index.md. Not yet used on a device against the live server.\"",
   "summary": "The design is website/sgit-app/design/index.md; what exists is website/sgit-app/built/index.md. The app is Apps/SGit, with its own project, workflow (sgit-app.yml). Done when the six items of milestone one have been used on a device against the live server.",
   "detail": [
    "The design is website/sgit-app/design/index.md; what exists is website/sgit-app/built/index.md. The app is Apps/SGit, with its own project, workflow (sgit-app.yml). Done when the six items of milestone one have been used on a device against the live server."
   ],
   "statusLine": "Status: open. The owner's request of 13 November 2026: share photos, videos and large files from a phone into a vault a teammate can open.",
   "places": [
    "SGit Vaults: Share"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/100-sgit-app-milestone-one.md",
   "source": "The owner"
  },
  {
   "id": "issue-102",
   "kind": "issue",
   "number": "102",
   "app": "SGit Vaults",
   "title": "Prove the app's large-file exchange against the live server",
   "status": "proposed",
   "why": "Open, with nothing built yet: \"Status: open.\"",
   "summary": "The upload in parts and the download in ranges are tested in CI against a folder, and sgit's own exchange was run against dev.send.sgraph.ai. The Swift code has not spoken to the server. First run on a device: add a video over 100 MB, clone the vault with sgit on a computer and compare; open it in the web Vault UI; read a file sgit pushed.",
   "detail": [
    "The upload in parts and the download in ranges are tested in CI against a folder, and sgit's own exchange was run against dev.send.sgraph.ai. The Swift code has not spoken to the server. First run on a device: add a video over 100 MB, clone the vault with sgit on a computer and compare; open it in the web Vault UI; read a file sgit pushed."
   ],
   "statusLine": "Status: open.",
   "places": [
    "SGit Vaults: a vault"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/102-sgit-app-live-server.md",
   "source": "The project"
  },
  {
   "id": "issue-103",
   "kind": "issue",
   "number": "103",
   "app": "SGit Vaults",
   "title": "The sgit app after milestone one",
   "status": "in-progress",
   "why": "The issue says: \"The owner's first run hit the token on Create. Done in answer: a vault is created on the device with no token, takes files there, and is sent to the server from...\"",
   "summary": "14 November 2026",
   "detail": [
    "14 November 2026",
    "The owner's first run hit the token on Create. Done in answer: a vault is created on the device with no token, takes files there, and is sent to the server from Share (VaultShelf.sendToServer, VaultSync.transferWithLargeFiles). After that it lives on the server.",
    "Not done, and why: keeping a shared vault on the device with push and pull, as VoiceDebrief does. Two people adding photographs at the same time would diverge and the engine has no merge; and a pull would fetch every video. Both come before that."
   ],
   "statusLine": "Status: open. In order: adopt local-first vaults and remotes (011) and iCloud Keychain (017); a share extension; background uploads (a background URLSession fed from the staged ciphertext); a file-level merge; branches; video thumbnails and streaming.",
   "places": [
    "SGit Vaults: Share"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/103-sgit-app-after-milestone-one.md",
   "source": "The project"
  },
  {
   "id": "issue-104",
   "kind": "issue",
   "number": "104",
   "app": "SGit Vaults",
   "title": "A read-only share that can be taken back",
   "status": "parked",
   "why": "The issue's status: \"Status: open. A question for the owner.\"",
   "summary": "A vault key and a read key cannot be revoked. The web Vault UI's token manager has a read-only token with an expiry and a revoke (ro-word-word-1234, a small encrypted record held as a transfer on the server), marked there as a test harness. sgit has no equivalent. Agree one format for the app, sgit and the web UI before building it in the app.",
   "detail": [
    "A vault key and a read key cannot be revoked. The web Vault UI's token manager has a read-only token with an expiry and a revoke (ro-word-word-1234, a small encrypted record held as a transfer on the server), marked there as a test harness. sgit has no equivalent. Agree one format for the app, sgit and the web UI before building it in the app.",
    "The web Vault's read-only token, as its source has it (read 14 November 2026)",
    "From the Send repository at da293d4, en-gb/vault/token/vault-token-manager.js and lib/sg-vault/sg-vault-crypto.js. Enough to build it natively; the open question is still whether this is the format to keep.",
    "- The token is adjective-noun-NNNN; ro- is only a prefix in links. - Its record lives on the server as a transfer whose id is the first 12 hex of sha256(\"ro-token-transfer-v1:\" + token). - The record is iv(12) + AES-256-GCM of {\"vault_id\", \"read_key\" (base64 of the 32 bytes), \"ref_file_id\"}, under PBKDF2-SHA256(token, salt sgraph-ro-token-v1, 100,000 rounds). - Create: POST /api/transfers/create with the access key and {file_size_bytes: 0, transfer_id, delete_auth_hash, max_downloads, auto_delete: false, expires_at}, then upload the ciphertext, then POST /api/transfers/complete/{id}. - Open: GET /api/transfers/download/{id}, no access key, then decrypt; the vault is read from bare/refs/<ref_file_id> with the read key. - Revoke: DELETE /api/transfers/delete/{id} with the header x-sgraph-transfer-delete-auth holding the preimage of delete_auth_hash. - The owner's list is a file in the..."
   ],
   "statusLine": "Status: open. A question for the owner.",
   "places": [
    "SGit Vaults: Share"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/104-revocable-read-only-share.md",
   "source": "The owner"
  },
  {
   "id": "issue-105",
   "kind": "issue",
   "number": "105",
   "app": "SGit Vaults",
   "title": "\"Send to vault\" from Photos and Files (a share extension)",
   "status": "proposed",
   "why": "Open, with nothing built yet: \"Status: open. The plan, written before any code. Owner of the code: the sgit app session.\"",
   "summary": "What it is",
   "detail": [
    "What it is",
    "In Photos, Files or any app's share sheet, an entry \"sgit\": choose a vault and a folder, and the items go in. It is the shortest road from a camera roll to a team's vault.",
    "How it has to work",
    "A share extension is a separate small program with little memory (about 120 MB) and a short life. It cannot encrypt a video and upload it. So:",
    "1. The extension only takes the files in. It copies each item, file to file, into a folder that the extension and the app both own (an App Group container), with a small record: which vault, which folder, the names. Then it closes. This is the same \"copy it in before anything else\" rule the outbox already follows. 2. The app does the rest. When the app is next opened it finds those records and turns each into an outbox job, exactly as if the files had been picked in the app. The extension says so plainly: \"Kept. Open sgit to send them.\" 3. The extension never holds a key. It is given only the names and ids of the vaults, which the app writes into the shared folder. Vault keys and the access key stay in the app's Keychain.",
    "What it will not do at first: upload without the app being opened. That needs background uploads (the next item in issue 103), which fits on top of this: the staged ciphertext handed to a background transfer.",
    "What it changes outside the code",
    "- A second target in Apps/SGit/SGit.xcodeproj (the sgit app's own project file), bundle id ai.sgit.vaults.app.share. - An App Group, group.ai.sgit.vaults.app, in the entitlements of the app and of the extension. The outbox's intake folder moves into it. - Signing. Today the release script signs one app with one entitlements file. With an extension it must sign the extension first, with its own entitlements, then the app. scripts/release/testflight.sh is shared with VoiceDebrief, so the sgit app gets its own copy."
   ],
   "statusLine": "Status: open. The plan, written before any code. Owner of the code: the sgit app session.",
   "places": [
    "SGit Vaults: a vault",
    "SGit Vaults: Share"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/105-sgit-app-share-extension.md",
   "source": "The owner"
  },
  {
   "id": "issue-106",
   "kind": "issue",
   "number": "106",
   "app": "SGit Vaults",
   "title": "A viewer for chat-archive results, as a separate app",
   "status": "proposed",
   "why": "Open, with nothing built yet: \"Status: open. Recorded at the owner's request, 14 November 2026. Not to be built in the sgit app.\"",
   "summary": "The owner keeps archives of agent sessions in vaults (the web Vault's \"Sessions Explorer\" shows them: vaults of sessions, with search and statistics). A native viewer for those results should be an app of its own, later, not a screen in the sgit app. Until then they can be shown from the sgit app's gallery, which opens any vault in the web Vault.",
   "detail": [
    "The owner keeps archives of agent sessions in vaults (the web Vault's \"Sessions Explorer\" shows them: vaults of sessions, with search and statistics). A native viewer for those results should be an app of its own, later, not a screen in the sgit app. Until then they can be shown from the sgit app's gallery, which opens any vault in the web Vault."
   ],
   "statusLine": "Status: open. Recorded at the owner's request, 14 November 2026. Not to be built in the sgit app.",
   "places": [
    "SGit Vaults: Gallery"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/106-chat-archive-viewer.md",
   "source": "The owner"
  },
  {
   "id": "issue-107",
   "kind": "issue",
   "number": "107",
   "app": "SGit Vaults",
   "title": "A gallery of vaults, opened in a browser inside the app",
   "status": "in-progress",
   "why": "The issue says: \"Built: a Gallery screen reached from the list of vaults. Entries have a name, a line about them, a topic and a link; they are grouped by topic and can be...\"",
   "summary": "Built: a Gallery screen reached from the list of vaults. Entries have a name, a line about them, a topic and a link; they are grouped by topic and can be searched. An entry opens in the web Vault in the system's browser inside the app. An entry that carries a key this app can open has \"Add to my vaults\".",
   "detail": [
    "Built: a Gallery screen reached from the list of vaults. Entries have a name, a line about them, a topic and a link; they are grouped by topic and can be searched. An entry opens in the web Vault in the system's browser inside the app. An entry that carries a key this app can open has \"Add to my vaults\".",
    "The list is data, never code, because a link may carry a key and no key is committed:",
    "- entries added on the device, by pasting or scanning a link, kept in the Keychain; - a file showcase.json at the top of any vault on the device: {\"v\": 1, \"entries\": [{\"name\", \"description\", \"topic\", \"link\"}]}.",
    "The gallery ships empty and says how to fill it.",
    "Needed from the owner",
    "One of:",
    "1. A showcase vault (preferred): a vault with showcase.json at its top, and its key added to the app on each device that should show the gallery. Changing the file changes every device's gallery. 2. The links themselves, to be pasted into the app.",
    "For each vault to be shown: a name, one line, a topic, and a link that opens it in the web Vault. For anything shown to outside testers the link should be read-only: a read-only token from the web Vault's token manager (ro-word-word-1234, which can be revoked) or a read key. A vault key lets whoever sees it change the vault."
   ],
   "statusLine": "Status: open. Asked for by the owner, 14 November 2026, to demonstrate vaults to people, including outside testers.",
   "places": [
    "SGit Vaults: Gallery"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/107-sgit-app-gallery.md",
   "source": "The owner"
  },
  {
   "id": "issue-110",
   "kind": "issue",
   "number": "110",
   "app": "SGit Vaults",
   "title": "sgit app: a teammate sent a vault key cannot add to it",
   "status": "in-progress",
   "why": "Open, and named by the release notes of v0.1.45.",
   "summary": "Finding 1. Screens settings, add. Found by the teammate and the family organiser, and checked in the code.",
   "detail": [
    "Finding 1. Screens settings, add. Found by the teammate and the family organiser, and checked in the code.",
    "A colleague sends a vault key. With it the app opens the vault and reads it. Adding a photo to a vault that lives on the server also needs an access key, and without one the write fails (\"writing to it needs an access key. Add one in Settings\"). Nothing on the add sheet says so, the person was sent one string, and no screen says where an access key comes from. The app's first job, in the owner's words an easy way for the team to share photos and large videos, stops at the first photo for everyone but the person who made the vault.",
    "To decide, with the owner: how a teammate comes by the right to write. Either the access key travels with the invitation (and the share sheet says so), or the person who shares gives each teammate one, or the server learns to accept a write from anybody who holds a vault's write key. Until then, say it at the moment it matters: on the add sheet when the key is a vault key, and where the plus is tapped, with what to ask the sender for."
   ],
   "statusLine": "Status: open. From the sgit app's review round 1 (14 November 2026, website/sgit-app/reviews/round-1/index.md). Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB).",
   "owner": "the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB)",
   "places": [
    "SGit Vaults: Share",
    "SGit Vaults: Settings"
   ],
   "versions": [
    "v0.1.45"
   ],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/110-sgit-app-a-teammate-cannot-add-without-an-access-key.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-111",
   "kind": "issue",
   "number": "111",
   "app": "SGit Vaults",
   "title": "sgit app: say whether a file has arrived",
   "status": "in-progress",
   "why": "Open, and named by the release notes of v0.1.44.",
   "summary": "Finding 2. Screens vault, vault.folder, vault.list. Found by the teammate, who could not finish \"be sure they arrived\".",
   "detail": [
    "Finding 2. Screens vault, vault.folder, vault.list. Found by the teammate, who could not finish \"be sure they arrived\".",
    "No screen says whether what is shown is the latest, or whether something just added has reached the server. The design says a file is never shown as in the vault before its commit is pushed and read back; the pictures show only a vault at rest, so a person cannot see the difference between \"added\" and \"arrived\".",
    "To do: a line on the vault that says where it stands (\"everything here is on the server, checked a minute ago\"; \"3 of 21 on their way; keep the app open\"), a mark on a file that is still on its way, and a plain end (\"21 files added and on the server\"). \"Refresh\" is behind the three dots; pulling down should do it.",
    "Done (14 November 2026, green in CI and in the pictures of that run): a line at the top of every folder of a vault says where it stands: on the server and when that was last checked, on this device only, how many files are on their way in (\"keep the app open\"), or that some did not go in and are kept. Pulling down refreshes.",
    "Left: a mark on a single file that is still on its way (a file is not listed at all until its commit is pushed and read back; the upload card names it); a plain last line when a batch ends (\"21 files added and on the server\"); a picture of a vault that is not at rest (issue 116)."
   ],
   "statusLine": "Status: open. From the sgit app's review round 1 (14 November 2026, website/sgit-app/reviews/round-1/index.md). Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB).",
   "owner": "the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB)",
   "places": [
    "SGit Vaults: a vault"
   ],
   "versions": [
    "v0.1.44"
   ],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/111-sgit-app-has-it-arrived.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-112",
   "kind": "issue",
   "number": "112",
   "app": "SGit Vaults",
   "title": "sgit app: who added it",
   "status": "in-progress",
   "why": "Open, and named by the release notes of v0.1.44.",
   "summary": "Finding 3. Screens history, commit. Found by the editor and the teammate.",
   "detail": [
    "Finding 3. Screens history, commit. Found by the editor and the teammate.",
    "History and a commit say when and what. Who is a key id, a fingerprint and \"This device's key\" or not; the commit screen says itself that nothing in the vault ties a key to a name. For a team's photos, \"who took these\" is the first question.",
    "To do: let a device name itself once (a name kept with its public key in the vault, as VoiceDebrief's Identity does for a device), show that name in History and beside a file, and say \"this device\" in words. Group History by day.",
    "Done (14 November 2026, green in CI on f2c3b94 and seen in its picture): History is grouped by day, and each commit says \"This device\" or \"Another device (key ...)\" in place of a hash; the hash stays on the commit's own screen.",
    "Left, and it needs a decision first: a name for a device. A name has to live in the vault to be seen by the others, which is a change to what a vault holds, read by the sgit command and the web Vault UI as well as this app. Proposed: one small file per device beside its public key (the key id, a name the person chose, signed by that key), written the first time the device adds to a vault, so that a name cannot be claimed for somebody else's key. To agree with the owner and the sgit side before anything is written; until then a commit can only be told apart as this device or another."
   ],
   "statusLine": "Status: open. From the sgit app's review round 1 (14 November 2026, website/sgit-app/reviews/round-1/index.md). Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB).",
   "owner": "the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB)",
   "places": [
    "SGit Vaults: History"
   ],
   "versions": [
    "v0.1.44"
   ],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/112-sgit-app-who-added-it.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-113",
   "kind": "issue",
   "number": "113",
   "app": "SGit Vaults",
   "title": "sgit app: sharing, for someone who was never told what a key is",
   "status": "in-progress",
   "why": "Open, and named by the release notes of v0.1.44.",
   "summary": "Findings 4, 5 and 6. Screens share, vault, settings. Found by the family organiser (it decided them against the app) and the editor.",
   "detail": [
    "Findings 4, 5 and 6. Screens share, vault, settings. Found by the family organiser (it decided them against the app) and the editor.",
    "The share sheet says, honestly, what a key allows and that it cannot be taken back. It does not say what the person who receives it does: which app, which button. The way to the sheet is behind three dots. The sheet has a link that opens the vault in a browser, a copy button and a QR code, but a person sees a warning and \"Show the vault key\" first. Any holder of the vault key can delete everything and cannot be removed; nothing says what happens to a vault if the phone is lost.",
    "To do: a visible \"Share\" on the vault; the sheet to open with the action (\"Send the way in\"), the message it sends to carry the steps for the receiver, and the warning beneath; a sentence on a lost phone (the key is on this device only: write it down, or it is gone) where a vault is made and on the share sheet. To decide with the owner: an invitation that may add and may not delete, beside issue 104.",
    "Done (14 November 2026, green in CI and in the pictures of that run): Share is on the vault's toolbar. The sheet opens with \"Send the way in\", which sends a message with the steps for the receiver, the key and a link for a browser; the warning is beneath it. The Create sheet says the key is kept on this device only and what losing the device means. The add sheet says an access key is also needed to add files (issue 110).",
    "Left: the sentence on a lost phone on the share sheet; the invitation that may add and may not delete, which waits for the owner's decision on issues 104 and 110."
   ],
   "statusLine": "Status: open. From the sgit app's review round 1 (14 November 2026, website/sgit-app/reviews/round-1/index.md). Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB).",
   "owner": "the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB)",
   "places": [
    "SGit Vaults: the Create sheet",
    "SGit Vaults: Share",
    "SGit Vaults: Settings"
   ],
   "versions": [
    "v0.1.44"
   ],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/113-sgit-app-sharing-for-someone-who-was-not-told-what-a-key-is.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-114",
   "kind": "issue",
   "number": "114",
   "app": "SGit Vaults",
   "title": "sgit app: getting a folder out, at full quality",
   "status": "in-progress",
   "why": "Open, and named by the release notes of v0.1.44.",
   "summary": "Findings 7 and 8. Screens vault.folder, file, share. Found by the editor, whose task it was.",
   "detail": [
    "Findings 7 and 8. Screens vault.folder, file, share. Found by the editor, whose task it was.",
    "A file leaves one at a time, by Share or by Save to Photos, and nothing says either hands over the original (Photos may re-encode a video). There is no way to take a folder. The route that gives everything, the sgit command on a computer, is named on the share sheet with no command to copy and no address. A read key does not open in the web Vault UI, so somebody on a laptop who should only look needs this app or the command line.",
    "To do: select several, or \"Save this folder to Files\", with the size and a count; say \"the original, as it was added\" where that is true; on the share sheet, the exact line to paste on a computer; for the Mac, the app itself is the answer once it runs there (the design says iPhone, iPad and Mac).",
    "Compiles and its tests pass (14 November 2026, 50c8629); done when somebody has saved a folder on a device: the three dots on any folder offer \"Save these N files to Files\" with the size; the app fetches each, lays them out as in the vault and hands the folder to the Files app. The file screen says Open and Share hand over the original, byte for byte. Beside the shown vault key, the line to paste on a computer (pip install sgit-ai && sgit clone), with a button that copies it with the key in it.",
    "Left: selecting several files that are not one folder; a read key in the web Vault UI (not this app's to fix); the Mac."
   ],
   "statusLine": "Status: open. From the sgit app's review round 1 (14 November 2026, website/sgit-app/reviews/round-1/index.md). Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB).",
   "owner": "the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB)",
   "places": [
    "SGit Vaults: a vault",
    "SGit Vaults: Share"
   ],
   "versions": [
    "v0.1.44"
   ],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/114-sgit-app-getting-files-out.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-115",
   "kind": "issue",
   "number": "115",
   "app": "SGit Vaults",
   "title": "sgit app: the Create sheet, the four keys, and smaller things",
   "status": "in-progress",
   "why": "Open, and named by the release notes of v0.1.44.",
   "summary": "Findings 9 to 14. Screens create, vaults, add, settings, vault, file, history, commit.",
   "detail": [
    "Findings 9 to 14. Screens create, vaults, add, settings, vault, file, history, commit.",
    "- Create. The first screen says a vault you create \"needs no account, no access key and no network\"; the Create sheet shows a server switch that is on and an access key. Say on the sheet what the switch costs, and let its default be off for a person with no access key. \"A new vault is a random key, an empty folder and one signed commit\" should not be the first sentence. \"Name, for this device only\" left two users unsure what name others see: say that others name it themselves. - Four keys: vault key, read key, access key, this device's signing key. \"Add a vault by its key\" does not say which; the add field offers three kinds at once. One line each, where each first appears, and a different word for the access key, which is not a key to a vault. - A vault's row is an id, an access level and a server's name in typewriter text. \"Shared, you can add\" or \"Only on this phone\" says what a...",
    "Done (14 November 2026, green in CI and in the pictures of that run): the Create sheet's switch is off for a person with no access key and the sheet says what turning it on needs; the name is said to be for this device, others name the vault themselves; a vault's row is in words (\"Shared: you can add and change\", \"Only on this device\").",
    "Left: one line for each of the four keys where it first appears and another word for the access key; words on the plus and the three dots (Share is out of the dots, History is not); \"Remove the access key\"; the conversion switch; iPad widths; the small things.",
    "Done after that (14 November 2026, green on 86f0150, seen in the pictures): \"Add a vault you were sent\" in place of \"by its key\"; Settings says what the access key is (a pass from whoever runs the server, which opens no vault) and what removing it does; the conversion switch is \"Make photos and videos open in any browser\"."
   ],
   "statusLine": "Status: open. From the sgit app's review round 1 (14 November 2026, website/sgit-app/reviews/round-1/index.md). Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB).",
   "owner": "the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB)",
   "places": [
    "SGit Vaults: the Create sheet",
    "SGit Vaults: a vault",
    "SGit Vaults: History"
   ],
   "versions": [
    "v0.1.44"
   ],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/115-sgit-app-the-create-sheet-and-the-words.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-116",
   "kind": "issue",
   "number": "116",
   "app": "SGit Vaults",
   "title": "sgit app: what the pictures could not show",
   "status": "in-progress",
   "why": "Open, and named by the release notes of v0.1.44.",
   "summary": "Finding 15. The pictures themselves (sgit-app-screens.yml, the app's sample vault).",
   "detail": [
    "Finding 15. The pictures themselves (sgit-app-screens.yml, the app's sample vault).",
    "Round 1 read twelve screens, each at rest. Not pictured, and each was a place a user stopped or guessed:",
    "- the Create sheet as a person meets it first, with no access key, and a vault that is on this device only; - what the plus and the three dots open; - the photo picker's result: files on their way, a count, a large video in parts, one that failed and its retry; - a key shown, with its copy button, its link and its QR code; - a video opened; a file too large to preview; - an error: a wrong key pasted, no network, a refused write for want of an access key; - dark appearance, and the largest text size.",
    "A second round should follow the fixes for issues 110 to 115, with the same three users and tasks.",
    "Done (14 November 2026, green in CI on 50c8629 and looked at): four more pictures, 17 in all: the Create sheet with no access key (create-nokey), a vault on this device only (vault.local), files taken in and waiting to be sent (vault.adding-adding), the vault key shown with its copy button, link, QR code and command (share.key).",
    "Left: the menus open; a failed upload and its retry; a video opened; the errors; dark and the largest text; round 2 of the review.",
    "Done after that (14 November 2026, green on d2cb5ce and looked at): an eighteenth picture, vault.adding-refused: a file added by somebody with the vault key and no access key, refused by the app's own check, with what it says and \"Try again\" (the state issue 110 is about).",
    "Done after that (14 November 2026, green on b1f6638 and looked at): four more, 22 in all: the vault and the shown key in dark appearance, the vault and the share sheet at a large accessibility text size."
   ],
   "statusLine": "Status: open. From the sgit app's review round 1 (14 November 2026, website/sgit-app/reviews/round-1/index.md). Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB).",
   "owner": "the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB)",
   "places": [
    "SGit Vaults: the Create sheet",
    "SGit Vaults: a vault",
    "SGit Vaults: Share"
   ],
   "versions": [
    "v0.1.44"
   ],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/116-sgit-app-what-the-pictures-could-not-show.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-117",
   "kind": "issue",
   "number": "117",
   "app": "SGit Vaults",
   "title": "sgit app: a record of every action, on every device",
   "status": "proposed",
   "why": "Open, with nothing built yet: \"Status: open. Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB).\"",
   "summary": "The owner, 14 November 2026: \"add a full-blown observability here so you capture every single action that happens on this app across my three devices\" (a laptop, an iPad and an iPhone), reusing what VoiceDebrief has.",
   "detail": [
    "The owner, 14 November 2026: \"add a full-blown observability here so you capture every single action that happens on this app across my three devices\" (a laptop, an iPad and an iPhone), reusing what VoiceDebrief has.",
    "Compiles and its tests pass (14 November 2026, a4d6620); done when a report from a device has been read: VoiceDebrief's UsageLog, lane and lane encryption copied into the app; every screen is timed and about thirty actions are recorded; Settings, Your activity shows them and sends the report over the developer's lane as sgit/usage/v1, with the device model and a random install id so that three devices can be told apart. The developer reads it with tools/conductor/conductor.py drain.",
    "Left:",
    "- Nobody has sent a report from a device, and the reader has not been run on one. - Sending is by a button, on each device. To decide with the owner: a switch that sends on its own when the app opens (off by default), so that he does not have to remember on three devices. - What an action carried (how many files, how large, how long an upload took, which error) is not recorded, only that it happened. The vault engine's own log (VaultTrafficLog, Settings, Every step) has the requests and timings and is not in the report. - One copy of the lane code, in the shared package SGitPeople, when that lands; this app's copy then goes. - A picture of the screen."
   ],
   "statusLine": "Status: open. Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB).",
   "owner": "the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB)",
   "places": [
    "SGit Vaults: Share",
    "SGit Vaults: Settings"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/117-sgit-app-observability-across-devices.md",
   "source": "The owner"
  },
  {
   "id": "issue-118",
   "kind": "issue",
   "number": "118",
   "app": "SGit Vaults",
   "title": "sgit app: the web Vault inside the app, and its features natively",
   "status": "proposed",
   "why": "Open, with nothing built yet: \"Status: open. Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB).\"",
   "summary": "The owner, 14 November 2026: recreate as much as possible of the web Vault's core here (navigate folders, open a file, edit a file, see the HTML preview), and \"allow me to open the full web interface here\", loading the vault by JavaScript as sgit.ai's embedding does, not by putting the key in the address.",
   "detail": [
    "The owner, 14 November 2026: recreate as much as possible of the web Vault's core here (navigate folders, open a file, edit a file, see the HTML preview), and \"allow me to open the full web interface here\", loading the vault by JavaScript as sgit.ai's embedding does, not by putting the key in the address.",
    "Compiles and its tests pass (14 November 2026, a4d6620); done when it has been used on a device: UI/WebVaultView.swift. The protocol it uses was tried against the live page first, in Chromium, with a throwaway vault: see the reality file's row.",
    "What the try showed, to keep:",
    "- https://dev.vault.sgraph.ai/en-gb/vault/?embed=1, loaded as the page itself (no frame), posts {sg: 'vault-embed-ready'} to its own window; a posted {sg: 'vault-open', key, mode: 'vault', deepLink} opens the vault; it answers {sg: 'vault-ready', vaultName, fileCount}. A file's path as deepLink opens on that file. - The key is not stored by the page. sg-vault-recent is written to local storage; the app's web view keeps no storage after it closes. - An event vault-settings-access-key on <vault-shell> with the access key turns the page writable. This is the page's own internal event, not a documented interface: it may change. - vault.sgraph.ai (production) answered nothing. The app uses the dev host.",
    "Left:",
    "- Nobody has run it on a device. First things to look at: the page's layout on a phone, downloads (\"Save\"), and whether its HTML preview works in a web view. - With changes allowed, the web Vault's commits are unsigned and it pushes without checking that nobody else pushed first; it also rewrites a folder without the large mark. So: off by default, a warning, and not offered where a vault has large files. The proper fix is in the web Vault. - The vault's name is \"Untitled Vault\" there: the app's name for a vault is local. - Natively: a simple edit of a text file, and an HTML preview (a sandboxed web view fed from the vault). Not started; the web Vault inside the app covers both meanwhile. - A picture: the screen needs the network, which the picture harness does not have."
   ],
   "statusLine": "Status: open. Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB).",
   "owner": "the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB)",
   "places": [
    "SGit Vaults: a vault",
    "SGit Vaults: Settings"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/118-sgit-app-the-web-vault-inside-the-app.md",
   "source": "The owner"
  },
  {
   "id": "issue-119",
   "kind": "issue",
   "number": "119",
   "app": "SGit Vaults",
   "title": "sgit app: Apple Intelligence, a first experiment",
   "status": "proposed",
   "why": "Open, with nothing built yet: \"Status: open. Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB).\"",
   "summary": "The owner, 14 November 2026: \"start thinking about how can we add Apple Intelligence to this app to make a lot of these things more straightforward ... let's start experimenting\".",
   "detail": [
    "The owner, 14 November 2026: \"start thinking about how can we add Apple Intelligence to this app to make a lot of these things more straightforward ... let's start experimenting\".",
    "Compiles and its tests pass (14 November 2026, 6b13fcb); not yet used on a device: Ask this vault, after VoiceDebrief's Lab. One question, a fresh session, four read-only tools over a copy of the listing and history, every call shown. See the reality file.",
    "To learn from the owner's first tries on a device: does the model call a tool before answering; are the answers right; how long does it take; what did he want to ask that the tools could not answer.",
    "Next experiments, in the order they look useful (none started):",
    "1. A commit message from what changed (\"12 photographs of the stage and one video\"), offered, never applied unasked. One question, no tools. 2. Names for a selection being added: a folder suggestion from the files' names and dates. 3. Find by meaning: \"the photos from the dinner\" across vaults. Needs captions, which needs the Vision framework on the device at the time a picture is added; a larger piece of work. 4. A spoken question: the voice button (issue 120, with the people session's inbox) feeding this screen. 5. The standing position holds for all of them: the code owns the states, the model is asked one question at a time through function calls, and what it may touch is shown."
   ],
   "statusLine": "Status: open. Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB).",
   "owner": "the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB)",
   "places": [
    "SGit Vaults: a vault",
    "SGit Vaults: History"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/119-sgit-app-apple-intelligence.md",
   "source": "The owner"
  },
  {
   "id": "issue-120",
   "kind": "issue",
   "number": "120",
   "app": "SGit Vaults",
   "title": "sgit app: questions for the owner, answered by typing or by voice",
   "status": "proposed",
   "why": "Open, with nothing built yet: \"Status: open. Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB).\"",
   "summary": "The owner, 14 November 2026: \"you need a way that you can start to ask questions from me throughout the app, so I can answer them even with voice\".",
   "detail": [
    "The owner, 14 November 2026: \"you need a way that you can start to ask questions from me throughout the app, so I can answer them even with voice\".",
    "To do: Settings, Questions. Each question has an id, the words, why it matters, and proposed answers. The owner answers by choosing one, typing, or dictating (the keyboard's microphone: speech to text on the device). The answer goes to the developers over the developer lane, sealed to their key, as sgit/answer/v1; the app remembers what was answered. The questions ship with the app as a resource, written by the developers. Later: a recorded voice answer (VoiceDebrief's recorder), and questions that arrive in the inbox instead of with a build.",
    "Compiles and its tests pass (14 November 2026, 6b13fcb); not yet used on a device: Questions for you, on the home list and in Settings; nine questions in Resources/sg-questions.json."
   ],
   "statusLine": "Status: open. Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB).",
   "owner": "the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB)",
   "places": [
    "SGit Vaults: Settings"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/120-sgit-app-questions-for-the-owner.md",
   "source": "The owner"
  },
  {
   "id": "issue-121",
   "kind": "issue",
   "number": "121",
   "app": "SGit Vaults",
   "title": "sgit app: secrets, kept as files in vaults",
   "status": "proposed",
   "why": "Open, with nothing built yet: \"Status: open. Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB). Design: website/sgit-app/secrets/index.md.\"",
   "summary": "To do: a Secrets section listing the entries of every vault that has a secrets/ folder, grouped by vault (\"My secrets\", \"Team: devices\"); kinds login, device, Wi-Fi, card, note, token, vault key, read key, access key, recovery code; add, edit, delete, each as one signed commit of one JSON file; values behind Face ID, copied for two minutes, hidden in the app switcher; a secret's history from the...",
   "detail": [
    "To do: a Secrets section listing the entries of every vault that has a secrets/ folder, grouped by vault (\"My secrets\", \"Team: devices\"); kinds login, device, Wi-Fi, card, note, token, vault key, read key, access key, recovery code; add, edit, delete, each as one signed commit of one JSON file; values behind Face ID, copied for two minutes, hidden in the app switcher; a secret's history from the vault's commits; \"My secrets\" made on first use as a vault on this device. Not in this issue: sync (122), sharing (124), AutoFill (125).",
    "Compiles and its tests pass (14 November 2026, 6b13fcb); not yet used on a device: Sources/Secrets/; see the reality file's row. Left: a secret's own history (each change is a commit, not yet shown per secret), tags, import from other managers, a sheet covered in the app switcher.",
    "Fixed (14 November 2026): the pictures showed a team vault's secrets/ folder in the file browser, where opening an entry would have decrypted it into the cache without Face ID. Secrets are now shown only in Secrets."
   ],
   "statusLine": "Status: open. Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB). Design: website/sgit-app/secrets/index.md.",
   "owner": "the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB)",
   "places": [
    "SGit Vaults: a vault",
    "SGit Vaults: History"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/121-sgit-app-secrets-in-vaults.md",
   "source": "The owner"
  },
  {
   "id": "issue-122",
   "kind": "issue",
   "number": "122",
   "app": "SGit Vaults",
   "title": "sgit app: the same vaults on every device, without setting anything up",
   "status": "in-progress",
   "why": "Open, and the reality file lists for it: Secrets.",
   "summary": "The owner: \"the synchronisation between devices ... has to be completely transparent and straightforward\".",
   "detail": [
    "The owner: \"the synchronisation between devices ... has to be completely transparent and straightforward\".",
    "To do: the list of vaults and their keys, and the access key, in iCloud Keychain (synchronisable items, as VoiceDebrief did in issue 017), with a switch to keep them on this device only; pull when the app opens and comes to the front, push after each change, and say so on the vault's standing line. Each secret is its own file, so two devices changing different secrets do not conflict; the same secret changed on two devices keeps both and asks. Needs an access key to reach the server; without one a vault stays on the device it was made on, and the app says so. Mac, iPad and iPhone are the same app.",
    "Compiles and its tests pass (14 November 2026, 6b13fcb); not yet used on a device: see the reality file's row. Left: push after each change is what every write already does (a commit is pushed); a pull on a timer while the app is open; the same secret changed on two devices at once is decided by the server's compare-and-swap (the second write is retried on the newer head, so the later change wins and the earlier stays in history), not yet shown to the person."
   ],
   "statusLine": "Status: open. Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB).",
   "owner": "the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB)",
   "places": [
    "SGit Vaults: History"
   ],
   "versions": [],
   "features": [
    "Secrets"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/122-sgit-app-sync-between-my-devices.md",
   "source": "The owner"
  },
  {
   "id": "issue-123",
   "kind": "issue",
   "number": "123",
   "app": "SGit Vaults",
   "title": "sgit app: the trust map, from one person to a team",
   "status": "proposed",
   "why": "Open, with nothing built yet: \"Status: open. Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB), on the people session's SGitPeople (contacts, cards, confirmations).\"",
   "summary": "To do: a drawing of people (with the photo taken when you met) and the links between them: solid when both confirmed, dashed when one side only, labelled with how they met; agents drawn as agents; tap a person for their fingerprint, the vaults you share and the secrets given. Suggestions for missing links. Computed on the device, never published. A short onboarding story for one person, two, five...",
   "detail": [
    "To do: a drawing of people (with the photo taken when you met) and the links between them: solid when both confirmed, dashed when one side only, labelled with how they met; agents drawn as agents; tap a person for their fingerprint, the vaults you share and the secrets given. Suggestions for missing links. Computed on the device, never published. A short onboarding story for one person, two, five, shown the first time."
   ],
   "statusLine": "Status: open. Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB), on the people session's SGitPeople (contacts, cards, confirmations).",
   "owner": "the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB), on the people session's SGitPeople (contacts, cards, confirmations)",
   "places": [
    "SGit Vaults: Share"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/123-sgit-app-the-trust-map.md",
   "source": "The owner"
  },
  {
   "id": "issue-124",
   "kind": "issue",
   "number": "124",
   "app": "SGit Vaults",
   "title": "sgit app: a shared vault for chosen people",
   "status": "in-progress",
   "why": "Open, and the reality file lists for it: Secrets.",
   "summary": "To do: on the trust map or in a vault's Share, choose people and send them the vault, each copy sealed to their key and dropped in their inbox; on their side, the invitation opens the vault in one tap and it appears with its members. The vault keeps a member list file so each member's app can draw who is in it. For now a member holds the vault key and can do everything (the owner: \"for now, the...",
   "detail": [
    "To do: on the trust map or in a vault's Share, choose people and send them the vault, each copy sealed to their key and dropped in their inbox; on their side, the invitation opens the vault in one tap and it appears with its members. The vault keeps a member list file so each member's app can draw who is in it. For now a member holds the vault key and can do everything (the owner: \"for now, the shared vault means you share the vault key, which is okay\"). The share sheet stops showing a raw vault key as a QR code once this exists."
   ],
   "statusLine": "Status: open. Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB), on SGitPeople's sendVault (a vault invitation sealed to a contact).",
   "owner": "the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB), on SGitPeople's sendVault (a vault invitation sealed to a contact)",
   "places": [
    "SGit Vaults: Share"
   ],
   "versions": [],
   "features": [
    "Secrets"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/124-sgit-app-shared-vaults-for-people.md",
   "source": "The owner"
  },
  {
   "id": "issue-125",
   "kind": "issue",
   "number": "125",
   "app": "SGit Vaults",
   "title": "sgit app: AutoFill, passwords and passkeys in other apps and in Safari",
   "status": "in-progress",
   "why": "Open, and the reality file lists for it: Secrets.",
   "summary": "iOS lets a third-party app fill passwords and passkeys elsewhere only as an AutoFill credential provider: an app extension (ASCredentialProviderViewController) with the AutoFill Credential Provider capability, which the account holder switches on for ai.sgit.vaults.app in the developer portal, plus an App Group shared with the extension (the same one issue 105 waits for). Until then, the app...",
   "detail": [
    "iOS lets a third-party app fill passwords and passkeys elsewhere only as an AutoFill credential provider: an app extension (ASCredentialProviderViewController) with the AutoFill Credential Provider capability, which the account holder switches on for ai.sgit.vaults.app in the developer portal, plus an App Group shared with the extension (the same one issue 105 waits for). Until then, the app records which passkeys exist and where."
   ],
   "statusLine": "Status: open, needs the owner. Owner: the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB).",
   "owner": "the sgit app session (session_018yvwtQVQdrYtgUXUXD9cVB)",
   "places": [
    "SGit Vaults: Share"
   ],
   "versions": [],
   "features": [
    "Secrets"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/125-sgit-app-autofill-passwords-and-passkeys.md",
   "source": "The owner"
  },
  {
   "id": "issue-200",
   "kind": "issue",
   "number": "200",
   "app": "SGit Vaults",
   "title": "People, messages and secrets (the SGitPeople package)",
   "status": "in-progress",
   "why": "Open, and the reality file lists for it: The people layer, SGitPeople.",
   "summary": "From: the owner, 14 November 2026 (the brief in the article). Session: the people session, branch work/people.",
   "detail": [
    "From: the owner, 14 November 2026 (the brief in the article). Session: the people session, branch work/people.",
    "Every install is a person with keys and an inbox; people meet by exchanging signed cards; everything they send each other, secrets included, is sealed to the recipient's key and dropped in their inbox. One Swift package, Packages/SGitPeople, used by both apps.",
    "Done in the package (first slice)",
    "- PKIKit.swift and LaneCrypto.swift moved in from VoiceDebrief, made public, nothing else changed; pki-interop.yml compiles them from there. - ContactCard: a pki.sgit.ai statement (type: card, registry: sgit.ai/people) carrying the name, the sgit key bundle and the inbox; as sgc1. text (about 1,200 characters for a 4096-bit key), a link, a QR code. - ContactBook: contacts with how each was met; a later card from the same keys updates, other keys under a known fingerprint are refused. - PeopleMessage: sealed and signed in sgit's envelope; kinds text, voice-note reference, secret, vault invitation, card; from and to inside the seal are checked on opening. The message is pki.sgit.ai's own (pki.sgit.ai/message/v1, signed inside and out) with this package's fields added, and pki.sgit.ai's m1. code is the text for a sealed message handed over without an inbox. - LaneClient: write, list, fetch...",
    "Next",
    "1. ~~Prove the first-contact round trip against the live server~~: done with tools/people/people.py on 14 November 2026 (see the reality file). Still to do: the same from Swift, which needs an access key where Swift runs. 2. Screens in SGit Vaults: You, Contacts, Inbox, Secrets (with the sgit app session, which owns Apps/SGit). 3. VoiceDebrief: its recipients become contacts; the record screen shows the inbox (the parent session's screens). 4. Devices (the owner, via the parent): your devices by their vouching statements in identity/devices/, name, kind, device key fingerprint, last seen; remove one, which withdraws its statement. After contacts and first contact. 5. A page on the site for card/#sgc1… links (sealed messages use pki.sgit.ai's own m/#m1… page), which shows what it holds and opens nothing.",
    "Assumed, for the owner to confirm (the article's four decisions)",
    "1. The access key is given in the first exchange (section 5), sealed to the newcomer's card. 2. The card is a new signed statement in pki.sgit.ai's form, compatible with its key bundle. 3. Each person's inbox is a lane on a vault of their own. 4. Publishing to pki.sgit.ai is optional and off by default (nothing publishes yet)."
   ],
   "statusLine": "",
   "places": [
    "SGit Vaults"
   ],
   "versions": [
    "v0.1.54"
   ],
   "features": [
    "The people layer, SGitPeople"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/200-people-messages-and-secrets.md",
   "source": "The project"
  },
  {
   "id": "issue-300",
   "kind": "issue",
   "number": "300",
   "app": "SGit Vaults",
   "title": "L03, a game played by voice, with Apple's model as one of its engines",
   "status": "in-progress",
   "why": "Open, and the reality file lists for it: The Lab, experiment L03: a game played by voice.",
   "summary": "From: the owner, a voice note while driving, 14 November 2026. Session: the game session, branch work/game. Where: Apps/VoiceDebrief/Sources/Game/, Apps/VoiceDebrief/Tests/Game*.swift, one row \"L03: Play\" in the Lab.",
   "detail": [
    "From: the owner, a voice note while driving, 14 November 2026. Session: the game session, branch work/game. Where: Apps/VoiceDebrief/Sources/Game/, Apps/VoiceDebrief/Tests/Game*.swift, one row \"L03: Play\" in the Lab.",
    "What was asked",
    "A fun game, played by voice on an iPhone or an iPad, that uses Apple's on-device model (the Foundation Models framework) as part of its engine: points, obstacles, a little action, a story, problems to solve, levels, winning and losing, and a couple of easter eggs left to be found. The game is the excuse. The experiment is speed and feel: \"I say turn left: how long until it turns left?\" Every command is timed from the end of speaking to the change on the screen, the time is shown every time, and the log is kept and shared as JSON.",
    "The position it follows",
    "From \"Two decision engines\" and \"A harness inside the app\": the code owns the state. The model is asked one question at a time, with no history, and may only propose: it calls one tool, the code checks the call against the rules and applies it or says why not. The model is given only what makes sense at that moment.",
    "The primitives",
    "All in plain Swift with no model in sight, so all of it is unit tested.",
    "| Primitive | What it is | |---|---| | GameState | A grid of tiles, the player, gold, keys, lives, moves left, points, level, status (playing, level won, won, lost). | | GameTile | floor, wall, gold, key, door, trap, exit, ladder, and one that looks like a wall and is not. | | GameLevel | A title, two lines of story, a few rows of text (# wall, o gold, k key, D door, ^ trap, E exit, H ladder, @ start), a move budget and lives. | | GameCommand | move (direction, steps), jump, climb, unlock, restart, next level, hint, and two that only the phrases know. | | GameRules.apply | The rule engine in code: a command and a state in, a new state, whether it was accepted, a sentence and events out. | | GameToolScope | The tools that make sense in this state, with descriptions that say what is possible now. | | GamePlanner | A breadth-first search over the rules themselves: the shortest list of..."
   ],
   "statusLine": "",
   "places": [
    "SGit Vaults: History",
    "SGit Vaults: Share"
   ],
   "versions": [
    "v0.1.80"
   ],
   "features": [
    "The Lab, experiment L03: a game played by voice"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/open/300-the-voice-game.md",
   "source": "The project"
  },
  {
   "id": "issue-004",
   "kind": "issue",
   "number": "004",
   "app": "VoiceDebrief",
   "title": "Prove vault writes against the live server",
   "status": "seen-working",
   "why": "Moved to done, and the issue says: \"Status: done, 13 November 2026.\"",
   "summary": "Done, 13 November 2026: the owner created a vault from the app (build 0.1.5, on a Mac) on dev.send.sgraph.ai; the app read it back with the commit's signature verified. That is the first live write from the Swift engine. The same day sgit created and pushed a vault there with the owner's token.",
   "detail": [
    "Done, 13 November 2026: the owner created a vault from the app (build 0.1.5, on a Mac) on dev.send.sgraph.ai; the app read it back with the commit's signature verified. That is the first live write from the Swift engine. The same day sgit created and pushed a vault there with the owner's token.",
    "Then the owner saved a debrief into that vault from the app: 4 files, one signed commit, compare-and-swap on the ref, read back verified.",
    "Not part of this issue any more: sgit clone of an app-made vault from the live server (see the reality file)."
   ],
   "statusLine": "Status: done, 13 November 2026.",
   "places": [],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/done/004-live-vault-writes.md",
   "source": "The project"
  },
  {
   "id": "issue-005",
   "kind": "issue",
   "number": "005",
   "app": "VoiceDebrief",
   "title": "PKIKit, the key bundle",
   "status": "seen-working",
   "why": "Moved to issues/done, with no untried work said in it.",
   "summary": "One sgit-compatible identity: RSA-OAEP 4096 and ECDSA P-256 generation, the public bundle, fingerprints, PKCS#8 export and import, envelope v2, detached signatures, sgit's passphrase-protected key store. PTLanes/LaneCrypto.swift in PrompTugal__App__iOS is the seed (envelope, SPKI conversion, fingerprints).",
   "detail": [
    "One sgit-compatible identity: RSA-OAEP 4096 and ECDSA P-256 generation, the public bundle, fingerprints, PKCS#8 export and import, envelope v2, detached signatures, sgit's passphrase-protected key store. PTLanes/LaneCrypto.swift in PrompTugal__App__iOS is the seed (envelope, SPKI conversion, fingerprints).",
    "Done when the interop job passes in both directions with sgit pki, and fingerprints match the five fixture identities published by pki.sgit.ai.",
    "Done, 13 November 2026",
    "Apps/VoiceDebrief/Sources/Engine/PKIKit.swift, as app code rather than a package for now. pki-interop.yml passes in both directions with sgit pki (sgit-ai 0.27.0) and with pki.sgit.ai's keys.js (lib v0.2.28).",
    "One line of the \"done when\" was not met as written: the five fixture identities were not found at pki.sgit.ai/directory/fixtures/ (404 on the day). In their place the unit tests check the fingerprints of the register's real root record, and the workflow checks fingerprints of keys sgit and keys.js make in the run."
   ],
   "statusLine": "Status: open. Milestone: 1.",
   "places": [
    "Settings: Identity"
   ],
   "versions": [
    "v0.1.29"
   ],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/done/005-pkikit.md",
   "source": "The project"
  },
  {
   "id": "issue-011",
   "kind": "issue",
   "number": "011",
   "app": "VoiceDebrief",
   "title": "Vaults are local first; a server is a remote",
   "status": "built-untried",
   "why": "Done in the code, and the issue says: \"Status: done in the code and its tests; not yet run on a device. See the article \"The vault is a version-controlled store\".\"",
   "summary": "The Vaults tab asked for an access token before creating a vault. Creating a vault needs no server.",
   "detail": [
    "The Vaults tab asked for an access token before creating a vault. Creating a vault needs no server.",
    "What was done",
    "- A vault is created, committed to, read and browsed in a folder on the device (Application Support/vaults/), through the engine's FolderVaultTransport. No token, no network. - Servers are named remotes: a name, an address and an access token in the Keychain. A vault has none or one. - Push and pull are explicit (VaultSync.transfer in the engine): only what the other side lacks is sent, the ref moves last with compare-and-swap, and only forward. When both sides have changed it says a merge is needed and writes nothing. - Each vault says where it is: on this device only, not yet pushed, pushed (when), ahead of the server, or push failed with the reason. - Vaults made by earlier builds (from v0.1.5) stay attached to dev.send.sgraph.ai and work as before; \"Keep a copy on this device\" brings one down. - ios-vault.yml has sgit clone a vault that was created in one folder and pushed to...",
    "Left for later",
    "- A merge when both sides have changed (issue 006). - Branches other than current; several servers for one vault; pushing automatically after a save. - The first push of a vault from the app to the live server, and the first pull: only a device can show these."
   ],
   "statusLine": "Status: done in the code and its tests; not yet run on a device. See the article \"The vault is a version-controlled store\".",
   "places": [
    "Vaults tab"
   ],
   "versions": [],
   "features": [
    "Local-first vaults and named remotes; keys in iCloud Keychain"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/done/011-local-vaults-and-remotes.md",
   "source": "The project"
  },
  {
   "id": "issue-017",
   "kind": "issue",
   "number": "017",
   "app": "VoiceDebrief",
   "title": "Vault keys and server tokens in iCloud Keychain, on by default",
   "status": "built-untried",
   "why": "Done in the code, and the issue says: \"Status: done in the code and its tests; not yet seen between two devices. Decided by the owner, 13 November 2026, and confirmed by him in the work/local-vaults...\"",
   "summary": "Vault keys and remote tokens become synchronisable Keychain items, so a vault made on one device appears on the others and survives losing a device. On by default; a switch keeps them on this device only. The commit-signing (device) key is never synchronised.",
   "detail": [
    "Vault keys and remote tokens become synchronisable Keychain items, so a vault made on one device appears on the others and survives losing a device. On by default; a switch keeps them on this device only. The commit-signing (device) key is never synchronised.",
    "What was done",
    "- SecretStore now names a home for every secret: .synchronised or .thisDeviceOnly. The old calls with no home mean this device only. - One Keychain item per vault (vault-<id>), per server (server-<id>) and per token (remote-token-<id>), so two devices adding vaults at once do not overwrite each other. What is true of one device (whether the vault is on it, its heads, the last push) stays in an item of this device only. - SharedSecrets keeps a copy of each on this device always, and with the switch on a synchronised copy too. It takes what another device made or changed, puts up what this device has never shared, and when another device has removed a key keeps this device's copy without putting it back. - The switch is under Keys on the Vaults tab. Off: everything is taken onto this device, then removed from iCloud Keychain. - What builds before this kept in one list is adopted, item by...",
    "Only a device can show",
    "That iCloud Keychain carries these items. Create a vault on the iPhone, wait, open the Vaults tab on the iPad or Mac signed in to the same Apple account: the vault should be listed as on another device, or on its server once pushed.",
    "Left for later",
    "- The Vaults tab looks in iCloud Keychain when it appears, not continuously. - Two devices that each add the same server get two entries for it. - IdentityKeychain (issue 018) has its own copy of the two homes and can become a layer over SecretStore."
   ],
   "statusLine": "Status: done in the code and its tests; not yet seen between two devices. Decided by the owner, 13 November 2026, and confirmed by him in the work/local-vaults session on 14 November. See the article \"Where each key lives\".",
   "places": [
    "Vaults tab",
    "Settings: Identity"
   ],
   "versions": [
    "v0.1.33"
   ],
   "features": [
    "Local-first vaults and named remotes; keys in iCloud Keychain"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/done/017-key-sync.md",
   "source": "The owner"
  },
  {
   "id": "issue-029",
   "kind": "issue",
   "number": "029",
   "app": "VoiceDebrief",
   "title": "Play a recording, and show how long an interrupted one is",
   "status": "built-untried",
   "why": "Done in the code, and the issue says: \"Built (untried on a device): a player on every note with audio, length and size shown, a transcript line plays from its moment. Status: open. From review round...\"",
   "summary": "Built (untried on a device): a player on every note with audio, length and size shown, a transcript line plays from its moment.",
   "detail": [
    "Finding 1. Screens note.interrupted, note.finished. Found by the user who lost a recording elsewhere and by the driver; it decided the first against the app.",
    "An interrupted note says \"The recording is kept\" and offers no way to play it and no length. A finished note has no player either. A person who has lost a recording does not believe a sentence; they believe hearing it.",
    "To do: a player on every note that has audio (the design's build B), and for a note with no transcript at least the audio's length and size, so that \"kept\" can be checked. Playing a note's audio is listed as proposed in the reality file; this finding is the case for doing it before anything else on the note screen.",
    "Round 2 (14 November 2026): seen fixed in the pictures. A player with length and size on every note with audio, including an interrupted one. Left open for the owning session to close."
   ],
   "statusLine": "Status: open. From review round 1 (13 November 2026, website/reviews/round-1/index.md). Owner: the main session (NoteDetailView, NoteParts).",
   "owner": "the main session (NoteDetailView, NoteParts)",
   "places": [
    "A note: the player",
    "Library, then a note"
   ],
   "versions": [],
   "features": [
    "Reviews from the pictures"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/done/029-play-a-recording.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-030",
   "kind": "issue",
   "number": "030",
   "app": "VoiceDebrief",
   "title": "Record again while the last note is being written up",
   "status": "built-untried",
   "why": "Done in the code, and the issue says: \"Built (untried on a device): recording and processing are separate; notes queue for the pipeline and say \"Waiting its turn\"; the control stays live, and its...\"",
   "summary": "Built (untried on a device): recording and processing are separate; notes queue for the pipeline and say \"Waiting its turn\"; the control stays live, and its caption says how many are waiting.",
   "detail": [
    "Finding 2. Screen record.working. Found by the driver (it blocked the task: a second memo straight after the first) and by the user who lost a recording.",
    "While a note is being transcribed and debriefed the record control is grey and says \"Finishing the last note\", with no word on how long. A thought that arrives then is lost, which is against the standing position \"never lose a recording\".",
    "To do: let a recording start whatever the pipeline is doing. The session takes one note through the pipeline at a time, so this needs a queue of notes waiting to be processed, or a recording that waits its turn. If it cannot be done at once, say how long is left and keep the control its normal colour.",
    "Round 2 (14 November 2026): seen fixed in the pictures. The control stays live, the caption counts the notes waiting, a waiting row says so. Left open for the owning session to close."
   ],
   "statusLine": "Status: open. From review round 1 (13 November 2026, website/reviews/round-1/index.md). Owner: the main session (RecordView, DebriefSession).",
   "owner": "the main session (RecordView, DebriefSession)",
   "places": [
    "Record tab"
   ],
   "versions": [
    "v0.1.29"
   ],
   "features": [
    "Reviews from the pictures"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/done/030-record-while-the-last-note-is-written-up.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-034",
   "kind": "issue",
   "number": "034",
   "app": "VoiceDebrief",
   "title": "The gist first on a note",
   "status": "built-untried",
   "why": "Done in the code, and the issue says: \"Built (untried on a device): the one sentence is the heading with the date beneath; it is not repeated at the end; the clean text section is below the...\"",
   "summary": "Built (untried on a device): the one sentence is the heading with the date beneath; it is not repeated at the end; the clean text section is below the transcript.",
   "detail": [
    "Finding 6. Screen note.finished. Found by the driver and by the agent.",
    "A finished note opens with a date, then \"Clean text (experiment)\" with a button and three lines about it, then the debrief starting with key points, cut off on an iPhone by the send bar. \"In one sentence\", which the design puts first, is the last thing in the debrief. The person who wanted the gist of a memo has to scroll past an experiment to find it.",
    "To do: the one sentence as the note's heading (the date beneath it), then key points and actions; the clean text experiment below the debrief or behind one row; leave room so the send bar does not cover the last line.",
    "Round 2 (14 November 2026): seen fixed in the pictures. The one sentence is the heading; the clean text is below the transcript. The send bar covering the key points is carried in issue 031. Left open for the owning session to close."
   ],
   "statusLine": "Status: open. From review round 1 (13 November 2026, website/reviews/round-1/index.md). Owner: the main session (NoteDetailView, CleanTextView, NoteParts).",
   "owner": "the main session (NoteDetailView, CleanTextView, NoteParts)",
   "places": [
    "A note: Clean text",
    "A note: the send bar",
    "Library, then a note"
   ],
   "versions": [],
   "features": [
    "Reviews from the pictures"
   ],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/done/034-the-gist-first-on-a-note.md",
   "source": "A review by synthetic users"
  },
  {
   "id": "issue-101",
   "kind": "issue",
   "number": "101",
   "app": "SGit Vaults",
   "title": "TestFlight for the sgit app",
   "status": "seen-working",
   "why": "Moved to done, and the issue says: \"Status: done, 13 November 2026. The owner made the App Store Connect record (\"SGit Vaults\") and set the switch; sgit-app.yml run 7 uploaded 0.1.19 (7). The...\"",
   "summary": "sgit-app.yml archives and uploads on a green push to dev only when the repository variable SGIT_APP_TESTFLIGHT is 1. Before that: an App Store Connect record for the bundle id ai.sgit.vaults.app (register the bundle id under Identifiers, then New App, platform iOS, name of the owner's choosing, SKU of any kind). The signing secrets are the ones ios.yml already uses. Then set the variable.",
   "detail": [
    "sgit-app.yml archives and uploads on a green push to dev only when the repository variable SGIT_APP_TESTFLIGHT is 1. Before that: an App Store Connect record for the bundle id ai.sgit.vaults.app (register the bundle id under Identifiers, then New App, platform iOS, name of the owner's choosing, SKU of any kind). The signing secrets are the ones ios.yml already uses. Then set the variable."
   ],
   "statusLine": "Status: done, 13 November 2026. The owner made the App Store Connect record (\"SGit Vaults\") and set the switch; sgit-app.yml run 7 uploaded 0.1.19 (7). The switch was added as a secret, which the workflow also reads; because its value is 1, GitHub masks every 1 in that job's log. Moving it to a repository variable would stop that.",
   "places": [
    "SGit Vaults"
   ],
   "versions": [],
   "features": [],
   "url": "https://github.com/VoiceDebrief/VoiceDebrief__App__iOS/blob/dev/issues/done/101-sgit-app-testflight.md",
   "source": "The owner"
  },
  {
   "id": "article-a-harness-inside-the-app",
   "kind": "article",
   "app": "Both",
   "title": "A harness inside the app",
   "status": "proposed",
   "why": "An article: a position or a brief. Nothing in it is built unless the reality file says so.",
   "summary": "SHarness gives a process nothing by default. What it needs comes through doors, one job each: the network, the file system, keys, the model, running a command. A policy says which doors are open and how far, and a secret lives behind exactly one of them.",
   "detail": [
    "A brief. From the owner's voice memo of 13 November 2026, written up by the agent. It draws on SHarness, the owner's design for running agents as small, single-purpose processes that reach the world only through separate, policed doors.",
    "SHarness gives a process nothing by default. What it needs comes through doors, one job each: the network, the file system, keys, the model, running a command. A policy says which doors are open and how far, and a secret lives behind exactly one of them.",
    "An app with a model in it has the same problem at a smaller scale. When the model is asked what to do next, something decides whether it may read a file, open a vault, use a key or reach the network. Today that something is scattered through the code. The brief is to make it explicit, in the same shape:",
    "| Door | What passes through it in the app | |---|---| | Network | Every request, to which host, and why | | File system | Reads and writes, as a virtual file system over notes and vaults | | Vault | Opening a vault, reading a path, writing a commit | | Keys | Deriving, signing, encrypting, decrypting: the key never leaves this door | | Model | Every prompt and every answer, on the device or in Apple's cloud | | Run | Whatever the app can execute on the model's behalf, if anything |",
    "Each door is a small component with one job, a policy for what it will do, and a record of what it did. This need not be separate processes on iOS; the shape and the records are what matter first.",
    "The reason to build it this way is to be able to watch it. On an iPad or a Mac: the thing being done on the left, the doors on the right, and each request drawn as it passes from one to the other, allowed or refused. The vault engine's \"Every step\" log is the first, text-only version of this for one door.",
    "As the interface becomes something the model helps decide (see Two decision engines), this view is how anyone, the developer first, understands why the app did what it did."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/articles/a-harness-inside-the-app/index.html",
   "source": "A brief. From the owner's voice memo of 13 November 2026, written up by the agent. It draws on SHarness, the owner's design for running agents as small..."
  },
  {
   "id": "article-a-private-voice-note-and-a-clinic",
   "kind": "article",
   "app": "Both",
   "title": "A private voice note, and what it would take to use it in a clinic",
   "status": "proposed",
   "why": "An article: a position or a brief. Nothing in it is built unless the reality file says so.",
   "summary": "VoiceDebrief is one example of a pattern that could carry other things than voice notes. A person's own device does the work: it records, a model on the device turns speech into text, and a second model on the device summarises it. Nothing has to leave the device for any of that, so it works offline. What the person chooses to keep is encrypted on the device into a vault that only their key opens....",
   "detail": [
    "Kind: an idea, with corrections. From: a conversation recorded in the app on 13 November 2026 between the owner and a clinician, who asked for it to be written down and drawn. Written up by the agent working on the repository, which has also corrected the places where the conversation described the plan as if it were built, or said more than is true.",
    "VoiceDebrief is one example of a pattern that could carry other things than voice notes. A person's own device does the work: it records, a model on the device turns speech into text, and a second model on the device summarises it. Nothing has to leave the device for any of that, so it works offline. What the person chooses to keep is encrypted on the device into a vault that only their key opens. What they choose to send goes to one other person, encrypted to that person's public key, so that the server carrying it holds bytes it cannot read. There is no account with the company that made the app. The proposal is to try this between a patient and a clinician.",
    "| Step | What happens | Today | |---|---|---| | 1. Speak | The recording is written into the app's own storage as it is spoken | Works | | 2. Words | Apple's speech model, on the device, produces a transcript with times | Works. English tried; other languages untried | | 3. Summary | Apple's language model, on the device, writes key points, actions and one sentence | Works, with faults: see below | | 4. Keep | The note is encrypted on the device into a vault as one signed commit | Works by hand; automatic saving is written, untried | | 5. Exchange keys | The clinician shows a QR code: their public key and the address of their inbox. The patient scans it once | In build 0.1.9, untried on a device. The receiving side exists as a script, not an app | | 6. Send | The note is encrypted on the patient's device to the clinician's key and left in their inbox | Works: every note in this project's...",
    "- The models run on the device, so it works offline and the audio need not go anywhere. True of both Apple's speech model and its language model as the app uses them. - No login with us. The app is installed with an Apple ID, which the developer does not see. The developer cannot tell one user from another, and is not meant to. - A passkey is unlocked by a face or a finger and kept by Apple so that only your own devices can use it. True: passkeys live in iCloud Keychain, which is end-to-end encrypted. - A vault's key can be taken out and the vault opened in a browser. True: the vault format is sgit's, and a vault made by the app has been read back that way. - The clinician's side is the same design in a different app. That is the intention: the keys, vaults and inboxes do not change; the screens do.",
    "1. \"The model transcribes and separates the speakers.\" It transcribes. It does not tell speakers apart: the recording this article came from, with two people talking, came out as one unbroken voice. The app treats every note as one person's memo. 2. \"The passkey is the same one I use for iCloud.\" No. A passkey belongs to one site or app. The one used here would be made for this purpose and is separate from the Apple ID. What is shared is where it is kept (iCloud Keychain) and how it is unlocked (Face ID or Touch ID). 3. \"The vault key is made from the passkey.\" That is the design, and it already works on the web at pki.sgit.ai. In the app, the arithmetic exists and is tested against published examples, but the sign-in itself is not built. Today the app keeps vault keys in the device's Keychain. 4. \"Because it is on the device and encrypted, it is GDPR compliant.\" This is the one to be...",
    "Doing the work on the device and encrypting before anything leaves it removes a large part of the usual risk: there is no company server holding recordings, no third-party model receiving them, and a breach of the storage server yields ciphertext. Those are real advantages and they are the reason for the design.",
    "They do not make a service \"compliant\" by themselves. If a clinic used this with patients:"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/articles/a-private-voice-note-and-a-clinic/index.html",
   "source": "Kind: an idea, with corrections. From: a conversation recorded in the app on 13 November 2026 between the owner and a clinician, who asked for it to be written..."
  },
  {
   "id": "article-people-messages-and-secrets",
   "kind": "article",
   "app": "Both",
   "title": "People, messages and secrets: the layer under both apps",
   "status": "in-progress",
   "why": "An article; work it names has begun: issue 110.",
   "summary": "The idea in one line: every install is a person with keys and an inbox; people meet by exchanging cards; everything they send each other, including secrets, is sealed to the recipient's key and dropped in their inbox. VoiceDebrief and SGit Vaults both stand on it, and so does a secrets manager.",
   "detail": [
    "Kind: an architecture and a brief. From: the owner, 14 November 2026: \"anybody who installs the app has a public and private key straight away ... register people, kind of like PKI ... identities from the website, and identities shared by QR code, in person or in a WhatsApp message ... a messaging system ... your device becomes the management layer ... a full-blown secrets manager.\" Written up by the agent working on the repository. Intention, not fact: what is built says what exists.",
    "The idea in one line: every install is a person with keys and an inbox; people meet by exchanging cards; everything they send each other, including secrets, is sealed to the recipient's key and dropped in their inbox. VoiceDebrief and SGit Vaults both stand on it, and so does a secrets manager.",
    "- Your key pair (RSA-OAEP 4096 to receive, ECDSA P-256 to sign; the sgit key bundle). Made at first launch, kept in iCloud Keychain so that your other devices have it. Built in VoiceDebrief (PKIKit, the Identity screen); made when asked for, not at first launch; untried on a device. - This device's key, in the Secure Enclave where there is one, vouched for by your key. Built in VoiceDebrief; untried. - An inbox: an append lane on a vault of yours. Anyone holding its link can drop a sealed message in; only your key opens it. The lane works today (every note sent to the developer goes this way); an inbox per person is not built. - A contact card: your name, your public keys, your inbox's link, signed by you. Shown as a QR code or a link. Not built: today's QR code carries an inbox link and one public key, not a signed card. - The secrets store: access keys, vault keys, passwords and...",
    "| Way | How | How far to trust it | |---|---|---| | In person | Each scans the other's QR code | The most: you saw the person and the code together | | By a message | The card as a QR picture or a link, on WhatsApp, Signal, email | As far as the channel it came by | | From the register | Look up a name or fingerprint at pki.sgit.ai | As far as the register's checks on that person |",
    "A contact keeps how it was met, and can be checked later (fingerprints compared face to face, or the register vouching). Adding is two-way: when you add someone, the app offers to send them your card, so they can write back. Agents are contacts like any other: a Claude session has a card and an inbox (tools/conductor/ makes them).",
    "A message is sealed to the recipient's public key and signed with the sender's, on the sender's device (the envelope PKIKit already makes). It can carry text, a voice note (what VoiceDebrief sends today), a secret, a vault invitation, or a card.",
    "Checking for new messages. There are no push events, so the app asks: when it opens or comes to the front, every minute while it is in use, and less and less often when idle (the owner's pattern from the website). One list call on one inbox per check: little traffic."
   ],
   "places": [],
   "issues": [
    "110"
   ],
   "url": "https://ios.app.voicedebrief.ai/articles/people-messages-and-secrets/index.html",
   "source": "Kind: an architecture and a brief. From: the owner, 14 November 2026: \"anybody who installs the app has a public and private key straight away ... register..."
  },
  {
   "id": "article-secrets-app",
   "kind": "article",
   "app": "Both",
   "title": "A secrets app that keeps one file where you already keep things",
   "status": "in-progress",
   "why": "An article; work it names has begun: issue 006.",
   "summary": "The idea in one line: a cheap password and secrets manager that just works, where the vault is one small encrypted file in your own iCloud Drive, rewritten on every change, opened by a key that never reaches us, with our server only ever an extra copy.",
   "detail": [
    "Kind: research, a storage design and a build plan. From: the owner's voice note of 14 November 2026, after trying the Secrets part of SGit Vaults: \"even just that is a crazy feature; we should just ship it\". Written up by the secrets-app research session the same day. Nothing on this page is built unless it says so. The only record of what exists is what is built (and, for SGit Vaults, its own reality file).",
    "The idea in one line: a cheap password and secrets manager that just works, where the vault is one small encrypted file in your own iCloud Drive, rewritten on every change, opened by a key that never reaches us, with our server only ever an extra copy.",
    "His words where they matter:",
    "- Ship the Secrets screens as their own product: \"an easy, cheap password and secrets manager\" that \"just works\", on what exists: an encrypted, version-controlled vault, all cryptography on the device, a server that sees only ciphertext. - Do not depend on our server by default. \"Our services are not ready to provide that level of resilience; this becomes mission critical\", and a server connection \"breaks the whole model\". Keep the vault as one small encrypted file (a zip of the vault) in storage the person already has, above all iCloud Drive, rewritten on every change, with a few past versions kept, and refreshed when the app opens. - Several stores at once: iCloud Drive, a local file, a downloaded copy that the sgit command can open, and optionally SG/Send for online access. Never the server as the default. - Options for the key: today it is in iCloud Keychain; also a passkey wrapping...",
    "Read on 14 November 2026. Labels as in the reality files: built is tested in CI, unverified is written and compiled but not yet proven on a device, proposed does not exist.",
    "| Part | Where | Status | |---|---|---| | Secrets screens: kinds login, device passcode, Wi-Fi, card, note, token, vault key, read key, access key, recovery codes; each secret one encrypted JSON file (sgit.ai/secret/v1) in a vault's secrets/ folder, each change one signed commit; values behind Face ID, copied for two minutes; a strong-password maker; \"My secrets\" made on first use | Apps/SGit/Sources/Secrets/ (SecretEntry.swift, SecretsView.swift, VaultShelf+Secrets.swift) | Unverified | | Vaults on the device with no server: the server's own layout (bare/data, refs, indexes, keys) in a folder under Application Support | VaultBook, VaultShelf, Packages/SGitVault | Unverified (CI tests with folders) | | Vault keys and access keys in iCloud Keychain, one synchronisable item each, a switch to keep them on one device | Engine/SecretStore.swift in both apps | Unverified; iCloud Keychain...",
    "Two things were checked for this article with the real sgit command (sgit-ai 0.27.0, from PyPI, in this session):"
   ],
   "places": [],
   "issues": [
    "003",
    "006"
   ],
   "url": "https://ios.app.voicedebrief.ai/articles/secrets-app/index.html",
   "source": "Kind: research, a storage design and a build plan. From: the owner's voice note of 14 November 2026, after trying the Secrets part of SGit Vaults: \"even just..."
  },
  {
   "id": "article-synthetic-users",
   "kind": "article",
   "app": "Both",
   "title": "Synthetic users",
   "status": "proposed",
   "why": "An article: a position or a brief. Nothing in it is built unless the reality file says so.",
   "summary": "The app is built by an agent that cannot see it. Continuous integration compiles and tests it; the owner sees it on a device. Between the two there is nobody checking whether a person arriving for the first time can find the record button, understand what a vault is, or get back from the place a tap took them.",
   "detail": [
    "A brief. From the owner's voice memo of 13 November 2026, written up by the agent.",
    "The app is built by an agent that cannot see it. Continuous integration compiles and tests it; the owner sees it on a device. Between the two there is nobody checking whether a person arriving for the first time can find the record button, understand what a vault is, or get back from the place a tap took them.",
    "Invented users, each with a purpose and a level of knowledge, who walk the screens and report where they hesitated, guessed wrong or got lost. The newsroom at sgit.ai does this for a website, one screenshot at a time. The same applies here.",
    "For example:",
    "- someone who wants to record a memo while driving and has never heard of a vault; - someone careful about privacy who wants to know exactly what leaves the phone; - a developer who wants to see every request the app makes; - someone who lost a recording in another app and does not trust this one.",
    "1. Pictures of every screen. A workflow in continuous integration runs the app in a simulator, one launch per screen with sample data, and keeps a screenshot of each on an iPhone and an iPad. The sibling repository has this already; it is to be carried over. It also gives the agent its first sight of its own work. 2. A walk. A synthetic user is given a task and the screenshots, and says at each step what it would tap and what it expects. Where its expectation and the next screen disagree is a finding. 3. A record. Findings are kept as files, each with the screen, the user and what went wrong, and a status as review findings have elsewhere in this family.",
    "A synthetic user reads a picture. It does not feel a button that is too small for a thumb, hear nothing, or drive a car. Simulators have no speech model and no Apple Intelligence, so screens that depend on them are shown with sample data. The owner on a device remains the test that counts."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/articles/synthetic-users/index.html",
   "source": "A brief. From the owner's voice memo of 13 November 2026, written up by the agent."
  },
  {
   "id": "article-the-lab",
   "kind": "article",
   "app": "Both",
   "title": "The lab",
   "status": "proposed",
   "why": "An article: a position or a brief. Nothing in it is built unless the reality file says so.",
   "summary": "VoiceDebrief for iOS started as one job: a voice note in, a transcript and a debrief out. In a day it gained on-device speech, an on-device model, vaults, signed commits and encrypted lanes, and it runs as one app on a phone, a tablet and a laptop, delivered by TestFlight. That combination is rarer than the product it was built for.",
   "detail": [
    "A brief. From the owner's voice memo of 13 November 2026, written up by the agent. Nothing here is built unless what is built says so.",
    "VoiceDebrief for iOS started as one job: a voice note in, a transcript and a debrief out. In a day it gained on-device speech, an on-device model, vaults, signed commits and encrypted lanes, and it runs as one app on a phone, a tablet and a laptop, delivered by TestFlight. That combination is rarer than the product it was built for.",
    "So for now the app is also a laboratory. The product that ships will be smaller and more focused. The lab exists to get the primitives and the key workflows right, and to find out what is possible, before deciding what that product is.",
    "Because nothing here is being submitted to the App Store yet, the lab can ask for any capability Apple offers.",
    "| | Experiment | Question | |---|---|---| | L01 | One prompt, tools on and off | What does the on-device model do with a single tightly scoped prompt and a chosen set of tools? How reliable are its tool calls? | | L02 | The model drives the screen | Can the model choose what the interface shows next, through function calls, from a state the code hands it? | | L03 | The model edits a page | Can it write or change an HTML or JSON page in a vault that the app then renders? | | L04 | Apple's larger model | The same prompts on Private Cloud Compute: what does 32,768 tokens and reasoning buy? | | L05 | Another provider through the same framework | iOS 27 lets a session run on other models, Claude among them. What changes, and what does it cost in privacy? | | L06 | Images | What can Image Playground and image input do for a note: a cover, a photographed whiteboard? | | L07 | A file system for...",
    "Each experiment is a screen in a Lab section of the app, with what was asked, what came back, how long it took and what it cost shown plainly. An experiment that fails is a result.",
    "- An experiment says what it is. Nothing in the lab is presented as a finished feature. - Everything the model is given and everything it returns can be seen. See Two decision engines. - What works is rebuilt properly, and probably moved out into its own app or package. The lab is where it is found, not where it lives."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/articles/the-lab/index.html",
   "source": "A brief. From the owner's voice memo of 13 November 2026, written up by the agent. Nothing here is built unless what is built says so."
  },
  {
   "id": "article-the-vault-is-a-version-controlled-store",
   "kind": "article",
   "app": "Both",
   "title": "The vault is a version-controlled store",
   "status": "proposed",
   "why": "An article: a position or a brief. Nothing in it is built unless the reality file says so.",
   "summary": "A vault is usually described by its encryption. That undersells it. A vault is a version-controlled data store: files, history, branches, signed commits. The encryption is one property; the history is another, and for an ordinary application it may be the more useful one. Anything an app keeps could be kept this way and gain history, integrity and a way to move.",
   "detail": [
    "A position and a brief. From the owner's voice memo of 13 November 2026, written up by the agent.",
    "A vault is usually described by its encryption. That undersells it. A vault is a version-controlled data store: files, history, branches, signed commits. The encryption is one property; the history is another, and for an ordinary application it may be the more useful one. Anything an app keeps could be kept this way and gain history, integrity and a way to move.",
    "And a vault is a good way to move data. Two devices, two people or a person and an agent can exchange work by exchanging vaults, or by writing to each other's lanes.",
    "The first vault screen in this app asks for an SG/Send access token before it will create a vault. That is wrong in principle. Creating a vault needs no server and no token. A vault can exist on the device alone. A token is needed only to push it to a server, and the server itself should be something you configure, not something assumed.",
    "So:",
    "- A vault is local first. Create, commit, read and browse with no network. - A server is a remote. Add one, with its address and its token, when you want the vault elsewhere. Push and pull are explicit. - Some things need a remote. A lane, where others write to you, lives on a server. That is one use, not the definition.",
    "| | What | |---|---| | Local vaults | Create and use a vault on the device with no token. The engine already writes to a folder in its tests; the app should use that | | Remotes | A list of servers, each with an address and a token in the Keychain. A vault may have none, one or several | | Several vaults, several lanes | Register them with names. Choose where a note goes: one vault, several, a lane to a person or to an agent that conducts other agents | | A file system | The vault as a virtual file system the app, and later the model, can be given in part: this folder, read only | | Vault apps | A vault can hold an app: pages and data rendered from the vault. Render them here. Then create and edit them here, and see whether the model can | | Graphs | Every note processed into the store, then linked: semantic graphs across notes and across vaults |"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/articles/the-vault-is-a-version-controlled-store/index.html",
   "source": "A position and a brief. From the owner's voice memo of 13 November 2026, written up by the agent."
  },
  {
   "id": "article-two-decision-engines",
   "kind": "article",
   "app": "Both",
   "title": "Two decision engines",
   "status": "proposed",
   "why": "An article: a position or a brief. Nothing in it is built unless the reality file says so.",
   "summary": "An application used to have one thing that decided what happens next: its code. With a model on the device it has two. The code decides by rules somebody wrote. The model decides by judgement nobody wrote. The interesting question is not which is better. It is how the two are joined.",
   "detail": [
    "A position. From the owner's voice memo of 13 November 2026, written up by the agent.",
    "An application used to have one thing that decided what happens next: its code. With a model on the device it has two. The code decides by rules somebody wrote. The model decides by judgement nobody wrote. The interesting question is not which is better. It is how the two are joined.",
    "The code owns the states. The model is asked one question at a time.",
    "The application is a set of states and the moves between them: a state machine, as the pipeline already is. At a given state the code may hand the model a small, exact package (this state, this data, these tools) and ask one of two things:",
    "- What should happen next? The model answers by calling a function the code offered. - Say this another way. The model turns one form into another: a transcript into a debrief, a debrief into a title, a request into a query. A translation or a projection, not a conversation.",
    "There is no long history. Each prompt stands alone, built for that state, as small as it can be. That is what makes it cheap enough for an on-device model with a few thousand tokens of context, and it is what makes it inspectable: for any decision the model made, the whole of what it was shown fits on one screen.",
    "- Control. The model can only do what the functions offered at that state allow. A tool that is not offered does not exist for it. - Debugging. A one-prompt decision can be replayed. A decision buried in a long conversation cannot. - Size. Small models are good at small, literal tasks and poor at long ones. This asks them only for the first kind. - Privacy. What leaves the code for the model is chosen each time, and can be shown each time."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/articles/two-decision-engines/index.html",
   "source": "A position. From the owner's voice memo of 13 November 2026, written up by the agent."
  },
  {
   "id": "article-voice-everywhere",
   "kind": "article",
   "app": "Both",
   "title": "Voice everywhere",
   "status": "proposed",
   "why": "An article: a position or a brief. Nothing in it is built unless the reality file says so.",
   "summary": "Losing a voice memo is the worst thing this app can do. A person who spoke for ten minutes while walking will not say it again the same way. Everything else can fail and be retried: the transcript, the debrief, the vault, the lane. The recording cannot.",
   "detail": [
    "An idea. From the owner's voice memos of 13 November 2026, written up by the agent.",
    "Losing a voice memo is the worst thing this app can do. A person who spoke for ten minutes while walking will not say it again the same way. Everything else can fail and be retried: the transcript, the debrief, the vault, the lane. The recording cannot.",
    "This is why the screen shows the words and the level as you speak. It is not decoration. It is the evidence that the recording is being heard and kept, and it is what lets someone trust the app enough to stop checking it.",
    "It is also why the note exists before the first word and why the recording is kept in a form that survives the app dying. See the design, where capture without loss is the first job.",
    "Recording should not be a place you go to. It should be available from wherever you are: one control, on every screen, that starts a voice memo and returns you to what you were doing. The memo then goes where it should: the library, a vault, a lane to someone else.",
    "The workflow that matters most: speaking while driving or walking, hands and eyes elsewhere, and trusting that it was captured; then, later, giving that memo to a particular person or agent.",
    "There is no reason to pick one interface before trying several. One of them might look less like a recorder and more like an assistant that is listening: a single visual that shows it hears you, in the manner of the assistants in films. The lab is where these are compared, on the phone, the tablet and the laptop."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/articles/voice-everywhere/index.html",
   "source": "An idea. From the owner's voice memos of 13 November 2026, written up by the agent."
  },
  {
   "id": "article-where-each-key-lives",
   "kind": "article",
   "app": "Both",
   "title": "Where each key lives",
   "status": "proposed",
   "why": "An article: a position or a brief. Nothing in it is built unless the reality file says so.",
   "summary": "A passkey, behind Face ID, proves it is you. iCloud Keychain carries your secrets to your other devices, encrypted so that Apple cannot read them. Vaults hold the data, encrypted and version controlled, on a store that sees only ciphertext. Put together: sign in to the same Apple account on a new device, authenticate, the vault keys arrive, the app pulls the vaults, and the same files are there....",
   "detail": [
    "A position and a brief. From the owner's voice memos of 13 November 2026, written up by the agent. Decided by the owner the same day. None of it is built unless what is built says so.",
    "A passkey, behind Face ID, proves it is you. iCloud Keychain carries your secrets to your other devices, encrypted so that Apple cannot read them. Vaults hold the data, encrypted and version controlled, on a store that sees only ciphertext. Put together: sign in to the same Apple account on a new device, authenticate, the vault keys arrive, the app pulls the vaults, and the same files are there. The vault provides the synchronisation, and when two devices write at once it behaves as git does: the first wins, the second pulls, merges and pushes.",
    "| Key | What it is for | Must it travel? | Where it lives | |---|---|---|---| | Vault keys, server tokens | Open and write vaults | Yes | iCloud Keychain, synchronised. On by default (owner's decision), with a switch to keep them on this device only | | The user's key pair | Who you are: signs as you, lets others encrypt to you | Yes | iCloud Keychain to begin with; the master vault, opened by the passkey, when that is built. Never the Secure Enclave, which cannot let a key out and cannot hold an RSA key | | The device's key pair | Which device, or which install of the app, did this | Never | The Secure Enclave of that device where it can be, otherwise the Keychain marked for this device only. Meant to be lost with the device or the app | | Public halves | Checking the above | Freely | In the vault beside the data. The user's also in a register such as pki.sgit.ai |",
    "Two details that follow:",
    "- A synchronised Keychain item cannot also demand Face ID. That protection exists only for items that stay on one device. It is the main reason the passkey and master vault remain the end state: the passkey is behind Face ID every time, and the keys sit inside a vault rather than loose in the Keychain. - Keychain items survive deleting an app. For the device key to die with the app, the app has to wipe it the first time it runs after a reinstall.",
    "Every commit is already signed by a device key whose public half is in the vault. What is missing is anything that says whose device it is. The addition is a short statement in the vault, signed by the user's key: this device key is mine, from this date, for these uses. A reader then checks two things: the device signed the commit, and the person vouched for the device. Losing a device means withdrawing one statement and nothing else.",
    "The app must work with no register at all. As an option, the owner can connect it to the identity he already has at pki.sgit.ai, where his key pair is kept behind a passkey."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/articles/where-each-key-lives/index.html",
   "source": "A position and a brief. From the owner's voice memos of 13 November 2026, written up by the agent. Decided by the owner the same day. None of it is built unless..."
  },
  {
   "id": "design.sgit.app.secrets.a.team.with.no.admin.and.no.account",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "A team with no admin and no account",
   "status": "proposed",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as proposed.",
   "summary": "five people swap cards and confirm each other, then share a vault, with no sign-up, invoice or IT person.",
   "detail": [
    "five people swap cards and confirm each other, then share a vault, with no sign-up, invoice or IT person."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.sharing.a.server.cannot.redirect",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "Sharing a server cannot redirect",
   "status": "proposed",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as proposed.",
   "summary": "the key a secret is sealed to comes from a card confirmed in person, never from the server, which shuts out the key-swapping attacks found in other managers in 2026.",
   "detail": [
    "the key a secret is sealed to comes from a card confirmed in person, never from the server, which shuts out the key-swapping attacks found in other managers in 2026."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.one.secret.for.one.agent",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "One secret for one agent",
   "status": "proposed",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as proposed.",
   "summary": "give an AI session exactly one API key, sealed to its key, with a record of when and to whom.",
   "detail": [
    "give an AI session exactly one API key, sealed to its key, with a record of when and to whom."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.signed.history.of.every.secret",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "Signed history of every secret",
   "status": "proposed",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as proposed.",
   "summary": "who changed the router password and when, signed by their device, with the earlier version one tap away.",
   "detail": [
    "who changed the router password and when, signed by their device, with the earlier version one tap away."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.ask.someone.outside.the.team.for.a.secret",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "Ask someone outside the team for a secret",
   "status": "proposed",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as proposed.",
   "summary": "a contractor drops the Wi-Fi or a server key into your inbox; they get no way to read anything back.",
   "detail": [
    "a contractor drops the Wi-Fi or a server key into your inbox; they get no way to read anything back."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.rotation.on.a.branch",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "Rotation on a branch",
   "status": "proposed",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as proposed.",
   "summary": "change a key, test it, then merge, so the team is never half on the old one and half on the new.",
   "detail": [
    "change a key, test it, then merge, so the team is never half on the old one and half on the new."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.recovery.through.people.you.trust",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "Recovery through people you trust",
   "status": "proposed",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as proposed.",
   "summary": "lose every device and get back in with three of five people each holding a sealed part; no company reset.",
   "detail": [
    "lose every device and get back in with three of five people each holding a sealed part; no company reset."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.leaving.someone.out.honestly",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "Leaving someone out, honestly",
   "status": "proposed",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as proposed.",
   "summary": "removing a member makes a new vault key and shows the checklist of secrets they saw, with a change action for each.",
   "detail": [
    "removing a member makes a new vault key and shows the checklist of secrets they saw, with a change action for each."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.a.spotted.secret",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "A spotted secret",
   "status": "proposed",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as proposed.",
   "summary": "Apple's on-device model notices a key pasted into a note or a file and offers to move it into a secret.",
   "detail": [
    "Apple's on-device model notices a key pasted into a note or a file and offers to move it into a secret."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.a.history.that.does.not.show.the.secret",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "A history that does not show the secret",
   "status": "proposed",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as proposed.",
   "summary": "someone with a read key on the history sees who changed which entry and when, and which fields, without ever seeing a value.",
   "detail": [
    "someone with a read key on the history sees who changed which entry and when, and which fields, without ever seeing a value."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.where.each.secret.came.from",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "Where each secret came from",
   "status": "proposed",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as proposed.",
   "summary": "every entry says who gave it to you and through which confirmed card, so a secret of unknown origin stands out.",
   "detail": [
    "every entry says who gave it to you and through which confirmed card, so a secret of unknown origin stands out."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.proof.you.can.check.without.the.app",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "Proof you can check without the app",
   "status": "proposed",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as proposed.",
   "summary": "the open sgit command on any computer clones the vault and checks every signature; nothing rests on trusting this app or its maker.",
   "detail": [
    "the open sgit command on any computer clones the vault and checks every signature; nothing rests on trusting this app or its maker."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.a.lost.phone.in.one.screen",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "A lost phone, in one screen",
   "status": "proposed",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as proposed.",
   "summary": "which secrets that device held, one action to stop trusting its key, and the checklist of what to change.",
   "detail": [
    "which secrets that device held, one action to stop trusting its key, and the checklist of what to change."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.break.glass.with.time.to.say.no",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "Break glass, with time to say no",
   "status": "proposed",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as proposed.",
   "summary": "a trusted person asks for a sealed secret through your inbox; it opens for them only if you have not refused within a set number of hours.",
   "detail": [
    "a trusted person asks for a sealed secret through your inbox; it opens for them only if you have not refused within a set number of hours."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.a.machine.that.hands.in.new.keys",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "A machine that hands in new keys",
   "status": "proposed",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as proposed.",
   "summary": "a server or CI job changes its own credential and drops the new one into your inbox; it can write there, never read the vault.",
   "detail": [
    "a server or CI job changes its own credential and drops the new one into your inbox; it can write there, never read the vault."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.works.on.a.plane",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "Works on a plane",
   "status": "proposed",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as proposed.",
   "summary": "every secret is in a vault on the device; reading, adding and changing need no network, and sync happens when there is one.",
   "detail": [
    "every secret is in a vault on the device; reading, adding and changing need no network, and sync happens when there is one."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.a.share.with.an.end.date",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "A share with an end date",
   "status": "proposed",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as proposed.",
   "summary": "one entry sealed to one card, with a date after which the app reminds you to change it, because a copy given cannot be taken back.",
   "detail": [
    "one entry sealed to one card, with a date after which the app reminds you to change it, because a copy given cannot be taken back."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.the.trust.map",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "The trust map",
   "status": "built-untried",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as built, not yet proven.",
   "summary": "a drawing of the people you have met, with their photos, solid where both confirmed and dashed where one side only.",
   "detail": [
    "a drawing of the people you have met, with their photos, solid where both confirmed and dashed where one side only."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.the.same.vaults.on.every.device",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "The same vaults on every device",
   "status": "built-untried",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as built, not yet proven.",
   "summary": "vault keys in iCloud Keychain, one item each, so an iPhone, iPad and Mac open the same vaults with nothing to set up.",
   "detail": [
    "vault keys in iCloud Keychain, one item each, so an iPhone, iPad and Mac open the same vaults with nothing to set up."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.secrets.as.files.in.vaults",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "Secrets as files in vaults",
   "status": "built-untried",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as built, not yet proven.",
   "summary": "each entry one encrypted JSON file, behind Face ID, with a strong-password maker.",
   "detail": [
    "each entry one encrypted JSON file, behind Face ID, with a strong-password maker."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "design.sgit.app.secrets.questions.for.the.owner.by.voice",
   "kind": "design",
   "app": "SGit Vaults",
   "title": "Questions for the owner, by voice",
   "status": "built-untried",
   "why": "Listed on the design page \"A secrets manager made of people and vaults\" as built, not yet proven.",
   "summary": "the people building the app ask, and the owner answers by choosing, typing or speaking.",
   "detail": [
    "the people building the app ask, and the owner answers by choosing, typing or speaking."
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/secrets/index.html",
   "source": "A secrets manager made of people and vaults"
  },
  {
   "id": "feature.the.app.skeleton",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The app skeleton",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "Apps/VoiceDebrief/: a universal iPhone and iPad target, iOS 26.0, SwiftUI, bundle ai.voicedebrief.app",
   "detail": [
    "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"
   ],
   "places": [
    "The repository: CI"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.capture.without.loss",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Capture without loss",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Engine/NoteStore.swift, VoiceRecorder.swift, Model/WAVRepair.swift, Engine/AudioCompressor.swift: a note is written to the library when recording starts; the recording goes straight into the note's folder as 16 kHz WAV; a recording that was never closed has its header repaired when the library next opens; an interruption (a call, another app) ends the recording and keeps it; the WAV is replaced by...",
   "detail": [
    "Engine/NoteStore.swift, VoiceRecorder.swift, Model/WAVRepair.swift, Engine/AudioCompressor.swift: a note is written to the library when recording starts; the recording goes straight into the note's folder as 16 kHz WAV; a recording that was never closed has its header repaired when the library next opens; an interruption (a call, another app) ends the recording and keeps it; the WAV is replaced by a small .m4a only after the note is finished and the copy reads back at the same length",
    "Unit tests: the note exists before the audio, a cut-off WAV is repaired on reopen, the repair's arithmetic, the compressed copy taking the recording's place. On 13 November 2026, build 0.1.7 (12): two notes of 76 and 67 seconds, one of them on an iPad, were recorded, processed, compressed (about 4.4 KB a second) and sent over the lane with their hashes intact. The ordinary path works. The crash, the interruption and the locked screen have not been tried"
   ],
   "places": [
    "Library tab"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.library.on.the.device",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Library on the device",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/LibraryView.swift, NoteDetailView.swift: notes by day, newest first; a note reopened, run again in the language chosen now, or deleted from the device",
   "detail": [
    "UI/LibraryView.swift, NoteDetailView.swift: notes by day, newest first; a note reopened, run again in the language chosen now, or deleted from the device",
    "Unit tests: the store survives a reopen, titles, states and grouping. Notes made in build 0.1.7 on two devices were kept and opened; reopening after a restart, running again and deleting have not been reported"
   ],
   "places": [
    "Library, then a note",
    "Library tab"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.shell",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The shell",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/RootView.swift, RecordView.swift, SettingsView.swift: four tabs that become a sidebar on wide screens; one large record control pinned at the bottom; stopping opens the note, which fills in; diagnostics, the lane and the engine's log under Settings",
   "detail": [
    "UI/RootView.swift, RecordView.swift, SettingsView.swift: four tabs that become a sidebar on wide screens; one large record control pinned at the bottom; stopping opens the note, which fills in; diagnostics, the lane and the engine's log under Settings",
    "Used by the owner on two devices in build 0.1.7, who liked the flow and found one fault: the record screen did not follow the live words once they passed the bottom. It now scrolls with them (not yet confirmed)"
   ],
   "places": [
    "Record tab",
    "Settings: Diagnostics",
    "Settings tab"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.record.or.open.a.voice.note",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Record or open a voice note",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Engine/VoiceRecorder.swift, DebriefView: record to a temporary .m4a, or choose an audio file. .m4a, .mp3 and .wav; not WhatsApp's Ogg Opus",
   "detail": [
    "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"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.transcript.on.the.device",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Transcript on the device",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "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",
   "detail": [
    "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"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.debrief.on.the.device",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Debrief on the device",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "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",
   "detail": [
    "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"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.live.text.and.a.level.display.while.recording",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Live text and a level display while recording",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "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",
   "detail": [
    "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. The owner has recorded with it on a Mac in build 0.1.5 and called the new flow improved; In build 0.1.7 the owner saw the words appear, grey while unsettled and black once settled. If it cannot start the recording carries on and says why"
   ],
   "places": [
    "The repository: CI"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.send.a.note.to.the.developer",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Send a note to the developer",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "Engine/DeveloperLane.swift, LaneCrypto.swift (copied from PrompTugal__App__iOS; now in Packages/SGitPeople): 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...",
   "detail": [
    "Engine/DeveloperLane.swift, LaneCrypto.swift (copied from PrompTugal__App__iOS; now in Packages/SGitPeople): 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. First note sent and received, 13 November 2026, build 0.1.5 (10) on a Mac: the audio (187 KB, one part, hash intact) and the run arrived, were decrypted by the developer session and matched what the app showed"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.a.send.tries.again.and.says.it.went",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "A send tries again, and says it went",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Engine/NetworkWatch.swift (the system's NWPathMonitor, no polling; SendRetry), DebriefSession.sendNow, UI/SendProgressCard.swift: a send that fails is tried five times in all, 10 s, 30 s, 1 min and 2 min apart, and at once when iOS reports the network is back; the card says \"No connection, trying again in ... (try n of 5)\" with Try now; after the fifth it says so with Send again, and the note goes...",
   "detail": [
    "Engine/NetworkWatch.swift (the system's NWPathMonitor, no polling; SendRetry), DebriefSession.sendNow, UI/SendProgressCard.swift: a send that fails is tried five times in all, 10 s, 30 s, 1 min and 2 min apart, and at once when iOS reports the network is back; the card says \"No connection, trying again in ... (try n of 5)\" with Try now; after the fifth it says so with Send again, and the note goes again the next time the network comes back or the app opens. Once sent, a large green \"Sent to ... at ...\" with a success tap",
    "Unit test: the schedule. Not run on a device"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.send.a.picture",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Send a picture",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Engine/PictureSender.swift, UI/PictureSheet.swift, DeveloperLane.imageMessages: on the record screen, \"Paste screenshot\" (the clipboard) and \"Choose picture\" (Photos) open a sheet with the picture, a line to go with it and who it is for (the chosen contact, else Claude (developer)); Send encrypts it to their key and sends it over their lane as voicedebrief/image/v1 (a JPEG at most 2048 px, in...",
   "detail": [
    "Engine/PictureSender.swift, UI/PictureSheet.swift, DeveloperLane.imageMessages: on the record screen, \"Paste screenshot\" (the clipboard) and \"Choose picture\" (Photos) open a sheet with the picture, a line to go with it and who it is for (the chosen contact, else Claude (developer)); Send encrypts it to their key and sends it over their lane as voicedebrief/image/v1 (a JPEG at most 2048 px, in parts) and voicedebrief/text/v1, with the same five tries. Not kept in the library",
    "Unit tests: the messages, parts and text. Not run on a device"
   ],
   "places": [
    "Library tab",
    "Record tab"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.claude.s.replies.in.the.app",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Claude's replies in the app",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "MessagesToClaudeView in UI/TalkButton.swift, a bubbles button on the record screen's bar (a dot when there are replies): under each note sent to Claude, the replies that name it (replyTo = the note's id), and a \"From Claude\" section for the rest; read from agents/agents.json in the vault given to Claude on the Agents screen (AgentsDesk), pulled on open and on pull-down. The conductor writes them...",
   "detail": [
    "MessagesToClaudeView in UI/TalkButton.swift, a bubbles button on the record screen's bar (a dot when there are replies): under each note sent to Claude, the replies that name it (replyTo = the note's id), and a \"From Claude\" section for the rest; read from agents/agents.json in the vault given to Claude on the Agents screen (AgentsDesk), pulled on open and on pull-down. The conductor writes them with tools/conductor and sgit; nothing is shown without that vault",
    "Not tested; not run on a device"
   ],
   "places": [
    "Record tab",
    "The repository: tools/conductor"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.workbench.in.the.app",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The workbench in the app",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/WebVaultView.swift (copied from the sgit app's, same embed protocol, dev.vault.sgraph.ai), \"Open the workbench\" on the Agents screen: the shared Agents vault opened in the web Vault inside the app, its page (chat, how we work, mock-ups) changed by Claude without an app build; Allow changes hands the page this device's access key for the visit, so the owner's chat messages are written into the...",
   "detail": [
    "UI/WebVaultView.swift (copied from the sgit app's, same embed protocol, dev.vault.sgraph.ai), \"Open the workbench\" on the Agents screen: the shared Agents vault opened in the web Vault inside the app, its page (chat, how we work, mock-ups) changed by Claude without an app build; Allow changes hands the page this device's access key for the visit, so the owner's chat messages are written into the vault",
    "Not run on a device. The page itself was checked as a standalone file only"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.create.a.vault",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Create a vault",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "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",
   "detail": [
    "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; ios-vault.yml has sgit clone the vault Swift created and verify its signatures; and on 13 November 2026 the owner created a vault from the app on a Mac (build 0.1.5) on dev.send.sgraph.ai, which the app then read back with its signature verified"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.vaults.on.the.device",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Vaults on the device",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Engine/VaultBook.swift, UI/VaultsView.swift: a vault is created, committed to, read and browsed in a folder on the device (Application Support/vaults/<vault id>/bare/…, the layout a server holds), with no server, no token and no network. Vault keys and the commit-signing key are in the Keychain (this device only). Head, files, history, branches; a file decrypted when opened; forget, which deletes...",
   "detail": [
    "Engine/VaultBook.swift, UI/VaultsView.swift: a vault is created, committed to, read and browsed in a folder on the device (Application Support/vaults/<vault id>/bare/…, the layout a server holds), with no server, no token and no network. Vault keys and the commit-signing key are in the Keychain (this device only). Head, files, history, branches; a file decrypted when opened; forget, which deletes the device's copy after a confirmation that says what would be lost; the engine's traffic log",
    "Unit tests on the CI simulators, with an in-memory Keychain, temporary folders and a transport that fails every request: a vault created and a note saved and read back with no token and no network, reopened by a second launch, forgotten. Not yet run on a device"
   ],
   "places": [
    "Vaults tab",
    "The repository: CI"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.servers.as.remotes",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Servers as remotes",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "VaultBook, VaultsView: a list of servers, each a name, an https address and an access token kept in the Keychain apart from the list; https://dev.send.sgraph.ai is offered as the address. A vault on the device has no server or one. A server holding a vault's only copy cannot be removed",
   "detail": [
    "VaultBook, VaultsView: a list of servers, each a name, an https address and an access token kept in the Keychain apart from the list; https://dev.send.sgraph.ai is offered as the address. A vault on the device has no server or one. A server holding a vault's only copy cannot be removed",
    "Unit tests: adding, the token kept and removed, a bad address refused, removal. Not yet run on a device"
   ],
   "places": [
    "Vaults tab"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.push.and.pull",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Push and pull",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Packages/SGitVault/Sources/SGitVault/VaultSync.swift, VaultBook.push, VaultBook.pull: push sends the objects the server's head cannot reach, each checked against its id, in batches of at most 50 objects and 3 MB, then moves the server's current with compare-and-swap (onto a server that does not hold the vault: the ref and the branch index, as creation does). Pull is the same the other way. Only...",
   "detail": [
    "Packages/SGitVault/Sources/SGitVault/VaultSync.swift, VaultBook.push, VaultBook.pull: push sends the objects the server's head cannot reach, each checked against its id, in batches of at most 50 objects and 3 MB, then moves the server's current with compare-and-swap (onto a server that does not hold the vault: the ref and the branch index, as creation does). Pull is the same the other way. Only creation and fast-forward: when the other side is ahead, or both have changed, it says so and writes nothing. Each vault shows one line: on this device only, not yet pushed, on this device and on the server (when), ahead of the server, or push failed with the reason",
    "Unit tests with a folder in the server's place, in the engine and in the app: first push, a later push sending only the new objects, pull into an empty device, pull forward, a device that is behind, both sides changed (neither ref moves, nothing copied), a tampered object refused. ios-vault.yml has sgit clone the vault that was created in one folder and pushed to another, and verify its signatures. Never run against a real server or on a device: the live server took a 3.8 MB object in one batch from curl on 13 November 2026, and that is all that has been tried there"
   ],
   "places": [
    "Vaults tab"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.vaults.from.earlier.builds",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Vaults from earlier builds",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "VaultBook.adoptEarlierBuilds: those vaults exist only on dev.send.sgraph.ai. On first launch the one token becomes that server's token, and each vault stays attached to it, read and written over the network as before, until \"Keep a copy on this device\" pulls it. A vault added by its key starts the same way",
   "detail": [
    "VaultBook.adoptEarlierBuilds: those vaults exist only on dev.send.sgraph.ai. On first launch the one token becomes that server's token, and each vault stays attached to it, read and written over the network as before, until \"Keep a copy on this device\" pulls it. A vault added by its key starts the same way",
    "Unit test: what an earlier build left in the Keychain is adopted, the vault opens, takes a note on its server, and is then copied to the device. Not yet run on a device that holds such a vault"
   ],
   "places": [
    "Vaults tab"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.vault.keys.and.server.tokens.in.icloud.keychain",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Vault keys and server tokens in iCloud Keychain",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Engine/SecretStore.swift (SecretHome, SharedSecrets), VaultBook, the Keys section of UI/VaultsView.swift: each vault's key, each server and each server's token is a Keychain item of its own, kept on this device and, unless the switch is turned off, as a synchronisable item as well, so that iCloud Keychain can carry it to the owner's other devices. On by default. A key that arrives shows its vault...",
   "detail": [
    "Engine/SecretStore.swift (SecretHome, SharedSecrets), VaultBook, the Keys section of UI/VaultsView.swift: each vault's key, each server and each server's token is a Keychain item of its own, kept on this device and, unless the switch is turned off, as a synchronisable item as well, so that iCloud Keychain can carry it to the owner's other devices. On by default. A key that arrives shows its vault as on another device, or on its server, until a copy is kept here. Forgetting a vault on one device removes its key from iCloud Keychain; a device that holds the vault keeps its own copy and does not put the key back. Turning the switch off takes everything onto this device, then removes it from iCloud Keychain. The key that signs a device's commits is never synchronised. What earlier builds kept in one list becomes an item each",
    "Unit tests on the CI simulator with an in-memory Keychain in which two stores share their synchronised items: on by default and the signing key never shared; a vault made on one device appearing on a second, copied there and written from both; two devices adding vaults at once; forgetting on one device; the switch off and on; one device turning it off while another keeps its keys; the earlier lists adopted. Nothing in CI can test iCloud Keychain itself: whether Apple carries these items between two real devices is unconfirmed until the owner sees a vault made on his iPhone appear on his iPad or Mac"
   ],
   "places": [
    "Vaults tab",
    "The repository: CI"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.save.a.debrief.to.a.vault",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Save a debrief to a vault",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "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. Into a vault on the device this needs no network; into a vault that is only on a server it goes straight there, as before",
   "detail": [
    "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. Into a vault on the device this needs no network; into a vault that is only on a server it goes straight there, as before",
    "The file layout and a save into a vault on the device have unit tests. First save, 13 November 2026, build 0.1.5 on a Mac, straight to the live server: 4 files in one signed commit (12 objects, 192.5 KB), pulled back with the signature verified. A save into a vault on the device has not been run on a device"
   ],
   "places": [
    "Vaults tab"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.record.while.a.note.is.written.up",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Record while a note is written up",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "DebriefSession: recording and processing are separate states; a note finished while another is being transcribed or debriefed waits its turn in a queue and says \"Waiting its turn\"; the record control stays green and live",
   "detail": [
    "DebriefSession: recording and processing are separate states; a note finished while another is being transcribed or debriefed waits its turn in a queue and says \"Waiting its turn\"; the record control stays green and live",
    "A unit test of the states; the queue itself has no test that runs the models; not run on a device"
   ],
   "places": [
    "Record tab"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.play.a.recording",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Play a recording",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Engine/NotePlayer.swift, PlayerSection in UI/NoteParts.swift: on every note with audio, including an interrupted one, play and pause, a position slider, the length and the file's size; tapping a transcript line plays from that moment",
   "detail": [
    "Engine/NotePlayer.swift, PlayerSection in UI/NoteParts.swift: on every note with audio, including an interrupted one, play and pause, a position slider, the length and the file's size; tapping a transcript line plays from that moment",
    "Compiles when its run is green; no unit test; not run on a device"
   ],
   "places": [
    "A note: the player"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.a.briefing.on.opening",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "A briefing on opening",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Model/Briefing.swift, a card on the record screen once per launch: an update noticed and linked to its page; new notes since the last opening, interrupted ones, sends, saves and failed saves. Computed by the code, not a model",
   "detail": [
    "Model/Briefing.swift, a card on the record screen once per launch: an update noticed and linked to its page; new notes since the last opening, interrupted ones, sends, saves and failed saves. Computed by the code, not a model",
    "Unit tests: the first opening says nothing, the counts and sentences, an upgrade noticed. Not run on a device"
   ],
   "places": [
    "Record tab",
    "Record tab: the briefing card"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.guide.ideas.what.is.new.feature.guides",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The Guide: ideas, what is new, feature guides",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/Guide/GuideView.swift, IdeasView.swift, WhatsNewView.swift, FeatureGuideView.swift, Model/GuideData.swift; data from website/admin/ideas.mjs, bundled as vd-ideas.json and vd-versions.json: every idea and request (issues, articles, rows of both reality files) with its status (seen working, built untried, in progress, proposed, parked) decided by written rules and the sentence that decided it...",
   "detail": [
    "UI/Guide/GuideView.swift, IdeasView.swift, WhatsNewView.swift, FeatureGuideView.swift, Model/GuideData.swift; data from website/admin/ideas.mjs, bundled as vd-ideas.json and vd-versions.json: every idea and request (issues, articles, rows of both reality files) with its status (seen working, built untried, in progress, proposed, parked) decided by written rules and the sentence that decided it, searchable and filtered by status and app, with where it is in the app and the versions that named it; What is new lists every version newest first and marks those since the person last looked. The same list is the site's ideas page. Eleven feature guides (for VoiceDebrief: record, a note, the library, vaults, sending, the briefing, settings; for SGit Vaults: getting started, inside a vault, sharing, secrets), each a picture of the screen with numbered arrows and what each number is, written in...",
    "Unit tests: the bundled data decodes, every status is known and explained, search, version order, since you last looked, every guide's pictures are in the app. The generator is checked by validate.mjs. Not reachable from the shell until it is given a place in the sidebar; not run on a device"
   ],
   "places": [
    "Library tab",
    "Record tab: the briefing card"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.articles.to.read.in.the.app",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Articles to read in the app",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/Guide/ArticlesView.swift, from vd-articles.json (and sg-articles.json for SGit Vaults, not yet shown there), written by website/admin/ideas.mjs: every article, the journeys and, for SGit Vaults, its design pages, as their own markdown with links to the site and pictures named in their place; searchable; shown block by block",
   "detail": [
    "UI/Guide/ArticlesView.swift, from vd-articles.json (and sg-articles.json for SGit Vaults, not yet shown there), written by website/admin/ideas.mjs: every article, the journeys and, for SGit Vaults, its design pages, as their own markdown with links to the site and pictures named in their place; searchable; shown block by block",
    "Unit tests: the bundled articles decode and parse, and the markdown blocks. Not run on a device"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.release.cards",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Release cards",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "website/admin/cards.mjs, release.mjs, validate.mjs; ReleaseCardView in UI/Guide/WhatsNewView.swift: ASCII boxes at most 72 columns written to website/versions/next/, moved onto the version's page at release with the version and date filled in, carried in vd-versions.json and sg-versions.json, shown in monospace in What is new",
   "detail": [
    "website/admin/cards.mjs, release.mjs, validate.mjs; ReleaseCardView in UI/Guide/WhatsNewView.swift: ASCII boxes at most 72 columns written to website/versions/next/, moved onto the version's page at release with the version and date filled in, carried in vd-versions.json and sg-versions.json, shown in monospace in What is new",
    "The release step was run twice over a copy of the repository: the card moved once, the page took it once. A unit test fills a card. Not yet through a real release; not run on a device"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.a.welcome.on.the.first.launch",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "A welcome on the first launch",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/Guide/WelcomeView.swift: three pages (what the app does, what to try first, where things are), once, never in a sample launch; the modifier welcomeOnFirstLaunch()",
   "detail": [
    "UI/Guide/WelcomeView.swift: three pages (what the app does, what to try first, where things are), once, never in a sample launch; the modifier welcomeOnFirstLaunch()",
    "No test; not shown until the shell attaches the modifier"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.where.the.work.happens",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Where the work happens",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "WorkStatusIcons and WorkLog in UI/NoteParts.swift (two icons in the record screen's bar, a sheet with what each means and what happened; computed by WhereWorkHappens): \"On this device\" (listening, transcribing, writing the debrief) and \"Network\" (sending to a recipient, part by part, encrypted), each green while busy",
   "detail": [
    "WorkStatusIcons and WorkLog in UI/NoteParts.swift (two icons in the record screen's bar, a sheet with what each means and what happened; computed by WhereWorkHappens): \"On this device\" (listening, transcribing, writing the debrief) and \"Network\" (sending to a recipient, part by part, encrypted), each green while busy",
    "Not covered yet: a vault pushed to or pulled from a server, the identity's sign-in with pki.sgit.ai, and Apple's own downloads of a speech model. No test; not run on a device"
   ],
   "places": [
    "Record tab",
    "Settings: Identity",
    "Settings: Recipients"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.finish.by.voice.or.by.a.button.off.the.screen",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Finish by voice or by a button off the screen",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Model/VoiceCommand.swift (\"send this now\", \"send it now\", \"stop recording\" and others, only at the very end of what was said), Engine/RemoteControl.swift (play/pause, pause, stop from headphones, a car, the lock screen)",
   "detail": [
    "Model/VoiceCommand.swift (\"send this now\", \"send it now\", \"stop recording\" and others, only at the very end of what was said), Engine/RemoteControl.swift (play/pause, pause, stop from headphones, a car, the lock screen)",
    "Unit tests for the phrases. The remote buttons are untried and may not reach a recording app"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.talk.to.claude",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Talk to Claude",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/TalkButton.swift: a button on every screen but Record; tap to record, tap (or say the phrase) to send to Claude (developer); hold for Messages to Claude, with each note's state. No replies yet: they need the app's own inbox",
   "detail": [
    "UI/TalkButton.swift: a button on every screen but Record; tap to record, tap (or say the phrase) to send to Claude (developer); hold for Messages to Claude, with each note's state. No replies yet: they need the app's own inbox",
    "No test; not run on a device"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.agents",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Agents",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Model/AgentsReport.swift, Engine/AgentsDesk.swift, UI/AgentsView.swift: a split view (list, then the agent and its conversation); reads agents/agents.json and agents/overview.png from a vault you choose, pulled on opening, on pull-to-refresh and every two minutes; hands that vault's key to Claude (developer) over its lane (voicedebrief/vault-key/v1); sends messages as voicedebrief/agent-message/v1",
   "detail": [
    "Model/AgentsReport.swift, Engine/AgentsDesk.swift, UI/AgentsView.swift: a split view (list, then the agent and its conversation); reads agents/agents.json and agents/overview.png from a vault you choose, pulled on opening, on pull-to-refresh and every two minutes; hands that vault's key to Claude (developer) over its lane (voicedebrief/vault-key/v1); sends messages as voicedebrief/agent-message/v1",
    "A unit test of the report's format. Not run on a device; no report has been written yet"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.every.section.in.plain.sight",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Every section in plain sight",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "RootView: sections grouped (You, Experiments, More) in a sidebar on iPad and Mac, tabs and More on iPhone; the record screen's Explore tiles open each",
   "detail": [
    "RootView: sections grouped (You, Experiments, More) in a sidebar on iPad and Mac, tabs and More on iPhone; the record screen's Explore tiles open each",
    "No test; not run on a device"
   ],
   "places": [
    "Record tab"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.your.activity",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Your activity",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Engine/UsageLog.swift (.tracked(\"screen\") on every section; actions for recording, finishing, tiles, sending the report), UI/ActivityView.swift: last used, screens with counts and time, actions with counts; sent to the developer's lane as voicedebrief/usage/v1 (screen and action ids and times, no content); tools/conductor files it",
   "detail": [
    "Engine/UsageLog.swift (.tracked(\"screen\") on every section; actions for recording, finishing, tiles, sending the report), UI/ActivityView.swift: last used, screens with counts and time, actions with counts; sent to the developer's lane as voicedebrief/usage/v1 (screen and action ids and times, no content); tools/conductor files it",
    "No test; not run on a device"
   ],
   "places": [
    "The repository: tools/conductor"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.a.note.s.journey.after.finish",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "A note's journey after Finish",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/SendProgressCard.swift: recorded, written up, encrypted and sent (with the part being sent), what goes, a failure if any; clears itself six seconds after the note has gone; Do not send until sending starts",
   "detail": [
    "UI/SendProgressCard.swift: recorded, written up, encrypted and sent (with the part being sent), what goes, a failure if any; clears itself six seconds after the note has gone; Do not send until sending starts",
    "No test; not run on a device"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.record.a.note.for.someone",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Record a note for someone",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "RecordView: chips above the record control (Just me, each recipient, Add), remembered; finishing a recording made for someone sends it when it is written up and stays on the record screen",
   "detail": [
    "RecordView: chips above the record control (Just me, each recipient, Add), remembered; finishing a recording made for someone sends it when it is written up and stays on the record screen",
    "No test; not run on a device"
   ],
   "places": [
    "Record tab",
    "Settings: Recipients"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.a.send.that.is.not.lost",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "A send that is not lost",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Note.pendingSend and sendProblem on disk; DebriefSession resumes waiting sends at launch and when a note is ready; the record screen's card has Do not send; rows say waiting, not sent, or sent with the time; the briefing says what could not be sent; a recipient already sent to asks before sending again",
   "detail": [
    "Note.pendingSend and sendProblem on disk; DebriefSession resumes waiting sends at launch and when a note is ready; the record screen's card has Do not send; rows say waiting, not sent, or sent with the time; the briefing says what could not be sent; a recipient already sent to asks before sending again",
    "Unit tests: a waiting send kept and cleared, a failure kept, the briefing line. Not run on a device"
   ],
   "places": [
    "Record tab",
    "Record tab: the briefing card",
    "Settings: Recipients"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.finish.and.send.in.one.press",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Finish and send in one press",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "RecordView (while recording, \"Finish and send to\" each of the person's own recipients), DebriefSession.share (an outbox: sends go one at a time, in order), NoteStore.recordSend and Note.sends (who and when, shown on the note and in its row)",
   "detail": [
    "RecordView (while recording, \"Finish and send to\" each of the person's own recipients), DebriefSession.share (an outbox: sends go one at a time, in order), NoteStore.recordSend and Note.sends (who and when, shown on the note and in its row)",
    "A unit test that a send is remembered and survives a reopen; the outbox has no test; not run on a device"
   ],
   "places": [
    "Record tab",
    "Settings: Recipients"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.send.without.waiting",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Send without waiting",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/RecipientsView.swift (SendBar), DebriefSession.send: on a note, one Send button per recipient in a bar fixed at the bottom of the screen; pressed before the note is finished, the note is sent the moment it is (after the audio is compressed), and that can be cancelled",
   "detail": [
    "UI/RecipientsView.swift (SendBar), DebriefSession.send: on a note, one Send button per recipient in a bar fixed at the bottom of the screen; pressed before the note is finished, the note is sent the moment it is (after the audio is compressed), and that can be cancelled",
    "Compiles in CI when its run is green; no unit test of the queue; not run on a device"
   ],
   "places": [
    "A note: the send bar",
    "Library, then a note",
    "Settings: Recipients"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.lab.experiment.l01.one.prompt.tools.on.and.off",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The Lab, experiment L01: one prompt, tools on and off",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/LabView.swift, Engine/LabModelDoor.swift, LabToolbox.swift, Model/LabRun.swift, reached from Settings: one request to Apple's on-device model in a new session, with the tools that are switched on, and the whole record shown (instructions, prompt, tools offered and kept back, each tool call with arguments, result and time, the answer, the total time, any error in plain words). Four tools that...",
   "detail": [
    "UI/LabView.swift, Engine/LabModelDoor.swift, LabToolbox.swift, Model/LabRun.swift, reached from Settings: one request to Apple's on-device model in a new session, with the tools that are switched on, and the whole record shown (instructions, prompt, tools offered and kept back, each tool call with arguments, result and time, the answer, the total time, any error in plain words). Four tools that only read: date and time, list the notes, read one note's transcript, choose the next screen (recorded, not acted on). Six preset prompts, each naming the tools a reliable model would call, and a count of how often it did. Runs are kept while the app is open and exported as JSON, which includes any words of notes a tool returned",
    "Unit tests: the tools' logic against a library in a temporary folder, the run's JSON, the screen choice, the judgement of tool choice and its count. Compiles against the iOS 26.5 SDK (Xcode 26.6). No request has been made: CI's simulators have no model. Whether the model calls tools at all, how the empty-argument tool and the fixed list of screen names behave, and what the errors look like are unknown until it runs on a device"
   ],
   "places": [
    "Settings: Experiments, the Lab",
    "The repository: CI"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.model.door.first.slice",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The model door, first slice",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "ModelDoor in Engine/LabModelDoor.swift: the one place the Lab's requests to the model are made, with a policy (which tools this request is offered) and a record (prompt, tool calls, answer, timings, the session's transcript). Only the Lab uses it (L01 and L02, each with its own set of tools); the debrief pipeline does not. Not a security boundary: one process, a way to organise and to see",
   "detail": [
    "ModelDoor in Engine/LabModelDoor.swift: the one place the Lab's requests to the model are made, with a policy (which tools this request is offered) and a record (prompt, tool calls, answer, timings, the session's transcript). Only the Lab uses it (L01 and L02, each with its own set of tools); the debrief pipeline does not. Not a security boundary: one process, a way to organise and to see",
    "Unit tests: the policy offers only what it names, the recorder keeps calls in order, errors are sorted into plain words. The request itself is untested, as above"
   ],
   "places": [
    "Settings: Experiments, the Lab"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.lab.experiment.l03.a.game.played.by.voice",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The Lab, experiment L03: a game played by voice",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Sources/Game/ (GameWorld, GameRules, GameLevels, GamePhrases, GameTools, GameModelEngine, GameController, GameHints, GameLog, GameBoardView, GamePlayView), reached from Settings, Lab, L03: Play (issue 300). Two games on the same primitives, Boxes (top-down, three levels) and Lantern (side view with gravity, ladders and jumps, three levels), with gold, keys, doors, traps, lives, a move budget...",
   "detail": [
    "Sources/Game/ (GameWorld, GameRules, GameLevels, GamePhrases, GameTools, GameModelEngine, GameController, GameHints, GameLog, GameBoardView, GamePlayView), reached from Settings, Lab, L03: Play (issue 300). Two games on the same primitives, Boxes (top-down, three levels) and Lantern (side view with gravity, ladders and jumps, three levels), with gold, keys, doors, traps, lives, a move budget, points and levels. A sentence (heard through the live words, typed) goes to the phrases, then, if they find nothing, to Apple's on-device model in a fresh session with only the tools this state allows, each described for the moment; the first tool call ends the request and is checked against the tools offered, then applied by the rules in code. The phrases can act on live words before they settle. While listening, a strip under the board shows the sentence being heard (settled, then unsettled in...",
    "Unit tests: every level parses and is won within its budget by a breadth-first planner over the rules without losing a life; the rules of both games; the tools offered per state and the check of a tool call; the phrases; the hidden things; the clue levels and the check of a model's clue; the voice player's script winning both games through the phrases, with and without its mistakes; listening refused while a note records; the estimates; a typed command through the controller and its JSON log. Never played on a device and never put to a model: whether the model calls the right tool, and how fast, is what the game is for"
   ],
   "places": [],
   "issues": [
    "300"
   ],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": [
    "v0.1.80"
   ]
  },
  {
   "id": "feature.the.lab.experiment.l02.the.control.centre",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The Lab, experiment L02: the control centre",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/LabControlView.swift, Engine/LabControlCentre.swift, Model/LabControl.swift, reached from Settings, Lab: a sentence comes in (heard through the live words, typed, or one of sixteen test sentences) and two engines each say which of eight actions it asks for, or none: a list of fixed phrases that can be seen and changed and is kept on the device, and Apple's on-device model, asked one sentence at...",
   "detail": [
    "UI/LabControlView.swift, Engine/LabControlCentre.swift, Model/LabControl.swift, reached from Settings, Lab: a sentence comes in (heard through the live words, typed, or one of sixteen test sentences) and two engines each say which of eight actions it asks for, or none: a list of fixed phrases that can be seen and changed and is kept on the device, and Apple's on-device model, asked one sentence at a time through the model door with one tool for each action. While it listens, a strip at the top shows the words as they are heard, those that may still change in grey. Every sentence, whether or not it led to an action, is a numbered card that follows it from the words to the action (heard, what the phrases made of it, what the model made of it and how long it took, what was proposed, what happened), with its state (asking, waiting for you, done, not this, no action) and Do it, Not this and...",
    "Unit tests: the phrases (arguments, refusals, the longest phrase), the states and what each button does, the judging and the tally, the phrase list and the automatic marks kept across a reopen, the test sentences through the phrases alone (11 of 16 right), the log's JSON; that nothing is opened before Do it, that it is opened once, what an unconnected shell or an unknown section says, and the search against a library in a temporary folder; that recording for someone cannot be made automatic, starts once, and shows the app's own refusal. No sentence has been put to a model, and listening has not been tried on a device: L01, which would show whether the model calls tools at all, has not been reported back either"
   ],
   "places": [
    "Settings: Experiments, the Lab"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.lab.experiment.l04.live.labels",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The Lab, experiment L04: live labels",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/LabLabelsView.swift, Engine/LabLabelsDesk.swift, Model/LabLabels.swift, reached from Lab: while you speak (the live words, or sentences typed in), Apple's on-device model is asked every 3, 5 or 10 seconds to fill in a small set of labels from a window of the words so far (the last 250, 500 or 1,000 tokens or so, or everything), in a new session each time, with one tool for each label: who it is...",
   "detail": [
    "UI/LabLabelsView.swift, Engine/LabLabelsDesk.swift, Model/LabLabels.swift, reached from Lab: while you speak (the live words, or sentences typed in), Apple's on-device model is asked every 3, 5 or 10 seconds to fill in a small set of labels from a window of the words so far (the last 250, 500 or 1,000 tokens or so, or everything), in a new session each time, with one tool for each label: who it is for, topic, title, urgency always, and kind, next action, people mentioned and project from a list of switches on the screen. The labels are a grid of chips that update as each loop returns; the one naming a person is matched to a contact or to an agent in the last agents report and shows their avatar, and only when the words mean exactly one of them. The code owns the labels: a label you set by saying so (this is a memo for, the topic is, the title is, this is urgent) or by tapping it is...",
    "Unit tests: matching a name to one contact and refusing to guess between two, the board (tidying, choices, pins, handing a label back), the spoken phrases, the window, the prompt, a loop's outcomes and notice, an answer that arrives after a label was pinned, the choices kept across a reopen, the log's JSON. No loop has been run against a model: the timings the experiment exists to measure are unknown. Tokens are counted as four characters each, which is a rule of thumb, because the token counter in Apple's framework is not known to exist in the iOS 26.5 SDK that CI builds with. Listening uses the same rules as L02 and has not been tried on a device"
   ],
   "places": [
    "Record tab",
    "The repository: CI"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.recipients.added.by.qr.code",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Recipients, added by QR code",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Model/Recipient.swift, Engine/RecipientStore.swift, Engine/QRCode.swift, UI/RecipientsView.swift: a recipient is a name and an sgi1. lane link, kept in a file on the device. Add one by scanning a QR code with the camera (VisionKit), choosing a picture of one, or pasting the link; the code may carry the name after a #. A note has a Send button for each. A recipient's QR code can be shown. The...",
   "detail": [
    "Model/Recipient.swift, Engine/RecipientStore.swift, Engine/QRCode.swift, UI/RecipientsView.swift: a recipient is a name and an sgi1. lane link, kept in a file on the device. Add one by scanning a QR code with the camera (VisionKit), choosing a picture of one, or pasting the link; the code may carry the name after a #. A note has a Send button for each. A recipient's QR code can be shown. The built-in developer lane is the first recipient",
    "Unit tests: the link and name read from text, written and read back, renaming, the store, and a QR code drawn and read back. The camera and the screens have not run on a device"
   ],
   "places": [
    "Settings: Recipients"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.people.layer.in.python.people.py",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The people layer in Python, people.py",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "tools/people/people.py: cards, sealed and signed messages, the inbox and the first contact in the same formats as SGitPeople, so that an agent can be a contact; keys and tokens in a folder outside the repository",
   "detail": [
    "tools/people/people.py: cards, sealed and signed messages, the inbox and the first contact in the same formats as SGitPeople, so that an agent can be a contact; keys and tokens in a folder outside the repository",
    "Reads and writes pki.sgit.ai's messages: checked both ways against its message.js (lib v0.2.28), inner signature and envelope. Run on 14 November 2026 against dev.send.sgraph.ai from a cloud session, in pki.sgit.ai's message form: an inviter with an inbox, a newcomer with none; the access key sealed to the newcomer's card; the newcomer accepted, made an inbox on a new vault and sent the full card, which the inviter's check opened as from a contact and took the inbox from; then a text and a reply to a note, each opened as from a contact. Both vaults destroyed afterwards. pki-agent.mjs itself was not run (not permitted in that session); it is built from the same message.js. The access key it carried was a placeholder: the session's proxy adds the real one to every request"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.a.conductor.s.inbox",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "A conductor's inbox",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "tools/conductor/conductor.py: for whoever receives notes. setup makes an RSA key pair, an sgit vault and an append lane; link and qr give what a sender needs; drain fetches, decrypts and files what arrived. The private key and tokens stay in a folder outside the repository",
   "detail": [
    "tools/conductor/conductor.py: for whoever receives notes. setup makes an RSA key pair, an sgit vault and an append lane; link and qr give what a sender needs; drain fetches, decrypts and files what arrived. The private key and tokens stay in a folder outside the repository",
    "link, qr, selftest and drain were run on 13 November 2026 against the developer session's existing lane: the link's key matched the one built into the app, a message was written and opened. setup has not been run from this script (the lane it was run against was made by hand with the same steps)"
   ],
   "places": [
    "The repository: tools/conductor"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.a.clean.text.with.questions",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "A clean text, with questions",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Model/CleanText.swift, Engine/CleanTextModel.swift, Engine/Cleaner.swift, UI/CleanTextView.swift: an experiment (issue 024). On a note, a button rewrites the transcript as full sentences, a passage at a time, each passage one request to Apple's model with guided generation, which returns the rewrite and up to three phrases it could not follow. The speaker's own words, kept in a file on the device...",
   "detail": [
    "Model/CleanText.swift, Engine/CleanTextModel.swift, Engine/Cleaner.swift, UI/CleanTextView.swift: an experiment (issue 024). On a note, a button rewrites the transcript as full sentences, a passage at a time, each passage one request to Apple's model with guided generation, which returns the rewrite and up to three phrases it could not follow. The speaker's own words, kept in a file on the device and edited under Settings, are given to the model. The changes can be shown word by word; an answer to a question is kept in the note and added to the words. The transcript as heard is not touched",
    "Unit tests: passages, the prompt, the words, the word-by-word comparison, the half-length warning, an old note still opening, the lane message. The model's part has no test and has never run: whether it keeps everything, corrects wrongly, or asks useful questions is what the experiment is for"
   ],
   "places": [
    "A note: Clean text",
    "Library, then a note"
   ],
   "issues": [
    "024"
   ],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.credit.that.counts.down.with.a.simulated.top.up",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Credit that counts down, with a simulated top-up",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Model/Credit.swift, Engine/CreditLedger.swift, Engine/Payments.swift, UI/CreditView.swift: a balance in micro-credits (a millionth of a pound) that starts at £5.00, is charged for just about everything the user does (a transcript by the started minute, a debrief, a clean passage, opening a file, adding a word, creating or adding a vault, each file saved to a vault including a note that saves...",
   "detail": [
    "Model/Credit.swift, Engine/CreditLedger.swift, Engine/Payments.swift, UI/CreditView.swift: a balance in micro-credits (a millionth of a pound) that starts at £5.00, is charged for just about everything the user does (a transcript by the started minute, a debrief, a clean passage, opening a file, adding a word, creating or adding a vault, each file saved to a vault including a note that saves itself, pushing and pulling a vault, adding a server, sending, adding a recipient, opening a note or a vault file to read it, deleting a note, forgetting a vault, removing a server, a recipient or a word: Model/Prices.swift, whole pence), and may go below zero with nothing blocked or held back. An append-only ledger in one file on the device, each entry with the balance after it; a charge can be declined with a reason; a counter in the navigation bar of Record and Library opens the credit screen...",
    "Unit tests: the money format, charging by the started minute, that everything has a price in whole pence, the takings by feature, a new ledger, going below zero, a top-up once per reference, a declined charge, a ledger reopened, a ledger in its first form still opening, an unreadable ledger kept aside, the simulated payment, and that the App Store switch is off. Not yet seen on a device"
   ],
   "places": [
    "The balance in the top bar",
    "Settings: Recipients"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.a.finished.note.saves.itself.to.a.vault",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "A finished note saves itself to a vault",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Engine/AutoSave.swift, a switch and a vault picker in UI/SettingsView.swift: when a note is finished and its audio is in its final form, it is saved into the chosen vault (or the first that can be written to), and the note records where and when, or why not. On by default. The record control is green and finishes the note; Discard is a small word at the top that asks first",
   "detail": [
    "Engine/AutoSave.swift, a switch and a vault picker in UI/SettingsView.swift: when a note is finished and its audio is in its final form, it is saved into the chosen vault (or the first that can be written to), and the note records where and when, or why not. On by default. The record control is green and finishes the note; Discard is a small word at the top that asks first",
    "A unit test for the record kept on the note. The save itself, the switch and the new controls have not run on a device. A failed save is not retried by itself; a note run again is saved again as a second folder"
   ],
   "places": [
    "Record tab",
    "Settings: Save to a vault",
    "Settings tab"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.key.bundle.pkikit",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The key bundle, PKIKit",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "Packages/SGitPeople/Sources/SGitPeople/PKIKit.swift (moved from the app's Engine/ on 14 November 2026, unchanged but made public): one sgit-compatible identity. RSA-OAEP 4096 and ECDSA P-256 generation, the public bundle sgit pki export prints, fingerprints, PKCS#8 out and in, private keys under a passphrase (PBES2, as sgit's key store keeps them), the k1 key code, detached signatures, the...",
   "detail": [
    "Packages/SGitPeople/Sources/SGitPeople/PKIKit.swift (moved from the app's Engine/ on 14 November 2026, unchanged but made public): one sgit-compatible identity. RSA-OAEP 4096 and ECDSA P-256 generation, the public bundle sgit pki export prints, fingerprints, PKCS#8 out and in, private keys under a passphrase (PBES2, as sgit's key store keeps them), the k1 key code, detached signatures, the register's statement form, and the signed envelope",
    "pki-interop.yml, both ways, on keys made in the run: sgit pki imports, verifies, decrypts and signs with what Swift made, and pki.sgit.ai's own keys.js reads it; Swift reads what both made. Unit tests on a simulator, with the public half of one such run as fixtures and the register's real root key"
   ],
   "places": [
    "Settings: Identity"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.people.layer.sgitpeople",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The people layer, SGitPeople",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Packages/SGitPeople/: a package for both apps (Apple SDK and the local SGitVault). ContactCard: a signed card (a pki.sgit.ai statement: name, the sgit key bundle, the inbox) as sgc1. text, a link and a QR code; ContactBook: contacts and how each was met; PeopleMessage: pki.sgit.ai's own message form (pki.sgit.ai/message/v1, signed inside, then sealed in sgit's envelope and signed again), with this...",
   "detail": [
    "Packages/SGitPeople/: a package for both apps (Apple SDK and the local SGitVault). ContactCard: a signed card (a pki.sgit.ai statement: name, the sgit key bundle, the inbox) as sgc1. text, a link and a QR code; ContactBook: contacts and how each was met; PeopleMessage: pki.sgit.ai's own message form (pki.sgit.ai/message/v1, signed inside, then sealed in sgit's envelope and signed again), with this package's kinds added (text, voice-note reference, secret, vault invitation, card) and a reply naming what it answers; pki.sgit.ai's m1. code to hand one over without an inbox, and its k1. key code accepted for a newcomer; LaneClient, InboxCheck, MessageStore, InboxSchedule, InboxMaker: the inbox on an append lane; SecretsStore: secrets in the Keychain (iCloud Keychain by default), each remembering who gave it and who holds which version; FirstContact: the access key sealed to a newcomer's card...",
    "Unit tests (swift test in ios.yml), the lane's answers replayed as recorded from dev.send.sgraph.ai on 14 November 2026; the first contact end to end with a folder for the vault server; a card made by people.py is read. people-interop.yml: pki.sgit.ai's message.js and people.py make keys, messages and a card that Swift opens, and open what Swift seals (not yet run). Not yet against the live server from Swift; never run on a device"
   ],
   "places": [],
   "issues": [
    "200"
   ],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": [
    "v0.1.54"
   ]
  },
  {
   "id": "feature.the.user.s.key.pair",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The user's key pair",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Engine/IdentityBook.swift, IdentityKeychain.swift, UI/IdentityView.swift (Settings, Identity): made when asked for, shown with both fingerprints, the key code as text and as a QR code, the bundle to share; its private halves in iCloud Keychain as a synchronisable item",
   "detail": [
    "Engine/IdentityBook.swift, IdentityKeychain.swift, UI/IdentityView.swift (Settings, Identity): made when asked for, shown with both fingerprints, the key code as text and as a QR code, the bundle to share; its private halves in iCloud Keychain as a synchronisable item",
    "Unit tests over a store in memory: made once, kept in the synchronised home, seen by a second reader of the same store. Nothing here has run on a device, and whether the key reaches a second device through iCloud Keychain is untested"
   ],
   "places": [
    "Settings: Identity"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.device.s.key.pair",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The device's key pair",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Engine/IdentityDeviceKey.swift: a P-256 key made in the Secure Enclave where there is one, otherwise in the Keychain for this device only; removed on the first use after a reinstall (a marker in UserDefaults tells a reinstall from a relaunch); a VaultCommitSigner",
   "detail": [
    "Engine/IdentityDeviceKey.swift: a P-256 key made in the Secure Enclave where there is one, otherwise in the Keychain for this device only; removed on the first use after a reinstall (a marker in UserDefaults tells a reinstall from a relaunch); a VaultCommitSigner",
    "Unit tests with a software key: made once, signs, kept in the device-only home, wiped when the marker is gone. The Secure Enclave path has never run: a simulator has none. It does not yet sign debriefs: VaultBook still signs with its own software key (issue 028)"
   ],
   "places": [
    "Vaults tab",
    "Settings: Identity"
   ],
   "issues": [
    "028"
   ],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.vouching.for.a.device",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Vouching for a device",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Model/IdentityVouch.swift, Engine/IdentityVaultAccess.swift, IdentityVouchRow: a statement in the register's envelope, signed by the user's key, naming the device key, from a date, for commits; written to identity/devices/<device fingerprint>.json in a vault kept on this device, as one commit signed by the device key (no network; pushing it is the vault's own step), read back, checked and shown on...",
   "detail": [
    "Model/IdentityVouch.swift, Engine/IdentityVaultAccess.swift, IdentityVouchRow: a statement in the register's envelope, signed by the user's key, naming the device key, from a date, for commits; written to identity/devices/<device fingerprint>.json in a vault kept on this device, as one commit signed by the device key (no network; pushing it is the vault's own step), read back, checked and shown on the Identity screen as \"this device is vouched for by\" a fingerprint",
    "The statement: pki-interop.yml has keys.js verify one Swift signed, and unit tests refuse a changed or borrowed one. Writing it into a vault has never run, on a device or in a test, and the row is not yet in a vault's own screen (issue 028)"
   ],
   "places": [
    "Settings: Identity"
   ],
   "issues": [
    "028"
   ],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.a.person.in.the.register.optionally",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "A person in the register, optionally",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Model/PKIDelegation.swift, IdentityBook: the app builds a pki.sgit.ai sign-in request for this device's key, opens it in the browser, and takes the answer pasted back in; it checks the nonce, the key, the site, the dates and the issuer's signature, fetching the issuer's public key from pki.sgit.ai by its fingerprint; the register's root is pinned in code. The page pki.sgit.ai returns to is...",
   "detail": [
    "Model/PKIDelegation.swift, IdentityBook: the app builds a pki.sgit.ai sign-in request for this device's key, opens it in the browser, and takes the answer pasted back in; it checks the nonce, the key, the site, the dates and the issuer's signature, fetching the issuer's public key from pki.sgit.ai by its fingerprint; the register's root is pinned in code. The page pki.sgit.ai returns to is identity/return/ on this site",
    "pki-interop.yml: pki.sgit.ai's delegation.js accepts Swift's request and Swift checks a delegation it signed; unit tests refuse seven wrong answers. The round trip with the real site has never been made. The app is not handed the answer by iOS (see below), and it does not walk the register's links: for an issuer other than the pinned root it says the chain was not checked"
   ],
   "places": [
    "Settings: Identity"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.diagnostics",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Diagnostics",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "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",
   "detail": [
    "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"
   ],
   "places": [
    "Settings: Diagnostics"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.about.screen",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The About screen",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "StatusView: what the build holds, what is in test and what does not exist, the version, links",
   "detail": [
    "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"
   ],
   "places": [
    "Settings: What this build does"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.vault.engine",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The vault engine",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "Packages/SGitVault/, copied from PrompTugal__App__iOS (see SOURCE.md there): read and write sgit vaults, key derivation, the passkey door, account unlock",
   "detail": [
    "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"
   ],
   "places": [
    "The repository: CI"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.a.door.on.any.site",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "A door on any site",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "VaultDoor.door(fromSecret:site:): the derivation of door.js with the site constant as a parameter, and VaultDoor.pkiSite",
   "detail": [
    "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"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.build.pipeline",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The build pipeline",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": ".github/workflows/ios.yml: the vault tests, a simulator build, a Release device build, unit tests on iPhone and iPad",
   "detail": [
    ".github/workflows/ios.yml: the vault tests, a simulator build, a Release device build, unit tests on iPhone and iPad",
    "It is the test"
   ],
   "places": [
    "The repository: CI"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.pictures.of.every.screen",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Pictures of every screen",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": ".github/workflows/screens.yml, Apps/VoiceDebrief/UITests/ScreensTests.swift, the scheme VoiceDebriefScreens: one UI test per screen launches the app over sample data and keeps a screenshot; 26 screens, six of them also scrolled to their end and three confirmations taken after a tap, on one iPhone (portrait) and one iPad (landscape) simulator, in light and dark, exported at most 1600 px, with a...",
   "detail": [
    ".github/workflows/screens.yml, Apps/VoiceDebrief/UITests/ScreensTests.swift, the scheme VoiceDebriefScreens: one UI test per screen launches the app over sample data and keeps a screenshot; 26 screens, six of them also scrolled to their end and three confirmations taken after a tap, on one iPhone (portrait) and one iPad (landscape) simulator, in light and dark, exported at most 1600 px, with a contact sheet per set, as the artifact screens-<commit sha>. By hand, and on a push that touches the screens",
    "Run 1 of screens.yml (13 November 2026) produced all 68 pictures of the first 17 screens, and run 4 all 100 of the 25 there are now; both sets were downloaded and read from a Linux container. The run fails if a picture is missing. Five more ids added for the Guide and Play (40 pictures per set): proven when the next run of screens.yml is green"
   ],
   "places": [
    "The repository: pictures of every screen",
    "The repository: CI"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.reviews.from.the.pictures",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Reviews from the pictures",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "website/reviews/: a page per round. Round 3 (14 November 2026) added a fifth user, who sends memos to a colleague, for finish and send, the briefing and where the work happens: fifteen new findings and issues 043 to 045. Round 2 (14 November 2026) put the same four users on new pictures after the fixes and marks each earlier finding fixed, fixed in part or unchanged, with twelve new findings and...",
   "detail": [
    "website/reviews/: a page per round. Round 3 (14 November 2026) added a fifth user, who sends memos to a colleague, for finish and send, the briefing and where the work happens: fifteen new findings and issues 043 to 045. Round 2 (14 November 2026) put the same four users on new pictures after the fixes and marks each earlier finding fixed, fixed in part or unchanged, with twelve new findings and issues 039 to 041. Round 1: what the agent saw to be plainly wrong, then four synthetic users (separate agents, each with a persona, a task and only the pictures that person would see), 21 findings with the session that owns each screen, and issues 029 to 038",
    "Each thing a user reported was checked against the code before it was written down; six were artefacts of the pictures and are marked. A synthetic user reads a picture and guesses what a tap does: the owner on a device is still the test"
   ],
   "places": [
    "Record tab: the briefing card",
    "The repository: pictures of every screen"
   ],
   "issues": [
    "029",
    "030",
    "031",
    "032",
    "033",
    "034",
    "035",
    "036",
    "037",
    "038",
    "039",
    "040",
    "041",
    "043",
    "044",
    "045"
   ],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": [
    "v0.1.29",
    "v0.1.40"
   ]
  },
  {
   "id": "feature.sample.data.for.the.pictures",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Sample data for the pictures",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "App/LaunchOptions.swift, App/LaunchSample.swift, Model/SampleData.swift: in a debug build, -VDSampleData full or empty gives the app invented notes in a temporary folder (finished, transcript only, interrupted, being worked on, being recorded), a vault book in memory with one invented vault that the real engine writes to a folder, and no network; -VDScreen <id> opens a screen directly. The...",
   "detail": [
    "App/LaunchOptions.swift, App/LaunchSample.swift, Model/SampleData.swift: in a debug build, -VDSampleData full or empty gives the app invented notes in a temporary folder (finished, transcript only, interrupted, being worked on, being recorded), a vault book in memory with one invented vault that the real engine writes to a folder, and no network; -VDScreen <id> opens a screen directly. The recipients, the glossary and the credit ledger keep their files in the same temporary folder; settings in UserDefaults are not replaced. Not compiled into a release build. A recording, a transcript and a debrief shown this way are typed-in sample values, not results",
    "Unit tests: no sample data without the argument, a screen only over sample data, every note says it is invented, one note in each state, the sample vault is a real vault in a folder"
   ],
   "places": [
    "The balance in the top bar",
    "Settings: Recipients"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.testflight.upload",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "TestFlight upload",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "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",
   "detail": [
    "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"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.vault.interop",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Vault interop",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": ".github/workflows/ios-vault.yml: Swift writes vaults, sgit-ai clones and verifies them: one committed to, one created, and one created in a folder and then pushed to another; on changes to the write path and weekly",
   "detail": [
    ".github/workflows/ios-vault.yml: Swift writes vaults, sgit-ai clones and verifies them: one committed to, one created, and one created in a folder and then pushed to another; on changes to the write path and weekly",
    "It is the test"
   ],
   "places": [
    "The repository: CI"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.pki.interop",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "PKI interop",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": ".github/workflows/pki-interop.yml, scripts/pki-interop/: sgit pki and pki.sgit.ai's modules (a released version, each file checked against a pinned hash) make keys, signatures, envelopes, a statement and a sign-in; the app's own PKI files, compiled as a tool on a Mac, read them and make their own; sgit and keys.js read those. On changes to those files and weekly",
   "detail": [
    ".github/workflows/pki-interop.yml, scripts/pki-interop/: sgit pki and pki.sgit.ai's modules (a released version, each file checked against a pinned hash) make keys, signatures, envelopes, a statement and a sign-in; the app's own PKI files, compiled as a tool on a Mac, read them and make their own; sgit and keys.js read those. On changes to those files and weekly",
    "It is the test"
   ],
   "places": [
    "The repository: CI"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.visual.identity",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The visual identity",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/Design/ in each app (Tokens.swift: colour, spacing, corners, type; Sections.swift: one title, symbol, colour, picture and line per section; Icons.swift: one symbol per action and state; Components.swift: section icon, card, section header, tile, banner, state pill); the drawings and app icons drawn as code in tools/art/ and rendered into Art/ in each asset catalogue; the tab bar and sidebar...",
   "detail": [
    "UI/Design/ in each app (Tokens.swift: colour, spacing, corners, type; Sections.swift: one title, symbol, colour, picture and line per section; Icons.swift: one symbol per action and state; Components.swift: section icon, card, section header, tile, banner, state pill); the drawings and app icons drawn as code in tools/art/ and rendered into Art/ in each asset catalogue; the tab bar and sidebar read their titles and symbols from RootTab; the record screen's Explore tiles each have a picture, and a banner shows before the first note; SGit Vaults is indigo, with a banner when there are no vaults and illustrated rows for Gallery and Settings. A note's row carries at most one mark (Model/NoteMark.swift, unit-tested): working, failed, degraded or in a vault, as a StatusPill. Avatars (Model/AvatarSeed.swift, unit-tested; UI/Design/Avatar.swift): AvatarView (a photo, or a character generated...",
    "CI compiles it. Not yet seen on a device or in the screens workflow's pictures"
   ],
   "places": [
    "Record tab",
    "Settings: Identity",
    "The repository: CI"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.site",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The site",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "website/: markdown pages, a builder and a gate with no dependencies",
   "detail": [
    "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"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.receiving.a.voice.note.from.the.share.sheet.whatsapp",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Receiving a voice note from the share sheet (WhatsApp)",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": "",
   "detail": [],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.decoding.whatsapp.s.ogg.opus",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Decoding WhatsApp's Ogg Opus",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": "",
   "detail": [],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.recording.with.the.screen.locked.or.the.app.in.the.backgroun",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Recording with the screen locked or the app in the background: the audio background mode is declared",
   "status": "built-untried",
   "why": "The reality file, Not built: unverified: written, not yet proven by a run.",
   "summary": ": never tried",
   "detail": [
    ": never tried"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.saved.and.sent.states.on.a.note.saving.to.a.vault.automatica",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Saved and sent states on a note; saving to a vault automatically; an inbox in the app; the app's own QR code, so a conductor can write back",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": "",
   "detail": [],
   "places": [
    "Library, then a note"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.apple.s.larger.model.on.private.cloud.compute.as.an.option",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Apple's larger model on Private Cloud Compute, as an option",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": ": needs the entitlement from Apple and the iOS 27 SDK. CI does not have it: on 13 November 2026 the runner's newest Xcode was 26.6, with the iOS 26.5 SDK",
   "detail": [
    ": needs the entitlement from Apple and the iOS 27 SDK. CI does not have it: on 13 November 2026 the runner's newest Xcode was 26.6, with the iOS 26.5 SDK"
   ],
   "places": [
    "The repository: CI"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.translation.classification.citations.of.time.in.the.debrief",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Translation, classification, citations of time in the debrief",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": "",
   "detail": [],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.passkey.ceremony.the.account.the.recovery.code",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The passkey ceremony, the account, the recovery code",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": "",
   "detail": [],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.creating.an.account.adding.a.door.merge.audio.over.3.8.mb.in",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Creating an account, adding a door, merge, audio over 3.8 MB in a vault",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": "",
   "detail": [],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.debriefs.signed.by.the.device.key.the.vouching.row.in.a.vaul",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Debriefs signed by the device key; the vouching row in a vault's own screen",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": ": issue 028, for the session that owns VaultBook",
   "detail": [
    ": issue 028, for the session that owns VaultBook"
   ],
   "places": [
    "Vaults tab"
   ],
   "issues": [
    "028"
   ],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.answer.from.pki.sgit.ai.handed.to.the.app.by.ios",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The answer from pki.sgit.ai handed to the app by iOS",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": ": needs an apple-app-site-association file on this site (which names the Apple team id, not in the repository) and the Associated Domains capability on the app id. Until then the answer is pasted in",
   "detail": [
    ": needs an apple-app-site-association file on this site (which names the Apple team id, not in the repository) and the Associated Domains capability on the app id. Until then the answer is pasted in"
   ],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.checking.that.an.issuer.chains.to.the.register.s.root.throug",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Checking that an issuer chains to the register's root through its links; withdrawing a vouching statement; the user's key in a master vault behind a passkey; exporting the identity to sgit's key store from the app",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": "",
   "detail": [],
   "places": [
    "Settings: Identity"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.a.merge.when.a.device.and.its.server.have.both.changed.pushi",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "A merge when a device and its server have both changed; pushing or pulling a branch other than current; several servers for one vault; pushing automatically",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": "",
   "detail": [],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.share.extension.app.intents",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The share extension, App Intents",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": "",
   "detail": [],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.paying.for.credit.through.the.app.store.the.ledger.in.the.us",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "Paying for credit through the App Store; the ledger in the user's vault; anything that stops someone editing their own balance",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": ": see credit. The App Store provider is written and switched off, with no products to sell",
   "detail": [
    ": see credit. The App Store provider is written and switched off, with no products to sell"
   ],
   "places": [
    "The balance in the top bar"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "feature.the.app.store",
   "kind": "feature",
   "app": "VoiceDebrief",
   "title": "The App Store",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": "",
   "detail": [],
   "places": [],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.files.over.4.mb.in.the.vault.engine",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Files over 4 MB in the vault engine",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "Packages/SGitVault: VaultStreamCipher.swift (AES-256-GCM as a stream, so a file is sealed and opened from disk to disk), VaultLargeTransport.swift (sgit's upload in parts and download in ranges), VaultLargeFiles.swift (staging, a commit of staged files, download with every check)",
   "detail": [
    "Packages/SGitVault: VaultStreamCipher.swift (AES-256-GCM as a stream, so a file is sealed and opened from disk to disk), VaultLargeTransport.swift (sgit's upload in parts and download in ranges), VaultLargeFiles.swift (staging, a commit of staged files, download with every check)",
    "LargeFileTests on the CI Mac: the stream cipher byte for byte against CryptoKit; tampered files refused; a failed upload carried on; a lost race. sgit-app.yml: sgit clones a vault Swift wrote with files of 5 and 9 MB and verifies its signatures, and Swift reads a vault sgit wrote. All of that is against a folder. The exchange with the live server (signed URLs) is written and : it has been run with sgit itself, not with the Swift code"
   ],
   "places": [
    "SGit Vaults: a vault"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.the.app.builds.and.its.tests.pass",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "The app builds and its tests pass",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "Apps/SGit/: its own project, bundle ai.sgit.vaults.app, iPhone and iPad, iOS 26, SwiftUI, Apple SDK only",
   "detail": [
    "Apps/SGit/: its own project, bundle ai.sgit.vaults.app, iPhone and iPad, iOS 26, SwiftUI, Apple SDK only",
    "sgit-app.yml: a simulator build, a Release build for a device, unit tests on an iPhone and an iPad simulator"
   ],
   "places": [
    "SGit Vaults"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.adding.files.underneath.the.screens",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Adding files, underneath the screens",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "Engine/Outbox.swift, Engine/VaultShelf.swift: a selection is copied in, encrypted to disk, uploaded and committed as one signed commit; a failed job is kept and is finished by a new Outbox after a restart; discard; a read key is refused; rename and delete as commits; what a commit changed; the signer's fingerprint",
   "detail": [
    "Engine/Outbox.swift, Engine/VaultShelf.swift: a selection is copied in, encrypted to disk, uploaded and committed as one signed commit; a failed job is kept and is finished by a new Outbox after a restart; discard; a read key is refused; rename and delete as commits; what a commit changed; the signer's fingerprint",
    "Unit tests on the simulators, against a real vault held in a folder: a 5 MB file read back byte for byte through the cache"
   ],
   "places": [
    "SGit Vaults: a vault"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.testflight.upload",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "TestFlight upload",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "The last step of the Mac job in sgit-app.yml, with the release script: on a green push to dev, archive, sign and upload",
   "detail": [
    "The last step of the Mac job in sgit-app.yml, with the release script: on a green push to dev, archive, sign and upload",
    "Run 7 (13 November 2026) uploaded ai.sgit.vaults.app 0.1.19 (7), which the owner installed on a Mac. Run 14 (14 November) uploaded 0.1.34 (14): creating a vault without an access key, the access key on the Create screen, drag and drop, the folder tree. Run 20 uploaded 0.1.37 (20): the fixes the pictures called for. Run 25 (05:54 UTC) uploaded 0.1.39 (25): the gallery. The owner has since used a TestFlight build on his iPhone: a vault on the device with six photos and two videos of 112 MB and 60 MB, added from the photo picker. Run 71 (14 November, 14:18 UTC) uploaded 0.1.70 (71): Secrets, Questions for you, Ask this vault, the same vaults on every device, the design restyle and the people engine. Run 87 (14 November, about 16:40 UTC) uploaded 0.1.81 (87): video playback and the Guide. Run 94 uploaded 0.1.87 (94): thumbnails and facts kept in the vault, People, who you trust, shared..."
   ],
   "places": [
    "SGit Vaults: Gallery",
    "SGit Vaults: a vault",
    "SGit Vaults: Share"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.a.vault.made.on.this.device",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "A vault made on this device",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "VaultShelf.create, sendToServer; VaultSync.transferWithLargeFiles in the engine: created in a folder on the device with no access key and no network; files are added to it there; sending it to the server moves large files as files, and only then removes the folder; forgetting one that was never sent deletes it, after a warning",
   "detail": [
    "VaultShelf.create, sendToServer; VaultSync.transferWithLargeFiles in the engine: created in a folder on the device with no access key and no network; files are added to it there; sending it to the server moves large files as files, and only then removes the folder; forgetting one that was never sent deletes it, after a warning",
    "Unit tests on the simulators and the Mac (sgit-app.yml runs 9 and 10, 14 November 2026): create with no key, add, send to a folder standing in for a server, a second device opening it by key and reading a 5 MB file; a vault with a 6 MB file moved between two places. The screens for it, and the live server, are"
   ],
   "places": [
    "SGit Vaults: a vault"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.the.access.key.on.the.create.screen",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "The access key on the Create screen",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "CreateVaultSheet: a switch, on by default, puts the new vault on the server at once, and the access key is typed there if the app has none. Asked for by the owner on 14 November 2026. The app now says \"access key\", as the web Vault does",
   "detail": [
    "CreateVaultSheet: a switch, on by default, puts the new vault on the server at once, and the access key is typed there if the app has none. Asked for by the owner on 14 November 2026. The app now says \"access key\", as the web Vault does",
    "Compiles (sgit-app.yml run 10). Never used"
   ],
   "places": [
    "SGit Vaults: the Create sheet"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.drag.and.drop",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Drag and drop",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/VaultView.swift, Intake.keepAll, VaultShelf.itemProvider: files and whole folders dropped on a folder are added to it, a folder keeping its shape; a file dragged out is fetched and decrypted when it is dropped",
   "detail": [
    "UI/VaultView.swift, Intake.keepAll, VaultShelf.itemProvider: files and whole folders dropped on a folder are added to it, a folder keeping its shape; a file dragged out is fetched and decrypted when it is dropped",
    "A dropped folder has a unit test. Dragging, in either direction, has never been tried"
   ],
   "places": [
    "SGit Vaults: a vault"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.a.folder.tree.on.a.wide.screen",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "A folder tree on a wide screen",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "FolderTree in UI/VaultView.swift: on an iPad or a Mac the folders are a tree down the left, as the web Vault has them, and the files of the chosen folder are on the right",
   "detail": [
    "FolderTree in UI/VaultView.swift: on an iPad or a Mac the folders are a tree down the left, as the web Vault has them, and the files of the chosen folder are on the right",
    "The tree has a unit test. The screen has never been seen"
   ],
   "places": [
    "SGit Vaults: a vault"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.a.picture.of.every.screen",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "A picture of every screen",
   "status": "seen-working",
   "why": "The reality file, Built: built: in the repository and proven by a run.",
   "summary": "Apps/SGit/UITests/ScreensTests.swift, Sources/App/LaunchSample.swift (Debug builds only), .github/workflows/sgit-app-screens.yml: twenty-two screens on an iPhone and on an iPad in landscape, each opened on an invented vault made by the real engine in temporary folders",
   "detail": [
    "Apps/SGit/UITests/ScreensTests.swift, Sources/App/LaunchSample.swift (Debug builds only), .github/workflows/sgit-app-screens.yml: twenty-two screens on an iPhone and on an iPad in landscape, each opened on an invented vault made by the real engine in temporary folders",
    "Run 1 (14 November 2026) produced all 24 pictures. They are the only way any screen but the first two has been seen: on a simulator, with sample data, never with a server. Two faults they showed (thumbnails outside their tiles, a picture filling the file screen) were fixed; the run on 9b3f642 (26 pictures, thirteen screens) shows both fixed, and shows the standing line, Share on the toolbar and the gallery. The run on 50c8629 (34 pictures, seventeen screens) adds Create with no access key, a vault on this device only, files waiting to be sent and a key shown; all four were looked at and read as intended. The run on d2cb5ce (36 pictures) adds an upload refused for want of an access key, made by the app's own check. The run on b1f6638 (44 pictures) adds dark appearance, which reads well, and a large text size, which showed file names cut short under tiles and the iPad tree breaking a word..."
   ],
   "places": [
    "SGit Vaults: Gallery",
    "SGit Vaults: a vault",
    "SGit Vaults: Share"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.a.gallery.of.vaults",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "A gallery of vaults",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Model/Gallery.swift, UI/GalleryView.swift: a list of vaults to show somebody, by topic, with a search; each opens in the web Vault in the system's browser inside the app; one that carries a key can be added to the device's vaults. The list is what was added on the device (kept in the Keychain) and showcase.json from any vault on it. It ships empty",
   "detail": [
    "Model/Gallery.swift, UI/GalleryView.swift: a list of vaults to show somebody, by topic, with a search; each opens in the web Vault in the system's browser inside the app; one that carries a key can be added to the device's vaults. The list is what was added on the device (kept in the Keychain) and showcase.json from any vault on it. It ships empty",
    "Compiles, and its unit tests pass on the simulators (sgit-app.yml on f7dd58e): the file in both shapes, the links, the grouping, reading it from a vault, keeping an added entry. Opening a real vault in the in-app browser has never been tried, and the screen has not been pictured"
   ],
   "places": [
    "SGit Vaults: Gallery"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.published.vaults.in.the.gallery",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Published vaults in the gallery",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Model/DemoVaults.swift, UI/GalleryView.swift, Resources/sg-demo-vaults.json (written by scripts/sgit-app/demo_vaults.py): a \"Published by sgit.ai\" part of the Gallery listing the vaults at sgit.ai/demos/vaults (54 on 14 November 2026), grouped by kind and searchable, each opening in the web Vault inside the app with the read key its maker published on purpose (sgit_public_read_, so looking only...",
   "detail": [
    "Model/DemoVaults.swift, UI/GalleryView.swift, Resources/sg-demo-vaults.json (written by scripts/sgit-app/demo_vaults.py): a \"Published by sgit.ai\" part of the Gallery listing the vaults at sgit.ai/demos/vaults (54 on 14 November 2026), grouped by kind and searchable, each opening in the web Vault inside the app with the read key its maker published on purpose (sgit_public_read_, so looking only: \"Allow changes\" is never offered). The list is read live from the page's Markdown twin when the gallery opens; a vault new since this build has its key read from its own page when tapped; without a network the copy in the app is used, and the screen says which",
    "Unit tests for reading the rows (one has a bar in its summary), taking only a public read key for the right vault, merging the live list with the bundled keys, and that the bundled copy holds only public read keys; not yet compiled when written"
   ],
   "places": [
    "SGit Vaults: Gallery"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.vaults.on.the.device",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Vaults on the device",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/VaultsView.swift: add by key, read key or web link, pasted or scanned as a QR code; create; keys, access token and signing key in this app's Keychain",
   "detail": [
    "UI/VaultsView.swift: add by key, read key or web link, pasted or scanned as a QR code; create; keys, access token and signing key in this app's Keychain",
    "Compiles. The Keychain, the camera and the live server: never run"
   ],
   "places": [
    "SGit Vaults"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.adding.photos.videos.and.files.the.screens",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Adding photos, videos and files, the screens",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Engine/Intake.swift, UI/VaultView.swift: the Photos picker and the Files picker, progress for each file and the whole, Try again and Discard",
   "detail": [
    "Engine/Intake.swift, UI/VaultView.swift: the Photos picker and the Files picker, progress for each file and the whole, Try again and Discard",
    "Compiles. The pickers have never been used"
   ],
   "places": [
    "SGit Vaults: a vault"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.browsing",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Browsing",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/VaultView.swift, UI/FileView.swift: folders, a grid or a list, thumbnails for images, an image at full size, a video player, Quick Look, Save to Photos, Share, rename, delete",
   "detail": [
    "UI/VaultView.swift, UI/FileView.swift: folders, a grid or a list, thumbnails for images, an image at full size, a video player, Quick Look, Save to Photos, Share, rename, delete",
    "The listing has unit tests. The screens have never been seen"
   ],
   "places": [
    "SGit Vaults: a vault",
    "SGit Vaults: Share"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.playing.a.video",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Playing a video",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/FileView.swift, UI/VaultView.swift: a play mark on every video tile; a video's screen opens on a Play button that decrypts it (with progress) and plays it with sound even on silent, with a full-screen button; a frame of the video becomes its tile picture once it has been decrypted, or straight away for videos up to 25 MB. Asked for by the owner on 14 November 2026 after adding videos from his...",
   "detail": [
    "UI/FileView.swift, UI/VaultView.swift: a play mark on every video tile; a video's screen opens on a Play button that decrypts it (with progress) and plays it with sound even on silent, with a full-screen button; a frame of the video becomes its tile picture once it has been decrypted, or straight away for videos up to 25 MB. Asked for by the owner on 14 November 2026 after adding videos from his iPhone",
    "Not yet compiled when written. A video plays only once it is wholly decrypted to this device: 112 MB takes a few seconds on the device, longer from the server; playing while it downloads is not built"
   ],
   "places": [
    "SGit Vaults: a vault"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.a.small.picture.and.the.facts.beside.each.file",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "A small picture and the facts beside each file",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Engine/FileFacts.swift, Engine/Outbox.swift: while a file is added, before its plain copy goes, the app makes a small picture (480 pixels: the image itself, a frame of a video, the first page of a PDF or document) and a facts file, seals both like any file and puts them in the same commit. Layout, for any client: .sgit/thumbs/<content hash>.jpg and .sgit/meta/<content hash>.json, keyed by the...",
   "detail": [
    "Engine/FileFacts.swift, Engine/Outbox.swift: while a file is added, before its plain copy goes, the app makes a small picture (480 pixels: the image itself, a frame of a video, the first page of a PDF or document) and a facts file, seals both like any file and puts them in the same commit. Layout, for any client: .sgit/thumbs/<content hash>.jpg and .sgit/meta/<content hash>.json, keyed by the file's content hash (the 12 hex characters the tree already records), so a renamed or moved file keeps them. Schema sgit.ai/file-meta/v1: name, size, contentHash, contentType, kind, addedAt; for images width, height, orientation, taken, make, model, lens, iso, exposure, aperture, focal length; for video and audio duration, width, height, frame rate, codec, taken, make, model; location only when the person turns on Settings, Keep where photos and videos were taken (off by default); header, every...",
    "Unit tests for the picture and facts of a photo, the layout, a QuickTime location, and the outbox writing a facts file per file in the same commit; not yet compiled when written. Files added before this have no picture kept; they are shown as before"
   ],
   "places": [
    "SGit Vaults: a vault",
    "SGit Vaults: Settings"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.saving.a.folder.out",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Saving a folder out",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/VaultView.swift (saveOut, FolderExporter): the three dots on a folder offer \"Save these N files to Files\" with the size; each file is fetched, laid out as in the vault and handed to the system's export sheet. The share sheet shows the line to paste on a computer (pip install sgit-ai && sgit clone) beside the shown vault key",
   "detail": [
    "UI/VaultView.swift (saveOut, FolderExporter): the three dots on a folder offer \"Save these N files to Files\" with the size; each file is fetched, laid out as in the vault and handed to the system's export sheet. The share sheet shows the line to paste on a computer (pip install sgit-ai && sgit clone) beside the shown vault key",
    "The words and the paths have unit tests. Nobody has saved a folder on a device or a simulator"
   ],
   "places": [
    "SGit Vaults: a vault",
    "SGit Vaults: Share"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.the.web.vault.inside.the.app",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "The web Vault inside the app",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/WebVaultView.swift: \"Open in the web Vault\" on a vault's three dots and on a file. The page dev.vault.sgraph.ai/en-gb/vault/?embed=1 is loaded in a web view that keeps nothing, announces itself, and is handed the vault key by a posted message (the web Vault's embed protocol); the key is not in the address. It opens looking only. \"Allow changes\" hands the page this device's access key for the...",
   "detail": [
    "UI/WebVaultView.swift: \"Open in the web Vault\" on a vault's three dots and on a file. The page dev.vault.sgraph.ai/en-gb/vault/?embed=1 is loaded in a web view that keeps nothing, announces itself, and is handed the vault key by a posted message (the web Vault's embed protocol); the key is not in the address. It opens looking only. \"Allow changes\" hands the page this device's access key for the visit, after a warning; it is not offered for a vault that holds large files, because the web Vault rewrites a folder without the mark that says a file is large",
    "The protocol was tried on 14 November 2026 against the live page in Chromium with a throwaway vault made by sgit: opened by message, HTML preview shown, a deep link to a file honoured, nothing of the key in the address or in storage, and the access-key event turned \"Read-only\" into \"Synced\". The production host vault.sgraph.ai did not answer the handshake. The Swift has unit tests for the words and the host rule; the web view itself has never run on a device or a simulator"
   ],
   "places": [
    "SGit Vaults: a vault"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.your.activity",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Your activity",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Engine/UsageLog.swift, Engine/DeveloperLane.swift, Engine/LaneCrypto.swift (all three copied from VoiceDebrief), UI/ActivityView.swift under Settings: every screen opened and for how long, and about thirty actions (create, add, forget, send to the server, pick, retry, discard, open, share, show a key, save out, refresh), kept in a file on the device; a button sends the report, encrypted to the...",
   "detail": [
    "Engine/UsageLog.swift, Engine/DeveloperLane.swift, Engine/LaneCrypto.swift (all three copied from VoiceDebrief), UI/ActivityView.swift under Settings: every screen opened and for how long, and about thirty actions (create, add, forget, send to the server, pick, retry, discard, open, share, show a key, save out, refresh), kept in a file on the device; a button sends the report, encrypted to the developer's key, over the developer's lane as sgit/usage/v1. Ids and times only: no file name, vault name or key",
    "The log, the report's shape and the lane message have unit tests. Nothing has been sent from a device, and nothing is sent without the button. Each device keeps and sends its own log; they are told apart by a random install id"
   ],
   "places": [
    "SGit Vaults: Share",
    "SGit Vaults: Settings"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.ask.this.vault.an.experiment",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Ask this vault, an experiment",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Engine/VaultAsk.swift, UI/AskVaultView.swift, on a vault's three dots: one question to Apple's on-device model (Foundation Models), in a fresh session, which may call four tools that read a copy of the vault's listing and history (a summary, one folder, recent changes, files by name). Every call and what it returned is shown under the answer. The model is given names, sizes and commit messages...",
   "detail": [
    "Engine/VaultAsk.swift, UI/AskVaultView.swift, on a vault's three dots: one question to Apple's on-device model (Foundation Models), in a fresh session, which may call four tools that read a copy of the vault's listing and history (a summary, one folder, recent changes, files by name). Every call and what it returned is shown under the answer. The model is given names, sizes and commit messages, never a file's contents; it cannot change anything; nothing leaves the device",
    "The tools' unit tests pass (6b13fcb). The model has never been asked anything by this app: CI's simulators have no Apple Intelligence, and nobody has run it on a device. Whether its answers are any good is the experiment"
   ],
   "places": [
    "SGit Vaults: a vault",
    "SGit Vaults: History"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.people",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "People",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "The people session's screens (Sources/People/, on the shared SGitPeople package): a People row on the home list with the unread count; You (your card as a QR code and a link), Contacts (add by scanning, a picture or pasting; a photo of the person, on this device only), Inbox; Keys and access (an access key, keys given or received, who holds which) reached from Secrets",
   "detail": [
    "The people session's screens (Sources/People/, on the shared SGitPeople package): a People row on the home list with the unread count; You (your card as a QR code and a link), Contacts (add by scanning, a picture or pasting; a photo of the person, on this device only), Inbox; Keys and access (an access key, keys given or received, who holds which) reached from Secrets",
    "The screens compile and the app's tests pass (the people session's runs 53 and 60); wired here, not yet compiled when written. Nothing has run on a device; making an inbox and sending use the live server only once a person holds an access key"
   ],
   "places": [
    "SGit Vaults: Share"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.who.you.trust.and.shared.vaults.for.people",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Who you trust, and shared vaults for people",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Sources/Team/: a \"Who you trust\" row on the home list draws you in the middle and each contact around you with their photo (an agent as a chip), the line between solid and thick when fingerprints were checked face to face and they have written to you, solid when both sides hold each other's card, dashed when only you hold theirs; a person's page says how you met and what is missing. \"Make a shared...",
   "detail": [
    "Sources/Team/: a \"Who you trust\" row on the home list draws you in the middle and each contact around you with their photo (an agent as a chip), the line between solid and thick when fingerprints were checked face to face and they have written to you, solid when both sides hold each other's card, dashed when only you hold theirs; a person's page says how you met and what is missing. \"Make a shared vault with some of them\": choose people whose inbox you know, name it; the app makes the vault, puts it on the server, writes .sgit/members.json (schema sgit.ai/members/v1: names, key fingerprints, who added whom, never keys) and sends each person the vault key sealed to their key. A vault with members says \"Shared with …\" at the top",
    "Unit tests for the links, the layout, the summary and the member list; not yet compiled when written. Nothing has been sent to a real person. On the receiving side, \"Open this vault\" on a received invitation (the people session's) adds it to the list of vaults through the same check as pasting a key"
   ],
   "places": [
    "SGit Vaults: Share"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.secrets",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Secrets",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Sources/Secrets/: a Secrets row on the home list; every vault with a secrets/ folder, grouped, searchable; kinds login, device passcode, Wi-Fi, card, note, token, vault key, read key, access key, recovery codes; add, change and delete, each one signed commit of one encrypted JSON file (sgit.ai/secret/v1), read into memory, never into the file cache; hidden values behind Face ID or the passcode...",
   "detail": [
    "Sources/Secrets/: a Secrets row on the home list; every vault with a secrets/ folder, grouped, searchable; kinds login, device passcode, Wi-Fi, card, note, token, vault key, read key, access key, recovery codes; add, change and delete, each one signed commit of one encrypted JSON file (sgit.ai/secret/v1), read into memory, never into the file cache; hidden values behind Face ID or the passcode, copied for two minutes; \"Make a strong password\"; \"My secrets\" made on this device with the first secret; the app covered when not in front (the home stack; a sheet open at the time is not yet covered)",
    "Unit tests for the format, the paths, the kinds and the password maker; compiles and the tests pass (6b13fcb). Nobody has used it on a device. Sync between devices (issue 122), sharing with people (124) and AutoFill (125) are not built"
   ],
   "places": [
    "SGit Vaults: a vault"
   ],
   "issues": [
    "122",
    "124",
    "125"
   ],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.questions.for.you",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Questions for you",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/QuestionsView.swift, Resources/sg-questions.json: questions from the people building the app, on the home list and in Settings; answer by choosing, typing, or the keyboard's dictation; sent sealed over the developer's lane as sgit/answer/v1",
   "detail": [
    "UI/QuestionsView.swift, Resources/sg-questions.json: questions from the people building the app, on the home list and in Settings; answer by choosing, typing, or the keyboard's dictation; sent sealed over the developer's lane as sgit/answer/v1",
    "Unit tests for the bundled questions and the lane message pass (6b13fcb); nothing has been sent from a device"
   ],
   "places": [
    "SGit Vaults: Settings"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.guide.and.what.is.new",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Guide and what is new",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Sources/Guide/ (copied from VoiceDebrief's, the Sherpa session's work), a row on the home list: what changed in each version, the feature guides with numbered pictures (four: getting started, inside a vault, sharing, secrets), and every idea with where it stands, from sg-versions.json, sg-guides.json and sg-ideas.json, which the site's generator writes",
   "detail": [
    "Sources/Guide/ (copied from VoiceDebrief's, the Sherpa session's work), a row on the home list: what changed in each version, the feature guides with numbered pictures (four: getting started, inside a vault, sharing, secrets), and every idea with where it stands, from sg-versions.json, sg-guides.json and sg-ideas.json, which the site's generator writes",
    "A unit test that the app's own data loads; not yet compiled when this row was written"
   ],
   "places": [
    "SGit Vaults"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.the.same.vaults.on.every.device",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "The same vaults on every device",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "Engine/SecretStore.swift (two homes, after VoiceDebrief's), Engine/VaultShelf.swift: each vault that is on a server is also kept as its own iCloud Keychain item, and the access key too, so an iPhone, iPad and Mac on one Apple account open the same vaults with nothing to set up; a vault only on one device is not carried until it is on the server; new vaults from other devices are picked up when the...",
   "detail": [
    "Engine/SecretStore.swift (two homes, after VoiceDebrief's), Engine/VaultShelf.swift: each vault that is on a server is also kept as its own iCloud Keychain item, and the access key too, so an iPhone, iPad and Mac on one Apple account open the same vaults with nothing to set up; a vault only on one device is not carried until it is on the server; new vaults from other devices are picked up when the app comes to the front, and vaults already open are read again then; forgetting a vault takes it out of iCloud Keychain; a switch in Settings. \"My secrets\" is marked by a file so another device finds it, and goes to the server at once when there is an access key",
    "Unit tests with two simulated devices sharing one iCloud Keychain pass (6b13fcb). Never run across real devices. iCloud Keychain carries items on Apple's schedule, usually within a minute"
   ],
   "places": [
    "SGit Vaults: Settings"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.sharing.a.vault",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Sharing a vault",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/ShareVaultView.swift: the vault key and the read key as text and QR code, with what each gives; a link for the web Vault UI",
   "detail": [
    "UI/ShareVaultView.swift: the vault key and the read key as text and QR code, with what each gives; a link for the web Vault UI",
    "The link's form has a unit test. Whether the web Vault UI opens a vault this app wrote has not been tried"
   ],
   "places": [
    "SGit Vaults: Share"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.history",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "History",
   "status": "built-untried",
   "why": "The reality file, Built: unverified: written, not yet proven by a run.",
   "summary": "UI/HistoryView.swift: commits, signature, the signing key's fingerprint, whether it is this device's, what changed",
   "detail": [
    "UI/HistoryView.swift: commits, signature, the signing key's fingerprint, whether it is this device's, what changed",
    "What it shows has unit tests; the screen has never been seen"
   ],
   "places": [
    "SGit Vaults: History"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.local.first.vaults.and.named.remotes.keys.in.icloud.keychain",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Local-first vaults and named remotes; keys in iCloud Keychain",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": ": after issues 011 and 017",
   "detail": [
    ": after issues 011 and 017"
   ],
   "places": [
    "SGit Vaults"
   ],
   "issues": [
    "011",
    "017"
   ],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": [
    "v0.1.33"
   ]
  },
  {
   "id": "sgit-feature.a.share.extension.background.uploads",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "A share extension; background uploads",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": "",
   "detail": [],
   "places": [
    "SGit Vaults: Share"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.a.merge.for.colliding.edits.branches",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "A merge for colliding edits; branches",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": "",
   "detail": [],
   "places": [
    "SGit Vaults"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.a.read.only.token.that.can.be.revoked",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "A read-only token that can be revoked",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": ": the format is not agreed",
   "detail": [
    ": the format is not agreed"
   ],
   "places": [
    "SGit Vaults"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  },
  {
   "id": "sgit-feature.video.thumbnails.streaming.a.video.without.fetching.it.whole",
   "kind": "feature",
   "app": "SGit Vaults",
   "title": "Video thumbnails; streaming a video without fetching it whole",
   "status": "proposed",
   "why": "The reality file, Not built: proposed: does not exist.",
   "summary": "",
   "detail": [],
   "places": [
    "SGit Vaults"
   ],
   "issues": [],
   "url": "https://ios.app.voicedebrief.ai/sgit-app/built/index.html",
   "source": "The reality file",
   "versions": []
  }
 ]
}
