Yes the table has an icon field, to make sure that's not the problem I tried calling SQLFORM specifying the fields parameter ['name', 'icon'] and I had exactly the same error.
Frankly it's hard to trace how FORM instances fill self.vars but I think I'm finally understanding my problem after a long time looking at html.py code as this wasn't intuitive at all.
My input which generates the icon was created using javascript, so there's no INPUT helper in the form to _validate. Yes that's right, apparently form.vars is filled by the INPUTs in the FORM, not by the FORM itself.
Meh, this is highly annoying... I can actually make it work by simply doing this before processing
form.components.append(INPUT(_type='hidden', _name='icon'))
Which looks totally horrible and nonsensical to any programmer reading the code. This is bullshit...
[edit] Dave thanks for trying, this back and forth actually helped.