The hardware and bandwidth for this mirror is donated by METANET, the Webhosting and Full Service-Cloud Provider.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]metanet.ch.

Symlink Tool Intro Vignette

Demonstration

What this demonstration is.

We’ll showcase the life-cycle of a typical pipeline output folder.

What this demonstration is not.

This won’t be an exhaustive demonstration of all the available options, this is a vignette of an average use-case.

Set Your Output Folder

My team uses a output_root folder for all inputs we submit to ST-GPR.
This way we can prepare the data, then submit various ST-GPR models with different parameters without needing to re-prep the inputs. The results of the ST-GPR models go into an output folder, which we’ll ignore for simplicity.

library(vmTools)
library(data.table)
# Make the root folder
output_root <- file.path(tempdir(), "slt", "output_root")
dir.create(output_root, 
           recursive    = TRUE, 
           showWarnings = FALSE)

New Folder

Use the Symlink Tool to create a new folder in your output root.

  • We’ll use a helper function to auto-increments versions run on the same day.
    • YYYY_MM_DD.VV naming scheme
    • The Symlink Tool itself does not auto-increment.
    • It allows the user to decide folder names.
date_vers1 <- get_output_dir(output_root, "2024_02_01")
slt_prep$make_new_version_folder(version_name = date_vers1)

Capture some paths, using the Symlink Tool to help. We’ll use these in a minute.

  • Note: These can be drawn from within the Symlink Tool
path_log_central <- slt_prep$return_dictionaries()[["LOG_CENTRAL"]][["path"]]
fname_dv_log     <- slt_prep$return_dictionaries()[["log_path"]]
root_dv1         <- slt_prep$return_dynamic_fields()[["VERS_PATHS"]][["output_root"]]
path_log_dv1     <- file.path(root_dv1, fname_dv_log)

Show the file tree.

#> |-- 2024_02_01.01
#> |  `-- logs
#> |     `-- log_version_history.csv
#> `-- log_symlinks_central.csv

Show central log.

#>    log_id         timestamp    user version_name action     comment
#>     <int>            <char>  <char>       <char> <char>      <char>
#> 1:      0 2025_07_24_111336 ssbyrne  CENTRAL_LOG create log created

Show new run version folder log.

#>    log_id         timestamp    user  version_name action     comment
#>     <int>            <char>  <char>        <char> <char>      <char>
#> 1:      0 2025_07_24_111336 ssbyrne 2024_02_01.01 create log created

Produce Model Results

Now let’s make some files representing models in this folder.

# Make some dummy files
fnames_my_models <- paste0("my_model_", 1:5, ".csv")
invisible(file.create(file.path(root_dv1, fnames_my_models)))
print_tree(output_root)
#> |-- 2024_02_01.01
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> `-- log_symlinks_central.csv

Mark Best

We like the models! We want to elevate this run version folder to best_ status.

Note: All mark_xxxx operations require a user entry as a named list.

# Mark best, and take note of messaging
slt_prep$mark_best(version_name = date_vers1,
                   user_entry   = list(comment = "Best model GBD2023"))
#> Marking best: 2024_02_01.01
#> No existing symlinks found - moving on
#> No 'best' symlink found - moving on: /tmp/Rtmp3tDGBK/slt/output_root/best
#> Promoting to 'best': /tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.01
#>   Writing log to /tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.01/logs/log_version_history.csv
#>   Writing central log to /tmp/Rtmp3tDGBK/slt/output_root/log_symlinks_central.csv

Inspect both the central log and …

#>    log_id         timestamp    user  version_name       action            comment
#>     <int>            <char>  <char>        <char>       <char>             <char>
#> 1:      0 2025_07_24_111336 ssbyrne   CENTRAL_LOG       create        log created
#> 2:      1 2025_07_24_111336 ssbyrne 2024_02_01.01 promote_best Best model GBD2023

…the run version folder log.

#>    log_id         timestamp    user  version_name       action            comment
#>     <int>            <char>  <char>        <char>       <char>             <char>
#> 1:      0 2025_07_24_111336 ssbyrne 2024_02_01.01       create        log created
#> 2:      1 2025_07_24_111336 ssbyrne 2024_02_01.01 promote_best Best model GBD2023

We now have a ‘best’ symlink that points to our ‘best’ run version, 2024_02_01.01

print_tree(output_root)
#> |-- 2024_02_01.01
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- best
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- log_symlinks_central.csv
#> `-- report_key_versions.csv

resolve_symlink(file.path(output_root, "best"))
#> [1] "/tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.01"

New Pipeline Runs

Since we run our pipelines many times, we want to track those runs.

