T
TOMO
Developer Docs
BETA These docs are under partner review. Some features described are roadmap items, not yet shipped. Verify against your sandbox before relying on any contract.
● DRAFTv1.0.0finance.create_will_or_estate_plan

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-only
  • finance.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_insurance etc.
  • "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_lawyer
  • editor_pick, tomo_recommended, top_choice
  • ai_drafted_will_text — every clause must be human-attorney-authored; AI may assist but cannot solely-author
  • success_guarantee_text, will_unchallengeable_guarantee — succession contests are case-specific; forbidden
  • ai_generated_lawyer_photo, fabricated_estate_completion_count
  • commission_padded_fee, partner_revenue_share
  • referral_kickback from registration offices / notaries
  • client_real_names in 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.