Index: /branches/eam_branches/ipp-pstamp-20260421/ippTools/src/stacktool.c
===================================================================
--- /branches/eam_branches/ipp-pstamp-20260421/ippTools/src/stacktool.c	(revision 43093)
+++ /branches/eam_branches/ipp-pstamp-20260421/ippTools/src/stacktool.c	(revision 43094)
@@ -34,4 +34,5 @@
 static bool definerunMode(pxConfig *config);
 static bool updaterunMode(pxConfig *config);
+static bool listrunMode(pxConfig *config);
 static bool addinputskyfileMode(pxConfig *config);
 static bool inputskyfileMode(pxConfig *config);
@@ -79,4 +80,5 @@
         MODECASE(STACKTOOL_MODE_DEFINERUN,             definerunMode);
         MODECASE(STACKTOOL_MODE_UPDATERUN,             updaterunMode);
+        MODECASE(STACKTOOL_MODE_LISTRUN,               listrunMode);
         MODECASE(STACKTOOL_MODE_ADDINPUTSKYFILE,       addinputskyfileMode);
         MODECASE(STACKTOOL_MODE_INPUTSKYFILE,          inputskyfileMode);
@@ -750,5 +752,4 @@
 }
 
-
 static bool updaterunMode(pxConfig *config)
 {
@@ -815,4 +816,80 @@
 }
 
+static bool listrunMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-stack_id",   "stackRun.stack_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-tess_id",    "stackRun.tess_id", "LIKE");
+    PXOPT_COPY_STR(config->args, where, "-skycell_id", "stackRun.skycell_id", "LIKE");
+    PXOPT_COPY_STR(config->args, where, "-filter",     "stackRun.filter", "LIKE");
+    PXOPT_COPY_STR(config->args, where, "-state",      "stackRun.state", "==");
+    pxAddLabelSearchArgs(config, where, "-label",      "stackRun.label", "LIKE");
+    pxAddLabelSearchArgs(config, where, "-data_group", "stackRun.data_group", "LIKE");
+    pxAddLabelSearchArgs(config, where, "-dist_group", "stackRun.dist_group", "LIKE");
+
+    PXOPT_LOOKUP_BOOL(all, config->args, "-all", false);
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+    psString query = psStringCopy ("SELECT stackRun.* FROM stackRun");
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+        psStringAppend(&query, " WHERE %s", whereClause);
+        psFree(whereClause);
+    } else if (!all) {
+        psError(PXTOOLS_ERR_CONFIG, true, "search parameters or -all are required");
+        return false;
+    }
+    psFree(where);
+
+    // treat limit == 0 as "no limit"
+    if (limit) {
+        psString limitString = psDBGenerateLimitSQL(limit);
+        psStringAppend(&query, " %s", limitString);
+        psFree(limitString);
+    }
+
+    if (!p_psDBRunQuery(config->dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        return false;
+    }
+    psFree(query);
+
+    psArray *output = p_psDBFetchResult(config->dbh);
+    if (!output) {
+        psErrorCode err = psErrorCodeLast();
+        switch (err) {
+            case PS_ERR_DB_CLIENT:
+                psError(PXTOOLS_ERR_SYS, false, "database error");
+            case PS_ERR_DB_SERVER:
+                psError(PXTOOLS_ERR_PROG, false, "database error");
+            default:
+                psError(PXTOOLS_ERR_PROG, false, "unknown error");
+        }
+
+        return false;
+    }
+    if (!psArrayLength(output)) {
+        psTrace("stacktool", PS_LOG_INFO, "no rows found");
+        psFree(output);
+        return true;
+    }
+
+    if (psArrayLength(output)) {
+	if (!ippdbPrintMetadatas(stdout, output, "stackRun", !simple)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to print array");
+            psFree(output);
+            return false;
+        }
+    }
+    
+    psFree(output);
+
+    return true;
+}
 
 static bool addinputskyfileMode(pxConfig *config)
