AlifePlus SISKI Synergy (APS): Technical Analysis

Damian Sirbu, xlibs and AlifePlus developer · 2026-04-05, updated 2026-04-15 · Subject: APS by forTheMonolith

ModDB (original, taken down): AlifePlus SISKI Synergy v2.7.0
ModDB (re-uploaded): AlifePlus SISKI Synergy v2.7.0

Status: Removed from ModDB on 2026-04-19. The author did not appeal. The mod remains down. See the SISKI report for the full dispute timeline.

Overview

The "synergy" framing is a cover for systematic copying. APS is marketed as a bridge between AlifePlus and SISKI. In practice, it copies AlifePlus's internal architecture, conventions, terminology, personality system, and feature designs — iteration by iteration, feeding AP's development documents (architecture.md, conventions.md, manifesto.md) to an AI code generator to produce each new version. The patterns APS uses exist nowhere else in the entire STALKER modding ecosystem. This is not integration — it is cloning.

"AlifePlus SISKI Synergy" (APS) v2.7.0 appeared on ModDB on April 4, 2026. 28 scripts, 6,112 lines of Lua. It depends on xlibs, AlifePlus, and SISKI 0.9.5 (which is under a DMCA takedown). Uploaded by forTheMonolith. The code is AI-generated, uses AlifePlus's internal architecture as its blueprint, and hard-depends on SISKI — a mod whose core infrastructure (event bus, AP bridge, callback factory) was stolen from AlifePlus and xlibs.

