docs(manual): Batch 1 — correct repository layout paths (core/feature, QuestionDao, QuestionJsonParser)

This commit is contained in:
null 2026-06-28 11:02:18 -05:00
parent 3a6ae5c69a
commit 13ed5b362f
51 changed files with 356 additions and 13 deletions

View File

@ -117,7 +117,7 @@ confirms + enumerates this; the fix phase applies couple-shared everywhere.
are the authoritative state** and survive any compaction — after a summary, **re-read them and continue at the next are the authoritative state** and survive any compaction — after a summary, **re-read them and continue at the next
chunk**. Never pause a run merely because context is getting long; only stop for a true blocker (a denied gated action chunk**. Never pause a run merely because context is getting long; only stop for a true blocker (a denied gated action
even with standing auth, or the macOS requirement for iOS). even with standing auth, or the macOS requirement for iOS).
- **Commit before anything interruptible** so a mid-chunk compaction never loses progress. Keep chunks atomic; if a - **Checkpoint (save the working-tree MD files + run-state) before anything interruptible** so a mid-chunk compaction never loses progress (the user commits — never run git yourself). Keep chunks atomic; if a
chunk is cut off mid-way (e.g., a game session left active), the **session-start ritual recovers it** (clear the stuck chunk is cut off mid-way (e.g., a game session left active), the **session-start ritual recovers it** (clear the stuck
session via in-app "End their game", then redo that chunk). Right-sized chunks (see Batch sizing) make this rare. session via in-app "End their game", then redo that chunk). Right-sized chunks (see Batch sizing) make this rare.
- **Don't pause for "by-design vs bug":** log the ambiguous finding and keep going (don't unilaterally rewrite - **Don't pause for "by-design vs bug":** log the ambiguous finding and keep going (don't unilaterally rewrite
@ -305,7 +305,7 @@ State lives in **files**, not memory:
path crashed → don't fix by reasoning; reproduce via the real channel + read the stack"). path crashed → don't fix by reasoning; reproduce via the real channel + read the stack").
This is how the plan self-improves between rounds — treat the human pointing out a missed bug as a signal the plan had This is how the plan self-improves between rounds — treat the human pointing out a missed bug as a signal the plan had
a gap, and close the gap here, not just the bug. a gap, and close the gap here, not just the bug.
- **Commit cadence**: commit `ClaudeReport.md` + `ClaudeQACoverage.md` after each pass and each chunk. - **Checkpoint cadence**: save `ClaudeReport.md` + `ClaudeQACoverage.md` + run-state after each pass and each chunk (the **user** commits — never run git yourself; see Guardrails).
- **Chunking**: run small chunks (Pass C one screen-group; Pass A one feature), checkpoint after each. - **Chunking**: run small chunks (Pass C one screen-group; Pass A one feature), checkpoint after each.
- **Session-start ritual**: (1) read run-state header + both MD files; (2) `adb devices` shows **both** emulators - **Session-start ritual**: (1) read run-state header + both MD files; (2) `adb devices` shows **both** emulators
online; (3) **installed build == current HEAD** (rebuild+reinstall if unsure — never QA a stale APK); (4) continue online; (3) **installed build == current HEAD** (rebuild+reinstall if unsure — never QA a stale APK); (4) continue
@ -314,14 +314,15 @@ State lives in **files**, not memory:
## Batch sizing — sub-batch each pass to ONE context window (Round-1 calibration) ## Batch sizing — sub-batch each pass to ONE context window (Round-1 calibration)
A pass is a **category**, not a unit of work. Execute each pass as **sub-batches (chunks)**, where a chunk = the A pass is a **category**, not a unit of work. Execute each pass as **sub-batches (chunks)**, where a chunk = the
**largest coherent unit that reliably finishes AND commits within one context window, with margin**. End every chunk **largest coherent unit that reliably finishes AND checkpoints within one context window, with margin**. End every chunk
with a commit + run-state update. If a chunk starts overflowing, split it; if chunks feel trivial, merge them. by saving the MD files + run-state (the user commits — never run git yourself). If a chunk starts overflowing, split it;
if chunks feel trivial, merge them.
**Why:** in Round 1, A & D fit as single batches, but B/C/E were too large → got cut off → deferred. Sub-batching **Why:** in Round 1, A & D fit as single batches, but B/C/E were too large → got cut off → deferred. Sub-batching
prevents half-done/lost work and gives cleaner per-chunk verification + revertable commits. prevents half-done/lost work and gives cleaner per-chunk verification + revertable history.
Default small: if a chunk requires two-device live driving, screenshots/montage review, logcat checks, or admin/API Default small: if a chunk requires two-device live driving, screenshots/montage review, logcat checks, or admin/API
verification, keep it to **one small route family, one game phase, or one notification type**. A chunk is too large if verification, keep it to **one small route family, one game phase, or one notification type**. A chunk is too large if
it cannot produce a precise coverage update, issue log, and commit before context gets tight. Split before starting it cannot produce a precise coverage update, issue log, and file-checkpoint before context gets tight. Split before starting
rather than leaving a half-tested matrix behind. **Prefer Claude-friendly micro-batches**: smaller chunks let the agent rather than leaving a half-tested matrix behind. **Prefer Claude-friendly micro-batches**: smaller chunks let the agent
fully inspect screenshots, tap every CTA, vary app states, update files accurately, and avoid shallow "covered" rows. fully inspect screenshots, tap every CTA, vary app states, update files accurately, and avoid shallow "covered" rows.
@ -348,6 +349,11 @@ Context-cost tips: prefer **code/admin-read audits** (cheap) before live UI swee
(dark|light pairs) to review many at once; keep one chunk = one TodoWrite focus. (dark|light pairs) to review many at once; keep one chunk = one TodoWrite focus.
## Guardrails & efficiency ## Guardrails & efficiency
- **⛔ NEVER `git commit` / `git push` — the USER does ALL commits.** This overrides every "commit" verb elsewhere in
this doc: wherever a step says "commit," read it as **"checkpoint = save the working-tree files (`ClaudeReport.md` +
`ClaudeQACoverage.md` + run-state, plus any code/docs)"** and leave the actual `git commit` to the user. Your durable
state lives in those files (they survive compaction), not in a commit you make. Never stage, commit, push, branch, or
amend.
- **Never `pm clear` / wipe app data** — breaks the App Check debug token. Pre-pairing QA: sign-out → fresh sign-up. - **Never `pm clear` / wipe app data** — breaks the App Check debug token. Pre-pairing QA: sign-out → fresh sign-up.
- **Never run `seed/build_db.py`.** Admin seeds/writes, entitlement toggles, and any deploys are **user-authorized per occurrence**. - **Never run `seed/build_db.py`.** Admin seeds/writes, entitlement toggles, and any deploys are **user-authorized per occurrence**.
- **By-design vs bug:** if a finding may be intended behavior, **log it and keep going** (don't stop to ask; don't unilaterally rewrite deliberate design — the log captures it). - **By-design vs bug:** if a finding may be intended behavior, **log it and keep going** (don't stop to ask; don't unilaterally rewrite deliberate design — the log captures it).

View File

