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.book_financial_advisor_session

Intent Spec — finance.book_financial_advisor_session

FULL ID:       finance.book_financial_advisor_session
VERSION:       v1.0.0
STATUS:        draft
LAST UPDATED:  2026-05-14
DOMAIN:        finance
PRIMARY AGENT: FinanceAgent
TTBS WEIGHTS:  time=0.15 taste=0.20 budget=0.20 safety=0.45

User books a paid one-on-one session with a SEBI-registered Investment Adviser (RIA) or a SEBI-registered Research Analyst (RA) for comprehensive financial planning: goal setting, asset allocation, portfolio review, retirement planning, child-education planning, debt-payoff strategy, NRI repatriation, family-office introductions, and second-opinion reviews. Pure advisory only — no product-distribution overlap. Distinct from tax-only consultations (CA), insurance-only consultations (POSP), and from will / estate planning. Partner exemplars: ScripBox Advisory, INDmoney Wealth, Kuvera Premium, FundsIndia Advisory, independent SEBI RIAs aggregated through marketplaces.


SECTION 1 — INTENT IDENTITY

User wants paid wealth-advisory time with a SEBI-licensed adviser. Distinct from:

  • finance.book_tax_consultation — narrow tax-only (CA / CMA / advocate)
  • finance.invest_in_mutual_fund — transactional, not advisory
  • finance.create_will_or_estate_plan — succession & estate
  • finance.apply_personal_loan / apply_home_loan — transactional credit
  • Tied-agent / distributor "free advice" — explicitly out of scope; ingest rejects RIAs that are also AMFI distributors for the same client (regulatory conflict)

The professional MUST hold a valid, current SEBI Investment Adviser (IA) registration (Individual or NR-IA) OR be an authorised employee of a SEBI-registered RIA entity. Research Analysts (RAs) may be listed for security-specific second opinions but not for fund-allocation advice. Mutual-fund distributors (ARN holders) are NOT acceptable under this intent — they're commission-conflicted by structure.

Single intent per session. Subscription-style ongoing advisory (quarterly plan) routes to v1.1+ finance.subscribe_advisory_retainer.


SECTION 2 — NATURAL LANGUAGE COVERAGE

CLASSIFIES IN

  • "Book a financial advisor"
  • "I need a SEBI RIA, fee-only please"
  • "Retirement planning session"
  • "Portfolio review by a real advisor"
  • "Goal-based planning for kids' education"
  • "Second opinion on my mutual fund portfolio"
  • "Financial planner near Hyderabad"
  • "Independent financial advisor, not a sales person"
  • "NRI repatriation advice consultation"
  • "Help me plan a ₹5 cr corpus by 50"

CLASSIFIES OUT — BORDERLINE NO

  • "Tax consultation" → finance.book_tax_consultation
  • "Buy SIP" → finance.invest_in_mutual_fund
  • "Make a will" → finance.create_will_or_estate_plan
  • "Apply for home loan" → finance.apply_home_loan
  • "Free advisor at my bank" — bank advisors are tied; route to finance.book_financial_advisor_session AFTER warning of conflict
  • "Stock tip Telegram channel" — out of scope; routes to safety warning

MULTI-INTENT TRIGGERS

  • "Financial advisor + term insurance review" → finance.book_financial_advisor_session + finance.buy_term_insurance
  • "RIA session + tax filing" → finance.book_financial_advisor_session + finance.book_tax_consultation
  • "Comprehensive plan + will" → finance.book_financial_advisor_session + finance.create_will_or_estate_plan

SECTION 3 — INPUT (TOMO → PROVIDER)

