diff --git a/blobs/0x6c63697b7f2fe4cddefa52a76e51d021d37d98645fe77cc50375eef8f34d36ce b/blobs/0x6c63697b7f2fe4cddefa52a76e51d021d37d98645fe77cc50375eef8f34d36ce new file mode 100644 index 0000000..3a16d5a --- /dev/null +++ b/blobs/0x6c63697b7f2fe4cddefa52a76e51d021d37d98645fe77cc50375eef8f34d36ce @@ -0,0 +1,82 @@ +diff --git a/tests/acceptance/7/CRITERIA.json b/tests/acceptance/7/CRITERIA.json +new file mode 100644 +index 0000000000000000000000000000000000000000..4e2dbaa28b6ee66b629a86874cfbbb6070cfae75 +--- /dev/null ++++ b/tests/acceptance/7/CRITERIA.json +@@ -0,0 +1,12 @@ ++{ ++ "schema": "elffuss-t2t/criteria@2", ++ "issue": 7, ++ "criteria": [ ++ { ++ "index": 1, ++ "tests": [ ++ "tests/acceptance/7/criteria.test.js::criterion 1" ++ ] ++ } ++ ] ++} +diff --git a/tests/acceptance/7/criteria.test.js b/tests/acceptance/7/criteria.test.js +new file mode 100644 +index 0000000000000000000000000000000000000000..da4d195c6d9ba38ad91b6dedd61ad757c9da45e3 +--- /dev/null ++++ b/tests/acceptance/7/criteria.test.js +@@ -0,0 +1,36 @@ ++import test from 'node:test' ++import assert from 'node:assert/strict' ++import { MODELS } from '../../../web/js/providers/litert.js' ++ ++// Minimal stand-in for the page so the lab module can run and render its lists. ++class Node { ++ constructor(tag) { this.tag = tag; this.children = []; this.style = {}; this.className = ''; this.textContent = ''; this.innerHTML = ''; this.scrollTop = 0; this.scrollHeight = 0 } ++ appendChild(c) { this.children.push(c); return c } ++ append(...cs) { cs.forEach(c => this.children.push(c)) } ++ querySelector(s) { return this.slot(s) } ++ slot(s) { return slots.get(s) } ++} ++const slots = new Map() ++const pick = s => { if (!slots.has(s)) { const n = new Node('slot'); n.id = s.slice(1); slots.set(s, n) } return slots.get(s) } ++Node.prototype.querySelector = function (s) { return pick(s) } ++globalThis.document = { querySelector: pick, createElement: t => new Node(t) } ++const store = new Map() ++globalThis.localStorage = { getItem: k => (store.has(k) ? store.get(k) : null), setItem: (k, v) => store.set(k, String(v)), removeItem: k => store.delete(k) } ++globalThis.window = { open() {} } ++ ++await import('../../../web/js/lab.js') ++ ++function titlesOf(node, out = []) { ++ if (node.className === 't') out.push(node.textContent) ++ node.children.forEach(c => titlesOf(c, out)) ++ return out ++} ++ ++test('criterion 1', () => { ++ const titles = titlesOf(pick('#brains')) ++ assert.equal(titles.length, 4) ++ assert.equal(titles[2], MODELS['gemma-e2b'].label) ++ assert.equal(titles[3], MODELS['gemma-e4b'].label) ++ assert.ok(titles[0].startsWith('Reglas')) ++ assert.ok(titles[1].startsWith('Elffuss LM')) ++}) +diff --git a/web/js/lab.js b/web/js/lab.js +index b42c64109c68f5d95209e6f2eb7ba3847099e7ad..fbc5595aa000794888b55080d1dd1f7dc49593af 100644 +--- a/web/js/lab.js ++++ b/web/js/lab.js +@@ -12,6 +12,7 @@ + // el de juegos ejecuta el juego generado y lo puntúa mirándolo correr. + import { DEFAULTS, packHistoryACER, estimateTokens } from './acer-core.js'; + import { TASKS } from './swe-tasks.js'; ++import { MODELS } from './providers/litert.js'; + + const $ = s => document.querySelector(s); + const el = (t, c, x) => { const n = document.createElement(t); if (c) n.className = c; if (x != null) n.textContent = x; return n; }; +@@ -68,8 +69,7 @@ const BENCHES = [ + const BRAINS = [ + ['rules', 'Reglas (sin GPU)', 'Determinista. Valida el arnés sin bajar pesos.'], + ['onnx', 'Elffuss LM (CPU/wasm)', 'LFM2.5-1.2B por transformers.js.'], +- ['litert:gemma-e2b', 'Gemma-4 E2B (~2 GB)', 'WebGPU.'], +- ['litert:gemma-e4b', 'Gemma-4 E4B (~3 GB)', 'WebGPU. El mejor.'], ++ ...['gemma-e2b', 'gemma-e4b'].map(k => ['litert:' + k, MODELS[k].label, MODELS[k].tag]), + ]; + + // ─────────────────────────── consola ─────────────────────────── diff --git a/events/0000001098.json b/events/0000001098.json new file mode 100644 index 0000000..8808f44 --- /dev/null +++ b/events/0000001098.json @@ -0,0 +1 @@ +{"data":{"cites":[],"envelope":{"delegation":{"identity":"0xa472b6bac297911f562335db561c6cbf33e5c32e","nonce":"1791215718","project":"0x0000000000000000000000000000000000000000000000000000000000000000","scopes":1,"sessionX":"0x95f78206df8c45ad2c66699e951f065f6e8d69423260ec1c8b3576f1d1a0abfe","sessionY":"0x65b4acd6dd343eb03a57935380a6704341544d4b037eaf05f7d6f5cffab517bc","validFrom":"1791215658","validUntil":"1791388518"},"delegationSignature":"0x7e4b80d5baac97aa4f6ea684cc876d4ec1d5576dc471e065348b7ce78ed0cb663ae210ad1ca8d740f4f92e04ace494de964aa47e7bfafea0ec07fe7530a892241b","kind":"session","signature":"0x5eb8e5d7007b682541955857f6b1c8a6a7cbfbc586b519bde2733034f0ba6da66211941db012d5e06bfbac12916ea9c4ecdb71cf55c2de84851cfc8034f4269f"},"mainHead":null,"message":{"author":"0xa472b6bac297911f562335db561c6cbf33e5c32e","baseCommit":"0xe2c294fb43d16c6658bf34b7a31cb22035b0388d","basePartial":"0x0000000000000000000000000000000000000000000000000000000000000000","citesHash":"0x0000000000000000000000000000000000000000000000000000000000000000","issueId":"0x7bf84a053d2bd6ce83a7ce9d2799aadf280de622b31dbf03026d0e69d76d3a9a","issuedAt":"1791215759","lines":4,"nonce":"1791215759601","patchHash":"0x6c63697b7f2fe4cddefa52a76e51d021d37d98645fe77cc50375eef8f34d36ce","project":"0x16d6e75341c5f21003a4d9e89b416a545f7335094d7df139fd20942c9b7fb2de","repo":"0xd822e541c0173492ca0725a08935bcd8eaa756a9559600a9427d0daac625ead2"},"pr":"elffuss/code:item/0x054ca82fe89ff53664b84304b335f216bd1dfbeca76588ee9d0169e905dac9ef"},"eventHash":"0x51932922f29d55f400b31f8615407f46b24010319bae76ad578239b3ca42d7c0","gatewaySignature":"0x8df31db8a3826313980c17175c0b036fbec6693c421fd00de820192dd951af1d020ce40240c51e5b9eea5cfc1af07b07ea222021b71475cdb49f0a101352d3961c","prev":"0xb3f4072d9113d3f3a8a7935b79fda31cef61292fc0d2e06ff56d4df92935c2b0","seq":1098,"ts":1791215759,"type":"solution","v":2}