Zulip Chat Archive

Stream: lean4

Topic: New recommended default setup for doc-gen4


Henrik Böving (Nov 11 2024 at 09:11):

Given that people seem to be struggling with the previously recommended doc-gen setup and converging to the one that we've been using to build mathlib for a while I changed the recommended doc-gen default setup: https://github.com/leanprover/doc-gen4?tab=readme-ov-file#usage.

This is probably of interest to at least @Pietro Monticone for blue prints and potentially @François G. Dorais who is working on something like this in batteries somewhere afaik?

Yaël Dillies (Nov 11 2024 at 09:19):

Amazing! Will try it out

Kim Morrison (Nov 11 2024 at 09:55):

@François G. Dorais, when you have a moment would you mind comparing your batteries#1028 against Henrik's linked write up above?

François G. Dorais (Nov 11 2024 at 10:21):

@Kim Morrison They're essentially the same. The only difference I additionally use the build directory "." to avoid moving the doc directories before deploying to github pages.

Pietro Monticone (Nov 11 2024 at 12:31):

Thank you. I’ll integrate it in LeanProject and LeanBlueprint when I find the time.

Pietro Monticone (Nov 11 2024 at 14:44):

Working on these draft PRs that needs to be compatible:

Pietro Monticone (Nov 11 2024 at 16:50):

@Henrik Böving @Kim Morrison would this docbuild setup imply 10GB per Lean project?

With two nested projects we are doubling the memory required, right? Am I missing something?

Henrik Böving (Nov 11 2024 at 16:56):

We're not doubling anything. The nested project automatically reuses build artifacts from its parent. The only change is that if you actually decide to build the nested project you pull in doc-gen etc and put the docs there. As long as a user doesnt build docs locally this is a noop

Pietro Monticone (Nov 11 2024 at 16:57):

But it would be a problem for github actions, right?

Pietro Monticone (Nov 11 2024 at 16:59):

I'm saying this because I tested the new setup on a project, adapted the blueprint workflow accordingly and I got no space left on device indicating that the Docker container does not have sufficient disk space to complete the pull and extraction of the texlive-full image in the "Build blueprint and copy to home_page/blueprint" step of the "Compile Blueprint" workflow.

image

Henrik Böving (Nov 11 2024 at 17:06):

Afaict nothing in that CI screen shot is even close to do anything with doc-gen?

Pietro Monticone (Nov 11 2024 at 17:20):

I will investigate it better later today. Thanks.

Pietro Monticone (Nov 11 2024 at 17:30):

I followed the instructions here.

However, when I run lake update within the docbuild directory, it generates a .lake folder containing mathlib which is approximately 5 GB in size.

Henrik Böving (Nov 11 2024 at 17:32):

Hm, let's see. @Mac Malone if we have nested lake projects to the child projects properly reuse build artifacts from the other ones?

Mac Malone (Nov 11 2024 at 17:38):

@Henrik Böving Different workspaces do not share dependencies, no. (There is, after all, no guarentee they use they same version of the dependencies.)

Henrik Böving (Nov 11 2024 at 17:41):

Mac Malone said:

Henrik Böving Different workspaces do not share dependencies, no. (There is, after all, no guarentee they use they same version of the dependencies.)

Is there a way we could make them share build artefacts if they are common easily?

Henrik Böving (Nov 11 2024 at 17:41):

I imagine we might be able to just symlink .lake?

Mac Malone (Nov 11 2024 at 17:43):

One could use symlinks for .lake/packages/<shared-package>.

Henrik Böving (Nov 11 2024 at 17:43):

Great

Henrik Böving (Nov 11 2024 at 17:44):

@Pietro Monticone in that case the CI script should create docbuild/.lake/packages on it's own and then generate a symlink from .lake/packages/<package-name> to docbuild/.lake/packages/<package-name> and you'll get the desired sharing effects.

Henrik Böving (Nov 11 2024 at 17:47):

I'll add a note for that in the docs

Pietro Monticone (Nov 11 2024 at 17:49):

Ok, I'll take a look at it later. Thanks.

Pietro Monticone (Nov 11 2024 at 17:50):

What should I do locally?

Henrik Böving (Nov 11 2024 at 18:25):

@Pietro Monticone I updated the notes in doc-gen's README, it worked for me locally with mathlib and its dependencies, please do tell if it doesn't in your setup