After this report was published, forTheMonolith publicly stated he would take the mod down within 24 hours. Instead, he created a new ModDB page and re-uploaded APS as v2.8.4 with cosmetic changes: a CREDITS.md, a LICENSE file (copied from AlifePlus's PolyForm Perimeter license), and some API cleanup. The architecture copying, internal API usage, and SISKI dependency remain unchanged. With each new AP release, APS updates to match — tracking AP's internal changes as they happen.

FindingEvidenceSection
AI-generated code67 pcall wraps, hallucinated items, empty loops, mechanical uniformity in 28/28 files
Internal conventions copiedNaming, handler structure, config keys, registration loops — all from conventions.md
Architecture unique to APobserve/result_squads/find_squads_observed/chase_register: zero results in ~2000 GAMMA scripts outside AP. APS is the only mod that uses them.
70+ undocumented API callsTracing, state manager, chase system, pipeline internals — vs ~8 documented
Design language copied"YANS" term, "radiant"/"reactive" vocabulary, "emergent" philosophy — all from AP docs
Personality values clonedAPS faction bias table tracks AP's values within 0.1 across all 12 factions
Promise then re-uploadforTheMonolith publicly stated "I'm taking the mod down in 24 hours", then created a new ModDB page
Fatal crash on first testtostring(vector) at line 182 — crashes AP's pipeline for all users
Depends on DMCA'd codeRequires SISKI 0.9.5, which is under active DMCA takedown
License requirements brokenv2.7.0: no LICENSE file. v2.8.4: copied AlifePlus's PolyForm Perimeter license verbatim, still depends on stolen SISKI code

v2.8.4: Promise and Re-upload

After this report was shared (including on the GAMMA Discord, ~700k members), forTheMonolith posted the following on the original APS ModDB page:

"Look, I'll be straight with you. There's a technical report out about this mod that's making it more trouble than it's worth. I'm not going to sit here and argue point by point or get into a back and forth with anyone. I made this in my own time, for free, because I love this game and I wanted other people to have a good time in the Zone. That's the entire story. There was no agenda, no money involved, no intention to upset anyone or take credit for anyone else's work. Just a guy wanting to share something with the community. I'm taking the mod down in 24 hours."

Instead of taking the mod down, forTheMonolith created a new ModDB page and re-uploaded APS as v2.8.4 with the following changes:

ChangeDetail
Added CREDITS.mdCredits xlibs and AlifePlus by Damian Sirbu with license and ModDB links. Credits SISKI by qkff99.
Added LICENSE filePolyForm Perimeter 1.0.0 — the same license used by AlifePlus and xlibs, copied verbatim. Copyright "2026 forTheMonolith".
Concept inspirationsCredits Mugging Squads, Dynamic Faction Relations, Nocturnal Mutants, ZCP. Does not credit AlifePlus's alpha/elite system for the boss system.
AI disclosure"APS is developed with AI assistance (Claude by Anthropic) under author direction."

What did not change:

  • Architecture copying: same consequence template (observe -> rules -> eval -> action -> PDA -> result_squads)
  • Internal API usage: still calls ~15 undocumented AP-internal functions
  • AP terminology: still uses "radiant", "reactive", "cause predicate", "personality-driven" in code and comments
  • SISKI dependency: still requires SISKI 0.9.5+ (which contains stolen xbus/bridge/factory code)
  • Personality values: faction bias table still tracks AP's PERSONALITY values within 0.1

The "concept inspirations" section in CREDITS.md states: "The implementations in APS are not ports or reimplementations of these mods' code, but the ideas came from them." This is contradicted by the evidence in sections 4, 5, and 6 below, which show that APS reproduces AlifePlus's internal architecture, not just its ideas.

The Mod

FieldValue
AuthorforTheMonolith (ModDB)
UploadedApril 4, 2026
Size73.51 KB (28 scripts + 2 XML)
Lines6,112
License on ModDB"Proprietary"
License file in modNone
Git repositoryNone (zip upload)
Dependenciesxlibs 1.2.3+, AlifePlus 1.2.2+, SISKI 0.9.5+
Credits in ModDB description"AlifePlus and xlibs by Damian Sirbu, SISKI by qkff99"
Credits file in modNone

Authorship Indicators

The mod's code exhibits numerous characteristics consistent with AI-generated output. The evidence falls into several categories.

Author's own statement

"The more logs file I can get what the more behaviour I can learn and train into the mod."

This describes an iterative process: code generation tool produces output, users test and report crashes, crash logs are fed back to generate fixes. The first real user to install the mod got a fatal engine crash (below), confirming zero pre-upload testing.

Mechanical uniformity

Every file follows the exact same template, without any of the natural variation that appears in hand-written code:

PatternCountNote
-- ===...=== section dividers28/28 filesIdentical formatting, identical spacing, identical separator length
Footer: if printf then printf('[APS] X loaded') end28/28 filesEvery file ends with this exact line. printf is always defined in Anomaly.
Header doc comment block (---)28/28 filesEvery file opens with a multi-line doc comment explaining what it does
Comments + annotations842 + 113842 comment lines + 113 @param/@return annotations in 6,112 total lines (13.8% comments, 1.8% annotations). Human STALKER mods have near-zero annotations.

Defensive coding and pcall misuse

67 pcall wraps in 6,112 lines. Wrapping calls in pcall hides the problem instead of fixing it. Two categories:

What's wrappedExists?Can pcall catch it?What actually happens
:commander_id()Yes (C++/luabind)NoEngine terminates on fault. pcall does nothing.
:distance_to()Yes (C++/luabind)NoEngine terminates on fault. pcall does nothing.
alife_create_itemYes (C++/luabind)NoEngine terminates on fault. pcall does nothing.
ap_alife_tracker.script_squadYes (AP internal)Yes, but hides real bugsSilently swallows errors in AP's state manager.
alife_create_item("outfit_exo_1")No — hallucinatedItem doesn't exist. pcall hides the failure.
alife_create_item("wpn_sig550")No — hallucinatedItem doesn't exist. pcall hides the failure.
alife_create_item("wpn_fn2000")No — hallucinatedItem doesn't exist. pcall hides the failure.
alife_create_item("wpn_gauss")Not spawnable (dialog only)Fails silently or crashes.
alife_create_item("wpn_pkm")Not spawnable (dialog only)Fails silently or crashes.
+ 14 more C++/luabind callsYesNoSame pattern — false safety.
+ ~30 Lua-side callsYesYes, but unnecessaryGuards on code that cannot fail.

The generator doesn't know the X-Ray runtime boundary: pcall cannot catch C++/luabind faults because the engine terminates the process before Lua sees the error. And for hallucinated items, pcall just hides the fact that the feature doesn't work. For comparison, SISKI has 488 pcalls at 1/59 lines.

Other indicators: 74 tostring() wraps including one on an X-Ray vector that caused the fatal crash, 125 nil-guards on values guaranteed by the code's own logic, 170 log statements (1 per 36 lines vs AlifePlus's 1 per 120), and two empty for loops that iterate over results but execute no code (vestigial from an earlier generation pass).

RPG template systems

