(formerly Weigh It — internal repo name unchanged)
Reckon ranks hypotheses by what hasn't been knocked down — not by what has the most support.
A star map for decisions. The brightest star isn't always the right one. The steadiest one is.
You don't decide better because you wrote more. You decide better because you couldn't avoid comparing.
Native iOS (SwiftUI + SwiftData) and Android (Kotlin + Jetpack Compose + Room) implementation of Heuer's Analysis of Competing Hypotheses, the technique CIA analysts use to keep wishful thinking out of conclusions. Reckon reframes ACH as an observatory: hypotheses are stars, evidence is observations, every cell in the matrix is a sightline you've pointed (or haven't).
| Hypotheses → stars | Each candidate explanation. Brightness = stability under observation, not raw support. |
| Evidence → observations | Each piece of evidence is one observation in your log. Credibility × relevance is the viewing condition (clear / hazy / cloudy). |
| Matrix cells → sightlines | Each cell rates one observation against one star. Empty cells pulse softly — you haven't pointed the telescope there yet. |
| Bias chip → Pareidolia Alert | When a column fills with same-direction ratings, the app warns you you're seeing a face in the stars. Find an observation that breaks the pattern. |
| Verdict → Constellation Confirmed | The hypothesis whose star nothing has dimmed, surrounded by its confirming sightlines. |
Most decision tools let you write a long pros-and-cons list and call it analysis. That doesn't help — you can rationalize anything in prose.
Reckon's value is what it WON'T let you do:
- You can't avoid the comparison. The matrix forces every observation against every star. Empty cells are visibly unobserved (dashed sightline, pulsing dot) — your eye is pulled to gaps you'd otherwise skip.
- You can't avoid your bias. When a column fills with same-direction ratings, an inline Pareidolia Alert appears at the column header. The bias surfaces while you rate, not gated behind a "results" toggle.
- You see steadiness, not popularity. Each hypothesis column shows two signals: a red refutation badge (count of contradicting evidence) and a support bar. They're shown distinctly so you stop conflating "lots of support" with "actually right."
Heuer's ACH technique: rank hypotheses by fewest refutations, not most support. The right answer is the star nothing has dimmed.
This rewires what you hunt for. Most decision tools reward "find more evidence that supports your favorite" — which is exactly the cognitive habit ACH was designed to fight. Reckon ranks by:
- Lowest refutation count (the primary signal — a hypothesis that nothing has knocked down)
- Highest support count (tiebreaker)
- Highest weighted score (final tiebreaker)
The "leading constellation" at the verdict is the steadiest one — not the brightest.
- hypotheses and evidence are first-class domain objects, not loose text blobs
- per-cell ratings (Strong yes / Supports / Irrelevant / Contradicts / Strong no) preserve nuance instead of collapsing everything to yes/no
- weighted evidence (credibility × relevance) so trustworthy + relevant data carries more weight
- diagnostic evidence detection — which evidence actually distinguishes between hypotheses (vs. supports/contradicts everything equally)
- inline Pareidolia Alerts at the column level — the app names the bias you're fighting
- refutation-count + support-count tracked separately, so users see the two signals as distinct
- structured exports to markdown for journaling and review
First launch presents a 3-page tutorial in the same observatory aesthetic:
- The premise — why most decision tools fail (rationalization-friendly)
- The metaphor — stars, observations, sightlines
- The cognitive twist — refutation-first scoring + Pareidolia Alert
- Open WeighIt.xcodeproj in Xcode 15 or later.
- Select an iPhone simulator running iOS 17.0 or later.
- Build and run.
The project already contains the app target and SwiftData configuration. No manual project scaffolding is required.
- Open android-app in Android Studio Jellyfish or later.
- Let Gradle sync the wrapper project.
- Run the
appconfiguration on an Android 8.0+ emulator or device.
The Android app mirrors the native decision workflow: multiple boards, Room persistence, evidence matrix scoring, notes, rule-outs, diagnostics, bias checks, and markdown export.
- native Xcode project checked in at WeighIt.xcodeproj
- native Android Studio / Gradle project checked in at android-app
- GitHub Actions build workflow at .github/workflows/ios-ci.yml
- GitHub Actions Android workflow at .github/workflows/android-ci.yml
- source, prototype, and docs layers are all visible in one repo
| File | Purpose |
|---|---|
WeighItApp.swift |
App entry point, SwiftData container config |
Models.swift |
SwiftData models: Board, Hypothesis, Evidence, CellRating, Rating enum, Weight enum |
Theme.swift |
Color palette, card style modifier, shared design tokens |
ContentView.swift |
Root view, board switching, navigation, progress ring |
BoardView.swift |
Main scrolling board: question, hypotheses, evidence, matrix, results toggle, conclusion |
Components.swift |
HypothesisRow, EvidenceRow, WeightPicker, NotePanel |
MatrixView.swift |
Matrix grid with horizontal scroll, cells, rating popover picker |
ResultsView.swift |
Ranked results, diagnostic evidence, bias warnings, animated scores |
ConfettiView.swift |
Celebration animation on 100% matrix completion |
android-app/app/src/main/java/io/github/moranetz/weighit/android/ui/WeighItApp.kt |
Compose UI, board editor, matrix, results, notes, board sheet |
android-app/app/src/main/java/io/github/moranetz/weighit/android/data/Models.kt |
Android domain model, scoring, diagnostics, export logic |
android-app/app/src/main/java/io/github/moranetz/weighit/android/data/WeighItRepository.kt |
Room-backed persistence and board mutations |
- SwiftData persistence — boards save automatically, survive app restarts
- Multiple boards — create, switch, delete boards from the header menu
- Undo — built-in via SwiftUI's UndoManager
- Popover rating picker — tap a cell, pick from a menu (no cycling)
- Per-cell notes — record your reasoning on every rating
- Rule out hypotheses — strike through explanations, exclude from scoring
- Reorderable evidence — move items up/down
- Diagnostic analysis — identifies which evidence actually helps you decide
- Bias warnings — flags confirmation bias patterns
- Confetti — celebration on 100% completion with haptic feedback
- Export — share as markdown via share sheet
- Dark mode — warm espresso palette, glass cards, glow accents
- iOS 17 native — @Observable, SwiftData, .contentTransition, sensory feedback
- Android native — Jetpack Compose, Room, Material 3, markdown export intent
- Xcode 15+
- iOS 17.0+
- Swift 5.9+
- Android Studio Jellyfish+
- Android SDK 35