{"id":"milestone-verifier","title":"Grant Milestone Verifier with Signed Release Attestation","description":"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.","roi":"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.","audience":"crypto","channels":["x402","mcp","rapidapi"],"endpoint":{"method":"POST","url":"https://agents.writerslogic.com/api/v1/verify-milestone","path":"/api/v1/verify-milestone","contentType":"application/json"},"price":{"amount":"2.00","currency":"USDC","network":"base","perCall":true,"failedCallsCharged":false},"inputSchema":{"type":"object","additionalProperties":false,"required":["milestone","evidence"],"properties":{"milestone":{"type":"object","additionalProperties":false,"required":["title","acceptanceCriteria","dueDate"],"properties":{"title":{"type":"string","minLength":1,"maxLength":300},"acceptanceCriteria":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"string","minLength":1,"maxLength":1000}},"dueDate":{"type":"string","minLength":10,"maxLength":40,"description":"ISO 8601 date or timestamp. A date means end of that day UTC. GitHub, registry, Snapshot and contract checks are evaluated as of this instant."},"windowStart":{"type":"string","minLength":10,"maxLength":40,"description":"Optional ISO 8601 start of the milestone period. Needed to decide \"commits/releases/packages during the period\" criteria; without it those are left to the judge."}}},"evidence":{"type":"object","additionalProperties":false,"properties":{"repoUrl":{"type":"string","maxLength":200,"description":"https://github.com/<owner>/<repo>. A link copied from GitHub also works: .../tree/<branch>, .../releases/tag/<tag> or .../commit/<sha> sets ref when ref is omitted."},"ref":{"type":"string","maxLength":200,"description":"Branch, tag or commit, or a commit range base...head."},"deployments":{"type":"array","maxItems":8,"items":{"type":"object","additionalProperties":false,"required":["chain","address"],"properties":{"chain":{"type":"string","enum":["ethereum","base","polygon","arbitrum","optimism"]},"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"expectedFunctions":{"type":"array","maxItems":24,"items":{"type":"string","minLength":3,"maxLength":300},"description":"Function signatures, e.g. transfer(address,uint256)."}}}},"urls":{"type":"array","maxItems":8,"items":{"type":"string","minLength":8,"maxLength":500}}}},"payout":{"type":"object","additionalProperties":false,"required":["protocol","chain","amountTotal"],"properties":{"protocol":{"type":"string","enum":["sablier","superfluid","transfer"]},"chain":{"type":"string","enum":["ethereum","base","polygon","arbitrum","optimism"]},"streamId":{"type":"string","pattern":"^[0-9]{1,78}$"},"lockup":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"SablierLockup address; required to disambiguate when several versions hold the stream id."},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"amountTotal":{"type":"string","pattern":"^[0-9]{1,78}$","description":"Tranche value in token base units."}}},"releasePolicy":{"type":"object","additionalProperties":false,"required":["mode"],"properties":{"mode":{"type":"string","enum":["all_or_nothing","proportional"],"description":"Default all_or_nothing."}}}}},"resultSchema":{"type":"object","properties":{"headline":{"type":"object","description":"Decision first: the verdict, the dollars at stake, confidence and the exact next step.","properties":{"decision":{"type":"string","enum":["MILESTONE_MET","MILESTONE_PARTIALLY_MET","MILESTONE_NOT_MET","INCONCLUSIVE","PAYOUT_BLOCKED"]},"summary":{"type":"string"},"amountAtStakeUsd":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Dollars saved or recoverable if the recommended action succeeds; null when it cannot be computed from the input."},"amountBasis":{"type":"string"},"confidence":{"type":"string","enum":["high","medium","low"]},"nextStep":{"type":"string"}}},"status":{"type":"string","enum":["complete","partial"],"description":"partial when an evidence source (for example GitHub, when rate limited) could not be read; its criteria are then UNVERIFIABLE."},"missing":{"type":"array","items":{"type":"string"}},"disclaimer":{"type":"string"},"githubRequests":{"type":"object","description":"GitHub REST calls spent by this run, whether they were authenticated, the hourly limit that applies, and whether the run hit it."},"verdict":{"type":"string","enum":["PASS","PARTIAL","FAIL","INSUFFICIENT_EVIDENCE","PAYOUT_BLOCKED"]},"releaseBps":{"type":"integer","description":"Share of the tranche to release, 0-10000."},"releaseAmount":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"floor(amountTotal * releaseBps / 10000) in base units, capped at the stream's remaining balance; null without a payout."},"confidence":{"type":"string","enum":["low","medium","high"]},"criteria":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer"},"criterion":{"type":"string"},"verdict":{"type":"string","enum":["PASS","FAIL","UNVERIFIABLE"]},"claims":{"type":"array","items":{"type":"object"}},"whatWouldChange":{"type":"array","items":{"type":"string"}}}}},"payout":{"anyOf":[{"type":"object"},{"type":"null"}]},"evidenceSummary":{"type":"object"},"provenance":{"type":"object","description":"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":{"type":"string","description":"keccak256 of the canonical JSON of {milestone, evidence}."},"attestation":{"type":"object","description":"EIP-712 MilestoneAttestation: signed, signature, signer, digest, typedData and typedDataV4. Unsigned (signed:false) when the agent has no attestation key."},"warnings":{"type":"array","items":{"type":"string"}}}},"outputSchema":{"type":"object","properties":{"data":{"type":"object","properties":{"headline":{"type":"object","description":"Decision first: the verdict, the dollars at stake, confidence and the exact next step.","properties":{"decision":{"type":"string","enum":["MILESTONE_MET","MILESTONE_PARTIALLY_MET","MILESTONE_NOT_MET","INCONCLUSIVE","PAYOUT_BLOCKED"]},"summary":{"type":"string"},"amountAtStakeUsd":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Dollars saved or recoverable if the recommended action succeeds; null when it cannot be computed from the input."},"amountBasis":{"type":"string"},"confidence":{"type":"string","enum":["high","medium","low"]},"nextStep":{"type":"string"}}},"status":{"type":"string","enum":["complete","partial"],"description":"partial when an evidence source (for example GitHub, when rate limited) could not be read; its criteria are then UNVERIFIABLE."},"missing":{"type":"array","items":{"type":"string"}},"disclaimer":{"type":"string"},"githubRequests":{"type":"object","description":"GitHub REST calls spent by this run, whether they were authenticated, the hourly limit that applies, and whether the run hit it."},"verdict":{"type":"string","enum":["PASS","PARTIAL","FAIL","INSUFFICIENT_EVIDENCE","PAYOUT_BLOCKED"]},"releaseBps":{"type":"integer","description":"Share of the tranche to release, 0-10000."},"releaseAmount":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"floor(amountTotal * releaseBps / 10000) in base units, capped at the stream's remaining balance; null without a payout."},"confidence":{"type":"string","enum":["low","medium","high"]},"criteria":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer"},"criterion":{"type":"string"},"verdict":{"type":"string","enum":["PASS","FAIL","UNVERIFIABLE"]},"claims":{"type":"array","items":{"type":"object"}},"whatWouldChange":{"type":"array","items":{"type":"string"}}}}},"payout":{"anyOf":[{"type":"object"},{"type":"null"}]},"evidenceSummary":{"type":"object"},"provenance":{"type":"object","description":"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":{"type":"string","description":"keccak256 of the canonical JSON of {milestone, evidence}."},"attestation":{"type":"object","description":"EIP-712 MilestoneAttestation: signed, signature, signer, digest, typedData and typedDataV4. Unsigned (signed:false) when the agent has no attestation key."},"warnings":{"type":"array","items":{"type":"string"}}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]},"example":{"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"}},"openapiOperation":{"operationId":"milestone_verifier","summary":"Grant Milestone Verifier with Signed Release Attestation","description":"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.\n\nPrice: 2.00 USDC on Base (x402).","x-x402-price-usdc":"2.00","x-x402-amount":"2000000","x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"2.00"}},"x-audience":"crypto","x-sample-url":"https://agents.writerslogic.com/api/v1/samples/milestone-verifier","security":[{"x402":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["milestone","evidence"],"properties":{"milestone":{"type":"object","additionalProperties":false,"required":["title","acceptanceCriteria","dueDate"],"properties":{"title":{"type":"string","minLength":1,"maxLength":300},"acceptanceCriteria":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"string","minLength":1,"maxLength":1000}},"dueDate":{"type":"string","minLength":10,"maxLength":40,"description":"ISO 8601 date or timestamp. A date means end of that day UTC. GitHub, registry, Snapshot and contract checks are evaluated as of this instant."},"windowStart":{"type":"string","minLength":10,"maxLength":40,"description":"Optional ISO 8601 start of the milestone period. Needed to decide \"commits/releases/packages during the period\" criteria; without it those are left to the judge."}}},"evidence":{"type":"object","additionalProperties":false,"properties":{"repoUrl":{"type":"string","maxLength":200,"description":"https://github.com/<owner>/<repo>. A link copied from GitHub also works: .../tree/<branch>, .../releases/tag/<tag> or .../commit/<sha> sets ref when ref is omitted."},"ref":{"type":"string","maxLength":200,"description":"Branch, tag or commit, or a commit range base...head."},"deployments":{"type":"array","maxItems":8,"items":{"type":"object","additionalProperties":false,"required":["chain","address"],"properties":{"chain":{"type":"string","enum":["ethereum","base","polygon","arbitrum","optimism"]},"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"expectedFunctions":{"type":"array","maxItems":24,"items":{"type":"string","minLength":3,"maxLength":300},"description":"Function signatures, e.g. transfer(address,uint256)."}}}},"urls":{"type":"array","maxItems":8,"items":{"type":"string","minLength":8,"maxLength":500}}}},"payout":{"type":"object","additionalProperties":false,"required":["protocol","chain","amountTotal"],"properties":{"protocol":{"type":"string","enum":["sablier","superfluid","transfer"]},"chain":{"type":"string","enum":["ethereum","base","polygon","arbitrum","optimism"]},"streamId":{"type":"string","pattern":"^[0-9]{1,78}$"},"lockup":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"SablierLockup address; required to disambiguate when several versions hold the stream id."},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"amountTotal":{"type":"string","pattern":"^[0-9]{1,78}$","description":"Tranche value in token base units."}}},"releasePolicy":{"type":"object","additionalProperties":false,"required":["mode"],"properties":{"mode":{"type":"string","enum":["all_or_nothing","proportional"],"description":"Default all_or_nothing."}}}}},"example":{"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"}}}}},"responses":{"200":{"description":"Paid result with provenance","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"headline":{"type":"object","description":"Decision first: the verdict, the dollars at stake, confidence and the exact next step.","properties":{"decision":{"type":"string","enum":["MILESTONE_MET","MILESTONE_PARTIALLY_MET","MILESTONE_NOT_MET","INCONCLUSIVE","PAYOUT_BLOCKED"]},"summary":{"type":"string"},"amountAtStakeUsd":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Dollars saved or recoverable if the recommended action succeeds; null when it cannot be computed from the input."},"amountBasis":{"type":"string"},"confidence":{"type":"string","enum":["high","medium","low"]},"nextStep":{"type":"string"}}},"status":{"type":"string","enum":["complete","partial"],"description":"partial when an evidence source (for example GitHub, when rate limited) could not be read; its criteria are then UNVERIFIABLE."},"missing":{"type":"array","items":{"type":"string"}},"disclaimer":{"type":"string"},"githubRequests":{"type":"object","description":"GitHub REST calls spent by this run, whether they were authenticated, the hourly limit that applies, and whether the run hit it."},"verdict":{"type":"string","enum":["PASS","PARTIAL","FAIL","INSUFFICIENT_EVIDENCE","PAYOUT_BLOCKED"]},"releaseBps":{"type":"integer","description":"Share of the tranche to release, 0-10000."},"releaseAmount":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"floor(amountTotal * releaseBps / 10000) in base units, capped at the stream's remaining balance; null without a payout."},"confidence":{"type":"string","enum":["low","medium","high"]},"criteria":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer"},"criterion":{"type":"string"},"verdict":{"type":"string","enum":["PASS","FAIL","UNVERIFIABLE"]},"claims":{"type":"array","items":{"type":"object"}},"whatWouldChange":{"type":"array","items":{"type":"string"}}}}},"payout":{"anyOf":[{"type":"object"},{"type":"null"}]},"evidenceSummary":{"type":"object"},"provenance":{"type":"object","description":"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":{"type":"string","description":"keccak256 of the canonical JSON of {milestone, evidence}."},"attestation":{"type":"object","description":"EIP-712 MilestoneAttestation: signed, signature, signer, digest, typedData and typedDataV4. Unsigned (signed:false) when the agent has no attestation key."},"warnings":{"type":"array","items":{"type":"string"}}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]}}}},"400":{"description":"Invalid request (no payment consumed)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Invalid X-API-KEY","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"402":{"description":"Payment required or invalid","content":{"application/json":{"schema":{"type":"object","description":"x402 v2 PaymentRequired (also base64 in the PAYMENT-REQUIRED header)","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"code":{"type":"string"},"resource":{"type":"object"},"accepts":{"type":"array","items":{"type":"object"}},"extensions":{"type":"object"}}}}}},"502":{"description":"Upstream failure; the payment is released or not settled","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}},"links":{"docs":"https://agents.writerslogic.com/docs/milestone-verifier/","docsJson":"https://agents.writerslogic.com/docs/milestone-verifier.json","sample":"https://agents.writerslogic.com/api/v1/samples/milestone-verifier","openapi":"https://agents.writerslogic.com/openapi.json","catalog":"https://agents.writerslogic.com/api/v1/catalog","verifyProvenance":"https://agents.writerslogic.com/api/v1/verify-provenance","index":"https://agents.writerslogic.com/docs/index.json"}}