Skip to main content
T·M TOMFORMER live research instrument Patent pending

Handheld sensing unit / separate device

Point it at a surface. It names what it has evidence for and says unresolved for the rest.

A battery-powered unit reads 19 optical channels and answers with every label it can support, each one carrying its own score and its own threshold. Its catalog lives on a memory card. A surface it has never seen can be taught in the field in seconds, with no host computer and no retraining. Everything it already knew reads the same afterwards.

wrong names in 1,219 gate reads

0

Run mlc_v13_s21b, the gate that had to pass before the catalog was pushed to the card. 4,312 label assertions were made across those reads and 346 labels were considered and left unresolved. A run ships only at zero wrong names.

resident on the device

126,264

bytes, sized by stat on the shipped file. The same size to the byte at every deployed catalog from 37 labels to 50 at the largest, and a field write never modifies it.

labels answered per reading

3

on the surface read below, held on all 181 reads of a 20 second census.

Reading 1 / one surface, several true answers

Every label gets its own score and its own threshold.

The unit was held against a knotty pine interior wall. It considered 8 labels and asserted three of them. The three it declined stay on screen with their numbers. Dropping them would look like they were never considered.

verdict
NO FLAG
nearest recorded sample
knotty_pine_wall_s102
captured
2026-08-13, under the 37-label build deployed that day
0 score wood wood: score 0.5246, threshold 0.0460, asserted >=0.525 ASSERTED pine pine: score 0.0982, threshold 0.0460, asserted 0.098 ASSERTED knotty knotty: score 0.0982, threshold 0.0420, asserted 0.098 ASSERTED cherry cherry: score -0.0982, threshold 0.0558, unresolved -0.098 UNRESOLVED shellac shellac: score -0.0982, threshold 0.0558, unresolved -0.098 UNRESOLVED smooth smooth: score -0.0982, threshold 0.2125, unresolved -0.098 UNRESOLVED asserted unresolved that label's own threshold
Scores and thresholds as reported by the unit on 2026-08-13, under the 37-label build deployed that day. A score shown with >= is a lower bound: when every nearby recorded sample carries the label, the unit reports the bound and does not round it up.
Every label considered on the reading, with its score, its threshold and its outcome
label score threshold outcome
wood >=0.5246 0.0460 asserted
pine 0.0982 0.0460 asserted
knotty 0.0982 0.0420 asserted
cherry -0.0982 0.0558 unresolved
shellac -0.0982 0.0558 unresolved
smooth -0.0982 0.2125 unresolved

Record / the gate the deployed catalog passed

All 49 labels, including the ones that never fired.

1,219 reads across 36 recorded surfaces. Each read can assert several labels, so the counts below add up to more than the read count. Four labels were considered on every applicable read and asserted on none of them; they are in the chart at zero.

