I fear that your dictionary must be more extensive than mine!

However, here are some answers that seem to work:

>! 1. stop (+deter = protested, + mien = nepotism)  
>! 2. noon (+stop = pontoons, + gild = noodling (based on hint from OP. I originally discounted this one because I couldn't find an answer for 3.))  
>! 3. ???  
>! I then worked backwards a bit from 8 to get to 4  
>! 8. stir (+stop=protists, + said=diarists, +forte=retrofits)  
>! 7. lace (+stir=recitals, +rots=sectoral) (it could have been "at" or "lace", but lace worked better at 6)  
>! 6. sips (+mace=escapism,+lace=specials)  
>! 5. deed (+sips=despises,+name=demeaned (tricky one))  
>! 4. trap (+lane=parental,+deed=departed)    
>! 14. tide (+slam=neediest,+tide=medalist)  
>! 9. seats (+edit=stateside,+tide=steadiest)  
>! 13. sear (+tide=readiest,+lung=granules,+tapes=separates,+grab=barrages)  
>! 12. ruse (+sear=erasures) (I reject tide since it's already at 14)  
>! 11. seam (+tide=mediates, +ruse=measures,+sort=maestros)  
>! 10. rut (+seats=statures, +seam=matures) (could also have been tang (magnates,stagnates))  
>! 15. roam (+tide=mediator, +lain=manorial)  
>! 16. need (+roam=demeanor) (there were several possibilities here so I needed to explore a bit to find a reasonable bridge to "taro")  
>! 17. deep (+need=deepened, +taro=operated)  
>! 18. ??? A guess would be decor (+tale=relocated, +deep=proceeded)

So still two gaps...

Methods: I have a short python program.

The first part does a subtraction of a small word from a big word. It works recursively to produce a list of possible results. e.g. "lelabc" minus "lab" = ["elc","lec"]. "lelabc" minus "lba" = [].

    Subtract("lelabc","lab")
    Out: ['elc', 'lec']

Then the second part takes an input of a small word. It finds all longer words in my dictionary and does a reverse subtraction. It checks whether those reverse subtractions (if any) are in my dictionary. If they are, add them to a set. Return the set. E.g.:

    findAll("lane")
    lane iv veinal
    lane id denial
    lane it entail
    lane iv venial
    lane reg general
    lane sit entails
    lane rte eternal
    lane ret eternal
    lane deb enabled
    lane reb enabler
    lane trap parental
    lane deem enameled
    lane muon noumenal
    lane tarp prenatal
    lane tiro oriental
    Out: 'deb','deem','id','it','iv','muon','reb','reg','ret','rte','sit','tarp','tiro','trap'}

    findAll("evince")
    Out: set()

Finally, I take two small words and take the intersection of the small words in the set. I don't know if this is cheating, but the computer is definitely better at finding intersections of two sets than I am.