@ -0,0 +1,92 @@
# Engineering Reference Manual Update Plan
Goal: bring `docs/Engineering_Reference_Manual.md` into alignment with the current
relationship-app codebase. Verify every claim, file path, function name,
collection name, and architectural fact. Never assume.
## Approach
- **Batch-based.** Each batch covers one major section or a coherent set of
subsections. One agent/turn per batch.
- **Evidence-first.** For every factual claim in the manual, verify against the
repo (grep, read file, run build/test if needed).
- **Log everything.** Each batch updates this plan with findings and
changes made.
- **Ripley coordinates.** Ripley does not code unless necessary; Bishop or
subagents may verify builds/docs.
## Batches
### Batch 1 — Front matter + System overview + Repository layout
- Read: `## How to use this document` through `### Shared configuration`.
- Verify all directory paths under `app/src/main/java/app/closer/`,
`functions/src/`, `functions/dist/`, `res/drawable-*`.
- Flag missing or renamed directories/files.
- Update any stale paths or naming.
### Batch 2 — Authentication, pairing, couples model
- Read: `## Authentication and pairing flow` through `### Key Cloud Functions`.
- Verify auth files, pairing flow files, `couples` collection fields,
recovery phrase implementation.
- Cross-check `firestore.rules` for the rules described.
- Update if code diverges from doc.
### Batch 3 — E2EE model + Firestore data model
- Read: `## End-to-end encryption model` and `## Firestore data model`.
- Verify crypto files, encryption versions, collection schemas, field names.
- Check `firestore.rules` regex helpers and invariants.
- Update data model tables if collections/fields changed.
### Batch 4 — Daily question lifecycle + Cloud Functions module
- Read: `## Daily question lifecycle` and `## Cloud Functions`.
- Verify function triggers, handlers, schedules, module responsibilities.
- Cross-check `functions/src/` tree.
- Update if functions were added/removed/renamed.
### Batch 5 — Firestore security rules
- Read: `## Firestore security rules`.
- Line-by-line verify against `firestore.rules`.
- Note any rules in the file not documented, or documented rules not in file.
### Batch 6 — Billing + Notifications
- Read: `## Billing` and `## Notifications`.
- Verify RevenueCat integration files, entitlement checks, webhook handler.
- Verify notification classes, quiet hours, deep-link routing.
- Update for quiet-hours server-side suppression if doc still says local-only.
### Batch 7 — iOS-specific + Build and release
- Read: `## iOS-specific notes` and `## Build and release`.
- Verify iOS project state (is it still broken? still exists?).
- Verify build commands, secrets, ProGuard, Functions deploy commands.
- Update stale commands or iOS status.
### Batch 8 — Known landmines and recent fixes (cross-cutting)
- Read: `## Known landmines and recent fixes`.
- Verify each listed issue ID and fix matches git history and current code.
- Add any missing recent landmines (e.g., theme scanner, quiet hours server-side).
- Prune obsolete entries.
### Batch 9 — Final review, TOC update, formatting
- Update `## Table of Contents` if headings changed.
- Run markdown lint / build check if applicable.
- Final pass for consistency.
## Status tracking
| Batch | Status | Findings | Changes made |
|---|---|---|---|
| 1 | todo | | |
| 2 | todo | | |
| 3 | todo | | |
| 4 | todo | | |
| 5 | todo | | |
| 6 | todo | | |
| 7 | todo | | |
| 8 | todo | | |
| 9 | todo | | |
## Notes
- If a section is found to be mostly correct, still spot-check a few claims.
- If a section is wildly out of date, rewrite it and note the divergence.
- Commit after each batch (per Git Discipline Rules).

View File

