feat: shadow listing detector — trust badge in Job Review UI #95
Labels
No labels
a11y
backlog
beta-feedback
bug
enhancement
feature-request
frontend
needs-triage
question
vue
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: Circuit-Forge/peregrine#95
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Overview
Integrate the
circuitforge_core.job_qualityscorer (cf-core#48) into the Job Review pipeline to flag ghost jobs, evergreen repost traps, and other timewasters before the user spends time applying.User-visible feature
JobQualityScore.top_reasonsrisk_level >= high)risk_level == criticallistings to bottom of review queue (does not auto-reject)Data gathering (Peregrine side)
Peregrine gathers enrichment data that cf-core cannot produce itself:
repost_countstaging.db— count rows matchingcompany + normalized_titleis_staffing_agencylayoff_news_snippetcompany_research.pyadds a layoff news queryuser_company_response_ratestaging.db— (responded count / applied count) per companyapplicant_countAvocet routing
When
confidence < 0.5, submit an unlabeledjob_qualitysignal to Avocet for human review:High-confidence scores (confidence >= 0.8) with a clear ghost/scam label also route to Avocet as pre-labeled training data (no human review needed).
Avocet connection is gated on the same opt-in toggle as issue #93 (community signal contribution). One consent screen covers both.
Scoring call
DB change
Add
trust_score REALandrisk_level TEXTcolumns tojobstable (migration 005). Scores are cached — recomputed only when listing data changes or on manual refresh.Tier
Badge display: Free (deterministic, no LLM)
Avocet routing and community contribution: Free opt-in
Future learned classifier (LLM-enhanced vagueness): Paid (behind BYOK gate)
Acceptance criteria
repost_countquery inscripts/db.pyget_company_response_rate()query inscripts/db.pytrust_score+risk_levelcolumnsRelated