I ran a double dummy simulation with the excellent Deal 3.1 program by Thomas Andrews.
I'll attach more details about my assumptions and results at the end, but the answer to your main question is that it does make sense to double for penalty (if that is your agreement) in these circumstances.
In particular, the concern about doubling them into game is much smaller at matchpoints. This is not to say it is never relevant. However, in this case your partner is essentially choosing between two final contracts: defend 2 spades, or defend 2 spades doubled. At most other tables, your opponents are likely getting +90 or +120 in 1NT, and a few are probably facing the same problem as you. The 1NT players will beat you whether you double or not if opponents make two spades, so against them, doubling can never hurt and can only help. So your main worry is about other tables that saw an overcall. Here's where my simulation comes in: when playing double dummy, you beat 2S around 90% of the time. At matchpoints, you just need to squeeze past 50% to make that a winning move, so you'd prefer to defend 2SX over 2S.
There's a couple other questions hiding in here.
Is DONT a dangerous convention? Well, no, it's probably better than the standard defense against 1NT openings (i.e. all natural). It's based on a couple of insights. First, especially at matchpoints, if you rack up a lot of small gains from a convention, it's probably a winner even if the occasional loss is large. Second, opponents are really good at getting to good contracts when they can have an uncontested auction over 1NT. DONT allows you to disturb this auction when you have some distribution. It can cause opponents to get to suboptimal contracts, improves the defense if the opponents bid on, and it doesn't always go down when opponents defend. Sometimes it can go for a number or cause opponents to avoid a bad 3NT contract when missing important stoppers, but the idea is that it helps more often that it hurts. Larry Cohen writes more.
Would partner's double be for penalty? Maybe? That's definitely what SAYC says but I'm not sure it's what most people would assume by default these days. Should partner's double be for penalty? Maybe? Most people in US clubs that I run across that have any idea what their bids mean after opponents' interference play that doubles are negative, that is, takeout-oriented.
More on the simulation.
The script I ran accepts any deal in which
- south holds K986 QT T73 J642
- north is balanced (4333, 4432, or 5332 without a 5-card major) and has 15, 16, or 17 high card points (I ignored your adjustment for worthless doubletons).
- west has fewer than 12 hcp
- east has 6 spades or 5 spades and at least 4 cards in another suit and at least 12 hcp, and at least two face cards in spades
It then performs double-dummy analysis to determine the number of tricks east can make in spades and computes the score in 2SX. The results of analyzing 1000 random deals meeting the constraints:
--------------------------------------------------
| Value | Count | Pct | Cum Pct | Pctile |
|-------|-------|----------|----------|----------|
| -800 | 15 | 1.50% | 1.50% | 100.00% |
| -500 | 162 | 16.20% | 17.70% | 98.50% |
| -300 | 417 | 41.70% | 59.40% | 82.30% |
| -100 | 322 | 32.20% | 91.60% | 40.60% |
| 470 | 72 | 7.20% | 98.80% | 8.40% |
| 570 | 12 | 1.20% | 100.00% | 1.20% |
|-------|-------|----------|----------|----------|
| | 1000 | 0.00% | 0.00% | 0.00% |
--------------------------------------------------
The code for the computation:
source lib/score.tcl
south is "K986 QT T73 J642"
defvector facecards 1 1 1 1
shapecond spade_overcall_shape {
$s >= 6
|| ($s == 5 && ($h >= 4 || $d >= 4 || $c >= 4))}
main {
reject unless [balanced north]
set hn [hcp north]
reject unless {15 <= $hn && $hn <= 17}
reject unless {
[hcp west] < 12
&& [spade_overcall_shape east]
&& [hcp east] >= 12
&& [facecards east spades] >= 2}
accept
}
set defend_hist [dict create]
proc write_deal {} {
global score_hist
set deftricks [deal::tricks east spades]
dict incr score_hist [score {2 spades doubled} nonvul $deftricks]
}
proc flush_deal {} {
# complicated histogram printing code omitted
}