Several gameplay systems follow textbook AI RPG design patterns with no STALKER-specific grounding:

  • 4-trait personality system (aggression, greed, caution, loyalty) with faction bias tables and random variation -- a standard AI fantasy RPG pattern
  • 3-tier boss system (Lieutenant/Captain/Warlord) with nickname pools ("Razor", "Butcher", "Ghost", "Shadow"), gear injection, rank boost -- classic AI game design template
  • Wealth scoring formula (outfit_tier * weight + artefact_count * weight + money / divisor) -- textbook numeric scoring that looks reasonable but has never been tested against actual game balance
  • Passive tension generation between 30 hardcoded faction pairs -- the AI generated a complete faction conflict matrix without understanding which factions actually interact in-game

Fabricated version number

"v2.7.0" implies a long development history with 2 major versions and 7 minor releases, but no git repository exists and no prior versions appear on ModDB. The first user to install the mod got a fatal crash on basic gameplay, which means no version with this code could have been tested or iterated on.

ModDB readme

The ModDB description is approximately 5,500 words in English + 2,000 words in Russian. The section structure mirrors AlifePlus's own ModDB description: "How it works step by step:", numbered bullets, "What makes it realistic:", "PDA notifications:", "What you experience:". The AlifePlus readme was provided to the code generation tool alongside the source, and the AI reproduced the same organizational template for a different mod. Both language versions are semantically identical -- consistent with generation from a single source followed by machine translation.

Framework Pattern Matching

AlifePlus has internal conventions for how causes and consequences are structured. These are documented in architecture.md and conventions.md -- development documents, not a public API specification. APS follows these conventions exactly:

4a. Naming conventions -- every layer matches

In plain English: AlifePlus has a naming system for its files, events, and settings — not published anywhere as a standard. APS uses the exact same scheme, just swapping in different words. The structure, separators, prefixes, and suffixes are character-for-character identical.

WhatAlifePlus patternAPS (identical pattern)
Cause fileap_cause_stash.scriptaps_cause_wealthy.script
Consequence fileap_consequence_stash_ambush.scriptaps_consequence_wealthy_ambush.script
Cause event name"cause:stash""cause:wealthy"
Consequence event name"consequence:stash_ambush""consequence:wealthy_ambush"
MCM enabled keycause_stash_enabledcause_wealthy_enabled
MCM chance keyconsequence_stash_ambush_chanceconsequence_wealthy_rob_chance
MCM PDA keyconsequence_stash_ambush_pda_chanceconsequence_wealthy_rob_pda_chance
PDA message key"text_pda_consequence_stash_ambush""text_pda_consequence_wealthy_rob"
PDA lost message"text_pda_consequence_squadkill_revenge_lost""text_pda_consequence_wealthy_rob_lost"
PDA found message"text_pda_consequence_squadkill_revenge_found""text_pda_consequence_wealthy_rob_found"
Chase handler key"revenge_chase""wealthy_rob_chase"
MCM config prefixxmcm.create_config("ap", ...)xmcm.create_config("aps", ...)
Save data keym_data.ap_tensionm_data.aps_tension

Every row follows the same template with only the bold word substituted. This pattern is documented in AlifePlus's internal conventions.md -- a development document, not a public specification.

4b. Handler structure -- the skeleton is identical

In plain English: Every AlifePlus consequence handler follows the same structure: extract the trace, wrap in observe(), check gates in a fixed order, find targets, move squads, send PDA, return a result code. APS handlers follow the exact same structure in the exact same order. Below is real code from both — the only difference is the consequence name.

AlifePlus: ap_consequence_stash_ambush.script
local function _handler(event_data)
    local trace = event_data._trace
    return ap_debug.observe(trace,
      CONSEQUENCE.STASH_AMBUSH, function()

        -- GATE 1: MCM enabled?
        if not cfg.consequence_stash_ambush_enabled
          then return { code = RESULT.DISABLED_NEXT }
        end

        -- GATE 2: chance roll
        if not xmath.chance(cfg
          .consequence_stash_ambush_chance)
          then return { code = RESULT.CHANCE_NEXT }
        end

        -- GATE 3: data validation
        if not position then
          return { code = RESULT.RULES_NEXT }
        end

        -- FIND: squads near position
        local ambushers =
          ap_utils.find_squads_observed(trace,
            position, opts)

        -- MOVE: script squads to smart
        ap_debug.observe(trace,
          ACTION.MOVE_SQUAD, function()
            for _, sq in ipairs(ambushers) do
              ap_alife_tracker.script_squad(
                sq, smart, { rush = cfg
                  .consequence_stash_ambush_rush })
        end end)

        -- PDA: send message
        ap_debug.observe(trace,
          ACTION.SEND_PDA, function()
            ap_utils.send_pda(cfg
              .consequence_stash_ambush_pda_chance,
              "text_pda_consequence_stash_ambush",
              { location = location })
        end)

        -- RESULT
        return ap_debug.result_squads(moved, {
            code = RESULT.OK_STOP,
            dst_id = smart.id,
        })
    end)
