This file is the resumable working log for Tolaria mobile. The strategy and roadmap live in [MOBILE_STRATEGY.md](./MOBILE_STRATEGY.md); this file records the current execution state.
- Split `src/utils/wikilinks.ts` into shared `@tolaria/markdown` modules for frontmatter, wikilink block transforms, outgoing links, backlink context, snippets, and word counts.
- Added `apps/mobile` as an Expo React Native workspace package.
- Added root mobile scripts: `mobile:start`, `mobile:ios`, `mobile:test`, and `mobile:typecheck`.
- Configured Expo for a universal light-mode app with a development bundle identifier (`com.tolaria.mobile.dev`) and iPad support enabled.
- Added the first iPad-first/phone-ready shell using fixture notes, shared Markdown title/snippet helpers, Phosphor React Native icons, and responsive panels for sidebar, note list, editor, and properties.
- Split mobile styles into small panel-specific StyleSheet modules so new mobile code starts at CodeScene `10.0`.
- Pinned Expo runtime dependencies to the versions expected by Expo 55 after the initial generated versions failed iOS bundle export (`react-native@0.83.6`, `react@19.2.0`, matching safe-area/svg versions).
- Extracted compact phone navigation into a pure tested state machine so future swipe gestures can dispatch explicit events instead of mutating panels ad hoc.
- Added a minimal mobile vault repository contract plus fixture implementation so app-local vault storage and git sync can plug in behind `listNotes` / `readNote` later.
- Updated `scripts/run-tests.mjs` so full `pnpm test` runs desktop, mobile, and shared package tests, while targeted `apps/mobile/...` and `packages/markdown/...` paths route to the correct workspace Vitest config.
- Updated `.husky/pre-commit` to use `pnpm test -- --silent` so local commits include the new mobile test suite.
- Added `react-native-gesture-handler` at Expo's SDK-compatible version.
- Wrapped the mobile root in `GestureHandlerRootView`.
- Added a tested compact gesture mapper and `SwipeSurface` wrapper so phone panels can transition through swipe gestures while keeping panel behavior in the reducer.
- Re-tested the iPad simulator path; the app now launches in Expo Go on `iPad Pro 13-inch (M4)`.
- Added a pure mobile Git remote parser that codifies the auth choice: GitHub remotes use the GitHub OAuth App path, arbitrary Git remotes use the SSH-key path.
- Added a pure mobile vault configuration model that keeps vault storage app-local, distinguishes local-only vs remote-backed sync, and derives the required Git auth path from the parsed remote.
- Extracted the mobile editor surface behind `MobileEditorAdapter` with a tested document projection so TenTap can replace the placeholder surface without changing shell navigation.
- Installed TenTap and Expo-compatible `react-native-webview`, then wired TenTap into `MobileEditorAdapter` with tested HTML generation from the mobile editor document projection.
- Created [ADR-0110](./adr/0110-tentap-mobile-editor-spike.md) for the TenTap mobile editor spike and its acceptance gates.
- Added a TenTap draft callback boundary that captures editor HTML but explicitly marks it non-persistable until Markdown serialization exists, preventing HTML from becoming canonical vault content by accident.
- Added the first supported TenTap HTML-to-Markdown serializer for H1, paragraph, and unordered-list output; unsupported HTML remains blocked from persistence.
- Added a mobile vault storage driver contract plus memory implementation, and connected the mobile vault repository to app-local markdown files behind that storage interface.
- Added a mobile vault seeding boundary that writes starter Markdown files only when the app-local vault is empty.
- Wired the mobile shell to load its starter notes through the native Expo FileSystem storage driver and stored repository path, with fixture notes retained as the fallback while storage initializes.
- Expanded supported TenTap HTML serialization to include H1-H6 headings, ordered lists, task-list markers, inline strong/emphasis/code, and links while continuing to block unsupported block HTML.
- Split the mobile editor HTML serializer into its own CodeScene-10 module so the draft boundary stays small.
- Wired mobile editor draft changes to the app-local demo vault save path and added visible editor save states: Ready, Saving, Saved, Blocked, and Save failed.
- Split editor save-state styles into a separate style module to keep mobile style files at CodeScene `10`.
- Added a debounced mobile autosave queue that coalesces rapid TenTap draft changes, marks edited drafts as queued, and ignores stale save results when newer drafts supersede them.
- Refreshed the in-memory mobile note projection after the latest successful editor save so the note list, editor source, properties words, and snippets update from canonical Markdown.
- Added the first app-local mobile note creation path and wired the compose button to write a new Markdown note, prepend it to the current list, and select it through the shared compact navigation reducer.
- Added create-note UX state so the compose button disables during app-local creation and displays a compact failure message if storage creation fails.
- Added delete support for app-managed mobile notes through the storage driver, Expo FileSystem adapter, repository boundary, demo vault facade, and editor toolbar.
- Extracted mobile note deletion orchestration into a small hook so the app shell stays at CodeScene `10.0`.
- Added app-local mobile vault metadata and metadata storage boundaries so vault id/name/remote URL can live in persisted app state instead of being hardcoded in the app shell.
- Replaced the demo vault's hardcoded identity with the shared default vault metadata boundary.
- Wired mobile runtime loading through the persisted vault metadata catalog boundary, so app state, note loading, autosave, note creation, and deletion all operate against the active vault metadata.
- Extracted runtime loading into a hook plus tested pure loader to keep `MobileApp.tsx` at CodeScene `10.0`.
- Completed the Phase 3 app-managed vault storage path for the current single-vault mobile app: app-local metadata, seeded markdown files, note listing, open, autosave, create, delete, last selection restore, runtime retry, and iPad/iPhone simulator render validation.
- Deferred archive as a first-class mobile note state until the mobile vault schema/frontmatter model is explicit; implementing archive now as file movement would create throwaway semantics that may conflict with desktop-compatible metadata.
- Added mobile frontmatter metadata parsing for stored markdown notes, including type, icon, date, and inline tags, so app-local vault scans can project note metadata instead of hardcoding every stored note as a generic file.
- Added mobile frontmatter serialization helpers that can create/update supported type/status/date/icon/tags fields while preserving unknown metadata lines.
- Added a mobile frontmatter save boundary that updates persisted note metadata through the vault storage driver and exposes the same path through the demo vault facade for future properties UI calls.
- Wired the iPad/mobile properties panel to the frontmatter save boundary for type, status, icon, date, and tags; successful saves reload projected notes from app-local storage, and large iPads now show the right properties column.
- Expanded supported TenTap HTML serialization to include blockquotes, fenced code blocks with language classes, strikethrough, and an unsupported inline-tag guard so image/table output stays blocked until explicitly handled.
- Added a deterministic mobile core-flow smoke test over app-local storage that covers create, open, edit/save, property update, and delete through the same repository/storage/editor/frontmatter boundaries used by the app.
- Added Expo development-client support and scripts for native iOS simulator QA without Expo Go overlay controls, while keeping generated native folders ignored.
- Created [ADR-0112](./adr/0112-expo-development-client-for-mobile-native-qa.md) for the mobile development-client QA path.
- Added safe TenTap image serialization for persisted relative/remote image sources while continuing to block transient image sources such as `blob:` URLs.
- Added simple TenTap table serialization for rectangular tables, including entity decoding and escaped pipe characters, while continuing to block malformed table shapes.
- Reworked the mobile properties panel into expandable Type/Status/Icon/Tags picker rows that show current values first and reveal chip choices on demand.
- Added the first mobile Git sync plan model, covering local-only vaults, auth-required remotes, ready pull/push actions, active sync operations, and retryable failures.
- Wired the mobile Git sync plan into the note-list UI through a visible status card for remote-backed vaults while local-only vaults remain chrome-free.
- Added the first mobile Git credential storage boundary backed by Expo SecureStore, with host/strategy-scoped credential presence records for future GitHub OAuth and SSH flows.
- Created [ADR-0113](./adr/0113-expo-secure-store-for-mobile-git-credentials.md) for the mobile secure credential storage dependency.
- Added the mobile GitHub OAuth session boundary with Expo AuthSession/WebBrowser, PKCE request shaping, code exchange, SecureStore handoff, and the `tolaria://oauth/github` redirect scheme.
- Created [ADR-0114](./adr/0114-expo-auth-session-for-mobile-github-oauth.md) for the mobile GitHub OAuth native dependency and redirect scheme.
- Wired remote-backed mobile sync status actions to credential loading and the GitHub OAuth flow, including visible syncing/failed status states when Connect is tapped.
- Added a mobile vault remote setup prompt behind the sidebar controls, with persisted remote URL metadata validation and removal by blanking the value.
- Exposed the missing `EXPO_PUBLIC_GITHUB_OAUTH_CLIENT_ID` requirement inside the mobile remote setup prompt and split the client-id detector away from native AuthSession imports.
- Separated the mobile Git remote setup prompt styles from note-creation prompt styles so vault-management UI can evolve without coupling to compose UI names.
- Added a sidebar vault-management card that shows the active app-local vault, Git sync state, and an explicit Git remote action on iPad and compact sidebar surfaces.
- Added the first mobile Git transport execution boundary behind the existing sync/auth plan, including explicit pull/push routing and a visible unavailable-transport failure until the native Git implementation lands.
- Added the first native mobile Git transport adapter contract, wiring the app to a native-module-shaped boundary that currently fails clearly until the real implementation is present.
- Added the app-managed vault directory name to the native Git transport request so the future native module can locate the repository without deriving paths from display names.
- Centralized mobile editor HTML entity decoding and added numeric entity / non-breaking-space support for paragraph, code, image/link, and table serialization.
- Added the optional Expo native-module resolver for `TolariaGit`, so the JavaScript Git transport automatically binds to future development builds that include the native module and keeps the current unavailable-module failure everywhere else.
- Created [ADR-0115](./adr/0115-expo-native-module-boundary-for-mobile-git.md) for the mobile Git native module discovery boundary.
- Reworked the prototype compose flow so tapping the pencil immediately creates and opens an app-local `Untitled` note instead of blocking on a title modal.
- Moved the editor breadcrumb and save state into the top editor toolbar, matching the desktop/Bear-style bar placement instead of rendering it inside the editor body.
- Injected system-font CSS into TenTap so the editor uses iOS-native typography instead of the browser/WebView serif default, while leaving keyboard layout to the OS/simulator input source.
- Upgraded the mobile properties prototype so type, status, date, and tags can be entered from the keyboard with quick chips as shortcuts, while icon editing stays chip-based.
- Removed the now-unused title prompt component and kept the compose-button disabled state with the note-list styles.
- Split new breadcrumb styles out of the shared toolbar styles and removed stale editor/property style entries so the CodeScene pre-commit safeguard stays green.
- Recorded `docs/MOBILE_QUALITY_AUDIT.md` after product review found the mobile implementation had drifted into prototype-grade feature coverage. The audit is now the quality gate for existing mobile surfaces before new feature work resumes.
- Corrected the AI product boundary: provider/model/API-key setup now lives in a mobile Settings surface, provider config persists as app-local settings, API keys go through SecureStore, and `MobileAiPanel` only consumes a configured API model target.
- Tightened relationship writes so mobile relationship additions save canonical wikilink refs, dedupe by canonical target, resolve aliases/plain titles for chip display/opening, and avoid introducing new loose id/string values from the properties UI.
- Demoted saved views from the primary mobile sidebar until real persisted view definitions exist; fixture nested-view definitions remain available to tests but are no longer exposed as if they were desktop-equivalent saved views.
- Continued the properties quality pass by grouping the panel into system, relationships, custom properties, info, and history; adding read-only derived inverse relationship groups; and demoting custom scalar properties to read-only until typed mobile controls exist.
- Added the first usable mobile Git transport with `isomorphic-git` and an Expo FileSystem adapter: GitHub OAuth remotes can clone into app-local vault storage, fast-forward pull, autocommit local changes, and push.
- Disabled demo vault seeding for remote-backed vaults so cloned real vaults are not polluted with fixture notes.
- Created [ADR-0116](./adr/0116-isomorphic-git-for-mobile-real-vault-sync.md) for the JavaScript Git transport decision and its native-replacement boundary.
1. Run simulator QA for the real-vault sync path: configure a GitHub remote, connect OAuth, clone, inspect loaded notes, edit locally, push, and relaunch.
2. Run iPad simulator QA over sidebar filters, favorites, properties sections, relationship add/remove, raw wikilink autocomplete, AI/settings input states, and Git status transitions.
3. Add real persisted view definition loading before re-exposing Views in the sidebar.
4. Install a simulator runtime matching the active Xcode SDK, or switch Xcode to one matching the installed iOS 17.5/18.6 runtimes, then retry the iOS development-client build.
- CodeScene before extraction: `src/utils/compact-markdown.ts` scored `10`.
- CodeScene after extraction: `packages/markdown/src/compactMarkdown.ts` scored `10`; `packages/markdown/src/compactMarkdown.test.ts` scored `10`; tiny export/config files returned no scorable code and no findings.
- CodeScene before wikilink extraction: `src/utils/wikilinks.ts` scored `9.09`.
- CodeScene after wikilink extraction: new shared wikilink/frontmatter/content files scored `10`; small export surfaces returned no scorable code and no findings.
-`pnpm --filter @tolaria/markdown test` passed after wikilink extraction: 40 tests.
-`pnpm test -- src/utils/wikilinks.test.ts src/utils/noteTitle.test.ts` passed: 91 desktop tests.
-`pnpm --filter @tolaria/markdown typecheck` passed after wikilink extraction.
-`pnpm lint`, `npx tsc --noEmit`, and `pnpm build` passed after wikilink extraction.
- CodeScene before note-title extraction: `src/utils/noteTitle.ts` scored `9.68`.
- CodeScene after note-title extraction: `packages/markdown/src/noteTitle.ts` and `packages/markdown/src/noteTitle.test.ts` scored `10`; the desktop compatibility export returned no scorable code and no findings.
-`pnpm --filter @tolaria/markdown test` passed after note-title extraction: 56 tests.
-`pnpm test -- src/utils/noteTitle.test.ts` passed: 14 desktop tests.
-`pnpm --filter @tolaria/markdown typecheck` passed after note-title extraction.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed and produced the iOS bundle.
-`pnpm lint` passed with one pre-existing warning in `src/components/tolariaBlockNoteSideMenu.tsx`.
-`npx tsc --noEmit` passed.
-`pnpm test` passed after the mobile scaffold: 309 desktop test files / 3639 desktop tests plus 56 shared package tests.
- CodeScene mobile shell scores: `apps/mobile/App.tsx`, `apps/mobile/src/MobileApp.tsx`, `apps/mobile/src/NamedIcon.tsx`, `apps/mobile/src/demoData.ts`, `apps/mobile/src/demoData.test.ts`, and all scorable style modules scored `10`; tiny config/export/theme files returned no scorable code.
- CodeScene pre-commit safeguard passed for the current change set.
- Codacy MCP can read repository analysis and security items for `refactoringhq/tolaria`; local Codacy CLI analysis is currently blocked because the Codacy CLI binary is not installed in this environment.
- iOS simulator validation was initially blocked locally: Xcode is installed (`Xcode 26.3`), but `xcrun simctl list ...` hung indefinitely even after opening `/Applications/Xcode.app/Contents/Developer/Applications/Simulator.app`.
-`pnpm --filter @tolaria/mobile typecheck` passed after compact navigation extraction.
- CodeScene after compact navigation extraction: `apps/mobile/src/compactNavigation.ts`, `apps/mobile/src/compactNavigation.test.ts`, and the touched `apps/mobile/src/MobileApp.tsx` scored `10`.
-`pnpm --filter @tolaria/mobile typecheck` passed after note projection extraction.
- CodeScene after note projection extraction: `apps/mobile/src/mobileNoteProjection.ts` and `apps/mobile/src/mobileNoteProjection.test.ts` scored `10`; `apps/mobile/src/demoData.ts` returned no scorable code and no findings.
-`pnpm --filter @tolaria/mobile test` passed after mobile vault repository extraction: 4 files / 11 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after mobile vault repository extraction.
- CodeScene after mobile vault repository extraction: `apps/mobile/src/mobileVaultRepository.ts` and `apps/mobile/src/mobileVaultRepository.test.ts` scored `10`; `apps/mobile/src/demoData.ts` still returned no scorable code and no findings.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after mobile vault repository extraction.
-`pnpm test -- apps/mobile/src/mobileVaultRepository.test.ts` passed and ran only the mobile repository test file.
-`pnpm test -- packages/markdown/src/noteTitle.test.ts` passed and ran only the shared Markdown note-title test file.
-`pnpm test -- --silent` passed after runner/hook updates: 309 desktop files / 3639 desktop tests, 4 mobile files / 11 mobile tests, 3 shared Markdown files / 56 shared tests.
- CodeScene after test-runner update: `scripts/run-tests.mjs` scored `10`; `.husky/pre-commit` is unsupported by CodeScene file analysis because it has no supported extension.
-`pnpm --filter @tolaria/mobile typecheck` passed after local workflow parity additions.
-`VITEST_MAX_THREADS=1 VITEST_MIN_THREADS=1 pnpm --filter @tolaria/mobile test` passed after local workflow parity additions: 52 files / 172 tests.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export-workflow` passed after local workflow parity additions.
- CodeScene touched-file checks passed at `10.0` for mobile metadata, sidebar navigation, raw wikilink autocomplete, saved view filters, AI client/panel, type appearance, style modules, and touched app/panel components; non-scorable fixture/style aggregation files returned no score.
- CodeScene pre-commit safeguard passed for the current local change set.
- Native simulator QA is currently blocked by local platform tooling: Xcode has only the iOS 26.2 SDK installed, while CoreSimulator has iOS 17.5 and 18.6 runtimes, so `expo run:ios --device "iPad Pro 13-inch (M4)"` fails with xcodebuild error 70 because no matching destination is eligible.
-`pnpm --filter @tolaria/mobile typecheck` passed after the mobile quality remediation pass.
-`VITEST_MAX_THREADS=1 VITEST_MIN_THREADS=1 pnpm --filter @tolaria/mobile test` passed after the mobile quality remediation pass: 56 files / 183 tests.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export-quality-pass` passed after the mobile quality remediation pass.
- CodeScene touched-file checks and pre-commit safeguard passed after AI settings separation, relationship ref canonicalization, and saved-view demotion.
-`pnpm --filter @tolaria/mobile test -- src/mobileEditorDocument.test.ts` passed after TenTap wiring: 8 files / 28 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after TenTap wiring.
- CodeScene after TenTap wiring: `apps/mobile/src/MobileEditorAdapter.tsx`, `apps/mobile/src/mobileEditorDocument.ts`, `apps/mobile/src/mobileEditorDocument.test.ts`, and `apps/mobile/src/styles/editorStyles.ts` scored `10`.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after TenTap wiring; iOS bundle size is now about 11 MB and includes TenTap toolbar assets.
-`pnpm --filter @tolaria/mobile exec expo start --ios --clear` launched on `iPad Pro 13-inch (M4)`; screenshot captured at `/tmp/tolaria-mobile-tentap-ipad.png`. The app rendered with the TenTap-backed editor behind Expo Go's first-run Tools modal and no red runtime error overlay appeared.
-`pnpm test -- src/components/SearchPanel.test.tsx` passed after a transient full-hook failure in the unrelated desktop SearchPanel arrow-key test.
-`pnpm --filter @tolaria/mobile test -- src/mobileEditorDocument.test.ts` passed after the TenTap draft boundary: 8 files / 29 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after the TenTap draft boundary.
- CodeScene after the TenTap draft boundary: `apps/mobile/src/MobileEditorAdapter.tsx`, `apps/mobile/src/mobileEditorDocument.ts`, and `apps/mobile/src/mobileEditorDocument.test.ts` scored `10`.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after the TenTap draft boundary.
-`pnpm --filter @tolaria/mobile typecheck` passed after app-local demo vault seeding.
- CodeScene after app-local demo vault seeding: `apps/mobile/src/MobileApp.tsx`, `apps/mobile/src/mobileDemoVault.ts`, `apps/mobile/src/mobileExpoVaultStorage.ts`, `apps/mobile/src/mobileVaultSeed.ts`, and `apps/mobile/src/mobileVaultSeed.test.ts` scored `10`; `apps/mobile/src/demoData.ts` returned no scorable code and no findings.
-`pnpm --filter @tolaria/mobile exec expo start --ios --clear --port 8087` launched on `iPad Pro 13-inch (M4)` after app-local demo vault seeding; screenshot captured at `/tmp/tolaria-mobile-seeded-ipad.png`. The app rendered via the stored repository path behind Expo Go's first-run Tools modal with no red runtime error overlay.
-`pnpm --filter @tolaria/mobile test -- src/mobileEditorDraftSave.test.ts` passed after editor draft save boundary: 13 files / 44 tests.
-`pnpm --filter @tolaria/mobile test` passed after editor draft save boundary: 13 files / 44 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after editor draft save boundary.
- CodeScene after editor draft save boundary: `apps/mobile/src/mobileEditorDraftSave.ts` and `apps/mobile/src/mobileEditorDraftSave.test.ts` scored `10`.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after editor draft save boundary.
-`pnpm --filter @tolaria/mobile test -- src/mobileEditorSaveState.test.ts src/mobileEditorDraftSave.test.ts` passed after editor save UI wiring: 14 files / 46 tests.
-`pnpm --filter @tolaria/mobile test` passed after editor save UI wiring: 14 files / 46 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after editor save UI wiring.
- CodeScene after editor save UI wiring: `apps/mobile/src/MobileApp.tsx`, `apps/mobile/src/MobileEditorAdapter.tsx`, `apps/mobile/src/mobileDemoVault.ts`, `apps/mobile/src/mobileEditorSaveState.ts`, `apps/mobile/src/mobileEditorSaveState.test.ts`, `apps/mobile/src/styles/editorStyles.ts`, and `apps/mobile/src/styles/editorSaveStateStyles.ts` scored `10`; `apps/mobile/src/styles.ts` returned no scorable code.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after editor save UI wiring.
-`pnpm --filter @tolaria/mobile exec expo start --ios --clear --port 8088` launched on `iPad Pro 13-inch (M4)` after editor save UI wiring; screenshot captured at `/tmp/tolaria-mobile-save-state-ipad.png`. The app rendered the `Ready` save state with no red runtime error overlay.
-`pnpm --filter @tolaria/mobile exec expo start --ios --clear --port 8089` launched on `iPhone 15` after debounced autosave; screenshots captured at `/tmp/tolaria-mobile-autosave-iphone.png` and `/tmp/tolaria-mobile-autosave-iphone-loaded.png`. The app rendered behind Expo Go's first-run Tools modal with no red runtime error overlay.
-`pnpm --filter @tolaria/mobile test -- src/mobileNoteCreate.test.ts src/mobileVaultRepository.test.ts` passed after local note creation: 17 files / 53 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after local note creation.
- CodeScene after local note creation: `apps/mobile/src/MobileApp.tsx`, `apps/mobile/src/mobileDemoVault.ts`, and `apps/mobile/src/mobileNoteCreate.test.ts` scored `10`; `apps/mobile/src/mobileNoteCreate.ts` returned no scorable code and no findings.
-`pnpm --filter @tolaria/mobile test` passed after local note creation: 17 files / 53 tests.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after local note creation.
-`pnpm --filter @tolaria/mobile test -- src/mobileAppStateStorage.test.ts src/mobileNoteCreate.test.ts` passed after saved app state storage: 18 files / 57 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after saved app state storage.
- CodeScene after saved app state storage: `apps/mobile/src/MobileApp.tsx`, `apps/mobile/src/mobileAppStateStorage.ts`, `apps/mobile/src/mobileAppStateStorage.test.ts`, and `apps/mobile/src/mobileNativeAppStateStorage.ts` scored `10`.
-`pnpm --filter @tolaria/mobile test` passed after saved app state storage: 18 files / 57 tests.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after saved app state storage.
-`pnpm --filter @tolaria/mobile test -- src/mobileVaultRuntime.test.ts src/mobileVaultMetadata.test.ts src/mobileVaultMetadataStorage.test.ts` passed after runtime vault metadata wiring: 22 files / 70 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after runtime vault metadata wiring.
- CodeScene after runtime vault metadata wiring: `apps/mobile/src/MobileApp.tsx`, `apps/mobile/src/mobileDemoVault.ts`, `apps/mobile/src/mobileVaultRuntime.ts`, and `apps/mobile/src/mobileVaultRuntime.test.ts` scored `10`; `apps/mobile/src/useMobileVaultRuntimeLoader.ts` returned no scorable code and no findings.
-`pnpm --filter @tolaria/mobile test -- src/mobileVaultRuntime.test.ts` passed after runtime load retry UI: 22 files / 70 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after runtime load retry UI.
- CodeScene after runtime load retry UI: `apps/mobile/src/MobileApp.tsx`, `apps/mobile/src/styles/noteListStyles.ts`, and `apps/mobile/src/styles/vaultLoadStyles.ts` scored `10`; `apps/mobile/src/useMobileVaultRuntimeLoader.ts` returned no scorable code and no findings.
-`pnpm --filter @tolaria/mobile exec expo start --ios --clear --port 8090` launched the runtime metadata/retry build in Expo Go.
- iPhone simulator screenshot captured at `/tmp/tolaria-mobile-runtime-iphone.png`; the note list rendered from app-local storage with no red runtime error overlay, but Expo Go's gear overlay still blocks clean interaction screenshots.
- iPad simulator screenshot captured at `/tmp/tolaria-mobile-runtime-ipad-loaded.png`; the iPad split layout rendered stored notes and TenTap content with the `Ready` save state and no red runtime error overlay.
-`pnpm --filter @tolaria/mobile test -- src/mobileNoteFrontmatter.test.ts src/mobileVaultRepository.test.ts src/mobileEditorDraft.test.ts` passed after mobile frontmatter metadata parsing: 23 files / 74 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after mobile frontmatter metadata parsing.
- CodeScene after mobile frontmatter metadata parsing: `apps/mobile/src/mobileNoteFrontmatter.ts`, `apps/mobile/src/mobileNoteFrontmatter.test.ts`, `apps/mobile/src/mobileVaultRepository.ts`, and `apps/mobile/src/mobileVaultRepository.test.ts` scored `10`.
-`pnpm --filter @tolaria/mobile test` passed after mobile frontmatter metadata parsing: 23 files / 74 tests.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after mobile frontmatter metadata parsing.
-`pnpm --filter @tolaria/mobile test -- src/mobileNoteFrontmatterWrite.test.ts src/mobileNoteFrontmatter.test.ts` passed after mobile frontmatter serialization helpers: 24 files / 78 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after mobile frontmatter serialization helpers.
- CodeScene after mobile frontmatter serialization helpers: `apps/mobile/src/mobileNoteFrontmatterWrite.ts` and `apps/mobile/src/mobileNoteFrontmatterWrite.test.ts` scored `10`.
-`pnpm --filter @tolaria/mobile test` passed after mobile frontmatter serialization helpers: 24 files / 78 tests.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after mobile frontmatter serialization helpers.
-`pnpm --filter @tolaria/mobile test -- src/mobileNoteFrontmatterSave.test.ts src/mobileNoteFrontmatterWrite.test.ts` passed after mobile frontmatter save boundary: 25 files / 80 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after mobile frontmatter save boundary.
- CodeScene after mobile frontmatter save boundary: `apps/mobile/src/mobileNoteFrontmatterSave.ts`, `apps/mobile/src/mobileNoteFrontmatterSave.test.ts`, and `apps/mobile/src/mobileDemoVault.ts` scored `10`.
-`pnpm --filter @tolaria/mobile test` passed after mobile frontmatter save boundary: 25 files / 80 tests.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after mobile frontmatter save boundary.
- iPad simulator screenshot captured at `/tmp/tolaria-mobile-properties-ipad-visible.png`; the large iPad layout renders the properties column with save-backed type/status/icon/date/tag controls and no red runtime error overlay.
-`pnpm --filter @tolaria/mobile exec expo run:ios --device 40724AA3-A793-41D8-9C66-79745DA28DE4 --no-bundler` generated ignored native iOS output and installed CocoaPods via Homebrew, then blocked because Xcode has the iOS 26.2 SDK but only iOS 17.5/18.6 simulator runtimes installed; `xcodebuild -showdestinations` lists no eligible simulator destination until the matching iOS 26.2 runtime is installed.
-`pnpm --filter @tolaria/mobile test -- src/mobilePropertyPicker.test.ts src/mobileNoteProperties.test.ts` passed after expandable mobile property pickers: 28 files / 93 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after expandable mobile property pickers.
- CodeScene after expandable mobile property pickers: `apps/mobile/src/MobilePropertiesPanel.tsx`, `apps/mobile/src/MobileEditablePropertyPickers.tsx`, `apps/mobile/src/mobilePropertyPicker.ts`, `apps/mobile/src/mobilePropertyPicker.test.ts`, and `apps/mobile/src/styles/propertyChipStyles.ts` scored `10`.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after expandable mobile property pickers.
-`pnpm --filter @tolaria/mobile test -- src/mobileGitSyncStatus.test.ts src/mobileGitSyncRuntimePlan.test.ts src/mobileGitSyncPlan.test.ts src/mobileVaultConfig.test.ts` passed after mobile Git sync status wiring: 31 files / 107 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after mobile Git sync status wiring.
- CodeScene after mobile Git sync status wiring: `apps/mobile/src/MobileApp.tsx`, `apps/mobile/src/MobileGitSyncStatusCard.tsx`, `apps/mobile/src/mobileGitSyncStatus.ts`, `apps/mobile/src/mobileGitSyncStatus.test.ts`, `apps/mobile/src/mobileGitSyncRuntimePlan.test.ts`, and `apps/mobile/src/styles/gitSyncStyles.ts` scored `10`; `apps/mobile/src/mobileGitSyncRuntimePlan.ts` and `apps/mobile/src/styles.ts` returned no scorable code and no findings.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after mobile Git sync status wiring.
-`pnpm --filter @tolaria/mobile exec expo install expo-secure-store` installed `expo-secure-store@~55.0.13` and added the Expo config plugin.
-`pnpm --filter @tolaria/mobile test -- src/mobileGitCredentialStorage.test.ts src/mobileSecureGitCredentialStorage.test.ts src/mobileGitSyncRuntimePlan.test.ts src/mobileGitSyncStatus.test.ts` passed after mobile Git credential storage: 33 files / 113 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after mobile Git credential storage.
- CodeScene after mobile Git credential storage: `apps/mobile/src/mobileGitCredentialStorage.ts`, `apps/mobile/src/mobileGitCredentialStorage.test.ts`, `apps/mobile/src/mobileSecureGitCredentialStorage.ts`, `apps/mobile/src/mobileSecureGitCredentialStorage.test.ts`, and `apps/mobile/src/mobileNativeGitCredentialStorage.ts` scored `10`.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after mobile Git credential storage.
-`pnpm --filter @tolaria/mobile test -- src/mobileGitAuthentication.test.ts src/mobileGitCredentialStateForVault.test.ts src/mobileGitSyncRuntimePlan.test.ts src/mobileGitHubOAuthFlow.test.ts src/mobileGitHubOAuth.test.ts` passed after wiring Connect to mobile auth: 37 files / 126 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after wiring Connect to mobile auth.
- CodeScene after wiring Connect to mobile auth: `apps/mobile/src/MobileApp.tsx`, `apps/mobile/src/MobileGitSyncStatusCard.tsx`, `apps/mobile/src/useMobileGitSyncFlow.ts`, `apps/mobile/src/mobileGitAuthentication.ts`, `apps/mobile/src/mobileGitAuthentication.test.ts`, `apps/mobile/src/mobileGitCredentialStateForVault.ts`, `apps/mobile/src/mobileGitCredentialStateForVault.test.ts`, and `apps/mobile/src/mobileGitHubOAuthEnvironment.ts` scored `10`; `apps/mobile/src/mobileGitSyncRuntimePlan.ts` returned no scorable code and no findings.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after wiring Connect to mobile auth.
-`pnpm --filter @tolaria/mobile test -- src/mobileVaultRemoteSetup.test.ts src/mobileVaultConfig.test.ts src/mobileGitSyncRuntimePlan.test.ts` passed after mobile remote setup: 38 files / 129 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after mobile remote setup.
- CodeScene after mobile remote setup: `apps/mobile/src/MobileApp.tsx`, `apps/mobile/src/MobileVaultRemotePrompt.tsx`, `apps/mobile/src/mobileVaultRemoteSetup.ts`, `apps/mobile/src/mobileVaultRemoteSetup.test.ts`, `apps/mobile/src/useMobileVaultRemoteSetupFlow.ts`, and `apps/mobile/src/styles/noteCreateStyles.ts` scored `10`.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after mobile remote setup.
-`pnpm --filter @tolaria/mobile test -- src/mobileVaultRemoteSetup.test.ts src/mobileGitHubOAuthEnvironment.test.ts` passed after splitting mobile remote prompt styles: 39 files / 131 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after splitting mobile remote prompt styles.
- CodeScene after splitting mobile remote prompt styles: `apps/mobile/src/MobileVaultRemotePrompt.tsx`, `apps/mobile/src/styles/remotePromptStyles.ts`, and `apps/mobile/src/styles/noteCreateStyles.ts` scored `10`; `apps/mobile/src/styles.ts` returned no scorable code and no findings.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after splitting mobile remote prompt styles.
-`pnpm --filter @tolaria/mobile test -- src/mobileVaultManagementSummary.test.ts src/mobileVaultRemoteSetup.test.ts` passed after adding the vault-management sidebar card: 40 files / 134 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after adding the vault-management sidebar card.
- CodeScene after adding the vault-management sidebar card: `apps/mobile/src/MobileApp.tsx`, `apps/mobile/src/MobileVaultManagementCard.tsx`, `apps/mobile/src/mobileVaultManagementSummary.ts`, `apps/mobile/src/mobileVaultManagementSummary.test.ts`, and `apps/mobile/src/styles/vaultManagementStyles.ts` scored `10`; `apps/mobile/src/styles.ts` returned no scorable code and no findings.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after adding the vault-management sidebar card; Metro recovered from a cache deserialize warning by doing a full crawl.
-`pnpm --filter @tolaria/mobile test -- src/mobileGitPrimaryAction.test.ts src/mobileGitTransport.test.ts src/mobileGitSyncFlowAction.test.ts src/mobileGitSyncRuntimePlan.test.ts src/mobileGitSyncStatus.test.ts` passed after adding the mobile Git transport execution boundary: 43 files / 143 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after adding the mobile Git transport execution boundary.
- CodeScene after adding the mobile Git transport execution boundary: `apps/mobile/src/MobileApp.tsx`, `apps/mobile/src/useMobileGitSyncFlow.ts`, `apps/mobile/src/mobileGitSyncPlan.ts`, `apps/mobile/src/mobileGitPrimaryAction.ts`, `apps/mobile/src/mobileGitPrimaryAction.test.ts`, `apps/mobile/src/mobileGitTransport.ts`, `apps/mobile/src/mobileGitTransport.test.ts`, `apps/mobile/src/mobileGitSyncFlowAction.ts`, and `apps/mobile/src/mobileGitSyncFlowAction.test.ts` scored `10`.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after adding the mobile Git transport execution boundary.
-`pnpm --filter @tolaria/mobile test -- src/mobileEditorDraft.test.ts src/mobileEditorDraftSave.test.ts` passed after hardening TenTap link serialization: 43 files / 145 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after hardening TenTap link serialization.
- CodeScene after hardening TenTap link serialization: `apps/mobile/src/mobileEditorHtmlMarkdown.ts` and `apps/mobile/src/mobileEditorDraft.test.ts` scored `10`.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after hardening TenTap link serialization.
-`pnpm --filter @tolaria/mobile test -- src/mobileNativeGitTransport.test.ts src/mobileGitTransport.test.ts src/mobileGitSyncFlowAction.test.ts` passed after adding the native Git transport adapter contract: 44 files / 148 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after adding the native Git transport adapter contract.
- CodeScene after adding the native Git transport adapter contract: `apps/mobile/src/MobileApp.tsx`, `apps/mobile/src/mobileNativeGitTransport.ts`, and `apps/mobile/src/mobileNativeGitTransport.test.ts` scored `10`.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after adding the native Git transport adapter contract; Metro recovered from a cache deserialize warning by doing a full crawl.
-`pnpm --filter @tolaria/mobile test -- src/mobileNativeGitTransport.test.ts src/mobileVaultMetadata.test.ts src/mobileVaultConfig.test.ts` passed after adding the vault directory name to native Git transport requests: 44 files / 148 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after adding the vault directory name to native Git transport requests.
- CodeScene after adding the vault directory name to native Git transport requests: `apps/mobile/src/mobileNativeGitTransport.ts` and `apps/mobile/src/mobileNativeGitTransport.test.ts` scored `10`.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after adding the vault directory name to native Git transport requests; Metro recovered from a cache deserialize warning by doing a full crawl.
-`pnpm --filter @tolaria/mobile test -- src/mobileEditorDraft.test.ts` passed after horizontal-rule serialization: 44 files / 149 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after horizontal-rule serialization.
- CodeScene after horizontal-rule serialization: `apps/mobile/src/mobileEditorHtmlMarkdown.ts` and `apps/mobile/src/mobileEditorDraft.test.ts` scored `10`.
-`pnpm --filter @tolaria/mobile test -- src/mobileEditorDraft.test.ts src/mobileHtmlEntities.test.ts` passed after centralized mobile HTML entity decoding: 45 files / 150 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after centralized mobile HTML entity decoding.
- CodeScene after centralized mobile HTML entity decoding: `apps/mobile/src/mobileHtmlEntities.ts`, `apps/mobile/src/mobileHtmlEntities.test.ts`, `apps/mobile/src/mobileEditorHtmlMarkdown.ts`, `apps/mobile/src/mobileEditorTableMarkdown.ts`, and `apps/mobile/src/mobileEditorDraft.test.ts` scored `10`.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after centralized mobile HTML entity decoding.
-`pnpm --filter @tolaria/mobile test -- src/mobileNativeGitModule.test.ts src/mobileNativeGitTransport.test.ts` passed after adding the optional `TolariaGit` native module resolver: 46 files / 152 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after adding the optional `TolariaGit` native module resolver.
- CodeScene after adding the optional `TolariaGit` native module resolver: `apps/mobile/src/mobileNativeGitModule.ts`, `apps/mobile/src/mobileNativeGitModule.test.ts`, `apps/mobile/src/mobileExpoNativeGitModule.ts`, `apps/mobile/src/mobileNativeGitTransport.ts`, and `apps/mobile/src/MobileApp.tsx` scored `10`.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after adding the optional `TolariaGit` native module resolver.
-`pnpm test -- src/App.test.tsx --silent` passed after extending the flaky desktop Git setup dialog wait that was blocking verified mobile commits in the full hook: 34 tests.
-`pnpm --filter @tolaria/mobile test -- src/mobileNativeGitTransport.test.ts src/mobileNativeGitModule.test.ts` passed after adding remote host/auth strategy to native Git requests: 46 files / 152 tests.
-`pnpm --filter @tolaria/mobile typecheck` passed after adding remote host/auth strategy to native Git requests.
- CodeScene after adding remote host/auth strategy to native Git requests: `apps/mobile/src/mobileNativeGitTransport.ts` and `apps/mobile/src/mobileNativeGitTransport.test.ts` scored `10`.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export` passed after adding remote host/auth strategy to native Git requests; Metro recovered from a cache deserialize warning by doing a full crawl.
-`pnpm --filter @tolaria/mobile exec expo install --check` passed after aligning Expo SDK 55 patch dependencies and adding the mobile Git transport dependencies.
-`pnpm --filter @tolaria/mobile typecheck` passed after the isomorphic-git mobile sync transport.
-`pnpm --filter @tolaria/mobile test` passed after the isomorphic-git mobile sync transport: 59 files / 191 tests.
- CodeScene after the isomorphic-git mobile sync transport: `apps/mobile/src/MobileApp.tsx`, `apps/mobile/src/mobileIsomorphicGitTransport.ts`, `apps/mobile/src/mobileExpoGitFileSystem.ts`, `apps/mobile/src/useMobileGitSyncFlow.ts`, `apps/mobile/src/mobileGitSyncFlowAction.ts`, `apps/mobile/src/mobileGitTransport.ts`, `apps/mobile/src/mobileIsomorphicGitTransport.test.ts`, `apps/mobile/src/mobileNativeIsomorphicGitTransport.ts`, `apps/mobile/src/mobileDemoVaultSeedPolicy.ts`, `apps/mobile/src/mobileDemoVault.test.ts`, `apps/mobile/src/mobileSecureGitCredentialStorage.ts`, `apps/mobile/src/mobileDemoVault.ts`, `apps/mobile/src/mobileGitCredentialStorage.ts`, and the touched credential/sync tests scored `10`; `apps/mobile/src/mobileGitSyncRuntimePlan.ts` reported no scorable score.
- CodeScene pre-commit safeguard passed after the isomorphic-git mobile sync transport.
-`pnpm --filter @tolaria/mobile exec expo export --platform ios --output-dir /tmp/tolaria-mobile-export-git-sync` passed after the isomorphic-git mobile sync transport.
- Editor quality remains the largest mobile risk; TenTap must pass the quality gates before becoming accepted.
- Shared package extraction must not destabilize active desktop work.
- Desktop alpha release currently triggers on every push to `main`; this branch is safe, but release path filters should be added before mobile work merges to `main`.
- Codacy analyzes committed/pushed repository state; local edits still need local lint/test/CodeScene discipline before remote checks exist.
- TenTap declares a React DOM 18 dependency, but the mobile workspace now overrides that nested dependency to `react-dom@19.1.0` so Expo SDK 54 runs with a single mobile React DOM version. Keep this override under review when upgrading TenTap or Expo.
## 2026-05-13 Review-Driven Quality Pass
- Downgraded the mobile Expo runtime to SDK 54 for compatibility with the currently available physical-iPad Expo Go runtime, then added a mobile Metro resolver so the native bundle resolves mobile `react@19.1.0` / `react-dom@19.1.0` instead of the desktop root React.
- Preserved notes that no longer start with an H1 in the rich editor; the TenTap initial document no longer re-inserts a title heading after the user removes it.
- Added rich wikilink rendering for persisted wikilinks and serialization back to desktop-compatible wikilink Markdown.
- Routed rich wikilink taps from the TenTap WebView back to mobile note navigation.
- Added a WebView keyboard hook for hardware Tab indentation/outdentation inside the rich editor.
- Added a WebView shortcut hook for `Cmd+N` while focus is inside the rich editor.
- Replaced the Type property chip picker with a combobox-style option list.
- Reworked relationship target adding to use a modal note picker rather than an inline always-visible suggestion list.
- Added custom relationship group creation with an initial target, custom relationship group deletion, relationship chip removal, and custom property deletion.
- Added initial iPad split-panel drag handles: sidebar/list can collapse left, properties can collapse right, and edge handles restore hidden panels.
- Updated [MOBILE_STRATEGY.md](./MOBILE_STRATEGY.md) with the iPad feature-parity roadmap and [MOBILE_QUALITY_AUDIT.md](./MOBILE_QUALITY_AUDIT.md) with the current gap inventory.
- Added a TenTap bridge extension for mobile wikilink insertion, with the Link bridge configured to preserve `tolaria-note:` links.
- Added a rich-editor `[[` suggestion overlay backed by the same mobile note suggestion logic used by the raw editor.
- Split the editor WebView setup, message parser, suggestion UI, and wikilink bridge into focused files so each touched code file stays at CodeScene `10`.
- Replaced boolean-only iPad panel swipe toggles with live numeric panel widths so sidebar, note list, and right panel resize while dragging and snap open/closed on release.
-`pnpm --filter @tolaria/mobile test -- src/tabletPanelLayout.test.ts src/compactGestures.test.ts` passed; the mobile test runner executed 60 files / 198 tests.
-`pnpm --filter @tolaria/mobile test -- src/mobileEditorMessages.test.ts src/mobileShortcutCommands.test.ts src/mobileEditorDraft.test.ts` passed; the mobile test runner executed 61 files / 200 tests.
- Treated `[[` as an active empty wikilink query so suggestions appear immediately after the second bracket.
- Added WebView cursor geometry to wikilink query messages and anchored the suggestion menu below the active editor line instead of at the bottom of the document.
- Changed rich wikilink insertion to focus the TenTap editor, replace the active trigger range, and insert a real Tiptap link mark targeting `tolaria-note:`.
- Added message parsing coverage for empty wikilink queries with geometry and raw autocomplete coverage for the empty `[[` trigger.
-`pnpm --filter @tolaria/mobile test -- src/mobileEditorMessages.test.ts src/mobileWikilinkAutocomplete.test.ts` passed; the mobile test runner executed 61 files / 202 tests.
- Reworked the mobile Type picker into a searchable combobox: opening Type focuses the text field, typing filters available type options, and exact typed matches normalize to the canonical type label.
- Added empty-state copy for unmatched type searches.
- Added pure mobile combobox tests for option filtering and canonical exact-match resolution.
-`pnpm --filter @tolaria/mobile test -- src/mobilePropertyCombo.test.ts src/mobileNoteProperties.test.ts` passed; the mobile test runner executed 62 files / 204 tests.