# ScopeDOPE User Acceptance Test Plan
**App version:** 0.9.6-beta4  
**Device:** Samsung Galaxy A16 5G  
**Date prepared:** 2026-06-08  
**Prepared for:** UAT Tester (non-technical, domain novice)

---

## Before You Begin

### Glossary — Read This First

You will encounter the following terms throughout this plan. They are defined here exactly once. Refer back as needed.

| Term | Plain-English meaning |
|---|---|
| **Zero distance** | The one range at which the rifle's scope and barrel are perfectly aligned. At this distance, the bullet hits exactly where the crosshair points. At any other distance, a correction is needed. |
| **DOPE** | "Data On Previous Engagements." Real, verified corrections that a shooter wrote down after confirming where bullets actually hit at specific distances. Think of it as a shooter's personal calibration log. |
| **DOPE entry** | One row in that log: a distance and the scope dial adjustment that was confirmed to work at that distance. |
| **MIL / Milliradian** | A unit of angular measurement used on rifle scopes. Like degrees, but much finer. 1 MIL = 0.001 radian. Displayed with one decimal place (e.g., 3.5). |
| **MOA / Minute of Angle** | Another angular measurement unit. Coarser than MIL. Displayed with two decimal places (e.g., 12.50). |
| **Click value** | The angular change per one "click" of a scope's adjustment dial. Your scope's manual states this. Common values: 0.1 MRAD, 0.25 MOA. |
| **Elevation** | Up/down correction on the scope. Positive = dial up. |
| **Windage** | Left/right correction on the scope. |
| **BC (Ballistic Coefficient)** | A number from a bullet manufacturer's data sheet that describes how well a bullet cuts through air. Higher = less drag. G1 and G7 are two different mathematical models for calculating this. |
| **Scope height** | The vertical distance in inches between the rifle bore centerline and the scope's optical centerline. Typical value: 1.5–2.0 inches. |
| **Output distances** | The list of ranges you want the app to compute corrections for. |
| **Autosave** | The app silently saves your work every 2 seconds in the background so that nothing is lost if the app closes unexpectedly. |
| **Session** | One complete set of inputs: ammo, rifle setup, DOPE entries, and conditions. A session can be saved to a `.dope` file. |
| **`.dope` file** | A file format this app uses to save a session. Can be loaded back later. |
| **BLE** | Bluetooth Low Energy. A wireless protocol used by the Niimbot printer and weather sensors. |
| **Niimbot B1** | A small Bluetooth thermal label printer. Used to print scope labels wirelessly. |
| **WeatherFlow Tactical** | A Bluetooth weather sensor that measures wind speed, temperature, humidity, and pressure and sends them to the app. |

---

### Your Device Setup

1. Install the ScopeDOPE debug APK provided by the developer.
2. Confirm the app launches. You should see a dark-background screen.
3. Enable Bluetooth on your phone (Settings → Connections → Bluetooth → On). You do not need to pair anything yet; just ensure Bluetooth is enabled.
4. Enable Location Services on your phone (Settings → Location → On). This is required for Bluetooth scanning to work on Android 12+.

### How to Reset the App to a Fresh-Install State

Use this procedure whenever a test section says "start from a clean install."

1. Open Android Settings.
2. Go to Apps → ScopeDOPE → Storage.
3. Tap "Clear Data."
4. Tap "Clear Cache."
5. Confirm both. The app will now behave exactly as if it was just installed.

### How to Reset Only the Onboarding Walkthrough (Without Clearing All Data)

1. Open ScopeDOPE.
2. Tap the gear icon (⚙) in the top-right corner to open Settings.
3. Scroll to the bottom of Settings.
4. Tap "Reset Onboarding Walkthrough."
5. The app will return to the Welcome screen.

### How to Record a Result

Each test step has a result box. Pick one of these four outcomes:

- **PASS** — The app behaved exactly as described. Nothing to add.
- **PASS - Added Comment** — The app worked correctly (so it still counts as a pass), **but** you have something to say about it: you do not like how it looks or behaves, or you have an idea for how it could be better. Choose this whenever the step technically works but you want to leave feedback or a suggestion. Then write your comment.
- **FAIL - PARTIAL** — The app did some of what the step described but not all of it. Write what worked and what did not.
- **FAIL** — The app did not behave as described. Write what actually happened.

Write your observations in plain language. There are no wrong answers. Your job is to describe what you saw, not to diagnose why.

> **"PASS - Added Comment" is encouraged.** "It works, but I do not like it" and "It works, but here is an idea" are exactly the kind of feedback we want. A working feature can still be improved — flag it.

---

## Section 1 — First Launch and Onboarding

**Purpose:** Confirm the app presents a guided setup on first launch and that all steps function correctly.

**Starting state:** Fresh install (follow "Reset to Fresh-Install State" above).

---

### 1.1 Welcome Screen

**What you will see:** A dark screen with "ScopeDOPE" in amber text, a tagline, and two buttons: "Get Started" and "Start using the app."

**Steps:**

1. Launch the app.
2. Confirm the screen displays the text "ScopeDOPE."
3. Confirm the text "Precision's NEW Best Friend!" appears below the title.
4. Confirm two buttons are visible: "Get Started" and "Start using the app."
5. Confirm five small dots are visible near the top of the screen. One dot should be slightly larger than the others. This is a progress indicator.

| # | Expected result | Your result |
|---|---|---|
| 1 | App launches to the Welcome screen without crashing. | |
| 2 | "ScopeDOPE" appears in amber text. | |
| 3 | Tagline text is visible. | |
| 4 | Both buttons are visible and have readable text. | |
| 5 | Five dots visible; first dot is larger than the others. | |

**Exploratory:** Now try everything else on this screen that is not covered above. Tap things that are not buttons. Scroll. Rotate the phone. Does anything behave unexpectedly? Record your observations.

---

### 1.2 Tutorial (9-slide walkthrough)

**What you will see:** After tapping "Get Started," a 9-slide tutorial appears. Each slide has a title, body text, and a "Next" button. A "Skip to app" link is in the top-right corner.

**Steps:**

1. Tap "Get Started" on the Welcome screen.
2. Confirm you are now on a slide titled "How ScopeDOPE Works."
3. Confirm nine dots are visible at the top. The first dot should be larger.
4. Tap "Next" on each slide. Confirm you advance to the next slide and the larger dot advances.
5. Advance through all 9 slides. The slides should appear in this order:
   - How ScopeDOPE Works
   - Select Your Ammo
   - Entering Your DOPE
   - Rifle Setup
   - Output Distances
   - Real-Time Calculations
   - Calculations & Label Selection
   - Print & Export
   - Conditions & Wind
6. On the final slide ("Conditions & Wind"), confirm the button label reads "Done" instead of "Next."
7. Tap "Done." Confirm you advance to a screen titled "Select Your Ammo."