{
  "intent": "finance.book_financial_advisor_session",
  "request_id": "req_01J9Z...",
  "user_locale": "en-IN",
  "user_currency": "INR",
  "user_location": { "lat": 17.4475, "lng": 78.3563, "city": "Hyderabad", "pincode": "500032" },
  "session_request": {
    "topic": "retirement_planning",                 // STRICT ENUM §6
    "additional_topics": ["asset_allocation"],      // STRICT ENUM array §6
    "user_age_band": "30_to_40",                    // STRICT ENUM §6
    "user_persona": "salaried_individual",          // STRICT ENUM §6
    "estimated_net_worth_band_inr": "50L_to_1cr",   // STRICT ENUM §6
    "dependent_count": 2,
    "risk_tolerance_self_rated": "moderate",        // STRICT ENUM §6
    "existing_investments_summary": [               // STRICT ENUM array §6 (asset class buckets)
      "equity_mutual_fund", "ppf", "epf", "real_estate_self_use"
    ],
    "advisor_kind_required": "RIA_only",            // STRICT ENUM §6
    "preferred_mode": "video",                      // STRICT ENUM §6
    "preferred_language": "en",                     // STRICT ENUM §6
    "preferred_slot_window": {
      "start": "2026-06-03T09:00:00+05:30",
      "end":   "2026-06-08T20:00:00+05:30"
    },
    "preferred_duration_minutes": 60,
    "no_conflict_disclosure_required": true
  },
  "ttbs_user_band": {
    "time":   "balanced",
    "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.book_financial_advisor_session
session_request.topic enum REQUIRED, STRICT ENUM §6 Drives advisor specialty match
session_request.user_age_band enum REQUIRED, STRICT ENUM §6 Coarse age (life-stage planning)
session_request.user_persona enum REQUIRED, STRICT ENUM §6
session_request.estimated_net_worth_band_inr enum REQUIRED, STRICT ENUM §6 Anonymised; raw never shared until booking
session_request.risk_tolerance_self_rated enum REQUIRED, STRICT ENUM §6 conservative / moderate / aggressive
session_request.existing_investments_summary array REQUIRED, STRICT ENUM §6 May NOT be empty (use [none_yet] if so)
session_request.advisor_kind_required enum REQUIRED, STRICT ENUM §6 RIA_only / RA_only / either
session_request.preferred_mode enum REQUIRED, STRICT ENUM §6
session_request.preferred_language enum REQUIRED, STRICT ENUM §6
session_request.no_conflict_disclosure_required bool REQUIRED When TRUE, only fee-only advisers (no distribution income) returned

Anti-fabrication preamble: Provider may not list ARN-only distributors as advisers. SEBI IA registration must be live as of request time. TOMO does not surface raw net-worth — only band. Partner cannot quote higher fee in response to a higher net-worth band. No-conflict mode (no_conflict_disclosure_required=true) forces fee-only filter; any adviser earning trail commission on the recommended product is rejected.


SECTION 4 — PROVIDER TOOLS

Tool 1: search_advisors

PURPOSE:      Up to 20 SEBI-registered advisers matching topic + persona + slot window + language + no-conflict rule
SLA:          p50 ≤ 700ms, p95 ≤ 2000ms, p99 ≤ 4500ms
RATE LIMIT:   60 req/min
IDEMPOTENCY:  request_id; 120s cache
RETRY:        1 on 429, 2 on 5xx

Tool 2: get_advisor_detail

PURPOSE:      Full SEBI registration + practice profile + AUM advised + sample plan
SLA:          p50 ≤ 500ms, p95 ≤ 1500ms
RATE LIMIT:   120 req/min
IDEMPOTENCY:  advisor_id; 24h cache
RETRY:        1 on 5xx

Tool 3: hold_slot

PURPOSE:      Lock a session slot for 15 minutes
SLA:          p50 ≤ 700ms, p95 ≤ 2000ms
RATE LIMIT:   30 req/min
IDEMPOTENCY:  request_id
RETRY:        No retry

Tool 4: confirm_booking

PURPOSE:      Convert hold → confirmed booking + generate meeting link + payment lock
SLA:          p50 ≤ 1500ms, p95 ≤ 4000ms
RATE LIMIT:   30 req/min
IDEMPOTENCY:  request_id
RETRY:        No retry

Tool 5: submit_pre_session_questionnaire

PURPOSE:      User completes risk profile + goal forms required by SEBI's IA Regulations
SLA:          p50 ≤ 1500ms, p95 ≤ 5000ms
RATE LIMIT:   10 attempts / booking
IDEMPOTENCY:  booking_id
RETRY:        No retry on submit

Tool 6: cancel_booking

PURPOSE:      Cancel + pro-rated refund
SLA:          p50 ≤ 900ms, p95 ≤ 2500ms
RATE LIMIT:   30 req/min
IDEMPOTENCY:  booking_id
RETRY:        1 on 5xx

SECTION 5 — RESPONSE SHAPE

Advisor

Advisor:
  advisor_id: { type: string, constraint: REQUIRED, opaque }
  full_name: { type: string, constraint: REQUIRED }

  registration:
    sebi_ia_registration_number: { type: string, constraint: REQUIRED, semantics: "Verifiable on sebi.gov.in IA list; empty allowed only when kind=RA_only" }
    sebi_ra_registration_number: { type: string, constraint: REQUIRED, semantics: "Empty allowed when kind=RIA_only" }
    registration_kind: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [RIA_individual, RIA_corporate_employee, RA_individual, RA_corporate_employee] }
    registration_valid_until: { type: string, constraint: REQUIRED, ISO_DATE }
    is_fee_only: { type: boolean, constraint: REQUIRED, semantics: "TRUE = adviser earns NO commission from any product distributor; required when no_conflict_disclosure_required=true" }
    distribution_arn: { type: string, constraint: REQUIRED, semantics: "AMFI ARN; empty when is_fee_only=true" }
    conflict_disclosures: { type: array<string>, constraint: REQUIRED, may be empty, semantics: "Plain-language disclosures per SEBI's IA Regulations Chapter III" }

  practice_profile:
    years_of_practice: { type: int, constraint: REQUIRED, ≥0 }
    aum_advised_inr_crore: { type: int, constraint: REQUIRED, ≥0, semantics: "Total assets under advisory; not under management — distinction matters" }
    client_count_active: { type: int, constraint: REQUIRED, ≥0 }
    specialties: { type: array<enum>, constraint: REQUIRED, STRICT ENUM §6, may NOT be empty }
    additional_certifications: { type: array<enum>, constraint: REQUIRED, STRICT ENUM §6, may be empty }

  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:
    base_session_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
    per_extension_30min_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
    gst_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
    total_first_session_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
    follow_up_session_inr: { type: int, constraint: REQUIRED, INR_INTEGER, semantics: "Discounted follow-up rate, may equal base_session_inr" }

  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_plan_url: { type: string, constraint: REQUIRED, HTTPS URL, semantics: "Redacted sample financial plan PDF, illustrating depth" }

  partner_reference:
    source: { type: string, constraint: REQUIRED }
    deeplink: { type: string, constraint: REQUIRED, HTTPS URL }

SlotHold

SlotHold:
  hold_id: { type: string, constraint: REQUIRED }
  advisor_id: { type: string, constraint: REQUIRED }
  slot_id: { type: string, constraint: REQUIRED }
  hold_expires_at: { type: string, constraint: REQUIRED, ISO_DATETIME }
  fee_locked_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
  questionnaire_required: { type: boolean, constraint: REQUIRED, semantics: "TRUE per SEBI IA Regulations" }
  questionnaire_url: { type: string, constraint: REQUIRED, HTTPS URL }

ConfirmedBooking

ConfirmedBooking:
  booking_id: { type: string, constraint: REQUIRED }
  advisor_id: { type: string, constraint: REQUIRED }
  advisor_name: { 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 }
  meeting_url: { type: string, constraint: REQUIRED, HTTPS URL, semantics: "Empty when in_person" }
  in_person_address: { type: string, constraint: REQUIRED, semantics: "Empty when not in_person" }
  fee_paid_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
  invoice_url: { type: string, constraint: REQUIRED, HTTPS URL }
  agreement_url: { type: string, constraint: REQUIRED, HTTPS URL, semantics: "SEBI-prescribed IA-client agreement, e-signed pre-session" }
  rescheduling_policy:
    free_reschedules_remaining: { type: int, constraint: REQUIRED, ≥0 }
    cutoff_hours_before_session: { type: int, constraint: REQUIRED, ≥0 }
  cancellation_policy:
    full_refund_until: { type: string, constraint: REQUIRED, ISO_DATETIME }
    partial_refund_until: { type: string, constraint: REQUIRED, ISO_DATETIME }
    partial_refund_pct: { type: int, constraint: REQUIRED, 0-100 }

CancellationResult

CancellationResult:
  booking_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-15 }

