Best for
- Use when user says "drain the security queue", "work through alerts", or after `/loop` triggers from bifrost-secaudit.
gobifrost/bifrost/.codex/skills/bifrost-secupdate/SKILL.md
Drain the Bifrost Security tab — work through open Dependabot PRs (auto-merge eligible vs needs-review classification), Dependabot alerts (with/without PR), CodeQL alerts (severity-first triage with subagent fan-out for class-level rules), secret-scanning alerts (real vs FP). Use when user says "drain the security queue", "work through alerts", or after `/loop` triggers from bifrost-secaudit.
Decision brief
The action sibling of bifrost-secaudit. Where audit shows you what's there, secupdate moves it. Three iron rules, plus a series of explicit halt conditions, plus the actual loop.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/gobifrost/bifrost --skill ".codex/skills/bifrost-secupdate"Inspect the Agent Skill "bifrost-secupdate" from https://github.com/gobifrost/bifrost/blob/3e53e2c53db6b1db1712cb62a013ffe8885dedbe/.codex/skills/bifrost-secupdate/SKILL.md at commit 3e53e2c53db6b1db1712cb62a013ffe8885dedbe. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
gh run list --repo gobifrost/bifrost --workflow "dependabot-auto-merge.yml" --limit 1 \ --json conclusion --jq '.[0].conclusion'
Review the “If "failure", investigate before assuming new PRs will auto-merge — the workflow may need a fix first.” section in the pinned source before continuing.
For each open Dependabot PR (author == "app/dependabot"):
1. Has an associated open Dependabot PR? Cross-reference the name field against open PRs. If yes → wait for the PR; don't act on the alert. 2. No PR but a fix exists upstream? This means Dependabot scheduled run hasn't picked it up yet. Either wait for the next Monday run, or tr…
CodeQL is the largest category. Triage in tiers:
Permission review
The documentation asks the agent to read local files, directories, or repositories.
Read 5-10 representative samples at file:lineThe documentation asks the agent to run terminal commands or scripts.
**DISMISS_AS_CLASS verdicts:** show the user the table; on approval, run the bulk dismiss script per rule:Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 94/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 59 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
The action sibling of bifrost-secaudit. Where audit shows you what's there, secupdate moves it. Three iron rules, plus a series of explicit halt conditions, plus the actual loop.
dependabot-auto-merge.yml workflow already does this for new PRs; re-evaluate any PRs where the workflow may have skipped.needs-review (workflow does this), do not auto-merge. Investigate per-PR.gh api -X PATCH .../code-scanning/alerts/{n}.Halt conditions (stop and ask):
/bifrost-secupdatebifrost-secaudit and wants to act on the reportbifrost-secauditBefore starting the loop, capture state:
# Branch protection — confirm checks are still required (else --auto is unsafe)
gh api repos/gobifrost/bifrost/branches/main/protection \
--jq '.required_status_checks.contexts // [] | length'
# Must be ≥1; if 0, halt and surface ("branch protection regressed; not safe to auto-merge").
# Auto-merge workflow last run
gh run list --repo gobifrost/bifrost --workflow "dependabot-auto-merge.yml" --limit 1 \
--json conclusion --jq '.[0].conclusion'
# If "failure", investigate before assuming new PRs will auto-merge — the workflow may need a fix first.
# All open PRs to know the working set
gh pr list --repo gobifrost/bifrost --state open \
--json number,title,author,labels,statusCheckRollup,mergeable,createdAt
For each open Dependabot PR (author == "app/dependabot"):
for pr in dependabot_prs:
metadata = parse_title(pr.title) # e.g., "patch", "minor", "major", "security"
ci_state = aggregate_ci(pr.statusCheckRollup)
has_review_label = "needs-review" in pr.labels
# Patch / minor / security with green CI → auto-merge
if metadata.bump in ("patch", "minor") or metadata.is_security:
if ci_state == "green":
if not pr.auto_merge_enabled:
gh_pr_merge_auto(pr.number)
elif ci_state == "failed":
# Decide: transient (network / docker hub timeout) vs real
if is_transient(pr.failure_logs):
gh_run_rerun_failed(pr.failed_run_id)
else:
# PAUSE POINT — real failure on a minor/patch is unusual,
# surface it. Could be a peer-dep mismatch or a bumped
# transitive that broke our code.
halt_and_report(pr, "minor/patch CI failure — needs investigation")
# ci_state == "pending" → no action, GitHub's auto-merge waits
# Major or docker → needs-review, no auto-merge
elif metadata.bump == "major" or metadata.ecosystem == "docker":
if not has_review_label:
gh_pr_edit_add_label(pr.number, "needs-review")
# Don't auto-merge. Per-PR decision happens in section B below.
Specifics for failure handling:
gh run rerun <run_id> --failed.gh api "repos/gobifrost/bifrost/dependabot/alerts?state=open" \
--jq '.[] | {n: .number, sev: .security_vulnerability.severity, name: .dependency.package.name}'
For each:
name field against open PRs. If yes → wait for the PR; don't act on the alert.@dependabot recreate on a recent PR (so it re-evaluates the manifest).CodeQL is the largest category. Triage in tiers:
Tier 1 — Errors with potential systemic fixes (parallel subagent fan-out)
For each error-severity rule with N≥3 findings, dispatch a triage subagent that:
You are triaging CodeQL alerts for rule `<RULE_ID>` in gobifrost/bifrost.
Steps:
1. List all open alerts for this rule (via gh api code-scanning/alerts pagination)
2. Read 5-10 representative samples at file:line
3. Determine verdict
Return a strict markdown report:
## Verdict: <DISMISS_AS_CLASS | FIX_AS_CLASS | MIXED>
## Rationale
<2-3 sentences>
## If FIX_AS_CLASS: proposed fix
<one-paragraph framework-level fix>
## If MIXED: per-file decisions
- file:line — fix | dismiss (reason)
## Sample evidence
<5-10 file:line excerpts with surrounding code>
Do NOT take action. Only report.
After all subagents return, the controller (this skill, in the main session) aggregates:
RULE_ID="py/unsafe-cyclic-import"
REASON="SQLAlchemy ORM relationship() lazy-eval — see verdict"
for page in {1..15}; do
gh api "repos/gobifrost/bifrost/code-scanning/alerts?state=open&per_page=100&page=$page" \
--jq ".[] | select(.rule.id == \"$RULE_ID\") | .number" 2>/dev/null
done | xargs -I {} -P 4 gh api -X PATCH \
"repos/gobifrost/bifrost/code-scanning/alerts/{}" \
-f state=dismissed -f "dismissed_reason=false positive" \
-f "dismissed_comment=$REASON"
dismissed_reasonmust befalse positive,won't fix, orused in tests(with spaces, not underscores).dismissed_commentis capped at 280 chars.
Tier 2 — Singleton errors and small clusters
Rules with 1–3 findings. One subagent reads them all, returns the same verdict shape. Same aggregation.
Tier 3 — Warnings
Same triage shape, but the bar for "fix as class" is lower (most warnings are real low-priority cleanup). Default to MIXED — fix what's safe in a sweep, dismiss the truly noise-y ones.
Tier 4 — Notes
Many notes are mechanical safe cleanups (py/unused-import, py/repeated-import, py/test-equals-none). For these:
For non-mechanical notes (py/unused-global-variable — which often points to public API surface), use the regular triage subagent + verdict aggregation pattern.
Tier 5 — Scorecard-derived *ID rules
Wait. These auto-resolve on the next weekly Scorecard run. Don't dispatch.
gh api "repos/gobifrost/bifrost/secret-scanning/alerts?state=open"
For each:
Real secret? Rotate it immediately. Add a .gitignore entry. PAUSE to confirm rotation and post-rotation steps before dismissing the alert.
False positive? Common causes: node_modules/<pkg> ships test fixtures with placeholder credentials; CI workflow shows env-var name like OPENAI_KEY that gets pattern-matched as the actual key.
Dismiss with gh api -X PATCH /repos/.../secret-scanning/alerts/{n} and state=resolved, resolution=false_positive. Always include a comment explaining why.
# Snapshot all open Dependabot PRs with their CI state
gh pr list --repo gobifrost/bifrost --state open \
--author "app/dependabot" \
--json number,title,labels,statusCheckRollup --jq '.[] | {n: .number, title: .title, ci: [.statusCheckRollup[] | select(.name == "Lint & Type Check" or .name == "Unit Tests" or .name == "E2E Tests") | "\(.name): \(.conclusion // .status)"]}'
# Re-run failed checks on a PR (after concluding the failure was transient)
RUN_ID=$(gh pr view <N> --repo gobifrost/bifrost --json statusCheckRollup --jq '.statusCheckRollup[] | select(.conclusion == "FAILURE") | .detailsUrl' | grep -oE 'runs/[0-9]+' | head -1 | sed 's|runs/||')
gh run rerun $RUN_ID --repo gobifrost/bifrost --failed
# Trigger Dependabot rebase (when main has moved and PR is "branches up to date" gated)
gh pr comment <N> --repo gobifrost/bifrost --body "@dependabot rebase"
# Trigger Dependabot recreate (when dependabot.yml changed and PR needs new ignore rules applied)
gh pr comment <N> --repo gobifrost/bifrost --body "@dependabot recreate"
# Enable auto-merge (squash, default in this repo)
gh pr merge <N> --repo gobifrost/bifrost --auto --squash
# Bulk-dismiss CodeQL alerts for a rule (CONFIRMED VERDICT REQUIRED)
RULE_ID="<rule>"; REASON="<one sentence>"
for page in {1..15}; do
gh api "repos/gobifrost/bifrost/code-scanning/alerts?state=open&per_page=100&page=$page" \
--jq ".[] | select(.rule.id == \"$RULE_ID\") | .number" 2>/dev/null
done | xargs -I {} -P 4 gh api -X PATCH \
"repos/gobifrost/bifrost/code-scanning/alerts/{}" \
-f state=dismissed -f "dismissed_reason=false positive" \
-f "dismissed_comment=$REASON"
# Dismiss a single CodeQL alert
gh api -X PATCH "repos/gobifrost/bifrost/code-scanning/alerts/<n>" \
-f state=dismissed -f "dismissed_reason=false positive" \
-f "dismissed_comment=<reason>"
These are the explicit places to halt and ask the user:
When invoked via /schedule (Phase 3 of the rollout in docs/superpowers/plans/2026-04-25-resume-oss-hardening.md):
This is forward-looking; until Phase 3 actually flips, ignore this section.
Frequently asked questions
The action sibling of bifrost-secaudit. Where audit shows you what's there, secupdate moves it. Three iron rules, plus a series of explicit halt conditions, plus the actual loop.
The source record exposes this install command: npx skills add https://github.com/gobifrost/bifrost --skill ".codex/skills/bifrost-secupdate". Inspect the command and pinned source before running it.
Static rules flagged read-files, exec-script in the source; the page lists the matching lines and excerpts.
Alternatives
garrytan/gbrain
End-to-end discipline for turning any large data source (audio libraries, email takeouts, document corpora, chat exports, API dumps) into brain pages at scale. The lifecycle spine: SCHEMA → ACCESS → TRIAL → EVALUATE → IMPROVE → CODIFY → TEST → SKILLIFY → BULK → MONITOR. State is tracked in a durable JSON manifest (see MANIFEST-PATTERN.md) so any crash, session boundary, or subagent fan-out resumes from ground truth instead of memory.
alirezarezvani/claude-skills
App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist
wanshuiyin/Auto-claude-code-research-in-sleep
Use it for operations and research tasks; the detail page covers purpose, installation, and practical steps.
prowler-cloud/prowler
PostgreSQL indexing best practices for Prowler: index design, partial indexes, partitioned table indexing, EXPLAIN ANALYZE validation, concurrent operations, monitoring, and maintenance. Trigger: When creating or modifying PostgreSQL indexes, analyzing query performance with EXPLAIN, debugging slow queries, reviewing index usage statistics, reindexing, dropping indexes, or working with partitioned table indexes. Also trigger when discussing index strategies, partial indexes, or index maintenance