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
53 changes: 53 additions & 0 deletions scientific-bounty-award-publication-guard/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# Scientific Bounty Award Publication Guard

This module adds a focused award-publication readiness guard for the Scientific Bounty System bounty.

It answers one operational question:

> Can the platform publicly announce a winner, publish the award page, and expose result metadata without violating payout, appeal, IP, NDA, embargo, or team-consent rules?

## Scope

This is intentionally separate from intake, scoring, escrow funding, export-control, duplicate-submission, IP-policy, appeal-ledger, and payout-routing modules. It runs after an award decision exists and before the result is made public.

The guard checks:

- award decision and sponsor approval are present
- payout is authorized or released before public winner publication
- appeal window has closed or has an approved waiver
- IP handoff or open-license terms are satisfied before result publication
- embargo dates have passed
- private/NDA challenge content is redacted before public release
- named team announcements have solver consent
- award splits sum to 100 percent and recipients accepted publication terms
- reproducibility package hashes are present for public claims

## Decisions

- `RELEASE_PUBLICATION`: ready to publish the award and winner metadata.
- `HOLD_FOR_REVIEW`: not ready, but remediable without changing the award.
- `BLOCK_PUBLICATION`: publication would violate a hard trust rule.

## Run

```bash
npm test
npm run demo
```

Demo outputs are written to `artifacts/`:

- `award-publication-results.json`
- `award-publication-report.md`
- `award-publication-summary.svg`
- `award-publication-demo.mp4`

## Boundaries

- synthetic records only
- no payment processor calls
- no private submissions
- no credentials
- no external APIs
- no legal advice

Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# Award Publication Readiness Report

Generated: 2026-06-12T00:00:00Z

## Summary

- Blocking findings: 5
- Review findings: 3
- Passing findings: 20

## Challenge Decisions

### biomarker-single-cell-2026

- Decision: RELEASE_PUBLICATION
- Award: award-ready-001
- Payout state: released
- Public mode: public_challenge_public_award

| Severity | Code | Message | Remediation |
| --- | --- | --- | --- |
| pass | award_decision_ready | Award decision and sponsor approval are present. | No remediation required. |
| pass | payout_ready | Payout state allows public award publication. | No remediation required. |
| pass | appeal_window_closed | Appeal window is closed. | No remediation required. |
| pass | ip_terms_ready | IP or license terms allow publication. | No remediation required. |
| pass | embargo_clear | No active embargo blocks publication. | No remediation required. |
| pass | privacy_release_ready | Publication privacy mode is satisfied. | No remediation required. |
| pass | named_consent_ready | All named recipients consented to public announcement. | No remediation required. |
| pass | award_splits_ready | Award splits and recipient publication terms are complete. | No remediation required. |
| pass | reproducibility_manifest_ready | Reproducibility manifest has public claim evidence. | No remediation required. |

### climate-forecast-region-pack

- Decision: HOLD_FOR_REVIEW
- Award: award-hold-002
- Payout state: authorized
- Public mode: public_challenge_public_award

| Severity | Code | Message | Remediation |
| --- | --- | --- | --- |
| pass | award_decision_ready | Award decision and sponsor approval are present. | No remediation required. |
| pass | payout_ready | Payout state allows public award publication. | No remediation required. |
| pass | appeal_window_closed | Appeal window is closed. | No remediation required. |
| pass | ip_terms_ready | IP or license terms allow publication. | No remediation required. |
| review | embargo_active | Publication embargo remains active until 2026-06-20T00:00:00.000Z. | Hold public publication until the embargo expires. |
| pass | privacy_release_ready | Publication privacy mode is satisfied. | No remediation required. |
| pass | named_consent_ready | All named recipients consented to public announcement. | No remediation required. |
| pass | award_splits_ready | Award splits and recipient publication terms are complete. | No remediation required. |
| pass | reproducibility_manifest_ready | Reproducibility manifest has public claim evidence. | No remediation required. |

### private-quantum-noise-reduction

- Decision: BLOCK_PUBLICATION
- Award: award-block-003
- Payout state: pending
- Public mode: private_challenge_public_award

