惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
腾讯CDC
V
V2EX
Martin Fowler
Martin Fowler
A
About on SuperTechFans
大猫的无限游戏
大猫的无限游戏
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Check Point Blog
博客园 - 【当耐特】
Cisco Talos Blog
Cisco Talos Blog
The Hacker News
The Hacker News
K
Kaspersky official blog
Security Latest
Security Latest
H
Help Net Security
博客园_首页
美团技术团队
Spread Privacy
Spread Privacy
博客园 - 司徒正美
Hugging Face - Blog
Hugging Face - Blog
S
SegmentFault 最新的问题
G
Google Developers Blog
NISL@THU
NISL@THU
爱范儿
爱范儿
I
Intezer
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
N
News and Events Feed by Topic
P
Privacy International News Feed
Application and Cybersecurity Blog
Application and Cybersecurity Blog
S
Security @ Cisco Blogs
Schneier on Security
Schneier on Security
雷峰网
雷峰网
人人都是产品经理
人人都是产品经理
V
Vulnerabilities – Threatpost
W
WeLiveSecurity
P
Palo Alto Networks Blog
G
GRAHAM CLULEY
Hacker News: Ask HN
Hacker News: Ask HN
I
InfoQ
The Cloudflare Blog
F
Full Disclosure
SecWiki News
SecWiki News
宝玉的分享
宝玉的分享
N
Netflix TechBlog - Medium

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
Pre-fork due diligence for OSS contributors
shunta hayas · 2026-05-12 · via DEV Community

Note: This article was researched and drafted with AI assistance (Claude Sonnet 4.6 via Claude Code). All claims about specific repository policies are illustrative; readers should verify current state before acting on them.


Why you should scan a repo before you fork it

You found an issue. You know exactly how to fix it. You fork the repo, write the code, open a pull request — and it gets closed in minutes, not by a human, but by an automated workflow you never knew existed. No review. No feedback. Just a bot verdict and a "wasted" label.

This scenario has become noticeably more common in 2025 and 2026. A growing number of open-source maintainers have responded to the flood of low-quality, AI-generated contributions by deploying automated trust-gate systems directly in their CI pipelines. These gates can reject a PR silently — or with a curt machine-generated comment — based on signals that have nothing to do with whether your code is correct. They evaluate who contributed and how, not just what was contributed.

The cost is asymmetric. A maintainer's automated rejection takes milliseconds. The contributor's lost time — understanding the codebase, writing tests, drafting a good PR description — might be hours or days. Pre-fork due diligence costs five minutes. Doing it consistently is one of the highest-leverage habits an AI-assisted contributor can develop in 2026.


Common rejection vectors

Automated trust-gate workflows

The most aggressive rejection mechanism is a CI workflow that evaluates the contributor's account history before it evaluates the code. These tools look at signals like global merge ratio (how many of your past PRs across all of GitHub were merged versus closed), account age, and contribution velocity. If your profile doesn't meet the threshold, the workflow closes the PR automatically and may apply a label like suspicious-author or spam-likely.

These workflows are usually small GitHub Actions that run on pull_request events. They're often invisible from the repo's front page — you have to look inside .github/workflows/ to find them. Common identifiers include step names or action references containing strings like trust-score, min-global-merge-ratio, or references to community-maintained anti-spam action collections. A new GitHub account used primarily for AI-assisted contribution is exactly the profile these tools are tuned to catch.

Anti-slop quality-gate workflows

A second category focuses on content quality rather than account history. These workflows look for statistical signals associated with machine-generated text — unusual vocabulary distributions, patterns common in LLM output, or structural anti-patterns in commit messages and PR descriptions. The term "slop" has become shorthand for this class of low-effort generated content in OSS communities. Workflows in this family typically reference action names or step IDs containing anti-slop or similar identifiers.

It is worth noting that a well-crafted, human-reviewed AI-assisted contribution can pass these checks — but only if the contributor has actually read and understood the code before submitting. Blind "generate and submit" workflows are what these gates are designed to block.

Explicit AI bans in contribution documentation