| # | Expected result | Your result |
|---|---|---|
| 1 | Tutorial appears immediately after tapping "Get Started." | |
| 2 | First slide title is "How ScopeDOPE Works." | |
| 3 | Nine dots visible; first dot is larger. | |
| 4 | Each "Next" tap advances to the next slide and moves the large dot. | |
| 5 | All 9 slides appear in the order listed above, with correct titles. | |
| 6 | Last slide button reads "Done." | |
| 7 | Tapping "Done" advances to "Select Your Ammo." | |

**Exploratory:** Go back to the beginning (reset onboarding) and explore the tutorial freely. Try tapping "Skip to app" from different slides. Try pressing the Android back button during the tutorial. Record anything unexpected.

---

### 1.3 Onboarding — Ammo Selection Step

**What you will see:** A screen titled "Select Your Ammo" with a button to select ammo and a "Start using the app" skip link at the bottom.

**Starting state:** You should already be on this screen from step 1.2.7.

**Steps:**

1. Confirm the screen title reads "Select Your Ammo."
2. Confirm a button labeled "Select Ammo" is visible.
3. Confirm a "Start using the app" link is visible at the bottom.
4. Tap "Select Ammo." Confirm you navigate to a list of ammunition.
5. The list is searchable. Type "308" in the search field. Confirm the list filters to show only .308 entries.
6. Tap any entry in the list. Confirm you return to the onboarding screen.
7. Confirm the screen now shows the name of the ammo you selected (e.g., "308 Win — 175gr SMK").
8. Confirm the screen automatically advances to the next step within a second or two.

| # | Expected result | Your result |
|---|---|---|
| 1 | Screen title reads "Select Your Ammo." | |
| 2 | "Select Ammo" button is visible. | |
| 3 | "Start using the app" link is visible. | |
| 4 | Tapping "Select Ammo" navigates to the ammo list. | |
| 5 | Typing "308" filters the list to .308 entries only. | |
| 6 | Tapping an ammo entry returns to the onboarding screen. | |
| 7 | The selected ammo name is displayed on the onboarding screen. | |
| 8 | The screen auto-advances to the next step. | |

**Exploratory:** In the ammo list, try the caliber filter chips at the top. Try clearing the search. Try the Android back button from the ammo list. Try tapping a built-in entry's "⋮" (three-dot) menu to see the options. Record anything unexpected.

---

### 1.4 Onboarding — Measurement System Step

**What you will see:** A screen titled "Measurement System" with two radio buttons: "US Customary" and "Metric."

**Steps:**

1. Confirm the screen title reads "Measurement System."
2. Confirm two radio buttons are visible: "US Customary" and "Metric."
3. Confirm each radio button has a subtitle showing its units (e.g., "yd, ft, °F, inHg, mph" for US Customary).
4. Tap "Metric." Confirm the Metric radio button becomes selected (amber filled circle).
5. Tap "US Customary." Confirm it becomes selected instead.
6. Confirm a "Continue" button is visible and tap it to advance.

| # | Expected result | Your result |
|---|---|---|
| 1 | Screen title reads "Measurement System." | |
| 2 | Both radio buttons are visible. | |
| 3 | Each radio button has a unit subtitle. | |
| 4 | Tapping "Metric" selects it visually. | |
| 5 | Tapping "US Customary" switches selection back. | |
| 6 | "Continue" advances to the next step. | |

---

### 1.5 Onboarding — Scope Adjustment Units Step

**What you will see:** A screen titled "Scope Adjustment Units" with two radio buttons: "MIL" and "MOA."

**Context for tester:** These are units used on the scope's dial. This selection tells the app which unit to display for all corrections and DOPE entries.

**Steps:**

1. Confirm the screen title reads "Scope Adjustment Units."
2. Confirm "MIL" and "MOA" radio buttons are visible, each with a description.
3. Confirm "MIL" description reads: "Milliradians — 1 decimal place (e.g. 3.5)"
4. Confirm "MOA" description reads: "MOA — 2 decimal places (e.g. 12.50)"
5. Select "MIL."
6. Tap "Continue."

| # | Expected result | Your result |
|---|---|---|
| 1 | Screen title reads "Scope Adjustment Units." | |
| 2 | Both options visible with descriptions. | |
| 3 | MIL description is correct. | |
| 4 | MOA description is correct. | |
| 5 | Selecting "MIL" shows amber filled radio button. | |
| 6 | "Continue" advances. | |

---

### 1.6 Onboarding — Add DOPE Entries Step

**What you will see:** A screen titled "Add Your Confirmed Impacts" with two numeric fields ("Distance" and "ADJUSTMENT"), a +/- toggle button, a "+" button, and a "Done" button.

**Context for tester:** DOPE entries are the real-world data points that the app uses to calibrate its corrections. Each entry is a distance and the scope adjustment that was confirmed at that distance. The app needs at least 3 entries before it can blend real data into its calculations.

**Steps:**

1. Confirm the screen title reads "Add Your Confirmed Impacts."
2. Confirm a "Distance" field is visible with the suffix "yd."
3. Confirm an "ADJUSTMENT" field is visible with the suffix "mil."
4. Confirm a "+/-" toggle button is visible to the left of the adjustment field.
5. Confirm the "+" button is visible and **disabled** (grayed out) initially.
6. Enter "100" in the Distance field.
7. Enter "0" in the Adjustment field.
8. Confirm the "+" button becomes enabled.
9. Tap "+." Confirm a new row appears showing "100 yd" and "+0.0 MIL."
10. Add a second entry: Distance = 300, Adjustment = 2.5. Tap "+." Confirm the row appears.
11. Tap the "+/-" toggle so the "-" is highlighted in red. Enter a third entry: Distance = 50, Adjustment = 0.5. Tap "+." Confirm the row shows "-0.5 MIL."
12. Tap the "✕" on any entry row. Confirm that row is removed.
13. Re-add the deleted entry so you have exactly 3 entries total.
14. Tap "Done." Confirm you navigate to the main app screen.

| # | Expected result | Your result |
|---|---|---|
| 1 | Screen title correct. | |
| 2 | Distance field visible with "yd" suffix. | |
| 3 | Adjustment field visible with "mil" suffix. | |
| 4 | +/- toggle visible. | |
| 5 | "+" button is disabled when both fields are empty. | |
| 6–8 | "+" button enables when both fields have valid values. | |
| 9 | First entry row appears with correct values. | |
| 10 | Second entry row appears with correct values. | |
| 11 | Negative sign is applied; row shows negative value in red. | |
| 12 | Tapping ✕ removes the row. | |
| 13 | Three entries are present. | |
| 14 | "Done" navigates to the main app. | |

