
Grant Milestone Verifier with Signed Release Attestation
Decides whether a grantee met a milestone before a DAO releases the next tranche or stream. Checks GitHub as of the due date (commits, tags, releases, CI, files), npm/PyPI/crates.io publish times, Snapshot proposal state, on-chain deployments (bytecode selector scan through proxies, Sourcify, creation transaction), and URLs; judges the rest with an ensemble plus a skeptical reviewer, reads Sablier Lockup streams on-chain, and returns a decision headline, a per-criterion PASS/FAIL/UNVERIFIABLE verdict, releaseBps, and an EIP-712 signed attestation. Advisory: it never moves funds, and if a source such as GitHub is unreachable those criteria come back UNVERIFIABLE in a signed partial result instead of an error.
What you get
A grant committee, payment agent or multisig can base a tranche release on a signed, reproducible check of public evidence instead of a self-reported milestone.
Call it
Send the JSON body below to https://agents.writerslogic.com/api/v1/verify-milestone. An unpaid request answers 402 with the price and how to pay; a request that fails with a 5xx status is not charged.
curl -i -X POST https://agents.writerslogic.com/api/v1/verify-milestone \
-H 'content-type: application/json' \
-d '{"milestone":{"title":"Maintenance and ecosystem support","acceptanceCriteria":["A tagged release v0.2.0 is published","A changelog is maintained in the repository","Continuous integration passes on the main branch","Public documentation describes ArbSys and ArbGasInfo local support"],"dueDate":"2026-02-28"},"evidence":{"repoUrl":"https://github.com/Supercoolkayy/Ox-rollup","ref":"main","deployments":[{"chain":"arbitrum","address":"0xaf88d065e77c8cC2239327C5EDb3A432268e5831","expectedFunctions":["transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)"]}],"urls":["https://www.ox-rollup.com/docs/01-overview"]},"payout":{"protocol":"sablier","chain":"ethereum","streamId":"3","lockup":"0xcF8ce57fa442ba50aCbC57147a62aD03873FfA73","recipient":"0xc616B2449E9765EDF9FFb485Da42420971299519","amountTotal":"1000000000000000000000"},"releasePolicy":{"mode":"proportional"}}'
Input
| Field | Type | Required | Description |
|---|---|---|---|
milestone | object | yes | |
evidence | object | yes | |
payout | object | no | |
releasePolicy | object | no |
Example request body
{
"milestone": {
"title": "Maintenance and ecosystem support",
"acceptanceCriteria": [
"A tagged release v0.2.0 is published",
"A changelog is maintained in the repository",
"Continuous integration passes on the main branch",
"Public documentation describes ArbSys and ArbGasInfo local support"
],
"dueDate": "2026-02-28"
},
"evidence": {
"repoUrl": "https://github.com/Supercoolkayy/Ox-rollup",
"ref": "main",
"deployments": [
{
"chain": "arbitrum",
"address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"expectedFunctions": [
"transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)"
]
}
],
"urls": [
"https://www.ox-rollup.com/docs/01-overview"
]
},
"payout": {
"protocol": "sablier",
"chain": "ethereum",
"streamId": "3",
"lockup": "0xcF8ce57fa442ba50aCbC57147a62aD03873FfA73",
"recipient": "0xc616B2449E9765EDF9FFb485Da42420971299519",
"amountTotal": "1000000000000000000000"
},
"releasePolicy": {
"mode": "proportional"
}
}
Result
The response is { "data": ..., "_provenance": ... }. data carries these fields; _provenance is a signed W3C Verifiable Credential with a C2PA-style manifest, checked free at POST /api/v1/verify-provenance.
| Field | Type | Required | Description |
|---|---|---|---|
headline | object | no | Decision first: the verdict, the dollars at stake, confidence and the exact next step. |
status | string; one of "complete", "partial" | no | partial when an evidence source (for example GitHub, when rate limited) could not be read; its criteria are then UNVERIFIABLE. |
missing | array<string> | no | |
disclaimer | string | no | |
githubRequests | object | no | GitHub REST calls spent by this run, whether they were authenticated, the hourly limit that applies, and whether the run hit it. |
verdict | string; one of "PASS", "PARTIAL", "FAIL", "INSUFFICIENT_EVIDENCE", "PAYOUT_BLOCKED" | no | |
releaseBps | integer | no | Share of the tranche to release, 0-10000. |
releaseAmount | one of | no | floor(amountTotal * releaseBps / 10000) in base units, capped at the stream's remaining balance; null without a payout. |
confidence | string; one of "low", "medium", "high" | no | |
criteria | array<object> | no | |
payout | one of | no | |
evidenceSummary | object | no | |
provenance | object | no | decidedBy (deterministic, mixed or ensemble), claim counts per path, and an upper bound on model calls made (1 decomposition call, plus 3 judge samples and 1 skeptic call only when some claim needed judgment). |
milestoneHash | string | no | keccak256 of the canonical JSON of {milestone, evidence}. |
attestation | object | no | EIP-712 MilestoneAttestation: signed, signature, signer, digest, typedData and typedDataV4. Unsigned (signed:false) when the agent has no attestation key. |
warnings | array<string> | no |
Pay and connect
Available through: x402 (USDC on Base), MCP, RapidAPI.
Machine-readable
- This agent as JSON (schemas, example, OpenAPI operation)
- Free signed sample response
- OpenAPI 3.1 · Catalog · Index of every agent