FORBIDDEN FIELDS

  • paid_placement_score, ad_bid, sponsored_rank, featured_advisor, commission_uplift
  • editor_pick, tomo_recommended, top_choice
  • referral_kickback, partner_revenue_share
  • success_story_text with named clients (initials only)
  • guaranteed_returns_text (SEBI prohibits)
  • fund_recommendation_in_listing — fund picks are an in-session deliverable, never in the listing card
  • ai_generated_advisor_photo, fabricated_aum_inr, inflated_client_count
  • commission_padded_fee (fee must be true session fee, not gross of any kickback)

SECTION 6 — CONTROLLED VOCABULARIES

session_request.topic / specialties:
  values:
    retirement_planning:        "Goal corpus + drawdown plan"
    asset_allocation:           "Equity / debt / gold / alts mix"
    portfolio_review:           "Second-opinion review of existing portfolio"
    goal_based_planning:        "Child education / home / vacation goals"
    debt_payoff_strategy:       "Loan-prepayment optimisation"
    nri_planning:               "NRI accounts, repatriation, DTAA"
    risk_protection_review:     "Insurance / cover adequacy"
    estate_intro:               "Intro to estate-planning needs (handoff to will spec)"
    second_opinion_security:    "Single-stock second opinion (RA only)"
    family_office_intro:        "Intro to family-office structures (HNI)"

