music on atproto
plyr.fm
1# run moderation loop via workflow dispatch
2#
3# analyzes pending copyright flags, auto-resolves false positives,
4# creates review batches for human review, sends DM notification
5#
6# required secrets:
7# MODERATION_SERVICE_URL - moderation service base URL
8# MODERATION_AUTH_TOKEN - X-Moderation-Key header value
9# ANTHROPIC_API_KEY - for flag analysis
10# NOTIFY_BOT_HANDLE - bluesky bot handle for DMs
11# NOTIFY_BOT_PASSWORD - bluesky bot app password
12# NOTIFY_RECIPIENT_HANDLE - who receives DM notifications
13
14name: run moderation loop
15
16on:
17 workflow_dispatch:
18 inputs:
19 dry_run:
20 description: "dry run (analyze only, don't resolve or send DMs)"
21 type: boolean
22 default: true
23 limit:
24 description: "max flags to process (leave empty for all)"
25 type: string
26 default: ""
27 env:
28 description: "environment (for DM header)"
29 type: choice
30 options:
31 - prod
32 - staging
33 - dev
34 default: prod
35
36jobs:
37 run:
38 runs-on: ubuntu-latest
39
40 steps:
41 - uses: actions/checkout@v4
42
43 - uses: astral-sh/setup-uv@v4
44
45 - name: Run moderation loop
46 run: |
47 ARGS=""
48 if [ "${{ inputs.dry_run }}" = "true" ]; then
49 ARGS="$ARGS --dry-run"
50 fi
51 if [ -n "${{ inputs.limit }}" ]; then
52 ARGS="$ARGS --limit ${{ inputs.limit }}"
53 fi
54 ARGS="$ARGS --env ${{ inputs.env }}"
55
56 echo "Running: uv run scripts/moderation_loop.py $ARGS"
57 uv run scripts/moderation_loop.py $ARGS
58 env:
59 MODERATION_SERVICE_URL: ${{ secrets.MODERATION_SERVICE_URL }}
60 MODERATION_AUTH_TOKEN: ${{ secrets.MODERATION_AUTH_TOKEN }}
61 ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
62 NOTIFY_BOT_HANDLE: ${{ secrets.NOTIFY_BOT_HANDLE }}
63 NOTIFY_BOT_PASSWORD: ${{ secrets.NOTIFY_BOT_PASSWORD }}
64 NOTIFY_RECIPIENT_HANDLE: ${{ secrets.NOTIFY_RECIPIENT_HANDLE }}