**Exploratory:** Try entering non-numeric text (letters, symbols) in the Distance or Adjustment fields. Try entering a very large number (e.g., 99999). Try entering a negative sign in the distance field. Try adding two entries with the same distance. Record anything unexpected.

---

## Section 2 — Main Screen Navigation

**Purpose:** Confirm the main screen loads correctly and all tabs are accessible.

**Starting state:** You should be on the main app screen after completing onboarding. If not, reset onboarding and tap "Start using the app" to skip directly to the main screen.

---

### 2.1 Main Screen Layout

**What you will see:** A dark screen with a title bar at the top, three tabs at the bottom ("DOPE," "Results," "Print"), and the DOPE tab active.

**Steps:**

1. Confirm three tabs are visible at the bottom: "DOPE," "Results," "Print."
2. Confirm the "DOPE" tab is initially active.
3. Tap the "Results" tab. Confirm the screen content changes.
4. Tap the "Print" tab. Confirm the screen content changes.
5. Tap the "DOPE" tab. Confirm you return to the DOPE screen.
6. Confirm the top-right area of the DOPE screen shows a floppy-disk (save) icon and a gear icon.

| # | Expected result | Your result |
|---|---|---|
| 1 | Three tabs visible at the bottom. | |
| 2 | DOPE tab is active on first load. | |
| 3 | Results tab shows different content. | |
| 4 | Print tab shows different content. | |
| 5 | DOPE tab restores the DOPE screen. | |
| 6 | Save icon and gear icon visible in top-right. | |

---

### 2.2 Gear Icon — Settings

**Steps:**

1. From the DOPE screen, tap the gear icon (⚙).
2. Confirm you navigate to a "Settings" screen.
3. Confirm you can return to the DOPE screen by tapping the back arrow (←) in the top-left.

| # | Expected result | Your result |
|---|---|---|
| 1 | Gear icon is tappable. | |
| 2 | Settings screen loads. | |
| 3 | Back arrow returns to DOPE screen. | |

---

## Section 3 — Ammo Screen

**Purpose:** Confirm all ammo management functions work correctly.

**Starting state:** App is open on the DOPE screen with no ammo selected, OR ammo was already selected during onboarding.

---

### 3.1 Browse and Select Built-In Ammo

**Steps:**

1. From the DOPE screen, locate the ammo display area. If no ammo is selected, tap "Select Ammo." If ammo is selected, tap "Change" (or the ammo name).
2. Confirm you are on the "Select Ammo" screen.
3. Confirm a scrollable list of ammunition entries is visible.
4. Confirm a search field is visible at the top.
5. Confirm caliber filter chips are visible below the search field.
6. Tap the "308 Win" caliber chip. Confirm the list filters to show only .308 Win entries.
7. Tap the chip again. Confirm the filter is cleared and all entries return.
8. Type "175" in the search field. Confirm the list filters.
9. Clear the search field. Confirm the full list returns.
10. Tap any built-in entry. Confirm you return to the DOPE screen with that ammo selected.
11. Confirm the ammo name is now shown on the DOPE screen.

| # | Expected result | Your result |
|---|---|---|
| 1 | Navigation to Select Ammo screen works. | |
| 2 | "Select Ammo" screen title visible. | |
| 3 | List is scrollable and populated. | |
| 4 | Search field visible. | |
| 5 | Caliber filter chips visible. | |
| 6 | Tapping a caliber chip filters the list. | |
| 7 | Tapping the chip again clears the filter. | |
| 8 | Search field filters the list. | |
| 9 | Clearing search restores the full list. | |
| 10 | Tapping an entry returns to DOPE screen. | |
| 11 | Selected ammo name is shown on DOPE screen. | |

---

### 3.2 Built-In Ammo — Three-Dot Menu

**Context:** The ⋮ (three-dot) menu on a built-in ammo entry allows you to copy it to your personal list.

**Steps:**

1. Navigate to the Select Ammo screen.
2. Find any built-in ammo entry (they have normal white text, not amber).
3. Tap the ⋮ button on that entry.
4. Confirm a menu appears with options including "Copy to My Ammo."
5. Tap "Copy to My Ammo."
6. Confirm a dialog appears asking for a name or confirming the copy.
7. Complete the dialog. Confirm the copied entry appears in a "My Ammo" section at the top of the list in amber text.

| # | Expected result | Your result |
|---|---|---|
| 1 | Navigate to Select Ammo. | |
| 2 | Built-in entry found. | |
| 3 | Three-dot menu opens. | |
| 4 | "Copy to My Ammo" option is present. | |
| 5–7 | Copy completes and entry appears in amber in "My Ammo." | |

---

### 3.3 Custom Ammo — Create, Edit, Delete

**Steps:**

1. Navigate to the Select Ammo screen.
2. Tap the "+" button in the top-right corner.
3. Confirm an "Add Custom Ammo" dialog or form appears.
4. Fill in the following values. All fields marked with a label are required:
   - Name: Test Load
   - Caliber: 308 Win
   - Muzzle Velocity: 2600
   - Ballistic Coefficient: 0.50
   - BC Model: G7
   - Bullet Weight: 175
5. Confirm a "Save" or equivalent button is present.
6. Tap Save. Confirm the new entry appears in "My Ammo" in amber text with the name "Test Load."
7. Tap the ⋮ menu on your "Test Load" entry. Confirm "Edit" and "Delete" options are present.
8. Tap "Edit." Change the name to "Test Load Edited." Save. Confirm the name updates in the list.
9. Tap the ⋮ menu on the edited entry. Tap "Delete." Confirm a confirmation dialog appears.
10. Confirm the deletion. Confirm the entry disappears from the list.

| # | Expected result | Your result |
|---|---|---|
| 1–3 | "+" button opens an add form. | |
| 4–6 | New entry saved and appears in amber in "My Ammo." | |
| 7 | Three-dot menu shows "Edit" and "Delete." | |
| 8 | Edit saves the updated name. | |
| 9 | Delete shows a confirmation dialog. | |
| 10 | Entry is removed after confirming deletion. | |

**Exploratory:** Try saving a custom ammo entry with no name. Try saving with a muzzle velocity of 0. Try entering letters in the numeric fields. Record anything unexpected.

---

## Section 4 — DOPE Screen (Main Session Inputs)

**Purpose:** Confirm all input fields on the DOPE screen save correctly, update calculations, and behave correctly with the keyboard.

**Starting state:** App open on DOPE screen with ammo already selected. If no ammo is selected, navigate to Ammo and select any .308 Win entry.

---

### 4.1 Rifle Setup Fields

**Context:** Two fields anchor the calculation. "Zero distance" is the range at which the rifle is zeroed. "Scope height" is the vertical distance in inches from the barrel center to the scope center.

**Steps:**

