Disclaimer: This content is outdated.
This post describes the initial design of the CredSperiment, as envisioned in August 2019. Since then, the system has changed materially. Please view this document as a piece of history in SourceCred’s evolution, but not an up-to-date view of how SourceCred operates.
The CredSperiment creates a game in which people are rewarded for contributing to SourceCred, based on SourceCred’s own scores. It revolves around quantities (Cred, Grain, and Dollars) and flows between quantities (Donating, Earning, and Boosting).
This document gives an overview of these quantities and relationships. The goal is to define the general shape of the system and its information/incentive flows.
Quantities: Cred & Grain
Cred is a score which represents how much one has contributed to the project. Every contributor to the project has an associated cred score. The cred score can (and will) fluctuate in both directions; a contributor’s cred might increase (because their contributions have been adding a lot of value) or might decrease (because their contributions are going stale, or being re-assessed downwards).
Cred is not transferrable between identities, and never will be.
Grain is a point accumulator that represents how much one has supported the project. One can earn grain based on their cred cred, or by contributing to the project financially. Unlike cred, grain does not dynamically recompute. It’s more like a currency or token, in once one receives grain, its theirs until they spend it. However, unlike a currency or token, grain is not transferrable, and is not exchangeable for money.
We might someday make a token influenced by grain (see grain), but that’s speculative at this point.
Flows: Donating, Earning, and Boosting
Donating: Dollars -> Grain
Anyone can receive grain by donating money to SourceCred. The system is simple: for every dollar contributed to SourceCred via our opencollective instance, the patron will receive one grain. This reflects the fact that grain represents “proof of support”, and financial support is valued!
Note that you cannot convert grain back to dollars. Also, the amount of grain you earn per dollar donated might change in the future. (Also, we might make the dollar-grain ratio different than 1, e.g. 100 grain per dollar, to make the numbers feel larger.)
Earning: Cred -> Dollars OR Grain
A dollar-grain represents the option to receive one dollar (thus getting paid for your contributions) or one grain (thus supporting the project, by choosing to work for free).
Every week, we will decide a dollar-grain payout amount. For the short term, I expect the dollar-grain payout amount to be fixed each week, although later we may make it based on the total amount of cred created that week.
That dollar week payout amount will be split between all contributors based on their cred score. For example, if the dollar-grain payout amount is 1000, and you had 15% of the total cred, you would receive a dollar-grain payout of 150.
If contributors decide to take the dollar payout, it will be paid to them via OpenCollective; otherwise it will be added to their Grain balance. To simplify the project’s cash graingement, dollar-grain will convert to grain by default after a month or so.
Boosting: Grain -> Cred
Supporters can spend grain by using it to ‘boost’ a contribution. Boost as in signal boost–a booster brings more attention and cred to a particular contribution.
When a contribution is boosted, two things happen:
- New cred is minted, which flows to that contribution (and from there to its author, its dependencies and references, and so forth).
- Subsequently, a new connection is made in the graph, connecting the contribution to the person that boosted it
It makes sense that boosting results in new cred minting; the booster is sending an expensive (and therefore trustworthy) signal that the contribution is valuable. It might seem more surprising that the booster gets connected to the cred graph.
Consider that the booster is actually doing a service to the project: they are investing the time and energy to discover which content/contributions are really important, and they are spending their own resource to send that signal. Since they are doing work, they deserve some cred. How much cred? That depends on whether the content they boosted was actually important.
This is why we create an edge between the boosted content and the booster. If the contribution goes on to earn more cred in the future, then the booster may make a lot of cred. Thus, boosting acts as a prediction market on the future cred of a contribution. If someone finds an important contribution that currently receives little cred, they stand to benefit by boosting it to broader attention, since as it gets re-valued upwards, the booster will gain cred (and therefore, more grain).
Supporters can also use boosting to guide the project to focus on their priorities. For example, if I want to see a feature added, I can promise to boost every PR that makes progress towards the feature. (In the future, we’ll have a way to boost bugfixes or feature requests directly.)
An early version of boosting might focus on discourse posts, essentially creating “reddit gold” for SourceCred. We could do things like pin boosted topics for the next week, and/or create a weekly curated newsletter containing all the boosted posts.
When multiple people boost content, the later boosters will get less cred from the content than the early boosters, creating an incentive to boost early. Bandwagoners get less cred for their grain.
Some open questions
What cred scores do we use for the purpose of issuing grain-dollars?
Use scores for that week
We could use the “instantaneous cred” computed each week. This is nice because it gives a very clear connection between the work someone did and the grain they earned. Short feedback cycles are nice, especially for giving humans a sense of accomplishment and agency. However, it may be too short-term biased (should we keep paying grain for old-but-valuable contributions?) and it may take time before we have an accurate assessment of the value of recent contributions. (Note that SourceCred already has an exponential time decay built in, so “cred for this week” really means “cred from mostly this week, with a smear of cred from other recent weeks”
Use scores for an older week
We could pay out for cred with a fixed time decay, e.g. this week we pay out for cred earned 2 weeks ago. This gives a bit of extra time for us to figure out what contributions are worth.
Payout towards lifetime cred
We calculate each contributor’s lifetime cred (i.e. how much cred they earned across all weeks) and their lifetime cred. Then, if their lifetime cred is higher than their lifetime payout, they earn a fraction of the difference. This had the advantage that it allows for retroactive changes in the cred of old contributions, and also adds a material time-delay factor (implicit ‘vesting’).
My inclination on this question is to use a mixture of paying based on the most recent week, and paying towards lifetime cred. This ensures that there’s always a positive feedback cycle for recent contributions, but that the long-term payout converges to long-term cred earned, smoothing over timing details. This gives us flexibility to launch large retroactive changes to the algorithm or to cred normalization.
How fast to issue Grain (/ Grain-Dollars)?
The rate at which we issue Grain-Dollars is limited by the size of the treasury, since we shouldn’t issue more Grain-Dollars than we have dollars to back it. However, we don’t have such a limitation on issuing Grain directly. However, I’d prefer to only issue Grain-Dollars (and not raw Grain), as that makes the value of an Grain more clear: every Grain in circulation represented either one dollar contributed to the project, or one dollar of potential payment that was declined.
Nonetheless, we still have flexibility in deciding how much Grain to issue. Suppose that we learn through experience that
1/k of the dollar-grain is converted to dollars, and the rest goes to grain. And we have a flow of
d dollars coming in per week from donations. Then we could afford to pay up to
k*d dollar-grain every week without experiencing negative cash flow. Or, SourceCred could pay less than that, and build up a treasury.
Rather than issuing a fixed amount of dollar-grain every period, I’d rather have it be based on the total cred created. That way, rather than contributors competing to split up a fixed reward every week, they are cooperating to grow it.
How much cred-per-grain when boosting?
Boosting converts grain into cred. And per discussion above, cred may generate more grain. Clearly, we are setting up a feedback cycle here. If we tune it poorly, there will be exponential runaway growth in the amount of cred and grain, and it ruin the value of the system. So we can’t set cred-per-grain too high. However, if we set cred-per-grain very low, then there won’t be much of a reason to use boosting. So we’ll need to find a good balance here.
Implementing boosting will be a fair bit of technical work, so we’ll have time to reason through this.
[edit note: I replaced instances of “mana” with “grain”. See here for context]