asserted
4,312
wrong
0
unresolved
346
0 612 readings wood wood: 612 asserted, 0 unresolved, 0 wrong, evidence from 14 surfaces 612 smooth smooth: 347 asserted, 13 unresolved, 0 wrong, evidence from 6 surfaces smooth: 13 unresolved of 360 considered 347 +13 unresolved living living: 324 asserted, 0 unresolved, 0 wrong, evidence from 10 surfaces 324 leaf leaf: 324 asserted, 0 unresolved, 0 wrong, evidence from 10 surfaces 324 raw raw: 279 asserted, 4 unresolved, 0 wrong, evidence from 10 surfaces raw: 4 unresolved of 283 considered 279 +4 unresolved squash squash: 212 asserted, 4 unresolved, 0 wrong, evidence from 6 surfaces squash: 4 unresolved of 216 considered 212 +4 unresolved leaf_top leaf_top: 204 asserted, 0 unresolved, 0 wrong, evidence from 5 surfaces 204 pine pine: 165 asserted, 3 unresolved, 0 wrong, evidence from 3 surfaces pine: 3 unresolved of 168 considered 165 +3 unresolved walnut walnut: 168 asserted, 0 unresolved, 0 wrong, evidence from 3 surfaces 168 cherry cherry: 142 asserted, 14 unresolved, 0 wrong, evidence from 3 surfaces cherry: 14 unresolved of 156 considered 142 +14 unresolved shellac shellac: 122 asserted, 10 unresolved, 0 wrong, evidence from 2 surfaces shellac: 10 unresolved of 132 considered 122 +10 unresolved paper paper: 120 asserted, 0 unresolved, 0 wrong, evidence from 5 surfaces 120 leaf_bottom leaf_bottom: 120 asserted, 0 unresolved, 0 wrong, evidence from 5 surfaces 120 buttercup buttercup: 57 asserted, 51 unresolved, 0 wrong, evidence from 2 surfaces buttercup: 51 unresolved of 108 considered 57 +51 unresolved knotty knotty: 105 asserted, 3 unresolved, 0 wrong, evidence from 1 surface knotty: 3 unresolved of 108 considered 105 +3 unresolved rough rough: 96 asserted, 0 unresolved, 0 wrong, evidence from 5 surfaces 96 epoxy epoxy: 96 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 96 plastic plastic: 12 asserted, 84 unresolved, 0 wrong, evidence from 4 surfaces plastic: 84 unresolved of 96 considered 12 +84 unresolved zucchini zucchini: 63 asserted, 21 unresolved, 0 wrong, evidence from 2 surfaces zucchini: 21 unresolved of 84 considered 63 +21 unresolved weathered weathered: 72 asserted, 0 unresolved, 0 wrong, evidence from 3 surfaces 72 chili_pepper chili_pepper: 59 asserted, 1 unresolved, 0 wrong, evidence from 2 surfaces chili_pepper: 1 unresolved of 60 considered 59 +1 unresolved black black: 12 asserted, 48 unresolved, 0 wrong, evidence from 2 surfaces black: 48 unresolved of 60 considered 12 +48 unresolved spalted spalted: 48 asserted, 0 unresolved, 0 wrong, evidence from 2 surfaces 48 maple maple: 48 asserted, 0 unresolved, 0 wrong, evidence from 2 surfaces 48 tomato tomato: 45 asserted, 3 unresolved, 0 wrong, evidence from 2 surfaces tomato: 3 unresolved of 48 considered 45 +3 unresolved cardboard cardboard: 36 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 36 paduak paduak: 36 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 36 petg petg: 36 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 36 sheetrock sheetrock: 29 asserted, 2 unresolved, 0 wrong, evidence from 1 surface sheetrock: 2 unresolved of 31 considered 29 +2 unresolved ash ash: 24 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 24 end_grain end_grain: 24 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 24 waxed waxed: 24 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 24 blue_shop_towel blue_shop_towel: 24 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 24 butternut butternut: 23 asserted, 1 unresolved, 0 wrong, evidence from 2 surfaces butternut: 1 unresolved of 24 considered 23 +1 unresolved coated coated: 24 unresolved of 24 considered 0 +24 unresolved hdpe hdpe: 24 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 24 picnic_table picnic_table: 24 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 24 polypropylene polypropylene: 24 unresolved of 24 considered 0 +24 unresolved pelican_case pelican_case: 24 unresolved of 24 considered 0 +24 unresolved felt felt: 24 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 24 fabric fabric: 24 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 24 printer_paper printer_paper: 24 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 24 toilet_paper toilet_paper: 24 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 24 duct_tape duct_tape: 12 unresolved of 12 considered 0 +12 unresolved paper_plate paper_plate: 12 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 12 styrofoam styrofoam: 12 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 12 foam foam: 12 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 12 polystyrene polystyrene: 12 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 12 white_oak white_oak: 12 asserted, 0 unresolved, 0 wrong, evidence from 1 surface 12 asserted, and correct on every one considered and left unresolved
Run mlc_v13_s21b, 2026-08-18. Label names in the darker ink have evidence from more than one surface. The 24 in lighter ink so far have evidence from a single surface each, and the page reports them that way. None of them is claimed as a learned property yet.

