I got a private request for info on what steps we took to complain and get action, but I thought it would be useful to share it with everyone:
We called the regular client services line: we got a good agent who identified the issue (exam results weren't recorded) and sent an internal email. We called back after waiting 2 weeks and got an agent who said that we shouldn't call back for 2 months. We
maybe didn't listen to that last bit of advice.
Contacted our MP:
https://www.ourcommons.ca/parliamentarians/en/constituencies/FindMP (Since it's been a year since our September applications, they can do an inquiry. Our MP retired, but the office is still staffed and they still contacted the CIC. First time we contacted them, they said they needed a week to get a response. When they didn't get a response, they called again and by then we'd moved to Decision Made, but the guy said to call again in two weeks if we don't have an oath date. He also said they can't do much if CIC has decided they want to do extra background checks (not our case), but that if the application has just fallen through the cracks, they can "nudge" the process.). In general, I think this is probably the most effective.
We requested the ATIP records to see if there was anything wrong:
https://atip-aiprp.apps.gc.ca/atip/ (do the Privacy Act request - the free one. They are a bit cryptic, and won't tell you if you've been flagged for terrorism or crimes against humanity (that stuff is redacted, so you won't know) but you can see what is done, and maybe why you are waiting.)
We did a formal complaint:
https://secure.cic.gc.ca/feedback-retroaction/feedback-retroaction-eng.aspx (include as much information as possible - when you applied, when your exam was, last contact with CIC, the name and ID of the person with your file (you can find this in the ATIP request) The more info you have (records of calls, contacts, etc.), the better.
We sent a letter to the Citizenship Officer at the address they give you in the AOR
1) describing the actions described above and 2) politely asking him to work on our application because the normal processing time had expired. It's not a threat, it's all polite, but it shows you are serious and not going away, and that you've already complained about that citizenship officer specifically. They like to say they can't accelerate the process or give special treatment, but the correct response to that is that you are not asking for special treatment: your treatment is already outside the norm, they are failing to meet their own service standards, and you just want the level of service that 80% of applicants are getting.
Finally, we called and emailed the director of the local office. Never got a response to those emails or calls. Unless the response was to finally fix the file and get it moving again.
Obviously, we have no idea which of the foregoing methods worked. And we still don't have an oath date. But we do have a sense that things are finally moving again, and that it's because we were a (polite) pain in the ass for them.