|
| 1 | +<!-- |
| 2 | +SPDX-License-Identifier: CC-BY-SA-4.0 |
| 3 | +SPDX-FileCopyrightText: 2025-2026 Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk> |
| 4 | +--> |
| 5 | + |
| 6 | +Squad Audit for student house-shares: bring the friend group you already |
| 7 | +have; `flat-mate` tells you whether it survives a lease, then drafts the |
| 8 | +house agreement and search brief to make sure it does. |
| 9 | + |
| 10 | +This repo includes: |
| 11 | + |
| 12 | +- `apps/api` — Deno API using `verisimdb` as the persistence/search |
| 13 | + layer. |
| 14 | + |
| 15 | +- `apps/web` — React + Vite web client. |
| 16 | + |
| 17 | +- `apps/mobile` — Expo React Native mobile client. |
| 18 | + |
| 19 | +- `packages/shared` — Domain models, matching/scoring rules, and |
| 20 | + verisimdb encoding helpers. |
| 21 | + |
| 22 | +# Why this product (v1 = Squad Audit) |
| 23 | + |
| 24 | +UK first-years are allocated halls; by January they must form |
| 25 | +private-market groups of 3–6 with people they met eight weeks earlier, |
| 26 | +with no compatibility input. No incumbent serves that moment. |
| 27 | +`flat-mate` audits an **already-formed** group — harmony + feasibility |
| 28 | +check, auto-drafted house agreement, search brief — and sits |
| 29 | +**upstream** of SpareRoom and its peers. Listings are explicitly **out |
| 30 | +of scope**: flat-mate hosts none and is not a SpareRoom rival. Target |
| 31 | +wave: Jan–May 2027, London second years. |
| 32 | + |
| 33 | +The earlier swipe + listings flow (v0) remains in-tree as **legacy** |
| 34 | +code until a quarantine/removal decision. It is not the product. |
| 35 | +Authoritative spec: |
| 36 | +[docs/design/squad-audit-v1.adoc](docs/design/squad-audit-v1.adoc). |
| 37 | + |
| 38 | +**What we never promise:** a "stable matching" — typically nonexistent |
| 39 | +in roommate markets; see the theory constraints in |
| 40 | +[docs/design/squad-audit-v1.adoc](docs/design/squad-audit-v1.adoc). |
| 41 | + |
| 42 | +# Architecture |
| 43 | + |
| 44 | +`flat-mate` writes entities as hexads in `verisimdb` (`POST` `/hexads`, |
| 45 | +`GET` `/search/text`, `POST` `/search/vector`). Because current |
| 46 | +`verisimdb` API responses are compact, the app stores encoded payloads |
| 47 | +in searchable document titles as an MVP strategy. |
| 48 | + |
| 49 | +The in-tree profile/listing/swipe write paths are the legacy v0 flow. |
| 50 | +The v1 target is an epistemic-typed server: per-field governance |
| 51 | +metadata, conceal-lattice disclosure tiers, no special-category fields |
| 52 | +by schema construction — see the design doc. Matching rules live in |
| 53 | +`packages/shared/src/matching/`, never in UI components. |
| 54 | + |
| 55 | +See `docs/architecture.md`, [TOPOLOGY.md](TOPOLOGY.md), and |
| 56 | +[EXPLAINME.adoc](EXPLAINME.adoc). |
| 57 | + |
| 58 | +# Quick Start |
| 59 | + |
| 60 | +1. Start verisimdb in another terminal: |
| 61 | + |
| 62 | + ``` bash |
| 63 | + cd /var/mnt/eclipse/repos/verisimdb |
| 64 | + cargo run -p verisim-api |
| 65 | + ``` |
| 66 | + |
| 67 | +<!-- --> |
| 68 | + |
| 69 | +1. Install web/mobile dependencies: |
| 70 | + |
| 71 | + ``` bash |
| 72 | + cd /var/mnt/eclipse/repos/flat-mate |
| 73 | + npm install |
| 74 | + ``` |
| 75 | + |
| 76 | +<!-- --> |
| 77 | + |
| 78 | +1. Configure the Deno API (`deno` 1.40+ needed): |
| 79 | + |
| 80 | + ``` bash |
| 81 | + cp .env.example .env |
| 82 | + source .env |
| 83 | + ``` |
| 84 | + |
| 85 | +<!-- --> |
| 86 | + |
| 87 | +1. Start the API: |
| 88 | + |
| 89 | + ``` bash |
| 90 | + deno run --watch=apps/api --allow-net --allow-env apps/api/main.ts |
| 91 | + ``` |
| 92 | + |
| 93 | +<!-- --> |
| 94 | + |
| 95 | +1. Start web + mobile: |
| 96 | + |
| 97 | + ``` bash |
| 98 | + npm run dev:web |
| 99 | + npm run dev:mobile |
| 100 | + ``` |
| 101 | + |
| 102 | +# Environment |
| 103 | + |
| 104 | +`.env`: |
| 105 | + |
| 106 | +```bash |
| 107 | +HOST=127.0.0.1 |
| 108 | +PORT=4000 |
| 109 | +VERISIMDB_BASE_URL=http://127.0.0.1:8080 |
| 110 | +VERISIMDB_VECTOR_DIM=384 |
| 111 | +``` |
| 112 | + |
| 113 | +Optional: |
| 114 | +`VITE_API_BASE_URL=`[`http://127.0.0.1:4000`](http://127.0.0.1:4000) |
| 115 | +(web), |
| 116 | +`EXPO_PUBLIC_API_BASE_URL=`[`http://127.0.0.1:4000`](http://127.0.0.1:4000) |
| 117 | +(Expo). |
| 118 | + |
| 119 | +Profiles require a `.ac.uk` `studentEmail` for student verification in |
| 120 | +the first pilot. |
| 121 | + |
| 122 | +# Product Scope (First Instance) |
| 123 | + |
| 124 | +- Group creation and member questionnaires, eliciting both **behaviour** |
| 125 | + and **tolerance** per dimension. |
| 126 | + |
| 127 | +- Pairwise harmony audit across the group, with internal dealbreaker |
| 128 | + detection. |
| 129 | + |
| 130 | +- Feasibility by budget **intersection** (`[max(mins),` `min(maxes)]`, |
| 131 | + never by mean). |
| 132 | + |
| 133 | +- House-agreement draft generated from the group’s actual divergence |
| 134 | + points. |
| 135 | + |
| 136 | +- Search brief to take to the listings market. |
| 137 | + |
| 138 | +# Next Product Increments |
| 139 | + |
| 140 | +Deferred roadmap, in liquidity order (see the design doc): |
| 141 | + |
| 142 | +1. Solo **top-up** discovery for groups with open slots, gated by |
| 143 | + conceal-lattice disclosure tiers and a mutual-consent lifecycle. |
| 144 | + |
| 145 | +2. Deferred-acceptance rounds for solo-joins-household — the one |
| 146 | + genuinely bipartite, theory-clean centralized mechanism. |
| 147 | + |
| 148 | +3. Calibration flywheel: anonymised outcome events so scoring weights |
| 149 | + become fitted rather than literature-seeded. |
| 150 | + |
| 151 | +# License |
| 152 | + |
| 153 | +SPDX-License-Identifier: CC-BY-SA-4.0 See [LICENSE](LICENSE). |
0 commit comments