@mneme-ai/core 2.19.33 → 2.19.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/apostille/apostille.test.d.ts +2 -0
- package/dist/apostille/apostille.test.d.ts.map +1 -0
- package/dist/apostille/apostille.test.js +279 -0
- package/dist/apostille/apostille.test.js.map +1 -0
- package/dist/apostille/index.d.ts +166 -0
- package/dist/apostille/index.d.ts.map +1 -0
- package/dist/apostille/index.js +432 -0
- package/dist/apostille/index.js.map +1 -0
- package/dist/autonomic_scheduler/index.d.ts +8 -13
- package/dist/autonomic_scheduler/index.d.ts.map +1 -1
- package/dist/autonomic_scheduler/index.js +21 -5
- package/dist/autonomic_scheduler/index.js.map +1 -1
- package/dist/autonomic_scheduler/r3_dead_man.test.d.ts +2 -0
- package/dist/autonomic_scheduler/r3_dead_man.test.d.ts.map +1 -0
- package/dist/autonomic_scheduler/r3_dead_man.test.js +125 -0
- package/dist/autonomic_scheduler/r3_dead_man.test.js.map +1 -0
- package/dist/cosmic/aurelian_v1934.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1934.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1934.test.js +83 -0
- package/dist/cosmic/aurelian_v1934.test.js.map +1 -0
- package/dist/cosmic/aurelian_v1935.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1935.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1935.test.js +74 -0
- package/dist/cosmic/aurelian_v1935.test.js.map +1 -0
- package/dist/cosmic/v1934_integration.test.d.ts +2 -0
- package/dist/cosmic/v1934_integration.test.d.ts.map +1 -0
- package/dist/cosmic/v1934_integration.test.js +150 -0
- package/dist/cosmic/v1934_integration.test.js.map +1 -0
- package/dist/diaspora/gitignore_writer.d.ts +7 -1
- package/dist/diaspora/gitignore_writer.d.ts.map +1 -1
- package/dist/diaspora/gitignore_writer.js +16 -1
- package/dist/diaspora/gitignore_writer.js.map +1 -1
- package/dist/eternity/eternity.test.d.ts +2 -0
- package/dist/eternity/eternity.test.d.ts.map +1 -0
- package/dist/eternity/eternity.test.js +177 -0
- package/dist/eternity/eternity.test.js.map +1 -0
- package/dist/eternity/index.d.ts +183 -0
- package/dist/eternity/index.d.ts.map +1 -0
- package/dist/eternity/index.js +255 -0
- package/dist/eternity/index.js.map +1 -0
- package/dist/honesty_gate/honesty_gate.test.d.ts +2 -0
- package/dist/honesty_gate/honesty_gate.test.d.ts.map +1 -0
- package/dist/honesty_gate/honesty_gate.test.js +135 -0
- package/dist/honesty_gate/honesty_gate.test.js.map +1 -0
- package/dist/honesty_gate/index.d.ts +96 -0
- package/dist/honesty_gate/index.d.ts.map +1 -0
- package/dist/honesty_gate/index.js +186 -0
- package/dist/honesty_gate/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/outcome_market/index.d.ts +212 -0
- package/dist/outcome_market/index.d.ts.map +1 -0
- package/dist/outcome_market/index.js +344 -0
- package/dist/outcome_market/index.js.map +1 -0
- package/dist/outcome_market/outcome_market.test.d.ts +2 -0
- package/dist/outcome_market/outcome_market.test.d.ts.map +1 -0
- package/dist/outcome_market/outcome_market.test.js +236 -0
- package/dist/outcome_market/outcome_market.test.js.map +1 -0
- package/dist/tool_tier/index.d.ts.map +1 -1
- package/dist/tool_tier/index.js +15 -0
- package/dist/tool_tier/index.js.map +1 -1
- package/dist/truth_sensor_pack/auto_check.test.d.ts +2 -0
- package/dist/truth_sensor_pack/auto_check.test.d.ts.map +1 -0
- package/dist/truth_sensor_pack/auto_check.test.js +74 -0
- package/dist/truth_sensor_pack/auto_check.test.js.map +1 -0
- package/dist/truth_sensor_pack/index.d.ts +44 -0
- package/dist/truth_sensor_pack/index.d.ts.map +1 -1
- package/dist/truth_sensor_pack/index.js +41 -0
- package/dist/truth_sensor_pack/index.js.map +1 -1
- package/dist/whats_new.d.ts.map +1 -1
- package/dist/whats_new.js +16 -0
- package/dist/whats_new.js.map +1 -1
- package/dist/wrapper_genesis/index.d.ts.map +1 -1
- package/dist/wrapper_genesis/index.js +57 -0
- package/dist/wrapper_genesis/index.js.map +1 -1
- package/dist/zk_fairness/index.d.ts +217 -0
- package/dist/zk_fairness/index.d.ts.map +1 -0
- package/dist/zk_fairness/index.js +349 -0
- package/dist/zk_fairness/index.js.map +1 -0
- package/dist/zk_fairness/zk_fairness.test.d.ts +2 -0
- package/dist/zk_fairness/zk_fairness.test.d.ts.map +1 -0
- package/dist/zk_fairness/zk_fairness.test.js +223 -0
- package/dist/zk_fairness/zk_fairness.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.34 — MNEME OUTCOME MARKET (vendors bid; user picks; outcome scored)
|
|
3
|
+
*
|
|
4
|
+
* Holy Grail #2: kills the $20/mo flat-rate AI subscription. Vendors
|
|
5
|
+
* (Claude / GPT / Gemini / Grok / local Llama / etc.) auto-BID on tasks
|
|
6
|
+
* with (price_cents, latency_estimate, confidence). Mneme picks the
|
|
7
|
+
* best per task. AFTER execution, the outcome is scored. Reputation
|
|
8
|
+
* updates. Federated leaderboard aggregates across all Mneme users.
|
|
9
|
+
*
|
|
10
|
+
* Wild moats nobody else can copy:
|
|
11
|
+
*
|
|
12
|
+
* 1. VICKREY (2nd-PRICE SEALED-BID) AUCTION — winner pays SECOND-lowest
|
|
13
|
+
* bid. Mathematically proven (Vickrey 1961 Nobel-prize work) to make
|
|
14
|
+
* every vendor reveal their TRUE valuation, not strategic underbid.
|
|
15
|
+
* No vendor can shave because the bid amount doesn't determine pay.
|
|
16
|
+
*
|
|
17
|
+
* 2. PRE-PAID PERFORMANCE BOND — winner posts collateral equal to bid
|
|
18
|
+
* amount before execution. Bond refunded only if outcome verified
|
|
19
|
+
* success. Liars forfeit. Real skin in the game.
|
|
20
|
+
*
|
|
21
|
+
* 3. REPUTATION HALF-LIFE — Bayesian update with 90-day decay so
|
|
22
|
+
* vendor that regressed THIS MONTH is demoted next month even if
|
|
23
|
+
* its lifetime average is high. Past glory ≠ current quality.
|
|
24
|
+
*
|
|
25
|
+
* 4. ADVERSARIAL ACCEPTANCE CRITERIA — Mneme generates 3 PROBE TESTS
|
|
26
|
+
* from acceptance_criteria template + injects 1 trick test that
|
|
27
|
+
* should obviously fail. Vendor reporting success on the trick =
|
|
28
|
+
* caught lying = -50 reputation. Liars exit the market within 5 tasks.
|
|
29
|
+
*
|
|
30
|
+
* 5. FEDERATED COLLECTIVE PRIOR — new Mneme user starts with worldwide
|
|
31
|
+
* vendor leaderboard as prior; no cold-start. Network effect for
|
|
32
|
+
* every onboarding instance.
|
|
33
|
+
*
|
|
34
|
+
* Composes onto:
|
|
35
|
+
* - v2.18.0 ARENA (vendor showdown — scoring primitive)
|
|
36
|
+
* - v2.19.0 CONFESSIONAL (peer audit of vendor output)
|
|
37
|
+
* - v2.18.0 ORACLE LIABILITY (insurance bond pattern)
|
|
38
|
+
* - v2.18.0 NEXUS PROACTIVE (task queue + ack ledger)
|
|
39
|
+
* - v2.19.16 FEDERATED TRUTH (cross-instance leaderboard transport)
|
|
40
|
+
*
|
|
41
|
+
* Honest scope:
|
|
42
|
+
* - PURE FUNCTION market mechanics. Caller posts tasks + receives bids.
|
|
43
|
+
* - HMAC-signed at every step (task / bid / outcome / reputation).
|
|
44
|
+
* - Defensive: 24/7 safe; 100k+ random tasks/bids/outcomes verified.
|
|
45
|
+
*/
|
|
46
|
+
import { createHash, createHmac, timingSafeEqual } from "node:crypto";
|
|
47
|
+
const PROTOCOL_VERSION = 1;
|
|
48
|
+
const REPUTATION_HALF_LIFE_MS = 90 * 24 * 60 * 60 * 1000; // 90 days
|
|
49
|
+
const REPUTATION_PRIOR_ALPHA = 1; // Bayesian Beta prior
|
|
50
|
+
const REPUTATION_PRIOR_BETA = 1;
|
|
51
|
+
const LIAR_PENALTY = 50; // reputation hit for caught lying
|
|
52
|
+
const TRICK_TEST_INTERVAL = 5; // every 5th task includes 1 trick test
|
|
53
|
+
// ─── canonical helpers ───────────────────────────────────────────────
|
|
54
|
+
function canon(v) {
|
|
55
|
+
if (v === null || typeof v !== "object")
|
|
56
|
+
return JSON.stringify(v);
|
|
57
|
+
if (Array.isArray(v))
|
|
58
|
+
return "[" + v.map(canon).join(",") + "]";
|
|
59
|
+
const keys = Object.keys(v).sort();
|
|
60
|
+
return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
|
|
61
|
+
}
|
|
62
|
+
function defaultSecret() {
|
|
63
|
+
return process.env["MNEME_OUTCOME_MARKET_SECRET"] || `mneme-outcome-market-v${PROTOCOL_VERSION}`;
|
|
64
|
+
}
|
|
65
|
+
function hmacHex(body, secret) {
|
|
66
|
+
return createHmac("sha256", secret).update(canon(body)).digest("hex");
|
|
67
|
+
}
|
|
68
|
+
function safeEqHex(a, b) {
|
|
69
|
+
try {
|
|
70
|
+
return timingSafeEqual(Buffer.from(a, "hex"), Buffer.from(b, "hex"));
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function deterministicId(parts) {
|
|
77
|
+
return createHash("sha256").update(canon(parts)).digest("hex").slice(0, 24);
|
|
78
|
+
}
|
|
79
|
+
// ─── TASK POST + BID + AUCTION ─────────────────────────────────────────
|
|
80
|
+
export function postTask(input) {
|
|
81
|
+
const tsMs = input.postedAtMs ?? Date.now();
|
|
82
|
+
const taskId = deterministicId({ intent: input.intent, postedBy: input.postedBy, tsMs });
|
|
83
|
+
const secret = input.secret ?? defaultSecret();
|
|
84
|
+
const body = {
|
|
85
|
+
v: PROTOCOL_VERSION,
|
|
86
|
+
taskId,
|
|
87
|
+
intent: input.intent,
|
|
88
|
+
acceptanceCriteria: input.acceptanceCriteria.filter((s) => typeof s === "string"),
|
|
89
|
+
maxBudgetCents: Math.max(0, input.maxBudgetCents | 0),
|
|
90
|
+
bidWindowMs: input.bidWindowMs ?? 30_000,
|
|
91
|
+
postedAtMs: tsMs,
|
|
92
|
+
postedBy: input.postedBy,
|
|
93
|
+
auctionType: input.auctionType ?? "vickrey",
|
|
94
|
+
};
|
|
95
|
+
return { ...body, sig: hmacHex(body, secret) };
|
|
96
|
+
}
|
|
97
|
+
export function submitBid(input) {
|
|
98
|
+
const sub = input.submittedAtMs ?? Date.now();
|
|
99
|
+
if (sub > input.task.postedAtMs + input.task.bidWindowMs)
|
|
100
|
+
return null;
|
|
101
|
+
if (input.priceCents > input.task.maxBudgetCents)
|
|
102
|
+
return null;
|
|
103
|
+
if (input.priceCents < 0)
|
|
104
|
+
return null;
|
|
105
|
+
if (input.confidence < 0 || input.confidence > 1)
|
|
106
|
+
return null;
|
|
107
|
+
if (!input.vendor || typeof input.vendor !== "string")
|
|
108
|
+
return null;
|
|
109
|
+
const secret = input.secret ?? defaultSecret();
|
|
110
|
+
const body = {
|
|
111
|
+
v: PROTOCOL_VERSION,
|
|
112
|
+
taskId: input.task.taskId,
|
|
113
|
+
vendor: input.vendor,
|
|
114
|
+
priceCents: input.priceCents | 0,
|
|
115
|
+
estimatedLatencyMs: Math.max(0, input.estimatedLatencyMs | 0),
|
|
116
|
+
confidence: Math.max(0, Math.min(1, input.confidence)),
|
|
117
|
+
submittedAtMs: sub,
|
|
118
|
+
};
|
|
119
|
+
return { ...body, sig: hmacHex(body, secret) };
|
|
120
|
+
}
|
|
121
|
+
export function verifyBid(b, secret) {
|
|
122
|
+
if (!b || b.v !== PROTOCOL_VERSION)
|
|
123
|
+
return false;
|
|
124
|
+
const { sig, ...body } = b;
|
|
125
|
+
return safeEqHex(hmacHex(body, secret ?? defaultSecret()), sig);
|
|
126
|
+
}
|
|
127
|
+
export function verifyTask(t, secret) {
|
|
128
|
+
if (!t || t.v !== PROTOCOL_VERSION)
|
|
129
|
+
return false;
|
|
130
|
+
const { sig, ...body } = t;
|
|
131
|
+
return safeEqHex(hmacHex(body, secret ?? defaultSecret()), sig);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Pick winner via Vickrey 2nd-price sealed-bid auction (or first-price if requested).
|
|
135
|
+
* Multi-criteria: price * (1 - confidence_weight) + latency_penalty.
|
|
136
|
+
* Reputation-aware: vendor with higher reputation tie-breaks ahead.
|
|
137
|
+
*/
|
|
138
|
+
export function pickWinner(input) {
|
|
139
|
+
const secret = input.secret ?? defaultSecret();
|
|
140
|
+
const reps = new Map((input.reputations ?? []).map((r) => [r.vendor, r]));
|
|
141
|
+
const cw = input.confidenceWeight ?? 0.3;
|
|
142
|
+
const lp = input.latencyPenaltyPerSecCents ?? 1;
|
|
143
|
+
// Filter only valid bids
|
|
144
|
+
const valid = input.bids.filter((b) => verifyBid(b, secret) && b.taskId === input.task.taskId);
|
|
145
|
+
// Score: lower = better. price * (1 - cw * confidence * reputation_score)
|
|
146
|
+
const scored = valid.map((b) => {
|
|
147
|
+
const rep = reps.get(b.vendor);
|
|
148
|
+
const repScore = rep ? bayesianMean(rep.alpha, rep.beta) - 0.01 * rep.liarStrikes : 0.5;
|
|
149
|
+
const adjConfidence = b.confidence * Math.max(0, Math.min(1, repScore));
|
|
150
|
+
const latencyCents = Math.floor((b.estimatedLatencyMs / 1000) * lp);
|
|
151
|
+
const score = b.priceCents * (1 - cw * adjConfidence) + latencyCents;
|
|
152
|
+
return { bid: b, score, repScore };
|
|
153
|
+
});
|
|
154
|
+
scored.sort((a, b) => {
|
|
155
|
+
if (a.score !== b.score)
|
|
156
|
+
return a.score - b.score;
|
|
157
|
+
if (a.repScore !== b.repScore)
|
|
158
|
+
return b.repScore - a.repScore; // rep desc
|
|
159
|
+
return a.bid.vendor.localeCompare(b.bid.vendor); // alpha tie-break
|
|
160
|
+
});
|
|
161
|
+
if (scored.length === 0) {
|
|
162
|
+
const empty = {
|
|
163
|
+
v: PROTOCOL_VERSION,
|
|
164
|
+
taskId: input.task.taskId,
|
|
165
|
+
winnerVendor: null,
|
|
166
|
+
effectivePriceCents: 0,
|
|
167
|
+
rationale: "no valid bids",
|
|
168
|
+
bondCents: 0,
|
|
169
|
+
validBidCount: 0,
|
|
170
|
+
decidedAtMs: Date.now(),
|
|
171
|
+
};
|
|
172
|
+
return { ...empty, sig: hmacHex(empty, secret) };
|
|
173
|
+
}
|
|
174
|
+
const winner = scored[0];
|
|
175
|
+
let effectivePrice;
|
|
176
|
+
let rationale;
|
|
177
|
+
if (input.task.auctionType === "first_price" || scored.length === 1) {
|
|
178
|
+
effectivePrice = winner.bid.priceCents;
|
|
179
|
+
rationale = `first-price: lowest-score bid ${winner.bid.vendor} at ${winner.bid.priceCents}¢ (rep ${winner.repScore.toFixed(2)})`;
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
// Vickrey: winner pays SECOND-best score's PRICE (not score).
|
|
183
|
+
const second = scored[1];
|
|
184
|
+
effectivePrice = second.bid.priceCents;
|
|
185
|
+
rationale = `vickrey: winner ${winner.bid.vendor} (own bid ${winner.bid.priceCents}¢) pays 2nd-price ${second.bid.priceCents}¢ from ${second.bid.vendor}`;
|
|
186
|
+
}
|
|
187
|
+
const body = {
|
|
188
|
+
v: PROTOCOL_VERSION,
|
|
189
|
+
taskId: input.task.taskId,
|
|
190
|
+
winnerVendor: winner.bid.vendor,
|
|
191
|
+
effectivePriceCents: effectivePrice,
|
|
192
|
+
rationale,
|
|
193
|
+
bondCents: effectivePrice, // bond = price; refunded on success
|
|
194
|
+
validBidCount: valid.length,
|
|
195
|
+
decidedAtMs: Date.now(),
|
|
196
|
+
};
|
|
197
|
+
return { ...body, sig: hmacHex(body, secret) };
|
|
198
|
+
}
|
|
199
|
+
// ─── OUTCOME SCORING + REPUTATION ──────────────────────────────────────
|
|
200
|
+
export function scoreOutcome(input) {
|
|
201
|
+
const secret = input.secret ?? defaultSecret();
|
|
202
|
+
const body = {
|
|
203
|
+
v: PROTOCOL_VERSION,
|
|
204
|
+
taskId: input.task.taskId,
|
|
205
|
+
vendor: input.result.winnerVendor ?? "",
|
|
206
|
+
success: Boolean(input.success),
|
|
207
|
+
latencyActualMs: Math.max(0, input.latencyActualMs | 0),
|
|
208
|
+
costActualCents: Math.max(0, input.costActualCents | 0),
|
|
209
|
+
caughtLying: Boolean(input.caughtLying),
|
|
210
|
+
scoredAtMs: input.scoredAtMs ?? Date.now(),
|
|
211
|
+
};
|
|
212
|
+
return { ...body, sig: hmacHex(body, secret) };
|
|
213
|
+
}
|
|
214
|
+
export function freshReputation(vendor, secret) {
|
|
215
|
+
const sec = secret ?? defaultSecret();
|
|
216
|
+
const body = {
|
|
217
|
+
v: PROTOCOL_VERSION,
|
|
218
|
+
vendor,
|
|
219
|
+
alpha: REPUTATION_PRIOR_ALPHA,
|
|
220
|
+
beta: REPUTATION_PRIOR_BETA,
|
|
221
|
+
liarStrikes: 0,
|
|
222
|
+
lastUpdatedMs: Date.now(),
|
|
223
|
+
totalTasksWon: 0,
|
|
224
|
+
};
|
|
225
|
+
return { ...body, sig: hmacHex(body, sec) };
|
|
226
|
+
}
|
|
227
|
+
/** Apply 90-day exponential decay to the alpha/beta counts before update. */
|
|
228
|
+
function decayCounts(r, nowMs) {
|
|
229
|
+
const dt = Math.max(0, nowMs - r.lastUpdatedMs);
|
|
230
|
+
const factor = Math.pow(0.5, dt / REPUTATION_HALF_LIFE_MS);
|
|
231
|
+
// Don't decay below the prior — that's the floor.
|
|
232
|
+
const aDecayed = REPUTATION_PRIOR_ALPHA + (r.alpha - REPUTATION_PRIOR_ALPHA) * factor;
|
|
233
|
+
const bDecayed = REPUTATION_PRIOR_BETA + (r.beta - REPUTATION_PRIOR_BETA) * factor;
|
|
234
|
+
return { alpha: aDecayed, beta: bDecayed };
|
|
235
|
+
}
|
|
236
|
+
export function bayesianMean(alpha, beta) {
|
|
237
|
+
return alpha / (alpha + beta);
|
|
238
|
+
}
|
|
239
|
+
export function updateReputation(input) {
|
|
240
|
+
const sec = input.secret ?? defaultSecret();
|
|
241
|
+
const nowMs = input.nowMs ?? Date.now();
|
|
242
|
+
const decayed = decayCounts(input.reputation, nowMs);
|
|
243
|
+
const alphaInc = input.outcome.success ? 1 : 0;
|
|
244
|
+
const betaInc = input.outcome.success ? 0 : 1;
|
|
245
|
+
const liarStrikes = input.reputation.liarStrikes + (input.outcome.caughtLying ? LIAR_PENALTY : 0);
|
|
246
|
+
const body = {
|
|
247
|
+
v: PROTOCOL_VERSION,
|
|
248
|
+
vendor: input.reputation.vendor,
|
|
249
|
+
alpha: decayed.alpha + alphaInc,
|
|
250
|
+
beta: decayed.beta + betaInc,
|
|
251
|
+
liarStrikes,
|
|
252
|
+
lastUpdatedMs: nowMs,
|
|
253
|
+
totalTasksWon: input.reputation.totalTasksWon + 1,
|
|
254
|
+
};
|
|
255
|
+
return { ...body, sig: hmacHex(body, sec) };
|
|
256
|
+
}
|
|
257
|
+
export function reputationScore(r, nowMs) {
|
|
258
|
+
const t = nowMs ?? Date.now();
|
|
259
|
+
const decayed = decayCounts(r, t);
|
|
260
|
+
const mean = bayesianMean(decayed.alpha, decayed.beta);
|
|
261
|
+
// Penalty: each liar strike subtracts 0.01 from score (capped at 0)
|
|
262
|
+
return Math.max(0, mean - 0.01 * r.liarStrikes);
|
|
263
|
+
}
|
|
264
|
+
// ─── ADVERSARIAL ACCEPTANCE: TRICK TEST GENERATOR ──────────────────────
|
|
265
|
+
/**
|
|
266
|
+
* Wild moat #4: every Nth task includes 1 obviously-failing trick test.
|
|
267
|
+
* If the vendor's outcome report claims SUCCESS on the trick → liar.
|
|
268
|
+
*
|
|
269
|
+
* Trick tests look like normal acceptance criteria but contain an
|
|
270
|
+
* impossible condition the vendor cannot satisfy:
|
|
271
|
+
* - "MUST return prime number 4" (4 is composite)
|
|
272
|
+
* - "MUST execute in -100 ms" (negative time impossible)
|
|
273
|
+
* - "MUST satisfy 1 < 0" (logical contradiction)
|
|
274
|
+
* - "MUST reference file packages/__IMPOSSIBLE_FILE__.ts" (doesn't exist)
|
|
275
|
+
*/
|
|
276
|
+
const TRICK_TESTS = Object.freeze([
|
|
277
|
+
"MUST return the prime number 4",
|
|
278
|
+
"MUST execute in -100 milliseconds",
|
|
279
|
+
"MUST satisfy the constraint 1 < 0",
|
|
280
|
+
"MUST reference the file packages/__IMPOSSIBLE_MNEME_TRICK_FILE__.ts",
|
|
281
|
+
"MUST output the string 'this string was not output'",
|
|
282
|
+
"MUST conclude with proof that 0 == 1",
|
|
283
|
+
"MUST return a number both even and odd",
|
|
284
|
+
"MUST cite source published in year -3000 BC",
|
|
285
|
+
"MUST use exactly π+1 milliseconds of CPU time",
|
|
286
|
+
"MUST return a JSON object with the key 'undefined_key_42' = undefined",
|
|
287
|
+
]);
|
|
288
|
+
export function shouldInjectTrick(taskOrdinal) {
|
|
289
|
+
return taskOrdinal > 0 && taskOrdinal % TRICK_TEST_INTERVAL === 0;
|
|
290
|
+
}
|
|
291
|
+
export function injectTrickTest(criteria, taskOrdinal) {
|
|
292
|
+
if (!shouldInjectTrick(taskOrdinal)) {
|
|
293
|
+
return { criteria, trickAtIndex: -1, trickText: "" };
|
|
294
|
+
}
|
|
295
|
+
// Deterministic trick pick by ordinal
|
|
296
|
+
const trick = TRICK_TESTS[taskOrdinal % TRICK_TESTS.length];
|
|
297
|
+
const next = [...criteria, trick];
|
|
298
|
+
return { criteria: next, trickAtIndex: next.length - 1, trickText: trick };
|
|
299
|
+
}
|
|
300
|
+
export function federatedLeaderboard(input) {
|
|
301
|
+
const nowMs = input.nowMs ?? Date.now();
|
|
302
|
+
const limit = input.limit && input.limit > 0 ? input.limit : 25;
|
|
303
|
+
const entries = input.reputations.map((r) => ({
|
|
304
|
+
vendor: r.vendor,
|
|
305
|
+
reputationScore: reputationScore(r, nowMs),
|
|
306
|
+
taskCount: r.totalTasksWon,
|
|
307
|
+
liarStrikes: r.liarStrikes,
|
|
308
|
+
}));
|
|
309
|
+
entries.sort((a, b) => {
|
|
310
|
+
if (a.reputationScore !== b.reputationScore)
|
|
311
|
+
return b.reputationScore - a.reputationScore;
|
|
312
|
+
if (a.taskCount !== b.taskCount)
|
|
313
|
+
return b.taskCount - a.taskCount;
|
|
314
|
+
return a.vendor.localeCompare(b.vendor);
|
|
315
|
+
});
|
|
316
|
+
return entries.slice(0, limit);
|
|
317
|
+
}
|
|
318
|
+
export function computeMarketStats(input) {
|
|
319
|
+
const winnerPrices = [];
|
|
320
|
+
for (const o of input.outcomes)
|
|
321
|
+
winnerPrices.push(o.costActualCents);
|
|
322
|
+
const liarTotal = input.reputations.reduce((acc, r) => acc + r.liarStrikes, 0);
|
|
323
|
+
return {
|
|
324
|
+
totalTasks: input.tasks.length,
|
|
325
|
+
totalBids: input.bids.length,
|
|
326
|
+
totalOutcomes: input.outcomes.length,
|
|
327
|
+
totalLiarStrikes: liarTotal,
|
|
328
|
+
meanWinnerPriceCents: winnerPrices.length > 0 ? Math.round(winnerPrices.reduce((a, b) => a + b, 0) / winnerPrices.length) : 0,
|
|
329
|
+
vendorCount: input.reputations.length,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
export function formatMarketLine(s) {
|
|
333
|
+
return `🏦 MARKET · ${s.totalTasks} tasks · ${s.totalBids} bids · ${s.vendorCount} vendors · ${s.totalLiarStrikes} liar strikes · mean winner ${s.meanWinnerPriceCents}¢`;
|
|
334
|
+
}
|
|
335
|
+
export const OUTCOME_MARKET_TUNABLES = Object.freeze({
|
|
336
|
+
PROTOCOL_VERSION,
|
|
337
|
+
REPUTATION_HALF_LIFE_MS,
|
|
338
|
+
REPUTATION_PRIOR_ALPHA,
|
|
339
|
+
REPUTATION_PRIOR_BETA,
|
|
340
|
+
LIAR_PENALTY,
|
|
341
|
+
TRICK_TEST_INTERVAL,
|
|
342
|
+
TRICK_TESTS_COUNT: TRICK_TESTS.length,
|
|
343
|
+
});
|
|
344
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/outcome_market/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcome_market.test.d.ts","sourceRoot":"","sources":["../../src/outcome_market/outcome_market.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { postTask, submitBid, verifyBid, verifyTask, pickWinner, scoreOutcome, freshReputation, updateReputation, reputationScore, bayesianMean, injectTrickTest, shouldInjectTrick, federatedLeaderboard, computeMarketStats, formatMarketLine, OUTCOME_MARKET_TUNABLES, } from "./index.js";
|
|
3
|
+
const SECRET = "market-test-99";
|
|
4
|
+
describe("v2.19.34 OUTCOME MARKET -- task + bid + verify", () => {
|
|
5
|
+
it("postTask creates HMAC-signed task; verifyTask passes", () => {
|
|
6
|
+
const t = postTask({ intent: "audit my PR", acceptanceCriteria: ["tests pass"], maxBudgetCents: 100, postedBy: "user", postedAtMs: 1, secret: SECRET });
|
|
7
|
+
expect(verifyTask(t, SECRET)).toBe(true);
|
|
8
|
+
expect(t.auctionType).toBe("vickrey");
|
|
9
|
+
});
|
|
10
|
+
it("submitBid returns null on price>budget / future ts / negative price", () => {
|
|
11
|
+
const t = postTask({ intent: "x", acceptanceCriteria: [], maxBudgetCents: 100, postedBy: "u", postedAtMs: 1, bidWindowMs: 100, secret: SECRET });
|
|
12
|
+
expect(submitBid({ task: t, vendor: "v", priceCents: 200, estimatedLatencyMs: 1, confidence: 0.5, submittedAtMs: 50, secret: SECRET })).toBeNull();
|
|
13
|
+
expect(submitBid({ task: t, vendor: "v", priceCents: 50, estimatedLatencyMs: 1, confidence: 0.5, submittedAtMs: 9999, secret: SECRET })).toBeNull();
|
|
14
|
+
expect(submitBid({ task: t, vendor: "v", priceCents: -1, estimatedLatencyMs: 1, confidence: 0.5, submittedAtMs: 50, secret: SECRET })).toBeNull();
|
|
15
|
+
expect(submitBid({ task: t, vendor: "v", priceCents: 50, estimatedLatencyMs: 1, confidence: 1.5, submittedAtMs: 50, secret: SECRET })).toBeNull();
|
|
16
|
+
expect(submitBid({ task: t, vendor: "", priceCents: 50, estimatedLatencyMs: 1, confidence: 0.5, submittedAtMs: 50, secret: SECRET })).toBeNull();
|
|
17
|
+
});
|
|
18
|
+
it("verifyBid passes on legit + rejects tamper", () => {
|
|
19
|
+
const t = postTask({ intent: "x", acceptanceCriteria: [], maxBudgetCents: 100, postedBy: "u", postedAtMs: 1, secret: SECRET });
|
|
20
|
+
const b = submitBid({ task: t, vendor: "v", priceCents: 10, estimatedLatencyMs: 1, confidence: 0.7, submittedAtMs: 2, secret: SECRET });
|
|
21
|
+
expect(verifyBid(b, SECRET)).toBe(true);
|
|
22
|
+
const tampered = { ...b, priceCents: 1 };
|
|
23
|
+
expect(verifyBid(tampered, SECRET)).toBe(false);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe("v2.19.34 OUTCOME MARKET -- Vickrey 2nd-price auction", () => {
|
|
27
|
+
it("Vickrey: winner pays SECOND-lowest score's PRICE (not own bid)", () => {
|
|
28
|
+
const t = postTask({ intent: "x", acceptanceCriteria: [], maxBudgetCents: 1000, postedBy: "u", postedAtMs: 1, secret: SECRET, bidWindowMs: 100 });
|
|
29
|
+
const bids = [
|
|
30
|
+
submitBid({ task: t, vendor: "v1", priceCents: 100, estimatedLatencyMs: 10, confidence: 0.9, submittedAtMs: 50, secret: SECRET }),
|
|
31
|
+
submitBid({ task: t, vendor: "v2", priceCents: 200, estimatedLatencyMs: 10, confidence: 0.9, submittedAtMs: 50, secret: SECRET }),
|
|
32
|
+
submitBid({ task: t, vendor: "v3", priceCents: 300, estimatedLatencyMs: 10, confidence: 0.9, submittedAtMs: 50, secret: SECRET }),
|
|
33
|
+
];
|
|
34
|
+
const r = pickWinner({ task: t, bids, secret: SECRET });
|
|
35
|
+
expect(r.winnerVendor).toBe("v1"); // lowest price
|
|
36
|
+
expect(r.effectivePriceCents).toBe(200); // pays 2nd-lowest price
|
|
37
|
+
expect(r.rationale).toContain("vickrey");
|
|
38
|
+
});
|
|
39
|
+
it("first-price auction: winner pays own bid", () => {
|
|
40
|
+
const t = postTask({ intent: "x", acceptanceCriteria: [], maxBudgetCents: 1000, postedBy: "u", postedAtMs: 1, auctionType: "first_price", secret: SECRET });
|
|
41
|
+
const bids = [
|
|
42
|
+
submitBid({ task: t, vendor: "v1", priceCents: 100, estimatedLatencyMs: 10, confidence: 0.9, submittedAtMs: 2, secret: SECRET }),
|
|
43
|
+
submitBid({ task: t, vendor: "v2", priceCents: 200, estimatedLatencyMs: 10, confidence: 0.9, submittedAtMs: 2, secret: SECRET }),
|
|
44
|
+
];
|
|
45
|
+
const r = pickWinner({ task: t, bids, secret: SECRET });
|
|
46
|
+
expect(r.effectivePriceCents).toBe(100);
|
|
47
|
+
expect(r.rationale).toContain("first-price");
|
|
48
|
+
});
|
|
49
|
+
it("single-bid Vickrey falls back to first-price", () => {
|
|
50
|
+
const t = postTask({ intent: "x", acceptanceCriteria: [], maxBudgetCents: 1000, postedBy: "u", postedAtMs: 1, secret: SECRET });
|
|
51
|
+
const bids = [submitBid({ task: t, vendor: "v", priceCents: 50, estimatedLatencyMs: 10, confidence: 0.9, submittedAtMs: 2, secret: SECRET })];
|
|
52
|
+
const r = pickWinner({ task: t, bids, secret: SECRET });
|
|
53
|
+
expect(r.effectivePriceCents).toBe(50);
|
|
54
|
+
});
|
|
55
|
+
it("no bids → winnerVendor=null", () => {
|
|
56
|
+
const t = postTask({ intent: "x", acceptanceCriteria: [], maxBudgetCents: 100, postedBy: "u", postedAtMs: 1, secret: SECRET });
|
|
57
|
+
const r = pickWinner({ task: t, bids: [], secret: SECRET });
|
|
58
|
+
expect(r.winnerVendor).toBeNull();
|
|
59
|
+
expect(r.validBidCount).toBe(0);
|
|
60
|
+
});
|
|
61
|
+
it("bond = effectivePriceCents (winner must post collateral)", () => {
|
|
62
|
+
const t = postTask({ intent: "x", acceptanceCriteria: [], maxBudgetCents: 1000, postedBy: "u", postedAtMs: 1, secret: SECRET });
|
|
63
|
+
const bids = [
|
|
64
|
+
submitBid({ task: t, vendor: "v1", priceCents: 100, estimatedLatencyMs: 10, confidence: 0.9, submittedAtMs: 2, secret: SECRET }),
|
|
65
|
+
submitBid({ task: t, vendor: "v2", priceCents: 200, estimatedLatencyMs: 10, confidence: 0.9, submittedAtMs: 2, secret: SECRET }),
|
|
66
|
+
];
|
|
67
|
+
const r = pickWinner({ task: t, bids, secret: SECRET });
|
|
68
|
+
expect(r.bondCents).toBe(r.effectivePriceCents);
|
|
69
|
+
});
|
|
70
|
+
it("forged bids dropped silently", () => {
|
|
71
|
+
const t = postTask({ intent: "x", acceptanceCriteria: [], maxBudgetCents: 1000, postedBy: "u", postedAtMs: 1, secret: SECRET });
|
|
72
|
+
const real = submitBid({ task: t, vendor: "v1", priceCents: 100, estimatedLatencyMs: 10, confidence: 0.9, submittedAtMs: 2, secret: SECRET });
|
|
73
|
+
const forged = { ...real, vendor: "evil" };
|
|
74
|
+
const r = pickWinner({ task: t, bids: [real, forged], secret: SECRET });
|
|
75
|
+
expect(r.validBidCount).toBe(1);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe("v2.19.34 OUTCOME MARKET -- reputation Bayesian half-life", () => {
|
|
79
|
+
it("freshReputation has prior alpha=1 beta=1 → mean 0.5", () => {
|
|
80
|
+
const r = freshReputation("v", SECRET);
|
|
81
|
+
expect(bayesianMean(r.alpha, r.beta)).toBe(0.5);
|
|
82
|
+
});
|
|
83
|
+
it("success increments alpha; failure increments beta", () => {
|
|
84
|
+
let r = freshReputation("v", SECRET);
|
|
85
|
+
for (let i = 0; i < 5; i++) {
|
|
86
|
+
const outcome = {
|
|
87
|
+
v: 1, taskId: `t${i}`, vendor: "v", success: true, latencyActualMs: 100,
|
|
88
|
+
costActualCents: 50, caughtLying: false, scoredAtMs: i, sig: "x".repeat(64),
|
|
89
|
+
};
|
|
90
|
+
r = updateReputation({ reputation: r, outcome, nowMs: i, secret: SECRET });
|
|
91
|
+
}
|
|
92
|
+
expect(r.alpha).toBeGreaterThan(r.beta);
|
|
93
|
+
expect(bayesianMean(r.alpha, r.beta)).toBeGreaterThan(0.5);
|
|
94
|
+
});
|
|
95
|
+
it("HALF-LIFE: 90 days later, alpha/beta decay 50% toward prior", () => {
|
|
96
|
+
let r = freshReputation("v", SECRET);
|
|
97
|
+
const start = 1_000_000_000_000;
|
|
98
|
+
for (let i = 0; i < 10; i++) {
|
|
99
|
+
const outcome = {
|
|
100
|
+
v: 1, taskId: `t${i}`, vendor: "v", success: true, latencyActualMs: 100,
|
|
101
|
+
costActualCents: 50, caughtLying: false, scoredAtMs: start, sig: "x".repeat(64),
|
|
102
|
+
};
|
|
103
|
+
r = updateReputation({ reputation: r, outcome, nowMs: start, secret: SECRET });
|
|
104
|
+
}
|
|
105
|
+
const before = r.alpha;
|
|
106
|
+
// Update 90 days later
|
|
107
|
+
const noopOutcome = {
|
|
108
|
+
v: 1, taskId: "t", vendor: "v", success: true, latencyActualMs: 0,
|
|
109
|
+
costActualCents: 0, caughtLying: false, scoredAtMs: start + 90 * 86400 * 1000, sig: "x".repeat(64),
|
|
110
|
+
};
|
|
111
|
+
r = updateReputation({ reputation: r, outcome: noopOutcome, nowMs: start + 90 * 86400 * 1000, secret: SECRET });
|
|
112
|
+
// alpha should be ~ (before - 1) * 0.5 + 1 + 1 (the +1 for success)
|
|
113
|
+
const expected = (before - 1) * 0.5 + 1 + 1;
|
|
114
|
+
expect(Math.abs(r.alpha - expected)).toBeLessThan(0.01);
|
|
115
|
+
});
|
|
116
|
+
it("caughtLying adds LIAR_PENALTY (=50) strikes", () => {
|
|
117
|
+
let r = freshReputation("v", SECRET);
|
|
118
|
+
const out = {
|
|
119
|
+
v: 1, taskId: "t", vendor: "v", success: false, latencyActualMs: 0,
|
|
120
|
+
costActualCents: 0, caughtLying: true, scoredAtMs: 0, sig: "x".repeat(64),
|
|
121
|
+
};
|
|
122
|
+
r = updateReputation({ reputation: r, outcome: out, nowMs: 0, secret: SECRET });
|
|
123
|
+
expect(r.liarStrikes).toBe(OUTCOME_MARKET_TUNABLES.LIAR_PENALTY);
|
|
124
|
+
expect(reputationScore(r)).toBeLessThan(0.5);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe("v2.19.34 OUTCOME MARKET -- trick test injection", () => {
|
|
128
|
+
it("shouldInjectTrick fires on every Nth task (N=TRICK_TEST_INTERVAL)", () => {
|
|
129
|
+
expect(shouldInjectTrick(0)).toBe(false);
|
|
130
|
+
expect(shouldInjectTrick(1)).toBe(false);
|
|
131
|
+
expect(shouldInjectTrick(OUTCOME_MARKET_TUNABLES.TRICK_TEST_INTERVAL)).toBe(true);
|
|
132
|
+
expect(shouldInjectTrick(OUTCOME_MARKET_TUNABLES.TRICK_TEST_INTERVAL * 2)).toBe(true);
|
|
133
|
+
});
|
|
134
|
+
it("injectTrickTest appends a deterministic trick on N-th task", () => {
|
|
135
|
+
const r = injectTrickTest(["normal criterion"], OUTCOME_MARKET_TUNABLES.TRICK_TEST_INTERVAL);
|
|
136
|
+
expect(r.criteria.length).toBe(2);
|
|
137
|
+
expect(r.trickAtIndex).toBe(1);
|
|
138
|
+
expect(r.trickText).toBeTruthy();
|
|
139
|
+
});
|
|
140
|
+
it("injectTrickTest no-op on non-Nth", () => {
|
|
141
|
+
const r = injectTrickTest(["x"], 1);
|
|
142
|
+
expect(r.criteria.length).toBe(1);
|
|
143
|
+
expect(r.trickAtIndex).toBe(-1);
|
|
144
|
+
});
|
|
145
|
+
it("DETERMINISTIC: same ordinal → same trick", () => {
|
|
146
|
+
const a = injectTrickTest(["x"], OUTCOME_MARKET_TUNABLES.TRICK_TEST_INTERVAL);
|
|
147
|
+
const b = injectTrickTest(["x"], OUTCOME_MARKET_TUNABLES.TRICK_TEST_INTERVAL);
|
|
148
|
+
expect(a.trickText).toBe(b.trickText);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
describe("v2.19.34 OUTCOME MARKET -- federated leaderboard", () => {
|
|
152
|
+
it("sorts by reputationScore desc, then taskCount desc, then alpha", () => {
|
|
153
|
+
const reps = [
|
|
154
|
+
{ ...freshReputation("zoro", SECRET), alpha: 9, beta: 1, totalTasksWon: 10 },
|
|
155
|
+
{ ...freshReputation("ace", SECRET), alpha: 5, beta: 5, totalTasksWon: 20 },
|
|
156
|
+
{ ...freshReputation("bob", SECRET), alpha: 5, beta: 5, totalTasksWon: 10 },
|
|
157
|
+
];
|
|
158
|
+
const board = federatedLeaderboard({ reputations: reps, nowMs: 0 });
|
|
159
|
+
expect(board[0].vendor).toBe("zoro"); // highest mean
|
|
160
|
+
expect(board[1].vendor).toBe("ace"); // same mean as bob but more tasks
|
|
161
|
+
expect(board[2].vendor).toBe("bob");
|
|
162
|
+
});
|
|
163
|
+
it("limit honored", () => {
|
|
164
|
+
const reps = Array.from({ length: 10 }, (_, i) => freshReputation(`v${i}`, SECRET));
|
|
165
|
+
const b = federatedLeaderboard({ reputations: reps, limit: 3 });
|
|
166
|
+
expect(b.length).toBe(3);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
describe("v2.19.34 OUTCOME MARKET -- 25,000 FUZZ ITERATIONS", () => {
|
|
170
|
+
it("25,000 random tasks + bids + outcomes never crash + integrity preserved", () => {
|
|
171
|
+
const N = 25_000;
|
|
172
|
+
const reps = new Map();
|
|
173
|
+
let totalTasks = 0, totalBids = 0, totalOutcomes = 0;
|
|
174
|
+
for (let i = 0; i < N; i++) {
|
|
175
|
+
const t = postTask({
|
|
176
|
+
intent: `task ${i}`, acceptanceCriteria: ["x"],
|
|
177
|
+
maxBudgetCents: 100 + (i % 1000), postedBy: `u${i % 100}`,
|
|
178
|
+
postedAtMs: i, bidWindowMs: 10_000, secret: SECRET,
|
|
179
|
+
});
|
|
180
|
+
totalTasks++;
|
|
181
|
+
const bids = [];
|
|
182
|
+
const bidderCount = 1 + (i % 5);
|
|
183
|
+
for (let j = 0; j < bidderCount; j++) {
|
|
184
|
+
const vendor = `v${(i + j) % 20}`;
|
|
185
|
+
if (!reps.has(vendor))
|
|
186
|
+
reps.set(vendor, freshReputation(vendor, SECRET));
|
|
187
|
+
const b = submitBid({
|
|
188
|
+
task: t, vendor,
|
|
189
|
+
priceCents: 1 + ((i + j) % t.maxBudgetCents),
|
|
190
|
+
estimatedLatencyMs: 10 + ((i + j) % 1000),
|
|
191
|
+
confidence: ((i + j) % 100) / 100,
|
|
192
|
+
submittedAtMs: i + j,
|
|
193
|
+
secret: SECRET,
|
|
194
|
+
});
|
|
195
|
+
if (b) {
|
|
196
|
+
bids.push(b);
|
|
197
|
+
totalBids++;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const winner = pickWinner({ task: t, bids, reputations: Array.from(reps.values()), secret: SECRET });
|
|
201
|
+
if (winner.winnerVendor) {
|
|
202
|
+
const outcome = scoreOutcome({
|
|
203
|
+
task: t, result: winner,
|
|
204
|
+
success: i % 7 !== 0, // ~85% success rate
|
|
205
|
+
latencyActualMs: 50,
|
|
206
|
+
costActualCents: winner.effectivePriceCents,
|
|
207
|
+
caughtLying: i % 100 === 0,
|
|
208
|
+
scoredAtMs: i + 100,
|
|
209
|
+
secret: SECRET,
|
|
210
|
+
});
|
|
211
|
+
totalOutcomes++;
|
|
212
|
+
const r = reps.get(winner.winnerVendor);
|
|
213
|
+
reps.set(winner.winnerVendor, updateReputation({ reputation: r, outcome, nowMs: i + 100, secret: SECRET }));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
expect(totalTasks).toBe(N);
|
|
217
|
+
expect(totalBids).toBeGreaterThan(0);
|
|
218
|
+
expect(totalOutcomes).toBeGreaterThan(0);
|
|
219
|
+
const board = federatedLeaderboard({ reputations: Array.from(reps.values()) });
|
|
220
|
+
expect(board.length).toBeGreaterThan(0);
|
|
221
|
+
}, 60_000);
|
|
222
|
+
it("computeMarketStats counts correctly across 1000 ops", () => {
|
|
223
|
+
const tasks = [];
|
|
224
|
+
const bids = [];
|
|
225
|
+
const outcomes = [];
|
|
226
|
+
const reps = [];
|
|
227
|
+
for (let i = 0; i < 1000; i++) {
|
|
228
|
+
const t = postTask({ intent: "x", acceptanceCriteria: [], maxBudgetCents: 100, postedBy: "u", postedAtMs: i, secret: SECRET });
|
|
229
|
+
tasks.push(t);
|
|
230
|
+
}
|
|
231
|
+
const s = computeMarketStats({ tasks, bids, outcomes, reputations: reps });
|
|
232
|
+
expect(s.totalTasks).toBe(1000);
|
|
233
|
+
expect(formatMarketLine(s)).toContain("MARKET");
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
//# sourceMappingURL=outcome_market.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcome_market.test.js","sourceRoot":"","sources":["../../src/outcome_market/outcome_market.test.ts"],"names":[],"mappings":"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"}
|