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
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.
| Finding | Evidence | Section |
|---|---|---|
| AI-generated code | 67 pcall wraps, hallucinated items, empty loops, mechanical uniformity in 28/28 files | ↓ |
| Internal conventions copied | Naming, handler structure, config keys, registration loops — all from conventions.md | ↓ |
| Architecture unique to AP | observe/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 calls | Tracing, 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 cloned | APS faction bias table tracks AP's values within 0.1 across all 12 factions | ↓ |
| Promise then re-upload | forTheMonolith publicly stated "I'm taking the mod down in 24 hours", then created a new ModDB page | ↓ |
| Fatal crash on first test | tostring(vector) at line 182 — crashes AP's pipeline for all users | ↓ |
| Depends on DMCA'd code | Requires SISKI 0.9.5, which is under active DMCA takedown | ↓ |
| License requirements broken | v2.7.0: no LICENSE file. v2.8.4: copied AlifePlus's PolyForm Perimeter license verbatim, still depends on stolen SISKI code | ↓ |
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:
| Change | Detail |
|---|---|
| Added CREDITS.md | Credits xlibs and AlifePlus by Damian Sirbu with license and ModDB links. Credits SISKI by qkff99. |
| Added LICENSE file | PolyForm Perimeter 1.0.0 — the same license used by AlifePlus and xlibs, copied verbatim. Copyright "2026 forTheMonolith". |
| Concept inspirations | Credits 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:
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.
| Field | Value |
|---|---|
| Author | forTheMonolith (ModDB) |
| Uploaded | April 4, 2026 |
| Size | 73.51 KB (28 scripts + 2 XML) |
| Lines | 6,112 |
| License on ModDB | "Proprietary" |
| License file in mod | None |
| Git repository | None (zip upload) |
| Dependencies | xlibs 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 mod | None |
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:
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.
| What | AlifePlus pattern | APS (identical pattern) |
|---|---|---|
| Cause file | ap_cause_stash.script | aps_cause_wealthy.script |
| Consequence file | ap_consequence_stash_ambush.script | aps_consequence_wealthy_ambush.script |
| Cause event name | "cause:stash" | "cause:wealthy" |
| Consequence event name | "consequence:stash_ambush" | "consequence:wealthy_ambush" |
| MCM enabled key | cause_stash_enabled | cause_wealthy_enabled |
| MCM chance key | consequence_stash_ambush_chance | consequence_wealthy_rob_chance |
| MCM PDA key | consequence_stash_ambush_pda_chance | consequence_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 prefix | xmcm.create_config("ap", ...) | xmcm.create_config("aps", ...) |
| Save data key | m_data.ap_tension | m_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.
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.
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
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().
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
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
ap_consumer.register(
CONSEQUENCE.STASH_AMBUSH, {
event = CAUSE.STASH,
priority = 20,
condition = function()
return cfg
.consequence_stash_ambush_enabled
end,
},
_handler
)
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.
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)
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.
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
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.
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 searched | Results in GAMMA (excluding AP, xlibs, APS, SISKI) |
|---|---|
result_squads | 0 |
find_squads_observed | 0 |
find_smart_observed | 0 |
.observe( | 0 |
RADIANT_CALLBACKS | 0 |
chase_register | 0 |
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:
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.
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.
The usage guide documents these integration paths:
| Function | Level | Purpose |
|---|---|---|
xbus.subscribe() | Level 1 | Listen to cause events |
ap_producer_reactive.register() | Level 2 | Register cause predicates |
ap_consumer.register() | Level 2 | Register consequence handlers |
ap_const.RADIANT_CALLBACKS | Level 2 | Callback array for registration loops |
ap_const.RESULT.* | Level 2 | Handler return codes |
APS uses these calls correctly. This is not the issue.
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:
| Function | Calls | In public API? |
|---|---|---|
ap_debug.observe() — wrap logic in trace context | 10+ | No |
ap_debug.trace() / result_squads() — create traces, build results | 8 | No |
ap_debug.debug() / warn() — internal logging | 15+ | No |
State manager (15 calls) — AP's internal squad tracking and elite system:
| Function | Calls | In public API? |
|---|---|---|
ap_alife_tracker.script_squad() — script squads to destinations | 6 | No |
ap_alife_tracker.script_actor_target() — lock squads onto player | 2 | No |
ap_alife_tracker.register_arrival_handler() — arrival callbacks | 1 | No |
ap_alife_tracker.get_elite_level() / is_elite() — elite queries | 6 | No |
Internal helpers and data (22+ calls) — chase system, search wrappers, pipeline internals:
| Function | Calls | In public API? |
|---|---|---|
ap_utils.chase_start() / chase_register() — chase mechanics | 2 | No |
ap_utils.find_squads_observed() / find_smart_observed() — traced search | 6 | No |
ap_utils.event_publish() / increment_cause_counter() — bypass cause flow | 4 | No |
ap_utils.send_pda() / get_location_description() — PDA formatting | 7 | No |
ap_const.RADIUS_CLOSE_MAX / DISTANT_MAX — distance thresholds | 5 | No |
ap_data.community_stalker / community_predator — faction filters | 6 | No |
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.)
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:
| Where | APS 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" |
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 term | Defined in | APS usage |
|---|---|---|
| "radiant" (cause type) | architecture.md:90 | aps_cause_wealthy.script:9, aps_cause_predator.script:2,73 |
| "reactive" (cause type) | architecture.md:93 | aps_cause_wealthy.script:16, aps_tension.script:2 |
| "cause predicate" | architecture.md:19, manifesto.md:34 | aps_bridge.script:2,32 |
| "personality-driven" | manifesto.md:14, readme.txt:24 | aps_bounty.script:249, aps_consequence_wealthy_rob.script:287 |
| "emergent" (NPC behavior) | readme.txt:12, manifesto.md | aps_bosses.script:1, aps_faction_memory.script:9 |
| "_trace" field on event_data | ap_core_debug internal | Every 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 pattern | AlifePlus readme | APS 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 notifications | PDA 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 language | English only | English + 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.
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.
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)
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.
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:
| Feature | AlifePlus Alpha | APS Boss |
|---|---|---|
| Emergence | Mutants accumulate kills | "Squads earn boss status through survival and combat" |
| Tiers | 10 levels (kill_count / kills_per_level) | 3 tiers (Lieutenant / Captain / Warlord) |
| Combat buff | Hit power bonus + reduction per level | Rank boost (300 / 600 / 900) |
| Special behavior | Panic immunity | — |
| Loot | Per-species ALPHA_LOOT injected into inventory | Per-tier gear tables injected |
| Map markers | add_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."
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:
| Faction | AP aggression | APS aggression | AP greed | APS greed |
|---|---|---|---|---|
| monolith | 0.90 | 0.90 | 0.10 | 0.10 |
| ecolog | 0.20 | 0.20 | 0.30 | 0.30 |
| killer | 0.70 | 0.70 | 0.70 | 0.60 |
| dolg | 0.70 | 0.60 | 0.20 | 0.20 |
| army | 0.60 | 0.50 | 0.10 | 0.20 |
| bandit | 0.40 | 0.50 | 0.90 | 0.80 |
| renegade | 0.30 | 0.40 | 0.90 | 0.70 |
| stalker | 0.50 | 0.40 | 0.70 | 0.40 |
| freedom | 0.50 | 0.50 | 0.50 | 0.30 |
| csky | 0.40 | 0.50 | 0.30 | 0.30 |
| greh | 0.80 | 0.70 | 0.70 | 0.50 |
| isg | 0.50 | 0.60 | 0.20 | 0.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.
| APS feature | Source | Original author | What 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.
Both AlifePlus and xlibs use the PolyForm Perimeter License 1.0.0.
| Requirement | Status | Detail |
|---|---|---|
| LICENSE file | Missing | No license file in the mod package. |
| Credits file | Missing | No credits file. ModDB description only. |
| Source fed to AI | Broken | Complete AP/xlibs source provided to a code generation tool. Reproduces internal conventions character-for-character. |
After promising to take the mod down, forTheMonolith re-uploaded with cosmetic compliance changes:
| Change | Status | Detail |
|---|---|---|
| LICENSE file added | Added | PolyForm Perimeter 1.0.0 — the same license used by AlifePlus, copied verbatim. Copyright "2026 forTheMonolith". |
| CREDITS.md added | Added | Credits xlibs and AlifePlus by Damian Sirbu. Does not credit AlifePlus for the boss system (derived from AP's alpha/elite system). |
| Architecture copying | Unchanged | Still reproduces AP's consequence template, internal API calls, and terminology. Updated to match AP's latest code with each iteration. |
| SISKI dependency | Unchanged | Still hard-depends on SISKI 0.9.5+, which contains stolen xbus/bridge/factory code under active DMCA takedown. |
| Source fed to AI | Unchanged | CREDITS.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.