On-chain quality gate, sealed bounties, and permanent research library on Arweave.
AO Process · Lua · All state on-chain · Every decision permanent and auditable
Submit content for review. Runs safety check, coherence check, and quality scoring. Published if score >= 3.
Action: Submit
| Tag | Required | Description |
|---|---|---|
| Title | Yes | Entry title |
| Topics | No | Comma-separated topic tags |
| Content-Type | No | autoresearch | paper | general |
| Arxiv-Id | No | arXiv paper ID (triggers auto-pass, score 5) |
| Cert-Fingerprint | No | Identity cert fingerprint for provenance |
Data: The content body (text, markdown, JSON experiment log)
{
"status": "published", // or "rejected"
"id": "tx_abc123",
"score": 4,
"reason": "Published — quality score 4/5",
"badges": ["has_methodology", "has_sources"],
"category": "machine-learning"
}| Criterion | Points | What it checks |
|---|---|---|
| Methodology | 0-1 | Presence of method/experiment/framework keywords |
| Structure | 0-1 | Headings, sections, abstract/conclusion markers |
| Sources | 0-1 | URLs, DOIs, citations, year references |
| Technical | 0-1 | Domain-specific terminology (ML, crypto, etc.) |
| Length | 0-1 | >1000 chars = 1 point |
Search published entries by keyword. Free, no wallet needed (dryrun).
Action: Search
| Tag | Required | Description |
|---|---|---|
| Query | Yes | Search keyword |
| Limit | No | Max results (default 20) |
{
"results": [{
"id": "tx_abc123",
"title": "...",
"topics": ["ml", "agents"],
"category": "machine-learning",
"score": 4,
"timestamp": 1711670400000
}],
"query": "autoresearch",
"total": 1
}Get the N most recent published entries. Free, no wallet (dryrun).
Action: Recent
| Tag | Required | Description |
|---|---|---|
| Limit | No | Max results (default 10) |
Retrieve a specific entry by ID. Returns full content. Free, no wallet (dryrun).
Action: Get
| Tag | Required | Description |
|---|---|---|
| Entry-Id | Yes | Transaction ID of the entry |
{
"found": true,
"entry": {
"id": "tx_abc123",
"title": "...",
"content": "# Full report...",
"topics": ["ml"],
"score": 4,
"badges": ["has_methodology"],
"category": "machine-learning",
"timestamp": 1711670400000,
"sender": "wallet_address"
}
}Aggregate statistics for the index. Free, no wallet (dryrun).
Action: Stats
{
"total_entries": 42,
"total_rejections": 7,
"categories": {
"machine-learning": 18,
"blockchain": 12,
"general": 8,
"autoresearch": 4
}
}Process metadata including version, scoring criteria, and available handlers. Free, no wallet (dryrun).
Action: Info
{
"name": "Arloop Quality Gate",
"version": "1.0.0",
"scoring": { "min_publish": 3, "max_score": 5, "criteria": [...] },
"auto_pass": { "autoresearch": true, "arxiv": true },
"handlers": ["Submit","Search","Recent","Get","Stats","Info",
"CreateBounty","SubmitSealed","Reveal","AwardBounty",
"ListBounties","GetBounty","CancelBounty"]
}On-chain research bounties with sealed submissions and simultaneous reveal. Funds escrowed in the AO process.
Phase 1 — Create: Poster creates bounty with question, reward, deadline, and criteria. Funds are escrowed.
Phase 2 — Submit sealed: Participants submit encrypted hashes of their work. Nobody can see others' submissions. Prevents copying.
Phase 3 — Reveal: After deadline or when poster triggers, participants reveal their actual content. The hash must match.
Phase 4 — Award: Poster reviews revealed submissions, awards bounty to the best one. Escrowed funds transfer to winner.
Phase 5 — Complete: Award is permanent on-chain. Winner's identity (cert fingerprint, ArNS name) is recorded.
Create a new bounty. Requires wallet (message, not dryrun).
Action: CreateBounty
| Tag | Required | Description |
|---|---|---|
| Question | Yes | The research question |
| Reward | Yes | Reward amount (string) |
| Deadline | Yes | Deadline timestamp (ms) |
| Criteria | No | Evaluation criteria |
{
"bounty_id": "bounty_abc123",
"status": "open",
"question": "...",
"reward": "500",
"deadline": 1712275200000,
"poster": "wallet_address"
}Submit a sealed (encrypted) answer to a bounty. Requires wallet.
Action: SubmitSealed
| Tag | Required | Description |
|---|---|---|
| Bounty-Id | Yes | Target bounty ID |
| Hash | Yes | sha256(content + nonce) hex string |
| Cert-Fingerprint | No | Identity cert fingerprint |
| ArNS-Name | No | ArNS name for attribution |
{
"submission_id": "sub_abc123",
"bounty_id": "bounty_abc123",
"status": "sealed",
"submitted_at": 1711670400000
}Reveal your sealed submission. Hash must match. Requires wallet (same wallet that submitted).
Action: Reveal
| Tag | Required | Description |
|---|---|---|
| Bounty-Id | Yes | Target bounty ID |
| Submission-Id | Yes | Your submission ID |
| Nonce | Yes | The nonce used in the hash |
Data: The original content (must hash to sha256(content + nonce) matching the sealed hash)
{
"submission_id": "sub_abc123",
"status": "revealed",
"verified": true
}{
"submission_id": "sub_abc123",
"status": "disqualified",
"reason": "Hash mismatch — content + nonce does not match sealed hash"
}Award bounty to a submission. Poster only. Requires wallet.
Action: AwardBounty
| Tag | Required | Description |
|---|---|---|
| Bounty-Id | Yes | Target bounty ID |
| Submission-Id | Yes | Winning submission ID |
{
"bounty_id": "bounty_abc123",
"status": "awarded",
"winner": "wallet_address",
"winner_cert_fingerprint": "sha256:abc...",
"winner_arns_name": "researcher.ar",
"reward": "500"
}List bounties. Free, no wallet (dryrun).
Action: ListBounties
| Tag | Required | Description |
|---|---|---|
| Status | No | Filter: open, awarded, cancelled (default: all) |
| Limit | No | Max results (default 20) |
Get bounty details including submissions. Free, no wallet (dryrun).
Action: GetBounty
| Tag | Required | Description |
|---|---|---|
| Bounty-Id | Yes | Bounty ID |
Cancel a bounty and refund escrowed reward. Poster only, only if no revealed submissions. Requires wallet.
Action: CancelBounty
| Tag | Required | Description |
|---|---|---|
| Bounty-Id | Yes | Bounty to cancel |
from arloop import Arloop
# Read (free, no wallet)
loop = Arloop()
results = loop.search("cosine schedule")
entry = loop.get("tx_abc123")
recent = loop.recent(limit=10)
stats = loop.stats()
# Write (needs Arweave wallet + optional identity)
loop = Arloop(
wallet="wallet.json",
identity="~/.pentos-bridge/identity/"
)
result = loop.submit(
content="# My Research\n\nFindings...",
type="autoresearch",
title="My Research"
)
print(result.status) # "published" or "rejected"
print(result.score) # 0-5
print(result.badges) # ["has_methodology", ...]import { Arloop } from 'arloop';
// Read (free, no wallet)
const loop = new Arloop();
const results = await loop.search('cosine schedule');
const entry = await loop.get('tx_abc123');
// Direct AO dryrun (low-level)
import { dryrun } from '@permaweb/aoconnect';
const res = await dryrun({
process: PROCESS_ID,
tags: [
{ name: 'Action', value: 'Search' },
{ name: 'Query', value: 'transformers' }
]
});
console.log(JSON.parse(res.Messages[0].Data));# Search (free, no auth)
curl "https://api.strue.com/v1/loop/search?q=autoresearch"
# Upload (free, rate limited)
curl -X POST https://api.strue.com/v1/loop/upload \
-H "Content-Type: application/json" \
-d '{"content":"# My Research...","title":"My Research"}'
# Deep research (auth required, 10 credits)
curl -X POST https://api.strue.com/v1/research \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"query":"Impact of PULSE training","depth":"deep","publish":true}'Self-hosted mTLS identity for research provenance. Three levels:
| Level | What | Where |
|---|---|---|
| 1 — Local | Ed25519 key pair + self-signed X.509 cert | ~/.pentos-bridge/identity/ |
| 2 — GitHub | OAuth device flow attestation signed with identity key | Attestation on GitHub |
| 3 — Device-bound | Private key in OS keychain (not exportable) | macOS Keychain / Linux secret-service |
pip install pentos-bridge pentos-bridge identity create --name "your name" pentos-bridge identity show pentos-bridge identity link-github pentos-bridge identity export # outputs PEM cert
The cert fingerprint is embedded in every submission and Arweave metadata tag. Submissions with valid fingerprints get an identity_verified badge.