session_request.user_age_band:
  values: [under_25, 25_to_30, 30_to_40, 40_to_50, 50_to_60, 60_plus]

session_request.user_persona:
  values: [salaried_individual, freelancer, business_owner, doctor_lawyer_professional, nri, senior_citizen, hni, first_time_investor]

session_request.estimated_net_worth_band_inr:
  values:
    under_10L, 10L_to_25L, 25L_to_50L, 50L_to_1cr, 1cr_to_2cr,
    2cr_to_5cr, 5cr_to_25cr, above_25cr
  resolution_order: "Partner sees ONLY band; raw never transmitted pre-booking."

session_request.risk_tolerance_self_rated:
  values: [conservative, moderate, aggressive]

session_request.existing_investments_summary:
  values:
    none_yet, equity_direct, equity_mutual_fund, debt_mutual_fund,
    hybrid_mutual_fund, ppf, epf, nps, sukanya, ssy, fixed_deposit,
    recurring_deposit, gold_physical, sgb, gold_etf, real_estate_self_use,
    real_estate_investment, reit, invit, foreign_equity, crypto, art_alt,
    private_equity, structured_product

session_request.advisor_kind_required:
  values:
    RIA_only:   "Investment Adviser only"
    RA_only:    "Research Analyst (security-specific) only"
    either:     "Either acceptable"

session_request.preferred_mode / modes_supported / ConfirmedBooking.mode:
  values: [video, audio, in_person]

session_request.preferred_language / languages_spoken:
  values: [en, hi, te, ta, kn, ml, mr, bn, gu, pa, or, as, ur]

Advisor.registration.registration_kind:
  values:
    RIA_individual:            "Individual SEBI IA"
    RIA_corporate_employee:    "Employee of SEBI-registered IA entity"
    RA_individual:             "Individual SEBI RA"
    RA_corporate_employee:     "Employee of SEBI-registered RA entity"

Advisor.practice_profile.additional_certifications:
  values: [CFP, CFA_charterholder, CWM, CIMA, FRM, none]

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

CancellationResult.refund_method:
  values: [original_payment, bank_transfer]

SECTION 7 — TTBS DIMENSIONS

TIME (weight = 0.15):
  signals_used:
    - earliest available_slot vs preferred_slot_window.start
    - modes_supported includes preferred_mode
  weighting:
    earliest_slot_fit: 0.70
    mode_match: 0.30
  user_band_handling:
    fast: prefer next-48h
    balanced: standard
    flexible: 7-day window OK

TASTE (weight = 0.20):
  signals_used:
    - languages_spoken intersection with preferred_language
    - specialties match with topic + additional_topics
    - DNA repeat advisor
    - additional_certifications (CFP / CFA signal expertise prestige)
  weighting:
    language: 0.25
    specialty: 0.30
    dna: 0.30
    certs: 0.15

BUDGET (weight = 0.20):
  signals_used:
    - fee_inr.total_first_session_inr
    - follow_up_session_inr (signals long-term economic viability)
  weighting:
    first_session: 0.70
    follow_up: 0.30
  user_band_handling:
    ok:    cheapest passing safety floor
    good:  balanced
    great: senior CFP / CFA regardless of fee

