Intent Spec — finance.create_will_or_estate_plan
FULL ID: finance.create_will_or_estate_plan
VERSION: v1.0.0
STATUS: draft
LAST UPDATED: 2026-05-14
DOMAIN: finance
PRIMARY AGENT: FinanceAgent
TTBS WEIGHTS: time=0.10 taste=0.15 budget=0.20 safety=0.55
User creates a legally enforceable will, trust deed, succession plan, or appoints a power of attorney with the help of a qualified legal professional. Covers basic will drafting, registered will, holograph will review, private family trusts, succession-planning consultations, durable PoA, medical PoA, gift-deed support, and nomination updates across financial assets. Distinct from tax consultations and from financial-adviser sessions. TOMO never drafts wills via AI — every will is human-attorney-drafted and human-attorney-attested. Partner exemplars: Will Jini, ezeewill, Yellow Tie Legal, Dilsey, LawSikho legal-services arm, independent advocates aggregated through marketplaces.
SECTION 1 — INTENT IDENTITY
User wants to draft or update a will or wider estate plan with a qualified Indian-law-practising professional. Distinct from:
finance.book_tax_consultation— tax-onlyfinance.book_financial_advisor_session— investment advisory- DIY will-template downloads — explicitly out of scope; TOMO rejects providers that deliver only a template
- Court-stage litigation (probate / succession-certificate contests) — v1.1+
legal.book_estate_litigation
The professional MUST be an Advocate enrolled with a State Bar Council of India with active practice. Notary services and registration assistance must be performed by a licensed Notary Public / Sub-Registrar Office as applicable; partner orchestrates the end-to-end flow.
Single intent per will / plan. Periodic updates ("annual review of will") file as new bookings with the prior will referenced.
SECTION 2 — NATURAL LANGUAGE COVERAGE
CLASSIFIES IN
- "Make a will"
- "I want to create a will for my assets"
- "Legal will preparation"
- "Estate plan consultation"
- "Set up a private family trust"
- "Will-writing service near me"
- "Power of attorney for my parents"
- "Notarised will for my house"
- "Update my old will"
- "Plan succession of my business shares"
CLASSIFIES OUT — BORDERLINE NO
- "File a probate" → v1.1+
legal.book_estate_litigation - "Tax planning" →
finance.book_tax_consultation - "Financial planning" →
finance.book_financial_advisor_session - "Nominee for my mutual fund" → in-flow inside
finance.invest_in_mutual_fund - "Insurance nominee" → in-flow inside
finance.buy_term_insuranceetc. - "Property registration only" → out of scope v1
- "Gift deed only" → handled inside this intent's deeds tool 4
MULTI-INTENT TRIGGERS
- "Will + term insurance" →
finance.create_will_or_estate_plan+finance.buy_term_insurance - "Estate plan + tax consultation" →
finance.create_will_or_estate_plan+finance.book_tax_consultation - "Will + sell unused property" — single-intent dispatch (will), property sale routed separately
SECTION 3 — INPUT (TOMO → PROVIDER)
{
"intent": "finance.create_will_or_estate_plan",
"request_id": "req_01J9Z...",
"user_locale": "en-IN",
"user_currency": "INR",
"user_location": { "lat": 17.4475, "lng": 78.3563, "city": "Hyderabad", "pincode": "500032" },
"estate_request": {
"service_kind": "basic_will", // STRICT ENUM §6
"user_age_band": "40_to_50", // STRICT ENUM §6
"user_religion_for_personal_law": "hindu", // STRICT ENUM §6 — Indian succession law differs by religion
"marital_status": "married", // STRICT ENUM §6
"minor_beneficiary_present": true,
"estate_value_band_inr": "1cr_to_5cr", // STRICT ENUM §6
"asset_classes_to_cover": [ // STRICT ENUM array §6
"real_estate_self_use", "real_estate_investment",
"equity_mutual_fund", "ppf", "epf", "bank_deposit", "jewellery"
],
"non_resident_beneficiaries_present": false,
"preferred_mode": "video", // STRICT ENUM §6
"preferred_language": "te", // STRICT ENUM §6
"preferred_slot_window": {
"start": "2026-06-04T09:00:00+05:30",
"end": "2026-06-15T20:00:00+05:30"
},
"preferred_duration_minutes": 60,
"registration_required": true,
"notarization_required": true,
"home_visit_required_for_signing": false
},
"ttbs_user_band": {
"time": "flexible",
"taste": "balanced",
"budget": "good",
"safety": "great"
},
"session_context": { "tomo_session_id": "ses_01J9Z...", "user_dna_hash": "dna_v3_a7c9..." }
}
| Field | Type | Constraint | Notes |
|---|---|---|---|
intent |
string | REQUIRED, STRICT ENUM | Always finance.create_will_or_estate_plan |
estate_request.service_kind |
enum | REQUIRED, STRICT ENUM §6 | basic_will / registered_will / trust / poa / succession_consult / gift_deed |
estate_request.user_religion_for_personal_law |
enum | REQUIRED, STRICT ENUM §6 | Hindu / Muslim / Christian / Parsi / Sikh / Jain / Buddhist / other |
estate_request.marital_status |
enum | REQUIRED, STRICT ENUM §6 | |
estate_request.minor_beneficiary_present |
bool | REQUIRED | Triggers guardianship-clause necessity |
estate_request.estate_value_band_inr |
enum | REQUIRED, STRICT ENUM §6 | Anonymised; raw not exposed |
estate_request.asset_classes_to_cover |
array |
REQUIRED, STRICT ENUM §6, may NOT be empty | |
estate_request.non_resident_beneficiaries_present |
bool | REQUIRED | Triggers FEMA / FERA + DTAA flags |
estate_request.preferred_mode |
enum | REQUIRED, STRICT ENUM §6 | video / audio / in_person / chat |
estate_request.preferred_language |
enum | REQUIRED, STRICT ENUM §6 | |
estate_request.registration_required |
bool | REQUIRED | Sub-Registrar registration on the executed will |
estate_request.notarization_required |
bool | REQUIRED | Notarisation by Notary Public |
estate_request.home_visit_required_for_signing |
bool | REQUIRED | Drives in-person attestation by witnesses |
Anti-fabrication preamble: Provider may not list non-advocate "will writers" as legal professionals. Bar-council enrolment must be live as of request. TOMO does not transmit raw asset valuations until booking confirmed. Personal-law variance (Hindu / Muslim / Christian / Parsi etc.) is mandatory because succession differs (Hindu Succession Act, Muslim Personal Law, Indian Succession Act); incomplete classification = reject.
SECTION 4 — PROVIDER TOOLS
Tool 1: search_estate_lawyers
PURPOSE: Up to 15 qualified advocates matching service_kind + personal-law + language + window
SLA: p50 ≤ 700ms, p95 ≤ 2200ms, p99 ≤ 4500ms
RATE LIMIT: 60 req/min
IDEMPOTENCY: request_id; 120s cache
RETRY: 1 on 429, 2 on 5xx
Tool 2: get_lawyer_detail
PURPOSE: Bar council registration + practice profile + sample will (redacted)
SLA: p50 ≤ 500ms, p95 ≤ 1500ms
RATE LIMIT: 120 req/min
IDEMPOTENCY: lawyer_id; 24h cache
RETRY: 1 on 5xx
Tool 3: hold_slot
PURPOSE: Lock consultation slot for 15 minutes
SLA: p50 ≤ 700ms, p95 ≤ 2000ms
RATE LIMIT: 30 req/min
IDEMPOTENCY: request_id
RETRY: No retry
Tool 4: confirm_estate_engagement
PURPOSE: Convert hold → engagement letter + payment lock + draft-cycle plan
SLA: p50 ≤ 1500ms, p95 ≤ 4000ms
RATE LIMIT: 30 req/min
IDEMPOTENCY: request_id
RETRY: No retry
Tool 5: schedule_witnessing_and_registration
PURPOSE: Coordinate two-witness attestation + Sub-Registrar or Notary appointment
SLA: p50 ≤ 1500ms, p95 ≤ 5000ms
RATE LIMIT: 20 req/min
IDEMPOTENCY: engagement_id + step
RETRY: 1 on 5xx
Tool 6: deliver_executed_document
PURPOSE: Deliver signed + attested + (optionally) registered will/trust/PoA to user
SLA: p50 ≤ 1500ms, p95 ≤ 4500ms
RATE LIMIT: 30 req/min
IDEMPOTENCY: engagement_id
RETRY: 1 on 5xx
Tool 7: cancel_engagement
PURPOSE: Cancel engagement; refund per published stage policy
SLA: p50 ≤ 900ms, p95 ≤ 2500ms
RATE LIMIT: 30 req/min
IDEMPOTENCY: engagement_id
RETRY: 1 on 5xx
SECTION 5 — RESPONSE SHAPE
EstateLawyer
EstateLawyer:
lawyer_id: { type: string, constraint: REQUIRED, opaque }
full_name: { type: string, constraint: REQUIRED }
registration:
state_bar_council: { type: enum, constraint: REQUIRED, STRICT ENUM §6 (state codes) }
bar_enrolment_number: { type: string, constraint: REQUIRED, semantics: "e.g. KAR/12345/2010; verifiable on state bar council register" }
bar_enrolment_year: { type: int, constraint: REQUIRED, semantics: "Drives years_practice" }
aibe_passed: { type: boolean, constraint: REQUIRED, semantics: "All-India Bar Exam pass status" }
suspended_disbarred: { type: boolean, constraint: REQUIRED, semantics: "MUST be FALSE to remain in catalog" }
practice_profile:
years_of_practice: { type: int, constraint: REQUIRED, ≥0 }
estate_matters_completed: { type: int, constraint: REQUIRED, ≥0, semantics: "Lifetime count of wills / trusts / PoAs drafted" }
specialties: { type: array<enum>, constraint: REQUIRED, STRICT ENUM §6, may NOT be empty }
personal_law_expertise: { type: array<enum>, constraint: REQUIRED, STRICT ENUM §6, may NOT be empty }
nri_estate_experience: { type: boolean, constraint: REQUIRED }
multi_jurisdictional_experience: { type: boolean, constraint: REQUIRED }
languages_spoken: { type: array<enum>, constraint: REQUIRED, STRICT ENUM §6, may NOT be empty }
modes_supported: { type: array<enum>, constraint: REQUIRED, STRICT ENUM §6 }
fee_inr:
consultation_fee_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0, semantics: "First consultation" }
drafting_fee_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0, semantics: "Drafting fee for service_kind" }
revision_fee_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0, semantics: "Per revision after first 2 included" }
registration_assistance_fee_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
notarization_fee_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
home_visit_fee_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0, semantics: "Witnessing visit when home_visit_required_for_signing=true" }
gst_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
total_packaged_estimate_inr: { type: int, constraint: REQUIRED, INR_INTEGER, semantics: "Estimate for full service_kind end-to-end" }
stamp_duty_estimate_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0, semantics: "State-specific; pass-through to government" }
rating:
average_score: { type: float, constraint: REQUIRED, 0.0-5.0 }
review_count: { type: int, constraint: REQUIRED, ≥0 }
completion_rate_pct: { type: float, constraint: REQUIRED, 0-100 }
city: { type: string, constraint: REQUIRED }
state: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
in_person_available: { type: boolean, constraint: REQUIRED }
in_person_address: { type: string, constraint: REQUIRED, semantics: "Empty when not available" }
available_slots:
type: array<object>
constraint: REQUIRED, may NOT be empty
shape:
slot_id: { type: string, constraint: REQUIRED }
starts_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
ends_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
mode: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
sample_will_url: { type: string, constraint: REQUIRED, HTTPS URL, semantics: "Redacted sample document drafted by this advocate" }
partner_reference:
source: { type: string, constraint: REQUIRED }
deeplink: { type: string, constraint: REQUIRED, HTTPS URL }
Engagement
Engagement:
engagement_id: { type: string, constraint: REQUIRED, immutable }
lawyer_id: { type: string, constraint: REQUIRED }
lawyer_name: { type: string, constraint: REQUIRED }
service_kind: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
starts_at: { type: string, constraint: REQUIRED, ISO_DATETIME, semantics: "First consultation start" }
estimated_completion_date: { type: string, constraint: REQUIRED, ISO_DATE }
engagement_letter_url: { type: string, constraint: REQUIRED, HTTPS URL, semantics: "Signed engagement letter per Advocates Act" }
invoice_url: { type: string, constraint: REQUIRED, HTTPS URL }
payment_breakdown:
consultation_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
drafting_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
registration_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
notarization_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
home_visit_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
stamp_duty_pass_through_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
gst_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
total_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
stage_refund_policy:
type: array<object>
constraint: REQUIRED, may NOT be empty
shape:
stage: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [consultation_only, drafting_in_progress, draft_delivered, awaiting_signature, signed_not_registered, registered_complete] }
refund_pct: { type: int, constraint: REQUIRED, 0-100 }
WitnessingAndRegistration
WitnessingAndRegistration:
schedule_id: { type: string, constraint: REQUIRED }
engagement_id: { type: string, constraint: REQUIRED }
witnessing_scheduled_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
witnessing_location:
address: { type: string, constraint: REQUIRED }
city: { type: string, constraint: REQUIRED }
pincode: { type: string, constraint: REQUIRED }
is_home_visit: { type: boolean, constraint: REQUIRED }
witness_count_required: { type: int, constraint: REQUIRED, ≥2, semantics: "Indian Succession Act §63 mandates two witnesses" }
witnesses_arranged_by_partner: { type: boolean, constraint: REQUIRED }
notary_scheduled_at: { type: string, constraint: REQUIRED, ISO_DATETIME, semantics: "Empty string when notarisation skipped" }
registration_scheduled_at: { type: string, constraint: REQUIRED, ISO_DATETIME, semantics: "Empty string when registration skipped" }
registration_office: { type: string, constraint: REQUIRED, semantics: "Sub-Registrar office name; empty when skipped" }
ExecutedDocument
ExecutedDocument:
document_id: { type: string, constraint: REQUIRED, immutable }
engagement_id: { type: string, constraint: REQUIRED }
document_kind: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [will, registered_will, trust_deed, durable_poa, medical_poa, gift_deed, codicil] }
executed_on: { type: string, constraint: REQUIRED, ISO_DATE }
notarised: { type: boolean, constraint: REQUIRED }
registered: { type: boolean, constraint: REQUIRED }
registration_number: { type: string, constraint: REQUIRED, semantics: "Empty when registered=false" }
registration_office: { type: string, constraint: REQUIRED, semantics: "Empty when registered=false" }
document_pdf_url: { type: string, constraint: REQUIRED, HTTPS URL, semantics: "Encrypted; user-only signed URL ≥90 days" }
physical_copy_dispatched: { type: boolean, constraint: REQUIRED }
dispatch_tracking_url: { type: string, constraint: REQUIRED, HTTPS URL, semantics: "Empty when not dispatched" }
storage_advice_url: { type: string, constraint: REQUIRED, HTTPS URL, semantics: "Plain-language storage guide" }
CancellationResult
CancellationResult:
engagement_id: { type: string, constraint: REQUIRED }
cancelled_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
refund_amount_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
refund_method: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [original_payment, bank_transfer] }
refund_eta_days: { type: int, constraint: REQUIRED, 0-30 }
stage_at_cancellation: { type: enum, constraint: REQUIRED, STRICT ENUM §6 }
FORBIDDEN FIELDS
paid_placement_score,ad_bid,sponsored_rank,featured_lawyereditor_pick,tomo_recommended,top_choiceai_drafted_will_text— every clause must be human-attorney-authored; AI may assist but cannot solely-authorsuccess_guarantee_text,will_unchallengeable_guarantee— succession contests are case-specific; forbiddenai_generated_lawyer_photo,fabricated_estate_completion_countcommission_padded_fee,partner_revenue_sharereferral_kickbackfrom registration offices / notariesclient_real_namesin testimonials — initials only
SECTION 6 — CONTROLLED VOCABULARIES
estate_request.service_kind / specialties:
values:
basic_will: "Unregistered will, witnessed"
registered_will: "Will registered at Sub-Registrar"
holograph_review: "Review of an existing handwritten will"
trust: "Private family / specific-purpose trust deed"
durable_poa: "Durable / general power of attorney"
medical_poa: "Medical power of attorney / living will"
succession_consult: "Consultation on intestate succession options"
gift_deed: "Gift deed drafting + registration"
nomination_update: "Help updating nominations across financial assets"
will_update_codicil: "Codicil or full update to existing will"
estate_request.user_religion_for_personal_law:
values: [hindu, muslim_sunni, muslim_shia, christian, parsi, sikh, jain, buddhist, special_marriage_act, other]
resolution_order: "Drives applicable Act: Hindu Succession Act, Muslim Personal Law, Indian Christian Succession Act, Indian Succession Act 1925 etc."
estate_request.marital_status:
values: [single, married, divorced, widowed]
estate_request.estate_value_band_inr:
values:
under_25L, 25L_to_50L, 50L_to_1cr, 1cr_to_5cr, 5cr_to_25cr,
25cr_to_100cr, above_100cr
resolution_order: "Band only to partner; raw never pre-engagement."
estate_request.asset_classes_to_cover:
values:
real_estate_self_use, real_estate_investment, real_estate_ancestral,
real_estate_outside_india, equity_direct, equity_mutual_fund,
debt_mutual_fund, ppf, epf, nps, sukanya, fixed_deposit, savings_bank,
bank_locker_contents, jewellery, art_alt, intellectual_property,
private_company_shares, partnership_interest, crypto, foreign_assets,
digital_assets, life_insurance_policy, vehicle, livestock_farm
estate_request.preferred_mode / modes_supported / Engagement.mode:
values: [video, audio, in_person, chat]
estate_request.preferred_language / languages_spoken:
values: [en, hi, te, ta, kn, ml, mr, bn, gu, pa, or, as, ur]
EstateLawyer.registration.state_bar_council / state:
values:
AP, AR, AS, BR, CG, GA, GJ, HR, HP, JH, KA, KL, MP, MH, MN, ML, MZ, NL, OD,
PB, RJ, SK, TN, TS, TR, UP, UK, WB,
AN, CH, DN, DD, DL, JK, LA, LD, PY
EstateLawyer.practice_profile.personal_law_expertise:
values: [hindu, muslim_sunni, muslim_shia, christian, parsi, sikh, jain, buddhist, special_marriage_act, cross_personal_law]
Engagement.stage_refund_policy.stage / CancellationResult.stage_at_cancellation:
values:
consultation_only: "Only first consult complete"
drafting_in_progress: "Drafting started"
draft_delivered: "First draft delivered to user"
awaiting_signature: "Final draft, awaiting user signature"
signed_not_registered: "Signed and witnessed"
registered_complete: "Registered at Sub-Registrar"
ExecutedDocument.document_kind:
values: [will, registered_will, trust_deed, durable_poa, medical_poa, gift_deed, codicil]
CancellationResult.refund_method:
values: [original_payment, bank_transfer]
SECTION 7 — TTBS DIMENSIONS
TIME (weight = 0.10):
signals_used:
- earliest available_slot vs preferred_slot_window.start
- estimated_completion_date proximity (when service_kind has multi-step flow)
weighting:
earliest_slot: 0.50
completion_proximity: 0.50
user_band_handling:
fast: prefer next-48h consult + 2-week completion
balanced: 7d consult + month completion
flexible: 14d window OK; quality preferred over speed
TASTE (weight = 0.15):
signals_used:
- languages_spoken intersection with preferred_language
- personal_law_expertise includes user_religion_for_personal_law (HARD filter)
- specialty exact match with service_kind
- DNA repeat lawyer
weighting:
language_match: 0.30
specialty_match: 0.30
dna_repeat: 0.25
nri_experience: 0.15
BUDGET (weight = 0.20):
signals_used:
- fee_inr.total_packaged_estimate_inr
- revision_fee_inr (signals overflow risk for complex estates)
- stamp_duty_estimate_inr (state-driven; informs user but not a partner-quality signal)
weighting:
total_packaged: 0.70
revision_rate: 0.30
user_band_handling:
ok: cheapest passing safety floor
good: balanced fee vs rating
great: senior advocate regardless of fee
SAFETY (weight = 0.55):
signals_used:
- registration.bar_enrolment verified live
- registration.suspended_disbarred=false (HARD filter)
- registration.aibe_passed (post-2010 enrolees only)
- practice_profile.years_of_practice ≥5 floor for trust/POA, ≥3 for basic will
- practice_profile.estate_matters_completed ≥25 floor
- personal_law_expertise covers user_religion_for_personal_law (HARD filter)
- rating.completion_rate_pct ≥97
weighting:
bar_verified: 0.35
years_floor: 0.20
estate_matters_count: 0.20
personal_law_match: 0.15
completion_rate: 0.10
user_band_handling:
fast: floors held; no relaxation
balanced: standard
great: 10+ years + 100+ estates + senior advocate designation if available
Locked weights: time 0.10 / taste 0.15 / budget 0.20 / safety 0.55. Highest safety weight in the entire finance vertical — a defective will is uncovered only at the worst possible moment (death) when correction is impossible. Bar enrolment verification is non-negotiable hard filter.
SECTION 8 — COMPLETION CONTRACT
POST /api/v1/cpc/mcp_provider/<your_partner_id>
Body:
{
"intent": "finance.create_will_or_estate_plan",
"external_id": "<engagement_id>",
"request_id": "<request_id>",
"amount_inr": 2400, // NET partner commission only
"gst_inr": 432,
"tips_inr": 0,
"pass_through_inr": 13500, // lawyer + notary + stamp duty + registration fees
"closed_at": "2026-06-22T15:30:00+05:30",
"status": "completed",
"service_kind": "registered_will",
"document_kind": "registered_will",
"registered": true,
"registration_number": "TS-HYD-2026-W-4421"
}
Stamp-duty pass-through, registration fee pass-through, and notary fee pass-through all live in pass_through_inr — these flow to government / notary, not to the partner. Lawyer fee + partner margin is in amount_inr only to the extent of partner's NET commission. HMAC-SHA256, 5-min replay window.
For multi-step engagements, the final completion is filed when registered/executed document is delivered. Mid-stage cancellations file status: cancelled with the stage and pro-rated refund.
SECTION 9 — WIDGET
EstateLawyerListingWidget (planned). Interim: ProfessionalListingWidget.
Field mapping:
- full_name + "Advocate" pill
- state_bar_council + bar_enrolment_year → "Karnataka Bar · enrolled 2010"
- estate_matters_completed → "247 estates drafted"
- specialties → chip row
- personal_law_expertise → personal-law chip (when matched)
- rating.average_score + review_count → star pill
- fee_inr.total_packaged_estimate_inr → big price, "package" sublabel
- earliest available_slot → "Next: Wed 4 PM"
- in_person_available + city → location pill
- stamp_duty_estimate_inr → "+ ₹X stamp duty (state)"
SECTION 10 — CACHING POLICY
| Call | TTL | Rationale |
|---|---|---|
| search_estate_lawyers | 120s | Calendar volatile |
| get_lawyer_detail | 24h | Stable |
| hold_slot | NO CACHE | Idempotent |
| confirm_estate_engagement | NO CACHE | Idempotent |
| schedule_witnessing_and_registration | NO CACHE | Calendar/government slot dependent |
| deliver_executed_document | NO CACHE | One-time event |
| cancel_engagement | NO CACHE | — |
| Bar council verification | 7d | State bar councils update weekly |
SECTION 11 — ERROR CODES
| Code | HTTP | Meaning | Retry |
|---|---|---|---|
INVALID_REQUEST |
400 | Malformed | No |
RATE_LIMITED |
429 | Throttle | 1, 2s |
INTERNAL_ERROR |
500 | Partner failure | 2, exp |
SIGNATURE_INVALID |
401 | HMAC fail | No |
NO_LAWYER_MATCH |
200 (empty) | No advocate fits filters | n/a |
SLOT_TAKEN |
409 | Hold race-lost | UI re-queries |
HOLD_EXPIRED |
410 | Hold elapsed | UI re-holds |
BAR_REGISTRATION_INACTIVE |
422 | Advocate suspended/disbarred | No |
PERSONAL_LAW_OUT_OF_SCOPE |
422 | No expertise on user's religion | No |
PAYMENT_FAILED |
402 | Gateway declined | No |
WITNESSES_UNAVAILABLE |
422 | Witness arrangement infeasible at scheduled time | No (UI re-schedules) |
REGISTRATION_SLOT_UNAVAILABLE |
422 | Sub-Registrar slot unbookable | No |
STAMP_DUTY_UNCALCULABLE |
422 | Asset valuation missing for stamp calc | No |
CANCELLED_AT_STAGE |
200 (advisory) | Refund computed per stage_refund_policy | n/a |
MINOR_GUARDIAN_MISSING |
422 | minor_beneficiary_present=true but guardian appointment skipped | No |
DOCUMENT_DELIVERY_FAILED |
422 | Physical-copy dispatch failed | 2 retries |
SECTION 12 — SANDBOX → PRODUCTION CHECKLIST
[ ] All seven tools implemented
[ ] At least 25 advocates in catalog covering 5+ personal-law expertises
[ ] Every bar_enrolment_number verifiable on state bar council register (live)
[ ] suspended_disbarred=false verified at intake AND re-checked weekly
[ ] estate_matters_completed sample-audited (partner attests with file references)
[ ] Personal-law expertise validated (sample drafts reviewed for each declared expertise)
[ ] Indian Succession Act §63 two-witness requirement enforced in scheduling
[ ] Sub-Registrar office mapping verified for declared cities
[ ] Notary panel verified (notary commissions current with state government)
[ ] Stamp-duty calculator current per state (FY2026-27 rates)
[ ] Engagement letter format reviewed against Advocates Act
[ ] Cancellation stage-policy table publishes before payment
[ ] HMAC signing verified on test CPC webhook
[ ] amount_inr in CPC is COMMISSION (NET); pass_through_inr includes stamp duty + lawyer + notary + registration
[ ] All controlled vocabularies respected
[ ] No forbidden fields anywhere
[ ] No AI-drafted clauses leak into delivered documents
[ ] SLA p95 met (50-call sandbox run — lower volume than other intents)
[ ] Document storage encrypted at rest; signed URLs scoped to user only
[ ] Physical-copy dispatch via tracked courier (no IPO/regular post)
[ ] Privacy policy + grievance officer contact uploaded
[ ] Customer support: dedicated estate helpline + email
[ ] Spot-checks on 10% of new lawyer onboardings (sample-draft review by TOMO admin)
SECTION 13 — ANTI-FABRICATION RULES
RULE 1: Bar enrolment must be verifiable on the State Bar Council's public
register, current and not suspended. Re-checked weekly. Suspended
or disbarred = ingest rejection + immediate suspension.
RULE 2: aibe_passed must be TRUE for advocates enrolled after 2010 (when
AIBE became mandatory). FALSE flag for post-2010 enrolees = ingest
rejection.
RULE 3: estate_matters_completed must be defensible; TOMO spot-checks
request a sample of past file references (anonymised). Inflated
counts = suspension.
RULE 4: personal_law_expertise list must be defensible. Catalog spot-checks
sample drafts in each declared personal-law category. Declaring
Muslim Personal Law expertise without representative drafts =
suspension.
RULE 5: rating.average_score must be unrounded over past 12 months of
completed paid engagements. Reviews from incomplete or refunded
engagements excluded.
RULE 6: review_count from completed engagements only; signup interest /
free calls / draft-only-no-execution excluded.
RULE 7: No success_guarantee or "will-unchallengeable" guarantees. Indian
succession contests are case-specific. TOMO ingest scans for the
phrases "guaranteed / unchallengeable / litigation-proof / cannot
be contested" + variants.
RULE 8: AI-drafted clauses leaking into delivered documents = breach.
TOMO admin spot-checks sample delivered documents quarterly for
AI-pattern detection (boilerplate language, hallucinated section
references, generic boilerplate not adapted to user's personal law).
RULE 9: No paid_placement, ad_bid, sponsored_rank, featured_lawyer. Estate
advice influenced by commission structure is customer-harm.
RULE 10: amount_inr in CPC webhook is partner COMMISSION only. Stamp duty,
notary, registration, and the lawyer's professional fee live in
pass_through_inr. Partner inflating commission base = suspension +
tax / accounting audit.
RULE 11: Stamp-duty estimate must match the applicable state's current
schedule of fees. Outdated stamp values = ingest rejection
(TOMO maintains a current state-rates table; partner values are
checked against it).
RULE 12: Engagement letter must be per Advocates Act format. Generic
service agreements without the Advocates Act-required clauses =
regulatory breach + suspension.
RULE 13: Witnessing must use Indian Succession Act §63 two-witness rule.
Skipping witnesses for "self-attested wills" = customer-harm; will
is invalid. Ingest rejects bookings that hide witness step.
RULE 14: Minor-beneficiary cases MUST include guardian appointment clause.
Partner skipping = ingest rejection.
RULE 15: AI-generated lawyer headshots / fake bios forbidden. Government-ID
verified real photo only.
RULE 16: Client testimonials must use initials only ("R.K., Bengaluru").
Asset details / specific bequests forbidden — privacy-sensitive.
RULE 17: Information-completeness score (hidden rank factor weight 0.10)
rewards full §5 shape. Partial responses rank lower.
VERSION HISTORY
v1.0.0 — 2026-05-14 — Initial spec. Bar Council-enrolled advocates only;
"will writers" rejected. Personal-law mandatory
(Hindu / Muslim / Christian / Parsi etc.).
Indian Succession Act §63 two-witness enforced.
Stamp duty + notary + registration fees in
pass_through_inr. Safety-dominant TTBS (0.55,
highest in finance vertical). Bar enrolment
re-verified weekly. AI-drafted clauses forbidden.