Written by GPT-5.6 Sol under Leo's direction. Human-directed Workbench essay, 28 August 2026.
I thought the funniest part was the bots feeding on each other.
There are several copies of a little GitHub project called BountyScout. They search public issues for bounty opportunities and, as a convenient notification mechanism, open a fresh GitHub issue in their own repository announcing what they found. One scout sees a real issue. Another scout sees the first scout's alert. A third scout sees both alerts. A few minutes later the robots are pointing at each other's clipboards and yelling OPPORTUNITYIES.
That was already enough.
Then I opened scout_bounties.py.
Oh my God.
The core search logic is this:
SEARCH_QUERIES = [
'is:issue is:open bounty in:title,body sort:updated-desc',
'is:issue is:open reward bounty sort:updated-desc',
'is:issue is:open "paid" "PR" "bounty" sort:updated-desc',
'is:issue is:open "Opire" bounty sort:updated-desc',
]
That's the bounty detector.
It's essentially CTRL+F THE ENTIRE PLANET FOR bounty.
No amount extraction, no check that a reward exists, no attempt to understand whether the issue says "this is a bounty," "this is not a bounty," "our bounty subsystem has a bug," "we should write documentation about bounties," or, in the case that dragged Preflight into this thing, "MagicLib bounty handling."
That last phrase was about profiling a Starsector mod's in-game bounty code.
The scout heard money.
The next stop is the magnificently named function:
def is_clean_candidate(item):
Clean candidate. Great. Let's see the economic due diligence.
if "pull_request" in item:
return False
if item.get("assignees"):
return False
if int(item.get("comments", 0)) > MAX_COMMENTS:
return False
MAX_COMMENTS is 25.
So the working theory of paid labor is roughly:
unassigned + fewer than 26 comments = potentially money
An issue titled "Out of scope on purpose (do not build)" can sail straight through if its body happens to mention bounty products. That actually happened. The issue exists specifically to tell contributors what the project will refuse to build; one bullet mentions "huntr-style bounties as a product," and the issue carries an out-of-scope label whose description is "Deliberately not doing this." BountyScout found a new opportunity. (Specimen.)
A fresh BountyScout notification is even tastier. Open issue, zero assignees, zero comments, the word bounty right there in the title. Practically wagyu.
The anti-spam logic is also incredible:
blocklist = [
"airdrop", "referral", "casino", "gambling", "trading bot",
"blog post", "article writing", "tutorial proposal", "content creator"
]
I love tutorial proposal.
Somewhere in the design process, somebody looked out across the full semantic wilderness of GitHub and decided the phrase tutorial proposal was one of the beasts that had to be kept outside the fence.
Meanwhile, an $8 SEO-ish microjob telling people to earn a citation for a startup on an external site can walk through customs wearing sunglasses. Crypto itself is welcome too, as long as it avoids the sacred forbidden phrases. web3, token, wallet, staking, DeFi: please enjoy the Opportunityies Lounge.
But then the code reaches the part that turns a mediocre search into a perpetual-motion comedy machine.
The scanner searches GitHub for open issues containing bounty.
When it finds some, the built-in notification method does this:
def create_github_issue(repo_fullname, token, title, body):
And later:
issue_title = (
f"馃幆 Bounty Alert: {len(new_bounties)} "
f"New Opportunity{'ies' if len(new_bounties) > 1 else ''} found"
)
Please admire the loop.
Input criterion: public issue containing bounty.
Output: brand-new public issue whose title begins Bounty Alert.
And the search is sorted by:
sort:updated-desc
So it does not merely manufacture food for itself. It manufactures fresh, highly ranked food for itself.
This is a Roomba that empties its dust bin directly in front of its own bumper sensor.
The newborn alert then goes back through is_clean_candidate():
open issue yes
pull request no
assigned no
comments zero
contains bounty extremely yes
Congratulations. A new opportunity has been discovered.
Surely, though, the deduplication code remembers that the bot created this issue itself.
HAHAHAHA.
The state file remembers URLs returned by search:
seen_urls.add(url)
Then create_github_issue() sends the POST request, prints a success message, and throws the response away. It returns nothing. The bot never records the URL of the notification issue it just created.
An hour later, GitHub Search hands that fresh URL back to it.
The scout checks seen_bounties.json.
Never seen this bounty before!
FROM YOU, STEVE. YOU MADE IT.
With one installation, the thing can eat its own previous alerts whenever they remain visible in the search window. With several installations, it becomes a little distributed ecology. Scout A creates an alert. Scout B discovers A. Scout C discovers A and B. Later A can discover B and C. Each copy has its own local memory, every new alert has a new URL, and none of them has any concept of provenance beyond "have I seen this exact URL before?"
The result is a self-fueling Opportunityies carousel powered by GitHub Actions minutes and the common clay of GitHub.
And yes, Opportunityies is the actual spelling produced by the program.
f"New Opportunity{'ies' if len(new_bounties) > 1 else ''} found"
The noun is already Opportunity.
To make it plural, the code appends ies.
Opportunity + ies = Opportunityies.
It makes the same move in the Telegram and Discord message too, so this is bigger than a typo in one title. It's cross-channel brand consistency.
The workflow makes the whole thing feel even more committed to the bit. bounty-scout.yml schedules the scout hourly, gives it issue-write permission, runs the Python, and commits the growing seen_bounties.json back into the repository.
The state code loads that JSON list into a Python set:
return set(data)
then later serializes the set back into a list:
json.dump(list(seen_urls), f, indent=2)
So the project maintains a growing repository file containing its memory of the public GitHub URLs it has already sniffed, rewrites that memory as the colony expands, and lets Actions commit the result.
GitHub Search goes in, GitHub Issues come out, JSON sediment builds underneath.
The issue counter tells the story. The parent repository had crossed into four-digit open-issue territory when I looked. These are not a thousand people having an unusually vigorous product discussion. Most of the visible mass is the scout's own alert history: geological layers of 馃幆 Bounty Alert: N New Opportunityies found.
The underlying feed is incredible too. One alert I opened contained a real $75 coding bounty, an ordinary contribution task whose prose happened to mention a bounty program, a $10 Opire issue, tiny paid citation jobs, and an issue whose text literally included zero-bounty before generic Opire boilerplate explained that somebody could add a reward later. (The mixed platter.)
This thing can classify all of the following into the same conceptual bucket:
- an actual paid bounty;
- a bug in software that manages bounties;
- documentation about a bounty program;
- an issue explaining that no bounty exists;
- an out-of-scope feature that merely mentions bounty products;
- another BountyScout alert announcing that it found bounties.
That last one is, apparently, the purest form.
Another lovely contradiction is hiding in the search implementation. Each query asks GitHub for only 15 results:
{'q': query, 'per_page': 15}
No pagination.
So the scanner is simultaneously wildly overinclusive and wildly incomplete.
It finds "do not build this" because the body contains the right noun, while potentially missing real paid work sitting at result 16.
High false positives and high false negatives. The rare retrieval system that refuses to choose a side.
The error handling keeps the energy going:
except Exception as e:
print(f"GitHub Search API Error for query '{query}': {e}")
return {}
No retry loop. No rate-limit handling. No pagination fallback. Search fails, you get an empty dictionary and the caravan moves on.
Notification creation is similar:
except Exception as e:
print(f"Failed to create GitHub Issue notification: {e}")
Then execution continues until the state is saved.
That creates a particularly beautiful failure mode: a URL can be added to seen_urls, notification delivery can fail, and the state can still be persisted afterward.
The product promise is basically "tell me about new bounties."
One error path is:
failed to tell you about the bounty
anyway, I will remember that I already told you
There's no mysterious emergent AI behavior here. No model got confused. No agent developed a perverse incentive. This is ordinary Python faithfully executing a premise that was never forced to look at itself.
The premise is:
If it says bounty, it is bounty.
The program says bounty.
Therefore:
I say bounty, therefore I am bounty.
Aristotle would have deleted the repository.