The Firefly protocol is a snoopy coherence protocol developed at DEC's Systems Research Center (1987), contemporary with Dragon and sharing its central idea: updates instead of invalidations. When a core writes to a line other caches also hold, Firefly broadcasts the new value on the bus so sharers can refresh their copy in place, rather than forcing them to invalidate and later reload.
Firefly's main departure from Dragon is in how a cache discovers whether a line is shared at all. Instead of relying purely on the bus snoop response to a read request, Firefly-style designs add a dedicated shared line (a single extra wire on the bus) that any cache holding a copy asserts when it sees a read request for that address. A core loading a line can then tell, in the same cycle as the load completes, whether the line is exclusive to it or shared with others, without needing a separate protocol exchange to find out.
read request on bus -> any sharer asserts the shared-signal wire -> requester loads as Shared if wire asserted, Exclusive-like otherwise
Knowing exclusivity at load time removes the ambiguity that update-based protocols otherwise have to resolve on the first write: if the requester already knows a line came in as sole owner, an early write can skip broadcasting an update it doesn't need to send to anyone. This is essentially the same problem MESI solves for invalidate-based protocols with its Exclusive state, applied instead to an update-based protocol. In practice, Firefly and Dragon are usually presented side by side in the literature as the two canonical update-based protocols, differing mainly in this detection mechanism rather than in overall philosophy.