So this was the key to my problem, and I’m sure Java people in the audience are laughing at me for missing it:

    @Override public boolean equals(Object otherPrice) {
        System.out.println("Testing equality for " + this.toString() 
                           + " and " + otherPrice.toString());
        return this.equals(Double.parseDouble(otherPrice.toString()));
    }

One of the basic problems with the modern FitNesse ecosystem is that there are a number of people who tell you you should be using FitLibrary with it, and they’re right, sort of. FitLibrary’s flow mode is a thing of beauty. But it’s a real pain in the ass if you’re not sure how to use it, and the changes Rick Mugridge made to decouple it from FitNesse mean that you have to learn two very different programming models in order to make use of fixtures from both frameworks. It’s almost like there are two different rings now, and if you don’t have the right codes, you can’t get into the one you need. And the codes you need more resemble Dan Brown-esque mighty ciphers than ROT13.

I do have to express my gratitude to the ineffable Ward Cunningham and his helper monkey James Shore for their fit FAQ. This would have taken a lot longer without that document.