| Severity | Code | Message | Remediation |
| --- | --- | --- | --- |
| pass | award_decision_ready | Award decision and sponsor approval are present. | No remediation required. |
| block | payout_not_authorized | Public winner publication requires an authorized, released, or paid payout state. | Move payout to authorized, released, or paid before publishing named winners. |
| pass | appeal_waived | Appeal window was explicitly waived. | No remediation required. |
| block | ip_transfer_incomplete | IP transfer publication requires signed handoff and released or paid payout. | Complete signed IP handoff and release or pay the payout before publication. |
| pass | embargo_clear | No active embargo blocks publication. | No remediation required. |
| block | private_content_unredacted | Private or NDA challenge content needs approved public redaction before award publication. | Approve a public redaction packet for private challenge content. |
| review | named_consent_missing | Named publication consent missing for solver-epsilon. | Collect named publication consent or publish anonymized winners. |
| block | award_splits_invalid | Award split percentages must sum to 100; received 90. | Correct award splits so recipient percentages total exactly 100. |
| block | recipient_terms_missing | Publication terms missing for solver-epsilon. | Collect publication terms from each payout recipient. |
| review | reproducibility_manifest_incomplete | Public claims should include artifact hash and result digest. | Attach artifact hash and result digest before publishing technical claims. |