The third category is simpler to detect but easier to overlook: written policy. Many maintainers have added explicit clauses to CONTRIBUTING.md, PR templates, or even the main README.md stating that AI-generated or AI-assisted contributions are not accepted. Language varies:

  • "AI tools are not permitted"
  • "no AI" / "ban AI" / "prohibit AI"
  • "LLM not allowed" / "Copilot is not allowed"
  • "all submissions must be human-written"
  • "human-authored contributions only"

Some policies stop short of an outright ban but require disclosure: "disclose AI" or "AI disclosure required". These MEDIUM-severity signals are worth reading carefully — a disclosure requirement is very different from a ban, but missing it can still get your PR closed.

Rejection-signal labels

Finally, some repos attach labels that serve as a public ledger of past rejections. Labels like no-ai, ai-rejected, human-only, ai-ban, and ai-generated-rejected are visible on closed PRs and on the label list itself. A repo with fifty closed PRs all tagged ai-generated-rejected is telling you something important about maintainer tolerance, regardless of what the written policy says.


The manual scan workflow

You can run a quick scan by hand using the GitHub CLI (gh). The following three commands cover the main surface areas.

Step 1 — Check workflow files for trust-gate patterns:

# List all workflow file names, then inspect suspicious ones
gh api repos/<owner>/<repo>/contents/.github/workflows \
  --jq '.[].name'

# Fetch the content of a specific workflow and grep for known patterns
gh api repos/<owner>/<repo>/contents/.github/workflows/pr-check.yml \
  --jq '.content' | base64 -d | \
  grep -iE 'trust-score|anti-slop|min-global-merge-ratio|fossier'

Enter fullscreen mode Exit fullscreen mode

Step 2 — Scan CONTRIBUTING.md for policy language:

# Fetch CONTRIBUTING.md and search for AI-related policy keywords
gh api repos/<owner>/<repo>/contents/CONTRIBUTING.md \
  --jq '.content' | base64 -d | \
  grep -iE 'no.?ai|ai.is.not.allowed|ai.tools|human.authored|human.written|llm.not.allowed|disclose.ai|ban.ai|prohibit.ai|reject.ai'

Enter fullscreen mode Exit fullscreen mode

Step 3 — Inspect repository labels:

# List all labels; look for rejection-signal names
gh label list --repo <owner>/<repo> | \
  grep -iE 'no-ai|ai-rejected|human-only|ai-ban|ai-generated'

Enter fullscreen mode Exit fullscreen mode

Running all three before you fork gives you a solid picture in under a minute. The limitation is that you have to remember to do it, and you need to know what patterns to look for. That's the gap the tool below is designed to close.


Automating with gh-pr-trust-scan

gh-pr-trust-scan is a small Python CLI that wraps the three manual steps above into a single command, applies a curated set of detection patterns, and produces a machine-readable verdict. It was built specifically to answer one question: "Will this project reject my AI-assisted PR on policy grounds before anyone looks at the code?"

Installing the tool

# Recommended: isolated environment via pipx
pipx install gh-pr-trust-scan

# Or with pip
pip install gh-pr-trust-scan

Enter fullscreen mode Exit fullscreen mode

Note: The package is not yet published to PyPI (coming soon). During the development period, install from source:

git clone https://github.com/taiman724/gh-pr-trust-scan
cd gh-pr-trust-scan
pip install -e ".[dev]"

Requirements: Python 3.10+ and the GitHub CLI (gh) authenticated via gh auth login.

Running a scan

# Basic scan — prints a human-readable verdict
gh-pr-trust-scan owner/repo

# Full GitHub URL also works
gh-pr-trust-scan https://github.com/owner/repo

# JSON output for scripting or CI integration
gh-pr-trust-scan owner/repo --json

Enter fullscreen mode Exit fullscreen mode

The tool produces one of three verdicts:

Verdict When it fires
SAFE No explicit AI contribution policy detected (all findings LOW or none)
WARN Discouraging policy language or rejection labels found, but no automated gate
AVOID At least one HIGH-severity finding — an automated rejection gate is present

