Thursday, February 22, 2024

Monstercross '24 - the analytical follow-up post

This year was the first time I made no changes to the bike. I had just installed the SRAM Force AXS XPLR groupset before last year's race, had just bought and configured the Sun Ringle Duroc G30 wheels & WTB Resolute tires & 10-44 XPLR cassette, and even last year's bar tape was still present.

Literally the only changes were a new set of pads & front brake rotor, although a review of last year's blog post suggests I was running a lower tire pressure then at 25 psi, compared to my 27f/28r split this year. That's a sizable difference considering my race-morning weights were within 0.5 lbs of each other.

Last year the race was considerably warmer, and I was wearing standard cool weather kit. This year I was in much more aero materials, from the Velotoze neoprene gloves (with hand-warmers stuffed inside on top of my knuckles) to the Castelli Perfetto ROS2 jacket that I'd first tried on the NYD not-a-race.

I've talked about how my training tends to fall off in the Autumn, and I track fitness, form (freshness), and fatigue through pretty standard algorithms in intervals.icu (it shows almost identical data to Sauce, Elevate, and others), along with various elements from Veloviewer and other sources:


In 2020 and 2022 I got off and walked after seizing up, and in 2021 we ran a modified course, so we'll start by discarding those years. This is convenient because I also didn't have power back then, and I evidently didn't explicitly track tire pressure or my race-day setups.

Looking at this year's data, though, I came into the race with a MUCH higher fitness score than in previous years, and in spite of higher average and normalized power numbers, ended with a better form number than ever before. Fatigue was high, but it took a lot of work to get to that fitness number.

In fact it took since December 1, when I got roasted alive in a Zwift Fondo and decided to put in ~12h/week, as mentioned in my previous post.


That day, as indicated by that lone purple dot, marked the start of my march from a consistent ~73 fitness score up to 90 by January 23, with a taper that was only quasi-intentional putting me on a positive form number of 14 the day before the race.

Lots and lots of Z2, folks. Seriously: it's transformative. The easiest way for Garmin users to get the bigget bang for their buck is to turn on both Training Effect data fields: aerobic (~Z2 & 3) and anaerobic (~Z4+). I started training to these numbers, targeting an aerobic score of 3.5 - 4.9 for every ride, and only doing anaerobic work a couple of times per week. Watching these numbers has turned my Zwift time from junk miles to productive training. I cannot advocate for it enough.

But as I also mentioned in my previous post, the other big change was watching W' bal. W' is the is your anaerobic battery--your matches, if you will. It's not the easiest thing to calculate--your estimates are guaranteed to be wrong, and the numbers can and will change over time. But essentially it's scored by your max power over various intervals, say 2, 5, and 10 minutes, and using the drop-off (ye olde power-curve!) to determine how many Kj you have in your battery. Go for a big sprint and watch it drop to 0 almost instantly, or do a long surging climb and watch it drop slowly, but any efforts over critical power (which is roughly equivalent to FTP) will drain it. Conversely, riding *below* critical power refills it over time.

I started using W' bal in Zwift rides to get a feel for it, and holy moly it was amazing. Suddenly those times I felt like I couldn't carry on, I had data to show that was a lie. Because we all know the mind quits before the body. And by looking at the data instead of listening to my body, I held onto some groups that would absolutely have dropped me before.

But because W' bal also recharges, it's also instrumental in gauging recovery in a race. My 4th overall segment attack on Monsterkarst the week before the race was paced entirely on W':


This chart shows W' in red overlaid on power. Power, alone, can be hard to really interpret. You can see my first 20 minutes or so are fairly consistent, and W' remains nearly full, but when it gets spiky it's hard to see where things are dropping off. W' shows that data clearly, and the Garmin data-field shows it as a percentage, so you can track your effort clearly.

That same data for the race shows what was happening in that first lap, and how the balance changed when I got on the skis out in the wind:

That opening effort to Beach Rd, with all its bridges and power spikes, had me on the ropes. And while I got tired through the rest of the race, I was never in deep trouble again.

So I finally cracked the 3 hour mark, and I did it with over half the race being out in the wind. I absolutely believe I would have been 5 minutes faster if I'd been able to reach the front group before Beach Rd, but where to go from here?

A review of my shifting data from the SRAM app shows a larger chainring could optimize my chainline, with the lion's share of my time spent in the outer 3rd of the block.


I've been running a 40T chainring for so long I'd be nervous to depend on something larger, but the math says a 46T would move the peak back 2 gears, while only losing a single gear off the bottom--a gear I only used for 9 seconds all day. If I can find an aero 46T 110-BCD 5-bolt NW oval chainring before I give up on gravel for the season, I may have to try it out...assuming my power and fitness are in the same ballpark next year.

And that's the rub. Last year I was flat thru the Fall and got COVID in January. This year I was making huge gains from December to late January before getting wobbly and forcing myself into a taper. There's no telling what the future holds, but for now I'm extremely satisified with my results.