SAFETY (weight = 0.45):
  signals_used:
    - registration.sebi_ia_registration_number verified live
    - registration.registration_valid_until ≥ session date
    - registration.is_fee_only (TRUE when no_conflict_disclosure_required=true is HARD filter)
    - registration.conflict_disclosures completeness
    - practice_profile.years_of_practice ≥3 floor
    - rating.completion_rate_pct ≥95
    - aum_advised_inr_crore ≥1 floor (signals real practice)
  weighting:
    registration_live: 0.35
    fee_only_compliance: 0.20
    years_practice: 0.15
    completion_rate: 0.15
    aum_floor: 0.15
  user_band_handling:
    fast: relax years floor to 1
    balanced: floor 3
    great: floor 8 + CFP or CFA mandatory

Locked weights: time 0.15 / taste 0.20 / budget 0.20 / safety 0.45. Advisory is information that compounds — bad advice over 30 years is uncapped harm. SEBI registration is non-negotiable; safety dominates.


SECTION 8 — COMPLETION CONTRACT

POST /api/v1/cpc/mcp_provider/<your_partner_id>
Body:
{
  "intent":           "finance.book_financial_advisor_session",
  "external_id":      "<booking_id>",
  "request_id":       "<request_id>",
  "amount_inr":       600,    // NET partner commission only (15-30% of advisor fee)
  "gst_inr":          108,
  "tips_inr":         0,
  "pass_through_inr": 3000,   // session fee remitted to advisor
  "closed_at":        "2026-06-05T18:30:00+05:30",
  "status":           "completed",
  "topic":            "retirement_planning",
  "advisor_kind":     "RIA_individual",
  "is_fee_only":      true,
  "mode":             "video",
  "duration_minutes": 60
}

User pays full fee (e.g. ₹3,000); partner's NET commission (~₹600) is amount_inr. Advisor's earning is pass_through_inr. TOMO charges 10% × ₹600 = ₹60. HMAC-SHA256, 5-min replay window.

Follow-up sessions file separate completions with the same matter_id. No silent retainer auto-billing.


SECTION 9 — WIDGET

AdvisorListingWidget.

Field mapping:
  - full_name + registration_kind pill (e.g. "SEBI RIA")
  - is_fee_only → green "Fee-only" badge when TRUE
  - years_of_practice + aum_advised_inr_crore → "12 yrs · ₹85 cr advised"
  - specialties → chip row
  - rating.average_score + review_count → star pill
  - fee_inr.total_first_session_inr → big price
  - earliest available_slot → "Next: Wed 4 PM"
  - languages_spoken intersection → language chip
  - additional_certifications (CFP / CFA) → cert pill

SECTION 10 — CACHING POLICY

Call TTL Rationale
search_advisors 120s Calendar volatile
get_advisor_detail 24h Stable
hold_slot NO CACHE Idempotent
confirm_booking NO CACHE Idempotent
submit_pre_session_questionnaire NO CACHE
cancel_booking NO CACHE
SEBI registration verification 7d SEBI updates 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_ADVISOR_MATCH 200 (empty) No advisor fits filters n/a
SLOT_TAKEN 409 Hold race-lost UI re-queries
HOLD_EXPIRED 410 Hold elapsed UI re-holds
SEBI_REG_EXPIRED 422 Adviser registration lapsed No (advisor suspended)
CONFLICT_FLAGGED 422 Adviser has distribution income for recommended products + no_conflict required No
PAYMENT_FAILED 402 Gateway declined No
QUESTIONNAIRE_INCOMPLETE 422 SEBI risk-profile incomplete No (UI completes)
AGREEMENT_NOT_ESIGNED 422 IA-client agreement not signed No
CANCELLED_TOO_LATE 410 Past partial_refund cutoff No
MODE_UNSUPPORTED 422 Mode not supported No
LANGUAGE_MISMATCH 422 No language overlap No

SECTION 12 — SANDBOX → PRODUCTION CHECKLIST