1. Locate the "RIFLE SETUP" panel on the DOPE screen. It should have two fields: "Zero" and "Height."
2. Tap the "Zero" field. Confirm the numeric keyboard appears.
3. Clear the field and type "100." Confirm the value shows "100."
4. Press the keyboard's "Next" or "Done" button. Confirm the keyboard either moves to the next field or dismisses.
5. Tap the "Height" field. Type "1.5." Confirm the value shows "1.5."
6. Dismiss the keyboard (tap outside the field or press Done).
7. Confirm the Results tab (tap it) now shows calculated values. Tap back to DOPE.

| # | Expected result | Your result |
|---|---|---|
| 1 | Rifle Setup panel visible with Zero and Height fields. | |
| 2 | Tapping Zero opens numeric keyboard. | |
| 3 | Value "100" entered correctly. | |
| 4 | "Next" or "Done" on keyboard responds. | |
| 5 | "1.5" entered in Height field. | |
| 6 | Keyboard dismisses when tapping outside. | |
| 7 | Results tab shows values after inputs are set. | |

---

### 4.2 DOPE Entries Panel

**Context:** DOPE entries are your verified real-world corrections. Distance is in yards. Adjustment is the number of scope clicks (in MIL or MOA) you used at that distance.

**Steps:**

1. Locate the "DOPE" panel on the screen. It should show any entries carried over from onboarding, plus two input fields labeled "New dist" and "Adj."
2. Confirm the "New dist" field has a "yd" suffix.
3. Confirm the "Adj" field has a "mil" or "moa" suffix matching what was selected in Settings.
4. Enter "500" in the "New dist" field. Tab or tap to "Adj." Enter "4.5." Tap the "+" button (or press Done on keyboard).
5. Confirm a new row appears in the list: "500 yd | +4.5 MIL."
6. Enter "700" in "New dist." Enter "8.2" in "Adj." Press "Done" on the keyboard. Confirm the entry is added without requiring the "+" button tap.
7. Tap the trash icon on the "500 yd" entry. Confirm a confirmation dialog appears (if present) or the row is immediately removed.
8. Confirm the row is gone after deletion.

| # | Expected result | Your result |
|---|---|---|
| 1 | DOPE panel visible with existing entries and input row. | |
| 2 | "New dist" has "yd" suffix. | |
| 3 | "Adj" suffix matches the selected unit (MIL or MOA). | |
| 4 | Entering values and tapping "+" adds a new row. | |
| 5 | New row shows correct distance and adjustment. | |
| 6 | Pressing "Done" on keyboard submits the entry. | |
| 7 | Trash icon triggers deletion (with or without confirmation). | |
| 8 | Row is removed from the list. | |

**Exploratory:** Try entering duplicate distances. Try entering distance 0. Try entering a very large distance (e.g., 5000). Try entering decimal distances. Record anything unexpected.

---

### 4.3 Output Distances Panel

**Context:** Output distances are the ranges you want corrections calculated for. They are independent of your DOPE entries.

**Steps:**

1. Locate the "OUTPUT DISTANCES" panel. Confirm it shows distance chips (small labeled buttons).
2. Confirm a "Add distance" field and a "+" button are present.
3. Tap one of the existing distance chips. Confirm it is removed.
4. Type "450" in the "Add distance" field. Press "Done" on the keyboard. Confirm a "450 yd" chip appears.
5. Type "600." Tap the "+" button. Confirm a "600 yd" chip appears.
6. Confirm the Results tab updates to include the new distances (tap Results, then come back).

| # | Expected result | Your result |
|---|---|---|
| 1 | Output Distances panel visible with chips. | |
| 2 | "Add distance" field and "+" button visible. | |
| 3 | Tapping a chip removes it. | |
| 4 | Pressing "Done" on keyboard adds the distance. | |
| 5 | Tapping "+" adds the distance. | |
| 6 | Results tab reflects the new distances. | |

---

### 4.4 Twist Rate and Direction

**Context:** If the shooter enters the rifle's barrel twist rate, the app calculates "spin drift" — a very small left or right bullet drift caused by the rifling's spin. Positive twist (RH) causes a right drift; negative (LH) causes a left drift.

**Steps:**

1. Locate the "SPIN DRIFT" or twist rate area on the DOPE screen. It may be a numeric field labeled "Twist" with two chip buttons: "RH" and "LH."
2. Confirm both "RH" and "LH" chips are visible.
3. Tap "LH." Confirm it becomes selected (highlighted or filled differently than unselected).
4. Confirm both chips have clearly readable text. Neither should be so faint you need to squint to read it.
5. Tap "RH." Confirm selection switches back.
6. Enter "10" in the twist rate field (if present). Confirm the Results tab shows a "Spin Drift" column with values.

| # | Expected result | Your result |
|---|---|---|
| 1 | Twist area visible with RH/LH chips. | |
| 2 | Both chips visible. | |
| 3 | Tapping "LH" visually selects it. | |
| 4 | Both chip labels are fully readable regardless of selection state. | |
| 5 | Tapping "RH" switches selection. | |
| 6 | Spin drift values appear in Results when twist rate is entered. | |

---

### 4.5 Autosave and Session Persistence

**Context:** The app silently saves your session in the background every 2 seconds (when ammo is selected). If the app closes unexpectedly, your work should be restored the next time it opens.

**Steps:**

1. Confirm ammo is selected. Enter or confirm the following inputs are present:
   - Zero distance: 100
   - Scope height: 1.5
   - At least one DOPE entry
   - At least one output distance
2. Wait 5 seconds without touching the app.
3. Force-close the app. To do this: swipe up from the bottom of the screen to open the app switcher. Swipe the ScopeDOPE card away. This closes the app completely.
4. Reopen the app.
5. Confirm all inputs from step 1 are restored exactly as entered: same ammo, same zero distance, same scope height, same DOPE entries, same output distances.

| # | Expected result | Your result |
|---|---|---|
| 1 | Inputs are present before closing. | |
| 2–3 | App is force-closed. | |
| 4 | App reopens. | |
| 5 | All inputs are restored without any error message. | |

**Exploratory:** Force-close the app immediately after entering a value, before the 5-second wait. Reopen and check whether the most recent entry was saved. Note the result — this is expected to sometimes miss the most recent 2 seconds of changes.

---

### 4.6 Save Session to File

**Context:** The floppy-disk icon in the top-right saves your session to a `.dope` file. This is the manual, named save — separate from autosave.

**Steps:**

1. Confirm ammo is selected and at least one DOPE entry exists.
2. Observe the floppy-disk icon. Confirm it is visible.
3. Confirm the icon is **amber** (bright yellow-orange) when a session is active with ammo selected.
4. Tap the floppy-disk icon.
5. Confirm a file-save dialog appears with a suggested filename (e.g., `scopedope_session.dope`).
6. Accept the default filename or type a name. Tap Save.
7. Confirm the dialog closes and no error appears.

