I spoke with the client. The job was set up properly to track costs at the phase/category level, but the WIP and Cost of Sales accounts at the category level were both pointing to the WIP account. So when the job was closed, the debit and credit went to the same account.
I explained that the Cost of Sales account is where the debit goes (by category) when the job is closed.
They had improperly set up the Revenue Recognition method of the job as Billings and Costs instead of Completed Contract, but since they never used the Recognize Revenue and Expense function, the net effect was that the job was essentially set up as a Completed Contract job. So there was no harm done by this mistake.
Steve