I fully support your proposal.
I published >700 reviews for the actual 1156 visible packages.
And there are several challenges to be addressed with any new structure.

  • The reviews with stars focus on an actual individual snapshot.
  • Similar to the code or example, they age and may become invalid.
  • Ongoing maintenance by creators can't be expected
  • So a clear separation between actual and maintained packages and those just kept for historical reference could be useful.
  • The decision for maintenance must be left to the creator
    • Example:
    • If some essential function in IRIS is dropped without replacement
    • with no acceptable workaround, I'd move it to the archive
    • I just had to unpublish some packages for this reason 
  • Another category could be packages where ISC takes responsibility.

This isn't a solution, but a step in between to improve the actual situation
I wonder how many of the 1156 packages might move to the archive without maintenance

There is no voting on the numbers added

Hi @Evgeny Shvarov 
You inspired me to extend the standard Dockerfile sequence by this line

RUN --mount=type=bind,src=.,dst=. \
    iris start IRIS && \
    iris session IRIS < zpm.script && \
    iris session IRIS < iris.script && \
    iris stop IRIS quietly

and zpm.script is basically the version-independent one-liner sliced to readable pieces

zn "%SYS"
 ;; from onezpm
hang 3
write !,"from onezpm",!
set r=##class(%Net.HttpRequest).%New()
set r.Server="pm.community.intersystems.com"
set r.SSLConfiguration="ISC.FeatureTracker.SSL.Config"
do r.Get("/packages/zpm/latest/installer")
do $system.OBJ.LoadStream(r.HttpResponse.Data,"c")
ZPM "repo -r -n registry -url https://pm.community.intersystems.com/ -user """" -pass """""
zpm "enable -community"
hang 2
Write !,"ZPM ready",!
halt

This makes me independent from the limits of intersystemsdc/.....
and I can use images from 
containers.intersystems.com/intersystems/****-community
with a minimal invasive approach without touching any other part of the repo

1) you miss a final condition in $SELECT(). It's the 1:
$SELECT(^GlFSL("Debug")>0:Entry^HS.Local.VA.Util.Log(%arr,,"D"),1:QUIT)
2) QUIT doesn't return a value but <UNDEFINED> error if you don't have 
a SET QUIT=""  somwhere before or use $GET()
this may fit

$SELECT(^GlFSL("Debug")>0:Entry^HS.Local.VA.Util.Log(%arr,,"D"),1:$GET(QUIT))

Command QUIT is just appropriate with $CASE(...)
https://docs.intersystems.com/iris20252/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_fselect#RCOS_fselect_select_and_case

TestFor.inc
 

#define MyLoop(%count) set x="" for i=1:1:%count set x=$order(^%SYS("JOURNAL",x),-1) write x,! 

in Test class:
 

ClassMethod Mike()
{
	$$$MyLoop(7) Write ?5,$get(@$ZR," *** "),!
}	

Resulting in

PURGED
      ***
PREFIX
 
MAXSIZE
     1073741824
LIFESPAN
      ***
LAST
     1^C:\InterSystems\IRIS242\mgr\journal\20251029.003
EXPSIZE
     0
CURRENT
     1^C:\InterSystems\IRIS242\mgr\journal\20251029.003

(error on compiling within a class) like: 
#define TestIf(%arr)        if (%arr > 0) { QUIT 5 }    ; no final dot.

#define is an element of ObjectScript
so it has to be embedded in a [Class]Method 
and it is only available within that method

It can't be flying free inside a class definition.

If you need your $$$TestIf(...)  in more than 1 method, you can deposit
it in some TestIf.INC  and include it BEFORE the Class statement !!
Then it is visible to ALL methods.

Attention: You can INCLUDE just 1 single  *.INC in a class definition.
If you need more than 1, you have to cascade it with #include  in  the first *.inc

Include TestIf

Class A.PERSON1 Extends %Library.Persistent
{
Parameter GlobalName = "^.........!"  ;;
/// .......
ClassMethod michael(param) as %Integer
{
    $$$TestIf(param)
 .........
    quit $$$OK
}