dev.idiolect.bounty

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

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 (at most 64 entries)noStructured constraints the deliverable must satisfy.
rewardobjectno{ summary?, externalRef? }. idiolect does not transact.
eligibilityarray (at most 128 entries)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 (at most 128 characters)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. For instance, p99-latency-ms le 50 or error-rate lt 0.001.
constraintConformanceA verification kind (and optional specific property) the deliverable must pass.
constraintLicenseAn SPDX license expression plus optional allow and 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). idiolect does not validate that the external rail exists, that it is solvent, or that the reward will be paid. Consumers must verify the external rail and its payment terms themselves.

An externalRef to a known grant portal gives consumers a payment claim they can check; a narrative-only reward does not. Consumers can route their effort on that distinction.

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 listed 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 at most 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"
}
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 how you 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