Skip to content

1.0.3 Ripping

Julio Toboso edited this page Oct 26, 2026 · 6 revisions

Tags are sticky!

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.

Leaving a Field

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.

Ari after Rip

---
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
Loading

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.

Rogue Agent

Ari is now a Rogue Agent with respect to Fighter: Ari retains contributions from Fighter without belonging to its Field.

Ripping independence

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.

Defining cleanup

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.

Clone this wiki locally