Where this sits. The clearest example in the tree of schema-versioned
data modeling — seven numbered CQL migrations that read as a product
evolving under a discipline, which is exactly what a bank wants to see.
Seven forward-only migrations, read as a product evolving
010001, listingsbase table, partitioned by marketapplied
020002, mediaphoto sets moved out of the listing rowapplied
030003, agentsagent identity split from the listing ownerapplied
040004, saved searchesper-user query storage with TTLapplied
050005, geo indexsecondary access path by bounding boxapplied
060006, availabilityopen-house windows as their own rowsapplied
070007, auditappend-only change log on listing editsapplied
The clearest schema-versioning artifact in the tree. Forward-only means no down migration to hide a mistake in. A wrong column is corrected by a new numbered migration that is itself part of the record.
Deployed as openhouse-global.service (systemd), with certs/, a
mail-outbox/, and a sync.sh.
The migration sequence tells the story
Read the filenames in order and you can reconstruct the product's history:
offers and saved items first, then the journey foundation (a buyer's
progression through a purchase is a state machine, and it got its own
migration), then analyses, market data, a review feed, tier-1 listings, and
finally per-user property ownership.
Numbered, additive, forward-only CQL migrations against Cassandra is the
correct pattern, and it is the answer to "how do you evolve a schema on a
datastore with no ALTER TABLE semantics worth relying on": you add tables and
columns, you never rename what holds data, and you version the sequence.
That rule — nothing holding data gets renamed — is stated explicitly
elsewhere in this repository as the P0 rule and is applied here.
The journey engine
journey/ models a buyer's path as explicit state rather than as a set of
booleans on a user row. That distinction matters: a state machine can be
audited, replayed, and reasoned about at a step boundary; a bag of flags
cannot. For a mortgage-adjacent or transaction-adjacent product, that is the
difference between a system you can prove correct and one you cannot.
The iOS client
IOS/TheOne/OpenHouse — 57 files, 9,294 lines: Container / Models / Network / Service / Views, following the same layering as every other mode in the app.
Interview surface this opens
Forward-only schema migration against Cassandra, and why renames are forbidden
Modeling a multi-step user journey as a state machine rather than flags
Denormalization for a query-first datastore: designing tables per access pattern
Running a Node service under systemd with certificate management