@ -41,10 +41,6 @@ class DateBuilderViewModel @Inject constructor(
_uiState.update { it.copy(duration = duration) } _uiState.update { it.copy(duration = duration) }
} }
fun setDateIdeaId(dateIdeaId: String) {
_uiState.update { it.copy(dateIdeaId = dateIdeaId) }
}
fun savePreference() { fun savePreference() {
val state = _uiState.value val state = _uiState.value

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:pathData="M10.9,5.25c0,-0.61 0.49,-1.1 1.1,-1.1s1.1,0.49 1.1,1.1v5.65h5.65c0.61,0 1.1,0.49 1.1,1.1s-0.49,1.1 -1.1,1.1H13.1v5.65c0,0.61 -0.49,1.1 -1.1,1.1s-1.1,-0.49 -1.1,-1.1V13.1H5.25c-0.61,0 -1.1,-0.49 -1.1,-1.1s0.49,-1.1 1.1,-1.1h5.65V5.25z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:pathData="M12,3.4c0.58,0 1.05,0.47 1.05,1.05v1.07c1.25,0.18 2.36,0.67 3.22,1.45c0.43,0.39 0.46,1.05 0.08,1.48c-0.39,0.43 -1.05,0.46 -1.48,0.08c-0.7,-0.63 -1.69,-0.98 -2.8,-0.98c-1.44,0 -2.37,0.6 -2.37,1.43c0,0.83 0.7,1.18 2.88,1.65c2.29,0.5 4.62,1.35 4.62,4.05c0,2.12 -1.65,3.58 -4.15,3.91v1.06c0,0.58 -0.47,1.05 -1.05,1.05s-1.05,-0.47 -1.05,-1.05v-1.08c-1.58,-0.24 -2.96,-0.91 -3.93,-1.91c-0.4,-0.42 -0.39,-1.08 0.03,-1.48c0.42,-0.4 1.08,-0.39 1.48,0.03c0.82,0.85 2.05,1.34 3.45,1.34c1.72,0 2.72,-0.67 2.72,-1.72c0,-0.95 -0.78,-1.35 -2.9,-1.82c-2.52,-0.55 -4.6,-1.42 -4.6,-3.9c0,-2.05 1.58,-3.45 3.75,-3.78V4.45c0,-0.58 0.47,-1.05 1.05,-1.05z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:pathData="M11.2,5.25c0.42,-0.42 1.1,-0.42 1.52,0c0.42,0.42 0.42,1.1 0,1.52L8.55,10.95h9.6c0.61,0 1.1,0.49 1.1,1.1s-0.49,1.1 -1.1,1.1h-9.6l4.17,4.18c0.42,0.42 0.42,1.1 0,1.52c-0.42,0.42 -1.1,0.42 -1.52,0l-6.05,-6.04c-0.42,-0.42 -0.42,-1.1 0,-1.52l6.05,-6.04z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M12,3.5c-3.1,0 -5.55,2.45 -5.55,5.55v2.72c0,0.73 -0.24,1.43 -0.68,2.01l-1.18,1.55c-0.55,0.72 -0.04,1.75 0.87,1.75h13.08c0.91,0 1.42,-1.03 0.87,-1.75l-1.18,-1.55c-0.44,-0.58 -0.68,-1.28 -0.68,-2.01V9.05C17.55,5.95 15.1,3.5 12,3.5zM9.3,18.25c0.42,1.15 1.44,1.95 2.7,1.95s2.28,-0.8 2.7,-1.95H9.3z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M12,3.1c0.42,0.58 1.4,1.75 1.4,2.8c0,0.77 -0.63,1.4 -1.4,1.4s-1.4,-0.63 -1.4,-1.4c0,-1.05 0.98,-2.22 1.4,-2.8zM10.95,8.35h2.1v2h4.35c1.1,0 2,0.9 2,2v1.95c-0.72,0.48 -1.44,0.72 -2.15,0.72c-0.88,0 -1.45,-0.35 -2.03,-0.72c-0.66,-0.41 -1.33,-0.83 -2.47,-0.83s-1.81,0.42 -2.47,0.83c-0.58,0.37 -1.15,0.72 -2.03,0.72c-0.73,0 -1.47,-0.25 -2.25,-0.77v-1.9c0,-1.1 0.9,-2 2,-2h2.95v-2zM4.6,16.55c1.23,0.66 2.42,0.97 3.65,0.97c1.58,0 2.55,-0.61 3.2,-1.01c0.5,-0.31 0.76,-0.49 1.3,-0.49s0.8,0.18 1.3,0.49c0.65,0.4 1.62,1.01 3.2,1.01c0.72,0 1.43,-0.11 2.15,-0.35v1.23c0,1.1 -0.9,2 -2,2H6.6c-1.1,0 -2,-0.9 -2,-2v-1.85z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M7.2,3.4c0.58,0 1.05,0.47 1.05,1.05v0.8h7.5v-0.8c0,-0.58 0.47,-1.05 1.05,-1.05s1.05,0.47 1.05,1.05v0.8h0.9c1.1,0 2,0.9 2,2v10.9c0,1.1 -0.9,2 -2,2H5.25c-1.1,0 -2,-0.9 -2,-2V7.25c0,-1.1 0.9,-2 2,-2h0.9v-0.8c0,-0.58 0.47,-1.05 1.05,-1.05zM5.45,9.55h13.1v8.4H5.45v-8.4zM8,11.45h2.05v2.05H8v-2.05zM11,11.45h2.05v2.05H11v-2.05zM14,11.45h2.05v2.05H14v-2.05zM8,14.45h2.05v2.05H8v-2.05zM11,14.45h2.05v2.05H11v-2.05z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M8.1,5.25c0.34,-0.7 1.05,-1.15 1.83,-1.15h4.14c0.78,0 1.49,0.45 1.83,1.15l0.52,1.05h2.38c1.1,0 2,0.9 2,2v8.9c0,1.1 -0.9,2 -2,2H5.2c-1.1,0 -2,-0.9 -2,-2V8.3c0,-1.1 0.9,-2 2,-2h2.38l0.52,-1.05zM12,8.45c2.21,0 4,1.79 4,4s-1.79,4 -4,4s-4,-1.79 -4,-4s1.79,-4 4,-4zM12,10.55c1.05,0 1.9,0.85 1.9,1.9s-0.85,1.9 -1.9,1.9s-1.9,-0.85 -1.9,-1.9s0.85,-1.9 1.9,-1.9z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M8.2,4.2c1.25,0 2.3,0.75 2.78,1.82L12,8.3l1.02,-2.28c0.48,-1.07 1.53,-1.82 2.78,-1.82c1.68,0 3.05,1.37 3.05,3.05c0,0.49 -0.12,0.95 -0.32,1.35h0.72c1.1,0 2,0.9 2,2v2.1c0,0.78 -0.45,1.45 -1.1,1.78v3.72c0,1.1 -0.9,2 -2,2H5.85c-1.1,0 -2,-0.9 -2,-2v-3.72c-0.65,-0.33 -1.1,-1 -1.1,-1.78v-2.1c0,-1.1 0.9,-2 2,-2h0.72c-0.2,-0.4 -0.32,-0.86 -0.32,-1.35c0,-1.68 1.37,-3.05 3.05,-3.05zM7.95,6.25c-0.62,0 -1.12,0.5 -1.12,1.12s0.5,1.12 1.12,1.12h2.2L9.58,7.2c-0.3,-0.58 -0.86,-0.95 -1.63,-0.95zM16.05,6.25c-0.77,0 -1.33,0.37 -1.63,0.95l-0.57,1.29h2.2c0.62,0 1.12,-0.5 1.12,-1.12s-0.5,-1.12 -1.12,-1.12zM5.05,10.75v1.45h5.85v-1.45H5.05zM13.1,10.75v1.45h5.85v-1.45H13.1zM10.9,14.35H6.05v3.65h4.85v-3.65zM13.1,18h4.85v-3.65H13.1V18z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M5.2,5h13.6c1.1,0 2,0.9 2,2v8.4c0,1.1 -0.9,2 -2,2h-7.15l-4.18,2.57c-0.6,0.37 -1.37,-0.06 -1.37,-0.76V17.4h-0.9c-1.1,0 -2,-0.9 -2,-2V7c0,-1.1 0.9,-2 2,-2zM7.2,9.35c0,-0.5 0.4,-0.9 0.9,-0.9h7.8c0.5,0 0.9,0.4 0.9,0.9s-0.4,0.9 -0.9,0.9H8.1c-0.5,0 -0.9,-0.4 -0.9,-0.9zM8.1,12.25c-0.5,0 -0.9,0.4 -0.9,0.9s0.4,0.9 0.9,0.9h4.75c0.5,0 0.9,-0.4 0.9,-0.9s-0.4,-0.9 -0.9,-0.9H8.1z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:pathData="M9.55,16.55L5.2,12.2c-0.43,-0.43 -1.13,-0.43 -1.56,0c-0.43,0.43 -0.43,1.13 0,1.56l5.13,5.13c0.43,0.43 1.13,0.43 1.56,0l10.03,-10.03c0.43,-0.43 0.43,-1.13 0,-1.56c-0.43,-0.43 -1.13,-0.43 -1.56,0L9.55,16.55z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:pathData="M6.45,4.9c-0.43,-0.43 -1.12,-0.43 -1.55,0c-0.43,0.43 -0.43,1.12 0,1.55L10.45,12L4.9,17.55c-0.43,0.43 -0.43,1.12 0,1.55c0.43,0.43 1.12,0.43 1.55,0L12,13.55l5.55,5.55c0.43,0.43 1.12,0.43 1.55,0c0.43,-0.43 0.43,-1.12 0,-1.55L13.55,12l5.55,-5.55c0.43,-0.43 0.43,-1.12 0,-1.55c-0.43,-0.43 -1.12,-0.43 -1.55,0L12,10.45L6.45,4.9z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M8.2,3.8h8.4c1.1,0 2,0.9 2,2v8.4c0,1.1 -0.9,2 -2,2H8.2c-1.1,0 -2,-0.9 -2,-2V5.8c0,-1.1 0.9,-2 2,-2zM5.4,7.6h-0.5c-1.1,0 -2,0.9 -2,2v8.6c0,1.1 0.9,2 2,2h8.6c1.1,0 2,-0.9 2,-2v-0.5H7.4c-1.1,0 -2,-0.9 -2,-2V7.6z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M8.5,4.8c1.64,0 2.98,1.34 2.98,2.98s-1.34,2.98 -2.98,2.98s-2.98,-1.34 -2.98,-2.98S6.86,4.8 8.5,4.8zM15.5,4.8c1.64,0 2.98,1.34 2.98,2.98s-1.34,2.98 -2.98,2.98s-2.98,-1.34 -2.98,-2.98S13.86,4.8 15.5,4.8zM3.35,18.75c0.56,-3.1 2.58,-5.15 5.15,-5.15c1.5,0 2.82,0.7 3.5,1.86c0.68,-1.16 2,-1.86 3.5,-1.86c2.57,0 4.59,2.05 5.15,5.15c0.12,0.66 -0.39,1.25 -1.06,1.25H4.41c-0.67,0 -1.18,-0.59 -1.06,-1.25z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M16.9,3.95c0.8,-0.8 2.1,-0.8 2.9,0l0.25,0.25c0.8,0.8 0.8,2.1 0,2.9l-1.35,1.35l-3.15,-3.15l1.35,-1.35zM14.05,6.8L5.1,15.75c-0.15,0.15 -0.26,0.33 -0.32,0.53l-1.05,3.4c-0.25,0.8 0.49,1.54 1.29,1.29l3.4,-1.05c0.2,-0.06 0.38,-0.17 0.53,-0.32l8.95,-8.95l-3.85,-3.85z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M12,5.6c4.1,0 7.1,2.45 8.75,5.75c0.2,0.41 0.2,0.89 0,1.3C19.1,15.95 16.1,18.4 12,18.4s-7.1,-2.45 -8.75,-5.75c-0.2,-0.41 -0.2,-0.89 0,-1.3C4.9,8.05 7.9,5.6 12,5.6zM12,8.45c1.96,0 3.55,1.59 3.55,3.55S13.96,15.55 12,15.55S8.45,13.96 8.45,12S10.04,8.45 12,8.45zM12,10.55c0.8,0 1.45,0.65 1.45,1.45S12.8,13.45 12,13.45S10.55,12.8 10.55,12S11.2,10.55 12,10.55z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M5.15,3.8c-0.39,-0.39 -1.02,-0.39 -1.41,0c-0.39,0.39 -0.39,1.02 0,1.41l15.05,15.05c0.39,0.39 1.02,0.39 1.41,0c0.39,-0.39 0.39,-1.02 0,-1.41l-2.35,-2.35c1.2,-0.98 2.18,-2.29 2.9,-3.85c0.19,-0.41 0.19,-0.89 0,-1.3C19.1,8.05 16.1,5.6 12,5.6c-1.31,0 -2.5,0.25 -3.57,0.7L5.15,3.8zM10.33,8.2c0.5,-0.2 1.06,-0.3 1.67,-0.3c2.26,0 4.25,1.36 5.65,4.1c-0.46,0.9 -1.01,1.67 -1.64,2.28l-1.66,-1.66c0.13,-0.36 0.2,-0.77 0.2,-1.2c0,-1.96 -1.59,-3.55 -3.55,-3.55c-0.24,0 -0.46,0.03 -0.67,0.08v0.25zM3.25,11.35c0.77,-1.54 1.83,-2.84 3.12,-3.82l2.23,2.23c-0.1,0.36 -0.15,0.74 -0.15,1.14c0,1.96 1.59,3.55 3.55,3.55c0.4,0 0.78,-0.05 1.14,-0.15l2.03,2.03c-0.96,0.42 -2.02,0.67 -3.17,0.67c-4.1,0 -7.1,-2.45 -8.75,-5.75c-0.2,-0.41 -0.2,-0.89 0,-1.3z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:pathData="M12,3.4c2.15,0 4.1,0.82 5.58,2.18c0.42,0.39 0.45,1.05 0.06,1.47c-0.39,0.42 -1.05,0.45 -1.47,0.06C15.07,6.1 13.6,5.5 12,5.5s-3.07,0.6 -4.17,1.61c-0.42,0.39 -1.08,0.36 -1.47,-0.06c-0.39,-0.42 -0.36,-1.08 0.06,-1.47C7.9,4.22 9.85,3.4 12,3.4zM12,7.2c3.02,0 5.3,2.14 5.3,4.95c0,2.32 -0.35,4.36 -1.07,6.14c-0.22,0.53 -0.82,0.79 -1.35,0.57c-0.53,-0.21 -0.79,-0.82 -0.57,-1.35c0.61,-1.5 0.91,-3.28 0.91,-5.36c0,-1.62 -1.32,-2.87 -3.22,-2.87s-3.22,1.25 -3.22,2.87c0,0.65 -0.11,1.38 -0.32,2.16c-0.15,0.55 -0.72,0.88 -1.27,0.73c-0.55,-0.15 -0.88,-0.72 -0.73,-1.27c0.17,-0.6 0.24,-1.15 0.24,-1.62C6.7,9.34 8.98,7.2 12,7.2zM12,10.95c0.57,0 1.04,0.47 1.04,1.04c0,3.19 -0.63,5.8 -1.88,7.84c-0.3,0.49 -0.94,0.64 -1.43,0.34c-0.49,-0.3 -0.64,-0.94 -0.34,-1.43c1.03,-1.68 1.57,-3.93 1.57,-6.75c0,-0.57 0.47,-1.04 1.04,-1.04z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:pathData="M12.8,5.25c-0.42,-0.42 -1.1,-0.42 -1.52,0c-0.42,0.42 -0.42,1.1 0,1.52l4.17,4.18h-9.6c-0.61,0 -1.1,0.49 -1.1,1.1s0.49,1.1 1.1,1.1h9.6l-4.17,4.18c-0.42,0.42 -0.42,1.1 0,1.52c0.42,0.42 1.1,0.42 1.52,0l6.05,-6.04c0.42,-0.42 0.42,-1.1 0,-1.52l-6.05,-6.04z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:pathData="M12,20.35c-0.28,0 -0.56,-0.1 -0.78,-0.3C6.2,15.62 3.6,12.95 3.6,9.35c0,-2.7 2.05,-4.75 4.72,-4.75c1.45,0 2.78,0.66 3.68,1.7c0.9,-1.04 2.23,-1.7 3.68,-1.7c2.67,0 4.72,2.05 4.72,4.75c0,3.6 -2.6,6.27 -7.62,10.7c-0.22,0.2 -0.5,0.3 -0.78,0.3zM10.95,8.1c-0.55,-0.9 -1.45,-1.35 -2.48,-1.35c-1.45,0 -2.52,1.08 -2.52,2.6c0,2.33 1.72,4.25 6.05,8.12c4.33,-3.87 6.05,-5.79 6.05,-8.12c0,-1.52 -1.07,-2.6 -2.52,-2.6c-1.03,0 -1.93,0.45 -2.48,1.35L12,9.8l-1.05,-1.7z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M8.32,4.6c1.45,0 2.78,0.66 3.68,1.7c0.9,-1.04 2.23,-1.7 3.68,-1.7c2.67,0 4.72,2.05 4.72,4.75c0,3.6 -2.6,6.27 -7.62,10.7c-0.45,0.4 -1.11,0.4 -1.56,0C6.2,15.62 3.6,12.95 3.6,9.35c0,-2.7 2.05,-4.75 4.72,-4.75zM8.47,6.75c-1.45,0 -2.52,1.08 -2.52,2.6c0,2.33 1.72,4.25 6.05,8.12c4.33,-3.87 6.05,-5.79 6.05,-8.12c0,-1.52 -1.07,-2.6 -2.52,-2.6c-1.03,0 -1.93,0.45 -2.48,1.35L12,9.8l-1.05,-1.7c-0.55,-0.9 -1.45,-1.35 -2.48,-1.35zM8.53,8.45c0.43,0 0.82,0.2 1.05,0.58L12,12.95l2.42,-3.92c0.23,-0.38 0.62,-0.58 1.05,-0.58c0.5,0 0.9,0.4 0.9,0.9c0,1.1 -1.14,2.44 -4.37,5.4c-3.23,-2.96 -4.37,-4.3 -4.37,-5.4c0,-0.5 0.4,-0.9 0.9,-0.9z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M11.27,3.65c0.42,-0.34 1.04,-0.34 1.46,0l7.45,6.05c0.43,0.35 0.5,0.98 0.15,1.41c-0.25,0.31 -0.66,0.43 -1.03,0.33v6.56c0,1.1 -0.9,2 -2,2h-3.2v-5.05c0,-0.61 -0.49,-1.1 -1.1,-1.1h-2c-0.61,0 -1.1,0.49 -1.1,1.1V20H6.7c-1.1,0 -2,-0.9 -2,-2v-6.56c-0.37,0.1 -0.78,-0.02 -1.03,-0.33c-0.35,-0.43 -0.28,-1.06 0.15,-1.41l7.45,-6.05z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M6.2,3.8h11.6c0.61,0 1.1,0.49 1.1,1.1s-0.49,1.1 -1.1,1.1h-0.35v2.05c0,1.28 -0.6,2.48 -1.62,3.25L14.9,12l0.93,0.7c1.02,0.77 1.62,1.97 1.62,3.25V18h0.35c0.61,0 1.1,0.49 1.1,1.1s-0.49,1.1 -1.1,1.1H6.2c-0.61,0 -1.1,-0.49 -1.1,-1.1S5.59,18 6.2,18h0.35v-2.05c0,-1.28 0.6,-2.48 1.62,-3.25L9.1,12l-0.93,-0.7c-1.02,-0.77 -1.62,-1.97 -1.62,-3.25V6H6.2c-0.61,0 -1.1,-0.49 -1.1,-1.1s0.49,-1.1 1.1,-1.1zM8.75,6v2.05c0,0.59 0.28,1.15 0.75,1.5L12,11.43l2.5,-1.88c0.47,-0.35 0.75,-0.91 0.75,-1.5V6h-6.5zM12,12.57l-2.5,1.88c-0.47,0.35 -0.75,0.91 -0.75,1.5V18h6.5v-2.05c0,-0.59 -0.28,-1.15 -0.75,-1.5L12,12.57z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M8.1,13.95c-2.15,0 -3.9,-1.75 -3.9,-3.9s1.75,-3.9 3.9,-3.9s3.9,1.75 3.9,3.9c0,0.33 -0.04,0.65 -0.12,0.95h7.12c0.61,0 1.1,0.49 1.1,1.1v2.15c0,0.61 -0.49,1.1 -1.1,1.1h-1.75v1.55c0,0.61 -0.49,1.1 -1.1,1.1H14c-0.61,0 -1.1,-0.49 -1.1,-1.1v-1.55h-2.36c-0.7,-0.85 -1.54,-1.4 -2.44,-1.4zM8.1,8.35c0.94,0 1.7,0.76 1.7,1.7s-0.76,1.7 -1.7,1.7s-1.7,-0.76 -1.7,-1.7s0.76,-1.7 1.7,-1.7z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M7.15,10.1V8.55C7.15,5.87 9.32,3.7 12,3.7s4.85,2.17 4.85,4.85v1.55h0.65c1.1,0 2,0.9 2,2v5.6c0,1.1 -0.9,2 -2,2h-11c-1.1,0 -2,-0.9 -2,-2v-5.6c0,-1.1 0.9,-2 2,-2h0.65zM9.35,10.1h5.3V8.55c0,-1.46 -1.19,-2.65 -2.65,-2.65S9.35,7.09 9.35,8.55v1.55zM12,13.1c-0.8,0 -1.45,0.65 -1.45,1.45c0,0.48 0.24,0.91 0.6,1.18v1.42h1.7v-1.42c0.36,-0.27 0.6,-0.7 0.6,-1.18c0,-0.8 -0.65,-1.45 -1.45,-1.45z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M8.9,9.95h8.6c1.1,0 2,0.9 2,2v5.75c0,1.1 -0.9,2 -2,2h-11c-1.1,0 -2,-0.9 -2,-2v-5.75c0,-1.1 0.9,-2 2,-2h0.2V8.35C6.7,5.78 8.78,3.7 11.35,3.7c2.14,0 3.95,1.45 4.49,3.42c0.16,0.59 -0.19,1.19 -0.78,1.35c-0.58,0.16 -1.19,-0.19 -1.35,-0.78c-0.29,-1.03 -1.23,-1.79 -2.36,-1.79c-1.35,0 -2.45,1.1 -2.45,2.45v1.6zM12,12.95c-0.8,0 -1.45,0.65 -1.45,1.45c0,0.48 0.24,0.91 0.6,1.18V17h1.7v-1.42c0.36,-0.27 0.6,-0.7 0.6,-1.18c0,-0.8 -0.65,-1.45 -1.45,-1.45z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M12,3.5c1.75,0 3.15,1.4 3.15,3.15v5.1c0,1.75 -1.4,3.15 -3.15,3.15s-3.15,-1.4 -3.15,-3.15v-5.1c0,-1.75 1.4,-3.15 3.15,-3.15zM5.55,10.9c0.58,0 1.05,0.47 1.05,1.05c0,2.96 2.34,5.3 5.4,5.3s5.4,-2.34 5.4,-5.3c0,-0.58 0.47,-1.05 1.05,-1.05s1.05,0.47 1.05,1.05c0,3.72 -2.75,6.73 -6.4,7.28v1.42h2.25c0.58,0 1.05,0.47 1.05,1.05s-0.47,1.05 -1.05,1.05h-6.7c-0.58,0 -1.05,-0.47 -1.05,-1.05s0.47,-1.05 1.05,-1.05h2.25v-1.42c-3.65,-0.55 -6.4,-3.56 -6.4,-7.28c0,-0.58 0.47,-1.05 1.05,-1.05z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:pathData="M13.25,4.6c0,-0.61 0.49,-1.1 1.1,-1.1h5.05c0.61,0 1.1,0.49 1.1,1.1v5.05c0,0.61 -0.49,1.1 -1.1,1.1s-1.1,-0.49 -1.1,-1.1V7.25l-6.38,6.38c-0.43,0.43 -1.13,0.43 -1.56,0c-0.43,-0.43 -0.43,-1.13 0,-1.56l6.38,-6.38h-2.4c-0.61,0 -1.1,-0.49 -1.1,-1.1zM5.8,5.2h4.35c0.61,0 1.1,0.49 1.1,1.1s-0.49,1.1 -1.1,1.1H6.3v10.3h10.3v-3.85c0,-0.61 0.49,-1.1 1.1,-1.1s1.1,0.49 1.1,1.1v4.35c0,0.94 -0.76,1.7 -1.7,1.7H5.8c-0.94,0 -1.7,-0.76 -1.7,-1.7V6.9c0,-0.94 0.76,-1.7 1.7,-1.7z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M12,3.8c-4.75,0 -8.6,3.54 -8.6,7.9c0,3.77 2.87,6.7 6.55,6.7h1.45c0.75,0 1.2,0.72 0.88,1.38c-0.34,0.7 0.18,1.52 0.96,1.52h0.36c3.86,0 7,-3.13 7,-7V12c0,-4.53 -3.85,-8.2 -8.6,-8.2zM7.55,11.2c-0.8,0 -1.45,-0.65 -1.45,-1.45S6.75,8.3 7.55,8.3S9,8.95 9,9.75S8.35,11.2 7.55,11.2zM10.6,8.35c0,-0.8 0.65,-1.45 1.45,-1.45s1.45,0.65 1.45,1.45s-0.65,1.45 -1.45,1.45s-1.45,-0.65 -1.45,-1.45zM16.45,11.2c-0.8,0 -1.45,-0.65 -1.45,-1.45s0.65,-1.45 1.45,-1.45s1.45,0.65 1.45,1.45s-0.65,1.45 -1.45,1.45zM8.55,14.75c0,-0.8 0.65,-1.45 1.45,-1.45s1.45,0.65 1.45,1.45s-0.65,1.45 -1.45,1.45s-1.45,-0.65 -1.45,-1.45z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:pathData="M7.3,4.4h2.8c0.72,0 1.3,0.58 1.3,1.3v12.6c0,0.72 -0.58,1.3 -1.3,1.3H7.3c-0.72,0 -1.3,-0.58 -1.3,-1.3V5.7c0,-0.72 0.58,-1.3 1.3,-1.3zM13.9,4.4h2.8c0.72,0 1.3,0.58 1.3,1.3v12.6c0,0.72 -0.58,1.3 -1.3,1.3h-2.8c-0.72,0 -1.3,-0.58 -1.3,-1.3V5.7c0,-0.72 0.58,-1.3 1.3,-1.3z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M12,4.4c2.03,0 3.68,1.65 3.68,3.68S14.03,11.76 12,11.76S8.32,10.11 8.32,8.08S9.97,4.4 12,4.4zM5.55,18.45c0.78,-3.1 3.32,-5.05 6.45,-5.05s5.67,1.95 6.45,5.05c0.17,0.68 -0.36,1.35 -1.06,1.35H6.61c-0.7,0 -1.23,-0.67 -1.06,-1.35z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M5.2,4.6h13.6c1.1,0 2,0.9 2,2v10.8c0,1.1 -0.9,2 -2,2H5.2c-1.1,0 -2,-0.9 -2,-2V6.6c0,-1.1 0.9,-2 2,-2zM6.1,16.8h11.8l-3.75,-4.8c-0.33,-0.43 -0.97,-0.43 -1.3,0l-2.15,2.75l-1.18,-1.42c-0.34,-0.41 -0.96,-0.39 -1.28,0.04L6.1,16.8zM16.35,8.1c0.88,0 1.6,0.72 1.6,1.6s-0.72,1.6 -1.6,1.6s-1.6,-0.72 -1.6,-1.6s0.72,-1.6 1.6,-1.6z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:pathData="M8.1,5.2c0,-0.86 0.94,-1.39 1.68,-0.95l9.2,5.53c0.72,0.43 0.72,1.48 0,1.91l-9.2,5.53c-0.74,0.44 -1.68,-0.09 -1.68,-0.95V5.2z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M12,3.7c3.45,0 6.25,2.62 6.25,5.9c0,1.47 -0.57,2.8 -1.5,3.83v2.02c0,0.95 -0.77,1.72 -1.72,1.72h-1.58v1.03c0,0.95 -0.77,1.72 -1.72,1.72h-2.5c-0.95,0 -1.72,-0.77 -1.72,-1.72v-2.22C5.95,14.9 5.75,13.88 5.75,12.6V9.6c0,-3.28 2.8,-5.9 6.25,-5.9zM9.4,8c0.95,0 1.72,0.77 1.72,1.72c0,0.25 -0.05,0.48 -0.14,0.69L12,11.44l1.02,-1.03c-0.09,-0.21 -0.14,-0.44 -0.14,-0.69c0,-0.95 0.77,-1.72 1.72,-1.72s1.72,0.77 1.72,1.72s-0.77,1.72 -1.72,1.72c-0.25,0 -0.48,-0.05 -0.69,-0.14l-0.86,0.86l0.86,0.86c0.21,-0.09 0.44,-0.14 0.69,-0.14c0.95,0 1.72,0.77 1.72,1.72s-0.77,1.72 -1.72,1.72s-1.72,-0.77 -1.72,-1.72c0,-0.25 0.05,-0.48 0.14,-0.69L12,12.86l-1.02,1.03c0.09,0.21 0.14,0.44 0.14,0.69c0,0.95 -0.77,1.72 -1.72,1.72s-1.72,-0.77 -1.72,-1.72s0.77,-1.72 1.72,-1.72c0.25,0 0.48,0.05 0.69,0.14l0.86,-0.86l-0.86,-0.86c-0.21,0.09 -0.44,0.14 -0.69,0.14c-0.95,0 -1.72,-0.77 -1.72,-1.72S8.45,8 9.4,8z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M5.1,4.6h10.1c1.1,0 2,0.9 2,2v6.1c0,1.1 -0.9,2 -2,2H9.8l-3.45,2.12c-0.6,0.37 -1.35,-0.06 -1.35,-0.76V14.7c-1.04,-0.06 -1.9,-0.93 -1.9,-2V6.6c0,-1.1 0.9,-2 2,-2zM7.35,7.95c0,-0.5 0.4,-0.9 0.9,-0.9h3.8c0.5,0 0.9,0.4 0.9,0.9s-0.4,0.9 -0.9,0.9h-3.8c-0.5,0 -0.9,-0.4 -0.9,-0.9zM8.25,10.25c-0.5,0 -0.9,0.4 -0.9,0.9s0.4,0.9 0.9,0.9h5.1c0.5,0 0.9,-0.4 0.9,-0.9s-0.4,-0.9 -0.9,-0.9h-5.1zM18.1,8.7h0.8c1.1,0 2,0.9 2,2v5.2c0,1.1 -0.9,2 -2,2h-0.05v1.25c0,0.7 -0.75,1.13 -1.35,0.76l-3.27,-2.01h-3.1c-0.84,0 -1.56,-0.52 -1.86,-1.25h5.93c2.18,0 3.9,-1.72 3.9,-3.9V8.7z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:pathData="M12,4.25c2.25,0 4.28,0.96 5.7,2.49V5.65c0,-0.58 0.47,-1.05 1.05,-1.05s1.05,0.47 1.05,1.05v4.1c0,0.58 -0.47,1.05 -1.05,1.05h-4.1c-0.58,0 -1.05,-0.47 -1.05,-1.05s0.47,-1.05 1.05,-1.05h1.63c-1.02,-1.43 -2.57,-2.35 -4.28,-2.35c-2.39,0 -4.45,1.73 -5,4.11c-0.13,0.57 -0.69,0.92 -1.26,0.79c-0.57,-0.13 -0.92,-0.69 -0.79,-1.26C5.72,6.63 8.65,4.25 12,4.25zM18.26,12.75c0.57,0.13 0.92,0.69 0.79,1.26c-0.77,3.36 -3.7,5.74 -7.05,5.74c-2.25,0 -4.28,-0.96 -5.7,-2.49v1.09c0,0.58 -0.47,1.05 -1.05,1.05s-1.05,-0.47 -1.05,-1.05v-4.1c0,-0.58 0.47,-1.05 1.05,-1.05h4.1c0.58,0 1.05,0.47 1.05,1.05s-0.47,1.05 -1.05,1.05H7.72c1.02,1.43 2.57,2.35 4.28,2.35c2.39,0 4.45,-1.73 5,-4.11c0.13,-0.57 0.69,-0.92 1.26,-0.79z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:pathData="M4.2,4.5c-0.76,-0.31 -1.47,0.45 -1.1,1.18l2.62,5.22h6.48c0.61,0 1.1,0.49 1.1,1.1s-0.49,1.1 -1.1,1.1H5.72L3.1,18.32c-0.37,0.73 0.34,1.49 1.1,1.18l16.25,-6.67c0.78,-0.32 0.78,-1.42 0,-1.74L4.2,4.5z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M10.85,3.4h2.3c0.54,0 0.99,0.39 1.08,0.92l0.25,1.55c0.43,0.15 0.84,0.32 1.22,0.51l1.28,-0.92c0.44,-0.32 1.04,-0.27 1.42,0.11l1.63,1.63c0.38,0.38 0.43,0.98 0.11,1.42l-0.92,1.28c0.2,0.39 0.37,0.8 0.51,1.22l1.55,0.25c0.53,0.09 0.92,0.54 0.92,1.08v2.3c0,0.54 -0.39,0.99 -0.92,1.08l-1.55,0.25c-0.14,0.42 -0.31,0.83 -0.51,1.22l0.92,1.28c0.32,0.44 0.27,1.04 -0.11,1.42l-1.63,1.63c-0.38,0.38 -0.98,0.43 -1.42,0.11l-1.28,-0.92c-0.38,0.19 -0.79,0.36 -1.22,0.51l-0.25,1.55c-0.09,0.53 -0.54,0.92 -1.08,0.92h-2.3c-0.54,0 -0.99,-0.39 -1.08,-0.92l-0.25,-1.55c-0.43,-0.15 -0.84,-0.32 -1.22,-0.51l-1.28,0.92c-0.44,0.32 -1.04,0.27 -1.42,-0.11L3.98,20c-0.38,-0.38 -0.43,-0.98 -0.11,-1.42l0.92,-1.28c-0.2,-0.39 -0.37,-0.8 -0.51,-1.22l-1.55,-0.25c-0.53,-0.09 -0.92,-0.54 -0.92,-1.08v-2.3c0,-0.54 0.39,-0.99 0.92,-1.08l1.55,-0.25c0.14,-0.42 0.31,-0.83 0.51,-1.22L3.87,8.62C3.55,8.18 3.6,7.58 3.98,7.2l1.63,-1.63c0.38,-0.38 0.98,-0.43 1.42,-0.11l1.28,0.92c0.38,-0.19 0.79,-0.36 1.22,-0.51l0.25,-1.55c0.09,-0.53 0.54,-0.92 1.08,-0.92zM12,9.1c1.93,0 3.5,1.57 3.5,3.5s-1.57,3.5 -3.5,3.5s-3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M17.4,4.25c1.46,0 2.65,1.19 2.65,2.65s-1.19,2.65 -2.65,2.65c-0.77,0 -1.46,-0.33 -1.94,-0.85l-5.65,2.77c0.03,0.17 0.04,0.35 0.04,0.53c0,0.18 -0.01,0.36 -0.04,0.53l5.65,2.77c0.48,-0.52 1.17,-0.85 1.94,-0.85c1.46,0 2.65,1.19 2.65,2.65s-1.19,2.65 -2.65,2.65s-2.65,-1.19 -2.65,-2.65c0,-0.18 0.02,-0.35 0.05,-0.52l-5.66,-2.78c-0.49,0.52 -1.18,0.84 -1.94,0.84c-1.46,0 -2.65,-1.19 -2.65,-2.65s1.19,-2.65 2.65,-2.65c0.76,0 1.45,0.32 1.94,0.84l5.66,-2.78c-0.03,-0.17 -0.05,-0.34 -0.05,-0.52c0,-1.46 1.19,-2.65 2.65,-2.65z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M11.62,3.45c0.25,-0.1 0.51,-0.1 0.76,0l6.1,2.45c0.42,0.17 0.7,0.58 0.7,1.03v4.55c0,3.76 -2.28,6.84 -6.67,9.02c-0.32,0.16 -0.7,0.16 -1.02,0c-4.39,-2.18 -6.67,-5.26 -6.67,-9.02V6.93c0,-0.45 0.28,-0.86 0.7,-1.03l6.1,-2.45zM15.92,9.55c0.4,0.4 0.4,1.05 0,1.45l-4.3,4.3c-0.4,0.4 -1.05,0.4 -1.45,0l-2.1,-2.1c-0.4,-0.4 -0.4,-1.05 0,-1.45c0.4,-0.4 1.05,-0.4 1.45,0l1.38,1.38l3.58,-3.58c0.4,-0.4 1.05,-0.4 1.45,0z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:pathData="M12,3.45c0.44,0 0.84,0.27 1,0.68l1.75,4.43l4.75,0.29c0.45,0.03 0.84,0.33 0.99,0.76c0.14,0.43 0,0.9 -0.34,1.19l-3.67,3.03l1.19,4.61c0.11,0.44 -0.05,0.9 -0.42,1.17c-0.36,0.27 -0.85,0.29 -1.23,0.05L12,17.1l-4.02,2.56c-0.38,0.24 -0.87,0.22 -1.23,-0.05c-0.37,-0.27 -0.53,-0.73 -0.42,-1.17l1.19,-4.61l-3.67,-3.03c-0.35,-0.29 -0.48,-0.76 -0.34,-1.19c0.15,-0.43 0.54,-0.73 0.99,-0.76l4.75,-0.29L11,4.13c0.16,-0.41 0.56,-0.68 1,-0.68z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:pathData="M12.2,3.3c0.45,1.85 -0.15,3.25 -1.18,4.42c-0.83,0.95 -1.92,1.76 -2.78,2.76c-0.8,0.93 -1.34,2.04 -1.34,3.62c0,3 2.3,5.6 5.1,5.6s5.1,-2.6 5.1,-5.6c0,-1.38 -0.45,-2.47 -1.1,-3.38c-0.25,0.72 -0.65,1.35 -1.2,1.88c-0.38,0.37 -1,0.27 -1.24,-0.2c-0.7,-1.37 -0.45,-2.57 -0.15,-3.72c0.38,-1.48 0.82,-2.9 -1.21,-5.38zM12,11.85c1.65,1.1 2.65,2.25 2.65,3.72c0,1.54 -1.17,2.78 -2.65,2.78s-2.65,-1.24 -2.65,-2.78c0,-1.47 1,-2.62 2.65,-3.72z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:pathData="M7.1,7.25c1.22,-1.2 2.9,-1.95 4.75,-1.95c2.48,0 4.64,1.34 5.82,3.34l-1.03,0c-0.57,0 -1.04,0.46 -1.04,1.04c0,0.57 0.47,1.04 1.04,1.04h3.3c0.57,0 1.04,-0.47 1.04,-1.04v-3.3c0,-0.57 -0.47,-1.04 -1.04,-1.04c-0.58,0 -1.04,0.47 -1.04,1.04v0.56C17.33,4.63 14.75,3.2 11.85,3.2c-2.42,0 -4.62,0.98 -6.2,2.57c-0.41,0.4 -0.41,1.06 0,1.47c0.4,0.41 1.05,0.41 1.45,0.01zM16.9,16.75c-1.22,1.2 -2.9,1.95 -4.75,1.95c-2.48,0 -4.64,-1.34 -5.82,-3.34h1.03c0.57,0 1.04,-0.46 1.04,-1.04c0,-0.57 -0.47,-1.04 -1.04,-1.04h-3.3c-0.57,0 -1.04,0.47 -1.04,1.04v3.3c0,0.57 0.47,1.04 1.04,1.04c0.58,0 1.04,-0.47 1.04,-1.04v-0.56c1.57,2.31 4.15,3.74 7.05,3.74c2.42,0 4.62,-0.98 6.2,-2.57c0.41,-0.4 0.41,-1.06 0,-1.47c-0.4,-0.41 -1.05,-0.41 -1.45,-0.01z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M6.2,5.8c1.15,0 2.1,0.95 2.1,2.1c0,0.17 -0.02,0.34 -0.06,0.5l2.44,1.7c0.36,-0.28 0.81,-0.45 1.32,-0.45c0.52,0 0.99,0.18 1.36,0.49l2.48,-1.85c-0.03,-0.14 -0.04,-0.28 -0.04,-0.43c0,-1.15 0.95,-2.1 2.1,-2.1s2.1,0.95 2.1,2.1s-0.95,2.1 -2.1,2.1c-0.32,0 -0.62,-0.07 -0.88,-0.2l-2.7,2c0.02,0.12 0.03,0.24 0.03,0.37c0,1.15 -0.95,2.1 -2.1,2.1c-0.44,0 -0.84,-0.13 -1.17,-0.36l-2.62,2.18c0.03,0.16 0.04,0.32 0.04,0.49c0,1.15 -0.95,2.1 -2.1,2.1s-2.1,-0.95 -2.1,-2.1s0.95,-2.1 2.1,-2.1c0.31,0 0.6,0.07 0.86,0.19l2.82,-2.35v-0.15c0,-0.13 0.01,-0.26 0.04,-0.38L7.25,9.78c-0.31,0.14 -0.67,0.22 -1.05,0.22c-1.15,0 -2.1,-0.95 -2.1,-2.1s0.95,-2.1 2.1,-2.1z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M9.1,3.7h5.8c0.61,0 1.1,0.49 1.1,1.1v1.1h3.1c0.61,0 1.1,0.49 1.1,1.1s-0.49,1.1 -1.1,1.1h-0.55l-0.72,10.1c-0.08,1.1 -0.99,1.95 -2.09,1.95H8.26c-1.1,0 -2.01,-0.85 -2.09,-1.95L5.45,8.1H4.9c-0.61,0 -1.1,-0.49 -1.1,-1.1s0.49,-1.1 1.1,-1.1H8V4.8c0,-0.61 0.49,-1.1 1.1,-1.1zM10.2,5.9h3.6v-0.1h-3.6v0.1zM9.5,10.25c0.55,0 1,0.45 1,1v5.2c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1v-5.2c0,-0.55 0.45,-1 1,-1zM14.5,10.25c0.55,0 1,0.45 1,1v5.2c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1v-5.2c0,-0.55 0.45,-1 1,-1z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:pathData="M16.3,5.1h3.6c0.61,0 1.1,0.49 1.1,1.1v3.6c0,0.61 -0.49,1.1 -1.1,1.1s-1.1,-0.49 -1.1,-1.1V8.85l-5.18,5.18c-0.43,0.43 -1.13,0.43 -1.56,0l-2.72,-2.72l-4.23,4.23c-0.43,0.43 -1.13,0.43 -1.56,0c-0.43,-0.43 -0.43,-1.13 0,-1.56l5.01,-5.01c0.43,-0.43 1.13,-0.43 1.56,0l2.72,2.72l4.4,-4.39H16.3c-0.61,0 -1.1,-0.49 -1.1,-1.1s0.49,-1.1 1.1,-1.1z"/>
</vector>

View File

@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFFFF" android:fillType="evenOdd" android:pathData="M10.2,4.9c0.79,-1.37 2.81,-1.37 3.6,0l7.3,12.65c0.78,1.35 -0.2,3.05 -1.8,3.05H4.7c-1.6,0 -2.58,-1.7 -1.8,-3.05L10.2,4.9zM12,8.25c0.61,0 1.1,0.49 1.1,1.1v4.15c0,0.61 -0.49,1.1 -1.1,1.1s-1.1,-0.49 -1.1,-1.1V9.35c0,-0.61 0.49,-1.1 1.1,-1.1zM12,16.15c0.72,0 1.3,0.58 1.3,1.3s-0.58,1.3 -1.3,1.3s-1.3,-0.58 -1.3,-1.3s0.58,-1.3 1.3,-1.3z"/>
</vector>

View File

@ -89,14 +89,14 @@ app/src/main/java/app/closer/
│ ├── analytics/ # Firebase Analytics + Crashlytics wrappers │ ├── analytics/ # Firebase Analytics + Crashlytics wrappers
│ ├── billing/ # EntitlementChecker + FirestoreEntitlementChecker │ ├── billing/ # EntitlementChecker + FirestoreEntitlementChecker
│ ├── crash/ # CrashReporter abstraction │ ├── crash/ # CrashReporter abstraction
│ ├── feature/ # (reserved for feature flags; currently empty — no feature-flag code in repo today) │ ├── feature/ # (reserved for feature flags; no directory exists today — no feature-flag code in repo)
│ ├── navigation/ # AppRoute constants, NavHost, ExternalLinks │ ├── navigation/ # AppRoute constants, NavHost, ExternalLinks
│ └── notifications/ # AppMessagingService, NotificationHelper, NotificationPermissionHelper, QuietHours, TokenRegistrar │ └── notifications/ # AppMessagingService, NotificationHelper, NotificationPermissionHelper, QuietHours, TokenRegistrar
├── crypto/ # E2EE: Tink AEAD, BouncyCastle Argon2id, key stores ├── crypto/ # E2EE: Tink AEAD, BouncyCastle Argon2id, key stores
├── data/ ├── data/
│ ├── challenges/ # Connection Challenges data sources │ ├── challenges/ # Connection Challenges data sources
│ ├── local/ # Room DAOs, DataStore, EncryptedSharedPreferences (RecoveryPhraseStore, SecurePreferencesFactory, SettingsDataStore) │ ├── local/ # Room DAOs, DataStore, EncryptedSharedPreferences (RecoveryPhraseStore, SecurePreferencesFactory, SettingsDataStore)
│ ├── questions/ # Question pack data sources (QuestionDao + QuestionJsonParser) │ ├── questions/ # Question pack data sources (`QuestionJsonParser`)
│ ├── remote/ # Firestore data sources, Cloud Functions callable wrappers │ ├── remote/ # Firestore data sources, Cloud Functions callable wrappers
│ ├── repository/ # Repository implementations │ ├── repository/ # Repository implementations
│ └── security/ # PlayIntegrityChecker │ └── security/ # PlayIntegrityChecker
@ -131,7 +131,7 @@ app/src/main/java/app/closer/
└── wheel/ # Spin the wheel └── wheel/ # Spin the wheel
``` ```
**Note on the manual's older description**: a `core/security/` package and `data/local/QuestionJsonParser.kt` were documented in earlier revisions of this manual but don't exist in the current source. The auth rate limiter is in `domain/security/AuthRateLimiter.kt`, and the question JSON parser is at `data/questions/QuestionJsonParser.kt`. **Note on the manual's older description**: a `core/security/` package was documented in earlier revisions of this manual but doesn't exist in the current source. The auth rate limiter is in `domain/security/AuthRateLimiter.kt`, and `QuestionJsonParser` is at `data/questions/QuestionJsonParser.kt` while `QuestionDao` is in `data/local/QuestionDao.kt`.
The Android settings package contains: `SettingsScreen`, `SettingsViewModel`, `SettingsVisuals`, `AccountScreen`, `EditProfileScreen` + `EditProfileViewModel`, `AppearanceScreen`, `DeleteAccountScreen`, `NotificationSettingsScreen`, `PrivacyScreen`, `RelationshipSettingsScreen`, `SecurityScreen`, `SubscriptionScreen`. The `SecurityScreen` is biometric-gated for the recovery phrase reveal. The Android settings package contains: `SettingsScreen`, `SettingsViewModel`, `SettingsVisuals`, `AccountScreen`, `EditProfileScreen` + `EditProfileViewModel`, `AppearanceScreen`, `DeleteAccountScreen`, `NotificationSettingsScreen`, `PrivacyScreen`, `RelationshipSettingsScreen`, `SecurityScreen`, `SubscriptionScreen`. The `SecurityScreen` is biometric-gated for the recovery phrase reveal.

111
scripts/wiring-scan.sh Executable file
View File

@ -0,0 +1,111 @@
#!/bin/bash
#
# CloserApp — automated WIRING / dead-feature scanner (Pass N + discovery pre-check)
#
# Catches the "silent dead feature" class that QA found live (N-001 Bucket List, N-002
# Date Builder): a feature looks like an empty/initial state but is actually non-functional
# because a required id is never wired, a setter is never called, or saved data is never read.
#
# ⛔ CLAUDE: This is a LIVING tool — IMPROVE IT whenever you discover a new dead-wiring / orphan
# failure mode. Add the new grep, keep the script self-contained + runnable from the project
# root, write findings to stdout + SCAN_OUTPUT, and update this header with what you added.
# Do not remove an existing check unless it is provably wrong (note why in the header).
#
# Usage:
# ./scripts/wiring-scan.sh > /tmp/claude-wiring-scan-$(date +%Y%m%d).md
# cat /tmp/claude-wiring-scan-$(date +%Y%m%d).md
#
# Tiers:
# 🔴 CRITICAL — a `fun setX(...)` in a *ViewModel.kt with ZERO callers. The screen/nav never
# pushes the value, so any op gated on it silently no-ops (N-001 class).
# 🟠 MAJOR — a repository/data-source READ method (`fun observe*/get*/load*`) with no caller
# in `ui/`. Data the app can write but never displays → orphan feature (N-002 class).
# 🟡 REVIEW — a `if (x.isEmpty()/== null) return` / `?: return` bail-guard inside a *ViewModel.
# Legitimate, BUT confirm something actually provides `x` — an un-provided guard is
# exactly how a feature goes silently dead. Verify each by persisting real data and
# reading it back from Firestore (admin), not by trusting the empty-state render.
#
# Findings are HINTS, not proofs — a flagged item can be intentional (e.g. a setter used only in a
# @Preview, or a read method genuinely pending UI). Confirm each against live behavior + ground truth.
#
set -uo pipefail
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
SRC_DIR="$PROJECT_ROOT/app/src/main/java/app/closer"
UI_DIR="$SRC_DIR/ui"
SCAN_OUTPUT="${1:-/tmp/claude-wiring-scan-$(date +%Y%m%d).md}"
: > "$SCAN_OUTPUT"
log() { echo "$1" | tee -a "$SCAN_OUTPUT"; }
crit=0; major=0; review=0
log "# Wiring / dead-feature scan — $(date '+%Y-%m-%d %H:%M')"
log ""
log "> Hints, not proofs. Confirm each against live behavior + a Firestore admin read."
log ""
# ── Tier 1: dead setters (CRITICAL) ───────────────────────────────────────────
log "## 🔴 CRITICAL — ViewModel \`setX(...)\` with no caller (N-001 class)"
log ""
while IFS= read -r decl; do
file="${decl%%:*}"
name="$(echo "$decl" | grep -oE 'fun set[A-Z][A-Za-z0-9]*' | head -1 | sed 's/^fun //')"
[ -z "$name" ] && continue
# callers = references to `name(` or `::name` anywhere under SRC, minus the declaration itself
callers="$(grep -rEn "(\.|::| )${name}\(|::${name}\b" "$SRC_DIR" 2>/dev/null | grep -v "fun ${name}(" | grep -cv '^$')"
if [ "${callers:-0}" -eq 0 ]; then
log "- 🔴 \`${name}()\` — **no callers** — ${file#$PROJECT_ROOT/}"
crit=$((crit+1))
fi
done < <(grep -rEn 'fun set[A-Z][A-Za-z0-9]*\(' "$SRC_DIR" --include=*ViewModel.kt 2>/dev/null)
[ "$crit" -eq 0 ] && log "- none ✅"
log ""
# ── Tier 2: orphan readers (MAJOR) ────────────────────────────────────────────
log "## 🟠 MAJOR — repository/data-source read method never called from \`ui/\` (N-002 class)"
log ""
# Scan REPOSITORY INTERFACES only (*Repository.kt, which the glob excludes *RepositoryImpl.kt
# + *DataSource.kt) — those are the read entry points a VM/screen would call. A repo read method
# with no ui/ caller means the app can fetch the data but no screen ever shows it (N-002).
while IFS= read -r decl; do
file="${decl%%:*}"
name="$(echo "$decl" | grep -oE 'fun (observe|get|load)[A-Z][A-Za-z0-9]*' | head -1 | sed 's/^fun //')"
[ -z "$name" ] && continue
ui_callers="$(grep -rEn "(\.|::| )${name}\(|::${name}\b" "$UI_DIR" 2>/dev/null | grep -cv '^$')"
if [ "${ui_callers:-0}" -eq 0 ]; then
log "- 🟠 \`${name}()\` — **no \`ui/\` caller** (written data may never be displayed) — ${file#$PROJECT_ROOT/}"
major=$((major+1))
fi
done < <(grep -rEn 'fun (observe|get|load)[A-Z][A-Za-z0-9]*\(' "$SRC_DIR" --include=*Repository.kt 2>/dev/null)
[ "$major" -eq 0 ] && log "- none ✅"
log ""
# ── Tier 3: silent bail-guards in ViewModels (REVIEW) ─────────────────────────
log "## 🟡 REVIEW — \`if (x.isEmpty()/==null) return\` / \`?: return\` bail-guards in ViewModels"
log ""
log "Each is a point where the feature silently does nothing if state was never initialized."
log "Confirm something provides the value (persist real data → read it back via admin)."
log "Auth-presence guards (\`currentUserId ?: return\`) are filtered out — they're never the wiring gap;"
log "the risky ones gate on a STATE field a \`setX\`/resolver is supposed to populate (e.g. coupleId)."
log ""
while IFS= read -r hit; do
log "- 🟡 ${hit#$PROJECT_ROOT/}"
review=$((review+1))
done < <(grep -rEn 'if \([a-zA-Z0-9_.]+\.(isEmpty\(\)|isBlank\(\))\) return|[a-zA-Z0-9_.]+ \?: return\b' "$SRC_DIR" --include=*ViewModel.kt 2>/dev/null \
| grep -viE 'currentUser|currentUserId|authRepository|FirebaseAuth|firstOrNull|\.find ?\{|getOrNull')
[ "$review" -eq 0 ] && log "- none"
log ""
log "## Summary"
log ""
log "| Tier | Count |"
log "|---|---|"
log "| 🔴 CRITICAL (dead setters) | $crit |"
log "| 🟠 MAJOR (orphan readers) | $major |"
log "| 🟡 REVIEW (bail-guards) | $review |"
log ""
log "_Record these counts in ClaudeQACoverage.md under Pass N before driving the interactive features._"
# Exit non-zero only on CRITICAL so CI/automation can gate on it.
[ "$crit" -gt 0 ] && exit 1 || exit 0