end
APS: aps_consequence_wealthy_ambush.script
local function _handler(event_data)
    local trace = event_data._trace
    return ap_debug.observe(trace,
      CONSEQUENCE.WEALTHY_AMBUSH, function()

        -- GATE 1: MCM enabled?
        if not cfg.consequence_wealthy_ambush_enabled
          then return { code = RESULT.DISABLED_NEXT }
        end

        -- GATE 2: chance roll
        if not xmath.chance(
          aps_difficulty.adjust_chance(cfg
            .consequence_wealthy_ambush_chance,
            "ambush"))
          then return { code = RESULT.CHANCE_NEXT }
        end

        -- GATE 3: data validation
        if not position then
          return { code = RESULT.RULES_NEXT }
        end

        -- FIND: squads near position
        local ambushers =
          ap_utils.find_squads_observed(trace,
            ambush_smart.position, opts)

        -- MOVE: script squads to smart
        ap_debug.observe(trace,
          ACTION.MOVE_SQUAD, function()
            for _, ambusher in ipairs(ambushers) do
              ap_alife_tracker.script_squad(
                ambusher, ambush_smart, { rush = cfg
                  .consequence_wealthy_ambush_rush })
        end end)

        -- PDA: send message
        ap_debug.observe(trace,
          ACTION.SEND_PDA, function()
            ap_utils.send_pda(cfg
              .consequence_wealthy_ambush_pda_chance,
              "text_pda_consequence_wealthy_ambush",
              { location = location })
        end)

        -- RESULT
        return ap_debug.result_squads(moved, {
            code = RESULT.OK_NEXT,
            dst_id = ambush_smart.id,
        })
    end)
end

Line by line: same function signature, same trace extraction, same observe() wrapper, same gate order (enabled -> chance -> validation), same find_squads_observed(), same nested observe(ACTION.MOVE_SQUAD), same script_squad() call with same rush config key, same nested observe(ACTION.SEND_PDA), same send_pda() call with same key pattern, same result_squads() return. The only differences are the consequence name and the addition of aps_difficulty.adjust_chance().

4c. Cause registration -- identical loop

AlifePlus: ap_cause_stash.script :on_game_start
function on_game_start()
    local radiant = ap_const.RADIANT_CALLBACKS
    for i = 1, #radiant do
        ap_producer_reactive.register(
            CAUSE.STASH,
            { callback = radiant[i] },
            _on_smart
        )
    end
    ap_debug.info("[CAUSE.STASH] Initialized")
end
APS: aps_cause_wealthy.script :248-280
function on_game_start()
    cfg = aps_mcm.cfg
    for i = 1, #ap_const.RADIANT_CALLBACKS do
        ap_producer_reactive.register(
            CAUSE.WEALTHY,
            { callback =
              ap_const.RADIANT_CALLBACKS[i],
              priority = 80 },
            _on_radiant
        )
    end
    _aps_log.info("[CAUSE.WEALTHY] Initialized")
end

4d. Consequence registration -- identical call

AlifePlus: ap_consequence_stash_ambush.script
ap_consumer.register(
    CONSEQUENCE.STASH_AMBUSH, {
        event = CAUSE.STASH,
        priority = 20,
        condition = function()
            return cfg
              .consequence_stash_ambush_enabled
        end,
    },
    _handler
)
APS: aps_consequence_wealthy_ambush.script :92
ap_consumer.register(
    CONSEQUENCE.WEALTHY_AMBUSH, {
        event = CAUSE.WEALTHY,
        priority = 20,
        condition = function()
            return cfg
              .consequence_wealthy_ambush_enabled
        end,
    },
    _handler
)

The function, argument structure, field names, priority value (20), and condition pattern are all identical -- only the cause/consequence names differ.

4e. Chase configuration -- identical table keys

