Someone in one of the Dark Ages threads suggested Chapel/Poor House/Village. Chapel everything, get some combination of Poor Houses and Villages, and aim for double-PH Province turns. I implemented Poor House locally in Dominiate and my quick-and-dirty bot beats BMU at least:
# Chapel away Coppers and Estates to enable $4 Poor Houses,
# buy Villages, and aim for double-PH turns for Province.
{
name: 'ChapelPoorHouseVillage'
requires: ['Chapel', 'Poor House', 'Village']
gainPriority: (state, my) -> [
# Open Village/Chapel. We can afford Poor Houses easily later,
# and opening Village helps ensure we trash 4 cards.
"Village" if my.countInDeck("Village") == 0 and my.turnsTaken <= 2
"Chapel" if my.countInDeck("Chapel") == 0 and my.turnsTaken <= 2
"Province"
"Village" if my.countInDeck("Poor House") > my.countInDeck("Village")
"Poor House"
]
actionPriority: (state, my) -> [
# The default plays Poor House instead of Chapel, even when we want to
# trash.
"Chapel" if wantsToTrash
]
}
It would probably be stronger with Worker's Village.
(Actually this reminds me that Dominiate's play priority for "Chapel if wantsToTrash" might need a bump up, because it'll prefer to play a terminal-Silver rather than Chapel when they collide.)
Edit: This might do better if explicitly instructed to trash all its Coppers, not just 3 of them.
Edit 2: Also, it seems like actionPriority does not work anymore. It needs to be called "playPriority". Also "wantsToTrash" should be "this.wantsToTrash(state)". And this revealed a flaw, which is that Village should of course get played before Chapel. Fixed version, which is better:
# Chapel away Coppers and Estates to enable $4 Poor Houses,
# buy Villages, and aim for double-PH turns for Province.
{
name: 'ChapelPoorHouseVillage'
requires: ['Chapel', 'Poor House', 'Village']
gainPriority: (state, my) -> [
# Open Village/Chapel. We can afford Poor Houses easily later,
# and opening Village helps ensure we trash 4 cards.
"Village" if my.countInDeck("Village") == 0 and my.turnsTaken <= 2
"Chapel" if my.countInDeck("Chapel") == 0 and my.turnsTaken <= 2
"Province"
"Village" if my.countInDeck("Poor House") > my.countInDeck("Village")
"Poor House"
]
playPriority: (state, my) -> [
# The default plays Poor House instead of Chapel, even when we want to
# trash.
"Village"
"Chapel" if this.wantsToTrash(state)
"Poor House"
]
trashPriority: (state, my) -> [
"Curse"
"Copper"
"Estate"
]
}