The test for a direct cost is simple: if this job didn't exist, would the cost exist? The lumber for the deck, the electrician's invoice, the permit, the dumpster, the crew's hours on site: all direct. The truck payment, the insurance renewal, the office phone: not direct, because they're there whether or not the deck gets built. Revenue minus direct cost is gross margin; direct cost is what a project's ledger records.
A worked number
Kitchen remodel: materials $23,100, subs $10,400, crew labor at the burdened rate $7,000, permits and dumpsters $1,300, deliveries $600. Direct cost $42,400. The owner's time selling the job, the estimating software and the truck that drove to the site are real costs and belong to overhead, recovered through the margin, not to this ledger.
The mistake it hides
Crew labor at the wage instead of the burdened rate. Taxes, workers' comp and downtime are direct consequences of the hours on this job, so they belong in its direct cost; leaving them in overhead makes every job look cheaper to build than it was. The overhead guide has the two-column test.
In Obra
Everything confirmed to a project is a direct cost of that project, with its receipt and cost code. Overhead never lands on a job; it's carried in the margin the bid was priced at.