17 KiB
🔍 P0 RECONNAISSANCE — Service Provider & Gamification State Audit Report
Date: 2026-06-30
Auditor: Rendszer-Architect (DeepSeek Reasoner)
Mode: READ-ONLY — NO FILES MODIFIED
Status: COMPLETE
Executive Summary
This report documents the deep-dive reconnaissance audit of the Service Provider ecosystem, Ratings/Validations, and Gamification modules. The audit covered 3 database schemas (marketplace, identity, gamification), 6 model files, 4 service files, 5 API endpoint files, and 12 router registrations.
CRITICAL GAP FOUND: No admin_providers.py router exists — the admin provider approval workflow is completely missing from the API layer. Admin UI for /providers pages cannot be built without this foundational layer.
1. Database Model Map
1.1 Marketplace Schema (marketplace)
| Table | File | Purpose |
|---|---|---|
service_profiles |
backend/app/models/marketplace/service.py:21 |
Rich service profile linked to orgs or providers |
expertise_tags |
backend/app/models/marketplace/service.py:97 |
4-level category hierarchy (L0-L3) |
service_expertises |
backend/app/models/marketplace/service.py:147 |
Junction table: ServiceProfile ↔ ExpertiseTag |
service_staging |
backend/app/models/marketplace/service.py:159 |
Robot-collected service data (pre-moderation) |
service_staging |
backend/app/models/marketplace/staged_data.py:1 |
Extended staging model (extend_existing=True) |
discovery_parameters |
backend/app/models/marketplace/service.py:191 |
Robot discovery parameters |
cost |
backend/app/models/marketplace/service.py:205 |
Service cost structure |
1.2 Identity Schema (identity — Social)
| Table | File | Purpose |
|---|---|---|
service_providers |
backend/app/models/identity/social.py:133 |
Crowdsourced provider submissions (P0 refactor) |
votes |
backend/app/models/identity/social.py:186 |
Community validation (+1/-1 per user/provider) |
competitions |
backend/app/models/identity/social.py:209 |
Social competitions |
user_scores |
backend/app/models/identity/social.py:243 |
User competition scores |
service_reviews |
backend/app/models/identity/social.py:266 |
Verified reviews tied to financial transactions |
1.3 Gamification Schema (gamification)
| Table | File | Purpose |
|---|---|---|
point_rules |
backend/app/models/gamification/gamification.py:31 |
Dynamic point rules (action_key → points) |
points_ledger |
backend/app/models/gamification/gamification.py:89 |
Point transaction log |
user_stats |
backend/app/models/gamification/gamification.py:103 |
User gamification stats |
user_contributions |
backend/app/models/gamification/gamification.py:137 |
Contribution tracking + moderation |
level_configs |
backend/app/models/gamification/gamification.py:179 |
Level definitions (positive + penalty) |
seasonal_competitions |
backend/app/models/gamification/gamification.py:213 |
Seasonal events |
badges |
backend/app/models/gamification/gamification.py:252 |
Achievement badges |
user_badges |
backend/app/models/gamification/gamification.py:275 |
User-badge assignments |
seasons |
backend/app/models/gamification/gamification.py:296 |
Competition seasons |
2. Trust & Validation Score Architecture
2.1 Score Fields on Models
| Field | Model | Default | Purpose |
|---|---|---|---|
validation_score |
ServiceProvider |
0 |
Community validation aggregate (+1/-1 from Votes) |
trust_score |
ServiceProfile |
30 |
Trust engine score (Gondos Gazda Index) |
is_verified |
ServiceProfile |
False |
Admin/manual verification flag |
rating_*_avg |
ServiceProfile |
NULL |
Aggregated verified review ratings (4 dimensions) |
rating_overall |
ServiceProfile |
NULL |
Overall rating from verified reviews |
2.2 CRITICAL: provider_validations Table NEVER Created
The Masterbook 2.0 spec mentioned a provider_validations table for XP farming prevention, but it was never created in the codebase. No model file, no Alembic migration, no sync_engine artifact exists for this table.
Impact: XP farming prevention for provider submissions relies solely on:
UserContributionstatus (pending/approved/rejected) — existsUserStats.providers_added_count— existsVotetable duplicate prevention (UniqueConstraint on user_id + provider_id) — exists
The dedicated anti-farming table was spec-only and never implemented.
2.3 Review Validation Rules
ServiceReview (from backend/app/models/identity/social.py:266):
- Mandatory FK to
audit.financial_ledger.transaction_id(UniqueConstraint) - 4 rating dimensions:
price_rating,quality_rating,time_rating,communication_rating(1-10 scale) - Only users with verified financial transaction can review
ServiceProfile.rating_*_avgfields aggregate these values
3. Gamification Engine Analysis
3.1 Dynamic Point Rules
The gamification engine uses dynamic rules from gamification.point_rules table (not hardcoded):
| Action Key | Points | Description |
|---|---|---|
ADD_NEW_PROVIDER |
500 | Adding a new service provider |
USE_UNVERIFIED_PROVIDER |
200 | Using an unverified provider |
RATE_PROVIDER |
250 | Rating a provider |
UPDATE_PROVIDER |
100 | Updating provider info |
Seeded by backend/app/scripts/seed_gamification_rules.py.
3.2 GamificationService Flow
From backend/app/services/gamification_service.py:
process_activity(user_id, action_key, ...)— Main entry point- Reads
PointRulefrom DB by action_key - Applies level multiplier via
_calculate_multiplier() - Penalty system: 4 levels (L0=100%, L1=50%, L2=10%, L3=0%)
- Calls
_handle_level_up()for cross-level logic - Social points → credits conversion at configurable rate
- Config loaded from
GAMIFICATION_MASTER_CONFIGsystem parameter
3.3 Provider Service Gamification Integration
From backend/app/services/provider_service.py:
_award_provider_points()— Reads PointRule from DB, awards through GamificationService- Called on:
quick_add_provider()andupdate_provider() UserContributionrecords created with status "pending" for admin review
4. API Endpoint Inventory
4.1 User-Facing Provider Endpoints (/providers prefix)
From backend/app/api/v1/endpoints/providers.py:
| Method | Path | Description |
|---|---|---|
| GET | /providers/categories/tree |
Full hierarchical category tree (4-level) |
| GET | /providers/categories/autocomplete |
Text search for L2-L3 tags |
| GET | /providers/categories |
Flat list of expertise categories |
| GET | /providers/search |
Unified provider search (3 sources) |
| POST | /providers/quick-add |
Quick provider submission (crowdsourced) |
| PUT | /providers/{provider_id} |
Update provider details (hybrid save) |
4.2 Admin Gamification Endpoints (/admin/gamification prefix)
From backend/app/api/v1/endpoints/admin_gamification.py:
| Method | Path | Description |
|---|---|---|
| GET/POST | /admin/gamification/point-rules |
List/Create point rules |
| GET/PUT/DELETE | /admin/gamification/point-rules/{id} |
CRUD single rule |
| GET/POST | /admin/gamification/levels |
List/Create level configs |
| PUT | /admin/gamification/levels/{id} |
Update level config |
| GET/POST | /admin/gamification/badges |
List/Create badges |
| GET/PUT | /admin/gamification/user-stats |
List/Update user stats |
| GET | /admin/gamification/user-stats/{id} |
Get user stat detail |
| POST | /admin/gamification/user-stats/{id}/penalty |
Apply penalty |
| POST | /admin/gamification/user-stats/{id}/reward |
Apply reward |
| GET | /admin/gamification/contributions |
List contributions |
| PUT | /admin/gamification/contributions/{id}/review |
Approve/reject contribution |
| GET/POST | /admin/gamification/seasons |
List/Create seasons |
| PUT/DELETE | /admin/gamification/seasons/{id} |
Update/Delete season |
| GET/POST | /admin/gamification/competitions |
List/Create competitions |
| PUT/DELETE | /admin/gamification/competitions/{id} |
Update/Delete competition |
| GET | /admin/gamification/leaderboard |
Admin leaderboard |
| GET | /admin/gamification/dashboard |
Dashboard summary |
| GET/PUT | /admin/gamification/master-config |
Master config CRUD |
4.3 User-Facing Gamification Endpoints (/gamification prefix)
From backend/app/api/v1/endpoints/gamification.py:
| Method | Path | Description |
|---|---|---|
| GET | /gamification/my-stats |
Current user stats |
| GET | /gamification/leaderboard |
Public leaderboard |
| GET | /gamification/seasons |
List seasons |
| GET | /gamification/my-contributions |
User contributions |
| POST | /gamification/submit-service |
Submit service (gamified) |
| GET | /gamification/quiz/daily |
Daily quiz |
| POST | /gamification/quiz/answer |
Answer quiz |
| GET/POST | /gamification/badges |
Badge listing/awarding |
| GET | /gamification/achievements |
Achievement list |
4.4 Existing Admin Routers
| Router File | Prefix | Module |
|---|---|---|
admin.py |
/admin |
General admin (health, params, pending actions) |
admin_gamification.py |
/admin/gamification |
Gamification admin CRUD |
admin_organizations.py |
/admin/organizations |
Organization CRM |
admin_users.py |
/admin/users |
User management |
admin_persons.py |
/admin/persons |
Person management |
admin_packages.py |
/admin/packages |
Package management |
admin_services.py |
/admin/services |
Service catalog |
admin_permissions.py |
(root) |
Permission/RBAC management |
5. GAP ANALYSIS — Missing Admin Provider API
5.1 CRITICAL GAP: No admin_providers.py Router
There is NO /admin/providers router. The file admin_providers.py does not exist in the endpoints directory. The following router files DO exist:
admin_gamification.py,admin_organizations.py,admin_users.py,admin_persons.py,admin_packages.py,admin_services.py,admin_permissions.pyadmin.py(general admin)
Impact: Admin users cannot manage providers through the API. The Nuxt Admin Frontend cannot build /providers pages without this backend layer.
5.2 Complete List of Missing Endpoints
| # | Method | Path | Purpose |
|---|---|---|---|
| 1 | GET | /admin/providers |
List all providers from 3 sources (orgs, staging, crowd) |
| 2 | GET | /admin/providers/pending |
List pending providers awaiting approval |
| 3 | GET | /admin/providers/{id} |
Get detailed provider info (merged from all sources) |
| 4 | PUT | /admin/providers/{id}/approve |
Approve provider → set status, award submitter XP |
| 5 | PUT | /admin/providers/{id}/reject |
Reject provider with reason → flag UserContribution |
| 6 | GET | /admin/providers/staging |
List robot-collected staging entries |
| 7 | PUT | /admin/providers/staging/{id}/promote |
Promote staging → ServiceProfile (verify & create org) |
| 8 | PUT | /admin/providers/staging/{id}/reject |
Reject staging entry with reason |
| 9 | GET | /admin/providers/{id}/votes |
List community validation votes for a provider |
| 10 | GET | /admin/providers/{id}/reviews |
List service reviews for a provider |
| 11 | PUT | /admin/providers/{provider_id}/verify |
Toggle verified status on ServiceProfile |
| 12 | PUT | /admin/providers/{provider_id}/trust-score |
Manually adjust trust_score |
| 13 | GET | /admin/providers/validations |
List pending community validations (Votes table) |
| 14 | PUT | /admin/providers/staging/{id} |
Update staging entry (edit robot-collected data) |
5.3 Dependencies for Building These Endpoints
| Dependency | Current Status | Notes |
|---|---|---|
ServiceProvider model (social.py:133) |
Complete | Includes validation_score, status, source |
ServiceProfile model (service.py:21) |
Complete | Includes trust_score, is_verified, verification_log |
ServiceStaging model (service.py:159) |
Complete | Includes status, validation_level, audit_trail |
Vote model (social.py:186) |
Complete | Includes weight, user_id, provider_id |
ServiceReview model (social.py:266) |
Complete | Verified reviews with financial transaction linkage |
GamificationService (gamification_service.py) |
Complete | Can award XP when admin approves |
UserContribution model (gamification.py:137) |
Complete | Status field for pending/approved/rejected |
Permission providers:manage |
Unknown | Needs to exist in RBAC or be created |
| Schemas for admin provider endpoints | MISSING | Need ProviderAdminOut, ProviderAdminList, etc. |
5.4 Provider Data Flow (Current State)
+-------------------+ +-------------------+ +-------------------+
| Robot (Staging) | | Crowdsourced | | Verified Org |
| service_staging | | service_providers | | fleet.orgs |
| status: pending | | status: pending | | is_verified: T |
+--------+----------+ +--------+----------+ +--------+----------+
| | |
v v v
+---------------------------------------------------------------+
| User-Facing API (providers.py) |
| GET /providers/search -- UNION of all 3 sources |
| POST /providers/quick-add -- Creates ServiceProvider |
| PUT /providers/{id} -- Update with migration logic |
+---------------------------------------------------------------+
| | |
| ** NO ADMIN LAYER EXISTS ** |
v v v
+---------------------------------------------------------------+
| MISSING: Admin Provider Workflow |
| - No approval/rejection for pending providers |
| - No staging promotion to verified org |
| - No trust_score manual adjustment |
| - No community validation vote review |
| - No service review moderation |
+---------------------------------------------------------------+
6. Gitea Task Breakdown (Required for Implementation)
Based on the 3A granularity principle, the implementation of the admin provider layer requires these Gitea tasks:
Epic: Admin Provider Management
| # | Task | Priority | Dependencies |
|---|---|---|---|
| 1 | Create schemas for admin provider endpoints | P0 | None |
| 2 | Implement admin_providers.py - List/Get providers |
P0 | Schema |
| 3 | Implement approve/reject provider logic | P0 | GamificationService |
| 4 | Implement staging management (list/promote/reject) | P0 | None |
| 5 | Implement community validation vote review | P1 | #4 |
| 6 | Implement service review moderation | P1 | #5 |
| 7 | Register router in api.py at /admin/providers |
P0 | #2 |
| 8 | Implement manual trust_score adjustment endpoint | P1 | #6 |
| 9 | Create RBAC permission providers:manage |
P0 | None |
| 10 | E2E tests for admin provider workflow | P1 | #2-#9 |
7. Gamification Gaps & Observations
7.1 No Admin-Triggered Gamification Rewards
When an admin approves a provider submission, there is no endpoint to trigger GamificationService.process_activity() for the submitter. The UserContribution record exists but there's no automated XP award upon approval.
Fix: The PUT /admin/providers/{id}/approve endpoint must call:
await gamification_service.process_activity(
db=db,
user_id=submitter_user_id,
action_key="ADD_NEW_PROVIDER",
source_type="provider_approval",
source_id=provider_id
)
7.2 No Rejected Contribution Feedback Loop
When a provider is rejected, the UserContribution.status should be set to rejected with a rejection reason, but there's no endpoint to trigger this for admin workflows.
7.3 Gamification Config is Dynamic but Has No Validation
The GAMIFICATION_MASTER_CONFIG system parameter can be edited freely via the admin gamification API, but there's no schema validation on the JSONB structure. A malformed config could break the gamification engine.
8. Summary of Findings
| Category | Status | Details |
|---|---|---|
| Database Models | COMPLETE | All 15+ models across 3 schemas |
| User-Facing Provider API | COMPLETE | 6 endpoints in providers.py |
| User-Facing Gamification API | COMPLETE | 15+ endpoints in gamification.py |
| Admin Gamification API | COMPLETE | 25+ endpoints in admin_gamification.py |
| Gamification Service | COMPLETE | Full engine with dynamic rules, penalties |
| Provider Service | COMPLETE | P0 hybrid vendor refactor applied |
| Admin Provider API | MISSING | No admin_providers.py - 14 endpoints missing |
| provider_validations table | NEVER CREATED | Spec-only, not in codebase |
| Trust Engine | STUB | trust_score exists but no active scoring logic |
| Admin Rejection Gamification | MISSING | No endpoint to award/reject XP on moderation |
End of P0 Reconnaissance Report. This is a READ-ONLY analysis - no files were modified.