held out and re-read

0.000

Six labels were removed one at a time and their surface was re-read. The absent label was named on none of those reads. 6 labels were tested this way.

evidence spanning surfaces

25 / 49

labels have been recorded on more than one surface. A label recorded on a single surface may be a stand-in for that surface, so the surface count is published beside every label.

where the unresolved mass sits

231 / 346

of the unresolved readings belong to five labels: the dark-polymer family, which sits close together on this front end, and one squash species whose evidence is still thin. The unit declines rather than guessing in both cases.

Structure / one table, read two ways

A recording carries several labels. A label spans several recordings.

The catalog stores recordings of surfaces and the labels each recording carries. Nothing else defines a label: its meaning is the set of recordings that carry it, so a label is general when many diverse recordings carry it and granular when few do. The two cards below read the same table from its two ends, and they meet on one label.

one recording, several labels

cherry_shellac

A shellacked cherry desktop. The catalog holds no combined entry by that name: the recording carries 4 labels, and the unit scores each one on its own evidence and its own threshold.

  • wood also carried by 13 other recorded surfaces
  • cherry also carried by 2 other recorded surfaces
  • shellac also carried by 1 other recorded surface
  • smooth also carried by 5 other recorded surfaces

one label, several recordings

shellac

  • cherry_shellac a shellacked cherry desktop
  • walnut_shellac a shellacked walnut box

Two different woods under the same finish. The finish is the part the two recordings share, so the finish is what this label holds evidence for. Each wood species is carried by its own label on the same recordings.

This is what keeps the catalog small as it grows. A new shellacked surface adds one recording, the shellac label gains evidence, and no combined name is ever minted for the pair.

the same labels, arranged by a curator

The tree below is a curator's arrangement of the same labels, carried as data beside the catalog. The identification path never reads it, and the labels outside any family prove the arrangement is optional. Every count is the same surface count published in the record above.

  • wood 14 surfaces
    • smooth 6 surfaces
    • rough 5 surfaces
    • cherry 3 surfaces
    • pine 3 surfaces
      • knotty 1 surface
    • walnut 3 surfaces
    • maple 2 surfaces
    • shellac 2 surfaces
    • spalted 2 surfaces
    • ash 1 surface
    • end_grain 1 surface
    • epoxy 1 surface
    • paduak 1 surface
    • waxed 1 surface
    • white_oak 1 surface
  • leaf 10 surfaces
    • squash 6 surfaces
      • buttercup 2 surfaces
      • butternut 2 surfaces
      • zucchini 2 surfaces
    • leaf_bottom 5 surfaces
    • leaf_top 5 surfaces
    • chili_pepper 2 surfaces
    • tomato 2 surfaces
  • paper 5 surfaces
    • blue_shop_towel 1 surface
    • cardboard 1 surface
    • paper_plate 1 surface
    • printer_paper 1 surface
    • toilet_paper 1 surface
  • plastic 4 surfaces
    • foam 1 surface
    • hdpe 1 surface
      • picnic_table 1 surface
    • petg 1 surface
    • polypropylene 1 surface
      • pelican_case 1 surface
    • polystyrene 1 surface
      • styrofoam 1 surface
  • fabric 1 surface
    • felt 1 surface

outside any family

  • living 10 surfaces
  • raw 10 surfaces
  • weathered 3 surfaces
  • black 2 surfaces
  • coated 2 surfaces
  • duct_tape 1 surface
  • sheetrock 1 surface

the garden, recording by recording

Ten recordings of five living plants, against the ten labels they share. A filled cell means that recording carries that label, so a label's evidence is the union of its column: general labels have long columns, granular ones short, and both kinds sit over the same recordings.