Wednesday, February 21, 2024

Monstercross '24 - My Annual Blog Post

 This year was the 13th running of Monster Cross, and I've now officially participated in more than half of them! I had a whole great big long intro planned for this post, but then I re-read last year's post and tbh it was gonna be pretty similar, so let's lay out the season-to-date.

Just like in 2023's race, I hadn't done any racing since the 2nd Sorry Honey CX race in mid-September. Weird coincidence that was at least driven by weather this time, and not a months-long recovery from injury. But my fall season, while full of rides, was not an effective training season. It was just a mix of MTB rides, which I've really started to enjoy by finally having a good bike (more on that later?), and trainer rides. I finally realized, after 3 years of struggling with chilblains, that my feel cannot tolerate cold road rides.

But on December 1 I did the first of several Zwift fondos and decided to kick my training back into purpose. With a focus on volume and Z2, I pushed my hours up to ~12/week and held there thru early February.

Along the way, I learned about W' and added it to my data screens when dual-recording Zwift rides, and when I did push to big watts it became invaluable in knowing when to push on and when to conserve. Seriously: learn about W'. It's an absolute game-changer for racing, and I have a power meter coming for my mountain bike so I can be more precise with my efforts there, too.

Then came the annual New Year's Day not-a-race, which gave me my first opportunity to see if my training had paid off, and I've never felt fresher after ~80 miles, even if my feet were out of commission for a week afterward.

The Tour de Zwift further sharpened the stick, but I started running the risk of not training to 3 hours consistently.

The last piece of the puzzle for me was having spent very little time on the gravel/cx bike since September. The new mountain bike is *SO MUCH BETTER* than the old one that I really prefer it to riding gravel. So I forced myself to make weekend jaunts to Pocahontas State Park and put in hot laps. Since part of the official course is only open on race day, most folks either opt for a "training course" lap that starts & stops in the main lot, or the Monsterkarst Strava segment, which covers the same ground but starts at a more convenient trail hub.

Monsterkarst became my gold standard, and 1 week before race day I put in a lap that is currently 4th overall on the segment, over a minute faster than my previous best from the year before. I guess that meant I was ready.

So with aero skis on my CX bike, a power meter and W', 50 hours of volume in January alone, and a forcibly-imposed taper, I felt as prepped as I could be for a COLD day on the bike.

And it was cold. The warmup was the coldest riding I've done in months, with 2 jackets and pants over my tights. I kept all of that on until the last possible moment, and then by an absolute confluence of luck found myself at the start line right as folks were starting to assemble.

10 minutes of standing around later, and a shuffle forward that saw me pushed back to about the 6th row, and we were off! Last year I did not grid well, and while my position was far better this year, it was still going to be work to get to the front.

Just like last year, the leaders pounced from the gun, and even where I was--maybe 50th--there were already dudes gumming up the works by 1 mile into the race.


You can see it right there in the first chart: 30s Power. A big saggy dip from 0:02 - 0:04. And just like last year, that meant jumping through traffic and bridging repeatedly for the next several miles. Each peak on that chart represents catching one group and jumping to the next, and each time you can see the W' balance dropping on the bottom chart: I was burning matches quickly. But I was also VERY close to the front--by the time we turned onto the trail paralleling Beach Rd they were no more than 50' ahead.

But the surges kept taking me to groups that were getting dropped--nobody else was moving forward. So coming through that last turn I was really hopeful to have made it, but the 3 guys I caught were, predictably, getting shunted off the back. So I watched the leaders ride away and focused on recovering. We were still moving pretty well, and nobody was catching from behind, and maybe most importantly, we were picking off others who were either dropped or had mechanicals.

Also as with last year, the aero bars come with the curse of expectation: nobody wants to work when you could just get aero and do it all. I was doing a whole lot of work, along Beach Rd, down thru & up from the dam, and onto the road section, until an e-bike came rolling through and picked up the mantle. We held his wheel thru the first 2-way zone and up toward the road crossing toward the campsites until his chain dropped, and then the 4 of us were alone again through the entire north side of the course.

We came through start/finish in under 1:27:00, making it just possible that I might achieve the goal that had eluded me since 2017: a sub 3-hour finish!

I'd managed an extremely lucky parking spot where I could leave a bottle on my bike rack without exiting the course, and at the beginning of lap 2 I stopped just long enough to swap bottles. Two of the riders in our group rode on, but backed off enough that a quick trip to the skis brought them back before we even left the pavement. A pair of other riders caught us up soon after, and then an extremely fast racer dragged us for a mile or so before we gave up chasing him.

But once he was gone, it was back to being glued to the front.

Every stinking year I do other people's work sitting out there in the wind, but I also really wanted that 3-hour finish, so I didn't waste any time waiting for folks to decide to work.

The 2nd lap run along Beach Rd I don't think I came off the front once. But I also didn't really vary my effort and focused on recovering W' balance for the dam & north side.

