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

推荐订阅源

博客园 - 【当耐特】
云风的 BLOG
云风的 BLOG
罗磊的独立博客
C
Check Point Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Blog — PlanetScale
Blog — PlanetScale
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
Google DeepMind News
Google DeepMind News
Engineering at Meta
Engineering at Meta
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
Recent Announcements
Recent Announcements
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园_首页
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
人人都是产品经理
人人都是产品经理
爱范儿
爱范儿
I
InfoQ
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
B
Blog RSS Feed

Show HN

Show HN: AI agents for UK GDAD PCF roles and their skills The Two Pillars: Mixer Mode and Meta-Software in the Reorganization of Software Work After AI GitHub - JaiCode08/teleport-env What 1,000+ Harness Experiments Taught Me About Self-Improving Agents Show HN: Liiists, a Markdown-first, iOS and CLI list app SwiperTab – Get this Extension for 🦊 Firefox (en-US) GitHub - kouhxp/fftext: Summarize, explain, fact-check, or translate any text, URL, or file. No GPU. No cloud. One command GitHub - sweetpad-dev/sweetpad: Develop Swift/iOS projects using VSCode GitHub - dogmaticdev/IRON: IRON a.k.a. Intermediate Representation Object Notation is a Interpreter/Database that is used to create Programming Languages. GitHub - sjhalani7/vaen: Package your AI coding harness into a portable .agent file, and share it across repos, teams, & the community without ever having to copy-paste instructions, skills, MCP config, or secrets. Show HN: Gandalf the Grader Show HN: Citadeld – replay any CI failure locally from a single file GitHub - tdortman/cuSBF: High-Performance GPU Super Bloom Filter coral-ai/claude-code-token-xray at main · Coral-Bricks-AI/coral-ai GitHub - ulyssestenn/funes: Funes is a Git-based framework for LLM-managed knowledge work: an AI Librarian ingests raw sources, builds an interlinked Markdown knowledge base, and uses it to produce cited reports, analyses, and other outputs. GitHub - ThatXliner/gah: Git Add Hunk, built for agents to use GitHub - harmont-dev/harmont-cli: Command-line client for the Harmont CI platform GitHub - brooksmcmillin/mcp-authflow: OAuth 2.0 Authorization Server framework for MCP servers GitHub - javaid-codes/audit-supply-chain-agents GitHub - amorey/gochan: A small library of common channel architectures for Go, inspired by Rust GitHub - arifozgun/OpenGem: Free, Open-Source AI API Gateway with Gemini, OpenAI & Anthropic Compatibility in 1 file GitHub - Pranesh950/BioPetals: 🌸 Run BIOxAI models at home, BitTorrent-style. Fine-tuning and inference up to 10x faster than offloading GitHub - cnguyen14/bounty-doctor: Diagnose a GitHub bounty issue before you waste hours: detects honeypot scam repos, AI-bot attempt swarms, and stale contests. Show HN: CoreMCP – MCP Server for On-Prem DBs Show HN: KittyHTML – Render HTML/CSS as an inline image in your terminal GitHub - bingud/filemat: Web-based file manager Show HN: TruthLens – Free multi-signal deepfake image detector GitHub - apexlocal-jz/claude-usage-tray: Windows system-tray app showing your Claude Code rate-limit usage at a glance. Zero deps, ~300 lines of PowerShell. Cross-IDE (works regardless of VS Code, Cursor, plain terminal). Release v0.1.2.1 · kouhxp/yapsnap GitHub - noopolis/moltnet: Self-hostable chat network for AI agents. Pre-built bridges for Claude Code, Codex, and the Claws. Rooms, DMs, history. No Slack bots, no Matrix, no glue code.
GitHub - prodgate-dev/prodgate: Access control regression...
anans04 · 2026-06-15 · via Show HN

Access control regression detection for Express APIs.

Prodgate diffs the middleware chain of your Express backend across two versions of a codebase and produces a deterministic pass/fail verdict.

Installation

Usage

prodgate check --before <path> --after <path>

Example output

Prodgate Access Control Report
──────────────────────────────────────────────────
Routes scanned: 28
[CRITICAL] Access control regression: POST /impersonate/:userId
  File:   src/api/admin.ts:12
  Before: requireSuperuser
  After:  (none)
  Impact: POST /impersonate/:userId no longer enforces any access control. This endpoint is now publicly accessible.