Pietro Monticone (Nov 11 2024 at 18:37):

Yes, it worked locally for me too. Thanks.

Pietro Monticone (Nov 11 2024 at 20:43):

I have just tested on the project mentioned above and everything works as expected.

Pietro Monticone (Nov 11 2024 at 21:44):

Tested on Carleson too :check:

François G. Dorais (Nov 11 2024 at 22:54):

@Mac Malone What goes wrong if the parent package directory is used for both? Since the main is required by path ".." there shouldn't be any conflicts?

François G. Dorais (Nov 12 2024 at 00:13):

I've had success using:

name = "docbuild"
reservoir = false
buildDir = "."
packagesDir = "../.lake/packages"

[[require]]
name = "doc-gen4"
git = "https://github.com/leanprover/doc-gen4"
rev = "main"

[[require]]
name = "my-lib"
path = ".."

That way both the main and docbuild packages share the same packages directory, avoiding any duplication.

The buildDir = "." puts doc and doc-data directly in the docbuild directory and results in no .lake directory at all in docbuild.

François G. Dorais (Nov 12 2024 at 00:14):

@Mac Malone does this seem sound?

Mac Malone (Nov 12 2024 at 00:18):

@François G. Dorais Looks reasonable to me. I honestly forgot that configuring the packages directory is one way to share packages.

François G. Dorais (Nov 12 2024 at 00:27):

Thanks @Mac Malone! Also, should the require order be my-lib first and then doc-gen4 or the other way around? I always forget which one gets priority...

Mac Malone (Nov 12 2024 at 06:09):

@François G. Dorais Currently the first gets priority, in the next release it will be the last. It probably doesn't matter in this case.

Henrik Böving (Nov 12 2024 at 07:12):

Ah great, I shall change the doc-gen setup in the README to that then

Henrik Böving (Nov 12 2024 at 08:41):

Okay I pushed another update to the README, there is one thing to keep in mind with respect to lake update that I noted there. @François G. Dorais @Pietro Monticone

Pietro Monticone (Nov 12 2024 at 14:00):

Great, I will adapt the workflows accordingly later today.

Pietro Monticone (Nov 12 2024 at 16:00):

I followed the instructions here, but when I run lake update within docbuild I get the following error:

uncaught exception: no such file or directory (error code: 2)
  file: .lake/packages/mathlib/lakefile.lean
info: docbuild: no previous manifest, creating one from scratch
info: leanprover/doc-gen4: cloning https://github.com/leanprover/doc-gen4 to '././../.lake/packages/doc-gen4'
info: MD4Lean: cloning https://github.com/acmepjz/md4lean to '././../.lake/packages/MD4Lean'
info: BibtexQuery: cloning https://github.com/dupuisf/BibtexQuery to '././../.lake/packages/BibtexQuery'
info: UnicodeBasic: cloning https://github.com/fgdorais/lean4-unicode-basic to '././../.lake/packages/UnicodeBasic'
info: mathlib: running post-update hooks
error: mathlib: failed to fetch cache

Henrik Böving (Nov 12 2024 at 16:01):

Ah this is for one a bug in the mathlibs cripts

Henrik Böving (Nov 12 2024 at 16:01):

but also a bug in the guide, you probably only want to run lake update doc-gen4

Henrik Böving (Nov 12 2024 at 16:01):

Then mathlib should not get touched I guess?

Pietro Monticone (Nov 12 2024 at 16:01):

I did lake update MyLib and it worked.

Henrik Böving (Nov 12 2024 at 16:02):

What is MyLib and where did you run it

Pietro Monticone (Nov 12 2024 at 16:02):

No, sorry. It didn't...

Let me try with lake update doc-gen4

Henrik Böving (Nov 12 2024 at 16:03):

If you are in docbuild and only run lake update doc-gen4 it should hopefully not touch mathlib?

Pietro Monticone (Nov 12 2024 at 16:03):

Nope, same error:

uncaught exception: no such file or directory (error code: 2)
  file: .lake/packages/mathlib/lakefile.lean
info: docbuild: no previous manifest, creating one from scratch
info: mathlib: running post-update hooks
error: mathlib: failed to fetch cache

Henrik Böving (Nov 12 2024 at 16:04):

Yeah then that's a bug mathlib has to fix

Henrik Böving (Nov 12 2024 at 16:04):

At least that is my best guess

