Files
cannaiq/backend/migrations/130_worker_badge.sql
Kelly 69a013538c
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
feat(workers): Session pool with preflight qualification and gold badge
Complete worker session flow:
1. Claim ONE task first (determines geo)
2. Get IP matching task's city/state
3. Sticky fingerprint: 1 IP = 1 fingerprint (reuse or generate new)
4. Preflight/qualify: verify antidetect working
5. Gold badge awarded on preflight pass
6. Claim 2-4 more tasks for same geo (total 3-5)
7. Execute tasks
8. Retire session: badge cleared, IP on 8hr cooldown

Changes:
- Enable USE_SESSION_POOL=true in K8s deployment
- Add preflight step after IP acquisition
- Enforce 1 IP = 1 fingerprint rule
- Block unqualified workers from claiming tasks
- Close qualification bypass in task-service.ts
- Add worker badge column (gold = qualified)
- Random 3-5 tasks per session for natural traffic

Migrations:
- 129: claim_tasks_batch_for_geo function
- 130: worker_registry badge column and functions

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-17 11:57:19 -07:00

54 lines
1.5 KiB
PL/PgSQL

-- Migration 130: Worker qualification badge
-- Session-scoped badge showing worker qualification status
-- Add badge column to worker_registry
ALTER TABLE worker_registry
ADD COLUMN IF NOT EXISTS badge VARCHAR(20) DEFAULT NULL;
-- Add qualified_at timestamp
ALTER TABLE worker_registry
ADD COLUMN IF NOT EXISTS qualified_at TIMESTAMPTZ DEFAULT NULL;
-- Add current_session_id to link worker to their active session
ALTER TABLE worker_registry
ADD COLUMN IF NOT EXISTS current_session_id INTEGER DEFAULT NULL;
-- Badge values:
-- 'gold' = preflight passed, actively qualified with valid session
-- NULL = not qualified (no active session or session expired)
-- Function: Set worker badge to gold when qualified
CREATE OR REPLACE FUNCTION set_worker_qualified(
p_worker_id VARCHAR(255),
p_session_id INTEGER
) RETURNS BOOLEAN AS $$
BEGIN
UPDATE worker_registry
SET badge = 'gold',
qualified_at = NOW(),
current_session_id = p_session_id
WHERE worker_id = p_worker_id;
RETURN FOUND;
END;
$$ LANGUAGE plpgsql;
-- Function: Clear worker badge when session ends
CREATE OR REPLACE FUNCTION clear_worker_badge(p_worker_id VARCHAR(255))
RETURNS BOOLEAN AS $$
BEGIN
UPDATE worker_registry
SET badge = NULL,
qualified_at = NULL,
current_session_id = NULL
WHERE worker_id = p_worker_id;
RETURN FOUND;
END;
$$ LANGUAGE plpgsql;
-- Index for finding qualified workers
CREATE INDEX IF NOT EXISTS idx_worker_registry_badge
ON worker_registry(badge) WHERE badge IS NOT NULL;
-- Verify
SELECT 'worker_registry badge column added' as status;