Skip to content

Glossary

Reference — domain vocabulary. Terms that recur across code, docs, and specs.

Consumer — End user looking for skilled trade services. Two modes:

  • Planned consumer: browses calmly, evening/weekend, compares pros. ~80% of flows.
  • Emergency consumer: SOS mode — broken lock, flood, no heat. Needs immediate dispatch. ~20%.

Professional (a.k.a. pro) — Italian tradesperson (plumber, electrician, HVAC, locksmith, carpenter, painter) accepting bookings on Ideony. 30–60yo target demographic. May have older phones, limited English.

Admin — MyManny staff reviewing credential submissions, moderating reviews, handling disputes.

Category — Canonical trade slug. Current set: plumbing, electrical, hvac, locksmith, carpentry, painting (+ child categories). Slug vocabulary is locked across FE, BE, AI prompts.

Triage — Conversational follow-up between prompt submission and results. 4–6 structured questions (urgency, home age, photo) refine the match. Implemented via LangGraph agent w/ tool-use.

Candidate — A professional selected by the matching engine for a given request. SOS dispatch pushes to top N candidates in radius tiers.

Become-Pro funnel — Consumer → Professional onboarding entry path. CTA on (consumer)/profile.tsx pushes the 8-step wizard at /(professional)/onboarding. Wizard completion atomically flips User.role → PROFESSIONAL and busts the auth Redis cache. See §8 of docs/architecture.md.

Booking — Normal-mode request: consumer → pro, scheduled. Current record lifecycle includes PENDING → ACCEPTED → IN_PROGRESS → COMPLETED → CONFIRMED. Product direction is to select a published pro slot, pay without pro reconfirmation, and reserve the slot for ten minutes; this is not a claim of shipped behavior or provider-side payment authorization/capture. escrowStatus is an application workflow marker; it does not by itself indicate that money was authorized, captured, held, released, or refunded. Consumer confirmation updates the booking marker to RELEASED; no 48-hour automatic release is implemented.

Dispute — Consumer-raised booking workflow state. An application DISPUTED marker is not by itself a Stripe funds freeze or regulated escrow.

Change order — Pro-requested price adjustment mid-job. Consumer approves or rejects.

SOS dispatch — Emergency-mode flow. The current dispatcher awards the job to the first professional to accept. Approved 2026-09-30 product direction requires pro acceptance, then consumer acceptance of the same bound total and payment; that complete sequence is not established as implemented.

AUTO mode — Current SOS dispatch mode using sequential 30-second offers to candidates; first pro acceptance wins dispatch. A listed PaymentIntent is integration behavior, not proof by itself that funds were authorized, captured, held, or transferred.

PICK_LIST mode — Current SOS dispatch mode broadcasting quote requests to candidates; consumer selects a quote through an optimistic-lock status transition. Current mechanics do not by themselves implement the approved pro-then-consumer acceptance and payment sequence.

Radius tier — Successive PostGIS geo-queries at 1 km → 3 km → 5 km → 10 km until enough candidates found.

Live tracking (Tier 2) — Locked 2026-04-19. Polyline drawn once on pro-accept via Mapbox Directions; redrawn only on >200m deviation. ~3 Mapbox API calls per dispatch. Pro nav handoff = OS deep-link chooser (Apple Maps / Google Maps / Waze), not in-app turn-by-turn.

Credential — Pro-uploaded document. 8 types: P_IVA (VAT number, optional <€5k/yr — prestazione occasionale), INSURANCE, ALBO (professional register), F_GAS (refrigerant certification), ID_DOCUMENT, TRAINING_DIPLOMA, MANUFACTURER_CERT, OTHER.

Trust score — Integer score. Weights: P_IVA=30, INSURANCE=25, ALBO=20, F_GAS=15, TRAINING_DIPLOMA=10, MANUFACTURER_CERT=10, ID_DOCUMENT=10, OTHER=5.

Trust tier — Derived label from trust score:

  • BASIC — 0–30
  • VERIFIED — 31–70
  • ELITE — 71+

Verificato badge — UI badge tied to trust tier. Three visual states: Verified (green check), Pending (“Verifica in corso”), Unverified (no badge, lower ranking).