Run the pipeline two more times on the same day, inspect the models, and make a human decision about the result quality.

  • Use the helper function to increment pipeline run versions.
# Second run
date_vers2 <- get_output_dir(output_root, "2024_02_01")
slt_prep$make_new_version_folder(version_name = date_vers2)

# note - the dynamic fields update when you make new folders, so we won't see the dv1 path anymore
root_dv2   <- slt_prep$return_dynamic_fields()$VERS_PATHS
invisible(file.create(file.path(root_dv2, fnames_my_models)))

# Third run
date_vers3 <- get_output_dir(output_root, "2024_02_01")
slt_prep$make_new_version_folder(version_name = date_vers3)
root_dv3   <- slt_prep$return_dynamic_fields()$VERS_PATHS
invisible(file.create(file.path(root_dv3, fnames_my_models)))

Now let’s look at our file output structure, and central log.

  • We see three total folders, and the central log hasn’t changed yet, because we haven’t done any more ‘marking’.
print_tree(output_root)
#> |-- 2024_02_01.01
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- 2024_02_01.02
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- 2024_02_01.03
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- best
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- log_symlinks_central.csv
#> `-- report_key_versions.csv
#>    log_id         timestamp    user  version_name       action            comment
#>     <int>            <char>  <char>        <char>       <char>             <char>
#> 1:      0 2025_07_24_111336 ssbyrne   CENTRAL_LOG       create        log created
#> 2:      1 2025_07_24_111336 ssbyrne 2024_02_01.01 promote_best Best model GBD2023

Mark New Best

After inspecting our results, we decide the third run is actually the best_.

  • Note: In the messaging - the first version was automatically demoted from best_ status.
# Mark best, and take note of messaging
slt_prep$mark_best(version_name = date_vers3,
                   user_entry   = list(comment = "New best model GBD2023"))
#> Marking best: 2024_02_01.03
#> No existing symlinks found - moving on
#> Demoting from 'best': /tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.01
#>   Writing log to /tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.01/logs/log_version_history.csv
#>   Writing central log to /tmp/Rtmp3tDGBK/slt/output_root/log_symlinks_central.csv
#> Promoting to 'best': /tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.03
#>   Writing log to /tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.03/logs/log_version_history.csv
#>   Writing central log to /tmp/Rtmp3tDGBK/slt/output_root/log_symlinks_central.csv

Inspect the central log - The third version is now bested.

#>    log_id         timestamp    user  version_name       action                comment
#>     <int>            <char>  <char>        <char>       <char>                 <char>
#> 1:      0 2025_07_24_111336 ssbyrne   CENTRAL_LOG       create            log created
#> 2:      1 2025_07_24_111336 ssbyrne 2024_02_01.01 promote_best     Best model GBD2023
#> 3:      2 2025_07_24_111337 ssbyrne 2024_02_01.01  demote_best New best model GBD2023
#> 4:      3 2025_07_24_111337 ssbyrne 2024_02_01.03 promote_best New best model GBD2023

Note: Multiple “marks” on the same folder will produce no results (but reports will still run)

slt_prep$mark_best(version_name = date_vers3,
                   user_entry   = list(comment = "New best model GBD2023"))
#> Marking best: 2024_02_01.03
#> /tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.03 - already marked best - moving on.

Let’s also take a look inside each of the run version folder logs.

  • Run-version logs are the ‘source of truth’ for the folder status.
    • They have much more detail.
    • The central log is meant to be concise
  • The first run folder was demoted from best automatically, and the third version was marked as best.
    • This is also show in the file tree, and the best symlink points to the third pipeline run.

Looking at all three run-version logs we see:

#>    log_id         timestamp    user  version_name       action                comment
#>     <int>            <char>  <char>        <char>       <char>                 <char>
#> 1:      0 2025_07_24_111336 ssbyrne 2024_02_01.01       create            log created
#> 2:      1 2025_07_24_111336 ssbyrne 2024_02_01.01 promote_best     Best model GBD2023
#> 3:      2 2025_07_24_111337 ssbyrne 2024_02_01.01  demote_best New best model GBD2023
#>    log_id         timestamp    user  version_name action     comment
#>     <int>            <char>  <char>        <char> <char>      <char>
#> 1:      0 2025_07_24_111336 ssbyrne 2024_02_01.02 create log created
#>    log_id         timestamp    user  version_name       action                comment
#>     <int>            <char>  <char>        <char>       <char>                 <char>
#> 1:      0 2025_07_24_111336 ssbyrne 2024_02_01.03       create            log created
#> 2:      1 2025_07_24_111337 ssbyrne 2024_02_01.03 promote_best New best model GBD2023
print_tree(output_root)
#> |-- 2024_02_01.01
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- 2024_02_01.02
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- 2024_02_01.03
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- best
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- log_symlinks_central.csv
#> `-- report_key_versions.csv

