DevPulse GitHub ↗

IBM Bob 2.0 Hackathon · September 2026

We hid 22 security bugs in two small apps and asked IBM Bob to find them.

It found every one of them, didn't raise a single false alarm, and ignored all seven traps we set for it. The fixes took two tries to get right. This site shows what happened, file by file.

Why we built this

Every AI code review demo we've seen goes the same way: point it at some code, watch it list problems, applaud. But you never find out what it missed, or how many of those problems were real. That's the part that matters if you're deciding whether to let a tool like this near your pull requests.

So we flipped it around. We wrote the bugs first, kept the answer key to ourselves, and graded Bob like an exam.

What we learned from round 1

Bob's fixes were the right ones. Parameterised queries, bcrypt, rate limiting, a proper admin check. But when we tried to apply the patches, 8 of 10 failed because the line numbers in the diff headers were off.

Nobody would have noticed until a developer tried to merge them. So we added a rule to Bob's fix skill: every patch has to pass git apply --check before it counts.

It worked. In round 2 all 12 patches applied as Bob handed them in. Watching the run, you can see several subagents check their patch, find it broken, and rebuild it before reporting back.

How the test works

  1. We write the bugs. Two small Express apps, each with vulnerabilities planted in known places. The second one also has decoys: code that looks risky but is actually fine. The answer key lives in a file Bob is told not to open (and can't see anyway, thanks to .bobignore).
  2. Bob audits. We gave Bob its own Security Auditor mode. It can read the whole project but can only write to the audit/ folder. It splits the files across subagents running in parallel, then writes what it finds to a JSON file.
  3. Bob fixes. A second skill hands each finding to its own subagent, which writes a small patch.
  4. A script marks the work. It compares Bob's findings to the answer key, counts misses and false alarms, and tries to apply every patch.

The two rounds

Round 1 is the easy warm-up. Round 2 is the one we actually cared about: quieter bugs and seven traps.

Who would use this

Any team that's already using AI to write code and now has to decide how much to trust it. Before you let an AI reviewer block a release, you'd want to know its hit rate on your own codebase, not on a vendor's demo.

The findings export as SARIF, so they show up in GitHub's code scanning tab like any other scanner. Each one points to an OWASP ASVS requirement and quotes the exact line, which makes them easy to check by hand.

If you only have a minute

  • Open and click any item. You'll see the line Bob flagged and the patch it wrote.
  • shows what Bob caught, and which of the traps it walked past.
  • has a screenshot of every Bob task and what each one cost.

Findings

    Scores

    Worked out by scripts/score_audit.mjs. A finding counts as a hit if it names the right kind of bug in the right file, within three lines of where we planted it. Anything else is a false alarm.

    The bugs we planted

      The traps (safe code that looks risky)

        How it works

        Everything Bob needs is in the .bob/ folder: the Security Auditor mode, two skills and a short rules file. The pages on this site just read the files Bob wrote.

        The flow

        flowchart LR
          classDef bob fill:#edf5ff,stroke:#0f62fe,color:#161616;
          classDef file fill:#fcf4d6,stroke:#b28600,color:#161616;
          classDef ui fill:#ffffff,stroke:#8d8d8d,color:#161616;
          classDef gate fill:#defbe6,stroke:#198038,color:#161616;
          U[Developer
        in Bob IDE]:::ui -->|"Security Auditor mode"| A[security-audit
        skill]:::bob A --> S1[explore subagent
        file 1]:::bob A --> S2[explore subagent
        file 2]:::bob A --> S3[explore subagent
        file N]:::bob S1 & S2 & S3 --> M[merge and
        double-check]:::bob M --> F[(findings.json)]:::file F --> G[generate-fixes
        one subagent per finding]:::bob G --> D[(fixes/*.diff)]:::file D --> V{git apply
        --check}:::gate F & V --> SC[mark against
        answer key]:::gate SC --> W[this site + SARIF]:::ui

        Custom mode

        Bob can read anything, but can only save files matching ^audit/.*\.(json|diff)$. It can't touch the code it's auditing.

        Subagents

        One read-only subagent per file for the audit, one per finding for the fixes. It keeps each piece of work small, and it's cheaper.

        Skills

        Written instructions Bob follows every time: what to look for, how to rate severity, and the exact JSON to produce.

        Rules

        Don't read the answer keys, don't edit the apps. The keys are also hidden from Bob with .bobignore.

        .bob/custom_modes.yaml
        .bob/skills/security-audit/SKILL.md
        .bob/skills/generate-fixes/SKILL.md

        Run it yourself

        git clone https://github.com/ShermaineYap/IBM-BOB2-HACK && cd IBM-BOB2-HACK
        npm install
        
        # In Bob IDE, switch to the Security Auditor mode, then:
        #   Run the security-audit skill on ledger_app/, write audit/hard/findings.json
        #   Run the generate-fixes skill on audit/hard/findings.json
        
        node scripts/score_audit.mjs audit/hard   # marks Bob's work against the answer key
        node scripts/to_sarif.mjs audit/hard      # SARIF file for GitHub code scanning
        npm run dev                               # this site

        Bob sessions

        Every task we ran in Bob IDE for this project, including the one that didn't work out. Click a screenshot to enlarge it. The files are in bob_sessions/.