Pricing examples — Displayed example amounts (such as €50 fixed or €45/hour) illustrate the pricing modes only; they are not approved or guaranteed tariffs. The 2026-09-30 design export gives different illustrative examples; no example should be treated as a current tariff without a separate product decision.

Card UI must visually distinguish the pricing modes; any example amount needs an explicit non-tariff label unless separately approved.

Consumer fee — Fee design/amount must be confirmed against current product and provider decisions before treating as a tariff.

Distance fee — Example or legacy amounts must not be treated as a currently approved tariff without a current decision.

Payment workflow marker — Booking field escrowStatus, including HELD, RELEASED, or REFUNDED, records application workflow state; its value does not itself prove a corresponding Stripe authorization, capture, funds hold, transfer, payout, or refund.

Fund-release eligibility — In the approved SOS direction, a release becomes eligible only after both professional and consumer completion. Missing either completion does not trigger automatic release. This product rule does not establish that provider-side funds are held or can be released under the selected charge model.

Prompt-first home — Main consumer screen. Large textarea with placeholder “Descrivi il tuo problema…”, photo/video attachment. Not a category grid.

Job parser — LangGraph StateGraph agent that converts freeform problem text → structured {category, urgency, details}. Falls back to Gemini 2.5 Flash when OpenAI primary fails.

Smart search — AI-powered natural-language → category matching + inline AI banner on results.

MVP 0 — First testable release with cofounders. Current milestone. Infra cost target and host changed 2026-08-06 (Hetzner CAX11 destroyed, moved to DigitalOcean App Platform + Neon + GitHub Actions) — see docs/services.md for current live pricing per provider.

Quick Tunnel — Cloudflare’s ephemeral tunnel (*.trycloudflare.com). Historical: interim prod exposure for the destroyed Hetzner host, superseded 2026-08-06 by direct DNS to DigitalOcean App Platform / Cloudflare Pages — no tunnel involved today.

Named tunnel — Persistent Cloudflare tunnel concept, never activated (blocked on is-a-dev PR #36614 merge; domain bought via OVH instead 2026-08-03). Moot — current infra doesn’t use tunnels, see docs/infrastructure.md.

Blue-green swap — Deploy pattern: new image pulled, health-checked, traffic swapped, old container kept briefly for rollback. Historical Dokploy primitive (decommissioned 2026-05-04), then Lane 3’s docker compose up -d --remove-orphans (functionally similar, single-container). Both are gone (Hetzner+GitLab CI destroyed 2026-08-06); today’s deploy is GitHub Actions → DigitalOcean App Platform, with the smoke-prod job as the post-deploy health-check.

StripeEventLog — Prisma model storing a per-Stripe-event audit trail (stripeEventId UNIQUE, eventType, payload Json, processedAt DateTime?, attempts Int, lastError String?). Enables idempotent webhook processing via two layers: BullMQ jobId: stripe:{eventId} dedup + processedAt != null guard in StripeEventProcessor. Stalled events (processedAt IS NULL, createdAt > 1 h ago) surface via GET /admin/stripe-events?status=stuck. Migration: 20260423160507_stripe_event_log.

ZodValidationPipe — Global NestJS pipe registered via the APP_PIPE token in AppModule. Validates every incoming request body against the Zod DTO schema derived from createZodDto(). Replaces class-validator; no app.useGlobalPipes call needed.

BAPI — Clerk Backend API. Used in E2E tests to create test users and mint session tokens without hitting FAPI rate limits (429s). See also: BAPI session auth.

BAPI session auth — Clerk Backend API endpoint used in E2E tests to mint session tokens. Bypasses FAPI rate limits (429s).

Multi-role E2E — Dual-actor test scenarios (consumer + pro acting concurrently). Covers booking handoff, chat, SOS accept race. Spec lives at ./archive/completed/specs/2026-04-20-phase-e-multi-role-e2e-spec.md.

Italian-first — Copy written in Italian first, English second. Translation keys in BE (nestjs-i18n) + FE (i18next + expo-localization).

Regional specificity — “Milano, Zona 9” beats generic “near you”.

Links: ./architecture.md, ./design-system.md, ./specs/.