Intent Spec — finance.book_tax_consultation
FULL ID: finance.book_tax_consultation
VERSION: v1.0.0
STATUS: draft
LAST UPDATED: 2026-05-14
DOMAIN: finance
PRIMARY AGENT: FinanceAgent
TTBS WEIGHTS: time=0.20 taste=0.20 budget=0.20 safety=0.40
User books a Chartered Accountant (CA) or tax-practitioner consultation for personal or small-business income-tax matters. Covers ITR filing, TDS / TCS issues, capital-gains computation, foreign-income disclosures, advance-tax planning, GST queries (sole proprietor / freelancer), notices from the Income Tax Department, and rectifications. Distinct from generic financial advisory (which is broader wealth planning) and from will / estate planning. Partner exemplars: ClearTax, Quicko, TaxBuddy, H&R Block India, Vakilsearch, IndiaFilings, local CA networks aggregated through marketplaces.
SECTION 1 — INTENT IDENTITY
User wants to schedule a paid consultation with a qualified tax professional. Distinct from:
finance.book_financial_advisor_session— broader wealth / portfolio advice not specific to taxfinance.create_will_or_estate_plan— succession & estate, not taxationfinance.invest_in_mutual_fund— transactional investingcompliance.verify_kyc— document verification, not advice- Generic legal consultation — out of scope; v1.1+
legal.book_lawyer_consultation
The professional MUST be one of: Chartered Accountant (CA, ICAI), Tax Return Preparer (TRP, CBDT empanelled), Cost Accountant (CMA) for indirect-tax matters, or Advocate practicing in tax. Bookkeepers / accounting clerks not qualified to advise on Income Tax Act provisions are rejected by ingest.
Single intent per case file. Recurring consultations (monthly bookkeeping retainers) route to v1.1+ finance.subscribe_tax_retainer.
SECTION 2 — NATURAL LANGUAGE COVERAGE
CLASSIFIES IN
- "Book a CA for ITR filing"
- "I got a notice from income tax, need help"
- "Tax consultant for capital gains on shares"
- "CA appointment this week, near Banjara Hills"
- "Help me file ITR-3 for freelance income"
- "I need to plan my advance tax payment"
- "Foreign salary tax, need a CA"
- "GST registration for my freelance business"
- "Best tax advisor for NRI returns"
- "Online tax filing consultation with a real CA"
CLASSIFIES OUT — BORDERLINE NO
- "Buy mutual funds" →
finance.invest_in_mutual_fund - "Make a will" →
finance.create_will_or_estate_plan - "Verify my PAN" →
compliance.verify_kyc - "Legal lawyer for property dispute" → out of scope v1
- "Audit my company books" → out of scope v1; statutory audit is a different engagement
- "Apply for a personal loan" →
finance.apply_personal_loan - "Investment advice" →
finance.book_financial_advisor_session
MULTI-INTENT TRIGGERS
- "CA + will preparation" →
finance.book_tax_consultation+finance.create_will_or_estate_plan - "Capital gains advice + sell my old car for the capital loss" →
finance.book_tax_consultation+marketplace.sell_used_car - "Tax filing + new health insurance for 80D deduction" →
finance.book_tax_consultation+finance.buy_health_insurance
SECTION 3 — INPUT (TOMO → PROVIDER)
{
"intent": "finance.book_tax_consultation",
"request_id": "req_01J9Z...",
"user_locale": "en-IN",
"user_currency": "INR",
"user_location": { "lat": 17.4475, "lng": 78.3563, "city": "Hyderabad", "pincode": "500032" },
"consultation_request": {
"matter_kind": "itr_filing", // STRICT ENUM §6
"tax_year_assessment": "2026-27", // ISO assessment year string
"user_persona": "salaried_individual", // STRICT ENUM §6
"estimated_income_band_inr": "10_to_25_lakh", // STRICT ENUM §6
"complexity_signals": [ // STRICT ENUM array §6
"capital_gains_equity",
"foreign_dividend"
],
"has_notice": false,
"notice_section": null, // e.g. "139(9)" when has_notice=true
"preferred_mode": "video", // STRICT ENUM §6
"preferred_language": "en", // STRICT ENUM §6
"preferred_slot_window": {
"start": "2026-06-01T09:00:00+05:30",
"end": "2026-06-05T20:00:00+05:30"
},
"preferred_duration_minutes": 45,
"preferred_gender_of_professional": "no_preference"
},
"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_tax_consultation |
consultation_request.matter_kind |
enum | REQUIRED, STRICT ENUM §6 | Drives professional specialty match |
consultation_request.tax_year_assessment |
string | REQUIRED, format YYYY-YY |
Current or prior assessment year |
consultation_request.user_persona |
enum | REQUIRED, STRICT ENUM §6 | Salaried / freelancer / business / NRI etc. |
consultation_request.estimated_income_band_inr |
enum | REQUIRED, STRICT ENUM §6 | Anonymised income band; never raw income to partner |
consultation_request.complexity_signals |
array |
REQUIRED, STRICT ENUM §6 | May be empty; drives matching to senior practitioners |
consultation_request.has_notice |
bool | REQUIRED | TRUE flips to notice-handling specialist |
consultation_request.notice_section |
string|null | REQUIRED | Income Tax Act section number when has_notice=true |
consultation_request.preferred_mode |
enum | REQUIRED, STRICT ENUM §6 | video / audio / in_person / chat |
consultation_request.preferred_language |
enum | REQUIRED, STRICT ENUM §6 | en / hi / te / ta / kn / ml / mr / bn / gu |
consultation_request.preferred_slot_window.start/end |
string | REQUIRED, ISO_DATETIME | Window must be ≥24h ahead unless urgent_notice=true |
consultation_request.preferred_duration_minutes |
int | REQUIRED, 15-120 | Drives professional's calendar block |
Anti-fabrication preamble: Provider may not list a non-ICAI / non-CBDT-empanelled professional as a "CA." Credential mis-statement is per-se ingest rejection. TOMO does not surface raw income — only band. Partner cannot quote a higher fee in response to a higher income band; matching is by complexity not income.
SECTION 4 — PROVIDER TOOLS
Tool 1: search_tax_professionals
PURPOSE: Up to 20 candidate professionals matching matter_kind + persona + slot window + language
SLA: p50 ≤ 600ms, p95 ≤ 1800ms, p99 ≤ 4000ms
RATE LIMIT: 60 req/min
IDEMPOTENCY: request_id; 90s cache (calendar availability volatile)
RETRY: 1 on 429, 2 on 5xx
Tool 2: get_professional_detail
PURPOSE: Full profile + bio + ICAI registration + reviews + sample work product
SLA: p50 ≤ 400ms, p95 ≤ 1200ms
RATE LIMIT: 120 req/min
IDEMPOTENCY: professional_id; 24h cache (profile is stable)
RETRY: 1 on 5xx
Tool 3: hold_slot
PURPOSE: Soft-lock a calendar slot for 10 minutes while user confirms
SLA: p50 ≤ 700ms, p95 ≤ 2000ms
RATE LIMIT: 30 req/min
IDEMPOTENCY: request_id; same id returns same hold
RETRY: No retry on hold creation
Tool 4: confirm_booking
PURPOSE: Convert hold → confirmed booking + create video link / address + payment lock
SLA: p50 ≤ 1200ms, p95 ≤ 3500ms
RATE LIMIT: 30 req/min
IDEMPOTENCY: request_id
RETRY: No retry
Tool 5: cancel_booking
PURPOSE: Cancel + compute pro-rated refund per published policy
SLA: p50 ≤ 800ms, p95 ≤ 2500ms
RATE LIMIT: 30 req/min
IDEMPOTENCY: booking_id
RETRY: 1 on 5xx
Tool 6: submit_documents_pre_consultation
PURPOSE: Encrypted upload (Form 16, AIS, 26AS, capital gains statement) ahead of session
SLA: p50 ≤ 1500ms, p95 ≤ 5000ms (file dependent)
RATE LIMIT: 10 uploads / booking
IDEMPOTENCY: booking_id + content hash
RETRY: 1 on 5xx
SECTION 5 — RESPONSE SHAPE
TaxProfessional
TaxProfessional:
professional_id: { type: string, constraint: REQUIRED, opaque }
full_name: { type: string, constraint: REQUIRED }
credentials:
primary: { type: enum, constraint: REQUIRED, STRICT ENUM §6, values: [CA_ICAI, CMA_ICAI, advocate_tax, TRP_CBDT] }
icai_membership_number: { type: string, constraint: REQUIRED, semantics: "Verifiable on icai.org for CA/CMA; bar council for advocate; CBDT TRP id for TRP" }
years_of_practice: { type: int, constraint: REQUIRED, ≥0 }
additional_certifications: { type: array<enum>, constraint: REQUIRED, STRICT ENUM §6, may be empty }
specialties: { type: array<enum>, constraint: REQUIRED, STRICT ENUM §6, may NOT 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, values from preferred_mode }
fee_inr:
base_consultation_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
per_extension_15min_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
gst_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0, semantics: "18% on professional fees" }
total_first_session_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
rating:
average_score: { type: float, constraint: REQUIRED, 0.0-5.0 }
review_count: { type: int, constraint: REQUIRED, ≥0 }
response_time_minutes_median: { 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 (state codes) }
in_person_available: { type: boolean, constraint: REQUIRED }
in_person_address: { type: string, constraint: REQUIRED, semantics: "Empty string when in_person_available=false" }
available_slots:
type: array<object>
constraint: REQUIRED, may NOT be empty (otherwise omit professional)
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 }
partner_reference:
source: { type: string, constraint: REQUIRED }
deeplink: { type: string, constraint: REQUIRED, HTTPS URL }
SlotHold
SlotHold:
hold_id: { type: string, constraint: REQUIRED }
professional_id: { type: string, constraint: REQUIRED }
slot_id: { type: string, constraint: REQUIRED }
hold_expires_at: { type: string, constraint: REQUIRED, ISO_DATETIME, semantics: "≥10 minutes ahead of hold creation" }
fee_locked_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
ConfirmedBooking
ConfirmedBooking:
booking_id: { type: string, constraint: REQUIRED, immutable }
professional_id: { type: string, constraint: REQUIRED }
professional_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 string when mode=in_person" }
in_person_address: { type: string, constraint: REQUIRED, semantics: "Empty string when mode≠in_person" }
fee_paid_inr: { type: int, constraint: REQUIRED, INR_INTEGER }
invoice_url: { type: string, constraint: REQUIRED, HTTPS URL }
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 }
documents_submission_url: { type: string, constraint: REQUIRED, HTTPS URL }
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 }
cancellation_fee_inr: { type: int, constraint: REQUIRED, INR_INTEGER, ≥0 }
FORBIDDEN FIELDS
paid_placement_score,ad_bid,sponsored_rank,promotion_priority,referral_kickbackeditor_pick,tomo_recommended,top_choice,featured_professionalcommission_padded_fee,partner_revenue_shareai_generated_professional_photo— professional headshots must be real, verified at onboardinginflated_years_of_practice,inflated_review_counturgency_text("Slots filling fast — book now") unlessavailable_slots.length ≤ 2client_real_namesin testimonials — must be initials onlysuccess_guarantee_text("Save ₹50,000 guaranteed!") — tax outcomes are case-specific; forbidden
SECTION 6 — CONTROLLED VOCABULARIES
consultation_request.matter_kind:
values:
itr_filing: "Income-tax return filing"
notice_response: "Response to IT Department notice"
capital_gains: "Capital gains computation & planning"
foreign_income: "Foreign income / DTAA / Schedule FA"
tds_tcs: "TDS / TCS dispute or correction"
advance_tax_planning: "Advance tax estimation"
presumptive_taxation: "44AD / 44ADA / 44AE consultation"
business_tax: "Sole-prop / LLP / partnership taxation"
gst_freelancer: "GST for individual professional"
rectification_142_154: "Rectification or revision filing"
refund_followup: "Refund delay / mismatch query"
general_planning: "Annual planning, deductions, exemptions"
consultation_request.user_persona:
values: [salaried_individual, freelancer, business_owner_sole_prop, partner_in_firm, director_in_company, nri, senior_citizen, hni, first_time_filer]
consultation_request.estimated_income_band_inr:
values:
under_5_lakh, 5_to_10_lakh, 10_to_25_lakh, 25_to_50_lakh,
50_to_1_crore, 1_to_2_crore, above_2_crore
resolution_order: "Partner sees ONLY band; raw income transmitted to professional only after booking confirmation."
consultation_request.complexity_signals:
values:
capital_gains_equity, capital_gains_property, capital_gains_crypto,
foreign_dividend, foreign_salary, dtaa_applicability, esop_taxation,
schedule_fa_filing, multiple_form_16, business_income, freelance_44ADA,
presumptive_44AD, gst_combined, hra_house_loan_combined,
section_54_54F_reinvestment, ltcg_grandfathering, dividend_above_5k,
crypto_vda_section_115BBH
consultation_request.preferred_mode / modes_supported / ConfirmedBooking.mode:
values:
video: "Video call (Zoom / Google Meet / partner-hosted)"
audio: "Voice call"
in_person: "Office or home visit"
chat: "Async chat with response SLA"
consultation_request.preferred_language / languages_spoken:
values: [en, hi, te, ta, kn, ml, mr, bn, gu, pa, or, as, ur]
TaxProfessional.credentials.primary:
values:
CA_ICAI: "Chartered Accountant, ICAI member"
CMA_ICAI: "Cost Accountant, ICAI of CMA"
advocate_tax: "Advocate enrolled with Bar Council, practising tax"
TRP_CBDT: "Tax Return Preparer empanelled by CBDT"
TaxProfessional.specialties:
values: (subset of consultation_request.matter_kind)
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.20):
signals_used:
- available_slots earliest start vs preferred_slot_window.start
- response_time_minutes_median (lower preferred)
- modes_supported includes preferred_mode
weighting:
earliest_slot_fit: 0.55
response_time: 0.30
mode_match: 0.15
user_band_handling:
fast: prefer next-24h slots even at +30% fee
balanced: standard
flexible: relax to 7-day window for lower fee
TASTE (weight = 0.20):
signals_used:
- languages_spoken intersection with preferred_language
- past consultation with same professional (DNA)
- rating.average_score
- specialty exact match with matter_kind
weighting:
language_match: 0.30
dna_repeat: 0.30
rating: 0.20
specialty_match: 0.20
BUDGET (weight = 0.20):
signals_used:
- fee_inr.total_first_session_inr
- fee_inr.per_extension_15min_inr (signals risk of overflow)
weighting:
total_first_session: 0.80
extension_rate: 0.20
user_band_handling:
ok: cheapest passing safety floor (credentials verified)
good: balanced fee vs rating
great: senior practitioner regardless of fee
SAFETY (weight = 0.40):
signals_used:
- credentials.primary in [CA_ICAI, CMA_ICAI, advocate_tax, TRP_CBDT]
- credentials.icai_membership_number verifiable
- credentials.years_of_practice ≥3 (floor)
- rating.completion_rate_pct ≥90
- response_time_minutes_median ≤120 for non-urgent
- complexity_signals matched by specialties
weighting:
credentials_verified: 0.40
years_practice: 0.20
completion_rate: 0.15
complexity_match: 0.15
response_time: 0.10
user_band_handling:
fast: relax years_practice floor to 1
balanced: floor 3 years
great: floor 10 years + only CA_ICAI or advocate_tax
Locked weights: time 0.20 / taste 0.20 / budget 0.20 / safety 0.40. Safety dominates because mis-advice on tax has Income-Tax Act consequences for the user. Budget is moderate — fees vary 2-5× but quality variance is greater than cost variance.
SECTION 8 — COMPLETION CONTRACT
POST /api/v1/cpc/mcp_provider/<your_partner_id>
Body:
{
"intent": "finance.book_tax_consultation",
"external_id": "<booking_id>",
"request_id": "<request_id>",
"amount_inr": 300, // NET partner commission only — typically 15-30% of professional fee
"gst_inr": 54,
"tips_inr": 0,
"pass_through_inr": 1500, // fee remitted to the professional
"closed_at": "2026-06-02T17:30:00+05:30",
"status": "completed",
"matter_kind": "itr_filing",
"mode": "video",
"duration_minutes": 45,
"professional_credential": "CA_ICAI"
}
Important: User pays the full fee (e.g. ₹1,500). Partner's NET commission (~₹300) is the only amount_inr. Professional's share rides in pass_through_inr. TOMO charges 10% × ₹300 = ₹30. HMAC-SHA256 canonical body, 5-min replay window.
Follow-up sessions for the same matter ID file a new completion with the same external_id_root and a session-counter suffix. No automatic retainer billing — every session is explicit.
SECTION 9 — WIDGET
TaxConsultationWidget (planned). Interim: ProfessionalListingWidget.
Field mapping:
- full_name + credentials.primary pill (e.g. "CA, ICAI")
- years_of_practice → "12 yrs practice"
- specialties → chip row (top 3 visible, "+N more")
- rating.average_score + review_count → star pill
- fee_inr.total_first_session_inr → big price
- available_slots earliest → "Next: Tue 11 AM"
- languages_spoken intersection with user pref → language chip
- in_person_available → location pill (with city)
- response_time_minutes_median → "Responds in ~30 min" pill
SECTION 10 — CACHING POLICY
| Call | TTL | Rationale |
|---|---|---|
| search_tax_professionals | 90s | Calendar volatile |
| get_professional_detail | 24h | Stable profile data |
| hold_slot | NO CACHE | Idempotent by request_id |
| confirm_booking | NO CACHE | Idempotent; never retry |
| cancel_booking | NO CACHE | — |
| submit_documents_pre_consultation | NO CACHE | Content-addressed |
| Credentials verification cache | 7d | ICAI / Bar Council publish member directories |
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 (webhook) | HMAC fail | No |
NO_PROFESSIONAL_MATCH |
200 (empty) | No professional fits matter + window | n/a |
SLOT_TAKEN |
409 | Hold race-lost | UI re-queries |
HOLD_EXPIRED |
410 | Hold window elapsed | UI re-holds |
CREDENTIAL_VERIFY_FAILED |
422 | ICAI / Bar lookup negative | No (professional suspended) |
PAYMENT_FAILED |
402 | Gateway declined | No |
MODE_UNSUPPORTED |
422 | Professional doesn't support requested mode | No (UI re-asks) |
LANGUAGE_MISMATCH |
422 | No overlap between requested and supported | No |
NOTICE_OUT_OF_SCOPE |
422 | Notice section outside professional's practice | No |
CANCELLED_TOO_LATE |
410 | Past partial_refund_until | No |
DOCUMENT_REJECTED |
422 | Upload virus-scan / format failure | No |
BOOKING_LOCKED |
423 | Session in progress | No |
SECTION 12 — SANDBOX → PRODUCTION CHECKLIST
[ ] All six tools implemented
[ ] At least 25 verified professionals in catalog covering matter_kind set
[ ] Every CA_ICAI / CMA_ICAI membership number verifiable on icai.org
[ ] Every advocate_tax bar-council number verifiable
[ ] Every TRP_CBDT id verifiable on CBDT empanelment list
[ ] No bookkeeper / accounting-clerk in catalog
[ ] Languages spoken validated against actual session-recording samples
[ ] Income-band only exposed; raw income never leaves TOMO until booking confirmed
[ ] Cancellation policy publishes free_refund_until + partial_refund details before payment
[ ] Cancellation refund tested end-to-end on test booking
[ ] HMAC signing verified on test CPC webhook
[ ] amount_inr in CPC is COMMISSION (NET), pass_through_inr is professional fee
[ ] All controlled vocabularies respected
[ ] No forbidden fields anywhere
[ ] SLA p95 met (100-call sandbox run)
[ ] GSTIN, privacy policy URL, grievance officer contact uploaded
[ ] Document-upload endpoint encrypts at rest (KMS or equivalent)
[ ] Video link generation uses partner-owned or industry-standard provider
[ ] Customer support: dedicated tax-consultation helpline + email
[ ] Professional onboarding pipeline reviewed (TOMO admin spot-checks 5 random profiles)
SECTION 13 — ANTI-FABRICATION RULES
RULE 1: Professional credentials must be verifiable on the issuing authority's
public register (ICAI for CA / CMA, State Bar Council for advocate,
CBDT for TRP). Partners falsely listing credentials = immediate
suspension. TOMO spot-checks 10% of new listings quarterly.
RULE 2: No paid_placement, ad_bid, sponsored_rank, "featured professional"
sections that bypass TTBS. Tax advice influenced by commission
structures is customer-harm.
RULE 3: years_of_practice must reflect actual ICAI / Bar enrolment date.
Inflated years = suspension. TOMO audits via membership-issuance year.
RULE 4: rating.average_score must be unrounded over the past 12 months of
real sessions. No "rounded to 4.8 for marketing." TOMO computes a
shadow score from CPC ledger; >0.4 delta = audit.
RULE 5: review_count must be from completed paid sessions only — not
signup interest, not free chats, not partner-internal staff.
RULE 6: No success_guarantee text. Tax outcomes depend on facts;
guaranteeing "you'll save ₹X" is per-se misleading and forbidden.
RULE 7: Client testimonials must use initials only ("R.K.") and cannot
disclose tax-return specifics (no "saved ₹X via 80C/80D moves").
RULE 8: AI-generated headshots / fake bios forbidden. Onboarding photo +
government ID required; verified at partner side, sample audited.
RULE 9: Professional cannot quote a fee variant based on the user's
estimated_income_band. Fees are matter-complexity-priced, not
income-priced. TOMO ingest scans for income-band-conditional pricing.
RULE 10: Partner cannot promote one professional to multiple matter_kind
slots they're not specialised in. Specialty list must be the
professional's declared specialisation, not partner-set keyword bag.
RULE 11: amount_inr in CPC webhook is COMMISSION ONLY. Total fee remitted
to the professional is pass_through_inr. Partners reporting full
fee as commission to inflate base = suspension + accounting audit.
RULE 12: notice_section in input is private. Partner MUST NOT cache or
resell. Notice details are sensitive; TOMO sees partner data-handling
logs on SOC2 audit.
RULE 13: Audio / video session recordings (if any) belong to the user.
Partner may not use recordings for training models, marketing, or
resale. Consent must be re-collected per session, not click-wrap'd
at signup.
RULE 14: completion_rate_pct must be computed from CPC ledger over past
90 days. Partners hiding cancellations from CPC = suspension.
RULE 15: Information-completeness score (hidden rank factor weight 0.10)
rewards full §5 shape. Sparse responses (missing specialties /
languages / credentials) rank lower automatically.
VERSION HISTORY
v1.0.0 — 2026-05-14 — Initial spec. CA / CMA / advocate-tax / TRP only;
bookkeepers rejected by ingest. Income-band only
to partner — raw income gated until booking confirmed.
Safety-dominant TTBS (0.40) reflecting consequences of
mis-advice under Income Tax Act. Net-commission base
in §8. ICAI / Bar / CBDT register verification required
at onboarding and audited quarterly.