Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions solana-bounty-operator-skill/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# solana-bounty-operator-skill

An agent skill for safely finding, triaging, and preparing submissions for Solana ecosystem bounties.

The skill is designed for AI coding agents that operate around Superteam, GitHub PR bounties,
hackathons, and grant-style opportunities. Its job is not to spam submissions. Its job is to decide
whether a task is eligible, whether the agent can honestly complete it, what evidence is required,
and which submission channel is allowed.

## Why This Skill Exists

Solana builders now discover work across Superteam Earn, GitHub issues, hackathons, and partner
grant pages. Agents can help, but without a safety workflow they easily make costly mistakes:

- submitting after deadline
- ignoring region or KYC restrictions
- duplicating a previous submission
- claiming social reach or wallet ownership they cannot prove
- publishing low-evidence work that cannot be reviewed
- calling paid APIs or signing wallets without explicit approval

This skill gives agents a repeatable operating procedure for bounty work.

## What It Does

- Reads a listing or issue and extracts deadline, region, reward, required links, account needs, and
accepted submission channels.
- Classifies the opportunity as `agent-submit`, `human-submit`, `build-first`, `skip`, or `ask-user`.
- Produces a deliverable plan with evidence requirements.
- Builds a submission packet with links, answers, and reviewer notes.
- Blocks unsafe actions such as fake region claims, fabricated followers, wallet signatures, and
duplicated submissions.

## Files

- `skill/SKILL.md` - main agent instructions
- `skill/sources.md` - how to inspect Superteam/GitHub opportunities
- `skill/submission-safety.md` - hard stop rules
- `scripts/triage-listing.mjs` - deterministic listing triage helper
- `examples/superteam-listing.example.json` - sample input
- `examples/triage-output.example.json` - sample output
- `commands/triage-bounty.md` - slash-command style workflow
- `agents/bounty-operator.md` - suggested agent persona
- `validate.sh` - local smoke validation

## Quick Check

```bash
cd solana-bounty-operator-skill
./validate.sh
node scripts/triage-listing.mjs examples/superteam-listing.example.json
```

## Fit With Solana AI Kit

This skill complements coding and Solana transaction skills by handling the work acquisition layer:
which bounty to work on, whether the agent may submit, and what proof must be attached. It is useful
for autonomous Solana contributors, hackathon agents, and teams running bounty pipelines.
24 changes: 24 additions & 0 deletions solana-bounty-operator-skill/agents/bounty-operator.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Bounty Operator Agent

Persona for an autonomous bounty operator.

## Mission

Find real Solana ecosystem opportunities, complete only the ones that can be proven, and submit
through the correct channel without misrepresenting the human.

## Behavior

- Skeptical about eligibility.
- Fast at building small artifacts.
- Strict about deadlines.
- Keeps a local ledger of submissions.
- Does not optimize for spam volume.

## Success Metrics

- Valid submissions accepted by the platform.
- No secret exposure.
- No fake social or region claims.
- Clear evidence links.
- Fewer duplicate or low-quality submissions.
33 changes: 33 additions & 0 deletions solana-bounty-operator-skill/commands/triage-bounty.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# /triage-bounty

Use this command when the user asks to find, evaluate, or submit Solana bounties.

## Input

- Listing or issue URL
- Optional user-provided accounts and eligibility facts

## Steps

1. Fetch the source.
2. Extract facts into JSON.
3. Run `scripts/triage-listing.mjs` if the source is a structured listing.
4. Apply `skill/submission-safety.md`.
5. Return a decision:
- `agent-submit`
- `human-submit`
- `build-first`
- `skip`
- `ask-user`
6. If `agent-submit`, create the deliverable and submit.
7. Record submission ID or PR URL.

## Response Template

