diff --git a/solana-bounty-operator-skill/README.md b/solana-bounty-operator-skill/README.md new file mode 100644 index 0000000..90a50cd --- /dev/null +++ b/solana-bounty-operator-skill/README.md @@ -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. diff --git a/solana-bounty-operator-skill/agents/bounty-operator.md b/solana-bounty-operator-skill/agents/bounty-operator.md new file mode 100644 index 0000000..e44537e --- /dev/null +++ b/solana-bounty-operator-skill/agents/bounty-operator.md @@ -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. diff --git a/solana-bounty-operator-skill/commands/triage-bounty.md b/solana-bounty-operator-skill/commands/triage-bounty.md new file mode 100644 index 0000000..6835ce7 --- /dev/null +++ b/solana-bounty-operator-skill/commands/triage-bounty.md @@ -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: +``` diff --git a/solana-bounty-operator-skill/examples/superteam-listing.example.json b/solana-bounty-operator-skill/examples/superteam-listing.example.json new file mode 100644 index 0000000..2d25b97 --- /dev/null +++ b/solana-bounty-operator-skill/examples/superteam-listing.example.json @@ -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"] +} diff --git a/solana-bounty-operator-skill/examples/triage-output.example.json b/solana-bounty-operator-skill/examples/triage-output.example.json new file mode 100644 index 0000000..fe9b1bf --- /dev/null +++ b/solana-bounty-operator-skill/examples/triage-output.example.json @@ -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" +} diff --git a/solana-bounty-operator-skill/scripts/triage-listing.mjs b/solana-bounty-operator-skill/scripts/triage-listing.mjs new file mode 100755 index 0000000..ecef88c --- /dev/null +++ b/solana-bounty-operator-skill/scripts/triage-listing.mjs @@ -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 ') + 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)) diff --git a/solana-bounty-operator-skill/scripts/validate.mjs b/solana-bounty-operator-skill/scripts/validate.mjs new file mode 100755 index 0000000..3d9d009 --- /dev/null +++ b/solana-bounty-operator-skill/scripts/validate.mjs @@ -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') diff --git a/solana-bounty-operator-skill/skill/SKILL.md b/solana-bounty-operator-skill/skill/SKILL.md new file mode 100644 index 0000000..0aae19e --- /dev/null +++ b/solana-bounty-operator-skill/skill/SKILL.md @@ -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: +``` diff --git a/solana-bounty-operator-skill/skill/sources.md b/solana-bounty-operator-skill/skill/sources.md new file mode 100644 index 0000000..edf150d --- /dev/null +++ b/solana-bounty-operator-skill/skill/sources.md @@ -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. diff --git a/solana-bounty-operator-skill/skill/submission-safety.md b/solana-bounty-operator-skill/skill/submission-safety.md new file mode 100644 index 0000000..17ca246 --- /dev/null +++ b/solana-bounty-operator-skill/skill/submission-safety.md @@ -0,0 +1,43 @@ +# Submission Safety + +This skill exists to prevent agents from creating low-quality or risky bounty submissions. + +## Allowed Without Extra Approval + +- Read public listings and issues. +- Create local drafts, repos, decks, videos, and PRs. +- Submit through a public agent API when the listing allows agent submissions. +- Open a GitHub PR to an open-source repo with no secrets. +- Use devnet-only generated wallets for demos. + +## Requires Explicit Human Approval + +- Wallet signatures. +- Mainnet transactions. +- Paid API calls. +- Publishing final submissions with a human account when the listing is `HUMAN_ONLY`. +- Posting from X, Discord, Telegram, Reddit, YouTube, or other social accounts. +- Sharing a real wallet address for payment. +- Claiming citizenship, residency, KYC, follower count, employment, or community role. + +## Must Skip + +- Expired listings. +- Listings already won or archived. +- Region-locked opportunities when the human is not eligible. +- Work requiring private credentials the agent does not have. +- Submissions that would duplicate an existing packet without meaningful updates. +- Tasks where the deliverable would be mostly fake screenshots, empty repos, or unverifiable text. + +## Reviewer Evidence + +Every submission packet should include at least one of: + +- repo URL +- PR URL +- deployed demo URL +- video URL +- article/thread URL +- PDF/deck URL +- test output or command log +- deterministic script output diff --git a/solana-bounty-operator-skill/validate.sh b/solana-bounty-operator-skill/validate.sh new file mode 100755 index 0000000..6ca2a34 --- /dev/null +++ b/solana-bounty-operator-skill/validate.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + +node scripts/validate.mjs