Henrik Böving (Nov 12 2024 at 16:04):

I assume a mathlib script here has hardcoded the access path to the lakefile.lean and that is wrong

Henrik Böving (Nov 12 2024 at 16:05):

Hm though I don't see it through immediate grep, though it is quite suspicious that it only affects mathlib. just doing this docbuild setup within mathlib doesn't break any of its dependencies in this way

Henrik Böving (Nov 12 2024 at 16:05):

so it is certainly something specific to the mathlib setup

Henrik Böving (Nov 12 2024 at 16:10):

@Pietro Monticone can you reproduce the issue when doing this inside of a mathlib checkout? I can't

Henrik Böving (Nov 12 2024 at 16:10):

If not it is related to some mathlib script that is running and someone that knows those scripts should probably look at it

Pietro Monticone (Nov 12 2024 at 16:16):

No, inside a mathlib checkout I don't get any errors:

Decompressing 9 file(s)
Unpacked in 2980 ms
Completed successfully!
info: docbuild: no previous manifest, creating one from scratch
info: leanprover/doc-gen4: cloning https://github.com/leanprover/doc-gen4 to '././../.lake/packages/doc-gen4'
info: MD4Lean: cloning https://github.com/acmepjz/md4lean to '././../.lake/packages/MD4Lean'
info: BibtexQuery: cloning https://github.com/dupuisf/BibtexQuery to '././../.lake/packages/BibtexQuery'
info: UnicodeBasic: cloning https://github.com/fgdorais/lean4-unicode-basic to '././../.lake/packages/UnicodeBasic'
info: mathlib: running post-update hooks

Henrik Böving (Nov 12 2024 at 16:17):

Right, in that case it is most likely a location in mathlib that does not respect packagesDir and instead blindly grabs into .lake/packages

Henrik Böving (Nov 12 2024 at 16:18):

Hm, maybe https://github.com/leanprover-community/mathlib4/blob/master/Cache/IO.lean#L81-L82 but I don't have any insight into what mathlib runs upon a lake update

Henrik Böving (Nov 12 2024 at 16:20):

@Mario Carneiro if we run a lake update in a project that depends on mathlib, does that automatically trigger a lake exe cache or some other mathlib script that could potentially blindly grab into .lake/packages instead of respecting the packagesDirentry in the lake-manifest.json in the directory that it is being called in?

Pietro Monticone (Nov 12 2024 at 16:20):

Oh, yes. It does.

Pietro Monticone (Nov 12 2024 at 16:21):

I remember seeing it once a few months ago.

Ruben Van de Velde (Nov 12 2024 at 16:21):

Yes, this is in mathlib's lakefile.lean

Ruben Van de Velde (Nov 12 2024 at 16:21):

/--
When a package depending on Mathlib updates its dependencies,
update its toolchain to match Mathlib's and fetch the new cache.
-/
post_update pkg do
  let rootPkg  getRootPackage
  if rootPkg.name = pkg.name then
    return -- do not run in Mathlib itself
  /-
  Once Lake updates the toolchains,
  this toolchain copy will be unnecessary.
  https://github.com/leanprover/lean4/issues/2752
  -/
  let wsToolchainFile := rootPkg.dir / "lean-toolchain"
  let mathlibToolchain :=  IO.FS.readFile <| pkg.dir / "lean-toolchain"
  IO.FS.writeFile wsToolchainFile mathlibToolchain
  if ( IO.getEnv "MATHLIB_NO_CACHE_ON_UPDATE") != some "1" then
    /-
    Instead of building and running cache via the Lake API,
    spawn a new `lake` since the toolchain may have changed.
    -/
    let exitCode  IO.Process.spawn {
      cmd := "elan"
      args := #["run", "--install", mathlibToolchain.trim, "lake", "exe", "cache", "get"]
    } >>= (·.wait)
    if exitCode  0 then
      logError s!"{pkg.name}: failed to fetch cache"

Henrik Böving (Nov 12 2024 at 16:21):

right

Henrik Böving (Nov 12 2024 at 16:22):

https://github.com/leanprover-community/mathlib4/blob/master/Cache/IO.lean#L81-L82 then this line needs to be fixed to respect the lake manifest.

Henrik Böving (Nov 12 2024 at 16:31):

I'm feeling a little uncertain about recommending this setup publicly now tbh, it seems the eco system is not at the point yet where we can just do fancy things like this in the lakefile without breakages :/

