City's perfect start shattered by Wolves.
Ruben Dias' first-half own goal set the tone for a frustrating afternoon for City, who needed a brilliant free-kick from Julian Alvarez to tie things up after the break.
Wolves wasted little time in getting themselves back in front, however, with Hwang Hee-chan slotting home on the counter to hand the home side three valuable points.
How the game unfolded
Craig Dawson needed to throw himself at a cross in towards Erling Haaland inside five minutes, with the Norway hitman denied a tap-in from six yards out.
Wolves snatched a surprise lead 12 minutes in as the electric Pedro Neto burst down the right wing and aimed a cross in towards Matheus Cunha. Dias couldn't stop the ball and instead accidentally sent it beyond Ederson to open the scoring.
Forward came City in search of an equaliser but their aimless crosses into the box were gleefully nodded away by Wolves' centre-backs, who had several shots from range to deflect away as well.
Predictably, Wolves didn't see a whole lot of the ball in the first half but Gary O'Neil's side were incredibly brave when they did recover possession and their repeated bursts forward often left City's defenders sweating, even if they did not lead to any real chances.
The second half continued in similar fashion. Haaland saw a glimpse of goal early on but had to swing wildly at a half-volley and could only send a tame effort into the gloves of Jose Sa.
It took a moment of magic from Alvarez to get City back into this game. The Argentine's free-kick fizzed into Sa's top corner shortly before the hour mark, proving too powerful for the goalkeeper.
Dawson cleared off the line after a penalty-box scramble before Wolves went straight down the other end and restored their lead through Hwang, who slotted home after a fortuitous ricochet and a smart lay-off from Cunha.
City abandoned any sense of a traditional formation as the clock ticked on, throwing everything they had directly at Wolves' penalty area, but the home side refused to surrender.
The stats sheet may not look kind to Wolves, but this was a sensational showing from O'Neil's side, who played with discipline and desire as they battled to three enormous points.
Wolves player ratings (3-4-3)
GK: Jose Sa - 6/10 - Faced a lot of shots on goal but wasn't massively busy, but he will have been frustrated not to have kept out Alvarez's free-kick considering he did get a glove to it.
CB: Max Kilman - 8/10 - Locked up Doku with ease. Stayed incredibly focused on one of the toughest jobs around.
CB: Craig Dawson - 9/10 - An excellent interception to deny a certain goal early on and had to clear off the line after the break. Hopefully he's let Haaland out of his pocket by now.
CB: Toti Gomes - 7/10 - Had the toughest afternoon out of Wolves' defenders but still came out on top in his duels with Foden.
RM: Nelson Semedo - 8/10 - A few poor decisions in possession early on but largely put in a mammoth display in defence to help out with Doku.
CM: Mario Lemina - 7/10 - Had to work hard but was happy to do the ugly side of things to stifle Kovacic and Matheus.
CM: Joao Gomes - 7/10 - Great energy to stifle City's creativity. Even enjoyed a few nice moments on the ball.
LM: Rayan Ait-Nouri - 6/10 - Can be satisfied with his performance, even though Foden occasionally got the better of him.
RW: Pedro Neto - 7/10 - Didn't get too many opportunities to strut his stuff but made sure his moments counted. Great dribbling for the own goal.
ST: Matheus Cunha - 7/10 - Made a real impact with his immense pressing. A selfless shift which also featured a delightful lay-off for Hwang.
LW: Hwang Hee-chan - 7/10 - Energetic on the counter and took his goal well, but a little fortunate to stay on the pitch in a first half which was littered with fouls.
Substitutes
SUB: Boubacar Traore (69' for Gomes) - 6/10 - Kept the energy high to try and will his side to victory.
SUB: Matt Doherty (74 for Ait-Nouri) - 6/10 - Did well in an unnatural position on the left.
SUB: Fabio Silva (86' for Cunha) - N/A
SUB: Jonny (86' for Hwang) - N/A
Subs not used: Daniel Bentley (GK), Santiago Bueno, Joe Hodge, Sasa Kalajdzic, Pablo Sarabia
Manager
Gary O'Neil - 9/10 - Got this one right. Wolves sat back by design but were absolutely relentless on the counter. The sort of performance a struggling side needs against the best team in the world.
Man City player ratings (4-2-3-1)
GK: Ederson - 6/10 - Had absolutely nothing to do aside from picking the ball out of his net. Couldn't do anything about the own goal.
RB: Kyle Walker - 6/10 - Did his best to progress the ball and make something happen. Enjoyed his battle with Hwang as well.
CB: Manuel Akanji - 5/10 - Didn't show enough urgency in possession, with Wolves more than happy to dance to his slow tempo.
CB: Ruben Dias - 5/10 - Unfortunate to concede the own goal but didn't exactly inspire confidence for the rest of the game anyway.
LB: Nathan Ake - 4/10 - Couldn't keep up with Neto at all. Clearly reluctant to push too far forwards out of fear of getting caught out of possession.
DM: Matheus Nunes - 5/10 - With every touch earning a chorus of boos, Matheus was guilty of trying to force a pass when one wasn't on. Hooked at the break.
DM: Mateo Kovacic - 5/10 - Guilty of playing a little too direct. Drove aimless passes into Haaland which were never going to stick.
RM: Phil Foden - 6/10 - Buzzed around trying to make something happen but Wolves' deep block made it incredibly tough for him.
AM: Julian Alvarez - 6/10 - Another of those games in which Alvarez's limited experience as a midfielder was evident. Needed a moment of quality from a free-kick to really impact the game.
LM: Jeremy Doku - 5/10 - Ran a lot and looked like he could provide a spark at any given moment, but Wolves focused on shutting him down and often forced some sloppy mistakes.
ST: Erling Haaland - 3/10 - This was one of those games for Haaland. Barely involved at all and forced to work with ill-advised passes.
Substitutes
SUB: Oscar Bobb (46' for Matheus) - 6/10 - Lively and dangerous on the ball.
SUB: Kalvin Phillips (65' for Kovacic) - 5/10 - Failed to bring anything of note to the game.
SUB: Jack Grealish (80' for Ake) - N/A
Subs not used: Stefan Ortega (GK), Scott Carson (GK), Sergio Gomez, Rico Lewis, Josko Gvardiol
Manager
Pep Guardiola - 4/10 - Serving a surprise touchline ban, Guardiola's side were tame and his substitutions appeared a little scattergun, with City losing their structure in their desperate search for an equaliser.