resolve_symlink(file.path(output_root, "best"))
#> [1] "/tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.03"

Mark Keep

We want to keep the first run, even though it’s not the best anymore.

# Mark keep, and take note of messaging
slt_prep$mark_keep(
   version_name = date_vers1,
   user_entry   = list(comment = "Previous best")
)
#> No existing symlinks found - moving on
#> Promoting to 'keep': /tmp/Rtmp3tDGBK/slt/output_root/keep_2024_02_01.01
#>   Writing log to /tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.01/logs/log_version_history.csv
#>   Writing central log to /tmp/Rtmp3tDGBK/slt/output_root/log_symlinks_central.csv

The first version is now marked as keep.

#>    log_id         timestamp    user  version_name       action                comment
#>     <int>            <char>  <char>        <char>       <char>                 <char>
#> 1:      0 2025_07_24_111336 ssbyrne   CENTRAL_LOG       create            log created
#> 2:      1 2025_07_24_111336 ssbyrne 2024_02_01.01 promote_best     Best model GBD2023
#> 3:      2 2025_07_24_111337 ssbyrne 2024_02_01.01  demote_best New best model GBD2023
#> 4:      3 2025_07_24_111337 ssbyrne 2024_02_01.03 promote_best New best model GBD2023
#> 5:      4 2025_07_24_111337 ssbyrne 2024_02_01.01 promote_keep          Previous best

Note: Marking a folder keep_ does not make it unique, like best_. Many folders can be marked keep_.

#>    log_id         timestamp    user  version_name       action                comment
#>     <int>            <char>  <char>        <char>       <char>                 <char>
#> 1:      0 2025_07_24_111336 ssbyrne 2024_02_01.01       create            log created
#> 2:      1 2025_07_24_111336 ssbyrne 2024_02_01.01 promote_best     Best model GBD2023
#> 3:      2 2025_07_24_111337 ssbyrne 2024_02_01.01  demote_best New best model GBD2023
#> 4:      3 2025_07_24_111337 ssbyrne 2024_02_01.01 promote_keep          Previous best
print_tree(output_root)
#> |-- 2024_02_01.01
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- 2024_02_01.02
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- 2024_02_01.03
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- best
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- keep_2024_02_01.01
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- log_symlinks_central.csv
#> `-- report_key_versions.csv

resolve_symlink(file.path(output_root, "keep_2024_02_01.01"))
#> [1] "/tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.01"

Mark Remove

We want to remove the second run, because the model was experimental, or performed poorly.

# Mark remove, and take note of messaging
slt_prep$mark_remove(
   version_name = date_vers2,
   user_entry   = list(comment = "Obsolete dev folder"))
#> No existing symlinks found - moving on
#> Promoting to 'remove': /tmp/Rtmp3tDGBK/slt/output_root/remove_2024_02_01.02
#>   Writing log to /tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.02/logs/log_version_history.csv
#>   Writing central log to /tmp/Rtmp3tDGBK/slt/output_root/log_symlinks_central.csv

Inspect the central log - The second version is now marked as remove_.