Henrik Böving (Nov 12 2024 at 17:36):

Ruben Van de Velde said:

/--
When a package depending on Mathlib updates its dependencies,
update its toolchain to match Mathlib's and fetch the new cache.
-/
post_update pkg do
  let rootPkg  getRootPackage
  if rootPkg.name = pkg.name then
    return -- do not run in Mathlib itself
  /-
  Once Lake updates the toolchains,
  this toolchain copy will be unnecessary.
  https://github.com/leanprover/lean4/issues/2752
  -/
  let wsToolchainFile := rootPkg.dir / "lean-toolchain"
  let mathlibToolchain :=  IO.FS.readFile <| pkg.dir / "lean-toolchain"
  IO.FS.writeFile wsToolchainFile mathlibToolchain
  if ( IO.getEnv "MATHLIB_NO_CACHE_ON_UPDATE") != some "1" then
    /-
    Instead of building and running cache via the Lake API,
    spawn a new `lake` since the toolchain may have changed.
    -/
    let exitCode  IO.Process.spawn {
      cmd := "elan"
      args := #["run", "--install", mathlibToolchain.trim, "lake", "exe", "cache", "get"]
    } >>= (·.wait)
    if exitCode  0 then
      logError s!"{pkg.name}: failed to fetch cache"

Thinking some more about this. It would most likely be even better if the specific lake update in question here just doesnt trigger this post update hook as it doesnt actually update mathlib. But I guess that requires additional lake support

François G. Dorais (Nov 12 2024 at 19:09):

Maybe a temporary patch for packages that depend on mathlib is to add a symlink from .lake/build pointing to ../.lake/build?

Henrik Böving (Nov 12 2024 at 19:14):

What's the issue with fixing the cache script? That sounds doable doesn't it?

François G. Dorais (Nov 12 2024 at 19:16):

I think so but I don't really have the bandwidth right now. Something like how I patched doc-gen4 should work.

François G. Dorais (Nov 12 2024 at 19:17):

(In other words, have the get functions take an optional --build argument specifying the build directory.)

François G. Dorais (Nov 12 2024 at 19:20):

Or adding instructions to set MATHLIB_NO_CACHE_ON_UPDATE=1 before building docs?

Mac Malone (Nov 13 2024 at 01:18):

Henrik Böving said:

I'm feeling a little uncertain about recommending this setup publicly now tbh, it seems the eco system is not at the point yet where we can just do fancy things like this in the lakefile without breakages :/

I think there is two sides to this. On one hand, cache will hopefully be eventually integrated with Lake and thus not overassume like this (preventing the breakage). On the other hand, having more packages which do fancy things helps discourage writing tools that overassume structure (as they will break).

François G. Dorais (Nov 13 2024 at 02:08):

I originally misread your second sentence. Yes, I agree with you.

François G. Dorais (Nov 13 2024 at 02:13):

Maybe there could be a curated collection of lake scripts somewhere.

Yaël Dillies (Nov 28 2024 at 11:31):

I am rereading this thread now, and my sentiment of whether I should switch my projects over to the new setup is: "Maybe, maybe not?". Am I right in my analysis? Did I miss any development in the past two weeks or so?

Mac Malone (Nov 29 2024 at 17:20):

As François hinted at, the Mathlib error can be avoided with the following:

MATHLIB_NO_CACHE_ON_UPDATE=1 lake update

Improvements to Lake / Mahtlib Cache which will remove the need for this workaround will come down the line, but this is currently a quick way to solve the isssue. It is also probably worth noting that the failure of a post-update hook does not actually prevent the underlying update from succeeding (as they are run after the update). So one can also just ignore the error.

Yaël Dillies (Jan 17 2025 at 09:24):

Could we get instructions for how to bump mathlib with this new setup? I find it hard to get right

Yaël Dillies (Jan 17 2025 at 09:25):

Here is what I've tried (running in the root folder):

lake update mathlib
cd docbuild
lake update doc-gen4
cd ..

Yaël Dillies (Jan 17 2025 at 09:27):

In APAP, the second lake update fails with

info: toolchain not updated; already up-to-date
warning: ././../.lake/packages/doc-gen4/lakefile.lean:141:2: warning: `Lake.Job.bindSync` has been deprecated: use `Lake.Job.mapM` instead