──────────────────────────────────────────────────
Authorization changes detected:
  CRITICAL
    POST /impersonate/:userId   requireSuperuser -> (none)
Verdict: FAIL

What Prodgate detects

CRITICAL (fails CI):

  • Route lost auth middleware
  • Router mount lost auth middleware (all child routes affected)
  • New unprotected POST, PUT, DELETE, or PATCH route
  • Unprotected route shadows a protected route on the same path

WARNING (informational by default, fails CI with --strict):

  • New unprotected GET route
  • Inconsistent protection across sibling routes

Flags

Flag Description
--json Output raw JSON
--github Output GitHub markdown for PR comments
--output <file> Write output to a file
--strict Fail CI on warnings as well as criticals

CI Integration

Add this to your repository at .github/workflows/prodgate.yml:

name: Prodgate Access Control Check

on:
  pull_request:
    branches: [main, master]

jobs:
  prodgate:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
      issues: write

    steps:
      - name: Checkout PR branch
        uses: actions/checkout@v6
        with:
          path: after

      - name: Checkout base branch
        uses: actions/checkout@v6
        with:
          ref: ${{ github.base_ref }}
          path: before

      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: '22'

      - name: Install prodgate
        run: npm install -g prodgate

      - name: Run prodgate check
        run: prodgate check --before ./before --after ./after --json --output prodgate-result.json
        continue-on-error: true

      - name: Post PR comment
        if: always()
        continue-on-error: true
        uses: actions/github-script@v9
        with:
          script: |
            try {
              const fs = require('fs')
              if (!fs.existsSync('prodgate-result.json')) return
              const result = JSON.parse(fs.readFileSync('prodgate-result.json', 'utf8'))
              const verdict = result.verdict === 'pass' ? 'PASS' : 'FAIL'
              let body = `## Prodgate Access Control Check: ${verdict}\n\n`
              body += `**${result.stats.routesScanned} routes scanned**\n\n`
              const criticals = result.findings.filter(f => f.severity === 'CRITICAL')
              const warnings = result.findings.filter(f => f.severity === 'WARNING')
              if (criticals.length === 0 && warnings.length === 0) {
                body += `No access control issues detected.\n`
              }
              if (criticals.length > 0) {
                body += `### Critical Issues\n\n`
                for (const f of criticals) {
                  body += `**\`${f.route.method.toUpperCase()} ${f.route.path}\`**: ${f.summary}\n`
                  body += `- Before: \`${f.auth.beforeEffective.join(' -> ') || '(none)'}\`\n`
                  body += `- After: \`${f.auth.afterEffective.join(' -> ') || '(none)'}\`\n`
                  if (f.affectedRoutes && f.affectedRoutes.length > 0) {
                    body += `- Affected routes: ${f.affectedRoutes.join(', ')}\n`
                  }
                  body += `\n`
                }
              }
              if (warnings.length > 0) {
                body += `### Warnings\n\n`
                for (const f of warnings) {
                  body += `- \`${f.route.method.toUpperCase()} ${f.route.path}\`: ${f.summary}\n`
                }
              }
              await github.rest.issues.createComment({
                issue_number: context.issue.number,
                owner: context.repo.owner,
                repo: context.repo.repo,
                body
              })
            } catch (e) {
              console.log('Could not post PR comment:', e.message)
            }

      - name: Fail if critical issues detected
        run: |
          node -e "
            const fs = require('fs');
            const result = JSON.parse(fs.readFileSync('prodgate-result.json', 'utf8'));
            if (result.verdict === 'fail') {
              console.log('Prodgate detected critical access control regressions.');
              process.exit(1);
            }
            console.log('Prodgate check passed.');
          "

Zero config

Prodgate auto-detects Express route files by scanning your repository. No configuration required.

If auto-detection doesn't work for your project structure, create a prodgate.config.json at the repo root:

{
  "routesDir": "src/routes",
  "authPatterns": ["requireAuth", "requireAdmin"],
  "ignore": ["/health", "/metrics"]
}

Limitations

  • Express only. NestJS, FastAPI, and Rails support is planned.
  • Static analysis only. It does not execute code or make network requests.
  • Middleware identity is based on name and structure. Renamed or wrapped middleware may not be detected correctly.
  • Dynamic route registration patterns may be missed.
  • Router-to-route matching uses naming conventions. Unusual naming may require routesDir configuration.

Demo

See prodgate-demo for two worked examples with real CLI output.