dev.idiolect.bounty

A declaration that a translation, verification, or adapter is wanted, with terms. The substrate does not intermediate fulfillment: payment, review, and acceptance happen on external rails referenced in the record. The record is the request primitive.

Source: lexicons/dev/idiolect/bounty.json · Rust: idiolect_records::Bounty · TS: @idiolect-dev/schema/bounty · Fixture: idiolect_records::examples::bounty

Shape

FieldTypeRequiredNotes
requesterdidyesWho is requesting.
wantsunionyesExactly one of wantLens / wantVerification / wantAdapter.
constraintsarray (≤64)noStructured constraints the deliverable must satisfy.
rewardobjectno{ summary?, externalRef? }. The substrate does not transact.
eligibilityarray (≤128)noPostfix eligibility tree.
fulfillmentat-urinoOnce fulfilled, points to the deliverable record.
statusopen enumnoopen / claimed / fulfilled / withdrawn.
statusVocabvocabRefnoVocab the status slug resolves against.
basisbasisnoStructured grounding.
occurredAtdatetimeyesPublication timestamp.

The three want shapes

wantLens

Asks for a lens between two schemas.

SubfieldTypeRequiredNotes
sourceschemaRefyesSource schema.
targetschemaRefyesTarget schema.
bidirectionalbooleannoWhether the requested lens must be invertible.

wantVerification

Asks for a verification of a lens.

SubfieldTypeRequiredNotes
lenslensRefyesThe lens to verify.
kindopen enumyesVerification kind: roundtrip-test / property-test / formal-proof / conformance-test / static-check / convergence-preserving. (Note: the lexicon's known-values list here omits coercion-law; that kind is reachable through the open-enum extension via kindVocab.)
kindVocabvocabRefnoVocab the kind slug resolves against.

wantAdapter

Asks for an adapter for a framework.

SubfieldTypeRequiredNotes
frameworkstring (≤128)yesFramework name.
versionRangestringnoSemver range.

The constraint variants

Each entry in constraints is one of:

VariantCaptures
constraintPerformanceA quantitative bound: metric, threshold, comparison direction (lt, le, eq, ge, gt), optional sample size. Examples: p99-latency-ms ≤ 50, error-rate < 0.001.
constraintConformanceA verification kind (and optional specific property) the deliverable must pass.
constraintLicenseAn SPDX expression plus optional allow / deny lists.
constraintDeadlineA datetime deadline plus optional grace seconds.
constraintDependencyA pointer to another bounty this one waits on. Claims are ineligible until the dependency's status is fulfilled.

A consumer matching a candidate deliverable against a bounty walks the constraint list and verifies each one. Failing constraints are surfaced individually so the claimer can tell what is missing.

The eligibility tree

eligibility is a postfix-operator tree (same shape as recommendation conditions). Atomic predicates plus combinators:

VariantArityMeaning
eligibilityMemberatomicClaimer is a member of the named community.
eligibilityVerificationForatomicClaimer has published a verification for the named lens property.
eligibilityDidatomicClaimer's DID matches exactly.
eligibilityAndcombinatorConjoin top two on stack.
eligibilityOrcombinatorDisjoin top two on stack.
eligibilityNotcombinatorNegate top on stack.

A bounty restricted to a specific community uses [eligibilityMember(community=...)]. A bounty open to either of two communities uses [eligibilityMember(A), eligibilityMember(B), eligibilityOr]. Empty array means no eligibility restriction.

Field details

reward

reward is intentionally underspecified. summary is narrative prose; externalRef is a URL pointing at the rail that handles the actual reward (a grant portal, a payment platform, an attestation service). The substrate does not validate that the external rail exists, that it is solvent, or that the reward will be paid; that is the consumer's diligence.

The pattern: a bounty with externalRef pointing at a known grant portal is more credible than a bounty with only a narrative summary. Consumers route their effort accordingly.

fulfillment

Once a deliverable exists, the bounty publisher edits the bounty record (a put, not a new record) to set fulfillment to the deliverable's at-uri and status to fulfilled. Consumers querying open bounties filter on status: open; consumers auditing the fulfilled set filter on status: fulfilled and follow fulfillment.

basis

For first-party bounties (the repo owner is the requester), omit. For third-party attribution (a labeler records that someone else is requesting), set basis and requester accordingly. The common case is basisCommunityPolicy (a community has a standing policy of requesting verifications of every published lens) or basisDerivedFromRecord (a researcher infers a request from a prior recommendation that named required verifications).

Example

{
  "$type": "dev.idiolect.bounty",
  "requester": "did:plc:requester",
  "wants": {
    "$type": "dev.idiolect.bounty#wantVerification",
    "lens": { "uri": "at://did:plc:lens-author/dev.panproto.schema.lens/3l5" },
    "kind": "roundtrip-test"
  },
  "constraints": [
    { "$type": "dev.idiolect.bounty#constraintConformance",
      "kind": "roundtrip-test",
      "property": {
        "$type": "dev.idiolect.defs#lpRoundtrip",
        "domain": "all valid v1 records with bodies ≤ 1024 bytes"
      }
    },
    { "$type": "dev.idiolect.bounty#constraintDeadline",
      "deadline": "2026-06-19T00:00:00.000Z"
    }
  ],
  "reward": {
    "summary": "USD 500 paid via XYZ grants portal on acceptance.",
    "externalRef": "https://grants.example/bounties/3l5"
  },
  "eligibility": [
    { "$type": "dev.idiolect.bounty#eligibilityMember",
      "community": "at://did:plc:community/dev.idiolect.community/canonical" }
  ],
  "status": "open",
  "occurredAt": "2026-04-19T00:00:00.000Z"
}

How bounties drive verification work

flowchart LR
    R[requester] -->|publishes| B[bounty]
    B -->|wants verification| L[lens]
    B -->|eligibility| E[claimer]
    E -->|publishes| V[verification]
    R -->|edits bounty| F[status: fulfilled]
    F -.points at.-> V

A community publishing recommendations with requiredVerifications that nobody has published is asking for verification work. A bounty is the canonical way to request that work. A claimer that matches the eligibility predicate publishes the verification, the requester points the bounty at it, and the external rail handles the payment.

Concept references