LUCA OS — User Manual
Last trued: 2026-06-11 (Day-134) · Tracker stamp:
ROADMAP TABLE v3 · 2026-06-10 · serials 1-63 · ✅19 🔵2 ⬜42 🅿️1Live state source of truth:docs/handoff/LUCA_MASTER_TRACKER.md §R.2— when this manual disagrees with R.2, R.2 wins. Re-true this file when the stamp bumps. Audience: the people using LUCA today — the creator first, beta-invitees onapp.lucaos.appnext. Mirror tier: TWIN_OWNER (writes about what the owner of a twin sees and does).
PAST — what LUCA was, briefly
LUCA OS spent its first 130 days building organs: memory, recall, the ingest river, persona prose, the trust/draft gate, federation, governance. A lot was built dark — code merged but flag-OFF in prod. What you used between Day-77 (GCP move) and Day-132 was a chat surface with a brain that had not been switched on. Day-133 (Sitting-2 attended evening) flipped the four core flags one at a time, found five reasons the brain stayed dark even after flipping (mode-gap inheritance, the 80K prompt cliff, self-poisoning recall, two legacy band-aids), shipped seven small fixes, and the memory promise went live on the bots. This manual describes the product as it stands the morning after.
PRESENT — what LUCA is, today (Day-134)
The product, in one sentence: a Telegram twin that remembers what you teach it and answers from that memory the next time you ask — at paise per answer on the cheapest model tier.
1. Where the product runs
| Surface | URL / handle | What you do there | Status |
|---|---|---|---|
| Telegram bot (the twin) | @LucaOS_bot (the creator’s “Mahesh Twin”) | teach → recall → ask. This is the primary user surface today. | LIVE (Day-133 evening, creator-verified) |
| Web dashboard | app.lucaos.app | chat replay, CRM, invoicing, admin/seats, billing | LIVE for the creator + invited beta seats |
| Public API | https://api.lucaos.app | OAuth + JSON for tenant operations | LIVE; routes documented at /api/docs |
| Invite-acceptance page | app.lucaos.app/invite/<token> | turn an org-admin invite into your personal LUID + tenant seat | SHIPPED Day-131 (CQ-4); activation flag LUCA_PUBLIC_INVITE_ACCEPTANCE is default-OFF in prod, flipped per-window |
2. The memory promise (this is the headline feature)
Teach the twin something in normal English. Ask about it later — even days later, even with a different phrasing. The twin answers from what you taught, not from a generic LLM hallucination.
Example, creator-verified Day-133 evening on Telegram:
| You said earlier | You asked later | The twin answered |
|---|---|---|
| ”the electricity bill is 2,400 due on the 15th" "school fee is 1,50,000 due on the 18th" | "what bills do I have?" | "Electricity ₹2,400 (15th) and school fee ₹1,50,000 (18th). Total ₹1,52,400." |
| "vamsi’s number is 1233567890" | "vamsi’s number?" | "1233567890" |
| "his number” (the next turn) | — | resolved to vamsi (120-second adjacency rule) |
| “gym trainer is Arjun, 980667" | "gym trainer?" | "Arjun 980667” (no merge with old test fixtures) |
Cost per memory answer: paise. Tier: haiku by design. This is not a tier ceiling that goes up
later — basic memory is supposed to be cheap, forever.
3. The three human rules the fast-path uses
The memory path makes three judgements that any human would make without thinking. They are in code, not magic, but you should know they exist:
- Generic-token guard. If you teach “the gym trainer’s number is …” and later “the math trainer’s number is …”, asking “trainer’s number?” will NOT merge them into one wrong answer. “Trainer” alone is too generic; the twin asks which one.
- Finance family. “bill” and “fee” and “due payment” belong to the same family for memory purposes — asking “what bills do I have?” surfaces school fees too.
- 120-second conversational adjacency. A pronoun like “his number” arriving within ~2 minutes of “vamsi’s number” sticks to vamsi, not to whoever else was mentioned five minutes ago.
If a memory answer ever looks wrong, the explanation is almost always one of these three rules firing or failing — and the fix is to re-teach in a re-worded sentence, because the gateway dedups exact repeats (see §6 “what to know”).
4. What the twin does NOT do yet (be precise about this)
A lot of the Living-Twin wave is built but not turned on in prod. The code is in the repo,
the flag is default-OFF in deploy/docker-compose.full.yml, and the prod .env does not flip it.
Today, the twin will not:
| Capability | Built? | Live? | Notes |
|---|---|---|---|
| Detect-and-ask on conflicting facts (“you told me two different phone numbers for X — which one?”) | YES (SM_FACT_CONFLICT_ASK_M1, shipped Day-133) | NO | flag default-OFF, attended-flip pending |
| Take any autonomous action (book, send, pay, charge) | partly | NO | SM_INTENT_ROUTER_DRAFT_GATE_M1 (shipped) forces mutating intents to draft-and-wait; the activation flip is still creator-gated. Payments are categorically never-auto (cross-twin doctrine, immutable). |
| Server-side contradiction judging (the “supersession sweep”) | YES (SM_SUPERSESSION_SERVERSIDE_M1, shipped) | NO | runs Mac-only today; prod activation gated |
| Push proactive nudges through Telegram on detected contradictions | YES (SM_SUPERSESSION_QUEUE_NOTIFY_M1, shipped) | NO | depends on SERVERSIDE flip first |
| Run the post-reply brain async (MAGMA / Ambient / PQE) without slowing the reply | YES (SM_ASYNC_POST_PROCESS_M1, shipped) | NO | activation pending |
| Read your Gmail / WhatsApp / Drive on your behalf | partly | NO | W4.2 Composio integration is creator-gated; current Composio prod connectors return HTTP-410 |
| Speak with an ElevenLabs voice | parked | NO | Premium-tier feature, not in M1 scope |
Rule of thumb: if you see it described in a SESSION_HANDOFF_* doc as “shipped” but you do not
see it in the Sitting-2 LIVE table below, it is dark-built, not available. Ask the creator
before promising it to anyone.
5. What IS live in prod (the only honest table)
This table is the load-bearing one. It must match SITTING2_COMPLETE §1. If the bots get
re-deployed with different flags, this row needs to be updated the same session.
| Flag | Prod state | What it means for you |
|---|---|---|
LUCA_INGEST_BUS + LUCA_INGEST_BUS_BOOTSTRAP | 1 | every Telegram message you send runs the 5-stage ingest river → filed in per-twin nucleus cells |
LUCA_TWIN_SPINE | 1 | per-twin spine memory (each twin has its own brain, no cross-bleed) |
LUCA_CATEGORY_ROUTING | 1 (advisory) | message-type router decides the lane; the decision is NOT persisted to cells yet (SM_CATEGORY_ROUTE_PERSIST_M1 shipped, activation pending) |
LUCA_UNIFIED_RECALL_REPLY | 1 | the unified “librarian” feeds the full reply pipeline; question-cells are no longer self-poisoning the recall ranker |
LUCA_TWIN_OVERRIDES_CANONICAL + LUCA_DHARMA_EXTRACTOR | 1 | persona prose + value extraction (propose-only — nothing flips canonical state without you) |
LUCA_RECALL_FAST_PATH | 1 | memory-class questions answered from the store via a ~300-token scoped prompt, tier=haiku by design |
LUCA_NEVER_FORGOT_AUDIT_ENABLED + LUCA_REPLY_REFLECTION | 0 (VM .env) | legacy band-aids OFF — they were rewriting good memory answers into robot-speak once real recall existed |
6. Things you should know before you teach the twin a lot
- Re-teaches need re-wording. The gateway dedups exact repeat sentences across days (“duplicate already processed”). If you taught a fact yesterday and want to correct it, re-phrase the new sentence — don’t paste the old one with one word changed at the end.
- Memory is per-twin. Your Mahesh Twin’s memory does not bleed into anybody else’s twin.
Latusha’s twin, Nannu’s twin, Omshi’s twin — each has its own spine. This is enforced at the
store layer (
LUCA_TWIN_SPINE=1). - You can teach in normal English. No special syntax. The ingest river is trained to spot facts in declarative sentences. Questions are filtered out before they reach the store (Sitting-2 fix — questions used to outrank facts in recall).
- The twin is not a chat companion. It is a memory + judgement engine that speaks through chat. It will not invent emotions, opinions, or events you did not teach it.
- Premium model upgrades are not the fix for “the twin forgot.” Architecture is. If a memory answer looks wrong, the right diagnosis is which of the three human rules failed, not “switch to Sonnet/Opus.” Premium tiers exist for the creative/long-form path, not for basic recall.
7. The dashboard at app.lucaos.app
After you accept an invite (see §8) you land in the web dashboard. What’s there today:
| Section | What it does | Status |
|---|---|---|
| Chat | the same conversation surface as Telegram, with replay | LIVE |
| CRM | leads, deals, contacts, activities, kanban pipeline (/api/crm) | LIVE for enterprise-twin clients |
| Invoicing | invoices, GST (CGST/SGST/IGST), payments, PDF (/api/invoicing) | LIVE for enterprise-twin clients |
| Admin / Seats | invite team members, change roles, revoke invites | LIVE (CQ-4 admin console + role-change API + invite-revoke API, shipped Day-131) |
| Billing | tier (Free / Personal / Business), Razorpay subscription, GST invoice | LIVE (per docs/billing/BILLING_MODEL_V1.md) |
| HRMS / Inventory / Procurement / Marketing / Ticketing | enterprise-twin modules | available in the API; web UI surfaces them per-tenant |
API endpoints are documented at docs/05-API-REFERENCE.md and the live
auto-generated OpenAPI at https://api.lucaos.app/docs.
8. Onboarding — how you actually get in
LUCA is invite-gated. There is no public sign-up form. The path:
- An organisation admin issues you an invite from the admin console (CQ-4). You receive a
tokenised link
app.lucaos.app/invite/<token>. - You open the link. The page calls
GET /invite/<token>and shows you who invited you, which org you’d be joining, and how long the invite is valid. - You confirm.
POST /invite/<token>either resolves your email to an existing personal LUID or mints a fresh one (rule: one LUID per email, no matter how many tenants you join). You’re attached as a member of the org, and a session JWT is returned. - You land in the dashboard.
Same email, different tenant invite → same personal LUID, same personal twin, with a
second org membership attached. Your personal twin is created first; org memberships layer on
top. This is enforced by tests test_public_invite_route.py (15/15 GREEN).
Note on activation: the public invite-acceptance route is default-OFF in prod
(LUCA_PUBLIC_INVITE_ACCEPTANCE=0). Until the creator flips it in an attended window, invite
acceptance happens through the admin console flow directly. Day-134 status: shipped, awaiting
the activation window.
9. Pricing — what you pay
From docs/billing/BILLING_MODEL_V1.md (“Model C · Hybrid: LUCA
pays inside the tier; user adds own keys above the tier”):
| Tier | ₹/month | LLM calls/day | Composio actions/day | Indian-SDK calls/day | Hard suspend on overrun |
|---|---|---|---|---|---|
| Free | 0 | 100 | 50 | 10 | yes — 3-day grace |
| Personal | 499 | 1,000 | 500 | 100 | yes — 3-day grace |
| Business | 2,999 | 10,000 | unlimited | 1,000 | yes — 3-day grace |
- GST: 18% (CGST+SGST for Hyderabad / Telangana, IGST for other states). Invoices generated
by
bridge/billing/subscription/invoice_generator.py. - Razorpay subscription flips the tier on
subscription.chargedwebhook. Payment failure → 3-day grace → on overrun the twin downgrades to Free (data preserved, quota tightens) — never deleted. - BYOK overlay. At ≥ 80% of any tier quota, the chat UI surfaces a modal: paste your own Anthropic / OpenAI / Composio key and that provider’s quota check disables for your twin (your other providers still count against the tier).
- Free-tier phone verification: Personal tier requires a +91 SIM (Indian SIM only at launch).
10. Where things live (filesystem map, brief)
| You touch | Real path | Notes |
|---|---|---|
| Personal twin (yours) | body/twins/personal-twin/twins/<slug>/ | scaffolded by scripts/twins/scaffold_new_twin.py, pulse-gated |
| Enterprise twin (your org) | body/twins/enterprise-twin/clients/<slug>/ | Mahesh’s org = lucaverse-iot |
| Your spine memory | var/twin/<id>/spine/ | per-twin, isolated |
| CRM / HRMS / Invoicing / Inventory engines | body/twins/enterprise-twin/clients/<slug>/engines/{crm,hrms,invoicing,inventory}/ | canonical paths since Day-115; legacy body/lucaverse-iot/ is a symlink |
| Quotations | tools/document-pipeline/quotations/ | shared tool |
| Finance | external/skills/finance/ | shared skill |
| Your business documents (creator-local) | ~/Desktop/LucaVerse/{Quotations,Contracts,Invoices,brand}/ | not in the repo |
FUTURE — what’s next for you as a user
The Living-Twin wave (10 evidence-carrying SMs, all shipped Day-133 except where noted) is what moves the twin from “remembers” to “judges.” Once the creator attended-flips them in order:
- Detect-and-ask on conflicts. Two phone numbers for the same person? The twin asks which is current and supersedes the loser bitemporally.
- Draft-and-wait on mutations. Any chat that would write to CRM / Invoicing / Reminders drafts first, waits for your YES, then executes. Payments remain never-auto, even after this flips.
- Server-side contradiction sweep. A daemon judges contradictions where the memories live (the VM), not on the creator’s Mac. Telegram alerts when the queue grows.
- Async post-process. MAGMA / Ambient / Predictive-Query runs after the reply, so the brain gets smarter without making the reply slower.
- Prompt diet. The 67K-char creator-context photocopy currently sent on every message becomes a small identity-core + a query-aware dynamic slice. Faster replies, cheaper, better cache hits.
- Real semantic embeddings. Today the prod semantic engine falls back to TF-IDF because the embedding sidecar is default-OFF. Activation = “fee ≈ bill” works for every synonym, not just the ones the finance-family rule names.
After that comes G4: a real-user twin born from lucaos.app that reads its owner’s world
(Gmail / WhatsApp / Drive via Composio). That’s still creator-gated.
Reference: when something doesn’t behave the way this manual says
- Check the live flag table (§5). A prod redeploy may have flipped something. The truth is in
deploy/.envon the VM, the doctrine is&luca-envindeploy/docker-compose.full.yml. - Check the tracker stamp. If
LUCA_MASTER_TRACKER.md §R.2has bumped pastv3 · serials 1-63, this manual is stale — re-true it. - Look at the SESSION_HANDOFF for that day. The most recent handoff in
docs/handoff/is the honest state for everything not yet folded back into this manual.
LUCA OS — LUCAVERSE. Uma Mahesh Rajanala, Founder & CEO. Birth of Luca: 2026-01-28.