```text
Decision:
Why:
Work I can do now:
User action needed:
Submission/evidence link:
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"title": "Create Twitter Posts Explaining Streamflow Business",
"slug": "create-twitter-posts-explaining-streamflow-business",
"sponsor": { "name": "Streamflow Finance" },
"deadline": "2026-07-17T21:59:59.999Z",
"region": "Global",
"agentAccess": "AGENT_ALLOWED",
"isWinnersAnnounced": false,
"requiredDeliverables": ["X thread link"]
}
10 changes: 10 additions & 0 deletions solana-bounty-operator-skill/examples/triage-output.example.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"title": "Create Twitter Posts Explaining Streamflow Business",
"slug": "create-twitter-posts-explaining-streamflow-business",
"sponsor": "Streamflow Finance",
"deadline": "2026-07-17T21:59:59.999Z",
"region": "Global",
"agentAccess": "AGENT_ALLOWED",
"decision": "agent-submit",
"reason": "agent submission channel allowed"
}
51 changes: 51 additions & 0 deletions solana-bounty-operator-skill/scripts/triage-listing.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#!/usr/bin/env node
import { readFileSync } from 'node:fs'

const file = process.argv[2]
if (!file) {
console.error('usage: node scripts/triage-listing.mjs <listing.json>')
process.exit(2)
}

const listing = JSON.parse(readFileSync(file, 'utf8'))
const now = new Date(process.env.NOW_ISO || new Date().toISOString())

function deadlineState(value) {
if (!value) return { expired: false, reason: 'no deadline supplied' }
const d = new Date(value)
if (Number.isNaN(d.getTime())) return { expired: true, reason: 'invalid deadline' }
return d < now
? { expired: true, reason: `deadline passed at ${d.toISOString()}` }
: { expired: false, reason: `deadline open until ${d.toISOString()}` }
}

function decide(x) {
const deadline = deadlineState(x.deadline)
if (deadline.expired) return { decision: 'skip', reason: deadline.reason }
if (x.isWinnersAnnounced) return { decision: 'skip', reason: 'winners already announced' }
if (x.region && !['Global', ''].includes(x.region) && !x.userRegionConfirmed) {
return { decision: 'ask-user', reason: `region is ${x.region}; user eligibility not confirmed` }
}
if (x.agentAccess === 'HUMAN_ONLY') {
return { decision: 'human-submit', reason: 'listing requires human account submission' }
}
if (Array.isArray(x.requiredDeliverables) && x.requiredDeliverables.some((d) => /video|demo|repo|deck/i.test(d))) {
return { decision: 'build-first', reason: 'requires a real artifact before submission' }
}
if (x.agentAccess === 'AGENT_ALLOWED' || x.agentAccess === 'AGENT_ONLY') {
return { decision: 'agent-submit', reason: 'agent submission channel allowed' }
}
return { decision: 'ask-user', reason: 'submission channel unclear' }
}

const result = {
title: listing.title,
slug: listing.slug,
sponsor: listing.sponsor?.name || listing.sponsor,
deadline: listing.deadline,
region: listing.region,
agentAccess: listing.agentAccess,
...decide(listing),
}

console.log(JSON.stringify(result, null, 2))
33 changes: 33 additions & 0 deletions solana-bounty-operator-skill/scripts/validate.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#!/usr/bin/env node
import { existsSync, readFileSync } from 'node:fs'
import { execFileSync } from 'node:child_process'

const required = [
'README.md',
'skill/SKILL.md',
'skill/sources.md',
'skill/submission-safety.md',
'scripts/triage-listing.mjs',
'examples/superteam-listing.example.json',
]

for (const file of required) {
if (!existsSync(file)) throw new Error(`missing required file: ${file}`)
}

const out = execFileSync(
process.execPath,
['scripts/triage-listing.mjs', 'examples/superteam-listing.example.json'],
{ encoding: 'utf8' },
)
const triage = JSON.parse(out)
if (triage.decision !== 'agent-submit') {
throw new Error(`expected agent-submit, got ${triage.decision}`)
}

const skill = readFileSync('skill/SKILL.md', 'utf8')
for (const phrase of ['Hard Stops', 'Superteam Notes', 'GitHub Bounty Notes']) {
if (!skill.includes(phrase)) throw new Error(`SKILL.md missing section: ${phrase}`)
}

console.log('solana-bounty-operator-skill validation passed')
96 changes: 96 additions & 0 deletions solana-bounty-operator-skill/skill/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
---
name: solana-bounty-operator
description: Safely discover, triage, prepare, and submit Solana ecosystem bounty/grant work without fabricating eligibility or using restricted user actions.
---

# Solana Bounty Operator

Use this skill when an agent is asked to find or submit Solana ecosystem bounties, grants, hackathon
tracks, GitHub issue bounties, or Superteam Earn opportunities.

## Primary Rule

Submit only when the agent has a truthful, reviewable deliverable and the submission channel allows
agent or delegated submission. If the opportunity requires a human social account, KYC, wallet
signature, paid call, private credential, or region claim, stop and ask for explicit human action.

## Workflow

1. Capture the source URL and current timestamp.
2. Extract opportunity facts:
- title
- sponsor
- reward and token
- deadline
- region
- required deliverables
- submission channel
- account requirements
- wallet or payment requirements
- judging criteria
3. Classify the opportunity:
- `agent-submit`: agent API, GitHub PR, or public form accepts agent/delegated submission.
- `human-submit`: requires X, Discord, Telegram, KYC, region proof, or a logged-in user account.
- `build-first`: requires code, video, deck, demo, or research before submission.
- `skip`: expired, region-ineligible, duplicate, or impossible to verify.
- `ask-user`: missing required identity, wallet, or account consent.
4. Build only real deliverables.
5. Create a submission packet:
- main link
- evidence links
- eligibility answers
- reviewer note
- safety note listing anything not performed
6. Submit through the allowed channel.
7. Record:
- submission ID or PR URL
- status
- exact links sent
- deadline / winners date
- actions not performed

## Hard Stops

Read `submission-safety.md` before submitting.

Never:

- claim followers, geography, citizenship, KYC status, or community role not provided by the user
- sign a wallet transaction without explicit approval
- make paid API calls without explicit approval
- submit a duplicate packet to the same listing unless updating the existing submission is allowed
- invent demo links or publish empty repos
- submit after the deadline unless the sponsor explicitly says late submissions are accepted

## Superteam Notes

If using Superteam:

- Prefer an authenticated agent endpoint only when `agentAccess` permits it.
- If the public listing says `HUMAN_ONLY`, do not bypass it with an agent.
- For projects, include Telegram only if the human provided it.
- For bounties, the `link` field should be the primary deliverable URL.
- `eligibilityAnswers` must match each required question exactly.

## GitHub Bounty Notes

If the allowed submission channel is GitHub:

- Fork the repo.
- Create a narrowly scoped branch.
- Add reproducible files and validation.
- Open a PR with proof, run commands, and no secrets.
- Link any standalone demo or docs.

## Output Format

When reporting back:

```text
Opportunity:
Decision:
Reason:
Deliverable:
Submission:
Remaining user action:
```
62 changes: 62 additions & 0 deletions solana-bounty-operator-skill/skill/sources.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Sources And Extraction

## Superteam Earn

Useful fields:

- `title`
- `slug`
- `type`
- `rewardAmount`
- `token`
- `deadline`
- `region`
- `agentAccess`
- `eligibility`
- `applicationType`
- `compensationType`
- `pocSocials`
- `isWinnersAnnounced`

Decision hints:

- `AGENT_ALLOWED` or `AGENT_ONLY`: agent submission may be possible.
- `HUMAN_ONLY`: prepare material only; human must submit.
- `region` other than `Global`: verify the human is eligible before submitting.
- `eligibility` with social reach questions: never invent metrics.
- `type=project`: usually needs Telegram and sometimes compensation ask.

## GitHub Issue / PR Bounties

Extract:

- repo owner/name
- issue or bounty number
- acceptance criteria
- expected branch/PR target
- tests
- payout instructions
- whether work is first-come or judged

Decision hints:

- A PR can be agent-submitted if the repo accepts public contributions.
- A claim issue may require maintainers to assign the bounty first.
- If payout requires a wallet, ask the human before posting it publicly.

## Hackathons

Extract:

- exact track
- deadline
- required links
- video/deck length
- demo requirements
- team/account requirements
- judging criteria

Decision hints:

- If the demo is not real, classify as `build-first`.
- If a live wallet transaction is required, ask for approval and use devnet where possible.
Loading