Hi Will,
What I do is define a token, then increment the token each time the rule is fired (so indeed a "counter", though Kappa-counters are a different thing...). The token's value is the cumulative number of rule firings, and the time derivative gives you the rule's activity (numpy's diff is useful here). E.g:
%agent: Tik(a, b) %init: 10 Tik()
%token: Tok %init: 0 Tok %obs: Tok |Tok|
Tik(a[./1]), Tik(b[./1]) | 1 Tok @ 1.0
I frequently split my reversible binding rules into the binary binding, unary binding, and unbinding, with tokens for each, and so I can check if rules I consider equivalent have actually comparable activities, and other stuff the static analyzer can't catch.
Cheers,
Héctor