Remove XGBoost ML + spam scorer; add image-aware AI curation #80
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?
Fenliu's XGBoost ML integration and its rule-based spam scorer are not serving their purpose. Both look only at post text and metadata, so neither can judge what actually matters when curating cat content: whether the attachment is a real photograph of a cat (versus a comic, painting, mural, meme, statue, or other artwork).
The spam score in particular has never been useful, because it reads textual spam markers while curation decisions are made on the images.
This issue proposes removing both the ML stack and the spam scorer, and replacing them with something that evaluates image content directly, plus a check that the post text isn't using a cat as an excuse to promote something (books, war victims, soldiers, fundraisers, adoption drives, etc.).
Plan of attack:
Approach: remove the XGBoost ML stack + rule-based spam scorer entirely, and replace them with a two-stage AI classifier using a configurable OpenAI-compatible model (default Moonshot
kimi-k2.6):The result is an indexed
ai_would_rejectrecommendation onposts, surfaced as a badge + filters in the review UI. No auto-reject at launch (behind anai_auto_rejectsetting, default off).Key files:
src/fenliu/training/,services/ml_inference.py,services/spam_scoring.py,cli/, ML dependencies, and all score/ML surface (columns, API endpoints, review-UI widgets, tests).services/ai_classification.py(client + text/vision classifiers),services/ai_batch.py(batch processor), newpostsAI columns, scheduler text hook + batch job, review-UI badge/filters.scorefield (fed by Fenliu'sspam_score).Spec:
.superpowers/specs/2026-08-13-fenliu-vision-ai-design.mdPlan:
.superpowers/plans/2026-08-13-fenliu-vision-ai.mdBranch:
feat/issue-80-remove-ml-add-vision-aiCommits are task-per-commit (gitmoji), then a PR targeting
main.Sub-PR progress on the collecting branch (
feat/issue-80-collect):Merged so far:
Still open: #97 (SQLite "database is locked" under concurrent fetches).
Final PR into
mainwill carryCloses #80, #82, #83, #84, #85, #87, #91, #94, #96, #97.