Repository navigation
v1.1.0
1.1.0 - 2026-11-01
The two bugs from the first hardware session, the V2 tools, and the machinery
that stops the next one. Not run on a device yet: the 1.0.0 rows in
docs/HARDWARE.md are the only hardware results that exist.
-
A hardware report you can fill in on the calculator (V2, workstream J):
Settings gained F3, which opens a screen listing the eight assumptions
Bench makes about the CASIO filesystem, the font, ALPHA, the clock and the
frame time. Each row starts atnot tried; LEFT/RIGHT marks itworksor
failsafter the matching test indocs/HARDWARE.md. F2 writes
state/hwreport.txtin plain text, so the result comes off the calculator by
copy rather than by retyping, and nothing is written at any other moment.
The formatter issrc/core/hwreport.c(63 native checks, including a buffer
that is one byte too small), anddocs/HARDWARE.mdsays how the file slots
into the report. -
A shared number field and a history of answers (V2, workstream A5):
src/core/numedit.cis the one place that decides what a numeric field
accepts - digits, at most one dot, a lone zero replaced rather than stacked, a
leading dot turned into0.- withnumedit_valid()for "would numparse read
this?" (54 checks). The moles screen was carrying its own copy, which is how
1.2.3got in; it now uses the shared one.src/core/history.ckeeps the last
eight formatted results (33 checks) and the Root finder pushes every solve onto
it, with F4 to show the list - a panel, not a file, so nothing is written to
flash. -
WebAssembly build, and the loader that copes without it (V2, workstream
G):tools/sim/sim.cgains an__EMSCRIPTEN__path - keys from the page,
the framebuffer handed back as RGBA - andtools/wasm/build.shcompiles the
same sources the screenshots come from with emscripten and Asyncify. The
binary is a build artifact and is not in git: the site's/simulatorpage
loads it when this deployment has one and says so in one line when it does
not, and the gallery stays underneath either way. CI has an optional job for
it. Not built or run here: there is no emscripten in this environment, so
the C is unverified by compilation. -
Browser widths in CI (V2, workstream B):
site/scripts/check-widths.mjs
loads all eight routes at 320, 390, 768, 1024 and 1440 px and fails on a
horizontal scrollbar, an element that crosses the right edge or one wider than
the viewport. Chromium could not be downloaded here, so the sweep has only run
in CI; the result of that first run is in the pull request. -
Demo content (V2, workstream D):
demo/holds three notes, three decks
and a fortnight study log so a fresh install is not three empty screens. The
text is written from scratch, not copied from a booklet or a past paper, and
demo/README.mdsays in its first section that it needs human proofreading.
tests/test_demo_files.creads every demo file with the add-in's own parsers
(108 checks) and fails on a single skipped line, so the sample cannot rot into
something the calculator refuses to read. -
The site is eight pages, not one (V2):
/features,/simulator,
/tutorial,/install,/downloads,/changelogand/aboutjoin the
landing page, which keeps its layout.src/router.jsxis a 120-line path
switch with real<a href>s, so back, forward, middle-click and a shared link
all work;vercel.jsonrewrites every path toindex.html. Every route sets
its own title, description, canonical and Open Graph image.
scripts/gen-stats.mjsandscripts/gen-changelog.mjswrite the numbers and
the changelog fromCHANGELOG.md,docs/tools.jsonandsrc/, and
scripts/check-pages.mjsrenders all eight routes in Node and fails the build
if one throws. Eight 1200x630 Open Graph cards come from
tools/brand/make_brand.py. The canonical URL is now
bench-gdc.vercel.appeverywhere;sitemap.xmllists all eight
routes. -
The simulator page is honest about the simulator: the interactive
WebAssembly build (workstream G) is not done, and the page says so instead of
pretending. What it shows today is the real frame buffer: 75 captures made by
the add-in's own simulator. -
Settings, five rows (V2):
src/core/settings.cgains two keys,
angle_unit(0 degrees, 1 radians) andtour_done(0 or 1). The screen now
lists the unit the Triangle tool opens in and whether the first-run line on
the home screen has been read;app_triangle_init()takes its starting unit
from the setting, and F3/F4 still switch for that session only, without
writing the file. A settings file from 1.0.0 still loads: the new keys fall
back to their defaults. 687 native checks intests/test_settings.c.
Unverified on device. -
First-run hint (V2): with
tour_done 0the home screen prints one line
above the softkeys - "F1-F4 categories, F5 explains a tile, EXE opens it" -
and opening help with F5 setstour_doneand writes the file once. -
Complex numbers (F6):
src/core/cplx.cadds, subtracts, multiplies,
divides (division by zero is a NaN, not a wrong number), raises to an integer
power and reports the modulus, the argument (withbm_atan2, new in
src/core/mathfn.c) and the polar form.src/apps/app_cplx.cshows all three
at once, F2 cycles the operation, F3/F4 pick degrees or radians in the title
bar. 37 native checks. Unverified on device. -
The M1 spike has its own artifact. It used to ride inside
bench-g3a,
next to the add-in, so the thing you download to get Bench offered two
.g3afiles and one of them printed diagnostics.bench-g3anow holds
Bench-<version>.g3aand nothing else; the spike is inbench-spike. It was
never a release asset and still is not. -
Root finder (F4):
src/core/roots.cdoes bisection, Newton (numeric
derivative, step 1e-6) and the secant method, keeping every iterate so the
screen can show n, x, f(x) and the step size.src/apps/app_roots.csolves
from the shared expression engine, F2 cycles the method, F3 solves, and a
small plot marks each iterate on the curve. A bracket with no sign change, a
zero slope and a parse error each get their own sentence and column. 40
native checks. Unverified on device. -
Statistics with working (F7):
src/core/stats.cgives n, sum, mean,
median, mode, range, both quartile methods, the outlier fences and the
population and sample standard deviations (53 native checks). Paired data
gets the least squares line, r and r squared.src/apps/app_stats.cadds
values as you type them, shows the summary and a box plot, has a screen for
the working and a screen for the regression. Unverified on device. -
SUVAT and projectiles (F10):
src/core/suvat.csolves any three of s, u,
v, a and t, one table entry per triple, and reports the equation each answer
came from; when a quadratic gives two sensible times it keeps the first and
names the second (73 native checks).src/apps/app_suvat.cfills the grid as
you type, marks worked-out values with a dot, and draws the flight path for a
launch speed, angle and height. Unverified on device. -
Moles and solutions (F11):
src/core/chem.ccovers n = m / Mr, c = n / V,
pV = nRT with R in kPa dm3, dilution and the two percentages, refusing a zero
where a formula divides (47 native checks).src/apps/app_moles.chas one
mode per family, opens each on a worked example, and writes the substitution
out under the answer. Unverified on device. -
Base and bits (F12):
src/core/base.cparses and prints any base from 2
to 36, writes two's complement at 8, 16 and 32 bits (hex padded to the width,
binary grouped in fours), and does AND, OR, XOR and logical shifts, refusing a
shift of 63 or more (78 native checks).src/apps/app_base.cshows one value
in five bases with all three widths, and a second tab for the operators; F2
opens the letter keyboard because the keypad has no A-F keys. Unverified on
device. -
Lab graph (F8):
src/core/graph.cfits a line to measured points and
quotes the standard error of the gradient and the intercept from the
residuals, plus a round axis range for the plot (42 native checks).
src/apps/app_graph.ctakes x, y and an error per point, lists them with the
fit, and draws the graph with a bar through each point and the line of best
fit. Unverified on device. -
Study log (F13), Notes v2 (F14) and Cards v2 (F15): a plain text
log of what you studied and for how long, with totals, days logged and the
longest streak (src/core/logbook.c, 56 native checks); the Notes footer now
counts words as well as lines (textsearch_words, 6 more checks); and a
Cards deck can be drilled in a mixed order inside each box
(leitner_shuffle, deterministic for a session, 8 more checks). Bench cannot
read the calendar - gint's date fields were never checked on the hardware - so
a log entry takes the day after the newest one and UP/DOWN moves it.
Unverified on device.
Fixed
- Home tiles: the icon vanished on the selected tile. The icon was painted
in the tool's accent colour on a tile filled with that same colour. Every
foreground is now chosen by measurement (col_better_on), the icon is drawn
with a 2 px outline, and a check samples the pixels afterwards. This is
unverified on device: nobody has looked at the new screen on a calculator yet. - Labels drawn in a colour too close to their background. Ink on red is
2.75:1, paper on teal 3.00:1, a red cursor on the yellow field 2.91:1. Text is
now ink or blue on paper, and a selected tile is ink with paper text instead
of a tinted tile with a paper plate under the label. - The keyboard covered half of the note behind it. The modal now clears the
content area first, and the space key is marked instead of being drawn as an
empty cell. - A 57-character file name ran across the whole title bar.
w_title()now
cuts the title to the room it has, andSTORE_NAME_MAXwent from 48 to 72 so
such a file is listed at all. - Markdown code spans painted over the character before them, and code was
teal on shade (2.28:1). The background starts after the previous span, and
code is ink on shade.
Added
- The .g3a lives in the repository, at
dist/Bench-<version>.g3a, with
BUILD.txtrecording the commit, size and SHA-256. Release assets and
artifacts both come from blob storage, which some networks cannot reach; a git
remote is plain git. CI refreshesdist/for tagged and automatic builds with
a[skip ci]commit, so the copy does not go stale. - The M1 spike as one patch:
spike/spike.diffholds the whole diagnostic
add-in, generated fromspike/bytools/gen_spike_patch.py
(make spike-patch).git apply spike/spike.diffon a tree withoutspike/
reproduces it byte for byte; CI fails if the patch and the sources disagree.
The spike still is not on any release. - Home screen v2: four categories on F1..F4, a 3 x 2 page of tiles, page
dots when a category has more than one page, and a dashboard strip on Study
that counts the decks and notes on the card. The selected tile keeps the
tool's accent as its fill, a 3 px border and a hard shadow; everything on it
is coloured by measurement, and a subtitle the palette cannot carry gets a
paper plate hugging the words. Unverified on device. - Sequences and binomials (F5):
src/core/seq.cdoes arithmetic and
geometric terms and sums, the sum to infinity, exactC(n,k)(cancelling
before multiplying, so it can answer up to n = 62 instead of wrapping) and
Pascal's rows.src/apps/app_seq.cis three screens with the first few terms
listed under the answers. 41 native checks. Unverified on device. - Triangle solver (F2):
src/core/triangle.csolves SSS, SAS, ASA/AAS and
SSA from whatever is given, with the ambiguous SSA case reporting two
triangles rather than silently picking one.src/apps/app_triangle.cis six
fields, the answers written back into them, area and perimeter underneath,
and F2 to swap between the two SSA triangles. 42 native checks.
Unverified on device. - Polynomials (F3), quadratics and the arithmetic behind them:
src/core/poly.cparses and prints polynomials, adds, subtracts, multiplies,
expands(ax + b)^n, divides with quotient and remainder, solves a quadratic
with real or complex roots, and factors over the rationals with the rational
root theorem.src/apps/app_poly.cis three screens - quadratic (disc,
roots, vertex, factor pair), expand, and roots from typed coefficients.
83 native checks. Unverified on device. - Sig figs and standard form (F9), the second of the fifteen:
src/core/sigfig.ccounts figures on the text (so1200is 2 and1200.is
4), rounds half-up on the decimal digits, and writes standard form and SI
prefixes without a unit of its own.src/apps/app_sigfig.chas six modes -
count, round to n figures, round to n decimals, standard form, SI prefix and
a practice question with a score. 41 native checks. Unverified on device. - Home screen: one clean block. A page shows only the rows it needs, the
grid is centred in what is left, and the softkey strip reads Study, Math,
Science, Tools, Help, About - F5 is help for the selected tile here as it is
on every other screen, so Settings is a tile and not a second meaning for F5.
Unverified on device. - Function table (F1), the first of the fifteen:
src/core/expr.cis a
shunting-yard parser (fixed 32-entry stack, implicit multiplication, column
numbers on every error),src/core/exprs.creads and writes the six slots,
andsrc/apps/app_function.cis the slot list, the table and the probe.
Unverified on device. src/core/mathfn.{c,h}: sqrt, exp, ln, log10, pow, sin, cos, tan and the
degree conversion in plain C — no libm, no gint, so the calculator build and
the host tests run the same code. 85 native checks against the textbook
values. This is the ground the expression engine (A5) stands on.src/core/color.{c,h}: 5-6-5 packing, WCAG luminance and contrast, no libm.
lin_table.his generated bytools/gen_lin_table.py. 80 native checks.src/apps/registry.{c,h}: the single list of tools (id, title, subtitle,
category, accent, icon, screen, help). The home screen reads it, and
tools/gen_tools_json.pywritesdocs/tools.jsonfrom it via the host build.- A home screen with categories on F1..F4, a 3 x 2 tile grid, pages with dots,
a dashboard strip on Study, and the selected tile's hard shadow. This is
unverified on device. - Help on every screen (F5). One page per tool, rendered from the tool's
registry row: no second copy to drift. Paging (count, copy, clamp) is
src/core/help.c, 37 native checks. On the home screen F5 shows the help for
the tile under the cursor; in a tool it shows that tool's help; EXE or EXIT
returns to the screen that asked. Unverified on device. - Screens with no softkeys draw a plain hint strip (
w_strip) instead of six
empty divider cells, and an empty F5 slot advertises F5 as help. make check-screens(part ofmake test): every key script is checked for
overlapping labels, labels off-screen, labels in the title bar or softkey
strip, labels painted over, text under WCAG AA, softkey labels too wide, and
icons that match their tile. 30 scripts, 0 findings.- Worst-case screens: a 120-character deck, a 57-character file name with
89-character table cells. docs/design.md: the palette with measured contrast ratios, the rules, and
the checks that enforce them.
Changed
STORE_NAME_MAX48 -> 72. Storage layout unchanged: existing files are read
as before, nothing moves.theme.hcolour constants regenerated fromcol_rgb565(); six of the eight
were one step out.