AlifePlus: ap_consequence_squadkill_revenge
local chase_opts = {
  handler_key   = "revenge_chase",
  log_prefix    = "CONSEQUENCE.SQUADKILL_REVENGE",
  max_chases_key= "consequence_squadkill_revenge_max_chases",
  pda_chance_key= "consequence_squadkill_revenge_pda_chance",
  pda_start     = "text_pda_consequence_squadkill_revenge",
  pda_lost      = "text_pda_consequence_squadkill_revenge_lost",
  pda_found     = "text_pda_consequence_squadkill_revenge_found",
  rush_key      = "consequence_squadkill_revenge_rush",
}

-- on_game_start:
chase_opts.cfg = cfg
ap_utils.chase_register(chase_opts)
APS: aps_consequence_wealthy_rob.script :28-36
local chase_opts = {
  handler_key   = "wealthy_rob_chase",
  log_prefix    = "CONSEQUENCE.WEALTHY_ROB",
  max_chases_key= "consequence_wealthy_rob_max_chases",
  pda_chance_key= "consequence_wealthy_rob_pda_chance",
  pda_start     = "text_pda_consequence_wealthy_rob",
  pda_lost      = "text_pda_consequence_wealthy_rob_lost",
  pda_found     = "text_pda_consequence_wealthy_rob_found",
  rush_key      = "consequence_wealthy_rob_rush",
}

-- on_game_start:
chase_opts.cfg = cfg
ap_utils.chase_register(chase_opts)

9 identical table keys. Same registration call. Same .cfg = cfg assignment. The values follow the naming convention from AlifePlus's conventions.md.

4f. MCM config creation -- one character different

AlifePlus: ap_mcm.script :508
cfg, get_config, load_config =
    xmcm.create_config("ap", defaults, path_builder)

function on_game_start()
    load_config()
    RegisterScriptCallback(
      "on_option_change", load_config)
end
APS: aps_mcm.script :74-79
cfg, get_config, load_config =
    xmcm.create_config("aps", defaults, path_builder)

function on_game_start()
    load_config()
    RegisterScriptCallback(
      "on_option_change", load_config)
end

The only difference is "ap" vs "aps" -- one character. Everything else is identical: same variable names, same function call, same callback registration, same lifecycle hook.

Uniqueness Proof

AlifePlus's consequence template defines a specific execution pattern: observe(trace, CONSEQUENCE, function() ... end) wrapping, find_squads_observed() for traced entity search, nested observe(trace, ACTION.MOVE_SQUAD, function() ... end), script_squad() dispatch in a loop, result_squads() return builders, observe(trace, ACTION.SEND_PDA, function() ... end), and chase_register() for pursuit mechanics. These functions and this pattern exist only in AlifePlus.

To verify this claim, every .script file in the GAMMA mod collection (~2,000 files across all installed mods) was searched for the following function names:

