Repository navigation
1.0.3 Ripping
Ripping a Tag ends an Agent’s membership in that Tag’s Field. By default, the Records and Actions acquired from it remain on the Agent. In other words, gains remain after ripping. TAGS ARE STICKY!
Think of leaving an organisation, like the police: membership ends, but the former agent still knows what they learned there. A retired cop can still remember its cases, or recall their deductive skills, even if they lose access to files or equipment. Any cleanup must account for what should be retained, removed or changed. This makes every agent auditable even after leaving the agency.
Continuing with Ari from the previous page:
del Fighter[ari]
#-- Rip: leave Fighter's Field
assert ari not in Fighter
#-- membership has ended
assert ari in Elf
#-- other memberships remain
assert isinstance(ari, Fighter)
#-- Ari is auditable, she belonged to Fighter
assert ari.Attack() == "Ari cuts with a blade."
#-- TAGS ARE STICKY!!!!The last assertion is the important one. Fighter’s Attack is still present and still supplies Ari’s visible Action.
Ripping Fighter does not automatically restore Elf’s version of Attack. TOP calls these retained contributions sticky.
---
title: Ari
---
swimlane-beta TD
subgraph Overlay["Overlay"]
fighter_attack("Fighter Attack")
languages_ol["Elf Languages"]
nm["Character Name"]
lvl["Character Level"]
end
subgraph Elf
elf_attack("Attack")
languages["Languages: Elven, Sylvan, Common"]
end
subgraph Character
name["name: Ari"]
level["level: 3"]
end
fighter_attack <===x elf_attack
languages_ol <===o languages
nm <===o name
lvl <===o level
fighter_attack <-.-o nm
elf_attack <-.-o nm
The additional Overlay layer helps visualizing the active elements.
The connections remains: Fighter’s Attack still overlays Elf’s. The references to name continue to work.
Ari is now a Rogue Agent with respect to Fighter: Ari retains contributions from Fighter without belonging to its Field.
Ripping This does not end Ari’s other memberships. Elf remains active, and its view is still available:
assert Elf[ari].Attack() == "Ari attacks with elven grace."Fighter’s own Agent-bound view is no longer available. Access through Fighter[ari] requires Ari to belong to Fighter.
These access paths therefore answer different questions:
-
ari.Attack()— use the Action currently visible on Ari, including a retained Action. -
Elf[ari].Attack()— use the composition selected by Ari’s active Elf view. -
Fighter[ari]— request a Fighter view, which is refused after that membership ends.
Keeping an acquired Action does not preserve access through the departed membership to the Tag’s shared Reports and Operations.
A Tag can declare a cleanup protocol with @Rip. This runs after the membership has ended and can release resources or change what remains on the Agent.
The Fighter in this example declares no cleanup, so its Attack stays available. A Tag that needs different behavior must declare that cleanup explicitly.
Ripping also preserves history: isinstance(ari, Fighter) remains true.
Applying Fighter(ari) again begins a fresh Tagging; it is a new application of a Tag Ari has carried before.