| # | Expected result | Your result |
|---|---|---|
| 1 | Ammo and entries are present. | |
| 2 | Floppy-disk icon is visible. | |
| 3 | Icon is amber (not dim/gray). | |
| 4 | Tapping the icon opens a file-save dialog. | |
| 5 | Suggested filename ends in `.dope`. | |
| 6–7 | Save completes without error. | |

---

### 4.7 Load Session from File

**Steps:**

1. From the DOPE screen, tap the ⋮ (three-dot overflow menu) in the top bar.
2. Confirm menu options include "Load session" or similar.
3. Tap "Load session."
4. Navigate to the `.dope` file saved in step 4.6.
5. Tap it. Confirm the app loads the session and the DOPE screen displays the same inputs as when you saved.

| # | Expected result | Your result |
|---|---|---|
| 1 | Three-dot overflow menu opens. | |
| 2 | "Load session" option is present. | |
| 3–4 | File picker opens and allows navigation. | |
| 5 | Session is restored correctly after loading. | |

---

## Section 5 — Conditions Screen

**Purpose:** Confirm that atmospheric conditions can be entered and displayed correctly.

**Starting state:** From the main app screen, navigate to the "Conditions" option. It may be a tab on the DOPE screen or a separate section within the DOPE screen. Look for labels like "Alt," "Temp," "Pressure," "Humidity," or "Wind."

---

### 5.1 Manual Conditions Entry

**Context:** Atmospheric conditions affect air density, which affects how far a bullet drifts. These fields let you enter current conditions manually.

**Steps:**

1. Locate the Conditions section (on the DOPE screen, scroll down past DOPE entries if needed, or look for a "CONDITIONS" panel label).
2. Confirm fields for the following are visible: Altitude, Temperature, Pressure, Humidity.
3. Confirm each field shows a unit suffix (e.g., "ft" for altitude, "°F" for temperature).
4. Tap the Altitude field and enter "1000." Dismiss keyboard. Confirm "1000" is saved.
5. Tap the Temperature field and enter "72." Dismiss keyboard. Confirm "72" is saved.
6. Tap the Results tab. Confirm the calculation table is still present and has not disappeared.

| # | Expected result | Your result |
|---|---|---|
| 1 | Conditions section found and visible. | |
| 2 | Altitude, Temperature, Pressure, Humidity fields present. | |
| 3 | Each field has a unit suffix. | |
| 4 | Altitude entry saves correctly. | |
| 5 | Temperature entry saves correctly. | |
| 6 | Results still show after conditions change. | |

---

### 5.2 Wind Entry

**Context:** Wind speed and direction affect the left/right correction (windage). You enter wind speed as a number. Wind angle is 0° for a headwind (coming directly at you), 90° for a crosswind from the right, and 180° for a tailwind.

**Steps:**

1. Locate the Wind section within Conditions.
2. Confirm a field for wind speed is visible, with a unit suffix (e.g., "mph").
3. Confirm a wind direction dial or angle field is visible.
4. Enter a wind speed of "10."
5. Set wind angle to "90" (full crosswind from the right).
6. Navigate to Results. Confirm the "Wind" column shows non-zero values.
7. Set wind speed back to "0." Confirm the "Wind" column in Results returns to "0.00" or equivalent.

| # | Expected result | Your result |
|---|---|---|
| 1 | Wind section visible. | |
| 2 | Wind speed field with unit suffix. | |
| 3 | Wind direction input present. | |
| 4–5 | Values entered successfully. | |
| 6 | Windage column shows non-zero values. | |
| 7 | Windage returns to zero when wind speed is cleared. | |

---

### 5.3 [PENDING HW VERIFICATION] Bluetooth Sensor Connection — WeatherFlow Tactical

**Hardware required:** WeatherFlow Tactical BLE weather sensor.

**Steps:**

Skip this section if hardware is not available. Mark all rows as [PENDING HW].

1. Navigate to the Conditions section.
2. Confirm a "Connect" button is visible near the sensor status area.
3. Ensure the WeatherFlow Tactical sensor is powered on and within 10 feet of the phone.
4. Tap "Connect." Confirm the app requests Bluetooth permission if not already granted.
5. Confirm the app begins scanning (a progress indicator or status message should appear).
6. Confirm the sensor connects and live readings appear (wind speed, temperature, humidity, pressure).
7. Confirm values update continuously (not static).
8. Tap "Disconnect." Confirm the sensor disconnects and the status returns to "Not connected."

| # | Expected result | Your result |
|---|---|---|
| 1–2 | Connect button visible. | |
| 3–4 | Connection initiated, permissions requested if needed. | |
| 5 | Scanning indicator present. | |
| 6 | Live readings populate the fields. | |
| 7 | Values update over time. | |
| 8 | Disconnect works cleanly. | |

---

## Section 6 — Results Screen

**Purpose:** Confirm that the calculation table displays correctly and that label selections function as expected.

**Starting state:** Ammo is selected, zero distance and scope height are entered, at least one output distance is set.

---

### 6.1 Results Table

**What you will see:** A table with rows for each output distance and columns for Elevation (Elev), Windage (Wind), and Clicks (Clks). A context strip at the top shows the active unit (MIL or MOA) and click value.

**Steps:**

1. Navigate to the Results tab.
2. Confirm the context strip at the top shows "MIL" and a click value (e.g., "0.1 MRAD").
3. Confirm the table has rows for each output distance set on the DOPE screen.
4. Confirm each row has an "Elev" value, a "Wind" value, and a "Clks" value.
5. Confirm the elevation value at zero distance is "0.00" (or equivalent for your unit).
6. Confirm elevation values increase as distance increases (farther distances require more correction).
7. Confirm the "Clks" column shows integers (whole numbers, no decimals).
8. Confirm a checkbox is present next to each row.
9. Tap one checkbox. Confirm the row is visually marked as selected.
10. Tap the same checkbox again. Confirm it deselects.

| # | Expected result | Your result |
|---|---|---|
| 1 | Results tab is accessible. | |
| 2 | Context strip shows unit and click value. | |
| 3 | One row per output distance. | |
| 4 | Each row has Elev, Wind, Clks. | |
| 5 | Zero-distance elevation is 0.00. | |
| 6 | Elevation increases with distance. | |
| 7 | Clicks column contains integers. | |
| 8 | Checkbox present on each row. | |
| 9 | Checking a row visually selects it. | |
| 10 | Unchecking removes selection. | |

---

### 6.2 Label Entry Selection

**Context:** Checked rows in Results are the distances that will appear on the printed scope label. The active label format limits how many rows can be checked. Checking a new row when at the limit automatically unchecks the oldest selection.