error: ././../.lake/packages/doc-gen4/lakefile.lean:142:29: error: type mismatch
  tryJson <|> tryBib <|> tryBibFailed
has type
  JobM (Array String × BuildTrace) : outParam Type
but is expected to have type
  EStateT Log.Pos JobState BaseIO ?m.6450 : Type

error: ././../.lake/packages/doc-gen4/lakefile.lean:143:20: error: invalid field 'mix', the environment does not contain 'Lake.BuildContext.mix'
  exeTrace
has type
  BuildContext

warning: ././../.lake/packages/doc-gen4/lakefile.lean:144:16: warning: `Lake.buildFileUnlessUpToDate` has been deprecated: use `Lake.buildFileUnlessUpToDate'` instead

error: ././../.lake/packages/doc-gen4/lakefile.lean:144:16: error: type mismatch
  buildFileUnlessUpToDate outputFile depTrace do
    let __do_lift  getAugmentedEnv
    liftM
        (proc
          { stdin := IO.Process.Stdio.inherit, stdout := IO.Process.Stdio.inherit, stderr := IO.Process.Stdio.inherit,
            cmd := exeFile.toString, args := #["bibPrepass"] ++ args, cwd := none, env := __do_lift, setsid := false })
has type
  JobM BuildTrace : Type
but is expected to have type
  EStateT Log.Pos JobState BaseIO ?m.7717 : Type

error: ././../.lake/packages/doc-gen4/lakefile.lean:150:11: error: application type mismatch
  pure (outputFile, trace)
argument
  (outputFile, trace)
has type
  FilePath × ?m.7702 : Type
but is expected to have type
  FilePath : Type

error: ././../.lake/packages/doc-gen4/lakefile.lean:154:22: error: failed to synthesize
  FamilyOut CustomData (bibPrepass.pkg, bibPrepass.name) ?m.9372
Additional diagnostic information may be available using the `set_option diagnostics true` command.

warning: ././../.lake/packages/doc-gen4/lakefile.lean:158:19: warning: `Lake.BuildJob.mixArray` has been deprecated: use `Lake.Job.mixArray` instead

warning: ././../.lake/packages/doc-gen4/lakefile.lean:162:2: warning: `Lake.BuildJob.bindAsync` has been deprecated: use `Lake.Job.bindM` instead

error: ././../.lake/packages/doc-gen4/lakefile.lean:163:4: error: invalid field notation, type is not of the form (C ...) where C is a constant
  bibPrepassJob
has type
  ?m.11853 mod exeJob

warning: ././../.lake/packages/doc-gen4/lakefile.lean:176:49: warning: `Lake.BuildJob` has been deprecated: use `Lake.Job` instead

error: ././../.lake/packages/doc-gen4/lakefile.lean:178:22: error: failed to synthesize
  FamilyOut CustomData (bibPrepass.pkg, bibPrepass.name) ?m.11995
Additional diagnostic information may be available using the `set_option diagnostics true` command.

error: ././../.lake/packages/doc-gen4/lakefile.lean:182:2: error: invalid field notation, type is not of the form (C ...) where C is a constant
  bibPrepassJob
has type
  ?m.13321 exeJob

warning: ././../.lake/packages/doc-gen4/lakefile.lean:195:2: warning: `Lake.BuildJob.mixArray` has been deprecated: use `Lake.Job.mixArray` instead

warning: ././../.lake/packages/doc-gen4/lakefile.lean:199:19: warning: `Lake.BuildJob.mixArray` has been deprecated: use `Lake.Job.mixArray` instead

warning: ././../.lake/packages/doc-gen4/lakefile.lean:226:2: warning: `Lake.Job.bindAsync` has been deprecated: use `Lake.Job.bindM` instead

warning: ././../.lake/packages/doc-gen4/lakefile.lean:227:4: warning: `Lake.Job.bindAsync` has been deprecated: use `Lake.Job.bindM` instead

warning: ././../.lake/packages/doc-gen4/lakefile.lean:228:6: warning: `Lake.BuildJob.bindSync` has been deprecated: use `Lake.Job.mapM` instead

error: ././../.lake/packages/doc-gen4/lakefile.lean:229:52: error: application type mismatch
  List.cons exeTrace
argument
  exeTrace
has type
  BuildContext : Type
but is expected to have type
  BuildTrace : Type

error: ././../.lake/packages/doc-gen4/lakefile.lean:229:62: error: application type mismatch
  List.cons coreInputTrace
argument
  coreInputTrace
has type
  BuildContext : Type
but is expected to have type
  BuildTrace : Type

warning: ././../.lake/packages/doc-gen4/lakefile.lean:230:20: warning: `Lake.buildFileUnlessUpToDate` has been deprecated: use `Lake.buildFileUnlessUpToDate'` instead

warning: ././../.lake/packages/doc-gen4/lakefile.lean:243:19: warning: `Lake.BuildJob.mixArray` has been deprecated: use `Lake.Job.mixArray` instead

warning: ././../.lake/packages/doc-gen4/lakefile.lean:250:2: warning: `Lake.Job.bindAsync` has been deprecated: use `Lake.Job.bindM` instead

warning: ././../.lake/packages/doc-gen4/lakefile.lean:251:3: warning: `Lake.Job.bindAsync` has been deprecated: use `Lake.Job.bindM` instead

warning: ././../.lake/packages/doc-gen4/lakefile.lean:252:6: warning: `Lake.BuildJob.bindSync` has been deprecated: use `Lake.Job.mapM` instead

error: ././../.lake/packages/doc-gen4/lakefile.lean:253:52: error: application type mismatch
  List.cons exeTrace
argument
  exeTrace
has type
  BuildContext : Type
but is expected to have type
  BuildTrace : Type

error: ././../.lake/packages/doc-gen4/lakefile.lean:253:62: error: application type mismatch
  List.cons coreInputTrace
argument
  coreInputTrace
has type
  BuildContext : Type
but is expected to have type
  BuildTrace : Type

warning: ././../.lake/packages/doc-gen4/lakefile.lean:254:20: warning: `Lake.buildFileUnlessUpToDate` has been deprecated: use `Lake.buildFileUnlessUpToDate'` instead

error: ././../.lake/packages/doc-gen4/lakefile.lean: package configuration has errors

Yaël Dillies (Jan 17 2025 at 09:54):

Sorry to be annoying, but Kim has repeatedly asked me to switch from a setup that worked (for me) to a setup that doesn't work (for me) and now my projects are broken :sad: What am I supposed to be doing?

Henrik Böving (Jan 17 2025 at 10:02):

You pinned doc-gen to v4.15 in your lakefile.toml, that version has to be pulled up as you upgrade of course (as noted in the README I might add)

Henrik Böving (Jan 17 2025 at 10:03):

The error you are observing is just the recent lake refactoring that went down in 4.16 that broke what doc-gen did so far in 4.15 unfortunately

Yaël Dillies (Jan 17 2025 at 10:04):

Henrik Böving said:

You pinned doc-gen to v4.15 in your lakefile.toml, that version has to be pulled up as you upgrade of course (as noted in the README I might add)

Yeah, I noticed that just now

Yaël Dillies (Jan 17 2025 at 10:04):

Henrik Böving said:

The error you are observing is just the recent lake refactoring that went down in 4.16 that broke what doc-gen did so far in 4.15 unfortunately

Are you saying that even if I unpin the doc-gen version, my build will fail?

Henrik Böving (Jan 17 2025 at 10:05):

No it is fixed in the v4.16 on doc-gen

Henrik Böving (Jan 17 2025 at 10:06):

But you are currently building a v4.15 doc-gen with v4.16 so that burns

Yaël Dillies (Jan 17 2025 at 10:06):

Got it! And can you confirm that

lake update mathlib
cd docbuild
lake update doc-gen4
cd ..

is the correct set of instructions to update my project from now on (namely, once I have removed the doc-gen version pin)?

Henrik Böving (Jan 17 2025 at 10:07):

That should work AFAIK yes

Yaël Dillies (Jan 17 2025 at 10:09):

I assume it will burn if once again we (⊆ FRO ?) forget to bump doc-gen to the latest toolchain?

Henrik Böving (Jan 17 2025 at 10:13):

But Kim has a script that ensures we don't now!

Yaël Dillies (Jan 17 2025 at 10:15):

Yes, I saw :eyes: Just wondering if I can myself add an extra failsafe mechanism on top. Or are you saying it should really never ever happen again?

Johan Commelin (Jan 17 2025 at 10:19):

I hope that more and more of that script will become part of automated workflows.
My impression is that chances that it happens again are really small now.


Last updated: May 02 2025 at 03:31 UTC