ByCaroline Framke,
a freelance TV and media criticwho has been reviewing TV and explaining how media shapes the world we live in for ten years and counting. Formerly Chief TV Critic at Variety, her byline can also be found at Vox, The Atlantic, The A.V. Club, and more.
At the beginning of Bad Sisters’s second season, I wondered if returning to the scene of the crime would be worth it. Would it be as satisfying as the end of the first season already was? What could the show gain from Sharon Horgan and her team unpacking the stories they’d already tied up so neatly? How would it feel to pick back up with those wild, headstrong Garveys, then leave them behind all over again?
Looking back from the other side of the season finale, my feelings are still mixed, but ultimately fond. The thing about Horgan’s work and the deeply felt characterizations of every character in the Bad Sisters world is that all its inconsistencies are still so compellingly human. The characters are still sharp and funny, and their exploits are strange and sad in all the ways I love most about TV. So for as much mess as there was along the way this season (and there was plenty), where its story began and ended still feels exactly right.
In terms of plot and mystery reveals, there’s not much that the late breaking “Cormac Sweeney Is One Evil Bastard” arc didn’t prepare us for before “Cliff Hanger.” Sexual harassment, domestic violence, embezzlement … Cormac’s done it all, baby! The opening flashback to Grace’s last night alive also confirms that he did indeed attempt to blackmail her in exchange for keeping her JP secret. Then, when she asked him if he ever loved her and Blánaid, he twisted the knife even further. “You were just a mark, Grace,” he replied, practically rolling his eyes. “Nothing personal.”
He was wrong, of course. Nothing could have been more personal to Grace than faking love and affection when she so desperately needed it, nothing worse than convincing her that she was emerging from her darkest hours into brighter days ahead. Even as her heart broke open in front of him, though, Grace found the strength to finally stand up for herself. She insisted that he wouldn’t get anything from her, period — but then, just minutes later, she died in a senseless moment of panic, anyway. As Eva points out later, what more punishment could her sisters get than the horrible truth of that?
Back in the present, Eva and her sisters have to deal with the very real and pressing threat of a former Guard doing his best to scare the shit out of them. After sending Blánaid away to join Ursula’s kids for a “SLEEPOVER PIZZA PARTY!!!” (emphasis a manic Ursula’s), the remaining Garvey sisters face down the creep who conned Grace with no trace of remorse to speak of. As with JP, Bad Sisters did the work to make sure Cormac Sweeney is such an intensely irredeemable prick that when someone finally snaps on him, you’re not only unsurprised, but at least halfway rooting for it.
Still, I didn’t expect the ultimate snapper to be Angelica, who overhears Cormac sneering about Grace being an unlovable “nutjob” and smashes him in the head with Bla’s camogie stick. As he starts to bleed out on Eva’s kitchen floor, no one can quite believe it. I mean, Angelica from the top rope? Wild! Silly! And y’know what? Amazing. Fiona Shaw has gotten to flex so many different acting muscles throughout this season, and watching her settle into an owl-eyed shock in “Cliff Hanger” is just hilarious. Credit to her for finding the comedy in everything from grievous head injuries to the simple act of eating a Wispa.
From here, the wheels fall right off for the Garvey girls, who have just about had it with the agonies and absurdities of all the deaths in their lives. Just as they were after Angelica fell off the sailboat, they’re also split on how to handle Cormac’s body. If he hadn’t told them he was a Guard, they might’ve just called it in. Unfortunately, they know they can’t trust the system to protect their interests over his no matter how much he’s twisted the law to fit his needs. So it’s off to the cliffs to dispose of the “body” — but as we saw in the opening scene of the season, Cormac’s not nearly as sincerely dead as they’d assumed. (Before that reveal, though, there’s a brief fake-out of the popped trunk just being a quirk of Bibi’s old car, which, fair play, did make me laugh.)
Cormac’s refusal to die not just after a swift camogie stick to the head but after falling off a cliff is exactly as ridiculous as the moment requires. More importantly, it gives the Garveys the opportunity to decide exactly what they want to do — or, more accurately, who they want to be. Are they the kind of people who will push an injured man into the rocky sea, as Bibi suggests in a fit of frustration? Or are they the kind of people who will call it in and give him a shot of survival before fucking off back home, as they eventually do at Eva’s behest? It’s in this moment that you remember that though they all tried to kill JP from afar, they probably never could have done what Grace did in such a rush of righteous, visceral rage. When Becka, bruised and pregnant and exhausted, finally just says, “We’re not murderers,” you also remember that she’s the only one still there who did, in fact, cause another person’s death. Clearly, and understandably, she’s been carrying it heavy on her heart ever since. Unlike an annoying voice on the radio, shaking off a bad man isn’t as simple as switching it off with a firm, “There, he’s gone.”
This holds doubly true when the prick in question is a dangerously cocky man like Cormac, who has connections to a powerful system that will protect him. Houlihan learns this the hard (if predictable) way when her boss straight up tells her how hard her job could get once she turns on one of her “own.” Thaddea Graham’s performance has been relatively flat as Houlihan’s lasered in on the Garveys as The Case That Could Make or Break Her Career; I wish we’d gotten a little more insight into her motivations, whether through her acting choices or the scripts giving us more than mere glimpses into her clearly difficult childhood. Because even after her mother reminds her of the time an 8-year-old Houlihan “arrested” her own father for smashing a coffee table (on purpose?), it still takes some no-holds barred begging from the Garveys for her to realize that, perhaps, Cormac Sweeney’s rotten heart doesn’t deserve the “justice” of their arrests.
The moment when the Garveys accuse her of “just trying to cover up for her mate” is the one moment Houlihan breaks, her voice catching as she insists she would never. “I tried to help Grace. And I wanna help you now,” she says. “Then do,” Bibi replies. No one, including Houlihan, seems particularly convinced that she means it in this moment — but she’s got at least one card left to play.
Enter former detective Fergal Loftus (who is, it must be said, looking real good in retirement). While Cormac’s less than intimidated by Houlihan even while stuck in a body cast, his entire misogynist demeanor changes once Fergal’s mustache enters the room. “You’ve been a very naughty boy, I hear,” he says, raising an eyebrow with a smirk (listen …). “Extortion, spousal abuse … bigamy? Old school.” Mockery duly administered, he moves on to the meat of his hospital visit: Should Cormac try to go after the Garveys or contest Bla’s inheritance, Fergal will make life very, very difficult for him. “I’m dodgy like that,” he shrugs before slapping Cormac’s broken leg and leaving the con artist to writhe in puffy, pathetic agony (mean, but also hot, it is what it is!).
All’s well that ends well, right? Well, sort of. Houlihan may or may not ever be able to do good work from within a rotten system. Angelica believes in miracles more than ever, but after almost both killing a man and dying alone. The Garveys may have excised two terrible men from their lives, but not the cost of what it took to bring them down. And while they don’t have to live with Cormac’s murder on their consciences, his wife and children will still have to live with the aftermath of his dangerous rage. There are too many Cormac Sweeneys out there who will never experience true consequences, and too many women will meet them, love them, and never escape them. As the Garveys send their sister’s ashes out to sea, wrapped in a wreath and all the love they could carry, it’s only right to think of all those women, like Grace, who deserve more justice than they’ll ever get.
So, will Bad Sisters be back for another season after all this? More to the point: should it?
I’ve loved spending this time with the Garveys and must credit each actor — Horgan, Anne-Marie Duff, Eva Birthistle, Sarah Greene, and Eve Hewson — with bringing her respective sister to life these past two seasons. But since a third would necessarily mean introducing more angst to their lives, I feel secure in saying I hope this is the last I get to see of them. My hope for this family and any other that’s experienced such trauma and loss is the same: that they get to process what they’ve been through, find real peace and security within themselves and each other, and find a way to move on.
Loose Ends
• Thank you all for spending this season with me, whether in the (surprisingly robust) comments section or simply by reading along! I’ve really enjoyed getting to dive back into the world of Bad Sisters and will miss it, whether or not it comes back for more.
• The final scene, which once again ends with Grace in the sea (albeit in a very different form), is such a lovely image to send the season/series off with, especially with a new generation of Garveys in attendance, too: Becka’s tiny baby, Nora’s hugely pregnant stomach, and the startlingly mature Blánaid (who still needs to get into therapy ASAP before taking on everyone else’s burdens, Eva-style). Godspeed to them all.
• “I prayed for this! I prayed, and the Lord listened. It’s another miracle!” “… sure.”
• “How did you kill a man in the time it takes to get to Casa fucking Romanos?!”
By submitting your email, you agree to our
Terms and Privacy Notice
and to receive email correspondence from us. This site is protected by reCAPTCHA and the Google
Privacy Policy and
Terms of Service apply.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
Already a subscriber?
Already a subscriber?
`;
// integrate Sub(x) scripts and elements
if (hostname !== 'subs.nymag.com') { // do not integrate on this subdomain
document.head.appendChild(trackingScript);
document.body.insertAdjacentHTML('beforeend', subXAnimationElements);
}
There was an error processing the request. Please try again later."}).catch(e=>console.error("Error verifying email: ",e)))(r.querySelector(".content"),o.bannerCTAVerification)})):(l.remove(),s.remove()),o.dismissable||n.remove(),o.useAlertIcon||a.remove(),r.classList.add("show"),n.addEventListener("click",()=>{u(),r.classList.remove("show")})}else r.remove()}});
}, {"3":3,"6":6,"17":17,"35":35,"41":41}];
window.modules["global-nav.client"] = [function(require,module,exports){"use strict";const dom=require(4),auth=require(17),signInButton=dom.find(".user-signin"),signOutButton=dom.find(".user-signout"),globalNav=dom.find('[class^="global-nav"]'),body=dom.find("body"),dropdownItems=dom.findAll(".dropdown-wrap"),gtm=require(3),appendLandingPageParams=require(135),pageUri=require(124).getPageUri(),subscriptionPromoLinks=dom.findAll(".persist-params"),searchString=window.location.search||"";function closeDropdowns(e){let n=globalNav.querySelectorAll(".dropdown.open");dropdownItems.forEach(function(t){let i=t.querySelector(".dropdown");!n||t.contains(e.target)&&27!==e.keyCode||i.classList.remove("open")})}function gtmSendReport(e,n,t){let i={eventCategory:"ecommerce",eventAction:"componentClick",brand:e,dimension23:"global-nav",list:pageUri,pageZone:"header",variant:"nav-link"};"global-nav-link"===t&&(i.eventLabel=n.href),gtm.reportNow(i)}function updateElementTargetUrlsIfQueryStrings(e){if(searchString){const n=new URLSearchParams(searchString);let t=e.href;if(t.includes("?")){const i=t.split("?"),o=new URLSearchParams(i[1]);for(let e of n.entries())o.set(e[0],e[1]);t=`${i[0]}?${o.toString()}`,e.href=t}else e.href=`${t}?${n.toString()}`}}function init(e){const n=e.querySelectorAll(".to-landing-page");window.addEventListener("auth:init",()=>{signInButton.addEventListener("click",function(e){e.preventDefault(),auth.showEmbeddedLoginFlow("top navigation")}),signOutButton.addEventListener("click",function(e){e.preventDefault(),gtmSendReport("Sign Out",e.target,"user-info-link"),auth.logout()}),auth.isAuthenticated()&&e.classList.add("signed-in"),(auth.isSubscriber()||auth.isMobileAppRequest())&&e.classList.add("subscribed"),e.querySelectorAll(".user-link").forEach(e=>{e.classList.add("active")}),subscriptionPromoLinks.forEach(e=>{updateElementTargetUrlsIfQueryStrings(e)}),appendLandingPageParams(n)})}dropdownItems.forEach(function(e){e.addEventListener("click",function(){e.querySelector(".dropdown").classList.toggle("open")})}),body.addEventListener("click",closeDropdowns),document.addEventListener("keydown",closeDropdowns),globalNav.addEventListener("click",function(e){let n=e.target;n.classList.contains("global-nav-track")&>mSendReport(n.text,n,"global-nav-link")}),module.exports=init;
}, {"3":3,"4":4,"17":17,"124":124,"135":135}];
window.modules["aaa-module-mounting.legacy"] = [function(require,module,exports){"use strict";const _pickBy=require(221),_each=require(406),Fingerprint2=require(408),DS=require(407),Eventify=require(246);function registerGlobals(){window.DS=DS,window.Eventify=Eventify,window.Fingerprint2=Fingerprint2,DS.value("Eventify",Eventify),DS.value("Fingerprint2",Fingerprint2),DS.value("$document",window.document),DS.value("$window",window)}function mountDollarSliceComponents(){DS.service("components",["$document","$module",function(e,n){var o=_pickBy(n.definitions,e=>e.providerStrategy===n.providers.controller),r=Object.keys(o);function t(e){return o=>{try{n.get(e,o)}catch(e){logMountError(o,e)}}}_each(r,n=>{var o=e.querySelectorAll('[data-uri*="/_components/'+n+'/"]'),r=e.querySelectorAll('[data-uri$="/_components/'+n+'"]');_each(o,t(n)),_each(r,t(n))}),this.components=r}]),DS.get("components")}function logMountError(e,n){const o=e.outerHTML.slice(0,e.outerHTML.indexOf(e.innerHTML));console.error("Error attaching controller to "+o,n)}registerGlobals(),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{mountDollarSliceComponents()}):mountDollarSliceComponents();
}, {"221":221,"246":246,"406":406,"407":407,"408":408}];
window.modules["ads.legacy"] = [function(require,module,exports){"use strict";const _map=require(118),_forEach=require(107),_isString=require(268),_intersectionWith=require(409),_isEqual=require(274),_each=require(406),_debounce=require(182),_sortBy=require(205),page=require(124),visit=require(114);DS.service("adService",["Eventify","$cid","$document","$window",function(e,t,a,i){var o,n,s,r,d,c,u,l,g={},p=this,h=[],f=visit.getQueryParamsObject(["utm_campaign"]),m=document.querySelector('script[data-type="ad-a9"]'),b=[],w=!1,v=[],y=document.querySelector('script[data-name="ad-doubleverify"]');document.querySelector('script[data-name="concert-ads"]')||(i.NYM={},i.NYM.analytics={},i.NYM.analytics.adStartTime=i.performance.now(),i.googletag=i.googletag||{},i.googletag.cmd=i.googletag.cmd||[],u=i.googletag,(m||y)&&(i.googletag.cmd=i.googletag.cmd||[],i.googletag.cmd.push(function(){i.googletag.pubads().disableInitialLoad()})),m&&(l=i.setInterval(function(){void 0!==window.apstag&&void 0!==window.apstag.timeout&&(i.clearInterval(l),window.apstag.cleared=!0,l=null)},10),setTimeout(function(){l&&(i.clearInterval(l),i.googletag.pubads().refresh(),window.apstag||console.log("MESSAGE: Timeout for A9 load exceeded, aborting"))},500)),y&&(b.push(new Promise(function(e){w?e():v.push(e)})),c=i.setTimeout(T,2500)),o=function(e){var t,a,o=e.data,n=[];return o.loaded?e:(o.loaded=!0,t=null,(t=o.sizes?u.defineSlot(o.name,o.sizes,o.id).addService(u.pubads()):u.defineOutOfPageSlot(o.name,o.id).addService(u.pubads())).setTargeting("adid",o.id),f.hasOwnProperty("utm_campaign")&&t.setTargeting("utmcamp",f.utm_campaign),a=p.getAdCount(o.label),t.setTargeting("label",o.label+"_"+o.site+"-"+a),u.display(o.id),u.pubads().addEventListener("slotOnload",function(){i.NYM.analytics.firstAdLoadTime||(i.NYM.analytics.firstAdLoadTime=i.performance.now(),i.NYM.analytics.firstAdLoadLabel=e.data.label)}),n=_(o),Promise.all(b).then(function(){n?window.apstag&&window.apstag.cleared?window.apstag.fetchBids({slots:[n],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([t],{changeCorrelator:!1})})}):y&&u.pubads().refresh([t],{changeCorrelator:!1}):u.pubads().refresh([t],{changeCorrelator:!1})}),e.slot=t,e)},n=function(e){var a,i,o,n=t(),s=e.getAttribute("data-name"),r=e.getAttribute("data-sizes"),d=e.getAttribute("data-label"),c=e.getAttribute("data-site");n=e.id,r&&r.length?(r=r.split(","),a=[],_map(r,function(e){e=e.split("x"),i=parseInt(e[0]),o=parseInt(e[1]),a.push([i,o])})):(e.classList.add("oop"),a=!1),this.data={id:n,name:s,sizes:a,loaded:!1,label:d,site:c},g[n]=this},r=function(e){u.cmd.push(function(){var t=o(e);g[e.data.id]=t})},s=function(e){var t=[];e.slot?(t=_(e))&&window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[t],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([e.slot],{changeCorrelator:!1})})}):e&&r(e)},u.cmd.push(function(){var e,t,o,n=page.getMeta("article:tag"),s=page.getMeta("author"),r=i.location.href,d=(e=a.head.querySelector(".head-gtm"),t=a.body.querySelector(".gtm"),e&&"top"===e.getAttribute("data-gtm")?"gtmtop":t&&"bottom"===t.getAttribute("data-gtm")?"gtmbottom":"");o=[],_forEach([n,s,d],function(e){_forEach(e.split(","),function(e){(e=e.trim().toLowerCase().replace(/\s/g,"-").replace(/\'|\’/g,"")).length&&o.push(e)})}),u.pubads().setTargeting("kw",o),u.pubads().setTargeting("entry_group",o),r=r.slice(r.lastIndexOf("/")+1),u.pubads().setTargeting("pn",r),u.companionAds().setRefreshUnfilledSlots(!0),u.pubads().enableAsyncRendering(),u.enableServices()}),this.load=r,this.create=function(e){return new n(e)},this.refresh=function(e){var t;_isString(e)?(t=this.getById(e),s(t)):s(e)},this.remove=function(e){var t=e.data.id;a.getElementById(t).innerHTML=""},this.getAdCount=function(e){var t,a=0,i=Object.keys(g);return _each(i,function(i){(t=g[i]).data.loaded&&t.data.label===e&&a++}),a},this.getById=function(e){return g[e]},d=_debounce(function(){var e={TopLeaderboard:1,RightColTopMPU:2,outOfPage:99,"homepageTakeover/TopLeaderboard":1},t=_sortBy(h,function(t){return e[t.data.label]||10});_forEach(t,function(e){return e.data.sizes?r(e):i.setTimeout(function(){r(e)},2e3)}),y&&window.PQ.cmd.push(()=>{try{window.PQ.loadSignals(["ids","bsc","vlp"],T)}catch(e){T(),console.error(`There has been an error loading Double Verify signals: ${e}`)}}),h=[]},10),this.addToPageLoadQueue=function(e){h.push(e),d()});function _(e){var t,a=e.sizes;return a=_intersectionWith(a,[[970,250],[970,90],[728,90],[300,600],[300,250],[320,100],[320,50]],_isEqual),e.sizes&&e.sizes.length&&(t={slotID:e.id,sizes:a,slotName:e.label}),t}function T(){i.clearTimeout(c),w=!0,_forEach(v,function(e){e()})}}]);
}, {"107":107,"114":114,"118":118,"124":124,"182":182,"205":205,"268":268,"274":274,"406":406,"409":409}];
window.modules["cid.legacy"] = [function(require,module,exports){"use strict";DS.service("$cid",function(){var r=Math.floor(100*Math.random());return function(){return"cid-"+ ++r}});
}, {}];
window.modules["client.legacy"] = [function(require,module,exports){"use strict";require("cid.legacy"),require("ads.legacy"),require("facebook.legacy"),require("aaa-module-mounting.legacy");
}, {"ads.legacy":"ads.legacy","cid.legacy":"cid.legacy","facebook.legacy":"facebook.legacy","aaa-module-mounting.legacy":"aaa-module-mounting.legacy"}];
window.modules["facebook.legacy"] = [function(require,module,exports){"use strict";DS.service("facebook",[function(){this.fb=function(i){window.FB&&window.FB[i].apply(this,Array.prototype.slice.call(arguments,1))}}]);
}, {}];
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o typeof key === 'string' && key.match(/\.legacy$/)).forEach(key => window.require(key));
}
function tryToMount(fn, el, name) {
try {
fn(el); // init the controller
} catch (e) {
const elementTag = el.outerHTML.slice(0, el.outerHTML.indexOf(el.innerHTML));
console.error(`Error initializing controller for "${name}" on "${elementTag}"`, e);
}
}
/**
* mount client.js component controllers
*/
function mountComponentModules() {
Object.keys(window.modules).filter(key => typeof key === 'string' && key.match(/\.client$/)).forEach(key => {
let controllerFn = window.require(key);
if (typeof controllerFn === 'function') {
const name = key.replace('.client', ''),
instancesSelector = `[data-uri*="_components/${name}/"]`,
defaultSelector = `[data-uri$="_components${name}"]`,
instances = document.querySelectorAll(instancesSelector),
defaults = document.querySelectorAll(defaultSelector);
for (let el of instances) {
tryToMount(controllerFn, el, name);
}
for (let el of defaults) {
tryToMount(controllerFn, el, name);
}
}
});
}
// Make sure that a `window.process.env.NODE_ENV` is available in the client for any dependencies,
// services, or components that could require it
// note: the `` value is swapped for the actual environment variable in /lib/cmd/compile/scripts.js
window.process = window.process || {};
window.process.env = window.process.env || {};
if (!window.process.env.NODE_ENV) {
window.process.env.NODE_ENV = '';
}
// note: legacy controllers that require legacy services (e.g. dollar-slice) must
// wait for DOMContentLoaded to initialize themselves, as the files themselves must be mounted first
mountLegacyServices();
mountComponentModules();
// ]]