One row per module or piece of work. Update your row in its own small commit before you start and when you finish (see AGENTS.md).
| Module / task | Status | Owner (session or person) | Notes |
|---|---|---|---|
modules/lzma-decode + tools/lzma-pack |
done | first session | decoder, packer, 140 decoder checks against Python's lzma, 14 browser checks |
modules/lzma-decode WebAssembly add-on + tools/lzma-pack --wasm |
done 2026-10-17 | JS-modules thread | optional lzma-decode-wasm.js (4,087 bytes, 2.0x as fast in Chromium and Firefox, 1.5x in WebKit), pack.py --wasm (off by default, +4.5 KB), 340 + 23 Node checks, 4-browser timing test |
modules/save-kit 1.2.0 |
done 2026-10-17 | JS-modules thread | for Fancy and Apple Press: old-code endings (hex8, plain36), backup/damaged slot names, afterValidate hook, stamp name, lean.py (29% smaller for their sets); 43 + 15 Node checks, 4-browser check |
frame-kit |
done | first session | EvenDt, QualityGovernor, JobPump; 35 checks |
fuzz-kit |
done | first session | seeded fuzzer, Playwright and Puppeteer runners, hook stripper; 21 engine checks, 9 browser checks |
sprite-baker |
done | first session | software 3D rasterizer for baked sprites; 29 checks |
pad-nav |
done | first session | Gamepad API to DOM focus; 105 checks, Chromium only, no real controller tried |
canvas-probe (test-only: save/restore depth, canvas calls per frame, draws below half size, overhanging source rectangles, style-write repeats) and house-rule git hooks (tools/hooks) |
done 2026-10-14 | the Fancy, the Banana session (Oct 14) | Owner chose both by pop-up on 2026-10-13 after the knowledge-base cross-check (FANCY-BANANA-CROSSCHECK.md). No prior art for the probe in this repository. Hooks are shell, not a module. Built: tools/canvas-probe (24 Node checks with a fake canvas, 9 Chromium checks on a real one; registered in modules.json, README, llms.txt, index.html, tests/kits.js) and tools/hooks (commit-msg and pre-commit; run sh tools/hooks/install.sh once per clone). Not yet run in Firefox or on a phone. |
storage-probe (one-button page: do copies of a page in different folders share saved data, locks and storage events) |
done 2026-10-14 | the Story Editor session (Oct 14) | From the knowledge-base cross-check item A3. No prior art found for a two-copy comparison (quota checkers only measure one page). Built: tools/storage-probe (page, README, 8 Chromium checks; registered in modules.json, README, llms.txt, index.html, tests/kits.js). Measured: desktop Firefox 158 and Chromium share localStorage, storage events and locks across file: folders. Not yet run on a phone. |
fuzz-kit shrinker (Fuzzer.shrink, perOp, script, firstOnly options) |
done 2026-10-14 | the Story Editor session (Oct 14) | From the knowledge-base cross-check item A6. Prior art: delta debugging (ddmin, Zeller and Hildebrandt 2002); the kit's own README said "No shrinking". Built: a seeded failing run is recorded as an operation script and cut down by ddmin to a smaller script that still fails the same way; 8 new engine checks (29 in all), README updated. The Story Editor's fuzz3.mjs has its own difference-reverting shrinker on stories. Not wired to the live-page fuzzer in the editor (fuzz1.js). |
Twine import (in the Story Editor repo: File → Import Twine…, importTwine, twine-to-story) |
done 2026-10-14 | the Story Editor session (Oct 14) | Knowledge-base item Q77. Reads Twine 2 HTML, Twee 3, Twine 1; converts SugarCube/Twine 1/Harlowe code to rules or keeps it as flagged text; keeps the original author word for word. Licenses recorded in that repo's NOTICE.md (Harlowe unverified from its own page). Lives there, not here, because it is cut into story-format. |
| Pinned routes, page colors and notes, and Translations (in the Story Editor repo: Play tab pins, map stripes and notes, File → Translations…) | done 2026-10-14 | the Story Editor session (Oct 14) | Knowledge-base item Q55 and the owner's pick after the format comparison (docs/FORMAT-COMPARISON.md). Routes replay with the game's own rules and name the first step that breaks; translations are keyed by the exact words and travel as a CSV sheet; the exported game gets a language menu. They live there, not here, because they are cut into story-format (schema and typings). |
modules/tab-guard (one open copy of a game at a time, Web Locks) and modules/back-close (phone back swipe closes the top panel, CloseWatcher) |
done 2026-10-14 | the Apple Press session | cut from Apple Press v1.27; 13 + 11 browser checks, run in Chromium and Firefox 155; the real Android back swipe is untried |
FrameMeter in modules/frame-kit/frame-meter.js (frames a second, slowest frame, hitch count with a game-or-device cause, tap-to-next-frame delay, plain-words verdict) |
done 2026-10-14 | the Pineapple Defense session (Oct 14) | Owner chose "FPS badge upgrades" by pop-up on 2026-10-14 after the knowledge-base cross-check (PINEAPPLE-DEFENSE-CROSSCHECK.md, ideas P02, P21, P32). Prior art: no hitch or tap-delay meter in this repository; Stats.js-style panels draw numbers only. 8 Node checks in modules/frame-kit/test/run.js. Vendored into Pineapple Defense. Used in Pineapple Defense 2026.10.14.0743: Chromium and Firefox QA pass; in the headless run the verdict read "smooth". Not run on a phone. |
tools/webkit-driver (drives WebKitGTK 2.52.6 or GNOME Web 46.5 from Node with Playwright-style page calls, no dependencies) |
done 2026-10-17 | the Netflow Map session (Oct 16-17) | Owner asked for WebKit in every test run; Playwright and Puppeteer cannot drive WebKitGTK, so this speaks the W3C WebDriver protocol to WebKitWebDriver. 7 Node checks (pretend driver) and 12 real-browser checks (WebKitGTK about 2 s, GNOME Web about 8 s). Ran the full Netflow Map browser test (82 checks) in WebKitGTK. Not yet used by fuzz-kit or pad-nav; the row below stays open for those. Linux only; WebGPU is not available in it. |
Run fuzz-kit and pad-nav in Firefox and WebKit |
partly done 2026-10-17: Firefox 157 done for fuzz-kit, pad-nav and back-close; WebKit open | fuzz-kit in Firefox 157 and Chromium 153 (real runs, see its README). pad-nav (105 checks) and back-close (11) pass in Firefox 157, run through tools/firefox-stand-in (Selenium in place of the Playwright calls; Playwright cannot drive stock Firefox; canvas-probe and lzma-pack browser tests pass there too). Not run: WebKit, Firefox 158 or newer, a phone. |
|
Candidate: save codes (URL-safe base64, FNV checksum, CompressionStream with fallback) |
done 2026-10-15: not needed | the JS-modules audit session | save-kit already holds all three (base64url, FNV-1a, deflate-raw with a plain fallback) and now limits what a pasted code may unpack to. A separate module would only make sense for a project that needs codes without save-kit's field schema. |
| Candidate: single-file game "Test Lab" panel (live tuning in a shipped build) | open: needs a decision | game-specific today; see the source game's tester/tester.js |
|
| GitHub Pages for this repository | open | repository owner | enabling it would serve each module's example/index.html; note the bytes example of lzma-pack needs a server without a utf-8 charset header (use the base64 example on Pages) |
Story packages (story-format, story-check, story-player, story-map, zip-page, qa-kit, ai-collab-kit) |
done 2026-10-12 | session story-editor-c9 | They are cut from the Story Editor's own sources, so they live in https://github.com/lfcfoundry/story-editor under packages/ (single source of truth, drift-checked), not here. Published in commit f457d1c of that repo; cross-links added both ways. Not copying: drag-reorder, spotlight tour and safe storage from the editor UI (SortableJS, Shepherd/driver.js and this repo's save-kit already cover them). zip-page overlaps tools/single-file-tools/pack.py and lzma-pack; it adds a pure-JS inflate fallback for browsers without DecompressionStream. |
| Regroup the public page, README table, llms.txt and modules.json by function (games / story editor / tools) | done 2026-10-12 | LFC Foundry's master-guide conversation | Page, README, llms.txt and modules.json are grouped by function (games / story editor / tools). modules.json has side and category on every entry; when you add a module, give it both and place it under a group on the page. No module code changed. |
| Re-sync local clones of fancy-banana, apple-press, story-editor | note | any session | on 2026-10-12 their history was rewritten so no commit or file says the owner's former name (authors and the copyright line are JNFoo). Local clones must git fetch && git reset --hard origin/main; do not push old commits back. Backups are not in the repos. |
| Re-sync local clones of JS-modules, apple-press, fancy-banana, pineapple-defense, story-editor (second rewrite) | note | any session | on 2026-10-13 the owner asked for every commit to show JNFoo as author and committer, so the history of these five was rewritten again: only author, committer and the removal of Claude-Session: lines changed (file contents and commit counts are identical; Co-Authored-By lines stay). Before you continue, save any unpushed work (a patch file or a branch), then git fetch && git reset --hard origin/main (or rebase your unpushed commits onto origin/main), and run git config user.name JNFoo && git config user.email 45110762+JNFoo@users.noreply.github.com so new commits are authored as JNFoo. Do not push old commits back. |
| modules/wake-keeper (screen wake lock that is held only while wanted, released on pause, hidden tab and idle, re-requested when allowed) and a version-stamp check plus a test script for tools/hooks | done 2026-10-14 | the Pineapple Defense session (Oct 14) | 20 Node checks for wake-keeper (fake browser), 10 checks for the hooks (sh tools/hooks/test.sh). Not run on a phone. Owner asked for Pineapple Defense ideas Q27 and P06 by chat on 2026-10-14. Prior art: no wake-lock helper in this repository; the MDN pattern is a few lines but the release-on-idle and re-request-on-visible rules are the part people get wrong. Fancy the Banana holds a lock inside its own file (not extracted). |
| Audit fixes and features from the 2026-10-15 audit (batch A safety fixes, B house-rule cleanup, C eight features; marionette-lite retired; fuzz-play merged into fuzz-kit; names and links scrubbed in cartoon-3d-kit) | done 2026-10-15 | the JS-modules audit session (Oct 15) | Owner approved all three batches and all eight features by pop-up on 2026-10-15; findings are in the knowledge-base repo under research/2026-10-15-js-modules-audit/. One commit per module. New Node checks for every fixed bug (most fail on the old code). Run once at the end in headless Chromium 141 on Linux: all 30 steps of npm run test:kits and the browser checks in tests/run.js pass. Not run: Firefox 158, any phone, any real controller or iPhone. Open follow-ups: regenerate the packed examples in tools/lzma-pack/example/ (they still use the old var s payload name); Zopfli packer in single-file-tools still shows a white waiting page (the dark-background line is only in lzma-pack); ten module READMEs still end with an "extracted from" link naming the source game (owner has not decided about those); the hooks' author rule is still JNFoo-only for everyone. |
| Run the 2026-10-15 changes on Firefox 158 and the Pixel | open: needs the owner (Firefox part partly done 2026-10-15) | owner | Firefox 158 done by tests/firefox.js: every demo page loads clean, env-probes canvas and storage, stage-curtains, hold-press, sprite-baker masks and sheets. Firefox 157 (conda-forge, 2026-10-17; 158 not installable here) re-ran tests/firefox.js: 5 passed. With privacy.resistFingerprinting=true the env-probes clock reads as rounded and the canvas guard skips read-back; a direct read-back of a flat color came back scrambled (even the alpha), with no permission prompt in headless. privacy.fingerprintingProtection alone changed nothing in a normal window. pad-nav, back-close and fuzz-kit also pass in Firefox 157 (2026-10-17). Phone: Android back swipe and back-close history fallback, hold-press touch with two fingers, wake-keeper real lock, pad-nav with a real pad (and whether pad B acts as Back on Android). iPhone: back-close history fallback. |
| Follow-ups from the 2026-10-15 audit: footers, hook author list, packer waiting page, sprite-baker masks and sheets, frame-kit guard default | done 2026-10-15 | the JS-modules audit session | "extracted from " footer removed from all 16 READMEs; hooks read allowed authors from tools/hooks/authors.txt (JNFoo only to start; Claude always refused); lzma-pack examples rebuilt with the new payload name; Zopfli packer shows a "Loading…" page (--bg); sprite-baker 1.2.0 adds alphaMask, hit, toSheet; frame-kit flip-flop guard is now off unless flipLimit: 3. Test browsers are now ungoogled-chromium 155 and Firefox 158 (tests/firefox.js, puppeteer-core over BiDi). All kit steps and tests/run.js passed. |
| lzma-pack: leaner loader and optional --minify-page | done 2026-10-15 | the JS-modules audit session | Loader 527 bytes smaller (2,867 to 2,340 on the example): outside-file checks and long error messages are dropped from the packed copy of the decoder. --minify-page (off by default) took the real Fancy, the Banana page from 184,549 to 133,455 bytes; loaded the same in Firefox 158 and ungoogled-chromium 155, not play-tested. Decoder speed was measured (about 17 MB/s in both browsers) and hand-inlining the literal loop gained 0 to 10%, so it was not kept. |
| modules/ppmd-decode and tools/ppmd-pack (PPMd, the 7-Zip text compressor, for self-unpacking pages) | done 2026-10-15 | the JS-modules audit session | Decoder: one ES5 function, 6.6 KB packed, 118 checks, agrees with real 7-Zip 24.09 both ways. Packer: pure Python encoder, byte-identical to the 7-Zip C encoder on 265 cases, 24 checks plus a Chromium page check. On ten test files PPMd data is 4 to 16% under LZMA, but the page (decoder 5 KB bigger, 4 to 8 times slower to unpack) is smaller only above about 60 KB of compressed data: 3 to 4% on three of ten files. Prior art: no standalone JavaScript PPMd decoder found anywhere (see the module README). Not done: Firefox timing is noisy (about 150 to 190 ms); a play-through of a PPMd-packed real game; decoder speed has no easy win left (memory-bound) and cold JIT start-up (about 45 ms) is the next target. Pre-minify (--minify-page) is supported by both packers. |
| Move to the lfcfoundry GitHub organization and rebrand links | done 2026-10-15 | the project thread | Repo now at https://github.com/lfcfoundry/JS-modules (Pages: https://lfcfoundry.github.io/JS-modules/); profile, repo and Pages links changed in the merged rebrand PR. Links to the other games and the Story Editor stay on JNFoo until those repositories move. The PPMd credit (Shkarin, Pavlov, 7-Zip) is unchanged. Commits stay authored by JNFoo. |
| fly-to-mini optional View Transitions engine (engine: 'transition', flight stays the default) | done 2026-10-16: look not yet judged by eye | the JS-modules continued thread (Oct 16) | Design card FM-4 from the 2026-10-15 audit. 20 Node checks, 1 Chromium 141 check; demo takes ?engine=transition. Open: Firefox 144+ and the Pixel, judged by eye. |
| ppmd-decode cold-start warm-up (about 45 ms on the first decode) | done 2026-10-16: measured, no change | the JS-modules continued thread (Oct 16) | Chromium 141, 5 fresh pages each: first decode of a 30 KB stream about 42 ms against about 20 ms warm; no first-call penalty on the 702 KB page (about 200 ms first). Warming up with a small stream costs 350 to 490 ms for no gain, so nothing was added. Firefox not measured (not installable here). |
| Version labels for every module and tool (1.2.3 · API 1, tools/versions) | done 2026-10-16 | the JS-modules continued thread (Oct 16) | Classic number plus an API number that equals the major. modules.json holds it; versions.py set copies it to headers, READMEs, root README, front page and llms.txt; the pre-commit hook warns. Starting labels 1.0.0 (sprite-baker 1.2.0, fly-to-mini 1.1.0). Every module and tool also has a plain-words CHANGELOG.md (history before labels rebuilt from the commit log, this board and the 2026-10-15 audit), and the root CHANGELOG.md is generated. Owner decided against an "is my copy current?" check because it would need the network. |
| env-probes 1.1.0: faster clock and canvas probes, canvas noise size, framed(), hover and transparency questions, capabilities(), one-button device check page | done 2026-10-17 | the JS-modules continued thread (Oct 17) | From the 2026-10-17 deep dive (A1-A6, C1, C2). Firefox privacy-profile test (A7) stays open until Firefox can be installed. |
| fx-governor 1.1.0 and frame-kit 1.1.0: slow-device blind spot fixed in both, severe, stepUp: false, lock(), README recipes | done 2026-10-17 (PR 3 merged; real-phone check open) | the JS-modules continued thread (Oct 17) | From the 2026-10-17 fx-governor review. Owner chose "Fold in", but fx-governor's window averaging cannot be reproduced on top of QualityGovernor's smoothed gap, so FxGovernor stays its own file (see PR). Pineapple Defense ships its own QualityGovernor copy: not touched. |
| fly-to-mini 1.2.0: fold in what Apple Press built (bar as an element, alert(), onVisible/steps, hysteresis, keepFocus, reducedFade, clone ids and canvases, timer cleanup) | done 2026-10-17: all new options are off by default | the Apple Press continued thread (Oct 17) | From the 2026-10-17 deep dive (list D). 33 Node checks (13 new). Open: Pixel and Firefox look, whether to turn the options on by default in a 2.0, and the other deep-dive ideas (compositor engine, splitting out the View Transitions engine) which are not started. |
| firefox-stand-in (run a Playwright-for-Python test in stock Firefox through Selenium) | done 2026-10-17 (PR 8 merged) | the JS-modules continued thread (Oct 17) | the owner asked for it by card and wanted it documented so each test can decide whether to use it. 19 checks. README has a use-it-or-not table and the result of every existing Python browser test through it (4 pass; tab-guard, storage-probe, fuzz-kit browser, frame-kit, ppmd-pack need calls it does not have). Firefox 157 only. |
| fuzz-kit 1.1.0: hang guard fixed, Firefox Space fix, swarm, final, hash and --check-repeat, --replay, --jobs, pickVisible, comma seed lists, --executable | done 2026-10-17 (PR 7 merged) | the JS-modules continued thread (Oct 17) | From the 2026-10-17 fuzz-kit review (/mnt/project-files/js-modules-research/fuzz-kit/REVIEW.md); the owner chose "Apply all" by card. 201 Node checks (21 new), 38 runner, 16 browser; the new engine checks fail on the old engine. Real runs in Firefox 157, Chromium 153 and 141 are in the review. Open: moving the Story Editor's and Netflow Map's own fuzzers onto the kit (other repositories), WebKit, a phone. |
| single-file-tools 1.1.0: packer bytes mode and Zopfli passes, picture fix with gzip numbers, font missing-character and cost reports, woff2 label, README numbers | done 2026-10-17 (PR 6 merged) | the JS-modules continued thread (Oct 17) | From the 2026-10-17 single-file-tools review (/mnt/project-files/js-modules/single-file-tools-deep-dive.md, items A1 to A7); the owner chose "All A fixes" by card. 19 checks in test/run.py (6 new, all fail on the old code). Real 1 MB game: bytes page 210 KB against 272 KB base64, both unpack in Chromium 153 and Firefox 157 from file:// and from a server without a charset; bytes mode fails safely under charset=utf-8. Not run on a phone. Open (B items): --head for a license comment and CSP tag, --no-kern, a combined which-packer page, parallel build steps. |
| canvas-probe 1.1.0: less slowdown, probe.check(limits), per-frame total, opt-in costly-draw counter (deep: true) | done 2026-10-17 (PR 4 merged); Chromium 141 and 153 pass, not run in Firefox or on a phone | the JS-modules continued thread (Oct 17) | From the 2026-10-17 canvas-probe review. Pineapple Defense's own older copy is not touched; refreshing it and switching its gate to probe.check is a separate follow-up. |
| storage-probe 1.1.0: IndexedDB line, own-history line, free-space button, second-copy button, faster test | done 2026-10-17 (PR 4 merged); Chromium 141 and 153 pass, not run in Firefox or on a phone | the JS-modules continued thread (Oct 17) | From the 2026-10-17 storage-probe review. The new page wording is a draft for the owner to read. Firefox, Windows and Pixel runs still open. |
Status values: open, in progress, done, blocked.
| Test-browser switch: docs and front page name Firefox 158 and ungoogled Chromium 155 | done 2026-10-17 | the JS-modules continued thread (Oct 17) | the owner's rule: retire Chromium 141 and 153 and Firefox 157. README Tests section, AGENTS.md, llms.txt and the front page now say so; the front-page footer now credits LFC Foundry. Numbers measured on the old browsers keep their labels. Open: install the new browsers from the browsers branch and re-run tests/run.js, tests/firefox.js and the stand-in checks, then update the 141, 153 and 157 labels. |
| List the four new Story Editor packages on the front page: twine-import, story-outline, story-diff, contract-kit | done 2026-10-17 | the JS-modules continued thread (Oct 17) | the owner noticed they were missing. They live in the story-editor repository (its PR 5); modules.json, README, llms.txt and the front page now list them, and the story-format line says Twine import moved out. Not listed yet: the ideas from /mnt/project-files/research/story-editor-module-ideas/REPORT.md that are not built. |
| modules/gif-writer, modules/zip-open, modules/netflow-sankey, modules/walker-sim (the four reusable pieces of Netflow Map: animated GIF writer, safe zip and xlsx opener, flow-chart layout, random-walker simulator) | done 2026-10-17 | the JS-modules session | Found by the 2026-10-17 audit of all eight repos; the owner picked "Net Flow first". Each needed a small adapter or trimming, not just a copy: plain-links input for netflow-sankey (then under its earlier name) and walker-sim, read() and textExt for zip-open, the Excel reader bundled into zip-open. Measured against gifenc, fflate and d3-sankey (numbers in each README). All four demos pass in Firefox 158, ungoogled Chromium 155 and WebKitGTK 2.52.6 (tests/flow-demos.js). Netflow Map itself still has its own copies; switching it over is open |
| modules/slow-note, modules/grown-ups-door, modules/spotlight-tour, tools/test-isolation, tools/speed-lab and idle-core buyPlan (the reusable pieces of Apple Press: slow-moment note, grown-ups door, first-time tour, test storage prefix, phone speed test, Buy x1 / x10 / Max maths) | done 2026-10-17 | the JS-modules continued thread (Oct 17) | Cut from Apple Press with a prior-art check for each (driver.js, Shepherd, Intro.js, web-vitals, node-storage-shim, Apple's parental-gate wording); buyPlan matched single purchases in 540 of 540 cases where costOfMany differed in 421. Browser checks in Firefox 158 and ungoogled Chromium 155 (tests/pieces-browser.js). Also passes in WebKitGTK 2.52.6 through WebDriver (WEBKIT=1 node tests/pieces-browser.js); GNOME Web not run. Apple Press itself still has its own copies; switching it over is open. |
| idle-core 1.2.0 (deep dive: five trap fixes, faster grouping and Max, idle-core.min.js, etaSec, paybackSec, prestigeGain, prestigeNeeded, fastForward; research in /mnt/project-files/js-modules-research/idle-core/REVIEW.md) | done 2026-10-17 (in PR 14) | the JS-modules continued thread (Oct 17) | Owner chose "Everything" on the decision card. Same-answers run in Firefox 158, ungoogled Chromium 155, WebKitGTK 2.52.6 and GNOME Web 46.5 (tests/idle-core-browser.js). Open ideas not built: a double-double pow for WebKit's 3e-14 error, break_infinity-style big numbers. |
| tools/webkit-driver 1.1.0 (the patch from the webkit-driver deep dive: no stray processes after Ctrl-C, faster clicks and waits, deviceScaleFactor, colorScheme, reducedMotion, serve) | done 2026-10-17 (in PR 14) | the JS-modules continued thread (Oct 17) | Owner chose "Apply 1 to 5". Ideas 7 to 9 in /mnt/project-files/js-modules-research/webkit-driver/REVIEW.md only if asked. Netflow Map's own 82-check suite not run with it yet. |
| modules/walker-sim deep dive, all ten items (zero-weight fix, solver that says when it has not converged, exact step counts, faster loop, split-proof runs and merge, minified file, stop at a precision, warm-started sweep, exact steps and cost, optional menu file; spec in /mnt/project-files/js-modules-research/walker-sim/WALKER-SIM-DEEP-DIVE.md) | done 2026-10-17 (in PR 14) | the JS-modules continued thread (Oct 17) | Owner chose "Everything". 2.0.0 (API 2): the menu texts moved to walker-sim-menu.js and seeds above 100,000 walkers give different counts than 1.0.0 (up to that size the counts are identical). Netflow Map keeps its own copy until it adopts it. Speed re-measured in Firefox 158, ungoogled Chromium 155 and WebKitGTK 2.52.6, one at a time. Not built: making the gamma, Poisson and binomial samplers optional (item 10's second half), a cost-sample set that survives splitting exactly. |
| modules/sticker-text 1.1.0 (wrapping, descenders, 32-shadow ring, watch(), st-flat, st-stroke; from the sticker-text deep dive, owner chose "Apply all") | done 2026-10-17 (in PR 14) | the JS-modules continued thread (Oct 17) | Pineapple Defense can update its vendored copy once PR 14 is on main. demo-check.mjs and tests/run.js (needs playwright-core) not re-run here. |
| "Tested in" line on every changelog entry and README (browsers with versions), versions.py set --tested and versions.py tested, WebKitGTK in the test rule, tests/webkit-shim.js (the browser checks run in WebKitGTK through tools/webkit-driver) | done 2026-10-17 | the JS-modules continued thread (Oct 17) | the owner's rule: test only in the browsers branch browsers, one at a time, labeled; every release lists them. Old entries were filled from what the repository records and say "not recorded" where it does not; nothing was re-run. First use: all five Apple Press pieces pass in WebKitGTK 2.52.6. The four Netflow Map demos also pass in WebKitGTK. Open: tests/firefox.js-style checks of the older modules, fuzz-kit and pad-nav in WebKit; GNOME Web. |
| Browser tests never fall back to Playwright's own Chromium: the Python and Node Playwright tests (fuzz-kit, lzma-pack, ppmd-pack, canvas-probe, storage-probe, pad-nav, back-close, tab-guard, frame-kit, tests/run.js) need CHROMIUM=..., skip (exit code 2) with a clear message without it, and print the real browser version | done 2026-10-17 | the JS-modules continued thread (Oct 17) | Apple Press found its helper had swapped the given Chromium 155 for stock 141. The puppeteer-core tests here were already exact-path. Checked: refusal without a path, version printed with the path (Chromium 155.0.8059.39), quick kit run passes. Not run: the full browser tier, and tests/run.js (needs playwright-core, not installed here). |
| Apply the universal QA guide to this repository's tests (per-step timing, parallel kit runner longest first, --changed mode, wait-until instead of fixed sleeps, a flaky webkit-driver check fixed) | done 2026-10-17 | the JS-modules continued thread (Oct 17) | Whole kit run, every step: 123 s before (79 s kit run + 44 s of browser steps timed alone) to 77 s; quick tier 31.7 s to 8.8 s; --changed after a one-module edit 1 to 5 s. Not done: tests/run.js and Apple Press piece checks are mostly real-time waits (animations, a 1.5 s door timer, 4 s quiet period) and would need a fake clock; running several pages of one browser at once hung. Off switches are listed in AGENTS.md. |
| modules/stage-curtains 1.1.0 (paints ahead on busy pages, closes without freezing the page, repaints after a turned phone, removes a cancelled zoom after 0.11 s; from the stage-curtains comparison with Apple Press 2026.10.17.0128) | done 2026-10-17 | the JS-modules continued thread (Oct 17) | the owner chose "Hand it over". Patch and numbers from /mnt/project-files/js-modules-research/stage-curtains/; experiments/ap-curtains.js (private Apple Press source) is not in the repository. Ran: 26 Node checks, tests/run.js in Chromium 155, tests/firefox.js in Firefox 158, the WebKitGTK suites, and close/open in WebKitGTK and GNOME Web. Not run: a phone. |
| modules/memory-compression 1.0.0 (keeps big arrays packed in memory, fast restore, float-aware; first user to try: Netflow Map at 100,000 nodes) | done 2026-10-17 | the JS-modules continued thread (Oct 17) | Module, tests, demo and WebAssembly source from /mnt/project-files/js-modules-research/memory-compression/; the diff's index.html entry was re-placed by hand because main had moved. Ran: 23 Node checks with and without WebAssembly, the WebAssembly file rebuilt (byte-identical to the shipped one), the whole tests/kits.js run in ungoogled Chromium 155 (55 steps, 81 s), tests/firefox.js in Firefox 158, and the demo page in Firefox 158, Chromium 155, WebKitGTK 2.52.6 and GNOME Web 46.5. Not run: a phone, a real Netflow Map scene. |
| modules/cartoon-3d-kit 1.1.0, fixes A and B (pop color per skin, Violet demo glow, two new checks, crowds section in the guide; from the cartoon-3d-kit deep dive) | done 2026-10-17 | the JS-modules continued thread (Oct 17) | the owner approved A, B and C. Numbers from /mnt/project-files/js-modules-research/cartoon-3d-kit/. Ran: 82 Node checks (38 before), the demo check in Chromium 155, Firefox 158 and WebKitGTK 2.52.6, tests/firefox.js in Firefox 158. Not run: GNOME Web, a phone. Fix C (an optional baked-picture path for crowds) is a separate PR, next. |
| modules/memory-compression 1.1.0 (small mode packs floats and records about 1.6 times faster, 3.6 s to 2.2 s on the 120 MB scene; same file format; from the Fast compression module thread) | done 2026-10-17 | the JS-modules continued thread (Oct 17) | Diff from /mnt/project-files/js-modules-research/memory-compression/; the root-file hunks were redone with versions.py because main had moved. Ran: 24 Node checks with and without WebAssembly plus the long fuzz, the WebAssembly file rebuilt (byte-identical), the whole tests/kits.js run in Chromium 155 (55 steps, 80 s), tests/firefox.js in Firefox 158, the demo page in Firefox 158, Chromium 155, WebKitGTK 2.52.6 and GNOME Web 46.5. Not run: the full benchmark page, a phone. |
| modules/cartoon-3d-kit 1.2.0, fix C (optional baked-crowd path: crowd-demo.html, guide section 3.11, test/crowd-check.js, test/cost-crowd.js) | done 2026-10-17 | the JS-modules continued thread (Oct 17) | the owner approved C. Built in the kit, not in sprite-baker (that is a 3D rasterizer, a different job). Measured in Chromium 155: 12 heroes live 191 ms/s, baked 60/s 182, baked 30/s 117 (39% less); 48 heroes 346, 357, 227 (34% less); the gain comes only from drawing at 30 per second. Ran: 105 Node checks, the crowd check in Chromium 155, Firefox 158, WebKitGTK 2.52.6 and GNOME Web 46.5. Not run: a phone. |
| modules/save-kit 1.1.0 (two fixes: a default copied per state, a counts default used; faster load; opt-in: other-tab notice, persist, migrate, skip unchanged writes, compact codes; from the Overview thread's save-kit review) | done 2026-10-17 | the JS-modules continued thread (Oct 17) | the owner chose "Apply all". Diff and numbers from /mnt/project-files/js-modules-research/save-kit/. No game uses save-kit yet: offer it to a game thread, do not change a game from here. Ran: 35 Node checks, the whole tests/kits.js run in Chromium 155, the real-browser check and demo page in Firefox 158, Chromium 155, WebKitGTK 2.52.6 and GNOME Web 46.5. Not run: Safari itself, a phone. |
| modules/spotlight-tour 1.1.0 (window stays on the part while scrolling, follows page reflow and scrolling boxes, native <dialog>; from the spotlight-tour deep dive) | done 2026-10-17 | the JS-modules continued thread (Oct 17) | the owner tapped "All three" (09:49Z). Research in /mnt/project-files/js-modules-research/spotlight-tour/. tour.element is now a dialog (.open, not .hidden). Checked in Firefox 158, Chromium 155, WebKitGTK 2.52.6, GNOME Web 46.5; timings Chromium 155 only. |
| tools/test-isolation 1.1.0 (property-style use right, fast key loops, fresh and seed options; from the Apple Press thread's test-isolation review) | done 2026-10-17 | the JS-modules continued thread (Oct 17) | the owner tapped "Both" (10:00Z): publish 1.1.0, then Apple Press switches its speed-test pages (Apple Press thread). Research in /mnt/project-files/js-modules-research/test-isolation/. Snippet is bigger (about 1,960 characters). |
| modules/tab-guard, back-close, pad-nav, hold-press 1.1.0 and wake-keeper docs (Controls: back-forward cache option, watchWhen, faster button search, nextRule edges, onInput, lite cut, lockTouch, keyboard; from the Controls review) | done 2026-10-17 | the JS-modules continued thread (Oct 17) | the owner chose "All ten" (Fancy Banana thread). Patch from /mnt/project-files/js-modules-research/controls/ (applied with git am --3way; one index.html conflict resolved). Also records the wasm-allowed policy in AGENTS.md. |
| tools/speed-lab 1.1.0 (about a third faster: 29.3 s to 19.3 s; a stalled or hidden page no longer hangs the run; false "did not stutter" answers fixed; Low Power Mode warning; from the Universal QA speed guide thread) | done 2026-10-17 | the JS-modules continued thread (Oct 17) | the owner tapped "Apply all" (15:26Z); step 4 ("Fixes only") skipped. Patch from /mnt/project-files/js-modules-research/speed-lab/. Side finding left open: tools/webkit-driver waitForFunction takes options third, so a Puppeteer-style { timeout } in second place is ignored. |
| modules/walker-sim 2.1.0 (same answers, 2.3 to 3.3 times faster at 1,000,000 walkers; sensitivity(); optional walker-sim-wasm.js and joined walker-sim-with-wasm.min.js; from the walker-sim 2.1 review) | done 2026-10-17 | the JS-modules continued thread (Oct 17) | the owner asked for two versions (plain and wasm) and said to apply it. Plain stays the default and never needs wasm-unsafe-eval. Moving the exact solver to walker-sim-exact.js (API 3) is still the owner's call. Source of the patch: /mnt/project-files/js-modules-research/walker-sim/review-2.1/. |
| modules/memory-compression-jso 1.1.0 (retired as its own module on 2026-10-18: folded into modules/memory-compression 2.0.0, see the rows below; the object version of memory-compression: packs big lists of plain objects by column; 1.1.0 adds text patterns (50,000 user records 1.080 MB to 0.764 MB), shared objects by column (graph of 100,000 items and 300,000 links 5.78 MB to 2.49 MB), a view that opens in 0.06 ms instead of 29 ms, an opt-in float32 option, and a small WebAssembly helper; from the Fast compression module thread) | done 2026-10-17 | the JS-modules continued thread (Oct 17) | Module, tests, demo and benchmark tools from /mnt/project-files/js-modules-research/memory-compression-jso/ (1.0.0 and 1.1.0 together; 1.0.0 was never merged); built on memory-compression 1.1.0. Wasm is allowed by owner policy (15:40Z) and a plain-JavaScript path stays. Ran: 26 Node checks with and without WebAssembly plus the long fuzz, the WebAssembly file rebuilt (byte-identical), the comparison page and the demo page in Firefox 158.0, ungoogled Chromium 155.0.8059.39-1, WebKitGTK 2.52.6 and GNOME Web 46.5. Not run: a phone. |
| modules/gif-writer 1.1.0 (palette search and nearest-color search sped up, same bytes as 1.0.0: smooth 30-picture 640 x 480 animation palette 0.86 s to 0.42 s in Node; 1,000 random cases 0 bytes different; tests/gif-writer-browser.js) | done 2026-10-17 | the JS-modules continued thread | profiling plan row 3 |
| tools/ppmd-pack 1.0.1 (fix: the Node check broke after lzma-pack 1.1.0; 7 failing checks now pass) | done 2026-10-17 | the JS-modules continued thread | reported by the Stage curtains thread |
| modules/ppmd-decode 1.1.0 (optional WebAssembly decoder ppmd-decode-wasm.js, about 1.8 to 2.3 times faster on the first decode; same bytes and errors; 131 checks; from the Stage curtains thread's ppmd-decode review; tools/ppmd-pack --wasm is a separate later patch) | done 2026-10-17 | the JS-modules continued thread | the owner approved on the Stage curtains thread card |
| modules/zip-open 1.1.0 (checksum about 3.9 times faster, same answers: 2.97 to 0.76 ms per MB in Node; tests/zip-open-crc-browser.js) | done 2026-10-17 | the JS-modules continued thread | profiling plan row 5 |
| modules/env-probes, slow-note, grown-ups-door size and coverage check (real-browser check added for env-probes; wrong size claims fixed; Tested-in lines now say what ran in all four browsers; with webkit-driver 1.2.0 GNOME Web drives pointer-event pages too, so grown-ups-door passes in all four) | done 2026-10-17 | the JS-modules continued thread | profiling plan row 7; report in js-modules-research/profiling-plan/SIZE-AND-COVERAGE.md |
| modules/memory-compression-jso 1.1.1 to 1.4.1 (PRs 29, 39, 47, 49, 52): faster text packing in WebKit; dates, array pool, FSST text, optional Pcodec; front coding for sorted text; one file with the number chooser, keeper and profile hooks; faster balanced pack and each() for big lists | done 2026-10-17 | the JS-modules continued thread (Oct 17) | From the Fast compression and adaptive-compression threads; the optional Pcodec add-on was later split out into pcodec-js |
| modules/netflow-layers 1.0.0, 1.1.0, 1.2.0 (PRs 50, 51, 53): Netflow Map's layered engine as a module; bundled and tapered links; inner layout pieces exported for apps | done 2026-10-17 | the JS-modules continued thread (Oct 17) | Netflow Map adopted 1.2.0 (its PR 13) |
| modules/netflow-sankey 2.0.0 (PR 45): renamed from its earlier name (global NetflowSankey), layout 2.8 to 9.2 times faster, same pictures | done 2026-10-17 | the JS-modules continued thread (Oct 17) | rename chosen by the owner |
| modules/sprite-baker 1.3.0, 1.4.0, 1.5.0 (PRs 32, 40, 43): baking about 1.5 times faster; pictures, ridge lines and a pose function; lean.py writes a copy without unused parts | done 2026-10-17 | the JS-modules continued thread (Oct 17) | for Fancy Banana |
| modules/save-kit 1.2.0 and 1.2.1 (PRs 31, 41): options for games with saves in the wild and a lean build; field rules read once, not on every save and load | done 2026-10-17 | the JS-modules continued thread (Oct 17) | for Apple Press and Fancy Banana |
| tools/ppmd-pack 1.1.0 (--wasm, off by default) and lzma-pack 1.1.1 / ppmd-pack 1.0.2 (page policies carry 'wasm-unsafe-eval'); faster checks: lzma-pack 1.1.2 and ppmd-pack 1.1.1 (packer key search, shorter waits in browser tests, cached xz streams) (PRs 38, 42, 48) | done 2026-10-17 | the JS-modules continued thread (Oct 17) | wasm token rule from the owner |
| modules/back-close 1.2.0, wake-keeper 1.1.0, frame-kit 1.2.0: lean builders (PR 46); frame-kit 1.2.1, speed-lab 1.1.1, fx-governor 1.1.1: the frame-rate wording is "FPS" (PRs 54, 55); steadier GNOME Web frame-count check in speed-lab (PR 56) | done 2026-10-17/18 | the JS-modules continued thread | wording rule from the owner |
| modules/memory-compression 2.0.0 (PR 59): the packing core and the object layer are one file with one pack/unpack/view that picks the layer by input type; memory-compression-jso retired (alias MemoryCompressionJSO kept) | done 2026-10-18 | the JS-modules continued thread (Oct 18) | the owner asked for one module, not two |
| modules/memory-compression 2.0.1 (PR 65): fast-mode opening 21% to 65% faster in Firefox, WebKitGTK and GNOME Web on the cases measured; packed files byte for byte identical; compared with msgpackr, cbor-x, avsc and JSON in the four browsers | done 2026-10-18 | the JS-modules continued thread (Oct 18) | from the Fast compression thread's brief |
| modules/pcodec-js 1.0.0 (PR 62) and 1.0.1 (PRs 63, 64): Pcodec 1.0.4 for web pages as its own module (WebAssembly only, three files); 1.0.1 re-checks that the three wasm programs rebuild byte for byte and re-runs the comparison with numcodecs-wasm-pco in the four browsers | done 2026-10-18 | the JS-modules continued thread (Oct 18) | separate from memory-compression on purpose (the owner) |
| Every module README has "How it compares" and "Prior art and credits" (PR 57) | done 2026-10-18 | the JS-modules continued thread (Oct 18) | The owner: basic competitiveness against existing implementations, plus attributions |
| Root README: one table layout, a size on every row, an "All at a glance" index, written by versions.py (PRs 58, 60, 61); the front page sizes are written and checked by versions.py sizes as well | done 2026-10-18 | the JS-modules continued thread (Oct 18) | The owner: half the rows had no size and the tables looked amateurish |
| modules/memory-compression 2.0.2: two bug fixes and one limit removed (held-list memory() with missing text keys no longer throws; no blocked-eval error on pages that allow only 'wasm-unsafe-eval', with a MEMORY_COMPRESSION_NO_EVAL switch and a <meta> policy check; view() opens lists of fewer than 16 objects) | done 2026-10-18 | the JS-modules continued thread (Oct 18) | Reported by the Netflow Map thread while building Netflow Map PR 18. 3 new checks (fail on 2.0.1); blocked-eval errors 1 to 0 per load and common-path speed a tie, in all four browsers (bench/csp-and-speed.js; raw results in /mnt/project-files/js-modules-research/memory-compression/2.0.2/). Not run: a phone, a policy sent as a header. |
| modules/memory-compression 2.0.3: the WebAssembly helper starts on the first pack or unpack, not at load (about 5.8 MB less on a page that never packs, 14.96 to 9.12 MB in Chromium 155; accelerated() is false until first use; ready() starts it early) | done 2026-10-18 | the JS-modules continued thread (Oct 18) | Brief from the Netflow Map move thread (/mnt/project-files/js-modules-research/memory-compression/2.0.3/). 1 new check (fails on 2.0.2); first pack 0 to 10 ms slower, later packs tied, bytes identical, in all four browsers (bench/lazy-start.js; raw results in .../2.0.3/results/). Memory measured in Chromium 155 only, by the Netflow Map thread. |
| modules/memory-compression README: tight quick-start (765 lines to 141, 87.4 KB to 13.8 KB); the full text moves to the private knowledge base | in review 2026-10-18 | the JS-modules continued thread; Network mapping improvement files the full copy | the owner's ask 2026-10-18. Full copy: /mnt/project-files/js-modules-research/memory-compression/README-full.md. Same shape wanted later for other long READMEs only if the owner asks. |
| modules/netflow-engine 0.1.0: placeholder and documentation for the Netflow Map engine as a module (no engine code yet; README with what is engine and what is add-on, the update rule, a draft of how add-ons plug in; AGENTS.md rule) | done 2026-10-18 | the JS-modules continued thread (Oct 18) | the owner asked for it on 2026-10-18. 3 Node checks. Not run: any browser (nothing to run). Replaced by 1.0.0 (next row). |
| modules/netflow-engine 1.0.0: the real engine of Netflow Map as one adaptable file (nine views, eleven network layouts, WebAssembly twins, use() hand-over for the layers and Sankey add-ons) | done 2026-10-18 | the JS-modules continued thread (Oct 18) | Brief from the Netflow Map move thread (/mnt/project-files/js-modules-research/netflow-engine/). 10 Node checks, 225 identical-layout comparisons on their side; the demo ran in all four approved browsers (test/demo-browsers.js, results in .../netflow-engine/1.0.0-results/). |
| modules/netflow-engine: "How it compares" with the layouts raced against d3-force, Cytoscape, dagre and ELK in the four browsers (bench in bench/compare/): faster in every finished case, 3.2x to 614x; ELK has about 0.4% to 3.6% fewer layered crossings at 1,000 and 3,000 items | done 2026-10-18 | the JS-modules continued thread (Oct 18) | Owed under the versions rule; plain-words record handed to Opus for the knowledge base |
| modules/netflow-engine and netflow-sankey: the Sankey view calls options, layout and apply on the Sankey add-on; netflow-sankey 2.0.0 had only layout, so sk options threw with it | done 2026-10-18 | the JS-modules continued thread | Fixed by netflow-sankey 2.1.0 (adds options and apply, copied unchanged from Netflow Map): 32 Sankey builds match the app's own engine with 0 differences in all four browsers. Engine README now names 2.1.0 or newer. Later briefs: long-link cap and its crossing-weight fix (2.2.0), tight/wide toggle, and the wording rule (the owner, 2026-10-18), which netflow-engine 2.0.0 completed (view id is sankey) |
| Open: older speed tables measured in Node remain in some module READMEs (lzma-decode, ppmd-decode, memory-compression, netflow-sankey, walker-sim and a few more); the owner's rule is browser numbers only | open, labeled 2026-10-18: the owner chose "label only", so each Node-timed section now starts with a plain "Node numbers" note (memory-compression, walker-sim, zip-open, gif-writer, netflow-sankey, netflow-layers, ppmd-decode; one-line labels in lzma-decode, slow-note, ppmd-pack); re-measuring in the four browsers is not planned unless he asks | | list found by the documentation sweep of 2026-10-18 |
| Open: fly-to-mini, canvas-probe, storage-probe, fuzz-kit, single-file-tools and firefox-stand-in say they were tested in retired browsers (Chromium 141 and 153, Firefox 157); a re-run in the four test browsers is not done | open, labeled 2026-10-18 | | the READMEs say so honestly; a re-run would replace those lines. the owner chose "label only" on 2026-10-18 (a first tap said re-measure; he corrected it): the READMEs of the Node-timed modules now carry a plain "Node numbers" note and no browser re-measuring is planned unless he asks |
| Trim 18 long module and tool READMEs into quick-starts (same shape as memory-compression) | done 2026-10-18 | JS-modules thread | Owner chose "Yes, all" after PR 74. 18 READMEs went from 357,006 to 246,931 bytes (smaller is better; about 31% less). Full text of each is kept as README-full.md under the project's research folder and filed in the private knowledge base. Lines 1-5 (title, Version, Tested in) are unchanged; no new numbers, every credit kept. Some stay large because they carry many measured tables and credits: fuzz-kit, pad-nav, ppmd-decode, sprite-baker, frame-kit, ppmd-pack. |
| modules/netflow-layers 1.3.0: spread option (tight or wide) for the Flow and Top-down layouts | done 2026-10-18 | the JS-modules continued thread | Asked for by the owner (narrow and tight, or looser and more tree-like, for wide screens). Applied from Netflow Map's brief unchanged. Top to bottom 1,353 to 1,618 pixels wide (1.2 times) on a 120-page map; no speed difference on 3,000 pages; file 28,868 to 29,807 bytes. The three factors are easy to change if the owner wants other looks. Netflow Map vendors it for its Look tab; netflow-engine 2.0.0 passes spread through. |
| Wasm first, pack tools (the owner's "Defaults first" tap, 2026-10-18): tools/lzma-pack 2.0.0 and tools/ppmd-pack 2.0.0 · API 2 (a changed default, so a major): packed pages now carry the WebAssembly decoder by default (+4.5 KB, +3.0% for LZMA; +9.7 KB, +6.0% for PPMd on Pineapple Defense), --no-wasm gives the old smaller page, --wasm still works; opens 1.15x to 1.36x (LZMA) and 1.23x to 1.64x (PPMd) as fast in the four test browsers; tests/pack-default-browser.js | in review (PR open) | the JS-modules continued thread | Next, one PR each: sprite-baker 1.6.0 and stage-curtains 1.2.0 (briefs approved by the owner) |
| Wasm first, walker-sim (the owner's "Defaults first" tap, 2026-10-18): modules/walker-sim 2.2.0 · API 2: the default file is now walker-sim-with-wasm.js / .min.js (the WebAssembly loop is on from the start; cfg.wasm = false and the JavaScript-only walker-sim.js stay); 1,000,000 walkers in a fresh page 1.5x as fast in Chromium and Firefox, but 14% to 28% slower in WebKitGTK and GNOME Web, stated plainly in the README and for the owner to weigh | done 2026-10-18 (PR 85) | the JS-modules continued thread | Next: the two pack tools (--wasm on by default), then sprite-baker 1.6.0 and stage-curtains 1.2.0 |
| Wasm first, decoders (the owner's "Defaults first" tap on the wasm-standard card, 2026-10-18): modules/lzma-decode 1.2.0 and modules/ppmd-decode 1.2.0 · API 1: the default file is now lzma-decode-with-wasm.js / ppmd-decode-with-wasm.js (the plain decoder and the WebAssembly one in one file; lzmaDecode / ppmd7Decode try WebAssembly first and fall back to JavaScript by themselves), the plain files stay for pages that must be tiny and for the packers; first decode in the four test browsers 1.48x to 2.60x (LZMA) and 1.42x to 1.84x (PPMd) as fast; default files re-run on a page that forbids WebAssembly in all four; tests/wasm-default-bench.js | done 2026-10-18 (PR 84) | the JS-modules continued thread | Next, one PR each: walker-sim, then the two pack tools (--wasm on by default); then the two briefs approved by the owner for sprite-baker 1.6.0 and stage-curtains 1.2.0 |
| Wasm fill for sprite-baker (approved on the owner's "Build it" card in Fancy Banana continued, 2026-10-18 23:25Z): modules/sprite-baker 1.6.0 · API 1: new optional add-on sprite-baker-wasm.js (SpriteBaker.wasm() gives a Rast and drawMesh with the buffers in wasm memory; source wasm/tri.c, rebuild wasm/build.sh, lean wasm 5,561 bytes); 833 scenes the same bytes in Node and the four browsers; baking 1.1 to 1.4 times faster in Chromium 155 and Firefox 158, picture-only gains in the WebKit browsers (coin 0.86x); plain JavaScript is the fallback; brief /mnt/project-files/js-modules-research/sprite-baker-wasm/BRIEF-apply.md, records in results-1.6.0/ | done 2026-10-18 | the JS-modules continued thread | Fancy Banana adopts it in its own thread after its queued sprite-baker swap |
| Wasm curtain painter for stage-curtains (approved on the owner's "Build it" card in Apple Press continued, 2026-10-18 23:26Z): modules/stage-curtains 1.2.0 · API 1: the velvet pixel loop is a 1,510-byte WebAssembly function embedded in the file (plain JavaScript loop kept as fallback; create({ wasm: false }) forces it; StageCurtains.wasmAvailable()); first paint of one phone-size half 1.38x (Chromium), 1.64x (Firefox), 1.41x (WebKitGTK), 1.48x (GNOME Web) as fast with the same picture (112 curtains, 0 pixels differ in 12 of 12 runs); repeat paints gain 1.0 to 1.36x, slowest slice unchanged; +2,038 bytes gzipped; tests/stage-curtains-wasm-browser.js | done 2026-10-19 (PR 88) | the JS-modules continued thread | Next: tell the orchestrater so Apple Press swaps its velvetPainter for the module's (keeps 'wasm-unsafe-eval' on its page). Not run: a phone, Safari |
| modules/sprite-baker 1.6.1 (bug report from the Fancy Banana thread): the WebAssembly add-on read a null last argument of drawMesh as back-face cut 0 instead of -0.75 (about 79 pixels per picture missing, 15 of 148 buffers in Fancy); now the same as the plain code; new check on 6 scenes x 10 forms of the last argument fails on 1.6.0; 893 scenes, 0 differ in the four test browsers | done 2026-10-19 (PR 89) | the JS-modules continued thread | Not run: a phone, Safari |
| Wasm checksum for zip-open (the wasm-standard rule, Opus relay 2026-10-19 00:27Z): modules/zip-open 1.2.0 · API 1: CRC-32 as a 1,476-byte WebAssembly function (slicing by 16) used from 1,024 bytes up, plain loop as fallback (crc32(bytes, true) forces it, ZipOpen.wasmAvailable()); 20 MB buffer 1.28x (Chromium), 1.67x (Firefox), 1.67x (WebKitGTK), 1.60x (GNOME Web) as fast, 1,860 of 1,860 checksums identical in 12 of 12 runs; pieces under 1 KB and the first checksum on a fresh page unchanged; +1,103 bytes gzipped; tests/zip-open-crc-browser.js now takes one browser at a time | done 2026-10-19 (PR 90) | the JS-modules continued thread | Next: gif-writer, netflow-sankey order search, netflow-layers (each prototyped and timed first; only winners ship). Not run: a phone, Safari |
| modules/netflow-engine 2.1.0 · API 2 (approved by the owner on the Netflow Map move thread's card, 2026-10-19 00:34Z; brief /mnt/project-files/js-modules-research/netflow-engine/2.1.0/): new stress3d arrangement (Distances 3D); more WebAssembly in wasm/stress.c (sweeps3, closeness, separate_sparse; 5,616 to 8,013 bytes), same positions as the plain code to the last digit; flat Force starts from the Distances picture at 5,000 to 20,000 items (1.5 to 2.4 times faster at 5,000 and 10,000 items); file 191 KB to 200 KB | done 2026-10-19 (PR 91) | the JS-modules continued thread (applied from the Network mapping thread's diff) | This thread ran: 13 Node checks, stress.wasm rebuilt byte for byte from stress.c, files identical to the brief's proposed tree. The four-browser proof (5 builds each, 0 differences) was run by the Netflow Map thread on the same file; it needs the private Netflow Map checkout, so it was not rerun here |
| tools/test-runner 1.0.0 · API 1 (testing-and-build rules approved 2026-10-19 00:58Z: shared test runner, warm browsers, twin test, picture fingerprint gate, skip-unchanged builds, auto-bisect): one background process keeps the four test browsers open and every check attaches to it; one tiny job cold to warm in ms (smaller is better) Chromium 155 367 to 78, Firefox 158 2,553 to 284, WebKitGTK 2.52.6 591 to 33, GNOME Web 46.5 6,035 to 104; also fair rotating timing with the 5% guard, wasm-vs-JavaScript twin compare, hash-the-inputs skip for wasm builds, picture fingerprint gate, bisect; tools/webkit-driver 1.3.0 adds attach() | PR open 2026-10-19 | the JS-modules continued thread | 21 Node checks and tests/test-runner-browser.js (4 of 4 PASS). Still to build from the same rules: background fuzz-kit mode, shared speed-recorder and error-log buttons. Kits already have --changed (affected-checks picker) |
| modules/pcodec-js 1.1.0 · API 1 (brief from Compression improvement, relayed by Opus 2026-10-19): unpackAsync() in 2 ms slices (longest page freeze for 2,000,000 numbers 68 / 156 / 47 / 68 ms down to 2.9 / 4 / 5 / 6 in Chromium / Firefox / WebKitGTK / GNOME Web, smaller is better), PcodecJS.worker() (pack freeze 169 / 207 / 181 / 180 ms down to 4.6 / 8 / 5 / 5 with the array handed over), compile early with the compiled module handed to workers (load() wait 7.3 / 15 / 17 / 12 ms down to 0.2 / 0 / 0 / 0.5); wasm unchanged, 872 checks pass for both readers; demo and test pages gain worker-src blob:; files grow about 1.5% (pcodec-js.js 168,183 to 176,051 B) | PR open 2026-10-19 | the JS-modules continued thread | Plain unpack/pack speed was not re-measured (wasm and call path unchanged). Storing compiled wasm in the browser was tried and dropped by the owner's decision |
| Compile early (the owner's card 2026-10-19 01:26Z replaces storing compiled wasm): modules/sprite-baker 1.7.0, modules/lzma-decode 1.3.0, modules/ppmd-decode 1.3.0 start WebAssembly.compile when the file loads and add ready() / module() (the compiled module, for workers); asked early they compile on the spot as before. Measured: compiling a program under 10 KB on the page costs 0 to 1 ms in all four browsers (so this saves at most that); load plus first use old to new within about 1 ms both ways; pcodec-js programs cost 2 to 7 ms to compile (Chromium 1 to 1.8). New tests/wasm-compile-cost-browser.js and tests/compile-early-browser.js | PR open 2026-10-19 | the JS-modules continued thread | Next: walker-sim, zip-open, gif-writer, netflow-engine, stage-curtains, memory-compression (and netflow-sankey, in PR 93); pcodec-js 1.1.0 brings its own. Fancy Banana asked for sprite-baker and lzma-decode |
| modules/netflow-sankey 2.3.0 · API 2 (wasm-standard rule, Opus relay 2026-10-19 00:27Z): the order search (crossing counts, column sorts, swaps) as a 5,319-byte WebAssembly function, same layouts (48 of 48 identical, with and without the CSP word, 12 of 12 browser runs), plain JavaScript as fallback (opts.wasm: false, NetflowSankey.wasmAvailable()); small chart 1.58x (Chromium), 1.88x (Firefox), 1.24x (WebKitGTK), 1.16x (GNOME Web) as fast, medium 1.65x, 1.65x, 1.04x, 1.05x, big 1.11x, 1.07x, 1.00x, 0.98x (WebKit retimed with 9 rounds); compile early added (wasmReady(), wasmModule()); first layout right after load 1.32x, 1.55x, 1.07x, 0.89x, 250 ms later 1.48x, 1.64x, 1.00x, 1.00x (GNOME Web right after load is the one cell over the 5% guard); +4,301 bytes gzipped | PR open 2026-10-19 | the JS-modules continued thread | Same PR removes a duplicate 1.2.0 entry from gif-writer's CHANGELOG.md. Next: netflow-layers (profile first). Not run: a phone, Safari |
| Wasm for gif-writer (the wasm-standard rule, Opus relay 2026-10-19 00:27Z): modules/gif-writer 1.2.0 · API 1: the palette search (histogram, median cut, k-means) and the picture encoder (palette lookup, comparison with the last picture, LZW) run as one 8,892-byte WebAssembly file (wasm/gif.c), same colors and same GIF bytes (116 palette sets, 17 encoder scenes, 16 GIFs in 12 of 12 browser runs); photo palette 1.45x to 1.91x, photo encoding 1.59x to 2.11x, flat game picture encoding 1.66x to 2.17x, first small GIF on a fresh page 41.6 to 20.1 ms in Chromium; tiny-change GIFs (small block over a still background) tie or lose 3% in the two WebKit browsers (flagged on the card); +8,056 bytes gzipped; makePalette(..., { wasm: false }), createEncoder(..., { wasm: false }), GifWriter.wasmAvailable(); tests/gif-writer-wasm-browser.js | in review (PR open) | the JS-modules continued thread | Next: netflow-sankey order search, netflow-layers, a shared speed-recorder module. Not run: a phone, Safari |
| modules/netflow-engine 2.0.0 · API 2: the Sankey view id is sankey; spread tight or wide passed to the story views | done 2026-10-18 | the JS-modules continued thread | Asked for by the owner (the retired view name removed everywhere; tight / wide switch). Applied from Netflow Map's brief unchanged (file matches the proposed tree). Breaking: the old id now draws the Flow picture. 11 Node checks pass; the brief's 135 builds plus 6 Sankey builds match Netflow Map's own engine with 0 differences in all four browsers. Needs netflow-layers 1.3.0 for spread (older copies ignore it) and netflow-sankey 2.1.0 for Sankey options. The competitor benchmark is run against this version next. |
| modules/netflow-sankey 2.2.0 · API 2: long-link cap (past 20,000 stand-ins the lightest long links are drawn as one straight band; simplified and note in the result) and a crossing count that is never NaN; 400-item chain build 126 to 375 ms down to 44 to 106 ms (lower is better), 1,100-item network 90 to 179 ms down to 55 to 84 ms across the four browsers | done 2026-10-18 | the JS-modules continued thread | From the Netflow Map move thread's brief, relayed by Opus |
| modules/netflow-sankey 2.2.1 · API 2: an empty drawing has height 0 instead of -Infinity (one line); 24 Node checks pass (23 old, 1 new); same pictures as Netflow Map's own engine on 36 builds in the four browsers, 0 differences; file 37,775 to 37,790 bytes | done 2026-10-18 | the JS-modules continued thread | Netflow Map needs it to move onto the module; brief relayed by Opus |
| Two changelogs (the owner's rule, 2026-10-18): the 38 module and tool changelogs and the root one are now short end-user versions (one plain line per change; 162,931 bytes down to 32,499 for the 38 module and tool files, root 119,419 to 19,021 bytes; smaller is better); the full ones are in /mnt/project-files/changelogs-full/JS-modules/<id>.md for the knowledge base; versions.py set writes both (--short and --note) and check verifies both; the owner's first name removed from TASKS.md and the changelogs | done 2026-10-18 | the JS-modules continued thread | History before this PR still holds the first name in older commits |
| Regroup the catalog into the owner's categories (Modules & Tools 38 in 11 groups, Story editor packages 10 in 6 groups, AI knowledge base 1) | done 2026-10-18 | the JS-modules continued thread | the owner's list matched all 49 pieces exactly (none missing, none extra). modules.json categories now has three sections with groups; every entry has one category and no side. versions.py writes the README glance index and tables from it (a tool is marked (tool)); index.html and llms.txt regrouped by the same lists; the org page follows in its own PR. Rows stay sorted by name inside each group (the owner's list had two groups out of name order: Visualization and Size and packaging). |