Original file line number Diff line number Diff line change
@@ -0,0 +1,258 @@
[
{
"challengeId": "biomarker-single-cell-2026",
"awardId": "award-ready-001",
"decision": "RELEASE_PUBLICATION",
"checkedAt": "2026-06-12T00:00:00.000Z",
"summary": {
"blocks": 0,
"reviews": 0,
"passes": 9
},
"findings": [
{
"code": "award_decision_ready",
"severity": "pass",
"hardBlock": false,
"message": "Award decision and sponsor approval are present.",
"remediation": "No remediation required."
},
{
"code": "payout_ready",
"severity": "pass",
"hardBlock": false,
"message": "Payout state allows public award publication.",
"remediation": "No remediation required."
},
{
"code": "appeal_window_closed",
"severity": "pass",
"hardBlock": false,
"message": "Appeal window is closed.",
"remediation": "No remediation required."
},
{
"code": "ip_terms_ready",
"severity": "pass",
"hardBlock": false,
"message": "IP or license terms allow publication.",
"remediation": "No remediation required."
},
{
"code": "embargo_clear",
"severity": "pass",
"hardBlock": false,
"message": "No active embargo blocks publication.",
"remediation": "No remediation required."
},
{
"code": "privacy_release_ready",
"severity": "pass",
"hardBlock": false,
"message": "Publication privacy mode is satisfied.",
"remediation": "No remediation required."
},
{
"code": "named_consent_ready",
"severity": "pass",
"hardBlock": false,
"message": "All named recipients consented to public announcement.",
"remediation": "No remediation required."
},
{
"code": "award_splits_ready",
"severity": "pass",
"hardBlock": false,
"message": "Award splits and recipient publication terms are complete.",
"remediation": "No remediation required."
},
{
"code": "reproducibility_manifest_ready",
"severity": "pass",
"hardBlock": false,
"message": "Reproducibility manifest has public claim evidence.",
"remediation": "No remediation required."
}
],
"audit": {
"publicMode": "public_challenge_public_award",
"payoutState": "released",
"ipPolicy": "transfer_on_payout",
"embargoUntil": "2026-06-05T00:00:00Z",
"recipientCount": 2
}
},
{
"challengeId": "climate-forecast-region-pack",
"awardId": "award-hold-002",
"decision": "HOLD_FOR_REVIEW",
"checkedAt": "2026-06-12T00:00:00.000Z",
"summary": {
"blocks": 0,
"reviews": 1,
"passes": 8
},
"findings": [
{
"code": "award_decision_ready",
"severity": "pass",
"hardBlock": false,
"message": "Award decision and sponsor approval are present.",
"remediation": "No remediation required."
},
{
"code": "payout_ready",
"severity": "pass",
"hardBlock": false,
"message": "Payout state allows public award publication.",
"remediation": "No remediation required."
},
{
"code": "appeal_window_closed",
"severity": "pass",
"hardBlock": false,
"message": "Appeal window is closed.",
"remediation": "No remediation required."
},
{
"code": "ip_terms_ready",
"severity": "pass",
"hardBlock": false,
"message": "IP or license terms allow publication.",
"remediation": "No remediation required."
},
{
"code": "embargo_active",
"severity": "review",
"hardBlock": false,
"message": "Publication embargo remains active until 2026-06-20T00:00:00.000Z.",
"remediation": "Hold public publication until the embargo expires."
},
{
"code": "privacy_release_ready",
"severity": "pass",
"hardBlock": false,
"message": "Publication privacy mode is satisfied.",
"remediation": "No remediation required."
},
{
"code": "named_consent_ready",
"severity": "pass",
"hardBlock": false,
"message": "All named recipients consented to public announcement.",
"remediation": "No remediation required."
},
{
"code": "award_splits_ready",
"severity": "pass",
"hardBlock": false,
"message": "Award splits and recipient publication terms are complete.",
"remediation": "No remediation required."
},
{
"code": "reproducibility_manifest_ready",
"severity": "pass",
"hardBlock": false,
"message": "Reproducibility manifest has public claim evidence.",
"remediation": "No remediation required."
}
],
"audit": {
"publicMode": "public_challenge_public_award",
"payoutState": "authorized",
"ipPolicy": "open_license",
"embargoUntil": "2026-06-20T00:00:00Z",
"recipientCount": 1
}
},
{
"challengeId": "private-quantum-noise-reduction",
"awardId": "award-block-003",
"decision": "BLOCK_PUBLICATION",
"checkedAt": "2026-06-12T00:00:00.000Z",
"summary": {
"blocks": 5,
"reviews": 2,
"passes": 3
},
"findings": [
{
"code": "award_decision_ready",
"severity": "pass",
"hardBlock": false,
"message": "Award decision and sponsor approval are present.",
"remediation": "No remediation required."
},
{
"code": "payout_not_authorized",
"severity": "block",
"hardBlock": true,
"message": "Public winner publication requires an authorized, released, or paid payout state.",
"remediation": "Move payout to authorized, released, or paid before publishing named winners."
},
{
"code": "appeal_waived",
"severity": "pass",
"hardBlock": false,
"message": "Appeal window was explicitly waived.",
"remediation": "No remediation required."
},
{
"code": "ip_transfer_incomplete",
"severity": "block",
"hardBlock": true,
"message": "IP transfer publication requires signed handoff and released or paid payout.",
"remediation": "Complete signed IP handoff and release or pay the payout before publication."
},
{
"code": "embargo_clear",
"severity": "pass",
"hardBlock": false,
"message": "No active embargo blocks publication.",
"remediation": "No remediation required."
},
{
"code": "private_content_unredacted",
"severity": "block",
"hardBlock": true,
"message": "Private or NDA challenge content needs approved public redaction before award publication.",
"remediation": "Approve a public redaction packet for private challenge content."
},
{
"code": "named_consent_missing",
"severity": "review",
"hardBlock": false,
"message": "Named publication consent missing for solver-epsilon.",
"remediation": "Collect named publication consent or publish anonymized winners."
},
{
"code": "award_splits_invalid",
"severity": "block",
"hardBlock": true,
"message": "Award split percentages must sum to 100; received 90.",
"remediation": "Correct award splits so recipient percentages total exactly 100."
},
{
"code": "recipient_terms_missing",
"severity": "block",
"hardBlock": true,
"message": "Publication terms missing for solver-epsilon.",
"remediation": "Collect publication terms from each payout recipient."
},
{
"code": "reproducibility_manifest_incomplete",
"severity": "review",
"hardBlock": false,
"message": "Public claims should include artifact hash and result digest.",
"remediation": "Attach artifact hash and result digest before publishing technical claims."
}
],
"audit": {
"publicMode": "private_challenge_public_award",
"payoutState": "pending",
"ipPolicy": "transfer_on_payout",
"embargoUntil": null,
"recipientCount": 2
}
}
]
Loading