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 (+seen=neediest,+slam=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.