@@ -1211,5 +1288,4 @@
 }
 
-
 static bool sumskyfileMode(pxConfig *config)
 {
Index: /branches/eam_branches/ipp-pstamp-20260421/ippTools/src/stacktool.h
===================================================================
--- /branches/eam_branches/ipp-pstamp-20260421/ippTools/src/stacktool.h	(revision 43093)
+++ /branches/eam_branches/ipp-pstamp-20260421/ippTools/src/stacktool.h	(revision 43094)
@@ -28,4 +28,5 @@
     STACKTOOL_MODE_DEFINERUN,
     STACKTOOL_MODE_UPDATERUN,
+    STACKTOOL_MODE_LISTRUN,
     STACKTOOL_MODE_ADDINPUTSKYFILE,
     STACKTOOL_MODE_INPUTSKYFILE,
Index: /branches/eam_branches/ipp-pstamp-20260421/ippTools/src/stacktoolConfig.c
===================================================================
--- /branches/eam_branches/ipp-pstamp-20260421/ippTools/src/stacktoolConfig.c	(revision 43093)
+++ /branches/eam_branches/ipp-pstamp-20260421/ippTools/src/stacktoolConfig.c	(revision 43094)
@@ -147,4 +147,18 @@
     psMetadataAddBool(inputskyfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
+    // -listrun
+    psMetadata *listrunArgs = psMetadataAlloc();
+    psMetadataAddS64(listrunArgs,  PS_LIST_TAIL, "-stack_id", 0,         "search by stack ID", 0);
+    psMetadataAddStr(listrunArgs,  PS_LIST_TAIL, "-tess_id", 0,          "search by tess ID (LIKE comparison)", 0);
+    psMetadataAddStr(listrunArgs,  PS_LIST_TAIL, "-skycell_id", 0,       "search by skycell ID (LIKE comparison)", 0);
+    psMetadataAddStr(listrunArgs,  PS_LIST_TAIL, "-filter", 0,           "search by filter", NULL);
+    psMetadataAddStr(listrunArgs,  PS_LIST_TAIL, "-state", 0,            "search by state", NULL);
+    psMetadataAddStr(listrunArgs,  PS_LIST_TAIL, "-label", PS_META_DUPLICATE_OK,      "search by label", NULL);
+    psMetadataAddStr(listrunArgs,  PS_LIST_TAIL, "-data_group", PS_META_DUPLICATE_OK, "search by data_group", 0);
+    psMetadataAddStr(listrunArgs,  PS_LIST_TAIL, "-dist_group", PS_META_DUPLICATE_OK, "search by dist_group", 0);
+    psMetadataAddBool(listrunArgs, PS_LIST_TAIL, "-all",  0,             "search without arguments", false);
+    psMetadataAddU64(listrunArgs,  PS_LIST_TAIL,  "-limit",  0,          "limit result set to N items", 0);
+    psMetadataAddBool(listrunArgs, PS_LIST_TAIL, "-simple",  0,          "use the simple output format", false);
+
     // -tosum
     psMetadata *tosumArgs = psMetadataAlloc();
@@ -288,12 +302,12 @@
     psMetadataAddStr(summaryArgs, PS_LIST_TAIL, "-tess_id", 0,   "search by tessellation ID", NULL);
     psMetadataAddStr(summaryArgs, PS_LIST_TAIL, "-projection_cell", 0,   "search by projection cell ID", NULL);
-//    psMetadataAddStr(summaryArgs, PS_LIST_TAIL, "-state", 0,     "search by state", NULL);
+//  psMetadataAddStr(summaryArgs, PS_LIST_TAIL, "-state", 0,     "search by state", NULL);
     psMetadataAddStr(summaryArgs, PS_LIST_TAIL, "-filter", 0,    "search by filter (LIKE comparison)", NULL);
     psMetadataAddStr(summaryArgs, PS_LIST_TAIL, "-label", PS_META_DUPLICATE_OK, "search by stackRun label (LIKE comparison)", NULL);
     psMetadataAddStr(summaryArgs, PS_LIST_TAIL, "-data_group", PS_META_DUPLICATE_OK, "search by stackAssociation data_group (LIKE comparison)", NULL);
     psMetadataAddStr(summaryArgs, PS_LIST_TAIL, "-skycell_id", 0,   "search by skycell ID", NULL);
-//     psMetadataAddStr(summaryArgs, PS_LIST_TAIL, "-dist_group", PS_META_DUPLICATE_OK, "search by stackRun dist_group (LIKE comparison)", NULL);
-
-//    psMetadataAddBool(summaryArgs, PS_LIST_TAIL, "-all",  0,             "search without arguments", false);
+//  psMetadataAddStr(summaryArgs, PS_LIST_TAIL, "-dist_group", PS_META_DUPLICATE_OK, "search by stackRun dist_group (LIKE comparison)", NULL);
+
+//  psMetadataAddBool(summaryArgs, PS_LIST_TAIL, "-all",  0,             "search without arguments", false);
     psMetadataAddU64(summaryArgs, PS_LIST_TAIL,  "-limit",  0,            "limit result set to N items", 0);
     psMetadataAddBool(summaryArgs, PS_LIST_TAIL, "-simple",  0,          "use the simple output format", false);
@@ -353,10 +367,11 @@
 
     PXOPT_ADD_MODE("-definebyquery", "Define a new stackRun by searching for warp IDs", STACKTOOL_MODE_DEFINEBYQUERY,  definebyqueryArgs);
-    PXOPT_ADD_MODE("-definerun",       "", STACKTOOL_MODE_DEFINERUN,      definerunArgs);
-    PXOPT_ADD_MODE("-updaterun",       "", STACKTOOL_MODE_UPDATERUN,      updaterunArgs);
+    PXOPT_ADD_MODE("-definerun",       "", STACKTOOL_MODE_DEFINERUN,       definerunArgs);
+    PXOPT_ADD_MODE("-updaterun",       "", STACKTOOL_MODE_UPDATERUN,       updaterunArgs);
+    PXOPT_ADD_MODE("-listrun",         "", STACKTOOL_MODE_LISTRUN,         listrunArgs);
     PXOPT_ADD_MODE("-addinputskyfile", "", STACKTOOL_MODE_ADDINPUTSKYFILE, addinputskyfileArgs);
     PXOPT_ADD_MODE("-inputskyfile",    "", STACKTOOL_MODE_INPUTSKYFILE,    inputskyfileArgs);
-    PXOPT_ADD_MODE("-tosum",           "", STACKTOOL_MODE_TOSUM,          tosumArgs);
-    PXOPT_ADD_MODE("-tobkg",           "", STACKTOOL_MODE_TOBKG,          tobkgArgs);
+    PXOPT_ADD_MODE("-tosum",           "", STACKTOOL_MODE_TOSUM,           tosumArgs);
+    PXOPT_ADD_MODE("-tobkg",           "", STACKTOOL_MODE_TOBKG,           tobkgArgs);
     PXOPT_ADD_MODE("-addsumskyfile",   "", STACKTOOL_MODE_ADDSUMSKYFILE,   addsumskyfileArgs);
     PXOPT_ADD_MODE("-sumskyfile",      "list results of stackRun", STACKTOOL_MODE_SUMSKYFILE,      sumskyfileArgs);
@@ -376,4 +391,5 @@
     PXOPT_ADD_MODE("-revertsummary",        "revert entry in the summary table", STACKTOOL_MODE_REVERTSUMMARY, revertsummaryArgs);
     
+
     PXOPT_ADD_MODE("-exportrun",            "export run for import on other database", STACKTOOL_MODE_EXPORTRUN, exportrunArgs);
     PXOPT_ADD_MODE("-importrun",            "import run from metadata file",           STACKTOOL_MODE_IMPORTRUN, importrunArgs);