Pattern searchedResults in GAMMA (excluding AP, xlibs, APS, SISKI)
result_squads0
find_squads_observed0
find_smart_observed0
.observe(0
RADIANT_CALLBACKS0
chase_register0

Zero results. Not one of the ~2,000 GAMMA script files uses any of these patterns. They are not engine functions, not Anomaly utilities, not community conventions. They exist in exactly two places in the entire STALKER modding ecosystem:

  1. AlifePlus — where they were designed and implemented
  2. APS — where they were copied

The consequence template is not a standard modding pattern that forTheMonolith could have arrived at independently. It is AlifePlus's original architecture, documented in architecture.md and conventions.md — internal development documents, not a public specification. APS reproduces this architecture function-by-function, with only the consequence names changed.

What this proves: The framework pattern matching shown in Section 4 is not coincidental similarity. The patterns APS uses are unique to AlifePlus across the entire modding ecosystem. forTheMonolith's source code was written by feeding AlifePlus's internal architecture documents to an AI code generator.

Framework API Usage

In plain English: AlifePlus has two layers: a public guide that shows mod authors what functions to call, and internal development documents that describe how AlifePlus itself is built — naming rules, file organization, handler structure, config key formats. APS bypassed the public API and used the internal documents directly, reproducing the internal conventions character-for-character with only the names changed.

5a. Documented API (Level 1 and 2 — these are fine to use)

The usage guide documents these integration paths:

FunctionLevelPurpose
xbus.subscribe()Level 1Listen to cause events
ap_producer_reactive.register()Level 2Register cause predicates
ap_consumer.register()Level 2Register consequence handlers
ap_const.RADIANT_CALLBACKSLevel 2Callback array for registration loops
ap_const.RESULT.*Level 2Handler return codes

APS uses these calls correctly. This is not the issue.

5b. Undocumented internals (Level 3 — not part of any public API)

These functions do not appear in the guide. They can only be discovered by reading AlifePlus source code. ~8 documented API calls vs ~70+ undocumented internal calls.

Tracing system (33+ calls) — AP's internal hierarchical trace/debug pipeline:

FunctionCallsIn public API?
ap_debug.observe() — wrap logic in trace context10+No
ap_debug.trace() / result_squads() — create traces, build results8No
ap_debug.debug() / warn() — internal logging15+No

State manager (15 calls) — AP's internal squad tracking and elite system:

FunctionCallsIn public API?
ap_alife_tracker.script_squad() — script squads to destinations6No
ap_alife_tracker.script_actor_target() — lock squads onto player2No
ap_alife_tracker.register_arrival_handler() — arrival callbacks1No
ap_alife_tracker.get_elite_level() / is_elite() — elite queries6No

Internal helpers and data (22+ calls) — chase system, search wrappers, pipeline internals:

FunctionCallsIn public API?
ap_utils.chase_start() / chase_register() — chase mechanics2No
ap_utils.find_squads_observed() / find_smart_observed() — traced search6No
ap_utils.event_publish() / increment_cause_counter() — bypass cause flow4No
ap_utils.send_pda() / get_location_description() — PDA formatting7No
ap_const.RADIUS_CLOSE_MAX / DISTANT_MAX — distance thresholds5No
ap_data.community_stalker / community_predator — faction filters6No

Several modules are accessed via rawget(_G, ...) — bypassing module resolution to reach into the global table directly.

APS uses 14 of 16 xlibs modules. Every AlifePlus and xlibs function call is correct — right module, right name, right arguments, right field names. No framework call is hallucinated. This strongly suggests the complete source of both codebases was provided to the code generation tool. (Game item sections and engine APIs, which were not in the provided source, are hallucinated — see above.)

How to do this properly: The guide documents three integration levels. Level 1 (xbus subscriptions) and Level 2 (cause/consequence registration) cover most use cases without touching internals. APS uses Level 2 registration correctly but also reaches directly into Level 3 internals (tracker, chase system, tracing pipeline). These APIs are not stable and will change.

Design Language and ModDB Description

AlifePlus's readme.txt opens with: "You are not special." Its architecture.md defines it as: "YANS (You Are Not Special). Same rules for player and NPCs." This term appears only in AlifePlus documentation.

APS reproduces it in three places:

WhereAPS text
ModDB heading"CORE PHILOSOPHY: You Are Not Special"
ModDB body"You are not special — same rules apply to everyone"
Code comment (aps_cause_wealthy.script:32)"YANS: same evaluation logic for player and NPCs"

AP-original vocabulary used in APS code

AlifePlus classifies causes as "radiant" (ambient observations on squad update ticks) and "reactive" (responses to world events). These terms are defined in architecture.md and do not appear in any other STALKER mod. APS uses them as if they are standard terminology:

AP termDefined inAPS usage
"radiant" (cause type)architecture.md:90aps_cause_wealthy.script:9, aps_cause_predator.script:2,73
"reactive" (cause type)architecture.md:93aps_cause_wealthy.script:16, aps_tension.script:2
"cause predicate"architecture.md:19, manifesto.md:34aps_bridge.script:2,32
"personality-driven"manifesto.md:14, readme.txt:24aps_bounty.script:249, aps_consequence_wealthy_rob.script:287
"emergent" (NPC behavior)readme.txt:12, manifesto.mdaps_bosses.script:1, aps_faction_memory.script:9
"_trace" field on event_dataap_core_debug internalEvery APS consequence handler

None of these terms exist in any other STALKER mod. They are AlifePlus's internal vocabulary, adopted wholesale by APS because forTheMonolith's AI code generator was fed AP's documentation.

The ModDB description itself follows AlifePlus's readme structure section by section:

Section patternAlifePlus readmeAPS ModDB description
Opening philosophy"You are not special""CORE PHILOSOPHY: You Are Not Special"
Zone runs itself"the Zone runs on its own rules, and the actor is just another entity inside it""The Zone has its own life, its own conflicts, its own economy. You just happen to be in it."
Step-by-step walkthrough"Example scenario (systemic interaction): A stalker reaches a location...""How it works step by step: Your wealth is scored every 5 game-minutes..."
Realism section"NPCs consume real items from their inventory on arrival""What makes it realistic: Each squad runs through a personality-driven risk evaluation"
PDA notificationsPDA map markers as feature"PDA notifications:" with identical formatting
FAQ structure"Does it conflict...", "Does it work with GAMMA?", "Does it work mid-save?"Same questions, same order, same answers
MO2 install"Install (MO2): 1. Install xlibs 2. Install AlifePlus"Same steps, same format, adds priority numbers
Dual languageEnglish onlyEnglish + Russian (semantically identical, machine-translated)

The APS ModDB description is approximately 5,500 words in English + 2,000 words in Russian. The AlifePlus readme was provided to the code generation tool alongside the source code, and the AI reproduced the same organizational template for a different mod.

Runtime Behavior

The first user to test the mod reported a fatal engine crash:

FATAL ERROR
aps_consequence_wealthy_rob.script(182) : _run_handler
LUA error: No such operator defined

The crash occurs at line 182, where tostring(event_data.position) is called on an X-Ray engine vector userdata. X-Ray vectors do not define __tostring. This is a known engine limitation that any STALKER modder encounters early.

The crash propagates through AP's internal pipeline: ap_consumer._process -> xbus.publish -> ap_producer_reactive. Because APS injects directly into AP's dispatch chain via ap_producer_reactive.register() and ap_consumer.register(), a crash in APS code crashes AlifePlus itself for any user who has both installed.

The "v2.7.0" version number in the mod name does not correspond to any observable development history, and no git repository exists.

SISKI Dependency

APS requires SISKI 0.9.5+ and accesses its internals 32 times via _G.siski.* (bus, memory, board_index, mutants, loot, fast_trading, ap_bridge, tasks). SISKI 0.9.5 is the version that is the subject of an active DMCA takedown for containing architecture copied from AlifePlus.

The dependency chain:

AlifePlus (original) --> SISKI 0.9.5 (under DMCA) --> APS v2.7.0 (this mod)
xlibs (original)     --> SISKI 0.9.5 (under DMCA) --> APS v2.7.0 (this mod)

Feature Set Cloning

Beyond the framework and API usage documented above, APS's feature list is assembled from ideas found in existing Anomaly mods and in AlifePlus itself. Several features are direct clones of AlifePlus systems with the names changed.

9a. Boss system = Alpha system renamed

AlifePlus has an alpha/elite promotion system (ap_ext_consequence_alpha_promote, ap_ext_tracker). APS has a "boss" system (aps_bosses). They are the same design:

FeatureAlifePlus AlphaAPS Boss
EmergenceMutants accumulate kills"Squads earn boss status through survival and combat"
Tiers10 levels (kill_count / kills_per_level)3 tiers (Lieutenant / Captain / Warlord)
Combat buffHit power bonus + reduction per levelRank boost (300 / 600 / 900)
Special behaviorPanic immunity
LootPer-species ALPHA_LOOT injected into inventoryPer-tier gear tables injected
Map markersadd_marked_squad()PDA markers + zone-wide gossip
Tracking_ap_alphas table, persisted_bosses table, persisted
Philosophy"emergent behavior nobody scripted""Nobody is appointed — the Zone's natural selection produces its own leaders"

The APS code comment (aps_bosses.script:2-3) even uses the same language as AlifePlus's readme — "natural selection produces its own leaders" mirrors AlifePlus's "emergent behavior nobody scripted." No other STALKER mod describes NPC promotion systems with the phrase "natural selection."

9b. Personality values derived from AlifePlus

AlifePlus defines per-faction personality traits in ap_ext_const.script (7 traits, 12 factions + 17 species, sourced from GSC AI design documents). APS defines a parallel table in aps_personality.script (4 traits, 12 factions). The values are suspiciously close:

FactionAP aggressionAPS aggressionAP greedAPS greed
monolith0.900.900.100.10
ecolog0.200.200.300.30
killer0.700.700.700.60
dolg0.700.600.200.20
army0.600.500.100.20
bandit0.400.500.900.80
renegade0.300.400.900.70
stalker0.500.400.700.40
freedom0.500.500.500.30
csky0.400.500.300.30
greh0.800.700.700.50
isg0.500.600.200.50

Multiple exact matches (highlighted). All values within 0.1-0.2. AlifePlus's values are derived from GSC's AI design documents (Ai.doc personality axes, cited in code). APS provides no source for its values. The simplest explanation: the AI was given AP's personality table and told to generate a "different" version.

9c. Feature set comparison

APS featureSourceOriginal authorWhat was taken
Cross-level robbery: outlaws hear about wealthy targets and send squads to rob them Mugging Squads Demonized The core concept: hostile NPCs approach the player specifically to rob them based on gear/wealth. Demonized's version includes dialogue, warnings, and player choices. APS strips this to silent combat but the gameplay idea (NPCs target you for your gear) is the same.
Faction tension system: hostility accumulates from combat, triggers retaliatory strikes Dynamic Faction Relations Customizer dEmergence The concept of tracking per-faction hostility that changes dynamically based on combat events. DFRC modifies engine faction relations directly; APS tracks a parallel "tension" score. Different system, same idea.
Boss/elite NPC emergence: squads earn status through survival and kills, get better gear and rank AlifePlus itself Damian Sirbu AlifePlus has an elite system (ap_alife_tracker elite tracking, ap_consequence_elite_promote) and formerly had a legend system. APS's 3-tier boss system (Lieutenant/Captain/Warlord with gear injection, rank boost, PDA markers) is a direct reimplementation of AP's elite promotion concept with added RPG chrome (nickname pools, tiered gear tables). The AI was given AP's source and generated a "fancier" version of the existing feature.
Bounty system: factions place bounties on each other, hunter squads pursue targets Bounty Squads Extended (concept) + AlifePlus elitekill_targeted Vintar0 / Damian Sirbu The bounty concept exists in multiple Anomaly mods. APS's specific implementation (tension threshold triggers bounty placement, hunter squads dispatched via personality evaluation) mirrors AP's existing elitekill_targeted consequence pattern with a tension-driven trigger added.
Weather-driven behavior: emissions suppress robbery, night increases it Dynamic NOCTURNAL Mutants bmblbx176 The concept of time-of-day affecting NPC behavior (night = more dangerous). APS uses the same night hours (22:00-05:00) for robbery bonuses that Nocturnal Mutants uses for spawn waves.
Population safeguard: prevent maps from becoming empty Zone Customization Project (ZCP) dph-hcl ZCP's population factors control squad density per level. APS's population safeguard monitors the same metric and blocks outbound scripting when counts drop too low. Different mechanism, same problem being solved.

Individually, none of these similarities would be notable — many mods solve similar problems. But the pattern is that APS's entire feature list was assembled by systematically cataloguing what already exists in the Anomaly modding ecosystem and asking an AI to generate equivalents. Nearly every feature in APS traces to an existing Anomaly mod or to AlifePlus itself. The remainder are generic RPG templates — personality traits, boss tiers, nickname pools — with no STALKER-specific grounding.

On ideas vs code: Gameplay ideas are not copyrightable, and multiple mods can implement similar features. But there is a difference between independently arriving at the same idea and feeding existing mods' source code into an AI to generate equivalents. The original authors — Demonized, Vintar0, xcvb, dEmergence, bmblbx176, dph-hcl — spent real time solving these problems. None of them are credited in APS.

License

Both AlifePlus and xlibs use the PolyForm Perimeter License 1.0.0.

v2.7.0

RequirementStatusDetail
LICENSE fileMissingNo license file in the mod package.
Credits fileMissingNo credits file. ModDB description only.
Source fed to AIBrokenComplete AP/xlibs source provided to a code generation tool. Reproduces internal conventions character-for-character.

v2.8.4

After promising to take the mod down, forTheMonolith re-uploaded with cosmetic compliance changes:

ChangeStatusDetail
LICENSE file addedAddedPolyForm Perimeter 1.0.0 — the same license used by AlifePlus, copied verbatim. Copyright "2026 forTheMonolith".
CREDITS.md addedAddedCredits xlibs and AlifePlus by Damian Sirbu. Does not credit AlifePlus for the boss system (derived from AP's alpha/elite system).
Architecture copyingUnchangedStill reproduces AP's consequence template, internal API calls, and terminology. Updated to match AP's latest code with each iteration.
SISKI dependencyUnchangedStill hard-depends on SISKI 0.9.5+, which contains stolen xbus/bridge/factory code under active DMCA takedown.
Source fed to AIUnchangedCREDITS.md explicitly states: "APS is developed with AI assistance (Claude by Anthropic) under author direction." The AI is fed AP's architecture.md, conventions.md, and source code to produce each iteration.

The CREDITS.md claims: "The implementations in APS are not ports or reimplementations of these mods' code." The uniqueness proof contradicts this directly: the patterns APS uses exist nowhere in the STALKER modding ecosystem except AlifePlus.