Skip to content

iOS SwiftExampleApp — TEST_PLAN QA run status & blockers #3897

Description

@QuantumExplorer

Living tracker for QA runs of the iOS SwiftExampleApp against packages/swift-sdk/SwiftExampleApp/TEST_PLAN.md, driven on the booted iOS simulator (via idb, the simulator-control skill). Updated per build. Distinguishes real pass/fail from environment/tooling blockers.

Environment: testnet · fresh v3.1-dev build · iPhone 17 simulator · fully-provisioned wallet (4 identities, Core/Platform/shielded balances).


Essential tier — ✅ all passing

All Essential-tier tests pass:

  • Core wallet: create / restore / backup phrase / receive / send Core L1 / view balance+tx / SPV sync.
  • Identity: create (Core-funded), load/discover, view, identity→identity credit transfer (production UI added in feat(swift-example-app): add identity→identity Transfer Credits production UI #3891).
  • DPNS: register, check availability, resolve, get usernames.
  • Shielded: sync, view activity, shield from Platform & Core, shielded→shielded transfer, unshield.

CORE-08 (QR scan) is classified Manual (needs a physical camera — not automatable in the simulator), so it sits in its own tier rather than Essential.

Shielded (cross-cutting) — ✅ passing

SH-01 sync · SH-02 view · SH-03 shield-from-Platform · SH-04/SH-07 shield-from-Core (asset lock) · SH-05 shielded transfer · SH-06 unshield · SH-08 withdraw→Core · SH-09 prover · SH-13 receive address — all driven green.
An earlier "no available addresses" failure was diagnosed as an address-list seeding/timing race, not a defect (the shielded path shares the main SDK; it works once the masternode/evonode list is seeded). See #3890.

Common tier — 24 / 32 driven

ID Action Result
CORE-09 Multiple HD accounts
CORE-10 Multi-recipient Core send ✅ UI added (Send → "Add recipient"); 2-output testnet send verified
ID-05 Top up (asset lock) ✅ picker fix — driven end-to-end (topped up idx0 from Platform Payment #0; balance increased)
ID-06 Top up (from platform addrs) ✅ picker fix (TopUpIdentityView funds from Platform Payment account addresses — same flow as ID-05)
ID-07 Add public key
ID-08 Create identity (from platform addrs) ✅ picker fix — CreateIdentityView source-wallet + funding-source pickers drivable to submit-ready
ID-09 Set local alias ✅ driven end-to-end — toolbar "Add Alias"/"Save" are absent from describe-all but reachable via describe-point; alias set + persisted to SwiftData
ID-10 Withdraw credits → L1 production UI added + driven end-to-end. New Withdraw Credits button in IdentityDetailView (next to Transfer Credits), sheet WithdrawCreditsViewwallet.withdrawCreditsplatform_wallet_withdraw_credits_with_signer (keychain-signed, mirrors ID-04/#3891). Withdrew 0.001 DASH from a funded identity to an L1 address (run on devnet/paloma): "Withdrawal submitted" success screen, identity credit balance dropped 0.09659655 → 0.09331446 DASH (amount + withdrawal fee) and the detail view reflected it via @Query. L1 payout is pooled/async — no immediate txid, and the UI says so (no fake txid). Prereq: withdrawal signing needs a TRANSFER/CRITICAL key; the funded test identity lacked one (predates the keyId-3 derive fix) and failed first with a clean "no withdrawal public key" error and no balance change — a TRANSFER key was added via ID-07 first, then the withdrawal succeeded.
ID-11 Transfer credits → platform addrs ▶ reachable — AddressQueriesView debug form (NOT a picker); the catalog nav-link is drivable (see below), then needs typed identity/address/key input
ADDR-01 Query address info ✅ driven — Queries → Addresses → Get Address Info; returned balance/nonce/found for a bech32m address
ADDR-06 Show platform receive address
DPNS-05 Register contested/premium name
DPNS-06 Select main name
DPNS-07 Search by prefix ✅ driven — Queries → DPNS → DPNS Search, prefix "qa" → returned qa-gauss-0614.dash (+ recordsIdentityId)
DC-01 Load contract from network ✅ driven — Contracts → + ("Add Contract or Token", toolbar PopUpButton via describe-point) → Load Contract → examples list → Withdrawals (4fJLR2GYTPFdomuTVvNy3VRrvWgvkKPzqehEBpNf2nk6, not previously loaded). Sheet dismissed with no error. SwiftData ZPERSISTENTDATACONTRACT went 1 → 2; new row id (hex) 3662BB61…2FE2D97F = the requested id, 2475-byte serialization, linked withdrawal doc type, ZLASTACCESSEDAT = tap time. Free network read, no funds/ST.
DC-02 View contract
DC-03 Create data contract 💸 funds (retry on funded identity)
DOC-01 Query documents ✅ driven — Queries → Documents → Get Documents (DPNS contract GWRSAV…S31Ec / type domain) → total_count: 100 documents
DOC-02 Create document production UI added + driven end-to-end. Contracts → contract → document type → New Document (schema-driven CreateDocumentView) → platform_wallet_create_document_with_signer (routes through rs-platform-wallet IdentityWallet::create_document_with_signer → SDK put_to_platform_and_wait_for_response, signed by the wallet's keychain signer — not the test-signer builder). Created a preorder doc (saltedDomainHash) on DPNS GWRSAV…S31Ec from funded idx1: network-confirmed, doc id 7i1hJgvVt8fJms26kGwkEZ6jVZxrfd3BrqfmAfpqXMoG, ZPERSISTENTDOCUMENT 0→1, appears in documents list. Also fixed a nav-stability bug that was auto-dismissing the create form (background-sync @Query re-render of the contracts list tore down the contract-details navigation).
TOK-01 View token balances/search ✅ (empty = valid)
TOK-02 Transfer token 💸 needs token fixture
TOK-03 Direct purchase token 💸 needs token fixture
TOK-04 Token queries 💸 reachable — Queries → Token query forms load + execute; "Get Identity Token Balances" requires a Token ID and the wallet holds no tokens → needs a token fixture (same as TOK-02/03). Tooling unblocked.
SH-07 Shield from asset lock
SH-08 Shielded withdraw → Core L1
SH-09 Prover warm-up
SH-13 Show shielded receive address
DP-01 Send contact request ⛔ parked (DashPay, out of scope)
DP-02 Accept contact request ⛔ parked
DP-03 Send DashPay payment ⛔ parked
DP-04 Create/update profile
DP-05 View profile/contacts

Legend: ✅ pass · ⛔ blocked · 💸 funds/fixture · ⚙️ idb-automation limit · 🔌 no UI · ▶ feasible, not yet driven


Blockers / follow-ups

  • Funds / fixture (retryable): DC-03, TOK-02, TOK-03 — failed only because the test identity (idx0) was drained mid-run; re-run on a funded identity (idx1). (DOC-02 now ✅ — driven on funded idx1; see its row.)
  • SwiftUI Picker popovers invisible to idb — RESOLVED. A Picker rendered as a menu popover surfaced only "Dismiss context menu" to idb; its option rows were unreachable. Fixed on branch claude/cool-brattain-b8207a via a shared AccessiblePicker.swift helper: .navigationLink style for Form pickers, .inline for non-Form pickers, plus stable per-row accessibilityIdentifiers. The funding-source, source-wallet, denomination, recipient-identity, and transition (token-register / builder) pickers now expose their option rows. Verified on-device: ID-05 driven end-to-end; ID-06/08 drivable. (Note: Menu { Button } navigation menus like the Identities "+" were never affected — they already exposed their children. And .inline rows are addressable by AXLabel, not a per-row id — a SwiftUI inline-rendering limitation.)
  • Catalog NavigationLink "won't push via synthetic tap" — DIAGNOSED, drivable (technique, no code). Root cause: the TOP row of the Settings → Queries / State Transitions catalogs has its accessibility frame overlapped by the large nav title, so a tap at the row's reported center lands on the Heading, not the row (confirmed with describe-point). Fix: tap the row's LOWER edge (or scroll it clear of the title) — verified pushing both the Queries and State Transitions catalogs. Unblocks ADDR-01, DPNS-07, TOK-04, DOC-01, ID-11, and the ID-10 builder nav.
  • ID-09 "Add Alias" toolbar button — drivable (technique, no code). Toolbar buttons are absent from describe-all but reachable via describe-point at the nav-bar frame; driven end-to-end (alias set + persisted to SwiftData).
  • Remaining are idb-technique gaps, not product bugs. Now documented in the simulator-control skill / memory: use describe-point for toolbar/nav buttons, and tap catalog rows clear of the nav-title overlap. ID-11 still needs a full driven pass (typed debug-form input). (ID-10 driven green — see its row.)
    • → need manual runs or a UI-automation improvement.
  • DashPay (DP-01/02/03) — PARKED / out of scope for now. (For reference: sending a contact request fails "External signable wallet has no private key" — receiving-xpub derived in-process; would need the external-signable derivation path.)

Tiers still to run

Thorough (35) · Uncommon (25) · Manual (1: CORE-08, physical device).

Related PRs

#3887 (test plan) · #3888 (multi-wallet) · #3890 (ban-reason FFI + shielded diagnosis) · #3891 (credit-transfer UI) · #3895 (Manual tier) · credit-withdrawal production UI (ID-10, branch claude/festive-thompson-8cc2be) · document-create production UI (DOC-02: platform_wallet_create_document_with_signer + schema-driven CreateDocumentView + contract-details nav-stability fix, branch claude/peaceful-mahavira-0265a4).

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions