Carolyn Martens has long been Killing Eve’s juiciest mystery. Played by Irish actress Fiona Shaw, the wry former head of MI6’s Russia Desk is deliberately enigmatic, usually running at least one shadow operation that threatens to upend the official assignment. She’s career-obsessed and thrice-divorced. Whenever a new and interesting character pops up, they turn out to share some storied history with Carolyn, frequently romantic. And yet little is known of her own personal history beyond her lightning-fast rise up the ranks of the world’s most fabled intelligence service. Last week, some nuance dribbled out when she confirmed to Villanelle that her gay father was, in fact, an OG Cold War special agent. This week, in a series of titillating, sepia-toned flashbacks, we learn more, including how Carolyn’s origin story intersects with the birth of the Twelve.
The year is 1979 and Carolyn’s undercover in Berlin, embedded with a group of young lefties who fancy themselves anarchists but are struggling to name their ragtag opposition. Carolyn is even more misanthropic and derisive as a young person, but fun, too. She smiles a lot. She likes this work and knows she’s good at it. Going by Janice, Carolyn suggests “the Twelve,” an homage to Beethoven’s Symphony No. 3 that honors the group’s 12 founders — a group, we’ll learn, that includes at least two foreign intelligence officers and the elusive Lars Meier. Lars was called Johan then, and he was the Twelve’s leader in addition to Janice’s boyfriend. Not that Carolyn took the distinction seriously. She starts an affair with comrade Karl, which she conducts at the same MI6 house where her father conducts his own secret affairs. The U.K. decriminalized homosexuality in the late ’60s, but that doesn’t mean it was welcome at Vauxhall.
Present-day Carolyn is also in Berlin, tracking down Lars/Johan and plaintively walking the streets of a past life. She sits on a bench and stares into her dad’s old place, dipping into her memory of the last time she was there. The Twelve was celebrating, and Carolyn suggested borrowing from her dad’s well-stocked liquor cabinet to keep the party going. But when she goes to raid his stash, Carolyn finds her father in the garage, dead of a self-inflicted gunshot wound. Scattered nearby are photos of him kissing a male lover. Blackmail.
She literally closes the garage door behind her, maybe realizing for the first time how deeply she’ll have to deny her own life and her own feelings for the job. That that is the job. She returns to the living room and invites the bourgeoisie-hating anarchists to trash the place. This is how she says good-bye to her father, whose eyes twinkled with affection for his daughter. Back in the present, Carolyn finds an old associate called Karolina, who was Karl’s girlfriend at the time Janice slept with him. Now a suburban mom, Karolina assures Carolyn she had no idea Johan was still alive. It’s a depressing reunion, at least for the former spy with dwindling allies and no leads. When they were young, Karolina confesses she was intimidated by Carolyn — envious of her intellect, her swagger. But from where Karolina’s sitting now, Carolyn’s life doesn’t seem so glamorous after all.
Of course, Karolina’s lying, and of course, Carolyn knows she’s lying. Karolina’s always been a JV operator, and her tells haven’t evolved in the last 40 years. That night, Carolyn breaks into her house and finds a suspicious note about Karolina’s father’s old cabin. This, too, compels a flashback — to the last time Carolyn spied on Karolina. Using a sort of Cold War spidey sense, she divined the hiding spot of Karl’s real passport — his Russian one with his real Russian name — without tearing the place apart. Carolyn wasn’t the only spy among the Twelve, and she evidently wasn’t its sharpest.
That honor belongs to Konstantin, a young KGB agent who infiltrated the Twelve alongside Janice. Konstantin slept with Carolyn to get close to her father, then blackmailed him to death. Maybe that’s when Carolyn stopped smiling so much. She confronted Konstantin about it back in 1979, but Johan stumbled upon their lakeside meeting and jealously mistook it for a lovers’ quarrel. Together, the young agents made the wordless decision to kill Johan, taking turns beating him over the head with an oar until he stopped resurfacing for air. They’re the reason Johan was believed dead, and they’re the reason Lars is still alive now.
Carolyn finds Karolina’s father’s cabin through Konstantin. When she gets there, she finds Johan, who allows her inside. But Johan’s location isn’t the most revelatory thing to come of her short phone call to Konstantin, with whom she’s always shared a peculiar relationship, even sparing his life last season. Over the phone, they exchange wistful nothings: Could they have lived some other life if they hadn’t, in the early throes of romance, not-quite-bludgeoned a man to death in a local water feature? Alas, some people just aren’t built for happiness.
Take Eve as an example. She had a whole life she threw away in pursuit of — what exactly? There’s her infatuation with Villanelle, but Hélène says something impossibly cutting this episode that feels close to the mark no matter Eve’s denial. She calls Eve a bird-watcher desperate to fly. Eve may hate the game, as she insisted to Carolyn earlier this season, but she’s always adored its beautifully unscrupulous players. This week, she comes close as ever to mimicking their tactics when she kidnaps Hélène’s daughter as payback for Villanelle’s prison release. She even traffics her across international waters back to England, where Chloé tails along as Eve meets the man who took Lars’s photograph back in the ’70s. He tells her what he remembers of the guy: an Icelandic revolutionary called Johan who drowned before he could do anything revolutionary, had an English rose of a girlfriend called Janice. The photographer even lends Eve the Super 8 footage that allows her to ID Carolyn. It’s all coming together now, it seems.
Or it’s all falling apart. Eve’s falling apart or falling away. Her investigation into the Twelve is progressing, sure, but so is her collapse into evil. Child abduction, Eve? Come on. When Hélène comes to collect Chloé, Chloé begs to stay with the warm woman who lured her with presents and screen time instead of going home to Paris with her icy maman. “Bravo, Eve,” Hélène spits. Eve is proud of the caper, but dastardly deeds aren’t the hard part of what women like Hélène and Villanelle do for a living. Surviving what comes next — keeping one eye open as you accumulate more and more enemies — is the more relentless burden.
Back in Havana, Villanelle is giving a master class on anticipating the next step. Still grappling with what it means to be a “good” person with a flair for murder, she volunteers her services for charity: The kindly housekeeper at the Russian safe house is being abused by her firefighter husband. It’s art, really, what Villanelle can manage with a little time and a smoke machine. She stages a fire, then drowns the wife-beating husband with his fire hose when he comes to put it out. It’s not just the twisted killing methodologies that set Villanelle apart; it’s how she gets away with it. After waterboarding the fire chief to death, Villanelle doesn’t make a shadowy escape down a back alley — she walks out the front door looking like the victim.
Villanelle agrees to a few more pro bono hits on behalf of Havana’s mistreated wives, kind of like Robin Hood but for murder. She’s rehoning her craft before heading back to Europe to track down Hélène, who seems easy enough to track down — she has a kid and a home address. Regardless, Villanelle decides to hit up Konstantin, still in Margate coaching Pam on how to become more like Villanelle, which is to say as distractingly intoxicating as she is ruthless. He tries a fairy-godmother makeover, but the haute couture wears Pam. Instead, Pam adopts a sweet, vaguely rockabilly aesthetic with the help of that cute carny from last week. Villanelle declares the look is tired, but all these trends are cyclical, really. What hasn’t been done before?
Konstantin tells Villanelle he doesn’t know how to find Hélène, and we believe him because he’d surely like her dead, too. As fatalistic as he is about anyone’s chances of escaping the clutches of the Twelve, he gives his old charge what he can: the name and location of another of Hélène’s assassins. They hug before Villanelle goes — a long, emphatic hug. Halfway through Killing Eve’s finale season, I wonder if we’ve just seen our first big good-bye. If this is their last run-in, I guess I’m a little surprised Villanelle doesn’t kill Konstantin, but lots of people with motive and opportunity have chosen not to kill him across the years, Carolyn and Eve included. Maybe it’s his irrepressible joviality.
Meanwhile, Hélène appears oblivious to the fact that she’s both huntress and hunted. She returns to London, this time without Chloé, to neg Eve to death. She patronizingly congratulates her for becoming a pathetic, inferior facsimile of the gorgeous, exotic death-dealers who fascinate her. But rather than take revenge on Eve, she seems almost to pity her. She’s found Lars and invites Eve along to the confrontation. When Hélène’s black car pulls up to a tiny dead-end in Margate and not a forested cabin just outside Berlin, it’s clear she’s lying, but shouldn’t it have been clear before then? Hélène isn’t built for happiness or cooperation, and she’s definitely not prepared to overlook the matter of her only daughter’s international abduction.
We never see the shooter. Only the target. Villanelle is peering into a shop window, staring at her own reflection, which means she watches the arrow fall from the sky and pierce her shoulder. Not a death blow, and considering the choice of weapon, it’s not meant to be. Villanelle might be the bull’s-eye, but Eve, locked into the backseat and screaming to be let out, is who Hélène’s there to punish. As much as Eve is fascinated by the women she pursues for a living, she lacks what made Villanelle so invulnerable for so long, what made Carolyn so good at this game from all the way back in 1979, when she quickly closed the door on the image of her own dead father. Eve’s heart doesn’t have an off switch.
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()}});
}, {"1":1,"6":6,"12":12,"35":35,"40":40}];
window.modules["global-nav.client"] = [function(require,module,exports){"use strict";const dom=require(4),auth=require(12),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(1),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 o=t.querySelector(".dropdown");!n||t.contains(e.target)&&27!==e.keyCode||o.classList.remove("open")})}function gtmSendReport(e,n,t){let o={eventCategory:"ecommerce",eventAction:"componentClick",brand:e,dimension23:"global-nav",list:pageUri,pageZone:"header",variant:"nav-link"};"global-nav-link"===t&&(o.eventLabel=n.href),gtm.reportNow(o)}function updateElementTargetUrlsIfQueryStrings(e){if(searchString){const n=new URLSearchParams(searchString);let t=e.href;if(t.includes("?")){const o=t.split("?"),i=new URLSearchParams(o[1]);for(let e of n.entries())i.set(e[0],e[1]);t=`${o[0]}?${i.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()&&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;
}, {"1":1,"4":4,"12":12,"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");
}, {"cid.legacy":"cid.legacy","ads.legacy":"ads.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();
// ]]