Skip to main content
DoneThat

AI Adoption GuideConstructionMobilize

Deployed Workforce Skills Gap Analysis

LLM compares deployed crew competencies against the project skill demand matrix and flags coverage gaps.

Construction processBidAwardPlanMobilizeBuildInspectHandoverClose

By Don, DoneThat’s AI coach · updated

A coverage gap is a cited mismatch, not a staffing decision

A coverage gap is a skill the project demand matrix requires for a named work window that no deployed crew record currently satisfies. The output is the gap plus two cites: the matrix row you measured against, and the crew record you searched. If the ticket field is missing, the cell stays empty. The model does not invent a competency. The list is not a hire, layoff, or subcontractor-drop decision.

Site HR and the superintendent run this during mobilize, after people are named to the job and before the package is allowed to start. You already know who is supposed to be on site. You need to know whether those named people, on the records you actually have, cover the skills the work requires.

Ticket files themselves are a separate check. Pair this compare with worker competency document verification so a cited ticket is a real document, not a line in a spreadsheet.

Pull only the demand matrix and the deployed roster

Use two sources.

The skill demand matrix is the project's required competencies by work package, trade, and window. Each row should name the skill, the qualifying evidence (ticket class, license, or owner-approved equivalent), how many people must hold it at the same time, and the dates it applies. If the matrix does not list a skill, do not add one from trade custom.

The deployed roster is the people assigned to this site in this window: name, trade, employer, badge or crew ID, and competency records already on file. Those records often sit next to workforce and document modules in project platforms such as Procore or Autodesk. Treat those systems as places where crew and ticket data may live. Do not treat a platform export as a scored gap list unless your process produced that score from the two sources above.

Keep the bid roster out of the compare. A person named in the bid who never badged onto this site is not coverage for this mobilize window.

When a subcontractor's packet is incomplete, chase the packet. Do not fill the skill cell. Route missing paperwork through subcontractor compliance chasing agent instead of completing the matrix from memory.

Match each required skill to a named person on the deployed crew

Work the matrix row by row. For each required skill, search the deployed crew for people whose records cite that skill with evidence that is current for the work window.

Match on the skill as the matrix writes it, the ticket class it asks for, and the validity dates. A related trade is not a substitute unless the matrix names the substitute. "Ironworker" does not satisfy "structural welding ticket, current through deck pour week" unless the crew record shows that ticket.

Count only current, qualifying records. Then compare the count to the number the matrix requires for that window.

Here is one pass on a structural steel package at Monday mobilize. The matrix requires two people with current structural welding tickets during deck pour week, and one person with a current crane-signal qualification during the pick window. The deployed crew file lists twelve ironworkers. Eight files include a welding ticket. Two of those tickets expired last month. One file has a supervisor note that the person "usually welds," with no ticket number and no expiry. Every crane-signal field on the roster is blank.

Read that pass this way. Welding: cite the matrix row (two current structural welding tickets, deck pour week). Cite each crew record you counted as current, and cite the two you excluded because the expiry date falls before the window. If the remaining current count is below two, flag a welding coverage gap. The "usually welds" note is not a competency. Leave that person out of the welding count. Crane-signal: cite the matrix row (one current qualification, pick window). Cite that the deployed roster was searched and no current qualification was present. Flag a crane-signal gap. Do not invent a signal person so the cell looks complete.

Three mistakes turn this into a bad quality record. Counting the expired welding tickets as current coverage. Inventing a welder ticket number, or writing that it will be in hand by Monday, so the welding cell is no longer empty. Using the crane-signal gap, or the expired tickets, as an automatic layoff, a dropped sub, or a hire requisition. The flag is the mismatch plus cites. Staffing actions stay with the superintendent and site HR.

Flag with both cites, or leave the cell empty

Every gap line should carry the same structure.

Matrix cite: work package, skill name, qualifying evidence, headcount required, and the date window.

Crew cite: which roster you used (this site, this window), which person records you opened, what each record showed (ticket class, number if present, issue and expiry dates), and which records you excluded and why.

If a ticket field is empty, output empty. Do not write "assumed current," "typical for this trade," or a guessed ticket class. If the expiry date is missing, you cannot treat the ticket as current for the window. Flag that as a gap in evidence, not as a present competency.

Empty is the correct quality outcome when the source is empty. Inventing a competency so the matrix looks covered is the failure. Downstream planning should see the same empty: a skills gap is a start constraint, the same way a missing inspection is. Fold confirmed gaps into lookahead constraint scan so the package is not marked ready while coverage is still unproven.

Keep expired tickets, invented tickets, and layoff lists out of the result

Date-check every ticket against the work window. An expired welding ticket is not coverage for deck pour week, even if the person welded on the last job and the file still shows the old number. If the window starts after expiry, exclude that record from the current count and say so in the crew cite.

Do not complete a blank welding cell. A missing ticket stays missing. Completing it with a plausible number, a nickname for a cert, or a promise of recertification treats a hope as a record. Recertification can be the operational next step. It is not a competency until the new ticket is on the crew record and the compare is run again.

Do not feed the gap list into an automatic layoff or hire workflow. A gap means this deployed crew, against this matrix, in this window, does not show coverage on the records you have. It does not mean the person with the expired ticket is unfit for every task, that the subcontractor is noncompliant in every respect, or that you must add headcount. Someone working a task their record does not support is also a safety problem, which is why you keep this compare next to real-time safety hazard detection rather than treating it as a ranking of people.

Use the list as a mobilize constraint log

Confirm the cites before you act. If a ticket exists in a folder the compare did not see, add it to the crew record and run the match again. If the ticket is missing or expired, choose the response in the room: recertify before the window, reassign from another deployed crew that does hold a current ticket, change the sequence so the package waits, or hold the start. Those are superintendent and site HR calls.

Do not publish the gap list as a staffing score. Do not sort people from most gaps to least gaps as if that were performance. The quality bar is narrower: every gap cites the demand matrix and the crew record you checked, and every missing ticket stays empty.

Is this worth automating for you?

Whether this pays back depends on how much time it takes your team today. Most teams estimate that from memory, and the estimate is usually wrong in one direction or the other.

DoneThat reconstructs where the time actually went, with no timers to forget, so you can measure the baseline before committing to a project and check the gain afterward.

Measure the baseline first