Ashland City Councilor Carol Voisin has kept her seat, edging out challenger Jackie Agee by 29 votes out of nearly 10,000 cast.
Voisin earned 49.94 percent, or 4,885 votes, to Agee's 49.64 percent, or 4,856 votes.
Voters wrote down write-in candidates on 0.42 percent of ballots, and 2,274 voters didn't make a choice in the race, according to official Jackson County results from the Nov. 6 election that were posted this weekend.
In most races, competitors had wide enough margins that they knew whether they had won or lost on election night.
But the winner of the close Voisin vs. Agee race remained unclear as Jackson County elections workers spent weeks dealing with problem ballots, such as ones that had signatures that didn't match voter registration form signatures.
The two had the most contentious race in this year's Ashland City Council contests, with the controversial Ashland Residents for a Great City Council Political Action Committee running ads against Voisin.
The PAC has operated through several Ashland election cycles, targeting the most liberal council members and endorsing candidates that it says are pragmatic, non-ideological and able to get along with others.
In other Ashland races, final election results show that Councilor Greg Lemhouse and Mayor John Stromberg held their seats.
Rich Rosenthal will take over the seat being vacated by Councilor Russ Silbiger — who didn't seek re-election.
Vanston Shaw won the position held by Ashland Parks and Recreation Commissioner JoAnne Eggers, who didn't seek re-election, and Parks Commissioner Jim Lewis will serve again after no one challenged him.
— Vickie Aldous