The investor proposal made the case: verification in Australian property is synchronous, duplicated, and — since 1 July 2026 — legally mandatory and legally reusable. This document designs the thing itself. One trust engine verifies parties and properties against official rails and keeps them verified. One trust graph holds the resulting objects — profiles, ticks, listings, buy-intents, loan cases, deals. Five surfaces — the branded webapp, co-branded white-labels, an API/MCP layer for AI assistants, an agent-harness plugin, and a broker workspace for verified finance — all sell the same underlying asset: portable, counterparty-visible trust, with downstream orchestration into contracts, duty, and settlement.
Every design choice in this document traces back to one of these. When two options tie, the principle breaks the tie.
The marketplace, the compliance tooling, the API — all are interfaces onto one asset: a verified, continuously monitored claim about a party or property. We invest in the trust engine the way a bank invests in its ledger.
No verification ever runs on the critical path of a deal moment. Everything verifiable in advance is verified in advance and kept warm by monitoring; the deal only consumes state, never waits on process.
Verification belongs to the person, not to the business that happened to pay for it. Consent is explicit, per relying party, revocable, and logged. This is the opposite of today's matter-scoped VOI — and the source of the network effect.
Webapp, white-labels, API/MCP and plugin are skins over the same trust graph. A profile verified inside one agency's co-brand is verified everywhere. Surfaces compete; the graph compounds.
PEXA, practitioners, revenue offices, lenders and portals are rails and partners, not targets. Veristate's job is handing them cleaner inputs sooner — which is why they let us in.
Agents and practitioners never do "AML work" in Veristate. They do their ordinary work — onboarding a vendor, accepting an offer — and the evidence AUSTRAC requires falls out as a by-product: programs, screening logs, reliance records, reports.
Surfaces depend on services, services on the graph, the graph on the engine, the engine on the rails. Nothing reaches down more than one layer; nothing reaches up at all. Hover any element.
Sixteen objects carry the whole platform — the four finance objects get their own section (11). The two that make Veristate different from every incumbent are Credential (verification as a first-class, portable, monitored object) and ReliancePact (the legal agreement that lets other businesses consume it).
| Object | Key design decisions |
|---|---|
| Credential | Typed (identity, clean_party, funds_capacity, firb_status, ownership); stores derived proofs by default, raw documents only where law demands; carries validity window, refresh policy, and per-relying-party consent grants. Modelled to map onto W3C verifiable credentials later without a rewrite. |
| Tick | Computed, never stored as fact. A roll-up function over live credentials: V1 identity-verified, V2 + funds capacity, V3 full (identity + clean-party + funds + FIRB). Any underlying credential lapsing instantly demotes the tick — the badge can never be stale. |
| ReliancePact | One executed agreement per relying Organisation, referencing AUSTRAC reliance provisions; every consumption event (who read which credential for which deal) appends to the reliance ledger. This ledger is the moat (investor proposal §08). |
| Deal | The only object that crosses into other systems: it holds the orchestration state machine and the handoff records (practitioner appointment, duty pre-fill payloads, settlement references). Deliberately not a contract-of-record — the legal contract stays with practitioners (P5). |
| BuyIntent | Sellers see a verified summary band ("deposit verified · pre-approval current · no FIRB constraint"), never balances or documents. Privacy is what makes buyers willing to register capacity at all (P3). |
| Finance objects §11 | BrokerPractice, PanelAccreditation, FinanceConsent and LoanCase form the finance layer’s two many-to-many edges: consent (buyer ↔ broker) and accreditation (broker ↔ lender). Quotes are written against a frozen consented view; an accepted quote escalates to an AIP credential on the buyer — portable into offers like any other credential. |
The engine's defining behaviour: a check runs once, then monitoring keeps it true. Every incumbent re-runs checks per transaction because their result is a PDF. Ours is a state machine with subscriptions.
Attention is the state that matters most. Point-in-time systems have only "valid" and "expired"; the gap between those is where fraud and deal collapse live. Veristate surfaces degradation early — to the user, and (with consent, under pact) to any party currently in a deal with them.
| Check | Rail | Refresh | Feeds tick | Reusable via |
|---|---|---|---|---|
| Identity (VOI standard) | DVS + biometric IDV; ConnectID as alternative input | 2-year validity; re-verify on document expiry | V1 | ARNECC 2-yr validity · Identity-Agent appointment |
| Clean-party screening | PEP / sanctions / adverse-media lists | Continuous (delta feeds) | V3 | AML reliance pact |
| Funds capacity | CDR consent + lender pre-approval link | Auto-refresh ~30 days; pre-approval expiry tracked | V2 | Consented summary band |
| FIRB status | Citizenship/residency screening; exemption-certificate pathway | On change of circumstance | V3 | Status flag on intent/offer |
| Entity & beneficial ownership | ASIC / ABR + BO mapping | Change-monitored | V1–V3 | AML reliance pact |
| Ownership (property) | Title search: proprietor ↔ verified identity match | Dealing/caveat watch while listed | Property tick | Pack + public badge check |
| Disclosure pack items | Registry / council / water / body-corporate APIs | Per-item staleness clocks (state rules) | Property tick | Pack shared to buyer side |
| Settlement account | Account-name verification (ConnectID / PayID rails) | At deal open + before settlement | Deal gate | Anti-redirection check |
| Broker practice | ASIC credit-licence register + aggregator accreditation + clean-party screening | Change-monitored | Broker tick | AML reliance pact |
| Lender panel & pricing | Lender / aggregator product, policy & pricing feeds | Daily (products) · versioned (policy — matches record the version used) | Match inputs | Panel pricing (§11) |
The tick is a function of current credential state, evaluated on read. There is no cached "verified" flag to go stale or be forged in a screenshot — every render hits the badge service.
Every badge carries a short code / QR resolving to verify.veristate.com.au, which confirms level, scope and freshness — without revealing anything else. Screenshots of ticks are worthless; the check is the badge.
When a credential lapses, the ledger knows every open deal and relying party that consumed it — all are notified within minutes. A revoked tick is loud, not silent.
The flagship's information architecture is deliberately small — five areas — because the product's depth lives in states, not screens. These six wireframes seed the Phase 0 prototype; each maps to a use case from the investor proposal.
| Area | What lives there |
|---|---|
| Verification hub | The onboarding spine: check progress, credential wallet, consent grants, renewal prompts. The first-run experience is this hub. |
| My profile / My property | Party tick, buy-intents; seller's property, pack health, listing controls. |
| Market | Verified listings, match feed (intent ↔ listing), saved searches. Unverified browsing allowed; acting requires a tick. |
| Finance | Per-listing broker offers, panel-pricing comparison, consent grants, quote threads, AIP status. Buyers reach several brokers at once; every consent is scoped, logged and revocable (§11). |
| Deals | Offer threads and the deal room: milestones, parties, practitioner, documents, orchestration timeline. |
| Panel | Choose/compare practitioners: state-eligible, fixed-fee menus, capacity and rating signals. |
The white-label's central design decision is what is tenant-scoped and what is network-shared. Get this wrong one way and there is no network effect; wrong the other way and no agency will sign.
| Concern | Scope | Rationale |
|---|---|---|
| Credentials & ticks | Network-shared | The whole point (P4): a client verified under any tenant is verified everywhere. Consumers are told this plainly at consent time — "your verification belongs to you." |
| Client relationships & CRM data | Tenant-scoped | An agency's book is its business. Veristate never leaks who a tenant's clients are to other tenants — only the portable credential travels, and only when the consumer uses it elsewhere. |
| Listings | Tenant-scoped, opt-up | Tenants choose per listing: private to their branded surface, or syndicated to the flagship market. Syndication is the carrot that grows the flagship without threatening the agency. |
| Reliance pact & AML program | Per tenant | Each regulated entity holds its own pact and its own program state; the compliance service renders each tenant's obligations separately. Legally non-negotiable. |
| Panel | Configurable | Tenants may pin preferred practitioners or inherit the open panel; conflict-of-interest disclosure rules apply either way (section 10). |
| Theming & domain | Per tenant | Design tokens (logo, palette, type), custom domain, email identity. The badge itself is never re-themed — the tick renders identically on every surface, because the badge is the brand that guarantees the others. |
Technically the white-label is the flagship webapp with a tenant context: same code, tenant-resolved tokens, feature flags per plan. A lightweight embed SDK (badge widget, verified-offer button, pack viewer) lets tenants keep their existing website and bolt trust onto it — often the first step before a full co-branded deployment.
The API is the platform's real boundary — the webapp and white-labels are its first two clients. The MCP server is a thin, opinionated projection of the same API for AI assistants, designed around one rule: an assistant may gather and prepare anything, but binding actions require a human ceremony.
| Resource | Representative operations | Notes |
|---|---|---|
/parties | register · get tick state · start verification · grant/revoke consent | PII-minimal responses; credentials referenced by opaque IDs, evidence never leaves the vault via API |
/credentials | status · summary-band presentation · renewal | Presentations are scoped claims ("V2, valid, deposit band ✓"), not data |
/properties · /listings | register · title-match · pack status · list/syndicate · search | Search is public; pack contents gated on buyer tick + seller grant |
/buy-intents | create · match feed · pause | Matching pushes events, not polling |
/offers · /deals | draft · present · accept (ceremony) · milestones · handoffs | Accepting an offer and appointing a practitioner are ceremony-gated (below) |
/panel | eligible practitioners · fee menus · appoint (ceremony) | State-eligibility rules enforced server-side |
/brokers · /finance-consents | broker search & profile · grant/revoke consent (ceremony) · consented-view reads | Every read of a band is ledgered; presentations are bands, never balances |
/loan-cases · /quotes | scenario · panel matches · quote · AIP status · BID pack | Broker-scoped; every scenario change appends to the case audit log (§11) |
/orgs · /pacts | tenant config · pact execution · reliance ledger queries · compliance reports | B2B scope; the compliance-exhaust endpoints |
/badge | public verification of any tick code | Unauthenticated, rate-limited, reveals level + freshness only |
Tools are named for intent, not for endpoints, and each declares whether it is read, prepare, or ceremony class. Ceremony-class tools never complete an action: they stage it and return a signed link where the human confirms inside a Veristate surface (webapp or white-label) with their verified session. The assistant's context receives reference tokens and summary bands — never documents, balances, or identity data.
| MCP tool | Class | What it does |
|---|---|---|
check_verification_status | read | Tick level, pending items, renewal dates for the connected user |
start_verification | prepare | Begins the async check plan; returns hub link for biometric/consent steps |
screen_firb_position | read | Residency-based eligibility summary (UC4's first step) |
search_verified_listings | read | Market search with tick/pack filters |
get_property_pack_summary | read | Pack table of contents + freshness; item access requires buyer tick grant |
register_buy_intent | prepare | Creates/updates an intent from conversational parameters |
draft_offer | prepare | Assembles a tick-to-tick offer with conditions; nothing is sent |
present_offer | ceremony | Stages the offer; human confirms via signed link before the seller sees it |
appoint_practitioner | ceremony | Stages a panel appointment at a fixed fee; human confirms |
compare_broker_offers | read | Per-listing broker pricing summaries for the connected buyer |
grant_finance_consent | ceremony | Stages a band share with chosen brokers — scoped, revocable; human confirms |
get_panel_matches / reprice_scenario | prepare | Broker scope: ranked lender matches for a LoanCase; every re-price appends to the audit log |
generate_bid_pack | prepare | Broker scope: drafts the Best Interests Duty evidence pack for review — never auto-filed |
get_deal_status / subscribe_deal_events | read | Milestones, who-holds-the-ball, next actions — the feed UC4's Claude narrates |
generate_compliance_report | prepare | B2B: tenant AML report drafts (plugin surface, section 08) |
Why this matters strategically: as buying journeys move into assistants, the assistant needs a counterparty it can trust programmatically. Portals offer HTML to scrape; Veristate offers signed claims. The MCP surface is how "the trust layer for AI-assisted property" stops being a slogan and becomes an integration.
The Cowork plugin composes the MCP server with packaged skills — prompts and workflows tuned to four professional teams. It ships no logic of its own beyond these compositions, so it inherits every platform improvement for free.
/pipeline-brief — morning digest: expiring ticks & pre-approvals, new matches per client, pack changes overnight (the caveat flag from UC5).
/client-onboard — conversational intake that ends with start_verification and a buy-intent draft.
/offer-pack — comparable-listing analysis + drafted offer, staged for the client's ceremony.
/matter-open — pulls verified party + pack into a new matter; VOI and CDD arrive as reliance records, not tasks.
/duty-prefill — assembles the EDR / Duties Online / QRO payload from deal data for practitioner review.
/settlement-ready — pre-settlement checklist against deal state, incl. account-verification gate.
/aml-health — program status, screening backlog, training gaps across offices.
/smr-draft — structures a suspicious-matter narrative from deal context for the compliance officer's review — never auto-filed.
/austrac-annual — drafts the annual compliance report from the ledger.
/lead-brief — morning digest: new consented leads with bands, expiring AIPs and consents, rate moves affecting open quotes.
/panel-reprice — re-runs a LoanCase scenario across the panel and drafts the client note; the quote itself stays a human send.
/bid-pack — assembles the Best Interests Duty evidence pack from the case log for the broker’s sign-off.
Design rule inherited from section 07: the plugin's agents read and prepare; humans confirm ceremonies. A morning brief can notice, draft, and stage — it cannot bind a client to anything.
The Deal state machine is Veristate's answer to the fragmented downstream chain. It does not perform legal steps — it sequences them, pre-fills them, and makes their state legible to everyone entitled to see it.
Failure paths are first-class: a crashed condition reverts the Deal to market-return with the pack and both ticks intact — relisting is hours, not weeks, which materially softens the cost of a fall-over for both sides.
Today buyers find conveyancers via agent referral — late, opaque, and conflict-prone. The panel redesigns that relationship around three commitments.
Panel members are themselves VOI'd, licence-checked per state (solicitors-only in QLD/ACT), insurance-verified, and capacity-signalled. The trust engine runs on them too — a practitioner tick.
Published, structured fee menus (purchase/sale, state, complexity tiers) replace "from $X plus surprises". Comparison is native; disbursements itemised from live search pricing.
Parties select practitioners at verification time, not offer time — so the practitioner is warm when the deal opens (the 48-hour exchange depends on this). Switching remains one click until exchange.
Conflicts policy: tenants may pin preferred firms, but every recommendation surface discloses the relationship, and the consumer's own choice always outranks the pin. Referral economics are flat-fee per appointment — never a percentage — to keep incentives clean.
Finance is the platform’s second marketplace. Buyers reach multiple verified brokers; each broker reaches multiple lenders through an accredited panel; lenders feed products, policy and pricing into the graph. Veristate owns the plumbing between them — consent, matching, comparison — and the evidence trail the law demands. It never touches the money: commissions stay between broker, lender and client, disclosed on every quote.
| Object | Key design decisions |
|---|---|
| BrokerPractice | An Organisation subtype run through the same trust engine: ASIC credit licence, aggregator accreditation, clean-party — rolled into a broker tick the buyer sees. Carries response-time and settled-loan signals for comparison. |
| PanelAccreditation | The broker ↔ lender M:N edge. Snapshots the lender’s versioned policy parameters (LVR caps, serviceability buffer, income-type rules) and subscribes to its pricing feed — so a match can always name the policy version it ran against. |
| FinanceConsent | The buyer ↔ broker M:N edge, modelled exactly like credential consent (P3): scoped to a property or search, time-boxed (default 30 days), band-only presentation, every read ledgered, one-tap revocation that propagates like tick revocation. A buyer holds several at once — brokers compete, never queue. |
| LoanCase | The broker’s working file: scenario (loan, security, LVR, repayment, rate type), the ranked match set including exclusions with reasons, quotes, AIP, and an append-only audit log. Quotes are written against the frozen consented view, so they cannot silently degrade; an accepted quote escalates to an AIP credential on the buyer. One buyer, several brokers, several LoanCases — by design. |
| Feed | Contents | Refresh |
|---|---|---|
| Product catalogue | Products, features (offset, redraw, cashbacks), carded rates | Daily |
| Policy parameters | LVR caps, serviceability buffers, income-type policies (incl. self-employed), security rules | On change, versioned — every match records the version it used |
| Pricing outcomes | Anonymised, aggregated discretion decisions → the discretion-outlook model ("−25 bp likely · 74% of similar requests approved") | Continuous, aggregated |
| Application status | AIP → valuation → unconditional → drawdown | Webhooks, straight into the deal’s finance milestone |
Matching is deterministic, versioned and replayable: "why did it rank this way on 12 August" must be answerable forever, because a regulated adviser recommends from its output. No stored ranking — like the tick, matches are computed on read and logged on use.
match(scenario, clientFile, panel) → ranked product set # 1 · eligibility — policy filters (LVR cap, income type, security rules) # exclusions are KEPT, with reasons: BID needs the considered set, not just winners eligible, excluded = screen(panel.policies@version, scenario, clientFile) # 2 · serviceability — income × policy factor ÷ lender buffer, vs loan for p in eligible: p.buffer_ratio = capacity(clientFile, p.policy) / scenario.loan # pass / tight / fail # 3 · pricing — carded rate + scenario adjustments (LVR band, IO, fixed) − likely discretion for p in eligible: p.rate = card(p, scenario) − discretion_outlook(p, clientFile) # 4 · rank — 5-year true cost, tie-broken by client objectives (offset need, certainty, speed) return rank(eligible, by=true_cost_5yr, tiebreak=clientFile.objectives), excluded
Every scenario change a broker makes — a slider move, a repayment toggle — re-runs the function and appends the inputs, policy versions and output to the LoanCase log. That log is not overhead; it is the raw material of the next subsection.
Principle P6 applied to brokers: nobody "does BID paperwork". The Best Interests Duty demands the broker show the considered set, why the recommendation beats it, and how the client’s objectives were weighed — which is exactly what the LoanCase log already contains. The BID evidence pack renders it: considered products (including exclusions and their reasons), the scenario history, the ranking rationale verbatim from the model, the client’s stated objectives, and the commission disclosed on each quote. Generated per file, on demand, regulator-ready — compliance as exhaust.
Broker ticks and comparison signals; each broker’s per-listing pricing; quotes with commission disclosed; who read their band and when. Never one broker’s quote shown to another.
The consented view only: band, target property, objectives — never balances, payslips or documents. Their own panel, matches and files. Reads are ledgered and visible to the buyer.
Consents, the match model and its versions, audit logs, AIP credentials, the reliance ledger. No commission flows through Veristate — ranking has nothing to sell (investor proposal §07).
Action classes follow section 07’s rule: reading a consented file and running matches are read/prepare; a buyer granting consent or proceeding with a broker, and a broker sending a quote, are ceremonies. The AIP attaching to an offer is automatic — it is a credential presentation, not an action.
A platform holding identity and financial verification for hundreds of thousands of people is a target. The architecture assumes breach attempts and designs so that success yields as little as possible.
| Threat / duty | Design response |
|---|---|
| Data honeypot | Proofs over documents. Where law permits, the vault stores the derived attestation (check outcome + hash + supplier reference), not the source document. Where statute requires document retention (AML, 7 years), those objects live in a separately keyed, access-ceremonied cold store. Field-level encryption; per-party keys; vault reads are themselves ledgered. |
| Payment redirection fraud | Account-name verification at deal open and again pre-settlement; bank-detail changes inside a deal trigger a mandatory re-verification and out-of-band confirmation. PEXA Key promoted for the final leg. |
| Seller impersonation | The property tick's proprietor-match plus dealing watch; any title change while listed suspends the listing automatically. |
| Consent & APP compliance | A consent ledger parallel to the reliance ledger: every grant is purpose-bound, per relying party, expiring, revocable in the hub. Privacy-Act APP mapping maintained per credential type; data-minimal presentations by default (bands, not balances). |
| Insider risk | No standing human access to the vault; support access is time-boxed, purpose-logged, dual-approved. |
| Regulatory posture | Insured Identity-Agent appointments under ARNECC rules; ISO 27001 program from Phase 1; independent AML program evaluation on the statutory 3-year clock; state-by-state legal review gates each market entry. |
| Tick liability | The badge asserts what was checked and when — never guarantees a counterparty's future conduct. Terms, badge-service responses, and marketing all carry the same bounded claim; this is a design constraint on copy as much as code. |
Boring technology, deliberately: the risk budget is spent on the trust engine's correctness and the integrations, not on infrastructure novelty.
| Layer | Choice | Why |
|---|---|---|
| Backend | Python · FastAPI · Pydantic | One language across API, engine and workers; typed schemas shared end-to-end; the team's home ground |
| Trust-engine workflows | Temporal (Python SDK) | Check plans and deal orchestration are long-running, resumable, audit-heavy workflows — exactly Temporal's shape; Celery would reinvent it badly |
| Data | PostgreSQL (+ append-only ledger tables) · Redis · S3-compatible vault store | The reliance/consent ledgers are insert-only Postgres with hash chaining — auditable without exotic tech |
| Events | Postgres outbox → lightweight bus (NATS or SQS) | Tick changes, pack staleness, deal milestones as events; webhooks + MCP subscriptions ride on it |
| Frontend | Next.js/React, tenant design tokens | One codebase serves flagship + white-labels (section 06); the design system in this document's visual language |
| MCP server | Python MCP SDK over the public API | Thin projection; tool classes (read/prepare/ceremony) enforced at this layer |
| Deployment | Modular monolith first; extract services at proven seams (engine, badge, compliance) | Twelve domain objects do not need twelve microservices on day one |
| Phase | Builds | Mocked / deferred |
|---|---|---|
| 0 · Prototype weeks | Screens W1–W6 as a clickable Next.js app; real API shapes (/parties, /listings, /offers) served by a FastAPI stub with in-memory state machines — the same stubs later become the MCP demo | All rails mocked; no auth beyond magic links; single state (QLD narrative) |
| 1 · Compliance wedge | Trust engine v1 (identity + screening + monitoring), evidence vault, reliance ledger + pact flow, agency console (W6), compliance reports; Temporal in production | Marketplace closed; CDR funds-capacity in pilot; panel manual |
| 2 · Marketplace & badge | Flagship market with property search, property tick + packs, tick-to-tick offers, deal rooms, panel v1, public badge service; broker workspace with the panel-matching engine (pure-function library + lender-feed adapters), finance consents, quote→AIP workflow and the BID evidence generator | Duty pre-fill behind practitioner review flag |
| 3 · Platform | Public API GA, MCP server, Cowork plugin, embed SDK, duty pre-fill integrations, additional states/tenants | — |
Team shape for Phases 0–1: two backend (engine + integrations), one frontend, one design, fractional legal/compliance counsel — the reliance-pact framework and Identity-Agent appointments are as much "build" as the code.
V1 is custodial (Veristate holds credentials, consumers hold consent). W3C verifiable credentials in a consumer wallet is the principled end-state (P3) and the ConnectID-convergence hedge — but wallets today cost conversion. The domain model keeps the migration path open; the trigger point is undecided.
Surfacing credential degradation to a counterparty mid-deal protects them but could unfairly torpedo a party over a false-positive screening delta. Grace windows, human review before propagation, and what exactly counterparties see all need careful policy design with counsel.
Does the marketplace open as the flagship brand, or do we let the first large tenant's co-brand be the consumer-facing debut and keep the flagship as the network's neutral spine? Cold-start strategy says seed via tenants; brand strategy says the tick needs one famous home. Sequencing TBD with the pilot partner.
Pre-fill (practitioner reviews and lodges) is safe and shippable. Direct lodgment as a revenue-office CSP is deeper moat but a regulatory project per state. Phase 3 decision, informed by Phase 1 relationships.
Predicting likely pricing discretion from aggregated outcomes is genuinely useful and genuinely sensitive: lenders may resist publication, and a wrong estimate skews regulated advice. Options: lender-sanctioned ranges, aggregator data partnerships, or shipping without the column until confidence is proven. Needs lender conversations in Phase 1.
The match model orders products a regulated adviser then recommends. Who audits its weights, how objective-fit trades against raw cost, and whether brokers may tune defaults per client are open policy questions. The versioned, replayable log makes any answer defensible — but the defaults still matter.
Next step, as before: Phase 0. Wireframes W1–W6 (W7–W8 follow with the Phase 2 finance surfaces) and the API stubs in section 13 are specified precisely so the prototype can start from this document without another planning round.