Membership of the ten garden recordings across the ten labels they share. A filled cell means the recording carries the label. The final row counts the recordings carrying each label.
living leaf leaf_top leaf_bottom squash tomato chili_pepper zucchini butternut buttercup
tomato_leaf_top carries living carries leaf carries leaf_top carries tomato
tomato_leaf_bot carries living carries leaf carries leaf_bottom carries tomato
chili_pepper_leaf_top carries living carries leaf carries leaf_top carries chili_pepper
chili_pepper_leaf_bot carries living carries leaf carries leaf_bottom carries chili_pepper
zucchini_leaf_top carries living carries leaf carries leaf_top carries squash carries zucchini
zucchini_leaf_bot carries living carries leaf carries leaf_bottom carries squash carries zucchini
butternut_leaf_top carries living carries leaf carries leaf_top carries squash carries butternut
butternut_leaf_bot carries living carries leaf carries leaf_bottom carries squash carries butternut
buttercup_leaf_top carries living carries leaf carries leaf_top carries squash carries buttercup
buttercup_leaf_bot carries living carries leaf carries leaf_bottom carries squash carries buttercup
recordings carrying it 10 10 5 5 6 2 2 2 2 2
recording carries the label does not carry it

Three things this matrix states plainly. The living and leaf columns are identical today, which is why living is reported as unproven: nothing yet distinguishes them. The leaf_top and leaf_bottom columns split the same ten recordings in half, and that split is what let the instrument separate the two by measurement. And each species column pairs with squash only where the plant is a squash, which is how one reading can assert squash while leaving the species unresolved.

The field loop / what an operator does

A new surface gets added in the field, with no host computer.

1 Hold it to the surface
One press. No host and no network.
2 Read what it supports
Every label it has evidence for, with its score and its threshold. Anything it cannot support reads unknown.
3 Read the prediction
Record the surface. The predicted outcome is on screen before anything is written, and a write that would harm a neighbor is refused.
4 Add it, in seconds
The new surface is written to the card. Nothing is retrained and nothing is reflashed.
Back to step one. Every label the unit already held reads exactly as it did before the write.

worked

2026-08-11

A new surface taught in the field

A blue shop towel read as unknown on 34 consecutive reads. It was recorded, checked, and added on the device in about two seconds with no host and no retraining. It then read as itself on 7 of 10 reads, at scores of 0.426 to 0.462 against a threshold of 0.412, and every other surface still read as itself.

The predicted score was computed before the write and matched the measured score to two decimals.

declined

2026-08-11

A surface it declined to learn

A wax-coated paper plate was checked before writing and refused: it sat 0.898 from white polystyrene foam, close enough that adding it would have taken the neighbor down with it. It was added by rebuilding the catalog on the host instead, which separated the pair to 0.423, after which both read as themselves.

The check is the reason nothing was corrupted. The rebuild is a host step and it is not free.

limit

2026-08-11

A limit set by the sensor

Matte white paper and scuffed white plastic separate by 0.146 on 19 optical channels. The host predicted 0.144 before the session and the device measured 0.146. Both stay unresolved against each other, so the instrument says nothing.

The limit sits in the front end. More data does not move it. A different illumination band would.

worked

2026-08-18

Adding a label changes nothing that was already right

Across the campaign the catalog was rebuilt and re-pushed repeatedly, growing and once shrinking, and every deployed build from 37 labels through 50 has passed its gate with no wrong name, most recently across 1,219 reads on the 49-label catalog deployed today.

Labels that were thin at one build recovered at the next after more recordings were added. Thin labels heal by data, never by lowering a threshold.

worked

2026-08-13

It says squash when it cannot say which squash

Three squash species from a garden went into the catalog by leaf. On the deployed build the shared squash label asserts on 212 of 216 applicable reads, while the individual species assert less and decline the rest: buttercup 57 of 108, zucchini 63 of 84. The instrument reports the level the evidence supports and leaves the rest unresolved.

The species labels stay thin until more recordings of each plant exist. Their surface counts are published beside them.

worked

2026-08-18

Two labels that were identical until the data split them

