{
  "generated_at": "2026-10-02T10:17:59.058Z",
  "commit": "a35acfd",
  "commit_date": "2026-10-02T15:09:22+05:30",
  "source": "private repository — every number below is counted from it by scripts/proof.mjs at build time, never typed",
  "counted": {
    "screens": 46,
    "business_logic_modules": 123,
    "business_logic_lines": 28180,
    "api_routes": 21,
    "database_migrations": 44,
    "tables_forced_row_level_security": 33,
    "unit_test_files": 365,
    "browser_test_specs": 24,
    "visual_baselines": 60,
    "gate_checks_defined": 99,
    "design_rules_ratcheted": 19,
    "languages": 2
  },
  "public_env": {
    "supabase_url_sane": true,
    "publishable_key_sane": true,
    "demo_entry_configured": true,
    "note": "checked from the build environment; \"false\" on a hosted build means sign-in from the link cannot work"
  },
  "verify_live": [
    {
      "claim": "the database is reachable from this deployment, as the restricted application role (not a superuser)",
      "how": "GET /api/health/db → {\"ok\":true,\"role\":\"aura_app\"}"
    },
    {
      "claim": "the ledger is append-only and hash-chained, and verification needs a signed-in tenant",
      "how": "GET /api/ledger/verify → {\"ok\":false,\"reason\":\"no-session\"} signed out; {\"ok\":true,...} for a signed-in tenant"
    },
    {
      "claim": "sign-in is real (Supabase Auth: email + password, sign-up provisions a tenant)",
      "how": "open the sign-in dialog from the header; a wrong password and an unknown email get the same message on purpose"
    },
    {
      "claim": "tenant isolation is enforced by the database, not the browser",
      "how": "every table carries FORCE ROW LEVEL SECURITY (count above); the adversarial drill npm run db:prove runs eight attacks as the app role"
    }
  ],
  "real_today": [
    "reservations, tape chart, check-in/out and folios; housekeeping; maintenance; duty log; night-audit date roll",
    "a hash-chained, append-only ledger with GST slabs sourced from the statute (India), credit notes, business dates",
    "revenue assurance: rate leakage, OTA true cost, settlement reconciliation joins, a leak report",
    "three product tiers from one codebase (homestay, hostel/PG, hotel chain) with entitlement-gated, code-split modules",
    "offline-capable client (IndexedDB) that syncs its ledger and inventory to Postgres through the API routes",
    "a design system whose colours are solved for contrast (70/70 in the proof table), two languages",
    "a property's own booking page that takes a stay from a guest with no account, and a desk that sees it within a minute; a room night sold once on the server whoever writes it; invoice and credit-note numbers issued by the server rather than the device; a night-audit pack that says whether it equals the server ledger; Form III for a foreign guest; and a full tenant export verifiable against the hash chain — each proven on the live link by a named probe under scripts/live/"
  ],
  "simulated_today": [
    "the channel CONNECTION: no OTA credentials exist yet, so nothing can arrive from a real OTA. The screen around it is not simulated — since 16 Sep a signed-in property's Channel Manager reads its real state from the server (it says this server holds no AxisRooms key for that property) and lists the channel bookings the server holds with no room; the ingest endpoint decides each delivery against the live schema — duplicate, stale, early, booked, no room, unknown room type — and an unplaced booking reaches the duty manager's dashboard (scripts/live/glancechannel.mjs, 8/8 on the link)",
    "payments: the settlement logic is real, no gateway is connected yet",
    "the demo property's operational data is seeded in the browser; a signed-in tenant's ledger, rooms, inventory and bookings sync to Postgres (all 40 migrations applied, the last on 16 Sep 2026) and were proven to cross devices on this link (scripts/live/booking.mjs); guest profiles do not sync yet — a guest name travels inside the booking id"
  ],
  "next": [
    {
      "milestone": "M0",
      "cards": 8,
      "done": 7,
      "blocked": 0
    },
    {
      "milestone": "M1",
      "cards": 26,
      "done": 24,
      "blocked": 0
    },
    {
      "milestone": "M2",
      "cards": 14,
      "done": 10,
      "blocked": 2
    },
    {
      "milestone": "M3",
      "cards": 21,
      "done": 8,
      "blocked": 4
    },
    {
      "milestone": "M4",
      "cards": 7,
      "done": 5,
      "blocked": 1
    },
    {
      "milestone": "M5",
      "cards": 3,
      "done": 2,
      "blocked": 0
    },
    {
      "milestone": "M6",
      "cards": 4,
      "done": 2,
      "blocked": 1
    }
  ],
  "acceptance_test": "One Indian property runs a paid month on AURA: its own login, bookings from one OTA and its own site, its own money, its own GST invoices and night audit, its Form C filed.",
  "acceptance_date": "2026-10-03"
}
