Unfortunately there are lots of problems that can cause missions not to appear, but without generating any warning messages.
Some of the common ones I've run across are:
(1) Messed up .mct file - e.g. names mismatch between the mct file and the actual mission, numbering errors, etc
(2) Messed up messages.cpp file - one of the nastiest ones to find, could be a problem in a single string, could be a mismatch with the .h file
(3) Bad drafting specifications in the main .cpp file - the mission exists, but can never find the right combination of participants to draft
(4) Bad reporting of results - in the victory conditions or victory state .cpp files, if the reporting isn't done or is messed up then sometimes the mission simply isn't offered
A lot of this has to do with the way the scripts are handled by the engine - they get loaded and (partially) run when the engine is deciding which missions to offer a player (i.e. right after a move on the map), they get loaded and (partially) run when the player accepts, to try and pick the draftees, and then they get loaded and fully run one final time to actually play out the mission.
As a result, if something goes wrong in that very first partial run then the mission never gets offered to the player, but the scripter doesn't get to see what went wrong.
Ugly huh?
One of the things you can do is to have your script print debug messages to a file - that way you can see a bit of what it's doing in those initial partial runs.
dave