How moonshinerd/contraria works
ContrarIA is an AI-assisted misinformation analysis service centered on Bluesky posts. Its main workflow collects posts, assesses account authenticity, verifies factual claims against retrieved evidence, applies triage/intervention rules, and records an auditable decision. The API exposes on-demand analysis and decision access; a background worker handles ongoing collection and processing. The README also describes Socratic engagement and bot classification. Some subsystem wiring is documented rather than shown in sampled source, so uncertain calls are omitted.
Main entry points: pipeline.py Analysis pipeline · verification.py Verification · triage_pipeline.py Triage pipeline · base.py PostgreSQL
Components 26
Entry and orchestration
- HTTP API
api/app/main.py - Decision routes
api/app/routers/v1/decisions.py - Background worker
api/app/worker.py - Post collectors
api/app/jobs/collector.py - Fact-check feeds
api/app/jobs/ingest_fact_articles.py - Analysis pipeline
api/app/services/pipeline.py - Triage pipeline
api/app/jobs/triage_pipeline.py
Analysis and verification
- Bot scoring
api/app/services/bot_scoring.py - Bot classifier
api/app/models/classifiers/fake_news_tfidf.py - Claim planner
api/app/services/claim_verification.py - Verification
api/app/services/verification.py - Evidence reasoning
api/app/services/self_rag.py - Verdict debate
api/app/services/debate.py - Confidence calibration
api/app/services/crc.py
Evidence and models
- Evidence adapters
api/app/clients/evidence - LLM client
api/app/models/llm/litellm_model.py
State and decisions
- Post repository
api/app/repositories/posts.py - Fact article repository
api/app/repositories/fact_articles.py - Decision log
api/app/db/orm/decisions.py - PostgreSQL
api/app/db/base.py
Intervention and moderation
- Intervention service
api/app/services/intervention.py - Bluesky adapter
api/app/clients/bluesky_client.py - Ozone adapter
api/app/clients/ozone_client.py
Other components
- API consumer
- Bluesky
- Evidence services
Connections 33
- API consumer → HTTP API: requests
- HTTP API → Decision routes: routes
- Decision routes → Analysis pipeline: analyzes post
- Background worker → Post collectors: starts collection
- Post collectors → Post repository: stores posts
- Background worker → Analysis pipeline: analyzes candidates
- Background worker → Fact-check feeds: runs ingestion
- Fact-check feeds → Fact article repository: stores articles
- Analysis pipeline → Bluesky adapter: gets profile
- Analysis pipeline → Bot scoring: assesses account
- Bot scoring → Bot classifier: scores account
- Analysis pipeline → Verification: verifies post
- Verification → Claim planner: plans checks
- Verification → Evidence reasoning: checks evidence
- Evidence reasoning → Evidence adapters: retrieves evidence
- Evidence reasoning → LLM client: evaluates evidence
- Verification → Verdict debate: forms verdict
- Verification → Confidence calibration: calibrates confidence
- Analysis pipeline → Intervention service: executes action
- Intervention service → Bluesky adapter: posts response
- Analysis pipeline → Ozone adapter: emits label
- Bluesky adapter → Bluesky: reads and writes
- Ozone adapter → Bluesky: submits labels
- Evidence adapters → Evidence services: queries sources
- Analysis pipeline → Decision log: records decision
- Triage pipeline → Post repository: loads candidates
- Triage pipeline → Bot scoring: assesses account
- Triage pipeline → Verification: verifies post
- Triage pipeline → Intervention service: executes action
- Post repository → PostgreSQL: reads and writes
- Fact article repository → PostgreSQL: reads and writes
- Decision log → PostgreSQL: persists
- LLM client → PostgreSQL: records usage