Record EVERY property that changes on an Instance over a window (event-driven)
watch-property-changesConnects an Instance's Changed signal for a set duration to record every property that changes, revealing which properties a Roblox action mutates.
Instructions
Connects an Instance's Changed signal for a bounded window and records EVERY property that changes (its name plus the new value), then disconnects and returns the log. This is the discovery counterpart to watch-instance-property (inspection), which polls a SINGLE named property you already know: use watch-property-changes when you DON'T know which property to watch and want to see everything that moves — e.g. perform an action in-game and learn which of an Instance's properties the game actually mutates, or catch a property you didn't expect to change. It uses a signal CONNECTION (Instance.Changed), not a function hook, so it is low-risk; the connection is always disconnected at the end of the window. HOW IT WORKS: resolves the Instance, connects inst.Changed (which fires with the changed property NAME for plain Instances), and for each fire pcall-reads inst[prop] and appends { property, newValue, t }; then task.wait(s) for the duration and disconnects. The call BLOCKS for roughly durationMs while listening — perform the triggering action (click/move/etc.) shortly before or during the watch. NOTE: on some objects the Changed signal carries a Property-value-changed payload rather than a name (e.g. ValueBase objects fire with the value); this tool records the raw signal argument as the property identifier in that case. Returns { Path, ClassName, durationMs, changeCount, changes = [{ property, newValue, t }], truncated } or { error }. Signature: { instancePath: string, durationMs: any?, limit: any?, threadContext: number? }. Phase: observe; cost=medium; idempotency=read-only. Requires: active-client, resolved-target. Produces: bounded-event-snapshot. Safety: read-only. On failure: inspect tool-schema for exact fields, defaults, constraints, and an invocation example.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of change records to keep (default 500, max 2000). When more changes fire than this cap, the extra ones are dropped and `truncated` is set true. | |
| durationMs | No | How long to listen, in milliseconds (default 4000, min 100, max 30000). The tool BLOCKS for about this long; trigger the change you want to observe shortly before or during this window. | |
| instancePath | Yes | Luau expression resolving to the Instance to watch, e.g. 'game.Players.LocalPlayer.Character.Humanoid', 'game.Workspace.Part', or 'game.Players.LocalPlayer.PlayerGui.HUD.Frame'. Evaluated as `return <instancePath>` and must resolve to an Instance. | |
| threadContext | No | Optional Roblox thread identity for this call; omit it to use the server default. |