Skip to content
Closed
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
27 changes: 25 additions & 2 deletions .github/ISSUE_TEMPLATE/bounty.yml
Original file line number Diff line number Diff line change
@@ -1,27 +1,29 @@
name: MRWK bounty
description: Propose work that may receive an MRWK bounty.
title: "[bounty] "
title: "MRWK bounty: <amount> MRWK - "
labels: ["mrwk:bounty"]
body:
- type: textarea
id: work
attributes:
label: Work needed
description: Describe the useful accepted work.
description: Describe the focused work, affected surface, and why it is useful.
validations:
required: true
- type: input
id: reward
attributes:
label: Proposed MRWK per award
placeholder: "250"
description: Repeat the per-award amount from the issue title.
validations:
required: true
- type: input
id: max_awards
attributes:
label: Max awards
placeholder: "1"
description: Use 1 for a single accepted submission or a higher number for distinct awards.
validations:
required: true
- type: textarea
Expand All @@ -31,3 +33,24 @@ body:
description: Explain what must be true before mrwk:accepted is applied.
validations:
required: true
- type: textarea
id: evidence
attributes:
label: Evidence or tests
description: Name required commands, screenshots, live public URLs, or reproduction evidence.
placeholder: "Example: run python scripts/docs_smoke.py and relevant focused tests."
- type: textarea
id: out_of_scope
attributes:
label: Out of scope
description: List broad rewrites, duplicate work, style-only changes, private security detail, or unrelated work that will not qualify.
- type: textarea
id: duplicate_stale
attributes:
label: Duplicate and stale work
description: Tell contributors to check open PRs, comments, active attempts, and accepted work before submitting.
- type: textarea
id: public_artifact_hygiene
attributes:
label: Public artifact hygiene
description: Remind contributors not to include secrets, private vulnerability details, price claims, liquidity claims, exchange claims, bridge promises, off-ramp promises, or fabricated payout claims.
15 changes: 11 additions & 4 deletions docs/admin-runbook.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,19 @@

1. Create or choose a GitHub issue.
2. Decide the MRWK amount using the reference tiers.
3. Add acceptance text that explains what counts as useful accepted work.
4. Set `max_awards` to the number of separate payouts allowed. Use `1` for
3. Use the maintainer bounty post template in
[bounty rules](bounty-rules.md#maintainer-bounty-post-template). The issue
title should follow `MRWK bounty: <amount> MRWK - <short scope>` so the
reward is visible in lists, notifications, the API, and MCP tools.
4. Add acceptance text that explains what counts as useful accepted work, which
evidence or tests are required, and what is out of scope.
5. Set `max_awards` to the number of separate payouts allowed. Use `1` for
a single-award bounty.
5. Use `/admin` or `POST /api/v1/bounties` with an admin token.
6. Include duplicate-work, stale-work, and public artifact hygiene rules when
the bounty could attract overlapping agent submissions.
7. Use `/admin` or `POST /api/v1/bounties` with an admin token.
Multi-award bounties reserve `reward_mrwk * max_awards`.
6. Add `mrwk:bounty` to the GitHub issue.
8. Add `mrwk:bounty` to the GitHub issue.

## Accept Work

Expand Down
60 changes: 60 additions & 0 deletions docs/bounty-rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,66 @@ MRWK uses work-based tiers at launch. The project does not publish a fiat peg.
- `mrwk:rejected`: submission was not accepted.
- `mrwk:needs-info`: maintainer needs more detail.

## Maintainer Bounty Post Template

Use stable headings so humans, agents, the public API, and MCP tools can parse a
bounty without guessing. Put the reward in the issue title:

```text
MRWK bounty: <amount> MRWK - <short scope>
```

Copy this body and replace the placeholders:

```text
## MRWK Bounty

Reward: `<amount> MRWK per accepted award`
Max awards: `<number>`

## Work Needed

Describe the focused work, affected page, workflow, docs area, code path, or
review target.

## Acceptance Criteria

- List the exact conditions that must be true before work can be accepted.
- Include required commands, screenshots, links, or reproduction evidence.
- State any bounty-specific constraints such as one award per distinct scope.

## How To Submit

Open a focused PR, review, issue comment, or discussion post with `Bounty
#<issue number>` or `Refs #<issue number>` unless this bounty asks for a
different reference.

## Evidence Or Tests

Name the checks expected for this bounty, such as `python scripts/docs_smoke.py`,
focused tests for touched code, live public URLs checked, or screenshots for UI
changes.

## Out Of Scope

List work that does not qualify, including broad rewrites, typo-only edits,
style-only changes, unrelated refactors, private security details, or claims
outside the stated scope.

## Duplicate And Stale Work

Submissions must check current open PRs, issue comments, active attempts, and
accepted work. Duplicate, superseded, or stale work does not qualify unless the
bounty text explicitly allows a distinct follow-up.

## Public Artifact Hygiene

Do not include private keys, seed material, credentials, private vulnerability
details, deployment secrets, price claims, investment claims, liquidity claims,
exchange claims, bridge promises, off-ramp promises, or fabricated payout
claims.
```

## How Claims Are Reviewed

Maintainers approve useful accepted work that matches the bounty text and has
Expand Down
21 changes: 21 additions & 0 deletions scripts/docs_smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,16 @@
"Smoke-check or bug-report claim:",
"Discussion or decision-support claim:",
"Do not describe work as accepted, merged, or paid until the public GitHub label",
"## Maintainer Bounty Post Template",
"MRWK bounty: <amount> MRWK - <short scope>",
"## Evidence Or Tests",
"## Duplicate And Stale Work",
"## Public Artifact Hygiene",
],
}
LINK_RE = re.compile(r"\[[^\]]+\]\(([^)]+)\)")
DOCS_ISSUE_TEMPLATE = ".github/ISSUE_TEMPLATE/docs.yml"
BOUNTY_ISSUE_TEMPLATE = ".github/ISSUE_TEMPLATE/bounty.yml"
PR_TEMPLATE = ".github/pull_request_template.md"


Expand Down Expand Up @@ -105,6 +111,21 @@ def main() -> int:
if "link the page, docs file, heading, command, or ui path" not in template:
print("docs issue template location prompt must request actionable evidence")
ok = False
bounty_issue_template = ROOT / BOUNTY_ISSUE_TEMPLATE
if not bounty_issue_template.exists():
print(f"missing bounty issue template: {BOUNTY_ISSUE_TEMPLATE}")
ok = False
else:
bounty_template = bounty_issue_template.read_text(encoding="utf-8").lower()
for phrase in [
"mrwk bounty: <amount> mrwk -",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win

Strengthen heading validation to require the full stable title pattern.

The check currently accepts mrwk bounty: <amount> mrwk - alone, so CI won’t catch regressions that drop <short scope>. Require the full phrase to enforce the documented contract.

Proposed diff
-            "mrwk bounty: <amount> mrwk -",
+            "mrwk bounty: <amount> mrwk - <short scope>",
Based on learnings: “Bounty issues must use stable headings in the format: `MRWK bounty: MRWK - ` in the title.”
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"mrwk bounty: <amount> mrwk -",
"mrwk bounty: <amount> mrwk - <short scope>",

"evidence or tests",
"duplicate and stale work",
"public artifact hygiene",
]:
if phrase not in bounty_template:
print(f"bounty issue template missing required guidance: {phrase}")
ok = False
pr_template = ROOT / PR_TEMPLATE
if not pr_template.exists():
print(f"missing pull request template: {PR_TEMPLATE}")
Expand Down
Loading