The Eagles held their ninth practice of the 2021 training camp at the NovaCare Complex Saturday. Here are links to Days 1, 2, 3, 4, 5, 6, 7 and 8. Let’s get to Day 9′s action:

Offensive woes. The Eagles were back at it after a day off and had a paradoxical practice. The offense looked downright terrible in team drills, but seemingly because the defense looked sharp. I’m sure it was more a combination of the two, but if I had to emphasize one it would be the former. Jalen Hurts didn’t complete many passes, his receivers didn’t get open often, and the offensive line was mistake prone. The run game looked OK, but there were only a few obvious holes to hit. And the same could be said for all three units. Nick Sirianni has had the first-team offense face off against the first-team defense -- and the same for the second and third units -- each practice. Andy Reid used to have his first units compete against the second when he coached the Eagles. The philosophy there was to give the starters a slight edge to foster success and build confidence. Doug Pederson adopted that formula early in his tenure here, but switched it up in his second season. The ones would play the ones and so on down the line. I think the Eagles ex-coach’s reason for change had more to do with the decrease in live periods. Nevertheless, I can’t make a strong argument for either approach. But I do know Sirianni’s offense has struggled throughout camp, and it may have hit its nadir Saturday.

Defensive whoas. Hurts had been making some improvement after a slow start to camp, but he took a step back on this day. It wasn’t all his fault, of course. But he went one eight-play stretch without completing a pass. The first offense started fine with a short completion to tight end Dallas Goedert. But Hurts was sacked on the next play when defensive end Josh Sweat roasted left tackle Andre Dillard and again two plays later when the left side of the line couldn’t handle a stunt and Sweat tagged the quarterback. Hurts kept playing, flushed right and threw downfield, but linebacker Eric Wilson made the easy interception before the sideline.

Hurts the eyes. Hurts hooked up with tight end Zach Ertz on a run-pass option a period later, but the ugliness returned on the next set. Hurts tried to dump a pass to rookie running back Kenneth Gainwell, but he was double covered, and the only reason neither linebacker Alex Singleton nor cornerback Steven Nelson didn’t record the pick was because they ran into each other. Nelson had a good outing, overall. He had sticky coverage on receiver Travis Fulgam in one-on-one drills, and while his opposition pulled away late and had the ball fall through his arms, offensive pass interference might have been called. Back to team drills: Hurts made another poor decision when he threw to a completely covered Jalen Reagor. And after Lane Johnson allowed a sack to defensive end Derek Barnett, Hurts had another attempt -- this time to Fulgham -- knocked away by corner Michael Jacquet. Gross.

Offensive comeback (sorta). Sirianni pulled the team together before the final period and reset the competition. The first unit did little on its first three plays -- Johnson had a false start, safety Anthony Harris tipped away a toss to Goedert, and Hurts scrambled for nothing. He completed check downs on the next two. And finally picked up positive yardage when he found Fulgham downfield in a soft spot in the zone. Flacco didn’t do much with the second unit. Third-stringer Nick Mullens tossed one of the ugliest pick 6s I’ve ever seen when he wobbled an ill-fated pass that corner Lavert Hill took the other way. But the quarterback did convert a third-and-short when he connected with running back Jason Huntley with pressure in his face. The offensive players exploded and celebrated because they technically won that last competition. Whatever. There were no moral victories on this day.

Depth chart update. There were two new guards on the first team offensive line. Sua Opeta was on the left ahead of Nate Herbig and Jack Driscoll was on the left over Matt Pryor. Pryor has struggled against interior pressure, so Opeta’s promotion wasn’t a huge surprise. Herbig practiced at center with the second unit, so that partially explained Driscoll’s move from tackle. Driscoll said earlier this week that the Eagles would continue to cross-train him, and the same applied to Herbig. The usual starters at guard -- Brandon Brooks (hamstring) and Isaac Seumalo (hamstring) -- were still out.

Do Sweat it. Sweat has clearly been one of the stars of camp. A practice doesn’t go by without the fourth-year end making his presence felt. Sure, facing Dillard has helped, but he’s given Jordan Mailata all he can handle. Sweat has pushed Barnett for that starting left end spot, and even if he doesn’t end up winning it, he’s going to play a lot. If he holds up, he could be a Pro Bowl dark horse. Dillard’s left hand is now completely wrapped -- he hasn’t been listed on the injury report -- but he made it through the workout. Even Mailata, who’s edged ahead in the left-tackle race, had a shaky moment and took a false start penalty Saturday.

Ahem … injuries. The aforementioned Singleton had his first practice after missing the first eight because he was on the COVID-19 list. His first action was with the starters alongside Wilson. The Eagles had several new additions to the pre-practice injury list. Defensive end Genard Avery and safety Grayland Arnold have hamstring strains and are day-to-day. Linebacker Shaun Bradley (illness) is also day-to-day. And receiver John Hightower has a groin injury and is week-to-week. Other day-to-dayers: tight end Jason Croom (knee) and Brooks. Other week-to-weekers: receiver DeVonta Smith (knee), linebacker JaCoby Stevens (hamstring) and linebacker Davion Taylor (calf). Defensive end Ryan Kerrigan (thumb) and receiver Michael Walker (foot) were limited. Tackle Casey Tucker left practice early with an unspecified injury.

DL/OL one-on-ones. Driscoll and Opeta’s ascension produced mixed results. Opeta was the guilty party on the Sweat stunt/sack. The former fared better in team, but his first rep in one-on-ones against Fletcher Cox went about as expected with the Pro Bowl defensive tackle making Driscoll look foolish with a nifty inside move. Dillard fended off Barnett for about two-and-half seconds. We’ll call it a draw. Mailata muscled Sweat to the ground on an outside speed rush. Pryor bounced out to tackle and had two strong reps vs. Barnett.

Gainwell gained well. The rookie running back had probably his best showing of camp. He didn’t exactly pop -- I’m not sure he has the extra gear the Eagles might have expected -- but it’s also important to note that he opted out last season in college and could be still working himself back into playing conditioning. Gainwell had a couple of inside zone runs where he was able to get to the second level. A few defenders would get a hand on him and ease up, so it was hard to determine whether he could have broken those would-be tackle attempts, but his vision on the carries looked good. I don’t think we’ll get an accurate read on his NFL readiness until preseason games.

Other low/highlights. Adrian Killins had a couple bright moments. He toasted corner Avonte Maddox out of the slot on a deep route in one-on-ones. That’s a tough assignment for Maddox, but Killins got way behind him. He also worked at running back, his normal spot, and caught a screen and weaved his way through the defense. Receiver Quez Watkins beat corner Zech MePhearson inside during one-on-ones. Sirianni ran and met Watkins after the catch to give him a hand slap. Running back Kerryon Johnson had a Flacco swing pass sail through his hands. Edge rusher Joe Ostman stopped Gainwell in the backfield for a tackle for loss.

And a few leftovers: Defensive coordinator Jonathan Gannon continued to utilize an odd-man front on various plays. One first unit grouping had Cox and Brandon Graham as the defensive ends and Javon Hargrave as the nose tackle. … The Eagles will open practice to fans at Lincoln Financial Field 7 p.m. Sunday night. Tickets must be purchased in advance. Parking is free.