Images in Flash have their alphas pre-multiplied before being handed to Pixel Bender for processing, this would account for what you are seeing, I think.
It does, sort of. I think I know what's going on now.
I don't care about the input side of it: I'm only using the alpha of the input image, not the colour, so any premultiplication is being disregarded. I can throw away the input alpha entirely and it still happens with a shader-generated alpha. Whatever it is is happening on output.
It seems it's also scaling the output, attempting to reverse the pre-multiplication so a pass-thru filter
dst = sampleNearest(oImage, relativePos);
would have no effect. To undo this I need to do the following
float2 relativePos = outCoord();
pixel4 inCol = sampleNearest(oImage, relativePos);
float fA = inCol.a;
dst = pixel4(0.0, relativePos.x * 0.005 * fA, relativePos.y * 0.005 * fA, fA);
i.e. multiply each channel by the alpha which seems to work.
I can't see this documented anywhere but the toolkit provides a clue: the Preferences have a 'Premultiply/unmultiply color by alpha' which says "Flash Player premultiplies each color by the alpha channel. With this option checked, you will get a better approximation of running in Flash Player." Except it seems to do nothing and be always on. After that a bit of experimentation suggested what unmultiplying is.