Expand description
Artifacts — collection handlers, acquisition, and the two Aspect rules that do not ride on a trigger fire.
Three of the six Aspect rules hang off a trigger and live in
crate::logic::stones («Нарастание», «Первый удар», «Фоновый голос»); the
remaining three hang off the fight’s own moments and live here: «Теневой
круг» on the heartbeat, «Входящий залп» and «Поочерёдный вход» on the flip.
§Provenance
Every effect fired from this module goes through
[crate::logic::stones::OverlordLogic::run_stone_effect], whose combat
output is built CombatEventOrigin::Proc and whose bookkeeping output
(EntityIncrAttribute) carries no provenance at all and is not trigger
surface. Nothing here builds a combat event itself. That is what keeps the
artifact from closing the loop the Core/Proc boundary exists to prevent: an
artifact rebroadcasts effects, and a rebroadcast effect can never fire the
trigger that would rebroadcast it again.
The second loop guard is that an artifact-driven fire never feeds the
flip gauge: run_stone_effect’s gauge return value is deliberately dropped
at every call site in this module. Without it, «Входящий залп» could fill the
gauge, flip, and volley again — the one cascade that is not covered by the
Core/Proc boundary, because a flip is a state transition rather than a combat
event and carries no provenance to inherit.
The third guard is artifact.flip.rev: one flip runs at most one volley
even if GlobalFlip reaches the hook more than once.