We lost a rider along the way, possibly at the dam climb, but then Sneaky Dave caught us up on his rigid mountain bike, and at least there was a small amount of rotation on the road section.

As Sneaky Dave is 60, I'm in my late 40's, and our 3rd was a junior, I strongly suggested that we just work together and keep things smooth. They seemed to be willing...so long as I was on the front. I'm really not exaggerating when I say I was probably on the front for 20 miles of that lap. Fully 80%.

But at least they weren't attacking, and while I didn't feel great, I wasn't cramping. I was remembering to drink. I had forced myself to eat when I didn't want to. Cramps have undone my race several times, and I wasn't having it this time.

We got back to the north side and caught a small cadre of riders at about 43 miles. Our group of 3 briefly became a group of 7, and then the junior attacked. Literally no reason to do so: nobody in our group was racing him, and there could not possibly have been more than 15-20 riders ahead, and by this point there was no possibility of catching the front group. No point. Sneaky Dave and I both cried foul, but I dutifully got on the skis and limited his damage to ~10 seconds and held him there until the Monsterkarst trail hub, where he inexplicably tried to make a wrong turn and came to a full stop. MAYBE NEXT TIME DON'T ATTACK THE GROUP.

We bombed down the final trails as a group, and Sneaky Dave put in a big dig at the final walking trail, and I was happy to let him (and the junior) go. I had just about a mile left to go, and if I just focused I could barely cover that ground before the 3-hour mark.

I dismounted for the final creek crossing because I'm horrible at it, but unlike last year or the year before, I was actually able to get back on the bike and pedal. Final climb, final rooty dangerous descent, and there was the bridge. The Garmin showed 2:58.

I made my way to the foot of the paved dock climb and just put everything i had into the pedals, crossing the line at 2:58:28 on the official timing clock. Somehow the 2nd lap was only 5 minutes slower than the first.

I'd done it! On the 7th try, and having done roughly 60% of the race in the wind on the skis, I finally cracked my goal of 3 hours. And also unlike last year, I was actually able to get off the bike afterward.

No cramps, food consumed, only just over a bottle of water in me. I've never felt as good after this race. It took a few minutes to figure out how to walk, but that was it. I didn't even need a nap when I got home. I guess all that volume and Z2 training paid off!

As an added bonus, I got hardware! Last year I brought home a 5th place medal in Men 40+, and this year I brought home the 4th place medal. Weirdly, the online results show that I actually got 4th last year, and 5th this year, but either way I have the correct medals, so it evens out.

Wednesday, May 31, 2023

Memorial Day Opsec

I visited my grandparents' grave on Memorial Day. My grandfather served in the US Army in WW II, and my grandmother is buried beside him. I shared an uncaptioned picture on Facebook of their headstones with flags in the background.

It was a huge opsec failure.

My grandparents' last name is my mother's maiden name, the most common "security question" on the planet. Though I didn't identify them as my maternal grandparents, it's fairly obvious they don't share my last name, and their birth/death dates all but confirm that they're the right age to be my mother's parents.

Everything you share--no matter how small, innocuous, or minimally identifiable--helps create a more complete and exploitable digital footprint. I weaponized data against myself simply by sharing uncaptioned content.

Security questions are almost as dangerous as bad password policies. The ones that are easy to remember are also easy to guess or prize from social media.

Mother’s maiden name: launch this one into the sun. Maybe this was ok in the days before social media, but now it’s way too easy to connect dots through online friendships.
Birth city: over 50% of Americans live in the state where they were born. Some surveys put the number over 50% for still living in the same city. Nuke this question. A guess shouldn’t yield a >50% success rate.
Elementary / High school: Kind of a combo play on the questions above: if you can suss out a person’s city or state and see their friends list on any social media platform, you’ve probably already gotten their entire educational history. I think the only one that might be tough from my past is middle school, maybe. Maybe.
First pet: People generally love to gush over early pet experiences.

The harder ones force me to remember how I answered them originally:

First car: did I list the brand? The model? The year? The sub-model? I might have listed the color on one security question, and not on another.
Favorite color: My children have favorite colors.
Best friend: Uh....when? I only met my current best friend a little over a decade ago, and I’ve been filling out these questions for over 20 years.
Favorite teacher: Bro I trudged through over 16 years of education, and that was over 25 years ago--is that a thing people actually remember?
Favorite food: Again, when? I'm lucky if I can remember what I just had for breakfast.

And don’t go tacking on ‘as a child’ as a qualifier to any of these, because as I bear down on AARP eligibility, everybody under 25 looks like children, and there were times when my budget dictated that ramen was my favorite food.

Until all apps and all platforms accept passkeys, decentralized identity, or other hardware backed authentication (and users learn the vital importance of backing up their app-based authentication configurations), I see no functional way to avoid security questions. Just be careful that the answers to those sacred questions are protected with the same gusto as a bad password.