A SAFE verdict on a repo with an actively maintained codebase and no policy signals is a reasonable green light. A WARN verdict calls for reading the actual CONTRIBUTING.md carefully before investing time. An AVOID verdict means a bot will likely close your PR before a human sees it.

Here is what the output looks like for a repo with multiple signals:

Scanning example-org/example-repo ...

Repo:    example-org/example-repo
Verdict: AVOID  (trust-gate detected)

Findings:
  [HIGH  ] Trust-score gate detected in workflow (.github/workflows/pr-review.yml)
  [MEDIUM] 'human-written' requirement found (line 18): All submissions must be human-written. (CONTRIBUTING.md)
  [MEDIUM] Label 'human-only' found

Stats:
  Last commit: 1 day ago
  Open PRs: 23
  Closed-no-merge PRs (last 30): 9

Enter fullscreen mode Exit fullscreen mode

And the equivalent JSON, useful for scripting:

{
  "repo": "example-org/example-repo",
  "verdict": "AVOID",
  "findings": [
    {
      "severity": "HIGH",
      "category": "trust_gate",
      "evidence": "trust-score gate detected in workflow",
      "file": ".github/workflows/pr-review.yml"
    },
    {
      "severity": "MEDIUM",
      "category": "human_only_requirement",
      "evidence": "'human-written' requirement found (line 18)",
      "file": "CONTRIBUTING.md"
    },
    {
      "severity": "MEDIUM",
      "category": "label",
      "evidence": "Label 'human-only' found",
      "file": "labels"
    }
  ],
  "stats": {
    "last_commit": "1 day ago",
    "open_prs": 23,
    "closed_no_merge_last_30d": 9,
    "flagged_closed_prs": 0
  }
}

Enter fullscreen mode Exit fullscreen mode

Adding custom patterns

All detection keywords live in a single file: src/gh_pr_trust_scan/patterns.py. Adding a new trust-gate or policy phrase requires no changes to the scanner logic — just append an entry to the appropriate list:

# patterns.py — adding a custom workflow pattern
WORKFLOW_PATTERNS.append({
    "pattern": r"my-org/custom-trust-gate-action",
    "severity": "HIGH",
    "category": "trust_gate",
    "description": "Custom trust gate action detected",
})

# Adding a new text-file pattern (e.g. a new policy phrase)
TEXT_PATTERNS_HIGH.append({
    "pattern": r"\bno\s+generated\s+code\b",
    "severity": "HIGH",
    "category": "ai_ban_explicit",
    "description": "'no generated code' policy found",
})

Enter fullscreen mode Exit fullscreen mode

The pattern values are Python regexes compiled case-insensitively, so you can handle variations with standard regex syntax. The community is especially interested in patterns for emerging tools and newly observed policy phrases — if you encounter a rejection mechanism that the tool misses, a PR adding the pattern is a concise and high-value contribution.


Closing thoughts

gh-pr-trust-scan is a static signal detector. It catches what is written down and what is visible in the repository's public API. It cannot tell you whether a maintainer will appreciate your change, whether the project is actively maintained, or whether your implementation approach aligns with the project's unstated conventions. Those questions still require reading the repo: scanning open issues, reviewing recent merged PRs, and — when in doubt — opening an issue to discuss before writing code.

The broader advice stands regardless of what tools you use: invest a few minutes of research before you invest hours of implementation. OSS contribution policies are increasingly explicit and machine-enforced. Treating due diligence as part of your workflow, rather than an afterthought, is what separates PRs that get merged from PRs that get closed by bots.

Contributions to gh-pr-trust-scan are welcome. The highest-value PRs are new detection patterns for trust-gate tools or policy language not yet covered. If you encounter a rejection signal that the tool misses, please open an issue first — especially for patterns that touch specific third-party tools, where context matters.


This article was researched and drafted with AI assistance (Claude Sonnet 4.6 via Claude Code). Pattern data and tool behavior are based on the gh-pr-trust-scan codebase as of May 2026. Repository policies change — always verify current CONTRIBUTING.md content before acting on a scan result.