All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
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>
54 lines
1.5 KiB
PL/PgSQL
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;
|