Quick answer: Stealth bugs almost always come down to AI awareness state that the player cannot see. To make a detection report reproducible, capture the enemy alert level, the active vision cones and line of sight checks, the last sound event and its radius, and the player position and stance at the moment of detection. Without that hidden state, a screenshot of a guard turning around tells you nothing.

Stealth is the one genre where the most important information is deliberately hidden from the player. A guard spots you, an alarm trips, and the player swears they were in shadow and dead silent. From their seat that is true, because they cannot see the alert meter ticking up, the vision cone that clipped a corner, or the footstep sound that propagated through a doorway. When a stealth bug report arrives with only a clip of getting caught, you are debugging blind. This post covers the awareness and detection state worth capturing so these reports actually reproduce.

Why stealth bugs are so hard to reproduce

A detection event is the output of several systems agreeing at once: a vision check that traces line of sight through geometry, a light and shadow sample at the player position, a sound budget accumulated from recent footsteps and actions, and an alert state machine that integrates all of it over time. The player only sees the final verdict, caught or clear. Any one of those inputs can misfire, and from the outside every failure looks identical, so a plain video gives you almost nothing to act on.

The other complication is timing. Awareness usually ramps and decays over seconds, so a guard who seems to detect you instantly may actually have been at ninety percent alert from an earlier near miss the player forgot about. Reproducing that requires knowing the alert value as it entered the frame, not just that detection happened. Capturing the awareness curve, not the single moment, is what turns an unrepeatable complaint into a fixable case you can step through.

Capture the awareness and detection state

The core payload for a stealth report is the enemy awareness model. For each nearby agent, record its current alert level as a number, its state machine value such as idle, suspicious, searching, or combat, and the source that last raised it: sight, sound, or scripted trigger. Include the vision check result, whether line of sight to the player succeeded, the angle within the cone, and the distance. If your detection blends light level, capture the sampled brightness at the player too, because a shadow that reads as lit is a common and invisible culprit.

Sound is the other half. Log the last noise event the agent heard, its world position, its loudness, and the propagation radius your system computed, along with the player stance, crouched, walking, or sprinting, and the surface material underfoot. A footstep on metal that carried twice as far as intended explains a detection that looked impossible. With awareness values, vision results, and sound events all attached, you can replay the exact conditions instead of guessing which of three systems lied.

Record the geometry and player position

Detection depends heavily on level geometry, so capture the player world position and rotation, the camera direction, and the specific room or encounter identifier. Many stealth bugs are local to one piece of cover, one doorway whose collision does not match its visual, or one navmesh seam where a guard can see through a wall. Without the coordinates you cannot find the spot, and stealth levels are large enough that a vague description like near the warehouse wastes hours. A position plus an encounter id drops you onto the exact tile.

Pair the position with the relevant guard positions and patrol state so you can see the spatial relationship that produced the catch. A guard that detected the player through a wall is a line of sight or collision bug, while one that saw the player across a gap that should have been blocked by cover points at a hole in your occlusion. The geometry context is what lets you tell a vision system bug from a level art mistake, and the two have completely different owners and fixes.

Separate detection bugs from design complaints

Not every caught moment is a bug. Some are players misunderstanding sightlines or underestimating noise, which is feedback about clarity rather than a defect. The captured state lets you tell them apart instantly. If the awareness data shows a valid line of sight at a reasonable distance, the system worked and the player needs a better readability cue. If detection fired with no line of sight, no recent sound, and a low alert level, you have a genuine bug. Routing these correctly keeps your engineering queue free of design discussions.

This split also protects your tuning. Stealth balance is delicate, and reacting to every frustrated report by widening shadows or quieting footsteps can quietly break the whole fantasy. By grouping reports against their captured detection state you can see whether ten complaints share one broken doorway or whether they are scattered design grumbles. The first deserves a code fix, the second a conversation about telegraphing. Hard data keeps you from sanding down the challenge that makes the genre work in the first place.

Setting it up with Bugnet

With Bugnet you drop an in-game report button into your pause or death overlay, and when a player triggers it after a suspicious detection, the SDK snapshots whatever game state you attach. For a stealth game that means wiring custom fields for nearest agent alert level, agent state, last line of sight result, last sound event and radius, player stance, light sample, and the room or encounter id. The player just taps report and types caught in shadow, while the awareness state that explains the catch rides along automatically, no repro steps required from them.

Once those reports flow into one dashboard, occurrence grouping folds every report of the same impossible detection into a single counted issue, so a doorway that leaks sightlines stands out from one off complaints by sheer volume. You can filter by the captured alert source or by encounter id to see whether a cluster is concentrated at one location, which turns a vague sense that stealth feels off into a ranked list of the specific spots and systems costing you the most caught moments.

Build a stealth reporting habit

Make the report button reflexive at the moment of unfair detection, because that is when the awareness state is still fresh and accurate. Encourage testers to file the instant they feel cheated rather than after reloading, since reloading wipes the alert curve you most want. A short prompt on the death screen, something like did that detection feel wrong, nudges exactly the reports worth having. The goal is to capture the conditions while the systems still hold them, not a reconstruction assembled from memory minutes later.

Over a playtest you will see clusters form: one doorway that leaks sound, one cover piece with a vision gap, one guard whose searching state never decays. Each cluster is a concrete fix rather than a vague sense that stealth feels off. Treat the awareness payload as the spine of your stealth QA and your detection logic gets measurably tighter release over release. Players will never see the alert meters, but they will feel a game where getting caught always makes sense, which is the whole point of the genre.

Detection is hidden state by design. Capture the alert level, line of sight, and last sound and an impossible catch becomes an obvious fix.