**Steps:**

1. Ensure at least 5 output distances are configured (add them on the DOPE screen if fewer exist).
2. Check the first 4 rows.
3. Confirm 4 rows are checked.
4. Check a 5th row. Note whether this is allowed or whether the oldest checked row is automatically unchecked.
5. Confirm the total checked count does not exceed the maximum for the current label format (visible in Settings → Label Format).

| # | Expected result | Your result |
|---|---|---|
| 1 | At least 5 distances present. | |
| 2–3 | 4 rows checked successfully. | |
| 4 | Checking 5th either succeeds or auto-unchecks the first. Neither should crash or display an error. | |
| 5 | Total checked count does not exceed label format maximum. | |

---

## Section 7 — Print Screen

**Purpose:** Confirm that the label preview is displayed correctly and that PNG export works.

**Starting state:** At least 2 rows are checked in Results. Navigate to the Print tab.

---

### 7.1 Label Preview

**Steps:**

1. Navigate to the Print tab.
2. Confirm a label preview image is visible on screen.
3. Confirm the preview shows the distances and elevation values you checked in Results.
4. Confirm the preview updates if you go back to Results, change a checkbox selection, and return to Print.

| # | Expected result | Your result |
|---|---|---|
| 1 | Print tab accessible. | |
| 2 | Label preview is visible. | |
| 3 | Preview contains the selected distances and values. | |
| 4 | Preview updates when selections change. | |

---

### 7.2 Save as PNG

**Steps:**

1. On the Print screen, locate the "Save as PNG" button.
2. Tap it.
3. Confirm a file-save dialog appears, or the file is saved to Photos automatically with a confirmation message.
4. Open the device's Gallery or Files app and confirm the PNG file exists.
5. Open the PNG. Confirm it is a label image with the correct distances and values.

| # | Expected result | Your result |
|---|---|---|
| 1 | "Save as PNG" button visible. | |
| 2 | Button is tappable. | |
| 3 | Save is confirmed (dialog or notification). | |
| 4 | PNG file exists on device. | |
| 5 | PNG contains correct label content. | |

---

### 7.3 [PENDING HW VERIFICATION] Bluetooth Print — Niimbot B1

**Hardware required:** Niimbot B1 thermal label printer and 50mm round labels.

**Steps:**

Skip this section if hardware is not available. Mark all rows as [PENDING HW].

1. Ensure the Niimbot B1 is powered on, loaded with labels, and within 10 feet of the phone.
2. On the Print screen, locate the "Connect" button.
3. Tap "Connect." Confirm the app scans for and finds the Niimbot B1.
4. Confirm connection is established (status should change to "Connected" or show the printer name).
5. Tap "Print."
6. Confirm the printer produces a label.
7. Inspect the printed label. Confirm it matches the on-screen preview: same distances, same elevation values, same layout.
8. Tap Disconnect (or navigate away). Confirm the printer disconnects.

| # | Expected result | Your result |
|---|---|---|
| 1–3 | Connect button tapped, scan initiated. | |
| 4 | Connection established. | |
| 5–6 | Print job sent, label produced. | |
| 7 | Printed label matches screen preview. | |
| 8 | Disconnect is clean. | |

---

## Section 8 — Settings Screen

**Purpose:** Confirm all settings options function correctly and that changes are reflected in the app.

**Starting state:** From the DOPE screen, tap the gear icon.

---

### 8.1 Adjustment Units

**Steps:**

1. In Settings, locate the "Adjustment Units" panel.
2. Confirm "MIL" and "MOA" radio buttons are present.
3. Select "MOA." Return to DOPE screen (tap back arrow).
4. Confirm the DOPE entry "Adj" field now shows "moa" suffix.
5. Confirm the Results context strip now shows "MOA."
6. Return to Settings and switch back to "MIL." Confirm the change takes effect.

| # | Expected result | Your result |
|---|---|---|
| 1–2 | Panel present with both options. | |
| 3 | "MOA" selected. | |
| 4 | DOPE screen suffix updates. | |
| 5 | Results context strip updates. | |
| 6 | Switching back to "MIL" works. | |

---

### 8.2 Click Value

**Steps:**

1. In Settings, under "Adjustment Units," locate the "Click Value" section.
2. Confirm options are present matching the current adjustment unit. For MIL: "0.1 MRAD" and "0.05 MRAD." For MOA: "0.25 MOA," "0.5 MOA," "1 MOA."
3. Select "0.05 MRAD." Return to Results tab.
4. Confirm the "Clks" column values have changed (doubled, because each click is now half as large).
5. Return to Settings and switch back to "0.1 MRAD."

| # | Expected result | Your result |
|---|---|---|
| 1–2 | Click value options match the current adjustment unit. | |
| 3–4 | Changing click value changes the Clks column in Results. | |
| 5 | Reverting restores original Clks values. | |

---

### 8.3 Output Distances Presets

**Steps:**

1. In Settings, locate the "Output Distances" panel.
2. Confirm "NRL22" and "PRS" preset options are visible.
3. Tap "NRL22." Return to DOPE screen.
4. Confirm the output distances are now: 25, 50, 75, 100 yd (US Customary). If Metric is active, confirm they are approximately 23, 46, 69, 91 m.
5. Return to Settings and tap "PRS." Return to DOPE screen.
6. Confirm output distances span from 200–1000 yd in 100 yd increments.

| # | Expected result | Your result |
|---|---|---|
| 1–2 | NRL22 and PRS options visible. | |
| 3–4 | NRL22 preset sets correct distances. | |
| 5–6 | PRS preset sets correct distances. | |

---

### 8.4 Measurement System

**Steps:**

1. In Settings, locate the "Measurement System" panel.
2. Switch to "Metric." Return to DOPE screen.
3. Confirm the Zero and Height fields show metric units (m, cm) or that the output distances are in meters.
4. Confirm the Conditions section shows °C and hPa (or km/h for wind).
5. Return to Settings. Switch back to "US Customary."
6. Confirm all units revert.

| # | Expected result | Your result |
|---|---|---|
| 1–2 | Switch to Metric. | |
| 3 | Distance fields reflect metric units. | |
| 4 | Conditions fields reflect metric units. | |
| 5–6 | Switching back to US Customary reverts all units. | |

---

### 8.5 Watch Tutorial (Re-watch)

**Steps:**

1. In Settings, scroll to the "About" section.
2. Tap "Watch Tutorial."
3. Confirm the tutorial slides appear.
4. Tap "Skip to app" or "Skip." Confirm you return to the Settings screen, not to onboarding.

| # | Expected result | Your result |
|---|---|---|
| 1–2 | "Watch Tutorial" button visible and tappable. | |
| 3 | Tutorial slides appear. | |
| 4 | Skip returns to Settings (not re-triggering full onboarding). | |