[ ] All six tools implemented
[ ] At least 30 advisers in catalog
[ ] Every sebi_ia_registration_number verifiable on sebi.gov.in IA list (live)
[ ] Every sebi_ra_registration_number verifiable on sebi.gov.in RA list (live)
[ ] is_fee_only flag tested against partner records (sample audit)
[ ] No AMFI ARN holder marketed as RIA without explicit conflict disclosure
[ ] conflict_disclosures match SEBI's Chapter III IA Regulations format
[ ] SEBI-prescribed IA-client agreement available as agreement_url and tested e-signed flow
[ ] SEBI-prescribed risk profile questionnaire available and completion gated pre-session
[ ] Net-worth band only exposed pre-booking; raw never transmitted before confirmation
[ ] AUM advised verifiable (partner's SEBI compliance officer attests)
[ ] Cancellation refund tested end-to-end
[ ] HMAC signing verified on test CPC webhook
[ ] amount_inr in CPC is COMMISSION (NET), pass_through_inr is advisor fee
[ ] All controlled vocabularies respected
[ ] No forbidden fields anywhere
[ ] SLA p95 met (100-call sandbox run)
[ ] Privacy policy + grievance officer contact uploaded
[ ] Customer support: dedicated advisory helpline + email
[ ] Adviser onboarding pipeline reviewed (TOMO admin spot-checks 5 random profiles)
[ ] Session-recording consent flow tested; recordings encrypted at rest, deleted on user request

SECTION 13 — ANTI-FABRICATION RULES

RULE 1: SEBI IA / RA registration must be live and verifiable on SEBI's
        public register at the time of session start, not at signup.
        Expired or suspended registrations = ingest rejection + partner suspension.

RULE 2: When user requests no_conflict_disclosure_required=true, ONLY
        adviser records with is_fee_only=true and no AMFI ARN at all are
        returned. Partial fee-only ("we charge advisory + trail of mutual
        funds") is NOT fee-only and must be filtered out.

RULE 3: aum_advised_inr_crore must be assets under advisory (advised but
        executed by client at distribution platform of their choice), NOT
        assets under management. Distinction is critical — RIA cannot have
        AUM in same regulated relationship. Partner inflating with AUM =
        suspension.

RULE 4: years_of_practice = years since SEBI IA registration granted, NOT
        years of "experience in finance" pre-registration. Pre-registration
        years can be in additional_certifications descriptive only.

RULE 5: No paid_placement, ad_bid, sponsored_rank, featured_advisor.

RULE 6: rating.average_score must be unrounded over past 12 months of
        completed paid sessions; shadow score from CPC ledger audited.

RULE 7: review_count from completed paid sessions only.

RULE 8: No success-story testimonials with named clients. Initials only.
        Specific return claims ("my advisor got me 18% CAGR") forbidden —
        SEBI prohibits regulated advice from being marketed via past returns.

RULE 9: No guaranteed_returns_text anywhere in profile, sample plan, or
        listing card. SEBI prohibits. TOMO ingest scans for the words
        "guaranteed return / assured return / definite return" + variants.

RULE 10: AI-generated advisor headshots forbidden. Government-ID verified
         real photo only.

RULE 11: Fund / stock / specific-product names cannot appear in listing
         cards. Recommendations are in-session deliverables, never in the
         marketing surface. TOMO ingest scans for known ISIN-pattern,
         ticker-pattern, AMC-pattern text in card fields.

RULE 12: amount_inr in CPC webhook is partner COMMISSION only.
         pass_through_inr is advisor's fee. Partner inflating commission
         base = suspension + RBI / SEBI auditable accounting review.

RULE 13: SEBI-prescribed IA-client agreement MUST be e-signed before session
         starts. No "click-wrap acceptance"; SEBI requires actual e-sign
         with audit trail. Partner skipping this = regulatory breach and
         partner suspension.

RULE 14: Risk-profile questionnaire mandated by SEBI IA Regulations MUST be
         completed before any recommendation in-session. Partners enabling
         skip = regulatory breach + suspension.

RULE 15: Session recordings, transcripts, and plan documents belong to the
         user. Partner may not use for training models, marketing, or
         resale without per-session opt-in consent (not signup click-wrap).

RULE 16: Information-completeness score (hidden rank factor weight 0.10)
         rewards full §5 shape. Partial responses rank lower.

RULE 17: Adviser cannot be a "free advisor" listing that funnels users into
         distribution at the partner-side. Listing here = paid advisory
         only. Free-consultation funnel listings = ingest rejection.

VERSION HISTORY

v1.0.0 — 2026-05-14 — Initial spec. SEBI RIA / RA only; AMFI distributors
                       rejected. No-conflict mode forces fee-only filter.
                       SEBI-prescribed IA-client agreement + risk-profile
                       questionnaire mandatory pre-session. Safety-dominant
                       TTBS (0.45). Net-commission base in §8.
                       Net-worth bands only pre-booking; raw gated.