GRIP - EMS (Enhanced Macro Sequencer)

Free macro sequencer for WoW: turn a multi-step rotation into one keybind, with a visual editor, smart context switching, import/export, and player-to-player sharing.
Back to Files

v2.3.17

File nameGRIP-EMS-v2.3.17.zip
Uploader
sirsataanasirsataana
Uploaded
Aug 1, 2026
Downloads
749
Size
2.9 MB
Flavors
Retail
File ID
8557810
Type
R
Release
Supported game versions
  • 12.0.7
  • 12.0.5
  • 12.0.1

What's new

Changelog

Created: 2025 (pre-stamping; exact date unknown) Updated: 2026-08-02 WoW Patch at last update: 12.0.7 Midnight (Retail LIVE)

All notable changes to GRIP - Enhanced Macro Sequencer are documented in this file.

This changelog follows a variant of Keep a Changelog. It tracks the current release and the previous one only. Earlier release notes live in the git history.

[v2.3.17] - 2026-08-02

Changed

  • Variables now run in a restricted environment. A variable's function body used to execute with the whole game environment in reach, which meant it could read and write any other addon's data and any saved setting on your account. It now runs against a fixed list of what a variable legitimately needs: the condition helpers from the Insert Helper button, the standard Lua functions, and the read-only game queries for spells, auras, items, and unit state. Some existing variables may stop returning a value. If one does, it is because it used something outside that list; turn on debug output and the variable name and the exact thing it reached will be named once each. Tell us what you were using and we will look at adding it.
  • The restricted list covers reads only. A variable can ask what your cooldown is, whether you know a spell, how many of an item you carry, whether you are mounted, stealthed, in combat, or in a group. It cannot cast, pick up a spell, send a chat message, run a macro, change a setting, or schedule anything to happen later. Variables answer questions; they do not take actions.

Fixed

  • A sequence marked do-not-share is no longer shared. If the person who wrote a sequence marked it as not for redistribution, that mark now travels with it and is honoured: the sequence will not export to a string, will not go out over player-to-player sharing, and will not be sent if somebody asks for it directly. The export window tells you which sequence was refused and why.
  • The mark is read when a sequence arrives, from either metadata layout, and the import preview shows it before you commit, so you know what you are taking on.
  • Two sharing paths were still sending the author's help text for a marked sequence. A request for sequence details, and the sequence list another player sees when browsing yours, both carried it. A marked sequence is now left out of the browse list entirely rather than listed with the text stripped, and it does not use up one of the fifty slots that list carries.

Internal

  • The variable sandbox reaches nine game queries under a plain name as well as their dotted C_ form. Three of those plain names are gone in this release, because the value coming back was shaped differently from what the plain name has always meant: GetSpellCooldown, GetSpellCharges and GetSpellInfo each hand back a single table, where the old global of that name handed back several separate values. A variable body that read two values off one of them got the table in the first and nothing in the second, silently. All three are still reachable as C_Spell.<name>, which is unambiguous about which one you mean.
  • Correction to the commit that made that change, ce04bed. Its subject line also names a release-parity gate fix. That work is in the Hub tooling repo, not in this one, and none of it is in this release. Two of the reasons in its body are wrong, although the decisions they justify are right. IsSpellUsable is safe because no bare name of its own collides, and the predecessor name given for it is not in the current API surface either, so that is a historical assertion rather than a measured one. IsCurrentSpell is described as boolean before and after, which implies a bare global to compare against; there is none, only C_Spell.IsCurrentSpell. GetItemCount and GetItemCooldown do have live deprecated globals, as stated.

[v2.3.16] - 2026-07-30

Fixed

  • Saving an imported sequence no longer puts your name on it. A sequence in the older signature format upgraded itself the first time you saved, and that upgrade wrote your identity into the original-author field. When the import arrived with no signature at all there was nothing to upgrade, but the upgrade ran regardless: it bound your byline to someone else's sequence and then signed it as yours. An unsigned import stays unsigned now. Both the main editor and the popup editor were affected.
  • An imported sequence that arrived without a provenance field used to show the amber "Damaged" badge. All three import paths defaulted that field to a value the verifier does not recognise, so a third-party sequence carrying no provenance was reported as corrupt rather than simply unsigned. It reads "Provenance unknown" now, which is what it is.

Added

  • The provenance badge on an imported sequence says what it means. Hover it and the verification state is spelled out in a sentence, for all six states: Verified, Modified, Tampered, Damaged, Forked, and Provenance unknown. That text shipped translated in every locale and had never once been displayed.
  • A sequence with no recorded author used to print "Provenance unknown" three times in the same tooltip. It prints once.

Internal

  • A test fixture credited the wrong author. Corrected, and the packager ignores the file that carries the attribution note.
  • Line-number citations in the malformed-entry guards test re-pinned against the files they name, and the citation sweep's target set no longer leaves fall-through cases unchecked.
  • Two files joined the CI-enforced test set: one proving the signature upgrade refuses an unsigned import, one proving every verdict badge resolves to a real translated string.

[v2.3.15] - 2026-07-29

Added

  • A Forge export can now carry a native GRIP-EMS sequence inside its envelope, and EMS reads it directly; the import preview labels the source.
  • A conditional action with no condition set warns at compile time instead of silently doing nothing.

Fixed

  • Broken sequence data no longer takes the addon down. A sequence whose versions or steps field holds a number, a word of text, or true instead of a list (a bad import, a hand-edited SavedVariables file, an export from a buggy tool) used to raise a Lua error in whatever read it first: the import preview, the importer, the exporter, the repair scan at login, or a template copy. Every one of those paths now reports the broken entry and carries on.
  • The repair analyzer gained thirteen guards of its own, and applying its "Empty steps array" fix to a corrupt sequence works instead of raising.
  • Variable import rejects non-text names and function bodies instead of storing them.

Internal

  • The stored-shape guard families for versions and steps are censused and behaviourally proven across the import, engine, and repair paths; the in-game test suite (/gems test) grew the fixtures that prove each guard live.
  • Every line-number citation in the malformed-entry test file was audited against the file it names: 21 stale pointers re-pinned by reading, and the twelve-target citation sweep passes clean.
  • The CVar registry header comment in Data/Defaults.lua reads the live census: 254 entries across 14 sections.

This mod has no additional files