---

### 8.6 Reset Onboarding

**Steps:**

1. In Settings, scroll to the "About" section.
2. Tap "Reset Onboarding Walkthrough."
3. Confirm the app returns to the Welcome screen.
4. Complete the onboarding again (or tap "Start using the app" to skip).
5. Confirm the app returns to the main screen and your session data is still present.

| # | Expected result | Your result |
|---|---|---|
| 1–2 | "Reset Onboarding Walkthrough" button visible and tappable. | |
| 3 | App returns to Welcome screen. | |
| 4 | Onboarding can be completed or skipped. | |
| 5 | Session data survives onboarding reset. | |

---

## Section 9 — Advanced Settings Screen

**Purpose:** Confirm advanced settings are accessible and functional.

**Starting state:** From Settings, tap "Advanced Settings."

---

### 9.1 Navigation

**Steps:**

1. In Settings, tap "Advanced Settings."
2. Confirm you navigate to the "Advanced Settings" screen.
3. Confirm a back arrow (←) is present and returns you to Settings.

| # | Expected result | Your result |
|---|---|---|
| 1–2 | "Advanced Settings" screen loads. | |
| 3 | Back arrow returns to Settings. | |

---

### 9.2 Use Real DOPE Data Toggle

**Context:** When this toggle is ON and you have at least 3 DOPE entries, the app blends your real range data into the calculations. When OFF, it runs pure physics only.

**Steps:**

1. Locate the "Ballistics Engine" panel.
2. Confirm a "Use Real DOPE Data" toggle is present.
3. Confirm the toggle is enabled only when at least 3 DOPE entries are present (go to DOPE screen and verify you have 3+ entries; add if needed).
4. Turn the toggle OFF. Navigate to Results. Note the elevation values.
5. Turn the toggle back ON. Navigate to Results. Confirm the elevation values have changed (if you have DOPE entries that differ from pure physics).

| # | Expected result | Your result |
|---|---|---|
| 1–2 | "Use Real DOPE Data" toggle visible. | |
| 3 | Toggle is enabled when 3+ DOPE entries exist. | |
| 4–5 | Toggling changes Results values when DOPE data exists. | |

---

### 9.3 Coriolis Effect Toggle

**Context:** The Coriolis effect is a very small bullet drift caused by the Earth's rotation. It requires location permission to capture your latitude.

**Steps:**

1. Locate the "Corrections" panel. Find the "Coriolis Effect" toggle.
2. Turn it ON. Confirm the app requests location permission if not already granted.
3. Grant the permission. Confirm the app captures a latitude value and displays it (e.g., "Latitude: 41.85° N").
4. Navigate to Results. Confirm the table still shows values without crashing.
5. Turn Coriolis OFF. Confirm the latitude display disappears.

| # | Expected result | Your result |
|---|---|---|
| 1 | Coriolis toggle visible. | |
| 2–3 | Toggle ON requests permission and captures latitude. | |
| 4 | Results still functional with Coriolis enabled. | |
| 5 | Toggle OFF hides latitude display. | |

---

### 9.4 Measurement Units (Individual Overrides)

**Steps:**

1. Locate the "Measurement Units" panel.
2. Confirm separate selectors are present for: Altitude, Temperature, Pressure, Wind Speed.
3. Change the Pressure unit from hPa to inHg.
4. Return to the Conditions section on the DOPE screen.
5. Confirm the pressure field now shows the "inHg" suffix.
6. Return to Advanced Settings and switch Pressure back to hPa.

| # | Expected result | Your result |
|---|---|---|
| 1–2 | All four unit selectors present. | |
| 3 | Pressure unit changed to inHg. | |
| 4–5 | Pressure field on Conditions screen reflects inHg. | |
| 6 | Reverting restores hPa. | |

---

### 9.5 Label Appearance — Gridlines and Color Mode

**Steps:**

1. Locate the "Label Appearance" panel.
2. Confirm "Gridlines" toggle is present. Confirm "Color Mode" toggle is present.
3. Turn Gridlines OFF. Navigate to Print tab.
4. Confirm the label preview shows no row separator lines.
5. Turn Gridlines back ON. Confirm lines reappear in preview.
6. Turn Color Mode ON. Confirm the label preview uses colors (blue for distance, green/red for elevation).
7. Turn Color Mode OFF. Confirm the label preview returns to black and white.

| # | Expected result | Your result |
|---|---|---|
| 1–2 | Both toggles present. | |
| 3–4 | Gridlines OFF removes lines from preview. | |
| 5 | Gridlines ON restores lines. | |
| 6 | Color Mode ON adds color to preview. | |
| 7 | Color Mode OFF returns to monochrome. | |

---

## Section 10 — Keyboard and Input Behavior

**Purpose:** Confirm that the on-screen keyboard behaves correctly throughout the app. This section tests a specific known issue class: on Samsung devices, the keyboard's "Done" action is sometimes routed through a different code path.

---

### 10.1 Keyboard Dismissal — All Numeric Fields

**Steps:**

For each numeric field listed below, perform the following: tap the field to open the keyboard, enter a value, then press the keyboard's action button (it may say "Done," show a checkmark, or show a right-arrow "Next").

Fields to test:

1. DOPE screen → Zero (rifle setup)
2. DOPE screen → Height (rifle setup)
3. DOPE screen → New dist (DOPE entry row)
4. DOPE screen → Adj (DOPE entry row)
5. DOPE screen → Add distance (output distances)
6. Conditions → Altitude
7. Conditions → Temperature
8. Conditions → Pressure
9. Conditions → Humidity
10. Conditions → Wind Speed

For each field: confirm that pressing the action button either (a) dismisses the keyboard, or (b) moves focus to the next field. The keyboard must not remain stuck open after pressing the action button.

| Field | Action button label seen | Keyboard dismissed? | Your result |
|---|---|---|---|
| DOPE → Zero | | | |
| DOPE → Height | | | |
| DOPE → New dist | | | |
| DOPE → Adj | | | |
| DOPE → Add distance | | | |
| Conditions → Altitude | | | |
| Conditions → Temperature | | | |
| Conditions → Pressure | | | |
| Conditions → Humidity | | | |
| Conditions → Wind Speed | | | |

---

### 10.2 Keyboard — DOPE Entry Row (Add Row Behavior)

**Context:** In the DOPE entry row, pressing "Done" on the Adj (adjustment) field should submit the row and clear both fields — not leave them filled.

**Steps:**

1. On the DOPE screen, tap the "New dist" field. Enter "250."
2. Tap the "Adj" field (or press Next to move to it). Enter "2.2."
3. Press the keyboard's action button from the "Adj" field.
4. Confirm: the row "250 yd | +2.2 MIL" is added to the list.
5. Confirm: both the "New dist" and "Adj" fields are cleared (empty) after submission.
6. Confirm: focus moves back to the "New dist" field, ready for the next entry.