#>    log_id         timestamp    user  version_name         action                comment
#>     <int>            <char>  <char>        <char>         <char>                 <char>
#> 1:      0 2025_07_24_111336 ssbyrne   CENTRAL_LOG         create            log created
#> 2:      1 2025_07_24_111336 ssbyrne 2024_02_01.01   promote_best     Best model GBD2023
#> 3:      2 2025_07_24_111337 ssbyrne 2024_02_01.01    demote_best New best model GBD2023
#> 4:      3 2025_07_24_111337 ssbyrne 2024_02_01.03   promote_best New best model GBD2023
#> 5:      4 2025_07_24_111337 ssbyrne 2024_02_01.01   promote_keep          Previous best
#> 6:      5 2025_07_24_111337 ssbyrne 2024_02_01.02 promote_remove    Obsolete dev folder
print_tree(output_root)
#> |-- 2024_02_01.01
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- 2024_02_01.02
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- 2024_02_01.03
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- best
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- keep_2024_02_01.01
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- log_symlinks_central.csv
#> |-- remove_2024_02_01.02
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> `-- report_key_versions.csv

resolve_symlink(file.path(output_root, "remove_2024_02_01.02"))
#> [1] "/tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.02"

Delete Folders

Now that we have marked the second run as remove_, we can use the Symlink Tool to delete the folders.

First, we’ll find (roundup) all our remove_ folders.

(dt_to_remove <- slt_prep$roundup_remove())
#> $output_root
#>     version_name                                             dir_name                             dir_name_resolved
#>           <char>                                               <char>                                        <char>
#> 1: 2024_02_01.02 /tmp/Rtmp3tDGBK/slt/output_root/remove_2024_02_01.02 /tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.02

Next, we can handle them any way we choose. For this demonstration, we’ll delete them.

for(dir_dv_remove in dt_to_remove$output_root$version_name){
   slt_prep$delete_version_folders(
      version_name       = dir_dv_remove,
      user_entry         = list(comment = "Deleting dev folder"),
      require_user_input = FALSE
   )
}
#> 
#>   Writing central log to /tmp/Rtmp3tDGBK/slt/output_root/log_symlinks_central.csv
#> Deleting /tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.02
#> Deleting /tmp/Rtmp3tDGBK/slt/output_root/remove_2024_02_01.02

# The default setting prompts user input, but the process can be automated, as for this vignette.
# 
# Do you want to delete the following folders?
#   /tmp/RtmpRmKCTu/slt/output_root/2024_02_01.02
#   /tmp/RtmpRmKCTu/slt/output_root/remove_2024_02_01.02 
# 
# 1: No
# 2: Yes

Check the central log - since the folder is gone, this will maintain a record of when this folder was deleted.

#>    log_id         timestamp    user  version_name               action                comment
#>     <int>            <char>  <char>        <char>               <char>                 <char>
#> 1:      0 2025_07_24_111336 ssbyrne   CENTRAL_LOG               create            log created
#> 2:      1 2025_07_24_111336 ssbyrne 2024_02_01.01         promote_best     Best model GBD2023
#> 3:      2 2025_07_24_111337 ssbyrne 2024_02_01.01          demote_best New best model GBD2023
#> 4:      3 2025_07_24_111337 ssbyrne 2024_02_01.03         promote_best New best model GBD2023
#> 5:      4 2025_07_24_111337 ssbyrne 2024_02_01.01         promote_keep          Previous best
#> 6:      5 2025_07_24_111337 ssbyrne 2024_02_01.02       promote_remove    Obsolete dev folder
#> 7:      6 2025_07_24_111337 ssbyrne 2024_02_01.02 delete_remove_folder    Deleting dev folder

Reports

Note: As soon as we marked a folder, there was a report ready in our folder. The report_key_versions.csv file will scan every run-version with a Tool-created Symlink for a log, and show its last row (current status).

(data.table::fread(file.path(output_root, "report_key_versions.csv")))
#>    log_id         timestamp    user  version_name                                  version_path       action                comment
#>     <int>            <char>  <char>        <char>                                        <char>       <char>                 <char>
#> 1:      1 2025_07_24_111337 ssbyrne 2024_02_01.03 /tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.03 promote_best New best model GBD2023
#> 2:      3 2025_07_24_111337 ssbyrne 2024_02_01.01 /tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.01 promote_keep          Previous best

We can generate more reports of the pipeline runs, and the status of the folders based on different needs. These reports are useful for tracking the status of the pipeline runs, and for making decisions about which folders to keep, delete, or promote.

# Generate reports
slt_prep$make_reports()
#> Writing last-row log reports for:
#>   /tmp/Rtmp3tDGBK/slt/output_root
#>   /tmp/Rtmp3tDGBK/slt/output_root
print_tree(output_root)
#> |-- 2024_02_01.01
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- 2024_02_01.03
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- best
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- keep_2024_02_01.01
#> |  |-- logs
#> |  |  `-- log_version_history.csv
#> |  |-- my_model_1.csv
#> |  |-- my_model_2.csv
#> |  |-- my_model_3.csv
#> |  |-- my_model_4.csv
#> |  `-- my_model_5.csv
#> |-- log_symlinks_central.csv
#> |-- report_all_logs.csv
#> |-- report_all_logs_non_symlink.csv
#> |-- report_all_logs_symlink.csv
#> `-- report_key_versions.csv

The report_all_logs.csv file will scan every run-version for a log, and show its last row (current status).


(data.table::fread(file.path(output_root, "report_all_logs.csv")))
#>    log_id         timestamp    user  version_name                                  version_path       action                comment
#>     <int>            <char>  <char>        <char>                                        <char>       <char>                 <char>
#> 1:      3 2025_07_24_111337 ssbyrne 2024_02_01.01 /tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.01 promote_keep          Previous best
#> 2:      1 2025_07_24_111337 ssbyrne 2024_02_01.03 /tmp/Rtmp3tDGBK/slt/output_root/2024_02_01.03 promote_best New best model GBD2023

Two other reports sometimes diagnostically helpful are:

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.