@bongos/core 1.19.396 → 1.19.397
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/.bongos-core.json +125 -15
- package/.claude/skills/design/SKILL.md +1 -1
- package/docs/file-map.md +1 -1
- package/docs/recipes/ui-look-before-you-ship.md +113 -0
- package/modules/hall-ui/public/ranks.states.json +15 -0
- package/modules/ui-design/kit/README.md +12 -2
- package/modules/ui-design/kit/check-mock.js +147 -0
- package/modules/ui-design/kit/contrast.js +156 -0
- package/modules/ui-design/kit/fixtures/cost-summary.json +1 -0
- package/modules/ui-design/kit/fixtures/featured.json +1 -0
- package/modules/ui-design/kit/fixtures/leaderboard.json +1 -0
- package/modules/ui-design/kit/fixtures/me.json +9 -0
- package/modules/ui-design/kit/fixtures/my-projects.json +1 -0
- package/modules/ui-design/kit/fixtures/progress.json +1 -0
- package/modules/ui-design/kit/fixtures/recent-shipped.json +1 -0
- package/modules/ui-design/kit/lib.js +389 -0
- package/modules/ui-design/kit/png.js +51 -0
- package/modules/ui-design/kit/probe.js +100 -0
- package/modules/ui-design/kit/render.js +137 -0
- package/modules/ui-design/kit/serve.js +178 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/public-landing/index.probes.json +37 -0
- package/public-landing/index.states.json +16 -0
- package/public-landing/projects.probes.json +79 -0
- package/public-landing/projects.states.json +25 -0
- package/scripts/gds/ui-kit-transform.js +43 -0
- package/src/bongos/module-scope-map.js +1 -0
- package/src/module-api.js +3 -1
- package/tests/ui_design_kit.mjs +217 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
// contrast.js — the contrast probe (task 1003320, ADR 0197), three ways:
|
|
4
|
+
// --pack the instance's branding pack: every ink on every ground,
|
|
5
|
+
// light values from the pack (pure; no browser)
|
|
6
|
+
// --url <url> | --file <html> walk every visible text element in dark + light
|
|
7
|
+
// and compute the real WCAG ratio against its COMPOSITED
|
|
8
|
+
// background (the degraded static detector cannot do this)
|
|
9
|
+
// --glyphs <sel,sel> with --url/--file: screenshot each element and read the
|
|
10
|
+
// glyph pixels — the extreme luminance against the local
|
|
11
|
+
// ground's median — for text over a moving or textured
|
|
12
|
+
// ground where the stylesheet cannot say what is under it
|
|
13
|
+
//
|
|
14
|
+
// node modules/ui-design/kit/contrast.js --pack
|
|
15
|
+
// node modules/ui-design/kit/contrast.js --url http://127.0.0.1:3412/projects [--modes dark,light] [--glyphs "#projTrig,.foot a"]
|
|
16
|
+
// node modules/ui-design/kit/contrast.js --file docs/design/mocks/hub/v2.html
|
|
17
|
+
//
|
|
18
|
+
// Body text needs 4.5:1, large text (≥24px, or ≥18.66px bold) 3:1. Exit 0 clean ·
|
|
19
|
+
// 1 failures · 2 usage · 3 no browser.
|
|
20
|
+
const fs = require('node:fs');
|
|
21
|
+
const os = require('node:os');
|
|
22
|
+
const path = require('node:path');
|
|
23
|
+
const lib = require('./lib.js');
|
|
24
|
+
|
|
25
|
+
// The pack pairs (pure). The pack carries the LIGHT values of the fifteen; the
|
|
26
|
+
// dark twins live in the instance's world sheet, which the page walk measures.
|
|
27
|
+
const PACK_PAIRS = Object.freeze([
|
|
28
|
+
['ink', 'bg'], ['ink', 'bgCard'], ['ink', 'bgFrame'], ['ink', 'bgDeep'],
|
|
29
|
+
['inkSoft', 'bg'], ['inkSoft', 'bgCard'], ['inkFaint', 'bg'], ['inkFaint', 'bgCard'],
|
|
30
|
+
['accentDeep', 'bg'], ['accentDeep', 'bgCard'],
|
|
31
|
+
]);
|
|
32
|
+
function packContrast(pack, { need = 4.5 } = {}) {
|
|
33
|
+
const colors = lib.packColors(pack);
|
|
34
|
+
return PACK_PAIRS.map(([fg, bg]) => {
|
|
35
|
+
const f = lib.parseColor(colors[fg]), b = lib.parseColor(colors[bg]);
|
|
36
|
+
if (!f || !b) return { fg, bg, ratio: null, need, ok: null, note: 'token missing or not a plain colour' };
|
|
37
|
+
const ratio = lib.contrastRatio(lib.composite(f, b), b);
|
|
38
|
+
return { fg, bg, ratio: +ratio.toFixed(2), need, ok: ratio >= need };
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Runs IN THE PAGE: every element that owns visible text, its colour composited
|
|
43
|
+
// over every ancestor background down to the page ground.
|
|
44
|
+
function walkInPage() {
|
|
45
|
+
const parse = (c) => { const m = c.match(/rgba?\(([\d.]+),\s*([\d.]+),\s*([\d.]+)(?:,\s*([\d.]+))?\)/); return m ? [+m[1], +m[2], +m[3], m[4] === undefined ? 1 : +m[4]] : null; };
|
|
46
|
+
const over = (fg, bg) => { const a = fg[3]; return [fg[0] * a + bg[0] * (1 - a), fg[1] * a + bg[1] * (1 - a), fg[2] * a + bg[2] * (1 - a), 1]; };
|
|
47
|
+
const lum = (c) => { const f = (v) => { v /= 255; return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); }; return 0.2126 * f(c[0]) + 0.7152 * f(c[1]) + 0.0722 * f(c[2]); };
|
|
48
|
+
const ratio = (a, b) => { const l1 = lum(a), l2 = lum(b); const [h, l] = l1 > l2 ? [l1, l2] : [l2, l1]; return (h + 0.05) / (l + 0.05); };
|
|
49
|
+
const effBg = (el) => {
|
|
50
|
+
const stack = [];
|
|
51
|
+
for (let n = el; n && n !== document.documentElement; n = n.parentElement) { const c = parse(getComputedStyle(n).backgroundColor); if (c && c[3] > 0) stack.push(c); }
|
|
52
|
+
let base = parse(getComputedStyle(document.body).backgroundColor) || [255, 255, 255, 1];
|
|
53
|
+
if (base[3] < 1) base = over(base, [255, 255, 255, 1]);
|
|
54
|
+
let acc = base;
|
|
55
|
+
for (let i = stack.length - 1; i >= 0; i--) acc = over(stack[i], acc);
|
|
56
|
+
return acc;
|
|
57
|
+
};
|
|
58
|
+
const out = [], seen = new Set();
|
|
59
|
+
document.querySelectorAll('body *').forEach((el) => {
|
|
60
|
+
if (el.closest('[hidden]') || el.closest('.vh') || el.classList.contains('vh')) return;
|
|
61
|
+
const r = el.getBoundingClientRect();
|
|
62
|
+
if (r.width < 2 || r.height < 2) return;
|
|
63
|
+
const cs = getComputedStyle(el);
|
|
64
|
+
if (cs.visibility === 'hidden' || cs.display === 'none' || +cs.opacity === 0) return;
|
|
65
|
+
const own = Array.from(el.childNodes).some((n) => n.nodeType === 3 && n.textContent.trim().length > 1);
|
|
66
|
+
const ph = el.tagName === 'INPUT' && el.placeholder;
|
|
67
|
+
if (!own && !ph) return;
|
|
68
|
+
const size = parseFloat(cs.fontSize), weight = +cs.fontWeight || 400;
|
|
69
|
+
const need = (size >= 24 || (size >= 18.66 && weight >= 700)) ? 3 : 4.5;
|
|
70
|
+
let fg = parse(ph ? getComputedStyle(el, '::placeholder').color : cs.color);
|
|
71
|
+
if (!fg) return;
|
|
72
|
+
const bg = effBg(el);
|
|
73
|
+
if (fg[3] < 1) fg = over(fg, bg);
|
|
74
|
+
const cr = ratio(fg, bg);
|
|
75
|
+
const label = (ph ? '[placeholder] ' : '') + (el.textContent || el.placeholder || '').trim().slice(0, 42).replace(/\s+/g, ' ');
|
|
76
|
+
const key = label + '|' + Math.round(cr * 10);
|
|
77
|
+
if (seen.has(key)) return;
|
|
78
|
+
seen.add(key);
|
|
79
|
+
const hex = (c) => '#' + c.slice(0, 3).map((v) => Math.round(v).toString(16).padStart(2, '0')).join('');
|
|
80
|
+
out.push({ ok: cr >= need, ratio: +cr.toFixed(2), need, size, weight, fg: hex(fg), bg: hex(bg), label });
|
|
81
|
+
});
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// The glyph-pixel probe: the element's screenshot vs its parent's — the darkest
|
|
86
|
+
// (or lightest) pixel of the glyph box against the median of the ground box.
|
|
87
|
+
async function glyphContrast(page, selector) {
|
|
88
|
+
const { decode, px } = require('./png.js');
|
|
89
|
+
const el = await page.$(selector);
|
|
90
|
+
if (!el) return { selector, error: 'no element' };
|
|
91
|
+
const box = await el.boundingBox();
|
|
92
|
+
if (!box || box.width < 1 || box.height < 1) return { selector, error: 'no box' };
|
|
93
|
+
const parent = await el.evaluateHandle((e) => e.parentElement || e);
|
|
94
|
+
const pbox = (await parent.asElement().boundingBox()) || box;
|
|
95
|
+
const shot = decode(await page.screenshot({ clip: { x: Math.floor(pbox.x), y: Math.floor(pbox.y), width: Math.ceil(pbox.width), height: Math.ceil(pbox.height) } }));
|
|
96
|
+
const lum = (c) => lib.luminance(c);
|
|
97
|
+
const ground = [];
|
|
98
|
+
for (let y = 0; y < shot.h; y++) for (let x = 0; x < shot.w; x++) ground.push(lum(px(shot, x, y)));
|
|
99
|
+
ground.sort((a, b) => a - b);
|
|
100
|
+
const med = ground[Math.floor(ground.length / 2)];
|
|
101
|
+
const gx0 = Math.max(0, Math.floor(box.x - pbox.x)), gy0 = Math.max(0, Math.floor(box.y - pbox.y));
|
|
102
|
+
let ext = med;
|
|
103
|
+
for (let y = gy0; y < Math.min(shot.h, gy0 + Math.ceil(box.height)); y++) for (let x = gx0; x < Math.min(shot.w, gx0 + Math.ceil(box.width)); x++) {
|
|
104
|
+
const l = lum(px(shot, x, y));
|
|
105
|
+
if (Math.abs(l - med) > Math.abs(ext - med)) ext = l;
|
|
106
|
+
}
|
|
107
|
+
const ratio = (Math.max(ext, med) + 0.05) / (Math.min(ext, med) + 0.05);
|
|
108
|
+
return { selector, ratio: +ratio.toFixed(2), ground: +med.toFixed(4), glyph: +ext.toFixed(4) };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async function main() {
|
|
112
|
+
const args = process.argv.slice(2);
|
|
113
|
+
if (lib.hasFlag(args, '--help')) { process.stderr.write('usage: node modules/ui-design/kit/contrast.js --pack | --url <url> | --file <html> [--modes dark,light] [--glyphs sel,sel]\n'); process.exit(lib.EXIT.USAGE); }
|
|
114
|
+
const url = lib.argOf(args, '--url', null), file = lib.argOf(args, '--file', null);
|
|
115
|
+
let failures = 0;
|
|
116
|
+
if (lib.hasFlag(args, '--pack') || (!url && !file)) {
|
|
117
|
+
const rows = packContrast(lib.instancePack());
|
|
118
|
+
process.stdout.write('the pack (light values):\n');
|
|
119
|
+
for (const r of rows) { process.stdout.write(` ${r.ok === null ? 'SKIP' : r.ok ? 'PASS' : 'FAIL'} ${String(r.fg).padEnd(11)} on ${String(r.bg).padEnd(8)} ${r.ratio === null ? r.note : r.ratio + ':1 (need ' + r.need + ')'}\n`); if (r.ok === false) failures++; }
|
|
120
|
+
if (!url && !file) { process.stdout.write(failures ? `\n${failures} pack pair(s) below the floor\n` : '\nPACK CLEAN\n'); process.exit(failures ? lib.EXIT.PROBLEMS : lib.EXIT.CLEAN); }
|
|
121
|
+
}
|
|
122
|
+
const target = url || ('file:///' + encodeURI(path.resolve(file).replace(/\\/g, '/')));
|
|
123
|
+
const modes = lib.listArg(args, '--modes', [...lib.MODES]);
|
|
124
|
+
const glyphs = lib.listArg(args, '--glyphs', []);
|
|
125
|
+
let browser;
|
|
126
|
+
try { browser = await lib.launchBrowser(); } catch (e) { process.stderr.write(`contrast: ${e.message}\n`); process.exit(lib.EXIT.NO_BROWSER); }
|
|
127
|
+
const out = path.join(os.tmpdir(), 'ui-design-kit', 'contrast');
|
|
128
|
+
fs.mkdirSync(out, { recursive: true });
|
|
129
|
+
try {
|
|
130
|
+
for (const mode of modes) {
|
|
131
|
+
const ctx = await browser.newContext({ viewport: { width: 1440, height: 900 }, colorScheme: mode });
|
|
132
|
+
const page = await ctx.newPage();
|
|
133
|
+
await page.goto(lib.withMode(target, mode), { waitUntil: 'load' });
|
|
134
|
+
await page.evaluate(() => document.fonts.ready);
|
|
135
|
+
await page.waitForTimeout(400);
|
|
136
|
+
const rows = await page.evaluate(walkInPage);
|
|
137
|
+
const fails = rows.filter((r) => !r.ok);
|
|
138
|
+
process.stdout.write(`\n${mode}: ${rows.length} text element(s), ${fails.length ? fails.length + ' FAIL' : 'all pairs pass'}\n`);
|
|
139
|
+
for (const f of fails) process.stdout.write(` FAIL ${f.ratio} (need ${f.need}) ${f.size}px/${f.weight} ${f.fg} on ${f.bg} "${f.label}"\n`);
|
|
140
|
+
failures += fails.length;
|
|
141
|
+
for (const sel of glyphs) {
|
|
142
|
+
const g = await glyphContrast(page, sel);
|
|
143
|
+
if (g.error) { process.stdout.write(` glyph ${sel}: ${g.error}\n`); continue; }
|
|
144
|
+
const ok = g.ratio >= 4.5;
|
|
145
|
+
if (!ok) failures++;
|
|
146
|
+
process.stdout.write(` ${ok ? 'PASS' : 'FAIL'} glyph ${sel}: ${g.ratio}:1 against the local ground (median L ${g.ground}, glyph extreme L ${g.glyph})\n`);
|
|
147
|
+
}
|
|
148
|
+
await ctx.close();
|
|
149
|
+
}
|
|
150
|
+
} finally { await browser.close(); }
|
|
151
|
+
process.stdout.write(failures ? `\n${failures} contrast failure(s)\n` : '\nCONTRAST CLEAN\n');
|
|
152
|
+
process.exit(failures ? lib.EXIT.PROBLEMS : lib.EXIT.CLEAN);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (require.main === module) main().catch((e) => { process.stderr.write(`contrast: ${e.stack || e.message}\n`); process.exit(lib.EXIT.USAGE); });
|
|
156
|
+
module.exports = { packContrast, PACK_PAIRS };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"total_usd":48297.3354,"total_value_credits":69790,"by_category":[{"category":"api","total_usd":47930.4111},{"category":"infra","total_usd":261.19},{"category":"compute","total_usd":83.5806},{"category":"domain","total_usd":11.16},{"category":"art","total_usd":10.9937}],"by_builder":[{"builder_id":3,"github_login":"lars589","display_name":"lars589","total_usd":30658.5341},{"builder_id":1000095,"github_login":"jaxri","display_name":"Percy Jackson","total_usd":13067.246},{"builder_id":1000025,"github_login":"IAMMASTERQUA","display_name":"IAMMASTERQUA","total_usd":3533.1156},{"builder_id":1000094,"github_login":"scootermack","display_name":"scootermack","total_usd":698.447},{"builder_id":null,"github_login":null,"display_name":null,"total_usd":278.4037},{"builder_id":1000003,"github_login":"LarsCode","display_name":"LarsCode","total_usd":38.2821},{"builder_id":1000070,"github_login":"kingaonline","display_name":"kingaonline","total_usd":21.8206},{"builder_id":1000051,"github_login":"MrTenkpro","display_name":"MrTenkpro","total_usd":1.0843},{"builder_id":1000027,"github_login":"willHermesLines","display_name":"willHermesLines","total_usd":0.2127},{"builder_id":1000057,"github_login":"largekristensen-svg","display_name":"largekristensen-svg","total_usd":0.1144},{"builder_id":1000160,"github_login":"scottymccormack","display_name":"scottymccormack","total_usd":0.0375},{"builder_id":1000071,"github_login":"erikwils","display_name":"erikwils","total_usd":0.0374}],"daily":[{"day":"2026-05-09T00:00:00.000Z","amount_usd":6.0537},{"day":"2026-05-10T00:00:00.000Z","amount_usd":32.16},{"day":"2026-05-11T00:00:00.000Z","amount_usd":0},{"day":"2026-05-12T00:00:00.000Z","amount_usd":240.19},{"day":"2026-05-13T00:00:00.000Z","amount_usd":0},{"day":"2026-05-14T00:00:00.000Z","amount_usd":0},{"day":"2026-05-15T00:00:00.000Z","amount_usd":0},{"day":"2026-05-16T00:00:00.000Z","amount_usd":0},{"day":"2026-05-17T00:00:00.000Z","amount_usd":0},{"day":"2026-05-18T00:00:00.000Z","amount_usd":0},{"day":"2026-05-19T00:00:00.000Z","amount_usd":0},{"day":"2026-05-20T00:00:00.000Z","amount_usd":0},{"day":"2026-05-21T00:00:00.000Z","amount_usd":0},{"day":"2026-05-22T00:00:00.000Z","amount_usd":0},{"day":"2026-05-23T00:00:00.000Z","amount_usd":0},{"day":"2026-05-24T00:00:00.000Z","amount_usd":0},{"day":"2026-05-25T00:00:00.000Z","amount_usd":0},{"day":"2026-05-26T00:00:00.000Z","amount_usd":0},{"day":"2026-05-27T00:00:00.000Z","amount_usd":0},{"day":"2026-05-28T00:00:00.000Z","amount_usd":0},{"day":"2026-05-29T00:00:00.000Z","amount_usd":0},{"day":"2026-05-30T00:00:00.000Z","amount_usd":0},{"day":"2026-05-31T00:00:00.000Z","amount_usd":0},{"day":"2026-06-01T00:00:00.000Z","amount_usd":0},{"day":"2026-06-02T00:00:00.000Z","amount_usd":0},{"day":"2026-06-03T00:00:00.000Z","amount_usd":239.4002},{"day":"2026-06-04T00:00:00.000Z","amount_usd":485.1995},{"day":"2026-06-05T00:00:00.000Z","amount_usd":430.9411},{"day":"2026-06-06T00:00:00.000Z","amount_usd":1478.0906},{"day":"2026-06-07T00:00:00.000Z","amount_usd":393.6456},{"day":"2026-06-08T00:00:00.000Z","amount_usd":241.4908},{"day":"2026-06-09T00:00:00.000Z","amount_usd":228.2682},{"day":"2026-06-10T00:00:00.000Z","amount_usd":31.468},{"day":"2026-06-11T00:00:00.000Z","amount_usd":918.6892},{"day":"2026-06-12T00:00:00.000Z","amount_usd":208.6502},{"day":"2026-06-13T00:00:00.000Z","amount_usd":1203.0003},{"day":"2026-06-14T00:00:00.000Z","amount_usd":391.6629},{"day":"2026-06-15T00:00:00.000Z","amount_usd":414.8282},{"day":"2026-06-16T00:00:00.000Z","amount_usd":333.9166},{"day":"2026-06-17T00:00:00.000Z","amount_usd":203.6305},{"day":"2026-06-18T00:00:00.000Z","amount_usd":254.6484},{"day":"2026-06-19T00:00:00.000Z","amount_usd":488.0607},{"day":"2026-06-20T00:00:00.000Z","amount_usd":1768.9432},{"day":"2026-06-21T00:00:00.000Z","amount_usd":3318.8646},{"day":"2026-06-22T00:00:00.000Z","amount_usd":307.7101},{"day":"2026-06-23T00:00:00.000Z","amount_usd":1001.533},{"day":"2026-06-24T00:00:00.000Z","amount_usd":627.5685},{"day":"2026-06-25T00:00:00.000Z","amount_usd":606.0735},{"day":"2026-06-26T00:00:00.000Z","amount_usd":552.4971},{"day":"2026-06-27T00:00:00.000Z","amount_usd":846.3213},{"day":"2026-06-28T00:00:00.000Z","amount_usd":17.5431},{"day":"2026-06-29T00:00:00.000Z","amount_usd":8.2741},{"day":"2026-06-30T00:00:00.000Z","amount_usd":169.3512},{"day":"2026-07-01T00:00:00.000Z","amount_usd":167.6376},{"day":"2026-07-02T00:00:00.000Z","amount_usd":727.9217},{"day":"2026-07-03T00:00:00.000Z","amount_usd":1943.9488},{"day":"2026-07-04T00:00:00.000Z","amount_usd":1094.3441},{"day":"2026-07-05T00:00:00.000Z","amount_usd":550.5321},{"day":"2026-07-06T00:00:00.000Z","amount_usd":57.0786},{"day":"2026-07-07T00:00:00.000Z","amount_usd":215.282},{"day":"2026-07-08T00:00:00.000Z","amount_usd":244.0418},{"day":"2026-07-09T00:00:00.000Z","amount_usd":524.6214},{"day":"2026-07-10T00:00:00.000Z","amount_usd":578.2538},{"day":"2026-07-11T00:00:00.000Z","amount_usd":0.4829},{"day":"2026-07-12T00:00:00.000Z","amount_usd":0},{"day":"2026-07-13T00:00:00.000Z","amount_usd":0},{"day":"2026-07-14T00:00:00.000Z","amount_usd":0},{"day":"2026-07-15T00:00:00.000Z","amount_usd":0.0921},{"day":"2026-07-16T00:00:00.000Z","amount_usd":0},{"day":"2026-07-17T00:00:00.000Z","amount_usd":0},{"day":"2026-07-18T00:00:00.000Z","amount_usd":0.0939},{"day":"2026-07-19T00:00:00.000Z","amount_usd":0},{"day":"2026-07-20T00:00:00.000Z","amount_usd":0},{"day":"2026-07-21T00:00:00.000Z","amount_usd":0},{"day":"2026-07-22T00:00:00.000Z","amount_usd":0},{"day":"2026-07-23T00:00:00.000Z","amount_usd":5.5229},{"day":"2026-07-24T00:00:00.000Z","amount_usd":2901.8959},{"day":"2026-07-25T00:00:00.000Z","amount_usd":51.5704},{"day":"2026-07-26T00:00:00.000Z","amount_usd":20.432},{"day":"2026-07-27T00:00:00.000Z","amount_usd":52.624},{"day":"2026-07-28T00:00:00.000Z","amount_usd":1139.1918},{"day":"2026-07-29T00:00:00.000Z","amount_usd":123.8112},{"day":"2026-07-30T00:00:00.000Z","amount_usd":131.2881},{"day":"2026-07-31T00:00:00.000Z","amount_usd":21.8349},{"day":"2026-08-01T00:00:00.000Z","amount_usd":0},{"day":"2026-08-02T00:00:00.000Z","amount_usd":0},{"day":"2026-08-03T00:00:00.000Z","amount_usd":0},{"day":"2026-08-04T00:00:00.000Z","amount_usd":0},{"day":"2026-08-05T00:00:00.000Z","amount_usd":255.652},{"day":"2026-08-06T00:00:00.000Z","amount_usd":135.4723},{"day":"2026-08-07T00:00:00.000Z","amount_usd":40.2176},{"day":"2026-08-08T00:00:00.000Z","amount_usd":204.6554},{"day":"2026-08-09T00:00:00.000Z","amount_usd":16.9081},{"day":"2026-08-10T00:00:00.000Z","amount_usd":2.0357},{"day":"2026-08-11T00:00:00.000Z","amount_usd":190.6169},{"day":"2026-08-12T00:00:00.000Z","amount_usd":270.2865},{"day":"2026-08-13T00:00:00.000Z","amount_usd":354.4474},{"day":"2026-08-14T00:00:00.000Z","amount_usd":138.1535},{"day":"2026-08-15T00:00:00.000Z","amount_usd":229.4178},{"day":"2026-08-16T00:00:00.000Z","amount_usd":219.6932},{"day":"2026-08-17T00:00:00.000Z","amount_usd":380.8994},{"day":"2026-08-18T00:00:00.000Z","amount_usd":450.2161},{"day":"2026-08-19T00:00:00.000Z","amount_usd":52.9249},{"day":"2026-08-20T00:00:00.000Z","amount_usd":20.9651},{"day":"2026-08-21T00:00:00.000Z","amount_usd":32.5102},{"day":"2026-08-22T00:00:00.000Z","amount_usd":62.1622},{"day":"2026-08-23T00:00:00.000Z","amount_usd":79.9698},{"day":"2026-08-24T00:00:00.000Z","amount_usd":15925.6228},{"day":"2026-08-25T00:00:00.000Z","amount_usd":1125.286},{"day":"2026-08-26T00:00:00.000Z","amount_usd":0},{"day":"2026-08-27T00:00:00.000Z","amount_usd":108.0461}],"daily_credits":[{"day":"2026-05-09T00:00:00.000Z","credits":122},{"day":"2026-05-10T00:00:00.000Z","credits":427},{"day":"2026-05-11T00:00:00.000Z","credits":787},{"day":"2026-05-12T00:00:00.000Z","credits":367},{"day":"2026-05-13T00:00:00.000Z","credits":115},{"day":"2026-05-14T00:00:00.000Z","credits":50},{"day":"2026-05-15T00:00:00.000Z","credits":0},{"day":"2026-05-16T00:00:00.000Z","credits":0},{"day":"2026-05-17T00:00:00.000Z","credits":120},{"day":"2026-05-18T00:00:00.000Z","credits":40},{"day":"2026-05-19T00:00:00.000Z","credits":0},{"day":"2026-05-20T00:00:00.000Z","credits":0},{"day":"2026-05-21T00:00:00.000Z","credits":0},{"day":"2026-05-22T00:00:00.000Z","credits":0},{"day":"2026-05-23T00:00:00.000Z","credits":0},{"day":"2026-05-24T00:00:00.000Z","credits":0},{"day":"2026-05-25T00:00:00.000Z","credits":0},{"day":"2026-05-26T00:00:00.000Z","credits":490},{"day":"2026-05-27T00:00:00.000Z","credits":403},{"day":"2026-05-28T00:00:00.000Z","credits":1108},{"day":"2026-05-29T00:00:00.000Z","credits":507},{"day":"2026-05-30T00:00:00.000Z","credits":590},{"day":"2026-05-31T00:00:00.000Z","credits":0},{"day":"2026-06-01T00:00:00.000Z","credits":71},{"day":"2026-06-02T00:00:00.000Z","credits":112},{"day":"2026-06-03T00:00:00.000Z","credits":252},{"day":"2026-06-04T00:00:00.000Z","credits":412},{"day":"2026-06-05T00:00:00.000Z","credits":360},{"day":"2026-06-06T00:00:00.000Z","credits":710},{"day":"2026-06-07T00:00:00.000Z","credits":63},{"day":"2026-06-08T00:00:00.000Z","credits":0},{"day":"2026-06-09T00:00:00.000Z","credits":0},{"day":"2026-06-10T00:00:00.000Z","credits":40},{"day":"2026-06-11T00:00:00.000Z","credits":0},{"day":"2026-06-12T00:00:00.000Z","credits":380},{"day":"2026-06-13T00:00:00.000Z","credits":1516},{"day":"2026-06-14T00:00:00.000Z","credits":1788},{"day":"2026-06-15T00:00:00.000Z","credits":458},{"day":"2026-06-16T00:00:00.000Z","credits":1465},{"day":"2026-06-17T00:00:00.000Z","credits":321},{"day":"2026-06-18T00:00:00.000Z","credits":1345},{"day":"2026-06-19T00:00:00.000Z","credits":1883},{"day":"2026-06-20T00:00:00.000Z","credits":4724},{"day":"2026-06-21T00:00:00.000Z","credits":1622},{"day":"2026-06-22T00:00:00.000Z","credits":492},{"day":"2026-06-23T00:00:00.000Z","credits":913},{"day":"2026-06-24T00:00:00.000Z","credits":978},{"day":"2026-06-25T00:00:00.000Z","credits":1348},{"day":"2026-06-26T00:00:00.000Z","credits":1409},{"day":"2026-06-27T00:00:00.000Z","credits":805},{"day":"2026-06-28T00:00:00.000Z","credits":710},{"day":"2026-06-29T00:00:00.000Z","credits":276},{"day":"2026-06-30T00:00:00.000Z","credits":559},{"day":"2026-07-01T00:00:00.000Z","credits":649},{"day":"2026-07-02T00:00:00.000Z","credits":2263},{"day":"2026-07-03T00:00:00.000Z","credits":6904},{"day":"2026-07-04T00:00:00.000Z","credits":3534},{"day":"2026-07-05T00:00:00.000Z","credits":2332},{"day":"2026-07-06T00:00:00.000Z","credits":116},{"day":"2026-07-07T00:00:00.000Z","credits":717},{"day":"2026-07-08T00:00:00.000Z","credits":710},{"day":"2026-07-09T00:00:00.000Z","credits":1112},{"day":"2026-07-10T00:00:00.000Z","credits":2230},{"day":"2026-07-11T00:00:00.000Z","credits":0},{"day":"2026-07-12T00:00:00.000Z","credits":499},{"day":"2026-07-13T00:00:00.000Z","credits":227},{"day":"2026-07-14T00:00:00.000Z","credits":1512},{"day":"2026-07-15T00:00:00.000Z","credits":1047},{"day":"2026-07-16T00:00:00.000Z","credits":371},{"day":"2026-07-17T00:00:00.000Z","credits":250},{"day":"2026-07-18T00:00:00.000Z","credits":91},{"day":"2026-07-19T00:00:00.000Z","credits":45},{"day":"2026-07-20T00:00:00.000Z","credits":0},{"day":"2026-07-21T00:00:00.000Z","credits":0},{"day":"2026-07-22T00:00:00.000Z","credits":6},{"day":"2026-07-23T00:00:00.000Z","credits":0},{"day":"2026-07-24T00:00:00.000Z","credits":404},{"day":"2026-07-25T00:00:00.000Z","credits":29},{"day":"2026-07-26T00:00:00.000Z","credits":44},{"day":"2026-07-27T00:00:00.000Z","credits":17},{"day":"2026-07-28T00:00:00.000Z","credits":1172},{"day":"2026-07-29T00:00:00.000Z","credits":270},{"day":"2026-07-30T00:00:00.000Z","credits":98},{"day":"2026-07-31T00:00:00.000Z","credits":0},{"day":"2026-08-01T00:00:00.000Z","credits":0},{"day":"2026-08-02T00:00:00.000Z","credits":0},{"day":"2026-08-03T00:00:00.000Z","credits":40},{"day":"2026-08-04T00:00:00.000Z","credits":131},{"day":"2026-08-05T00:00:00.000Z","credits":538},{"day":"2026-08-06T00:00:00.000Z","credits":429},{"day":"2026-08-07T00:00:00.000Z","credits":37},{"day":"2026-08-08T00:00:00.000Z","credits":460},{"day":"2026-08-09T00:00:00.000Z","credits":0},{"day":"2026-08-10T00:00:00.000Z","credits":0},{"day":"2026-08-11T00:00:00.000Z","credits":1073},{"day":"2026-08-12T00:00:00.000Z","credits":886},{"day":"2026-08-13T00:00:00.000Z","credits":757},{"day":"2026-08-14T00:00:00.000Z","credits":754},{"day":"2026-08-15T00:00:00.000Z","credits":404},{"day":"2026-08-16T00:00:00.000Z","credits":1137},{"day":"2026-08-17T00:00:00.000Z","credits":1102},{"day":"2026-08-18T00:00:00.000Z","credits":1498},{"day":"2026-08-19T00:00:00.000Z","credits":968},{"day":"2026-08-20T00:00:00.000Z","credits":152},{"day":"2026-08-21T00:00:00.000Z","credits":497},{"day":"2026-08-22T00:00:00.000Z","credits":317},{"day":"2026-08-23T00:00:00.000Z","credits":558},{"day":"2026-08-24T00:00:00.000Z","credits":200},{"day":"2026-08-25T00:00:00.000Z","credits":963},{"day":"2026-08-26T00:00:00.000Z","credits":32},{"day":"2026-08-27T00:00:00.000Z","credits":70}],"by_source":[{"source":"session:interactive","total_usd":35486.31},{"source":"session","total_usd":9947.95},{"source":"grader","total_usd":1320.5},{"source":"session:subagent","total_usd":1169.65},{"source":"manual","total_usd":283.29},{"source":"box-lifecycle","total_usd":83.52},{"source":"art_pipeline","total_usd":6.05},{"source":"box-storage","total_usd":0.06},{"source":"box-spinup","total_usd":0}],"by_tier":{"fresh_input_usd":374.25,"cache_read_usd":22557.96,"cache_write_usd":7239.34,"output_usd":6484.43,"tier_total_usd":36655.98,"cache_read_pct":61.54},"savings":{"by_system":[],"total_baseline_usd":0,"total_amount_usd":0,"total_saved_usd":0},"cost_calibration":{"by_kind":[{"kind":"(all)","median_cost_per_task":2.0868,"median_cost_per_credit":0.0521,"sample_size":467},{"kind":"bug","median_cost_per_task":1.9791,"median_cost_per_credit":0.0509,"sample_size":172},{"kind":"feature","median_cost_per_task":2.2908,"median_cost_per_credit":0.0493,"sample_size":172},{"kind":"infra","median_cost_per_task":2.1053,"median_cost_per_credit":0.0642,"sample_size":30},{"kind":"decision","median_cost_per_task":1.7938,"median_cost_per_credit":0.0557,"sample_size":25},{"kind":"cleanup","median_cost_per_task":1.6627,"median_cost_per_credit":0.1006,"sample_size":20},{"kind":"refactor","median_cost_per_task":3.6518,"median_cost_per_credit":0.0913,"sample_size":17},{"kind":"spike","median_cost_per_task":1.7982,"median_cost_per_credit":0.0439,"sample_size":12},{"kind":"verify","median_cost_per_task":0.911,"median_cost_per_credit":0.0257,"sample_size":12},{"kind":"learning-capture","median_cost_per_task":0.9948,"median_cost_per_credit":0.0417,"sample_size":6},{"kind":"blocker-resolution","median_cost_per_task":1.7223,"median_cost_per_credit":0.0453,"sample_size":1}],"overall":{"kind":"(all)","median_cost_per_task":2.0868,"median_cost_per_credit":0.0521,"sample_size":467}},"filtered_total_usd":48297.3354,"filter_options":{"sources":["art_pipeline","box-lifecycle","box-spinup","box-storage","grader","manual","session","session:interactive","session:subagent"],"categories":["api","art","compute","domain","infra"]},"applied_filters":{"source":null,"category":null,"days":null}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"projects":[{"origin":"https://amazonprimea.com","name":"Off the Boats","tagline":"A singular shop, and a broader videogame in a persistent ancient Greek world that collides with modern day commerce & products.","art_url":null,"type":"game","created_at":"2026-07-15T22:12:57.732Z","builders":11,"tags":["art-pipeline","character-anim","demo","game"],"owner":"lars589","owner_avatar":"https://avatars.githubusercontent.com/u/283020391?v=4"},{"origin":"https://demo.cloudbongos.com","name":"Demo","tagline":"A live demo instance on Cloud Bongos.","art_url":null,"type":null,"created_at":"2026-07-14T19:16:38.160Z","builders":1,"tags":[],"owner":"lars589","owner_avatar":"https://avatars.githubusercontent.com/u/283020391?v=4"},{"origin":"https://emersonian-circles.cloudbongos.com","name":"Emersonian Circles","tagline":"An independent project built on Cloud Bongos.","art_url":null,"type":null,"created_at":"2026-07-25T02:21:55.641Z","builders":1,"tags":[],"owner":"lars589","owner_avatar":"https://avatars.githubusercontent.com/u/283020391?v=4"}]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"leaderboard":[{"id":"3","github_login":"lars589","display_name":"lars589","avatar_url":"https://avatars.githubusercontent.com/u/283020391?v=4","total_credits":44562,"rank":"archon","achievements":["first-ship","first-claim","first-parallel-claim","streak-3","streak-7"],"tokens_used":"46073057806"},{"id":"1000095","github_login":"jaxri","display_name":"Percy Jackson","avatar_url":"https://avatars.githubusercontent.com/u/64553469?v=4","total_credits":13358,"rank":"archon","achievements":["first-ship","first-claim","first-parallel-claim","streak-3","streak-7"],"tokens_used":"12496320619"},{"id":"1000025","github_login":"IAMMASTERQUA","display_name":"IAMMASTERQUA","avatar_url":"https://avatars.githubusercontent.com/u/290184380?v=4","total_credits":3316,"rank":"archon","achievements":["first-ship","first-claim","first-parallel-claim","streak-3","streak-7"],"tokens_used":"3869488590"},{"id":"1000094","github_login":"scootermack","display_name":"scootermack","avatar_url":"https://avatars.githubusercontent.com/u/295990394?v=4","total_credits":2479,"rank":"archon","achievements":["first-ship","first-claim","first-parallel-claim","streak-3","art-pipeline-shipper"],"tokens_used":"1279046526"},{"id":"1000003","github_login":"LarsCode","display_name":"LarsCode","avatar_url":"https://avatars.githubusercontent.com/u/35337514?v=4","total_credits":44,"rank":"xenos","achievements":["first-ship","first-claim","art-pipeline-shipper"],"tokens_used":"25527381"},{"id":"1000070","github_login":"kingaonline","display_name":"kingaonline","avatar_url":"https://avatars.githubusercontent.com/u/293641659?v=4","total_credits":36,"rank":"thetes","achievements":["first-ship","first-claim","art-pipeline-shipper","breaking-the-100c-bar"],"tokens_used":"66829858"},{"id":"1000027","github_login":"willHermesLines","display_name":"willHermesLines","avatar_url":"https://avatars.githubusercontent.com/u/267458743?v=4","total_credits":12,"rank":"metic","achievements":["first-ship","first-claim"],"tokens_used":"0"},{"id":"1000071","github_login":"erikwils","display_name":"erikwils","avatar_url":"https://avatars.githubusercontent.com/u/51457175?v=4","total_credits":11,"rank":"xenos","achievements":["first-claim"],"tokens_used":"0"},{"id":"1000160","github_login":"scottymccormack","display_name":"scottymccormack","avatar_url":"https://avatars.githubusercontent.com/u/196979607?v=4","total_credits":1,"rank":"xenos","achievements":["first-claim"],"tokens_used":"0"},{"id":"1000050","github_login":"Svensson-CMD","display_name":"Svensson-CMD","avatar_url":"https://avatars.githubusercontent.com/u/290959655?v=4","total_credits":0,"rank":"xenos","achievements":[],"tokens_used":"0"},{"id":"1000051","github_login":"MrTenkpro","display_name":"MrTenkpro","avatar_url":"https://avatars.githubusercontent.com/u/291558470?v=4","total_credits":0,"rank":"xenos","achievements":[],"tokens_used":"0"},{"id":"1000057","github_login":"largekristensen-svg","display_name":"largekristensen-svg","avatar_url":"https://avatars.githubusercontent.com/u/292408002?v=4","total_credits":0,"rank":"xenos","achievements":[],"tokens_used":"0"},{"id":"1","github_login":"bfg-system","display_name":"The BFG (system)","avatar_url":null,"total_credits":0,"rank":"xenos","achievements":[],"tokens_used":"0"},{"id":"2","github_login":"discord-bot-system","display_name":"Discord Bot (system)","avatar_url":null,"total_credits":0,"rank":"xenos","achievements":[],"tokens_used":"0"},{"id":"1000128","github_login":"mcip-labs","display_name":"mcip-labs","avatar_url":"https://avatars.githubusercontent.com/u/143163903?v=4","total_credits":0,"rank":"xenos","achievements":[],"tokens_used":"0"}],"page":{"limit":100,"offset":0}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"owned":[],"building":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"progress":[{"version_id":"BONGOS-V1","name":"Cloud Bongos — platform (V1)","status":"building","shipped_count":"1111","total_count":"1561","shipped_weight":"2572","total_weight":"3537","done_when":"Bongos App V1 ships the Cloud Bongos desktop feedback tool: a Zoom-style floating toolbar that captures narrated voice + ~1/sec snapshots and freehand markup over any on-screen target, synthesizes them into one cheap, model-agnostic prompt, and hands it to Claude Desktop and Claude Code. The Dev Box desktop app is absorbed as a module of the bongos app. This is the inaugural version of the bongos line, the successor the GDS migrates into after GDS-V4. Visual element-select is deferred to V2.","criteria_count":184,"lifecycle_completed_count":0,"lifecycle_confirmed_count":0,"lifecycle_shipped_count":1111,"percent_complete":73},{"version_id":"CB-V1","name":"Cloud Bongos — Customer-0 dogfood","status":"building","shipped_count":"58","total_count":"88","shipped_weight":"169","total_weight":"223","done_when":"Cloud Bongos builds itself: real tasks ship on the customer-0 instance (claim -> grade -> ship, credits awarded), carrying no game code.","criteria_count":18,"lifecycle_completed_count":0,"lifecycle_confirmed_count":3,"lifecycle_shipped_count":55,"percent_complete":76},{"version_id":"GDS-V3","name":"PMS V3 — multi-builder readiness + per-builder credentials","status":"shipped","shipped_count":"496","total_count":"501","shipped_weight":"1141","total_weight":"1156","done_when":"Delivers multi-builder readiness: clone-and-ship onboarding under two hours, three server-enforced ranks, per-builder credentials/cost/authorship, an Opus grader gating quality, parallel-safe claims and merges, a propose-and-ratify cadence, and production-grade security with red-team bounties.","criteria_count":9,"lifecycle_completed_count":0,"lifecycle_confirmed_count":0,"lifecycle_shipped_count":496,"percent_complete":99},{"version_id":"GDS-V4","name":"GDS V4 — recall, resumable pipeline, honest measurement","status":"shipped","shipped_count":"367","total_count":"367","shipped_weight":"861","total_weight":"861","done_when":"When this is finished, a builder's session answers \"have we done this before?\" in one call instead of an afternoon — project knowledge (markdown and database prose alike) is searchable in one rank-scoped query and pushed into sessions at claim time; a failed ship is one command from resume instead of a consumed claim; the recurring tool-error classes (wrong-tree writes, HTML 404s, phantom smoke servers) are engineered away; the BFG's measurements reflect real friction so the improvement is provable against the 2026-06-12 baseline; and the city watches itself on one pane of glass. And the build system itself becomes Medusa — a standalone, configurable, self-hostable, AGPL-licensed, non-profit, AI-first platform decoupled from any one project, with Amazonprimea running as its first instance.","criteria_count":10,"lifecycle_completed_count":0,"lifecycle_confirmed_count":0,"lifecycle_shipped_count":367,"percent_complete":100},{"version_id":"PMS-V1","name":"PMS V1 — project management system, parallel internal track","status":"shipped","shipped_count":"8","total_count":"8","shipped_weight":"36","total_weight":"36","done_when":"Builders auth via GitHub. Slash commands claim/ship tasks atomically. Backlog migrated. Public status page live.","criteria_count":0,"lifecycle_completed_count":0,"lifecycle_confirmed_count":0,"lifecycle_shipped_count":8,"percent_complete":100},{"version_id":"PMS-V2","name":"PMS V2 — themed /builders UI + gamification","status":"shipped","shipped_count":"67","total_count":"67","shipped_weight":"279","total_weight":"279","done_when":"When this is finished, the citizens building Amazonprimea will keep their works on a themed ledger of their own — naming sessions, claiming tasks in batches, earning laurels for milestones, and seeing each version's scope painted in plain words.","criteria_count":7,"lifecycle_completed_count":0,"lifecycle_confirmed_count":0,"lifecycle_shipped_count":67,"percent_complete":100}]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"tasks":[{"id":"1003297","title":"Landing composition round: three versions of the approved world","value_summary":"The front page of the new chrome look is chosen: three full-page versions were built and reviewed, and the owner picked the one closest to the reference image (the two doors floating inside a big chrome blob that breathes slowly, real numbers hung off it) and decided light mode will be rebuilt properly with the chrome on a pale ground; the build can start.\n","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-27T17:59:20.501Z","credits_reward":30,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":null,"actual_minutes":132,"github_login":"jaxri","display_name":"Percy Jackson"},{"id":"1003281","title":"See what you did, by role — including every idea you filed and what became of it","value_summary":"Your profile now shows what you did craft by craft — and every idea you ever filed, with what became of it: the task it became, who merged it, why it was discarded, or that it is still open.","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-27T16:39:39.736Z","credits_reward":60,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":100,"actual_minutes":44,"github_login":"scootermack","display_name":"scootermack"},{"id":"1002505","title":"ship.js still writes no session record when the session is rooted in another project dir (the residual 1002475 leak)","value_summary":"Builders now get paid for work they ship from a session started in a different project folder — those sessions used to be recorded as if they never happened.\n","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-27T15:29:35.104Z","credits_reward":56,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":45,"actual_minutes":28,"github_login":"scootermack","display_name":"scootermack"},{"id":"1003296","title":"World round: PRODUCT.md and four style candidates across landing, hall and status","value_summary":"The new look for the whole site is chosen: liquid chrome drifting on black with a pair of chrome bongos, picked by the owner from four candidates built on the reference images; the landing, the builders' hall and the public ledger will now be rebuilt in it.\n","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-27T14:59:19.443Z","credits_reward":30,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":null,"actual_minutes":872,"github_login":"jaxri","display_name":"Percy Jackson"},{"id":"1003251","title":"Footer doors before launch: privacy, terms and contact pages linked from the landing page and the hub (owner decision 2026-08-24)","value_summary":"The site now has the three pages every real website needs — privacy, terms and a contact page — linked from the footer of the front page and the projects hub. The privacy page says plainly what is kept about a GitHub account and a project, who else sees it, and how long it stays; the contact page points at the two doors that actually exist, the repository and the builders' hall. Every project built on the platform gets the same pages under its own name, with the claims that are only true of the platform itself removed.\n","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-27T00:20:42.520Z","credits_reward":60,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":120,"actual_minutes":2,"github_login":"jaxri","display_name":"Percy Jackson"},{"id":"1002792","title":"Task titles are write-once — no route can edit one, so a wrong title is permanent","value_summary":"A task's title can now be corrected after it's created — the same people who may edit a task's body may fix its title, and every edit is recorded. Until now a wrong title was permanent, so two tasks have been carrying table names that would fail the build; those get corrected as soon as this update is live.\n","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-27T00:03:05.810Z","credits_reward":25,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":20,"actual_minutes":14,"github_login":"jaxri","display_name":"Percy Jackson"},{"id":"1003239","title":"Empty board at the end of the funnel (walk finding W4): seed the kickoff checklist at first sign-in","value_summary":"A brand-new project created from the hub used to greet its founder with an empty board. Now, the moment the founder signs in for the first time, their board holds the three things only they can do next: decide how people join (and invite the first builders), protect the main branch before a second builder arrives, and give the project its look. Projects set up by hand keep the checklist they already had.\n","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-26T23:58:07.654Z","credits_reward":60,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":120,"actual_minutes":12,"github_login":"jaxri","display_name":"Percy Jackson"},{"id":"1002889","title":"Four tests build ROOT from URL.pathname — %20 breaks require() on a Windows checkout with a space in the path","value_summary":"Three of the project's self-checks refused to even start on a Windows computer whose folder name has a space in it (like \"Cloud Bongos\") — they now start and run everywhere. A new automatic check stops the same mistake from being written again; the regular test run couldn't catch it on its own because its own folder has no space.\n","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-26T23:58:06.288Z","credits_reward":25,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":null,"actual_minutes":7,"github_login":"jaxri","display_name":"Percy Jackson"},{"id":"1003278","title":"Find your own work: goals and tasks sort and filter by creator, role, and staleness","value_summary":"You can now ask the boards the questions you could only ask an agent before: what did I create, what work is there for an artist, and what has nobody touched in a month. Tasks remember who created them from now on, and both the goal board and the task board can sort by what is rotting — using one shared definition of 'touched', so the two can never disagree.","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T23:18:41.119Z","credits_reward":60,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":120,"actual_minutes":21,"github_login":"IAMMASTERQUA","display_name":"IAMMASTERQUA"},{"id":"1003044","title":"Joinability setting: open / apply-to-join / invite-only","value_summary":"A project's owner now chooses how people join it — anyone can join, apply to join, or invite only — and the project enforces it: sign-in self-enrols only on an open project, the apply form refuses on an invite-only one (and says why), and an Archon can invite someone by GitHub username from the Watch page. The manage page's last \"isn't wired up\" placeholder is gone.\n","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T23:10:14.926Z","credits_reward":60,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":120,"actual_minutes":46,"github_login":"jaxri","display_name":"Percy Jackson"},{"id":"1002802","title":"P06 · \"Complete your profile\" needs-attention inbox line item (dismissible)","value_summary":"New builders now get a gentle, dismissible reminder to finish their profile — shown as a line in the existing 'Needs your attention' list rather than a pop-up or an extra sign-up step. Dismissing it sticks across every device they use.","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T22:29:39.859Z","credits_reward":60,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":120,"actual_minutes":52,"github_login":"lars589","display_name":"lars589"},{"id":"1003202","title":"Move npm publish to OIDC trusted publishing (drop the long-lived token)","value_summary":"Publishing the core no longer relies on a stored password. The build now proves who it is at the moment it publishes, using a credential that lasts seconds instead of months — closing the last item on the security cleanup, and removing exactly the kind of secret last year's npm attacks stole.","version_id":"CB-V1","status":"shipped","shipped_at":"2026-08-25T22:24:38.714Z","credits_reward":60,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":90,"actual_minutes":28,"github_login":"lars589","display_name":"lars589"},{"id":"1003277","title":"Claude assigns a goal's category at creation — and asks the human to name a new one when it cannot","value_summary":"When a goal is created without a category, the response now nudges whoever created it — here is the live set, pick one, or ask a human to name a new one. The goal-creation playbook does the same: Claude proposes a category with the rest of the draft, and when nothing fits it asks you to name a new one instead of guessing. Skipping the label is always allowed — it is a prompt, never an error.","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T22:21:58.583Z","credits_reward":60,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":60,"actual_minutes":6,"github_login":"IAMMASTERQUA","display_name":"IAMMASTERQUA"},{"id":"1003292","title":"Goal board cleanup: retire goals 1000009 + 1000028, re-scope 1000027 to the grep-findability toolset","value_summary":"Goal board cleanup: three stale goals retired. The animation-module goal, the Findability junk drawer, and the Autonomy groundwork chain are archived; 25 dead tasks abandoned, 2 live ones relocated to the goals that actually own them.","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T22:18:37.323Z","credits_reward":18,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":null,"actual_minutes":14,"github_login":"lars589","display_name":"lars589"},{"id":"1003276","title":"The hall shows a goal's category and filters by it — and a task shows the one it inherits","value_summary":"The goal board now shows what each goal is about — a Security chip, an Economics chip — and you can narrow the page to one category, or to the goals nobody has categorised yet. A task shows the category it inherits from its goal, and its goal link finally shows the goal's name instead of just its number.","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T22:12:28.981Z","credits_reward":60,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":75,"actual_minutes":15,"github_login":"IAMMASTERQUA","display_name":"IAMMASTERQUA"},{"id":"1003043","title":"Platform visibility setting: public vs sign-in-gated project surfaces","value_summary":"A project's owner can now choose who can see it: everyone, or only people signed in to it. On the project's manage page the choice sits next to a line that says what the project is actually running right now — read from the project itself, not from the save. A project set to members-only shows every visitor who isn't signed in a sign-in door instead of its pages, on every page, with members seeing everything as before. Projects on an older platform version are told so plainly rather than shown a door that isn't up.\n","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T21:51:58.658Z","credits_reward":60,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":90,"actual_minutes":42,"github_login":"jaxri","display_name":"Percy Jackson"},{"id":"1003283","title":"Clear the two medium patrol findings: pin the action, fix the stale-override false positive","value_summary":"Two follow-ups from the security patrol's first automatic run are closed. One was a genuine hole — a build step that pulled in an outside tool by a name that could be swapped underneath us — now locked to an exact version. The other turned out to be the patrol itself crying wolf, and acting on it would have broken the Discord integration.","version_id":"CB-V1","status":"shipped","shipped_at":"2026-08-25T21:46:58.456Z","credits_reward":38,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":null,"actual_minutes":7,"github_login":"lars589","display_name":"lars589"},{"id":"1003275","title":"A goal carries a human CATEGORY from an owner-owned set — advisory only, gating nothing","value_summary":"Every goal can now carry a plain-language category — Builders Hall, Security, Economics, Legal and five more — so a person scanning the board sees at a glance what each goal is about instead of reading all thirty-eight. The category is deliberately powerless: it labels work and can never decide who may do it, and a build-time check now refuses any code that tries to turn it into a permission.","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T21:36:45.927Z","credits_reward":60,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":90,"actual_minutes":20,"github_login":"IAMMASTERQUA","display_name":"IAMMASTERQUA"},{"id":"1003272","title":"Sound is silent because the player was never committed and 4 of 5 wav files do not exist","value_summary":"Sound works again: the missing player and four missing sound files are restored, the turn-end chime finally has something to fire it, and the Settings toggles and volume slider now actually reach it.","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T20:28:29.135Z","credits_reward":60,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":150,"actual_minutes":19,"github_login":"IAMMASTERQUA","display_name":"IAMMASTERQUA"},{"id":"1003273","title":"Majority pass rule, and an author may vote on their own idea but never decide it alone","value_summary":"The board can now decide by majority instead of a single vote, and you can vote on your own ideas - though never carry one on your vote alone.","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T20:05:10.955Z","credits_reward":60,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":240,"actual_minutes":28,"github_login":"IAMMASTERQUA","display_name":"IAMMASTERQUA"},{"id":"1003271","title":"Board sittings need a clock and a summons that lands: 9 items open, 0 votes, no expiry","value_summary":"Board members are now told in the hall when a vote is waiting on them, instead of that depending entirely on a Discord message that can silently fail to send.","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T19:31:24.625Z","credits_reward":60,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":120,"actual_minutes":20,"github_login":"IAMMASTERQUA","display_name":"IAMMASTERQUA"},{"id":"1003145","title":"corpusHealth's freshness stamp is an aggregate scan, and the comment beside it says otherwise","value_summary":"Searching the project knowledge base no longer slows down when a search finds nothing, and the message it shows now says plainly when the material was last updated.","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T19:21:57.240Z","credits_reward":12,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":20,"actual_minutes":49,"github_login":"scootermack","display_name":"scootermack"},{"id":"1003269","title":"Government page: Permissions tab first, and tab names that say what they are","value_summary":"The Government page now opens on Permissions instead of burying it behind two other tabs, and that tab is called 'Permissions' rather than 'Ranks & Permissions'.","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T18:48:38.904Z","credits_reward":25,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":20,"actual_minutes":17,"github_login":"IAMMASTERQUA","display_name":"IAMMASTERQUA"},{"id":"1001654","title":"Roll out the docstring / module-header convention (ADR 0095)","value_summary":"Code now explains itself: every file in the build system opens with a short note saying what it does and why it exists, so the AI agents that work here can find the right place by searching instead of guessing.\n","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T18:19:10.245Z","credits_reward":30,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":180,"actual_minutes":141,"github_login":"scootermack","display_name":"scootermack"},{"id":"1003174","title":"C04 - Closeness: a weighted blend, and a surface that can explain itself","value_summary":"The hall can now tell who you actually work with, and — this is the part that mattered — it can always show its working. Closeness is built from several things at once: holding work in the same goal at the same time, sitting down to it in the same hours, and shipping into the same goal over the months. Every score comes with a plain breakdown of what went into it and how much each part counted, right next to the number, so nobody is ranked by a figure that cannot account for itself. The recipe lives in a file anyone can read and change without digging through code. One thing it deliberately refuses to do: it will not pretend that something it cannot yet measure is a zero — messages between people are not yet visible to it, and rather than quietly scoring you as though you never speak, it says so and leaves that part out.\n","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T17:56:39.826Z","credits_reward":60,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":210,"actual_minutes":12,"github_login":"IAMMASTERQUA","display_name":"IAMMASTERQUA"},{"id":"1003173","title":"C03 - Recommend a task to someone: it never transfers the claim","value_summary":"You can now point a teammate at a task without dumping it on them. Recommending a task tells them you thought they should look at it and makes you say why — and that is all it does: nothing is assigned, nothing changes hands, and they still choose to pick it up themselves. Saying no costs nothing at all, leaves no mark on either person, and the same task can be suggested again later. Every recommendation stays on the record with the name of whoever made it and their reason, so a suggestion can never be mistaken for work quietly changing owner.\n","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T17:23:10.965Z","credits_reward":60,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":150,"actual_minutes":24,"github_login":"IAMMASTERQUA","display_name":"IAMMASTERQUA"},{"id":"1003266","title":"The Board Room becomes the live government: Metic and above ratify Full Ideas by consent on a 24h clock","value_summary":"Big ideas are no longer waved through by one person. Until today the Board Room ran on its founding setting, where a single Archon could ratify a Full Idea alone. From now on a Full Idea goes to a board of five — Will plus the four Archons — and passes only when they consent, on a 24-hour clock that closes as soon as everyone has voted. Being away never blocks anything, and anyone who objects has to say why and point at which part needs work, which sends the idea back to its author instead of killing it. The board grows on its own as builders earn their way up.\n","version_id":"CB-V1","status":"shipped","shipped_at":"2026-08-25T16:54:31.857Z","credits_reward":30,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":null,"actual_minutes":2,"github_login":"IAMMASTERQUA","display_name":"IAMMASTERQUA"},{"id":"1002489","title":"Spawn adapter — resolve model_tier, consume grade.runSubagentCached, write an agents_runs row","value_summary":"Agents can now actually be run: the system picks the right model for the job, runs the agent through the shared, cost-tracked path, and writes one honest line about every attempt — including the ones it refused.","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T16:30:16.854Z","credits_reward":30,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":null,"actual_minutes":4,"github_login":"IAMMASTERQUA","display_name":"IAMMASTERQUA"},{"id":"1003162","title":"The /recall index is EMPTY on live even though the ingest fix is deployed — nothing in core invokes the ingesters","value_summary":"The project's search index now rebuilds itself and reports what it did every time, so 'have we solved this before' stops silently returning nothing when the indexer quietly stops.","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T16:18:08.939Z","credits_reward":60,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":60,"actual_minutes":5,"github_login":"IAMMASTERQUA","display_name":"IAMMASTERQUA"},{"id":"1003140","title":"Live push: a settings change reaches an already-running instance (needs provision.js to shrink)","value_summary":"Changing a project's settings on the platform now reaches the project while it is running: the platform patches the project's settings file in place and restarts it, and the response says plainly that a restart is coming rather than pretending the change is already live. Projects that run on their own server are told honestly that the platform can't restart them.\n","version_id":"BONGOS-V1","status":"shipped","shipped_at":"2026-08-25T14:39:48.760Z","credits_reward":30,"visual_url":null,"visual_alt":null,"credits_awarded":0,"est_minutes":null,"actual_minutes":51,"github_login":"jaxri","display_name":"Percy Jackson"}],"days":null,"range":"recent"}
|