Until this week every leaf in the catalog was recorded from the top, so leaf and leaf_top were carried by exactly the same recordings and nothing could tell them apart. A round of underside recordings later, with no change to the device or its software, leaf_top asserts on all 204 top-side reads with zero wrong assertions across all 120 underside reads, and leaf_bottom does the reverse.

The living label still spans exactly the same recordings as leaf, and the page treats it as unproven until a dried leaf is recorded.

Cost / resident memory as the catalog grows

The device has 2 MB of memory. The catalog is on the card.

The deployed unit holds 126,264 bytes resident and reads its 49-label catalog from the card. The blue curve is a simulation, 2026-07-13: a conventional classifier was fitted at four catalog sizes and its stored size recorded. It reports how large that method gets. It says nothing about accuracy.

0 MB 2 MB 4 MB 6 MB 1.9 MB available on the device 30 300 1,000 3,000 materials in the catalog conventional classifier at 30 materials: 0.211 MB stored handheld unit at 30 materials: 0.12 MB resident conventional classifier at 300 materials: 2.209 MB stored handheld unit at 300 materials: 0.12 MB resident conventional classifier at 1,000 materials: 3.195 MB stored handheld unit at 1,000 materials: 0.12 MB resident conventional classifier at 3,000 materials: 5.514 MB stored handheld unit at 3,000 materials: 0.12 MB resident 5.514 MB 0.120 MB conventional classifier, stored size this unit, resident size
The classifier curve crosses the memory available on the device at about 300 materials. The unit's resident figure is the same at every point on this axis, because the catalog is read from the card.
Stored size for each method at four catalog sizes
materials conventional classifier this unit, resident
30 0.211 MB 0.120 MB
300 2.209 MB 0.120 MB
1,000 3.195 MB 0.120 MB
3,000 5.514 MB 0.120 MB

what the catalog costs on the card

49 labels, measured today
39,946 bytes
300 materials, projected
0.15 MB
10,000 materials, projected
5.12 MB
1,000,000 materials, projected
512.00 MB

Projected card sizes for the shipped configuration, computed from the per-entry size. The largest catalog written to a card so far held 50 labels; the one deployed today holds 49. The resident file has been the same size to the byte across every one of those builds, and a field write never modifies it, while the card file moved from 26,446 bytes at 37 labels to 39,946 today.

What this instrument declines to do

The same limits are printed on the device where the operator can read them.

  • There is no safe in the output vocabulary. A reading can be SUSPICIOUS, NOVEL-UNKNOWN, NO FLAG, or UNRELIABLE. NO FLAG means no hazard-marked label fired on this reading, and it is never a clearance.
  • It is an identification instrument for bulk surfaces. It cannot detect trace contamination and it cannot identify a pathogen. Cheap optics is far short of both, and no catalog fixes that.
  • Declining to answer is measured as a rate, and a declined label is not a detected error. The instrument knows when a reading is unlike what it holds. It does not know when a confident reading is wrong.
  • A conventional classifier scores higher on a catalog of about 30 materials, and that is conceded. This page reports the resident cost as the catalog grows past the memory the device has.
  • 24 of the 49 labels currently have evidence from a single surface. Those are reported with their surface count and are not claimed as learned properties.
  • Every figure on this page was captured from a handheld unit on the date shown. Nothing here is produced by the web deployment, and nothing here is measured while you watch.
SENSE · SCANNER

Shows: dated readings captured from a separate handheld sensing unit, every label it considered on one reading with that label's own score and threshold beside it, the complete per-label record of the gate its deployed catalog passed including the labels that stayed unresolved, the number of distinct surfaces behind each label, resident bytes read off the shipped file, and a dated stored-size simulation for a conventional classifier at four catalog sizes. Does not show: anything running on this web deployment, a device a visitor can reach or measure live, trace contamination or pathogen detection, a safety clearance, an accuracy comparison against any product, or how a reading is produced. NO FLAG means no hazard-marked label fired on that reading and it is never a clearance; a declined label is not a detected error; the size simulation reports stored size and says nothing about accuracy.