Built a Failed Action / Patch History dashboard using AI — code included

Hey all,

One thing that's always been a challenge with BigFix is that every customer defines "mean time to remediation" differently — some measure it from content release to patch complete, others from when the endpoint noticed the patch to patch complete. The data to answer either question is already sitting in the BigFix database, but getting it into a report that's actually useful for management has historically meant either learning BIRT/HTML reporting yourself or finding someone who already knows it.

I'm not a developer and don't write HTML, so I used Claude (Anthropic's AI) to build a Failed Action History dashboard on top of BigFix Web Reports. It took about 30 minutes. The dashboard:

  • Surfaces failed actions across both baselines and ad hoc actions
  • Translates exit codes into plain-English explanations (with suggested fixes)
  • Separates genuine failures from pending restarts and resolved issues, so you're not chasing false positives
  • Lets you filter by OS, device type, and patch, and drill into any endpoint with a click
  • Exports to CSV/PDF

BigFix is the delivery mechanism — it doesn't write the patches, but it delivers them efficiently, and this dashboard is meant to show exactly where that delivery is succeeding or breaking down.

I wrote up the full walkthrough and included the relevance queries and code here: BigFix - Failed Action History Report

Feel free to use it as-is or tweak it for your environment. Curious if others have built similar reports and what approach you took — always looking to improve this.

Also, if you're interested in this kind of thing, BigFix Masters Class (Americas) is October 13–15, 2026: Register Now BigFix Master Class for Americas - October 13-15 2026!

11 Likes

I like it and I reviewed the source before putting it in. But I did receive an error.

Is there any kind of debugging to help find the source of the error?

Error: Singular expression refers to nonexistent object.

I did run this in the presentation debugger and did not receive an error.

(name of computer of it & " | " & name of action of it & " | " & (id of action of it as string) & " | " & (exit code of it as string) & " | " & (start time of it as string)) of results whose (exit code of it != 0) of bes actions

I then ran the BES Computer remover to remove duplicate and deleted computers, but we leave 7 days of data in there. The report ran for about five seconds with "Querying BigFix Action History" before producing the error again. This tells me that the most likely cause is it is querying a computer that has been deleted but not flushed from the DB yet. Still trying to figure out how to resolve the issue.

I would suggest adding guard every field if exists … then … else "N/A" instead of a bare singular, this should resolve the issue.

//Example:
((if exists computer of it then name of computer of it else "N/A") & " | " & (if exists action of it then name of action of it else "N/A") & " | " & (if exists action of it then (id of action of it as string) else "N/A") & " | " & (if exists exit code of it then (exit code of it as string) else "N/A") & " | " & (if exists start time of it then (start time of it as string) else "N/A")) of results whose (exists exit code of it and exit code of it != 0) of bes actions

I saw the same issue @D.Dean when trying this code in our environment. I have not had a chance to chase through the relevance yet though.

my suggestion would be to use an LLM and ask it this BigFix web reports code works in another environment but not in mine. Help me fix it and why its not working with my environment. The purpose of this was the art of possibilities and tweaking the code to fit your organizations needs.

My test indicates that it is pulling computers that have been deleted but not flushed from the database yet.

I have not had time to look at it but there are only three relevance statements in the entire source code so, as @vk.khurava said, guards for missing systems need to be put in place. I will report back when I get a chance to look at it.

Ok, for me it was line 348, apparently not all our systems have an operating system

I changed it to this...

var rel3='(name of it & " | " & (if exists operating system of it then operating system of it else "Unknown")) of bes computers';
1 Like