| # | Expected result | Your result |
|---|---|---|
| 1–2 | Values entered in both fields. | |
| 3 | Action button pressed from Adj field. | |
| 4 | Row appears in the list. | |
| 5 | Both input fields are cleared. | |
| 6 | Focus returns to "New dist." | |

---

## Section 11 — Contrast and Readability

**Purpose:** Confirm that all text in the app is readable under normal indoor lighting.

**Note:** This section is intentionally subjective. Your judgment is the test. If text requires effort to read, that is a fail.

---

### 11.1 Visual Contrast Check

Perform the following checks. For each item, note whether the text is immediately readable without difficulty.

| Element | Location | Readable? (Yes/No) | Notes |
|---|---|---|---|
| Panel labels (amber small caps text on dark background) | All InstrumentPanel headers | | |
| Body text (muted/gray text on dark background) | Throughout app | | |
| Unselected chip labels (RH / LH twist direction chips) | DOPE screen, spin drift panel | | |
| Selected chip labels (highlighted RH or LH) | DOPE screen, spin drift panel | | |
| Results table text | Results tab | | |
| Settings option labels | Settings and Advanced Settings | | |
| Settings option subtitles | Settings and Advanced Settings | | |
| Floppy-disk icon (dim state) | DOPE screen top bar | | |
| Floppy-disk icon (amber/active state) | DOPE screen top bar | | |
| "Skip to app" / "Start using the app" link text | Onboarding screens | | |

**If any item is marked "No," describe specifically what text is affected and where you see it.**

---

## Section 12 — Edge Cases and Adversarial Inputs

**Purpose:** Systematically probe the app's boundaries. This section is structured but leaves room for you to be methodical. After each numbered block, there is a brief open-ended window.

---

### 12.1 Empty State — No Ammo Selected

**Steps:**

1. Reset app to clean state (Clear Data).
2. Open the app. Complete onboarding by tapping "Start using the app" (skip all steps).
3. Navigate to Results.
4. Confirm the Results tab does not show garbled values or crash. It should show an empty state or a message indicating ammo is required.
5. Navigate to Print.
6. Confirm the Print tab does not crash. The preview should be empty or show a placeholder.

| # | Expected result | Your result |
|---|---|---|
| 1–2 | App opens after skipping onboarding. | |
| 3–4 | Results tab handles no-ammo state gracefully. | |
| 5–6 | Print tab handles no-ammo state gracefully. | |

---

### 12.2 Minimum DOPE Entries Edge Case

**Context:** The "Use Real DOPE Data" toggle requires at least 3 entries. The app should clearly communicate this and not crash or silently fail.

**Steps:**

1. Ensure "Use Real DOPE Data" is ON in Advanced Settings.
2. Delete DOPE entries until only 2 remain (delete one from the DOPE screen).
3. Confirm the toggle in Advanced Settings is now disabled or shows a message: "Requires at least 3 confirmed impacts."
4. Delete a second entry (now 1 entry remains). Confirm same behavior.
5. Delete the final entry. Confirm same behavior.
6. Confirm Results still shows values (pure physics, no DOPE blend).

| # | Expected result | Your result |
|---|---|---|
| 1 | Real DOPE toggle is ON. | |
| 2–3 | Reducing to 2 entries disables the toggle with a message. | |
| 4–5 | 1 entry and 0 entries: same graceful behavior. | |
| 6 | Results still shows physics values with 0 DOPE entries. | |

---

### 12.3 Large Numeric Inputs

**Steps:**

1. In the Zero distance field, enter "99999." Confirm no crash. Confirm the field accepts or rejects the value cleanly.
2. In the scope height field, enter "999." Confirm no crash.
3. In the DOPE entry distance field, enter "10000." Confirm no crash.
4. In the DOPE entry adjustment field, enter "9999.9." Confirm no crash.
5. Navigate to Results. Confirm no crash and values are displayed (even if unusual).

| # | Expected result | Your result |
|---|---|---|
| 1 | 99999 in Zero: no crash. | |
| 2 | 999 in Height: no crash. | |
| 3 | 10000 in DOPE distance: no crash. | |
| 4 | 9999.9 in DOPE adjustment: no crash. | |
| 5 | Results loads without crash. | |

---

### 12.4 Rapid Navigation

**Steps:**

1. Tap the tabs (DOPE, Results, Print) in rapid succession at least 10 times.
2. Confirm no crash and no blank/frozen screens.
3. Navigate into Settings and back rapidly 5 times.
4. Confirm no crash.

| # | Expected result | Your result |
|---|---|---|
| 1–2 | Rapid tab switching causes no crash or freeze. | |
| 3–4 | Rapid Settings navigation causes no crash. | |

---

### 12.5 Screen Rotation

**Steps:**

1. On the DOPE screen, rotate the phone to landscape.
2. Confirm the screen is usable (not cut off or completely broken).
3. Rotate back to portrait. Confirm the screen returns to normal.
4. Enter a value in a field, rotate to landscape, and back. Confirm the value is retained.

| # | Expected result | Your result |
|---|---|---|
| 1–2 | Landscape mode renders usably. | |
| 3 | Portrait returns correctly. | |
| 4 | Values survive rotation. | |

**Note:** The app is designed primarily for portrait use. Some layout imperfection in landscape is expected and not a blocker. Crashes and data loss are blockers.

---

### 12.6 Free Exploration (End of Section)

This is your time. The test plan is complete. You have covered all major surfaces systematically. Now: break things.

Try anything you have not already tried. Think of the least expected thing a user might do and do it. Try it in orders that are not listed above. Go back through sections and try them in reverse. Use the app as if you have never seen instructions.

Document everything that surprises you, in your own words, under this heading.

**Observations:**

*(Write freely here.)*

---

## Summary Sheet

After completing all sections, fill in the following.

| Section | Total steps | Passed | Failed | Notes |
|---|---|---|---|---|
| 1 — Onboarding | | | | |
| 2 — Navigation | | | | |
| 3 — Ammo | | | | |
| 4 — DOPE Screen | | | | |
| 5 — Conditions | | | | |
| 6 — Results | | | | |
| 7 — Print | | | | |
| 8 — Settings | | | | |
| 9 — Advanced Settings | | | | |
| 10 — Keyboard | | | | |
| 11 — Contrast | | | | |
| 12 — Edge Cases | | | | |
| **TOTAL** | | | | |

**Hardware sections pending:** Section 5.3 (WeatherFlow Tactical), Section 7.3 (Niimbot B1 print).

**Overall impression** *(1–2 sentences in your own words):*

---

*Test plan prepared by: ScopeDOPE Development Team — 2026-06-08*
