A  rather personal view:
The development of customized tags was an attempt to hide COS from "TAG-SHUFFLERS"  
as we named back at the start of this century WebPage coders. Neither JS nor CSS was there yet,
But something more  "modern" than the previous VB5 and VB6 tools were required.

ISC was never a leader in WebPages rather a follower. Also with ZEN and MOJO.
And CSP was definitely never a buying argument for Caché or IRIS.
It was never a core business. Rather a necessary requirement, demanding quite some effort.
Today nobody is forced to drop existing development.  
It is there and it will persist, and it's not hidden, but it will not be pushed.

A personals note.
The first CSP Training for customers was written by my friend Salva (@Jose-Tomas Salvador) 
And I did the translation of this training to German and English.( ~ 2 decades back)

What you experience is the effect of the Global Buffer Pool.
The rule is to overwrite the least used buffer if a new is required.
So the older the buffer the higher the chance to be overwritten and later reloaded.
Purging queries only affects code not data

Possible option:  increase  your buffer pool (double or triple size)
or try this approach: https://community.intersystems.com/post/global-buffer-questions
suggested by @Julius Kavay 

This total ODD !  But it works.
The list doesn't allow Carret ^ for the positive Globals
for globals to skip Carret ^ is required !!!


ENS>set list="Ens.*.GBL,'^Ens.Me*.GBL,'^Ens.C*.GBL"
ENS>ENS>set sc=$system.OBJ.Export(.list)
;; output skipped ;;
ENS>ZWRITE    ;processed Globals
list("^Ens.ActiveMessage.gbl")=""
list("^Ens.AppData.gbl")=""
list("^Ens.BP.ContextD.gbl")=""
list("^Ens.BP.ThreadD.gbl")=""
list("^Ens.BP.ThreadI.gbl")=""
list("^Ens.BusinessProcessD.gbl")=""
list("^Ens.BusinessProcessI.gbl")=""
list("^Ens.Debug.gbl")=""
list("^Ens.DocClassMap.gbl")=""
list("^Ens.JobStatus.gbl")=""
list("^Ens.Mirror.gbl")=""
list("^Ens.Queue.gbl")=""
list("^Ens.Rule.gbl")=""
list("^Ens.Util.IOLogD.gbl")=""
list("^Ens.Util.IOLogI.gbl")=""
list("^Ens.Util.LogD.gbl")=""
list("^Ens.Util.LogI.gbl")=""
list("^Ens.Util.ScheduleD.gbl")=""
sc=1
My interpretation:
First, a local array is collected, and then the negated subscripts are deleted (requiring now ^   !!)

Hi Dan !

ADD / CREATE is just wishful thinking. sad It is only able to EDIT an already EXISTING link.
If it exists you get asked: "Overwrite ?" otherwise "Not Found" as you have seen. angry

You must create first a dummy of type *.link.DFI  that you have to import by DeepSee Folder Manager
or better directly in Studio. You must then assign the correct name already there.
Folder Manager can't rename or move it !!  only Import/Export sad 

Here is a dummy link to start with.

<?xml version="1.0" encoding="UTF-8"?>
<Export generator="IRIS" version="26" zv="IRIS for Windows (x86-64) 2021.1.0PYTHON (Build 237U)" ts="2021-11-01 13:54:36">
<Document name="dummy.link.DFI">
<link 
  xmlns="http://www.intersystems.com/deepsee/library" 
  name="dummy" folderName="Links" 
  shared="true" 
  public="true" 
  locked="false"
  href=""
  title="" 
  description="" 
  keywords="" 
  owner="" 
  resource="" 
  timeCreated="" 
  createdBy="" category="" 
  bookCover=""
  >           
</link>
</Document>
</Export>

Feel free to place a PRODLOG on that bug.
I will not do it. I'm not willing to wait so long. crying
I just recently received a closing message on another PRODLOG  I had placed in early 2017. angry
 

In past, I have seen so many "re-invented wheels" on COS that were mostly kind of remakes of
existing packages or solutions. Though this is impressive from a coding point of view,
it is just a waste of energy from point of view of a project AND its maintenance.

I had similar experiences with SQL that was refused by "experienced" programmers
insisting on horrible $ORDER() / $QUERY() constructs almost un-supportable, to gain
a few microseconds of performance on a weekly report. 

The deeper reason: nobody explained it and trained them.
That's the behaviour to avoid.