Kata A: andrAIa

36 named refactoring moves on a repeatable-build plugin — untangling a week of agent-driven architectural spaghetti into clean, injectable, testable code.

andrAIa is a build plugin for Bob, the Kompuwiz build system. Its job is simple: produce a repeatable JAR, sources JAR, and javadoc JAR — archives whose bytes are identical on any machine, any day, given the same source. The original model was rapid-prototyped from Gradle's jar task: take the compiled classes, stamp them with a deterministic date, sort the entries, write the archive.

Over the course of a week, waves of AI agents drove the model forward. Each wave added functionality — manifest writing, module-version stamping, resolution through the dependency graph — but each wave also drifted the architecture. Parameters accumulated. Responsibilities blurred. The three repeatable steps (build, sources, javadoc) duplicated logic with slight variations. By the end of the week, the code worked, but it had the architectural texture of spaghetti carbonara.

This kata is the cleanup. 36 commits, each doing exactly one named refactoring move from Fowler, Feathers, or the Gang of Four. The commit message is the move name. Click any commit to expand its side-by-side diff — before on the left, after on the right.

Phase 1: Mechanical extraction

Break the code apart without changing behavior. The Data Clump becomes a Parameter Object, a mixed-responsibility class gets sprouted, dead references get cleaned.

1. Step 1: INTRODUCE PARAMETER OBJECT on Data Clump +84 −26
--- a/software/visionary/reboot/andraia/Archiving.java
@@ -11,6 +11,8 @@ import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Stream;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.java.Tool;
 
@@ -25,6 +27,36 @@ import software.visionary.reboot.java.Tool;
 enum Archiving {
     ;
 
     /**
      * Writes {@code archive} from everything under {@code from}, deterministically.
      *
@@ -35,32 +67,7 @@ enum Archiving {
      */
     static void archive(final Path archive, final Path from, final String date,
                         final List<String> extra) {
-        final List<String> arguments = new ArrayList<>(List.of(
-                "--create", "--file", archive.toString(), "--date", date));
-        arguments.addAll(extra);
-        for (final String entry : sorted(from)) {
-            arguments.add("-C");
-            arguments.add(from.toString());
-            arguments.add(entry);
-        }
-        new Tool("jar").run(arguments);
     }
 
-    /**
-     * Every file under the root, relative to it, in one order.
-     *
-     * <p>Naming the files rather than the directory is the whole point: {@code -C dir .}
-     * archives whatever order the filesystem yielded, and the archive then differs
-     * between two machines holding the same tree.
-     */
-    private static List<String> sorted(final Path root) {
-        return Exceptional.yoda(() -> {
-            try (Stream<Path> tree = Files.walk(root)) {
-                return tree.filter(Files::isRegularFile)
-                        .map(file -> root.relativize(file).toString())
-                        .sorted(Comparator.naturalOrder())
-                        .toList();
-            }
-        });
-    }
 }
new file mode 100644
--- /dev/null
@@ -0,0 +1,51 @@
+++ b/software/visionary/reboot/andraia/Archiving.java
@@ -11,6 +11,8 @@ import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Stream;
+
+import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.java.Tool;
 
@@ -25,6 +27,36 @@ import software.visionary.reboot.java.Tool;
 enum Archiving {
     ;
 
+    record Archive(Path archive, Path from, String date, List<String> extra) implements Command {
+        List<String> arguments() {
+            final List<String> arguments = new ArrayList<>(List.of(
+                    "--create", "--file", archive.toString(), "--date", date));
+            arguments.addAll(extra);
+            for (final String entry : sorted(from)) {
+                arguments.add("-C");
+                arguments.add(from.toString());
+                arguments.add(entry);
+            }
+            return arguments;
+        }
+
+        List<String> sorted(final Path root) {
+            return Exceptional.yoda(() -> {
+                try (Stream<Path> tree = Files.walk(root)) {
+                    return tree.filter(Files::isRegularFile)
+                            .map(file -> root.relativize(file).toString())
+                            .sorted(Comparator.naturalOrder())
+                            .toList();
+                }
+            });
+        }
+
+        @Override
+        public void execute() {
+            new Tool("jar").run(arguments());
+        }
+    }
+
     /**
      * Writes {@code archive} from everything under {@code from}, deterministically.
      *
@@ -35,32 +67,7 @@ enum Archiving {
      */
     static void archive(final Path archive, final Path from, final String date,
                         final List<String> extra) {
+        new Archive(archive, from, date, extra).execute();
     }
 
 }
new file mode 100644
+++ b/software/visionary/reboot/andraia/Repeatable.java
@@ -0,0 +1,51 @@
+package software.visionary.reboot.andraia;
+
+import software.visionary.exceptional.Exceptional;
+import software.visionary.reboot.BuildFailed;
+import software.visionary.reboot.Layout;
+import software.visionary.reboot.dot.matrix.Resolution;
+import software.visionary.reboot.java.Artifacts;
+
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+
+public final class Repeatable implements Runnable {
+	private final Layout layout;
+
+	public Repeatable(final Layout layout) {
+		this.layout = layout;
+	}
+
+	@Override
+	public void run() {
+		final Artifacts artifacts = new Artifacts(layout);
+		final Resolution coordinate = artifacts.resolution();
+		if (!Files.isDirectory(layout.classes())) {
+			throw new BuildFailed("no " + layout.classes()
+					+ " — run CompileJava before RepeatableBuild");
+		}
+		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
+		// Idempotent where javac already stamped; THE stamp for a module whose
+		// realization was among its own sources.
+		Archiving.archive(artifacts.jar(), layout.classes(),
+				new ReleaseDate(coordinate.version()).iso(),
+				List.of("--manifest", manifest(coordinate).toString(),
+						"--module-version", coordinate.version()));
+	}
+
+	private Path manifest(final Resolution coordinate) {
+		return Exceptional.yoda(() -> {
+			final Path manifest = Files.createDirectories(layout.resolved())
+					.resolve("REPEATABLE-MANIFEST.MF");
+			Files.writeString(manifest, String.join("\n",
+					"Manifest-Version: 1.0",
+					"Implementation-Title: " + coordinate.axis().artifact(),
+					"Implementation-Version: " + coordinate.version(),
+					"") + "\n", StandardCharsets.UTF_8);
+			return manifest;
+		});
+	}
+
+}
2. EXTRACT METHOD +4 −0
--- a/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -88,6 +88,10 @@ public final class RepeatableJavadoc implements Build {
 
     @Override
     public void execute() {
         final Artifacts artifacts = new Artifacts(layout);
         final List<String> arguments = arguments();
         Exceptional.yoda(() -> Files.createDirectories(layout.documentation()));
+++ b/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -88,6 +88,10 @@ public final class RepeatableJavadoc implements Build {
 
     @Override
     public void execute() {
+        run();
+    }
+
+    private void run() {
         final Artifacts artifacts = new Artifacts(layout);
         final List<String> arguments = arguments();
         Exceptional.yoda(() -> Files.createDirectories(layout.documentation()));
3. SPROUT CLASS +78 −52
new file mode 100644
--- /dev/null
@@ -0,0 +1,71 @@
--- a/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -5,26 +5,12 @@
  */
 package software.visionary.reboot.andraia;
 
-import java.io.File;
-import java.net.URI;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
-import java.util.stream.Collectors;
-import software.visionary.exceptional.Exceptional;
-import software.visionary.maven.fs.MavenFileSystem;
 import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
-import software.visionary.reboot.dot.matrix.Resolution;
-import software.visionary.reboot.dot.matrix.Resolver;
-import software.visionary.reboot.java.Artifacts;
 import software.visionary.reboot.java.CompileJava;
-import software.visionary.reboot.java.JavaSources;
-import software.visionary.reboot.java.ModuleNames;
-import software.visionary.reboot.java.Tool;
 
 /**
  * The documentation archive, the same every time.
@@ -37,6 +23,7 @@ import software.visionary.reboot.java.Tool;
  */
 public final class RepeatableJavadoc implements Build {
     private final Layout layout;
 
     /** Documents the module the given layout is rooted at. */
         public RepeatableJavadoc() {
@@ -45,6 +32,7 @@ public final class RepeatableJavadoc implements Build {
 
     public RepeatableJavadoc(final Layout layout) {
         this.layout = Objects.requireNonNull(layout, "layout");
     }
 
     /**
@@ -57,47 +45,14 @@ public final class RepeatableJavadoc implements Build {
         return List.of(CompileJava.class);
     }
 
-    private static Path toDiskPath(final Path path) {
-        return Path.of(System.getProperty("user.home"), ".m2", "repository").resolve(path.toString());
-    }
-
-    List<String> arguments() {
-        final List<String> arguments = new ArrayList<>();
-        final Resolver resolver = new Resolver((MavenFileSystem) FileSystems.getFileSystem(URI.create("maven://https")));
-        final Resolution resolution = Exceptional.yoda(() -> resolver.resolve(layout.moduleInfo()));
-        final List<Path> modulePath = new ArrayList<>();
-        resolution.pathFor("Compile").forEach(p -> modulePath.add(toDiskPath(p)));
-        resolution.pathFor("Provided").forEach(p -> modulePath.add(toDiskPath(p)));
-        if (!modulePath.isEmpty()) {
-            arguments.add("--module-path");
-            arguments.add(modulePath.stream().map(Path::toString).collect(Collectors.joining(File.pathSeparator)));
-        }
-        final String moduleName = ModuleNames.of(layout.classes())
-                .or(() -> ModuleNames.of(layout.moduleInfo()))
-                .orElse("");
-        arguments.addAll(List.of(
-                "--patch-module", moduleName + "=" + layout.classes(),
-                "-Xdoclint:all,-html", "-quiet",
-                // ***javadoc dates its own output.*** Without this every page differs
-                // between two builds no matter what the archive does.
-                "-notimestamp",
-                "-d", layout.documentation().toString()));
-        arguments.addAll(new JavaSources(layout.sources(), ".java").all());
-        return arguments;
-    }
 
     @Override
     public void execute() {
-        run();
     }
 
-    private void run() {
-        final Artifacts artifacts = new Artifacts(layout);
-        final List<String> arguments = arguments();
-        Exceptional.yoda(() -> Files.createDirectories(layout.documentation()));
-        new Tool("javadoc").run(arguments);
-        Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
-        Archiving.archive(artifacts.javadoc(), layout.documentation(),
-                new ReleaseDate(artifacts.resolution().version()).iso(), List.of());
     }
 }
new file mode 100644
+++ b/software/visionary/reboot/andraia/JavaDoc.java
@@ -0,0 +1,71 @@
+package software.visionary.reboot.andraia;
+
+import software.visionary.commander.Command;
+import software.visionary.exceptional.Exceptional;
+import software.visionary.maven.fs.MavenFileSystem;
+import software.visionary.reboot.Layout;
+import software.visionary.reboot.dot.matrix.Resolution;
+import software.visionary.reboot.dot.matrix.Resolver;
+import software.visionary.reboot.java.Artifacts;
+import software.visionary.reboot.java.JavaSources;
+import software.visionary.reboot.java.ModuleNames;
+import software.visionary.reboot.java.Tool;
+
+import java.io.File;
+import java.net.URI;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+final class JavaDoc implements Command {
+	private final Layout layout;
+
+	JavaDoc(final Layout layout) {
+		this.layout = layout;
+	}
+
+	@Override
+	public void execute() {
+		final Artifacts artifacts = new Artifacts(layout);
+		final List<String> arguments = arguments();
+		Exceptional.yoda(() -> Files.createDirectories(layout.documentation()));
+		new Tool("javadoc").run(arguments);
+		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
+		final Path archive = artifacts.javadoc();
+		final Path from = layout.documentation();
+		final String date = new ReleaseDate(artifacts.resolution().version()).iso();
+		new Archiving.Archive(archive, from, date, List.of()).execute();
+	}
+
+	List<String> arguments() {
+		final List<String> arguments = new ArrayList<>();
+		final Resolver resolver = new Resolver((MavenFileSystem) FileSystems.getFileSystem(URI.create("maven://https")));
+		final Resolution resolution = Exceptional.yoda(() -> resolver.resolve(layout.moduleInfo()));
+		final List<Path> modulePath = new ArrayList<>();
+		resolution.pathFor("Compile").forEach(p -> modulePath.add(toDiskPath(p)));
+		resolution.pathFor("Provided").forEach(p -> modulePath.add(toDiskPath(p)));
+		if (!modulePath.isEmpty()) {
+			arguments.add("--module-path");
+			arguments.add(modulePath.stream().map(Path::toString).collect(Collectors.joining(File.pathSeparator)));
+		}
+		final String moduleName = ModuleNames.of(layout.classes())
+				.or(() -> ModuleNames.of(layout.moduleInfo()))
+				.orElse("");
+		arguments.addAll(List.of(
+				"--patch-module", moduleName + "=" + layout.classes(),
+				"-Xdoclint:all,-html", "-quiet",
+				// ***javadoc dates its own output.*** Without this every page differs
+				// between two builds no matter what the archive does.
+				"-notimestamp",
+				"-d", layout.documentation().toString()));
+		arguments.addAll(new JavaSources(layout.sources(), ".java").all());
+		return arguments;
+	}
+
+	Path toDiskPath(final Path path) {
+		return Path.of(System.getProperty("user.home"), ".m2", "repository").resolve(path.toString());
+	}
+}
+++ b/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -5,26 +5,12 @@
  */
 package software.visionary.reboot.andraia;
 
 import java.util.List;
 import java.util.Objects;
+
 import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.CompileJava;
 
 /**
  * The documentation archive, the same every time.
@@ -37,6 +23,7 @@ import software.visionary.reboot.java.Tool;
  */
 public final class RepeatableJavadoc implements Build {
     private final Layout layout;
+    private final JavaDoc doc;
 
     /** Documents the module the given layout is rooted at. */
         public RepeatableJavadoc() {
@@ -45,6 +32,7 @@ public final class RepeatableJavadoc implements Build {
 
     public RepeatableJavadoc(final Layout layout) {
         this.layout = Objects.requireNonNull(layout, "layout");
+        doc = new JavaDoc(layout);
     }
 
     /**
@@ -57,47 +45,14 @@ public final class RepeatableJavadoc implements Build {
         return List.of(CompileJava.class);
     }
 
 
     @Override
     public void execute() {
+        doc.execute();
     }
 
+    List<String> arguments() {
+        return doc.arguments();
     }
+
 }
4. REMOVE UNUSED FIELD +2 −3
--- a/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -22,8 +22,7 @@ import software.visionary.reboot.java.CompileJava;
  * rather than a repeat of {@link RepeatableSources}.
  */
 public final class RepeatableJavadoc implements Build {
-    private final Layout layout;
-    private final JavaDoc doc;
 
     /** Documents the module the given layout is rooted at. */
         public RepeatableJavadoc() {
@@ -31,7 +30,7 @@ public final class RepeatableJavadoc implements Build {
     }
 
     public RepeatableJavadoc(final Layout layout) {
-        this.layout = Objects.requireNonNull(layout, "layout");
         doc = new JavaDoc(layout);
     }
+++ b/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -22,8 +22,7 @@ import software.visionary.reboot.java.CompileJava;
  * rather than a repeat of {@link RepeatableSources}.
  */
 public final class RepeatableJavadoc implements Build {
+	private final JavaDoc doc;
 
     /** Documents the module the given layout is rooted at. */
         public RepeatableJavadoc() {
@@ -31,7 +30,7 @@ public final class RepeatableJavadoc implements Build {
     }
 
     public RepeatableJavadoc(final Layout layout) {
+	    final Layout layout1 = Objects.requireNonNull(layout, "layout");
         doc = new JavaDoc(layout);
     }
5. REMOVE UNUSED LOCAL VARIABLE +1 −2
--- a/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -30,8 +30,7 @@ public final class RepeatableJavadoc implements Build {
     }
 
     public RepeatableJavadoc(final Layout layout) {
-	    final Layout layout1 = Objects.requireNonNull(layout, "layout");
-        doc = new JavaDoc(layout);
     }
 
     /**
+++ b/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -30,8 +30,7 @@ public final class RepeatableJavadoc implements Build {
     }
 
     public RepeatableJavadoc(final Layout layout) {
+	    doc = new JavaDoc(layout);
     }
 
     /**
6. move data to closest scope +3 −2
--- a/software/visionary/reboot/andraia/JavaDoc.java
@@ -29,11 +29,13 @@ final class JavaDoc implements Command {
 
 	@Override
 	public void execute() {
-		final Artifacts artifacts = new Artifacts(layout);
 		final List<String> arguments = arguments();
 		Exceptional.yoda(() -> Files.createDirectories(layout.documentation()));
 		new Tool("javadoc").run(arguments);
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 		final Path archive = artifacts.javadoc();
 		final Path from = layout.documentation();
 		final String date = new ReleaseDate(artifacts.resolution().version()).iso();
--- a/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -6,7 +6,6 @@
 package software.visionary.reboot.andraia;
 
 import java.util.List;
-import java.util.Objects;
 
 import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
+++ b/software/visionary/reboot/andraia/JavaDoc.java
@@ -29,11 +29,13 @@ final class JavaDoc implements Command {
 
 	@Override
 	public void execute() {
+
 		final List<String> arguments = arguments();
 		Exceptional.yoda(() -> Files.createDirectories(layout.documentation()));
 		new Tool("javadoc").run(arguments);
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
+
+		final Artifacts artifacts = new Artifacts(layout);
 		final Path archive = artifacts.javadoc();
 		final Path from = layout.documentation();
 		final String date = new ReleaseDate(artifacts.resolution().version()).iso();
+++ b/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -6,7 +6,6 @@
 package software.visionary.reboot.andraia;
 
 import java.util.List;
 
 import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;

Phase 2: Structural pivot

The class structure starts changing shape. Sprout methods to isolate logic, reorder for readability, hoist dependencies for injectability, tighten the public contract.

7. SPROUT METHOD +7 −2
--- a/software/visionary/reboot/andraia/JavaDoc.java
@@ -30,9 +30,9 @@ final class JavaDoc implements Command {
 	@Override
 	public void execute() {
 
-		final List<String> arguments = arguments();
 		Exceptional.yoda(() -> Files.createDirectories(layout.documentation()));
-		new Tool("javadoc").run(arguments);
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 
 		final Artifacts artifacts = new Artifacts(layout);
@@ -42,6 +42,11 @@ final class JavaDoc implements Command {
 		new Archiving.Archive(archive, from, date, List.of()).execute();
 	}
 
 	List<String> arguments() {
 		final List<String> arguments = new ArrayList<>();
 		final Resolver resolver = new Resolver((MavenFileSystem) FileSystems.getFileSystem(URI.create("maven://https")));
+++ b/software/visionary/reboot/andraia/JavaDoc.java
@@ -30,9 +30,9 @@ final class JavaDoc implements Command {
 	@Override
 	public void execute() {
 
+
 		Exceptional.yoda(() -> Files.createDirectories(layout.documentation()));
+		runJavaDoc();
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 
 		final Artifacts artifacts = new Artifacts(layout);
@@ -42,6 +42,11 @@ final class JavaDoc implements Command {
 		new Archiving.Archive(archive, from, date, List.of()).execute();
 	}
 
+	private void runJavaDoc() {
+		final List<String> arguments = arguments();
+		new Tool("javadoc").run(arguments);
+	}
+
 	List<String> arguments() {
 		final List<String> arguments = new ArrayList<>();
 		final Resolver resolver = new Resolver((MavenFileSystem) FileSystems.getFileSystem(URI.create("maven://https")));
8. NEWSPAPER METAPHOR +8 −7
--- a/software/visionary/reboot/andraia/JavaDoc.java
@@ -29,12 +29,18 @@ final class JavaDoc implements Command {
 
 	@Override
 	public void execute() {
-
-
 		Exceptional.yoda(() -> Files.createDirectories(layout.documentation()));
 		runJavaDoc();
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 
 		final Artifacts artifacts = new Artifacts(layout);
 		final Path archive = artifacts.javadoc();
 		final Path from = layout.documentation();
@@ -42,11 +48,6 @@ final class JavaDoc implements Command {
 		new Archiving.Archive(archive, from, date, List.of()).execute();
 	}
 
-	private void runJavaDoc() {
-		final List<String> arguments = arguments();
-		new Tool("javadoc").run(arguments);
-	}
-
 	List<String> arguments() {
 		final List<String> arguments = new ArrayList<>();
 		final Resolver resolver = new Resolver((MavenFileSystem) FileSystems.getFileSystem(URI.create("maven://https")));
+++ b/software/visionary/reboot/andraia/JavaDoc.java
@@ -29,12 +29,18 @@ final class JavaDoc implements Command {
 
 	@Override
 	public void execute() {
 		Exceptional.yoda(() -> Files.createDirectories(layout.documentation()));
 		runJavaDoc();
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
+		buildArchive();
+	}
 
+	private void runJavaDoc() {
+		final List<String> arguments = arguments();
+		new Tool("javadoc").run(arguments);
+	}
+
+	private void buildArchive() {
 		final Artifacts artifacts = new Artifacts(layout);
 		final Path archive = artifacts.javadoc();
 		final Path from = layout.documentation();
@@ -42,11 +48,6 @@ final class JavaDoc implements Command {
 		new Archiving.Archive(archive, from, date, List.of()).execute();
 	}
 
 	List<String> arguments() {
 		final List<String> arguments = new ArrayList<>();
 		final Resolver resolver = new Resolver((MavenFileSystem) FileSystems.getFileSystem(URI.create("maven://https")));
9. hoist for injectability +6 −1
--- a/software/visionary/reboot/andraia/JavaDoc.java
@@ -22,9 +22,15 @@ import java.util.stream.Collectors;
 
 final class JavaDoc implements Command {
 	private final Layout layout;
 
 	JavaDoc(final Layout layout) {
 		this.layout = layout;
 	}
 
 	@Override
@@ -50,7 +56,6 @@ final class JavaDoc implements Command {
 
 	List<String> arguments() {
 		final List<String> arguments = new ArrayList<>();
-		final Resolver resolver = new Resolver((MavenFileSystem) FileSystems.getFileSystem(URI.create("maven://https")));
 		final Resolution resolution = Exceptional.yoda(() -> resolver.resolve(layout.moduleInfo()));
 		final List<Path> modulePath = new ArrayList<>();
 		resolution.pathFor("Compile").forEach(p -> modulePath.add(toDiskPath(p)));
+++ b/software/visionary/reboot/andraia/JavaDoc.java
@@ -22,9 +22,15 @@ import java.util.stream.Collectors;
 
 final class JavaDoc implements Command {
 	private final Layout layout;
+	private final Resolver resolver;
 
 	JavaDoc(final Layout layout) {
+		this(layout, new Resolver(FileSystems.getFileSystem(URI.create("maven://https"))));
+	}
+
+	JavaDoc(final Layout layout, final Resolver resolver) {
 		this.layout = layout;
+		this.resolver = resolver;
 	}
 
 	@Override
@@ -50,7 +56,6 @@ final class JavaDoc implements Command {
 
 	List<String> arguments() {
 		final List<String> arguments = new ArrayList<>();
 		final Resolution resolution = Exceptional.yoda(() -> resolver.resolve(layout.moduleInfo()));
 		final List<Path> modulePath = new ArrayList<>();
 		resolution.pathFor("Compile").forEach(p -> modulePath.add(toDiskPath(p)));
10. tighten contract +4 −8
--- a/software/visionary/reboot/andraia/JavaDoc.java
@@ -2,7 +2,6 @@ package software.visionary.reboot.andraia;
 
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
-import software.visionary.maven.fs.MavenFileSystem;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.Resolution;
 import software.visionary.reboot.dot.matrix.Resolver;
@@ -12,8 +11,6 @@ import software.visionary.reboot.java.ModuleNames;
 import software.visionary.reboot.java.Tool;
 
 import java.io.File;
-import java.net.URI;
-import java.nio.file.FileSystems;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
@@ -24,10 +21,6 @@ final class JavaDoc implements Command {
 	private final Layout layout;
 	private final Resolver resolver;
 
-	JavaDoc(final Layout layout) {
-		this(layout, new Resolver(FileSystems.getFileSystem(URI.create("maven://https"))));
-	}
-
 	JavaDoc(final Layout layout, final Resolver resolver) {
 		this.layout = layout;
 		this.resolver = resolver;
--- a/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -5,10 +5,13 @@
  */
 package software.visionary.reboot.andraia;
 
 import java.util.List;
 
 import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.CompileJava;
 
 /**
@@ -29,7 +32,7 @@ public final class RepeatableJavadoc implements Build {
     }
 
     public RepeatableJavadoc(final Layout layout) {
-	    doc = new JavaDoc(layout);
     }
 
     /**
+++ b/software/visionary/reboot/andraia/JavaDoc.java
@@ -2,7 +2,6 @@ package software.visionary.reboot.andraia;
 
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.Resolution;
 import software.visionary.reboot.dot.matrix.Resolver;
@@ -12,8 +11,6 @@ import software.visionary.reboot.java.ModuleNames;
 import software.visionary.reboot.java.Tool;
 
 import java.io.File;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
@@ -24,10 +21,6 @@ final class JavaDoc implements Command {
 	private final Layout layout;
 	private final Resolver resolver;
 
 	JavaDoc(final Layout layout, final Resolver resolver) {
 		this.layout = layout;
 		this.resolver = resolver;
+++ b/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -5,10 +5,13 @@
  */
 package software.visionary.reboot.andraia;
 
+import java.net.URI;
+import java.nio.file.FileSystems;
 import java.util.List;
 
 import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
+import software.visionary.reboot.dot.matrix.Resolver;
 import software.visionary.reboot.java.CompileJava;
 
 /**
@@ -29,7 +32,7 @@ public final class RepeatableJavadoc implements Build {
     }
 
     public RepeatableJavadoc(final Layout layout) {
+	    doc = new JavaDoc(layout, new Resolver(FileSystems.getFileSystem(URI.create("maven://https"))));
     }
 
     /**
11. SPROUT METHOD +13 −4
--- a/software/visionary/reboot/andraia/JavaDoc.java
@@ -1,5 +1,6 @@
 package software.visionary.reboot.andraia;
 
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
@@ -57,18 +58,26 @@ final class JavaDoc implements Command {
 			arguments.add("--module-path");
 			arguments.add(modulePath.stream().map(Path::toString).collect(Collectors.joining(File.pathSeparator)));
 		}
 		final String moduleName = ModuleNames.of(layout.classes())
 				.or(() -> ModuleNames.of(layout.moduleInfo()))
 				.orElse("");
-		arguments.addAll(List.of(
 				"--patch-module", moduleName + "=" + layout.classes(),
 				"-Xdoclint:all,-html", "-quiet",
 				// ***javadoc dates its own output.*** Without this every page differs
 				// between two builds no matter what the archive does.
 				"-notimestamp",
-				"-d", layout.documentation().toString()));
-		arguments.addAll(new JavaSources(layout.sources(), ".java").all());
-		return arguments;
 	}
 
 	Path toDiskPath(final Path path) {
+++ b/software/visionary/reboot/andraia/JavaDoc.java
@@ -1,5 +1,6 @@
 package software.visionary.reboot.andraia;
 
+import org.jspecify.annotations.NonNull;
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
@@ -57,18 +58,26 @@ final class JavaDoc implements Command {
 			arguments.add("--module-path");
 			arguments.add(modulePath.stream().map(Path::toString).collect(Collectors.joining(File.pathSeparator)));
 		}
+		arguments.addAll(commandArguments());
+		arguments.addAll(sources());
+		return arguments;
+	}
+
+	private @NonNull List<String> commandArguments() {
 		final String moduleName = ModuleNames.of(layout.classes())
 				.or(() -> ModuleNames.of(layout.moduleInfo()))
 				.orElse("");
+		return List.of(
 				"--patch-module", moduleName + "=" + layout.classes(),
 				"-Xdoclint:all,-html", "-quiet",
 				// ***javadoc dates its own output.*** Without this every page differs
 				// between two builds no matter what the archive does.
 				"-notimestamp",
+				"-d", layout.documentation().toString());
+	}
+
+	private List<String> sources() {
+		return new JavaSources(layout.sources(), ".java").all();
 	}
 
 	Path toDiskPath(final Path path) {
12. SPROUT METHOD +7 −3
--- a/software/visionary/reboot/andraia/JavaDoc.java
@@ -50,6 +50,13 @@ final class JavaDoc implements Command {
 
 	List<String> arguments() {
 		final List<String> arguments = new ArrayList<>();
 		final Resolution resolution = Exceptional.yoda(() -> resolver.resolve(layout.moduleInfo()));
 		final List<Path> modulePath = new ArrayList<>();
 		resolution.pathFor("Compile").forEach(p -> modulePath.add(toDiskPath(p)));
@@ -58,9 +65,6 @@ final class JavaDoc implements Command {
 			arguments.add("--module-path");
 			arguments.add(modulePath.stream().map(Path::toString).collect(Collectors.joining(File.pathSeparator)));
 		}
-		arguments.addAll(commandArguments());
-		arguments.addAll(sources());
-		return arguments;
 	}
 
 	private @NonNull List<String> commandArguments() {
+++ b/software/visionary/reboot/andraia/JavaDoc.java
@@ -50,6 +50,13 @@ final class JavaDoc implements Command {
 
 	List<String> arguments() {
 		final List<String> arguments = new ArrayList<>();
+		resolveDependencies(arguments);
+		arguments.addAll(commandArguments());
+		arguments.addAll(sources());
+		return arguments;
+	}
+
+	private void resolveDependencies(final List<String> arguments) {
 		final Resolution resolution = Exceptional.yoda(() -> resolver.resolve(layout.moduleInfo()));
 		final List<Path> modulePath = new ArrayList<>();
 		resolution.pathFor("Compile").forEach(p -> modulePath.add(toDiskPath(p)));
@@ -58,9 +65,6 @@ final class JavaDoc implements Command {
 			arguments.add("--module-path");
 			arguments.add(modulePath.stream().map(Path::toString).collect(Collectors.joining(File.pathSeparator)));
 		}
 	}
 
 	private @NonNull List<String> commandArguments() {

Phase 3: Reshape & dissolve

The old Archiving utility enum dissolves. Stubbed collaborators replace inline construction. Responsibilities get partitioned across types that each do one thing.

13. refactor to stubbed collarborators and functional dependency resolution +143 −141
--- a/software/visionary/reboot/andraia/JavaDoc.java
@@ -1,11 +1,10 @@
 package software.visionary.reboot.andraia;
 
-import org.jspecify.annotations.NonNull;
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
-import software.visionary.reboot.dot.matrix.Resolution;
-import software.visionary.reboot.dot.matrix.Resolver;
 import software.visionary.reboot.java.Artifacts;
 import software.visionary.reboot.java.JavaSources;
 import software.visionary.reboot.java.ModuleNames;
@@ -16,13 +15,14 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.stream.Collectors;
 
 final class JavaDoc implements Command {
 	private final Layout layout;
-	private final Resolver resolver;
 
-	JavaDoc(final Layout layout, final Resolver resolver) {
 		this.layout = layout;
 		this.resolver = resolver;
 	}
@@ -50,24 +50,24 @@ final class JavaDoc implements Command {
 
 	List<String> arguments() {
 		final List<String> arguments = new ArrayList<>();
-		resolveDependencies(arguments);
 		arguments.addAll(commandArguments());
 		arguments.addAll(sources());
 		return arguments;
 	}
 
-	private void resolveDependencies(final List<String> arguments) {
-		final Resolution resolution = Exceptional.yoda(() -> resolver.resolve(layout.moduleInfo()));
-		final List<Path> modulePath = new ArrayList<>();
-		resolution.pathFor("Compile").forEach(p -> modulePath.add(toDiskPath(p)));
-		resolution.pathFor("Provided").forEach(p -> modulePath.add(toDiskPath(p)));
-		if (!modulePath.isEmpty()) {
-			arguments.add("--module-path");
-			arguments.add(modulePath.stream().map(Path::toString).collect(Collectors.joining(File.pathSeparator)));
-		}
 	}
 
-	private @NonNull List<String> commandArguments() {
 		final String moduleName = ModuleNames.of(layout.classes())
 				.or(() -> ModuleNames.of(layout.moduleInfo()))
 				.orElse("");
--- a/software/visionary/reboot/andraia/RepeatableBuild.java
@@ -5,16 +5,10 @@
  */
 package software.visionary.reboot.andraia;
 
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
 import java.util.List;
-import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Build;
-import software.visionary.reboot.BuildFailed;
 import software.visionary.reboot.Layout;
-import software.visionary.reboot.dot.matrix.Resolution;
-import software.visionary.reboot.java.Artifacts;
 import software.visionary.reboot.java.CompileJava;
 
 /**
@@ -65,43 +59,4 @@ public final class RepeatableBuild implements Build {
     public void execute() {
         new Repeatable(layout).run();
     }
-
-    public static final class Repeatable implements Runnable {
-        private final Layout layout;
-
-	    public Repeatable(final Layout layout) {
-		    this.layout = layout;
-	    }
-
-	    @Override
-        public void run() {
-            final Artifacts artifacts = new Artifacts(layout);
-            final Resolution coordinate = artifacts.resolution();
-            if (!Files.isDirectory(layout.classes())) {
-                throw new BuildFailed("no " + layout.classes()
-                        + " — run CompileJava before RepeatableBuild");
-            }
-            Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
-            // Idempotent where javac already stamped; THE stamp for a module whose
-            // realization was among its own sources.
-            Archiving.archive(artifacts.jar(), layout.classes(),
-                    new ReleaseDate(coordinate.version()).iso(),
-                    List.of("--manifest", manifest(coordinate).toString(),
-                            "--module-version", coordinate.version()));
-        }
-
-        private Path manifest(final Resolution coordinate) {
-            return Exceptional.yoda(() -> {
-                final Path manifest = Files.createDirectories(layout.resolved())
-                        .resolve("REPEATABLE-MANIFEST.MF");
-                Files.writeString(manifest, String.join("\n",
-                        "Manifest-Version: 1.0",
-                        "Implementation-Title: " + coordinate.axis().artifact(),
-                        "Implementation-Version: " + coordinate.version(),
-                        "") + "\n", StandardCharsets.UTF_8);
-                return manifest;
-            });
-        }
-
-    }
 }
--- a/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -12,6 +12,7 @@ import java.util.List;
 import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.Resolver;
 import software.visionary.reboot.java.CompileJava;
 
 /**
@@ -28,11 +29,12 @@ public final class RepeatableJavadoc implements Build {
 
     /** Documents the module the given layout is rooted at. */
         public RepeatableJavadoc() {
-        this(() -> java.nio.file.Path.of("."));
     }
 
-    public RepeatableJavadoc(final Layout layout) {
-	    doc = new JavaDoc(layout, new Resolver(FileSystems.getFileSystem(URI.create("maven://https"))));
     }
 
     /**
--- a/test/software/visionary/reboot/andraia/Fixtures.java
@@ -2,8 +2,12 @@ package software.visionary.reboot.andraia;
 
 import java.nio.file.Files;
 import java.nio.file.Path;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.jar.Jar;
 import software.visionary.reboot.java.CompileJava;
 import software.visionary.reboot.java.Conventional;
@@ -74,6 +78,73 @@ final class Fixtures {
                 }
             }
             """;
 
     private Fixtures() {
     }
@@ -110,4 +181,28 @@ final class Fixtures {
         new Jar(layout).execute();
         return layout;
     }
 }
--- a/test/software/visionary/reboot/andraia/RepeatableJavadocTest.java
@@ -4,8 +4,8 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.List;
 import software.visionary.exceptional.Exceptional;
-import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.CompileJava;
 import software.visionary.spex.Fact;
@@ -15,83 +15,30 @@ import software.visionary.trivia.Returning;
 import static software.visionary.spex.Spex.given;
 
 class RepeatableJavadocTest {
-    private static Layout compiled() {
-        return Fixtures.compiled(Fixtures.dependency());
-    }
-
-    private static RepeatableJavadoc step(final Layout layout) {
-        return new RepeatableJavadoc(layout);
-    }
-
-    private static Path archive(final Layout layout) {
-        return layout.archives().resolve("greeting-2026.09.17-javadoc.jar");
-    }
 
-    private static byte[] built(final Layout layout) {
-        step(layout).execute();
-        return Exceptional.yoda(() -> Files.readAllBytes(archive(layout)));
-    }
-
-    final Fact archivesTheDocumentation = given(RepeatableJavadocTest::compiled)
             .when(layout -> {
-                step(layout).execute();
-                return archive(layout);
             })
             .then(new Returning<>(Files::isRegularFile));
 
-    final Fact twoBuildsOfOneTreeAreByteIdentical = given(RepeatableJavadocTest::compiled)
-            .when(layout -> Arrays.equals(built(layout), built(layout)))
             .then(new Equaling<>(true));
 
-    final Fact tellsJavadocNotToDateItsOwnOutput = given(RepeatableJavadocTest::compiled)
-            .when(layout -> step(layout).arguments())
             .then(new Returning<>(arguments -> arguments.contains("-notimestamp")));
 
-    private static final String NO_PINS = """
-            import fixture.bare.BareVision;
-
-            @BareVision
-            module fixture.bare {
-                exports fixture.bare;
-            }
-            """;
-
-    private static final String BARE_TOKEN = """
-            package fixture.bare;
-
-            import java.lang.annotation.Documented;
-            import java.lang.annotation.ElementType;
-            import java.lang.annotation.Retention;
-            import java.lang.annotation.RetentionPolicy;
-            import java.lang.annotation.Target;
-            import software.visionary.reboot.build.Artifact;
-            import software.visionary.releases.IndianGoddess;
-            import software.visionary.versions.Version;
-            import software.visionary.visions.Description;
-            import software.visionary.visions.Inception;
-            import software.visionary.visions.Name;
-            import software.visionary.visions.URL;
-            import software.visionary.visions.Vision;
-            import software.visionary.visions.Year;
-
-            @Documented
-            @Artifact(
-                value = @Vision(
-                    name = @Name("bare"),
-                    description = @Description("No pins."),
-                    inception = Year.TWENTY_TWENTY_SIX,
-                    url = @URL(path = "/fixture/bare")
-                ),
-                version = @Version(IndianGoddess.class)
-            )
-            @Retention(RetentionPolicy.RUNTIME)
-            @Target({ElementType.MODULE, ElementType.ANNOTATION_TYPE})
-            public @interface BareVision {
-            }
-            """;
-
     final Fact aModuleThatPinsNothingIsHandedNoModulePath = given(() -> {
-                    final Layout layout = Fixtures.module(NO_PINS, "fixture.bare", "Bare", """
                             package fixture.bare;
 
                             /** Bare. */
@@ -102,20 +49,23 @@ class RepeatableJavadocTest {
                             """);
                     Exceptional.yoda(() -> {
                         final Path directory = layout.sources().resolve("fixture/bare");
-                        Files.writeString(directory.resolve("BareVision.java"), BARE_TOKEN);
                         return null;
                     });
                     return layout;
             })
-            .when(layout -> step(layout).arguments())
             .then(new Returning<>(arguments -> !arguments.contains("--module-path")));
 
-    final Fact theStepIsMadeFromTheModuleBeingBuilt = given(RepeatableJavadocTest::compiled)
-            .when(layout -> new RepeatableJavadoc(layout).dependencies())
-            .then(new Equaling<List<Class<? extends Build>>>(List.of(CompileJava.class)));
 
     final Fact declaresOnlyTheCompile =
-            given(() -> new RepeatableJavadoc((Layout) () -> Path.of("/fixture")))
             .when(RepeatableJavadoc::dependencies)
-            .then(new Equaling<List<Class<? extends Build>>>(List.of(CompileJava.class)));
 }
+++ b/software/visionary/reboot/andraia/JavaDoc.java
@@ -1,11 +1,10 @@
 package software.visionary.reboot.andraia;
 
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
+import software.visionary.reboot.dot.matrix.api.DependencyResolutionStrategy;
+import software.visionary.reboot.dot.matrix.api.Resolved;
 import software.visionary.reboot.java.Artifacts;
 import software.visionary.reboot.java.JavaSources;
 import software.visionary.reboot.java.ModuleNames;
@@ -16,13 +15,14 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
+import java.util.stream.Stream;
 
 final class JavaDoc implements Command {
 	private final Layout layout;
+	private final DependencyResolutionStrategy resolver;
 
+	JavaDoc(final Layout layout, final DependencyResolutionStrategy resolver) {
 		this.layout = layout;
 		this.resolver = resolver;
 	}
@@ -50,24 +50,24 @@ final class JavaDoc implements Command {
 
 	List<String> arguments() {
 		final List<String> arguments = new ArrayList<>();
+		arguments.addAll(resolveDependencies());
 		arguments.addAll(commandArguments());
 		arguments.addAll(sources());
 		return arguments;
 	}
 
+	private List<String> resolveDependencies() {
+		return Stream.of("Compile", "Provided")
+				.map(marker -> Exceptional.yoda(() -> resolver.resolve(layout.moduleInfo()).pathFor(marker)))
+				.flatMap(List::stream)
+				.map(this::toDiskPath)
+				.map(Objects::toString)
+				.reduce((a, b) -> a + File.pathSeparator + b)
+				.map(s -> List.of("--module-path", s))
+				.orElse(List.of());
 	}
 
+	private List<String> commandArguments() {
 		final String moduleName = ModuleNames.of(layout.classes())
 				.or(() -> ModuleNames.of(layout.moduleInfo()))
 				.orElse("");
+++ b/software/visionary/reboot/andraia/RepeatableBuild.java
@@ -5,16 +5,10 @@
  */
 package software.visionary.reboot.andraia;
 
 import java.util.List;
+
 import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.CompileJava;
 
 /**
@@ -65,43 +59,4 @@ public final class RepeatableBuild implements Build {
     public void execute() {
         new Repeatable(layout).run();
     }
 }
+++ b/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -12,6 +12,7 @@ import java.util.List;
 import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.Resolver;
+import software.visionary.reboot.dot.matrix.api.DependencyResolutionStrategy;
 import software.visionary.reboot.java.CompileJava;
 
 /**
@@ -28,11 +29,12 @@ public final class RepeatableJavadoc implements Build {
 
     /** Documents the module the given layout is rooted at. */
         public RepeatableJavadoc() {
+        this(() -> java.nio.file.Path.of("."),
+                new Resolver(FileSystems.getFileSystem(URI.create("maven://https"))));
     }
 
+    public RepeatableJavadoc(final Layout layout, final DependencyResolutionStrategy resolver) {
+	    doc = new JavaDoc(layout, resolver);
     }
 
     /**
+++ b/test/software/visionary/reboot/andraia/Fixtures.java
@@ -2,8 +2,12 @@ package software.visionary.reboot.andraia;
 
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.Collections;
+import java.util.List;
+
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
+import software.visionary.reboot.dot.matrix.api.Resolved;
 import software.visionary.reboot.jar.Jar;
 import software.visionary.reboot.java.CompileJava;
 import software.visionary.reboot.java.Conventional;
@@ -74,6 +78,73 @@ final class Fixtures {
                 }
             }
             """;
+    static final Resolved FIXTURE_DEPS = new Resolved() {
+        private final List<Path> compilePaths = List.of(
+                mavenJar("maven", "maven"),
+                mavenJar("reboot/build", "build"),
+                mavenJar("versions", "versions"),
+                mavenJar("releases", "releases"),
+                mavenJar("visions", "visions"),
+                mavenJar("jars", "jars"),
+                mavenJar("pylon", "pylon"),
+                thirdPartyJar("org/jspecify", "jspecify", "1.0.1"));
+
+        @Override public List<Path> pathFor(final software.visionary.borobudur.Needed scope) {
+            return scope == software.visionary.borobudur.Needed.COMPILE ? compilePaths : Collections.emptyList();
+        }
+
+        @Override public List<Path> pathFor(final String marker) {
+            return "Compile".equals(marker) ? compilePaths : Collections.emptyList();
+        }
+
+        @Override public software.visionary.maven.fs.space.levels.Version identity() { return null; }
+    };
+    static final Resolved NOTHING_RESOLVED = new Resolved() {
+        @Override public List<Path> pathFor(final software.visionary.borobudur.Needed scope) { return Collections.emptyList(); }
+        @Override public List<Path> pathFor(final String marker) { return Collections.emptyList(); }
+        @Override public software.visionary.maven.fs.space.levels.Version identity() { return null; }
+    };
+    static final String NO_PINS = """
+            import fixture.bare.BareVision;
+
+            @BareVision
+            module fixture.bare {
+                exports fixture.bare;
+            }
+            """;
+    static final String BARE_TOKEN = """
+            package fixture.bare;
+
+            import java.lang.annotation.Documented;
+            import java.lang.annotation.ElementType;
+            import java.lang.annotation.Retention;
+            import java.lang.annotation.RetentionPolicy;
+            import java.lang.annotation.Target;
+            import software.visionary.reboot.build.Artifact;
+            import software.visionary.releases.IndianGoddess;
+            import software.visionary.versions.Version;
+            import software.visionary.visions.Description;
+            import software.visionary.visions.Inception;
+            import software.visionary.visions.Name;
+            import software.visionary.visions.URL;
+            import software.visionary.visions.Vision;
+            import software.visionary.visions.Year;
+
+            @Documented
+            @Artifact(
+                value = @Vision(
+                    name = @Name("bare"),
+                    description = @Description("No pins."),
+                    inception = Year.TWENTY_TWENTY_SIX,
+                    url = @URL(path = "/fixture/bare")
+                ),
+                version = @Version(IndianGoddess.class)
+            )
+            @Retention(RetentionPolicy.RUNTIME)
+            @Target({ElementType.MODULE, ElementType.ANNOTATION_TYPE})
+            public @interface BareVision {
+            }
+            """;
 
     private Fixtures() {
     }
@@ -110,4 +181,28 @@ final class Fixtures {
         new Jar(layout).execute();
         return layout;
     }
+
+    static Layout compiled() {
+        return compiled(dependency());
+    }
+
+    static Path archive(final Layout layout) {
+        return layout.archives().resolve("greeting-2026.09.17-javadoc.jar");
+    }
+
+    static RepeatableJavadoc stubbed(final Layout layout) {
+        return new RepeatableJavadoc(layout, target -> NOTHING_RESOLVED);
+    }
+
+    static Path mavenJar(final String group, final String artifact) {
+        return Path.of("software", "visionary", group, "2026.09.17", artifact + "-2026.09.17.jar");
+    }
+
+    static Path thirdPartyJar(final String group, final String artifact, final String version) {
+        return Path.of(group, artifact, version, artifact + "-" + version + ".jar");
+    }
+
+    static RepeatableJavadoc forJavadoc(final Layout layout) {
+        return new RepeatableJavadoc(layout, target -> FIXTURE_DEPS);
+    }
 }
+++ b/test/software/visionary/reboot/andraia/RepeatableJavadocTest.java
@@ -4,8 +4,8 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.List;
+
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.CompileJava;
 import software.visionary.spex.Fact;
@@ -15,83 +15,30 @@ import software.visionary.trivia.Returning;
 import static software.visionary.spex.Spex.given;
 
 class RepeatableJavadocTest {
 
+    final Fact archivesTheDocumentation = given(Fixtures::compiled)
             .when(layout -> {
+                Fixtures.forJavadoc(layout).execute();
+                return Fixtures.archive(layout);
             })
             .then(new Returning<>(Files::isRegularFile));
 
+    final Fact twoBuildsOfOneTreeAreByteIdentical = given(Fixtures::compiled)
+            .when(layout -> {
+                Fixtures.forJavadoc(layout).execute();
+                final byte[] first = Exceptional.yoda(() -> Files.readAllBytes(Fixtures.archive(layout)));
+                Fixtures.forJavadoc(layout).execute();
+                final byte[] second = Exceptional.yoda(() -> Files.readAllBytes(Fixtures.archive(layout)));
+                return Arrays.equals(first, second);
+            })
             .then(new Equaling<>(true));
 
+    final Fact tellsJavadocNotToDateItsOwnOutput = given(Fixtures::compiled)
+            .when(layout -> Fixtures.stubbed(layout).arguments())
             .then(new Returning<>(arguments -> arguments.contains("-notimestamp")));
 
     final Fact aModuleThatPinsNothingIsHandedNoModulePath = given(() -> {
+                    final Layout layout = Fixtures.module(Fixtures.NO_PINS, "fixture.bare", "Bare", """
                             package fixture.bare;
 
                             /** Bare. */
@@ -102,20 +49,23 @@ class RepeatableJavadocTest {
                             """);
                     Exceptional.yoda(() -> {
                         final Path directory = layout.sources().resolve("fixture/bare");
+                        Files.writeString(directory.resolve("BareVision.java"), Fixtures.BARE_TOKEN);
                         return null;
                     });
                     return layout;
             })
+            .when(layout -> Fixtures.stubbed(layout).arguments())
             .then(new Returning<>(arguments -> !arguments.contains("--module-path")));
 
+    final Fact theStepIsMadeFromTheModuleBeingBuilt = given(Fixtures::compiled)
+            .when(layout -> Fixtures.stubbed(layout).dependencies())
+            .then(new Equaling<>(List.of(CompileJava.class)));
 
     final Fact declaresOnlyTheCompile =
+            given(() -> {
+                final Layout fixture = Fixtures.compiled(Fixtures.dependency());
+                return Fixtures.stubbed(fixture);
+            })
             .when(RepeatableJavadoc::dependencies)
+            .then(new Equaling<>(List.of(CompileJava.class)));
 }
14. INLINE METHOD +10 −21
--- a/software/visionary/reboot/andraia/Archiving.java
@@ -56,18 +56,4 @@ enum Archiving {
             new Tool("jar").run(arguments());
         }
     }
-
-    /**
-     * Writes {@code archive} from everything under {@code from}, deterministically.
-     *
-     * @param archive where the archive goes
-     * @param from the directory whose whole contents are archived
-     * @param date the ISO-8601 stamp every entry carries
-     * @param extra arguments that come before the entries, such as a manifest
-     */
-    static void archive(final Path archive, final Path from, final String date,
-                        final List<String> extra) {
-        new Archive(archive, from, date, extra).execute();
-    }
-
 }
--- a/software/visionary/reboot/andraia/JavaDoc.java
@@ -4,7 +4,6 @@ import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.api.DependencyResolutionStrategy;
-import software.visionary.reboot.dot.matrix.api.Resolved;
 import software.visionary.reboot.java.Artifacts;
 import software.visionary.reboot.java.JavaSources;
 import software.visionary.reboot.java.ModuleNames;
--- a/software/visionary/reboot/andraia/Repeatable.java
@@ -29,10 +29,11 @@ public final class Repeatable implements Runnable {
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 		// Idempotent where javac already stamped; THE stamp for a module whose
 		// realization was among its own sources.
-		Archiving.archive(artifacts.jar(), layout.classes(),
-				new ReleaseDate(coordinate.version()).iso(),
-				List.of("--manifest", manifest(coordinate).toString(),
-						"--module-version", coordinate.version()));
 	}
 
 	private Path manifest(final Resolution coordinate) {
--- a/software/visionary/reboot/andraia/RepeatableSources.java
@@ -6,6 +6,7 @@
 package software.visionary.reboot.andraia;
 
 import java.nio.file.Files;
 import java.util.List;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Build;
@@ -50,7 +51,9 @@ public final class RepeatableSources implements Build {
             throw new BuildFailed("no " + layout.sources() + " to archive");
         }
         Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
-        Archiving.archive(artifacts.sources(), layout.sources(),
-                new ReleaseDate(artifacts.resolution().version()).iso(), List.of());
     }
 }
+++ b/software/visionary/reboot/andraia/Archiving.java
@@ -56,18 +56,4 @@ enum Archiving {
             new Tool("jar").run(arguments());
         }
     }
 }
+++ b/software/visionary/reboot/andraia/JavaDoc.java
@@ -4,7 +4,6 @@ import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.api.DependencyResolutionStrategy;
 import software.visionary.reboot.java.Artifacts;
 import software.visionary.reboot.java.JavaSources;
 import software.visionary.reboot.java.ModuleNames;
+++ b/software/visionary/reboot/andraia/Repeatable.java
@@ -29,10 +29,11 @@ public final class Repeatable implements Runnable {
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 		// Idempotent where javac already stamped; THE stamp for a module whose
 		// realization was among its own sources.
+		final Path archive = artifacts.jar();
+		final Path from = layout.classes();
+		final String date = new ReleaseDate(coordinate.version()).iso();
+		new Archiving.Archive(archive, from, date, List.of("--manifest", manifest(coordinate).toString(),
+								"--module-version", coordinate.version())).execute();
 	}
 
 	private Path manifest(final Resolution coordinate) {
+++ b/software/visionary/reboot/andraia/RepeatableSources.java
@@ -6,6 +6,7 @@
 package software.visionary.reboot.andraia;
 
 import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.List;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Build;
@@ -50,7 +51,9 @@ public final class RepeatableSources implements Build {
             throw new BuildFailed("no " + layout.sources() + " to archive");
         }
         Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
+        final Path archive = artifacts.sources();
+        final Path from = layout.sources();
+        final String date = new ReleaseDate(artifacts.resolution().version()).iso();
+        new Archiving.Archive(archive, from, date, List.of()).execute();
     }
 }
15. remove extraneous class +45 −62
new file mode 100644
--- /dev/null
@@ -0,0 +1,42 @@
deleted file mode 100644
--- a/software/visionary/reboot/andraia/Archiving.java
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2026 Visionary Software Solutions
- *
- * SPDX-License-Identifier: GPL-3.0-or-later
- */
-package software.visionary.reboot.andraia;
-
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.stream.Stream;
-
-import software.visionary.commander.Command;
-import software.visionary.exceptional.Exceptional;
-import software.visionary.reboot.java.Tool;
-
-/**
- * Creating one archive with every source of variance removed.
- *
- * <p>The three repeatable steps differ only in WHAT they archive — classes, sources,
- * documentation — and agree on HOW: one timestamp taken from the release, entries in
- * sorted order, and `-C dir` repeated per file because it governs the ONE operand
- * after it. That agreement lives here so it is stated once.
- */
-enum Archiving {
-    ;
-
-    record Archive(Path archive, Path from, String date, List<String> extra) implements Command {
-        List<String> arguments() {
-            final List<String> arguments = new ArrayList<>(List.of(
-                    "--create", "--file", archive.toString(), "--date", date));
-            arguments.addAll(extra);
-            for (final String entry : sorted(from)) {
-                arguments.add("-C");
-                arguments.add(from.toString());
-                arguments.add(entry);
-            }
-            return arguments;
-        }
-
-        List<String> sorted(final Path root) {
-            return Exceptional.yoda(() -> {
-                try (Stream<Path> tree = Files.walk(root)) {
-                    return tree.filter(Files::isRegularFile)
-                            .map(file -> root.relativize(file).toString())
-                            .sorted(Comparator.naturalOrder())
-                            .toList();
-                }
-            });
-        }
-
-        @Override
-        public void execute() {
-            new Tool("jar").run(arguments());
-        }
-    }
-}
--- a/software/visionary/reboot/andraia/JavaDoc.java
@@ -44,7 +44,7 @@ final class JavaDoc implements Command {
 		final Path archive = artifacts.javadoc();
 		final Path from = layout.documentation();
 		final String date = new ReleaseDate(artifacts.resolution().version()).iso();
-		new Archiving.Archive(archive, from, date, List.of()).execute();
 	}
 
 	List<String> arguments() {
--- a/software/visionary/reboot/andraia/Repeatable.java
@@ -32,7 +32,7 @@ public final class Repeatable implements Runnable {
 		final Path archive = artifacts.jar();
 		final Path from = layout.classes();
 		final String date = new ReleaseDate(coordinate.version()).iso();
-		new Archiving.Archive(archive, from, date, List.of("--manifest", manifest(coordinate).toString(),
 								"--module-version", coordinate.version())).execute();
 	}
 
--- a/software/visionary/reboot/andraia/RepeatableSources.java
@@ -54,6 +54,6 @@ public final class RepeatableSources implements Build {
         final Path archive = artifacts.sources();
         final Path from = layout.sources();
         final String date = new ReleaseDate(artifacts.resolution().version()).iso();
-        new Archiving.Archive(archive, from, date, List.of()).execute();
     }
 }
new file mode 100644
+++ b/software/visionary/reboot/andraia/Archive.java
@@ -0,0 +1,42 @@
+package software.visionary.reboot.andraia;
+
+import software.visionary.commander.Command;
+import software.visionary.exceptional.Exceptional;
+import software.visionary.reboot.java.Tool;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Stream;
+
+record Archive(Path archive, Path from, String date, List<String> extra) implements Command {
+	List<String> arguments() {
+		final List<String> arguments = new ArrayList<>(List.of(
+				"--create", "--file", archive.toString(), "--date", date));
+		arguments.addAll(extra);
+		for (final String entry : sorted(from)) {
+			arguments.add("-C");
+			arguments.add(from.toString());
+			arguments.add(entry);
+		}
+		return arguments;
+	}
+
+	List<String> sorted(final Path root) {
+		return Exceptional.yoda(() -> {
+			try (Stream<Path> tree = Files.walk(root)) {
+				return tree.filter(Files::isRegularFile)
+						.map(file -> root.relativize(file).toString())
+						.sorted(Comparator.naturalOrder())
+						.toList();
+			}
+		});
+	}
+
+	@Override
+	public void execute() {
+		new Tool("jar").run(arguments());
+	}
+}
deleted file mode 100644
+++ /dev/null
@@ -1,59 +0,0 @@
+++ b/software/visionary/reboot/andraia/JavaDoc.java
@@ -44,7 +44,7 @@ final class JavaDoc implements Command {
 		final Path archive = artifacts.javadoc();
 		final Path from = layout.documentation();
 		final String date = new ReleaseDate(artifacts.resolution().version()).iso();
+		new Archive(archive, from, date, List.of()).execute();
 	}
 
 	List<String> arguments() {
+++ b/software/visionary/reboot/andraia/Repeatable.java
@@ -32,7 +32,7 @@ public final class Repeatable implements Runnable {
 		final Path archive = artifacts.jar();
 		final Path from = layout.classes();
 		final String date = new ReleaseDate(coordinate.version()).iso();
+		new Archive(archive, from, date, List.of("--manifest", manifest(coordinate).toString(),
 								"--module-version", coordinate.version())).execute();
 	}
 
+++ b/software/visionary/reboot/andraia/RepeatableSources.java
@@ -54,6 +54,6 @@ public final class RepeatableSources implements Build {
         final Path archive = artifacts.sources();
         final Path from = layout.sources();
         final String date = new ReleaseDate(artifacts.resolution().version()).iso();
+        new Archive(archive, from, date, List.of()).execute();
     }
 }
16. functionalize logic +3 −9
--- a/software/visionary/reboot/andraia/Archive.java
@@ -13,15 +13,7 @@ import java.util.stream.Stream;
 
 record Archive(Path archive, Path from, String date, List<String> extra) implements Command {
 	List<String> arguments() {
-		final List<String> arguments = new ArrayList<>(List.of(
-				"--create", "--file", archive.toString(), "--date", date));
-		arguments.addAll(extra);
-		for (final String entry : sorted(from)) {
-			arguments.add("-C");
-			arguments.add(from.toString());
-			arguments.add(entry);
-		}
-		return arguments;
 	}
 
 	List<String> sorted(final Path root) {
@@ -30,6 +22,8 @@ record Archive(Path archive, Path from, String date, List<String> extra) impleme
 				return tree.filter(Files::isRegularFile)
 						.map(file -> root.relativize(file).toString())
 						.sorted(Comparator.naturalOrder())
 						.toList();
 			}
 		});
+++ b/software/visionary/reboot/andraia/Archive.java
@@ -13,15 +13,7 @@ import java.util.stream.Stream;
 
 record Archive(Path archive, Path from, String date, List<String> extra) implements Command {
 	List<String> arguments() {
+		return Stream.concat(List.of("--create", "--file", archive.toString(), "--date", date).stream(), sorted(from).stream()).toList();
 	}
 
 	List<String> sorted(final Path root) {
@@ -30,6 +22,8 @@ record Archive(Path archive, Path from, String date, List<String> extra) impleme
 				return tree.filter(Files::isRegularFile)
 						.map(file -> root.relativize(file).toString())
 						.sorted(Comparator.naturalOrder())
+						.map(s -> List.of("-C", from.toString(), s))
+						.flatMap(List::stream)
 						.toList();
 			}
 		});
17. partition responsibilites +21 −27
--- a/software/visionary/reboot/andraia/Archive.java
@@ -6,29 +6,32 @@ import software.visionary.reboot.java.Tool;
 
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Stream;
 
 record Archive(Path archive, Path from, String date, List<String> extra) implements Command {
 	List<String> arguments() {
-		return Stream.concat(List.of("--create", "--file", archive.toString(), "--date", date).stream(), sorted(from).stream()).toList();
 	}
 
 	List<String> sorted(final Path root) {
 		return Exceptional.yoda(() -> {
 			try (Stream<Path> tree = Files.walk(root)) {
-				return tree.filter(Files::isRegularFile)
-						.map(file -> root.relativize(file).toString())
-						.sorted(Comparator.naturalOrder())
-						.map(s -> List.of("-C", from.toString(), s))
-						.flatMap(List::stream)
-						.toList();
 			}
 		});
 	}
 
 	@Override
 	public void execute() {
 		new Tool("jar").run(arguments());
--- a/software/visionary/reboot/andraia/JavaDoc.java
@@ -4,7 +4,6 @@ import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.api.DependencyResolutionStrategy;
-import software.visionary.reboot.java.Artifacts;
 import software.visionary.reboot.java.JavaSources;
 import software.visionary.reboot.java.ModuleNames;
 import software.visionary.reboot.java.Tool;
@@ -30,8 +29,6 @@ final class JavaDoc implements Command {
 	public void execute() {
 		Exceptional.yoda(() -> Files.createDirectories(layout.documentation()));
 		runJavaDoc();
-		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
-		buildArchive();
 	}
 
 	private void runJavaDoc() {
@@ -39,27 +36,19 @@ final class JavaDoc implements Command {
 		new Tool("javadoc").run(arguments);
 	}
 
-	private void buildArchive() {
-		final Artifacts artifacts = new Artifacts(layout);
-		final Path archive = artifacts.javadoc();
-		final Path from = layout.documentation();
-		final String date = new ReleaseDate(artifacts.resolution().version()).iso();
-		new Archive(archive, from, date, List.of()).execute();
-	}
-
 	List<String> arguments() {
 		final List<String> arguments = new ArrayList<>();
-		arguments.addAll(resolveDependencies());
 		arguments.addAll(commandArguments());
 		arguments.addAll(sources());
 		return arguments;
 	}
 
-	private List<String> resolveDependencies() {
 		return Stream.of("Compile", "Provided")
 				.map(marker -> Exceptional.yoda(() -> resolver.resolve(layout.moduleInfo()).pathFor(marker)))
 				.flatMap(List::stream)
-				.map(this::toDiskPath)
 				.map(Objects::toString)
 				.reduce((a, b) -> a + File.pathSeparator + b)
 				.map(s -> List.of("--module-path", s))
@@ -83,7 +72,4 @@ final class JavaDoc implements Command {
 		return new JavaSources(layout.sources(), ".java").all();
 	}
 
-	Path toDiskPath(final Path path) {
-		return Path.of(System.getProperty("user.home"), ".m2", "repository").resolve(path.toString());
-	}
 }
--- a/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -13,6 +13,7 @@ import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.Resolver;
 import software.visionary.reboot.dot.matrix.api.DependencyResolutionStrategy;
 import software.visionary.reboot.java.CompileJava;
 
 /**
@@ -25,7 +26,8 @@ import software.visionary.reboot.java.CompileJava;
  * rather than a repeat of {@link RepeatableSources}.
  */
 public final class RepeatableJavadoc implements Build {
-	private final JavaDoc doc;
 
     /** Documents the module the given layout is rooted at. */
         public RepeatableJavadoc() {
@@ -34,7 +36,8 @@ public final class RepeatableJavadoc implements Build {
     }
 
     public RepeatableJavadoc(final Layout layout, final DependencyResolutionStrategy resolver) {
-	    doc = new JavaDoc(layout, resolver);
     }
 
     /**
@@ -51,6 +54,8 @@ public final class RepeatableJavadoc implements Build {
     @Override
     public void execute() {
         doc.execute();
     }
 
     List<String> arguments() {
+++ b/software/visionary/reboot/andraia/Archive.java
@@ -6,29 +6,32 @@ import software.visionary.reboot.java.Tool;
 
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Stream;
 
 record Archive(Path archive, Path from, String date, List<String> extra) implements Command {
 	List<String> arguments() {
+		return Stream.concat(Stream.of("--create", "--file", archive.toString(), "--date", date), sorted(from).stream()).toList();
 	}
 
 	List<String> sorted(final Path root) {
 		return Exceptional.yoda(() -> {
 			try (Stream<Path> tree = Files.walk(root)) {
+				return arguments(root, tree);
 			}
 		});
 	}
 
+	private List<String> arguments(final Path root, final Stream<Path> tree) {
+		return tree.filter(Files::isRegularFile)
+				.map(file -> root.relativize(file).toString())
+				.sorted(Comparator.naturalOrder())
+				.map(s -> List.of("-C", from.toString(), s))
+				.flatMap(List::stream)
+				.toList();
+	}
+
 	@Override
 	public void execute() {
 		new Tool("jar").run(arguments());
+++ b/software/visionary/reboot/andraia/JavaDoc.java
@@ -4,7 +4,6 @@ import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.api.DependencyResolutionStrategy;
 import software.visionary.reboot.java.JavaSources;
 import software.visionary.reboot.java.ModuleNames;
 import software.visionary.reboot.java.Tool;
@@ -30,8 +29,6 @@ final class JavaDoc implements Command {
 	public void execute() {
 		Exceptional.yoda(() -> Files.createDirectories(layout.documentation()));
 		runJavaDoc();
 	}
 
 	private void runJavaDoc() {
@@ -39,27 +36,19 @@ final class JavaDoc implements Command {
 		new Tool("javadoc").run(arguments);
 	}
 
 	List<String> arguments() {
 		final List<String> arguments = new ArrayList<>();
+		arguments.addAll(resolveDependencies(Path.of(System.getProperty("user.home"), ".m2", "repository")));
 		arguments.addAll(commandArguments());
 		arguments.addAll(sources());
 		return arguments;
 	}
 
+	private List<String> resolveDependencies(final Path repository) {
 		return Stream.of("Compile", "Provided")
 				.map(marker -> Exceptional.yoda(() -> resolver.resolve(layout.moduleInfo()).pathFor(marker)))
 				.flatMap(List::stream)
+				.map(path -> repository.resolve(path.toString()))
 				.map(Objects::toString)
 				.reduce((a, b) -> a + File.pathSeparator + b)
 				.map(s -> List.of("--module-path", s))
@@ -83,7 +72,4 @@ final class JavaDoc implements Command {
 		return new JavaSources(layout.sources(), ".java").all();
 	}
 
 }
+++ b/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -13,6 +13,7 @@ import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.Resolver;
 import software.visionary.reboot.dot.matrix.api.DependencyResolutionStrategy;
+import software.visionary.reboot.java.Artifacts;
 import software.visionary.reboot.java.CompileJava;
 
 /**
@@ -25,7 +26,8 @@ import software.visionary.reboot.java.CompileJava;
  * rather than a repeat of {@link RepeatableSources}.
  */
 public final class RepeatableJavadoc implements Build {
+    private final Layout layout;
+    private final JavaDoc doc;
 
     /** Documents the module the given layout is rooted at. */
         public RepeatableJavadoc() {
@@ -34,7 +36,8 @@ public final class RepeatableJavadoc implements Build {
     }
 
     public RepeatableJavadoc(final Layout layout, final DependencyResolutionStrategy resolver) {
+            this.layout = layout;
+            doc = new JavaDoc(layout, resolver);
     }
 
     /**
@@ -51,6 +54,8 @@ public final class RepeatableJavadoc implements Build {
     @Override
     public void execute() {
         doc.execute();
+        final Artifacts artifacts = new Artifacts(layout);
+        new Archive(artifacts.javadoc(), layout.documentation(), new ReleaseDate(artifacts.resolution().version()).iso(), List.of()).execute();
     }
 
     List<String> arguments() {

Phase 4: Factory method cascade

Introduce locals to name things, extract methods to isolate them, then wrap each construction in a static factory method. Once there are enough parallel factories, consolidate.

18. INTRODUCE LOCAL VARIABLE +2 −1
--- a/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -55,7 +55,8 @@ public final class RepeatableJavadoc implements Build {
     public void execute() {
         doc.execute();
         final Artifacts artifacts = new Artifacts(layout);
-        new Archive(artifacts.javadoc(), layout.documentation(), new ReleaseDate(artifacts.resolution().version()).iso(), List.of()).execute();
     }
 
     List<String> arguments() {
+++ b/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -55,7 +55,8 @@ public final class RepeatableJavadoc implements Build {
     public void execute() {
         doc.execute();
         final Artifacts artifacts = new Artifacts(layout);
+        final var archive = new Archive(artifacts.javadoc(), layout.documentation(), new ReleaseDate(artifacts.resolution().version()).iso(), List.of());
+        archive.execute();
     }
 
     List<String> arguments() {
19. EXTRACT METHOD +7 −1
--- a/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -9,6 +9,7 @@ import java.net.URI;
 import java.nio.file.FileSystems;
 import java.util.List;
 
 import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.Resolver;
@@ -54,9 +55,14 @@ public final class RepeatableJavadoc implements Build {
     @Override
     public void execute() {
         doc.execute();
         final Artifacts artifacts = new Artifacts(layout);
         final var archive = new Archive(artifacts.javadoc(), layout.documentation(), new ReleaseDate(artifacts.resolution().version()).iso(), List.of());
-        archive.execute();
     }
 
     List<String> arguments() {
+++ b/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -9,6 +9,7 @@ import java.net.URI;
 import java.nio.file.FileSystems;
 import java.util.List;
 
+import org.jspecify.annotations.NonNull;
 import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.Resolver;
@@ -54,9 +55,14 @@ public final class RepeatableJavadoc implements Build {
     @Override
     public void execute() {
         doc.execute();
+        final var archive = getArchive();
+        archive.execute();
+    }
+
+    private @NonNull Archive getArchive() {
         final Artifacts artifacts = new Artifacts(layout);
         final var archive = new Archive(artifacts.javadoc(), layout.documentation(), new ReleaseDate(artifacts.resolution().version()).iso(), List.of());
+        return archive;
     }
 
     List<String> arguments() {
20. INTRODUCE STATIC FACTORY METHOD +11 −11
--- a/software/visionary/reboot/andraia/Archive.java
@@ -1,7 +1,10 @@
 package software.visionary.reboot.andraia;
 
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.java.Tool;
 
 import java.nio.file.Files;
@@ -11,6 +14,12 @@ import java.util.List;
 import java.util.stream.Stream;
 
 record Archive(Path archive, Path from, String date, List<String> extra) implements Command {
 	List<String> arguments() {
 		return Stream.concat(Stream.of("--create", "--file", archive.toString(), "--date", date), sorted(from).stream()).toList();
 	}
--- a/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -9,12 +9,10 @@ import java.net.URI;
 import java.nio.file.FileSystems;
 import java.util.List;
 
-import org.jspecify.annotations.NonNull;
 import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.Resolver;
 import software.visionary.reboot.dot.matrix.api.DependencyResolutionStrategy;
-import software.visionary.reboot.java.Artifacts;
 import software.visionary.reboot.java.CompileJava;
 
 /**
@@ -27,8 +25,8 @@ import software.visionary.reboot.java.CompileJava;
  * rather than a repeat of {@link RepeatableSources}.
  */
 public final class RepeatableJavadoc implements Build {
-    private final Layout layout;
     private final JavaDoc doc;
 
     /** Documents the module the given layout is rooted at. */
         public RepeatableJavadoc() {
@@ -37,8 +35,8 @@ public final class RepeatableJavadoc implements Build {
     }
 
     public RepeatableJavadoc(final Layout layout, final DependencyResolutionStrategy resolver) {
-            this.layout = layout;
             doc = new JavaDoc(layout, resolver);
     }
 
     /**
@@ -55,16 +53,9 @@ public final class RepeatableJavadoc implements Build {
     @Override
     public void execute() {
         doc.execute();
-        final var archive = getArchive();
         archive.execute();
     }
 
-    private @NonNull Archive getArchive() {
-        final Artifacts artifacts = new Artifacts(layout);
-        final var archive = new Archive(artifacts.javadoc(), layout.documentation(), new ReleaseDate(artifacts.resolution().version()).iso(), List.of());
-        return archive;
-    }
-
     List<String> arguments() {
         return doc.arguments();
     }
+++ b/software/visionary/reboot/andraia/Archive.java
@@ -1,7 +1,10 @@
 package software.visionary.reboot.andraia;
 
+import org.jspecify.annotations.NonNull;
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
+import software.visionary.reboot.Layout;
+import software.visionary.reboot.java.Artifacts;
 import software.visionary.reboot.java.Tool;
 
 import java.nio.file.Files;
@@ -11,6 +14,12 @@ import java.util.List;
 import java.util.stream.Stream;
 
 record Archive(Path archive, Path from, String date, List<String> extra) implements Command {
+	static @NonNull Archive getArchive(final Layout layout) {
+	    final Artifacts artifacts = new Artifacts(layout);
+	    final var archive = new Archive(artifacts.javadoc(), layout.documentation(), new ReleaseDate(artifacts.resolution().version()).iso(), List.of());
+	    return archive;
+	}
+
 	List<String> arguments() {
 		return Stream.concat(Stream.of("--create", "--file", archive.toString(), "--date", date), sorted(from).stream()).toList();
 	}
+++ b/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -9,12 +9,10 @@ import java.net.URI;
 import java.nio.file.FileSystems;
 import java.util.List;
 
 import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.Resolver;
 import software.visionary.reboot.dot.matrix.api.DependencyResolutionStrategy;
 import software.visionary.reboot.java.CompileJava;
 
 /**
@@ -27,8 +25,8 @@ import software.visionary.reboot.java.CompileJava;
  * rather than a repeat of {@link RepeatableSources}.
  */
 public final class RepeatableJavadoc implements Build {
     private final JavaDoc doc;
+    private final Archive archive;
 
     /** Documents the module the given layout is rooted at. */
         public RepeatableJavadoc() {
@@ -37,8 +35,8 @@ public final class RepeatableJavadoc implements Build {
     }
 
     public RepeatableJavadoc(final Layout layout, final DependencyResolutionStrategy resolver) {
             doc = new JavaDoc(layout, resolver);
+            archive = Archive.getArchive(layout);
     }
 
     /**
@@ -55,16 +53,9 @@ public final class RepeatableJavadoc implements Build {
     @Override
     public void execute() {
         doc.execute();
         archive.execute();
     }
 
     List<String> arguments() {
         return doc.arguments();
     }
21. EXTRACT LOCAL VARIABLE +6 −7
--- a/software/visionary/reboot/andraia/Archive.java
@@ -1,6 +1,5 @@
 package software.visionary.reboot.andraia;
 
-import org.jspecify.annotations.NonNull;
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
@@ -14,7 +13,7 @@ import java.util.List;
 import java.util.stream.Stream;
 
 record Archive(Path archive, Path from, String date, List<String> extra) implements Command {
-	static @NonNull Archive getArchive(final Layout layout) {
 	    final Artifacts artifacts = new Artifacts(layout);
 	    final var archive = new Archive(artifacts.javadoc(), layout.documentation(), new ReleaseDate(artifacts.resolution().version()).iso(), List.of());
 	    return archive;
--- a/software/visionary/reboot/andraia/Repeatable.java
@@ -29,11 +29,11 @@ public final class Repeatable implements Runnable {
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 		// Idempotent where javac already stamped; THE stamp for a module whose
 		// realization was among its own sources.
-		final Path archive = artifacts.jar();
-		final Path from = layout.classes();
-		final String date = new ReleaseDate(coordinate.version()).iso();
-		new Archive(archive, from, date, List.of("--manifest", manifest(coordinate).toString(),
-								"--module-version", coordinate.version())).execute();
 	}
 
 	private Path manifest(final Resolution coordinate) {
+++ b/software/visionary/reboot/andraia/Archive.java
@@ -1,6 +1,5 @@
 package software.visionary.reboot.andraia;
 
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
@@ -14,7 +13,7 @@ import java.util.List;
 import java.util.stream.Stream;
 
 record Archive(Path archive, Path from, String date, List<String> extra) implements Command {
+	static Archive getArchive(final Layout layout) {
 	    final Artifacts artifacts = new Artifacts(layout);
 	    final var archive = new Archive(artifacts.javadoc(), layout.documentation(), new ReleaseDate(artifacts.resolution().version()).iso(), List.of());
 	    return archive;
+++ b/software/visionary/reboot/andraia/Repeatable.java
@@ -29,11 +29,11 @@ public final class Repeatable implements Runnable {
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 		// Idempotent where javac already stamped; THE stamp for a module whose
 		// realization was among its own sources.
+		final var archive = new Archive(artifacts.jar(),
+				layout.classes(),
+				new ReleaseDate(coordinate.version()).iso(), List.of("--manifest", manifest(coordinate).toString(),
+				"--module-version", coordinate.version()));
+		archive.execute();
 	}
 
 	private Path manifest(final Resolution coordinate) {
22. INTRODUCE STATIC FACTORY METHOD +27 −19
--- a/software/visionary/reboot/andraia/Archive.java
@@ -1,11 +1,14 @@
 package software.visionary.reboot.andraia;
 
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.Artifacts;
 import software.visionary.reboot.java.Tool;
 
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Comparator;
@@ -19,6 +22,29 @@ record Archive(Path archive, Path from, String date, List<String> extra) impleme
 	    return archive;
 	}
 
 	List<String> arguments() {
 		return Stream.concat(Stream.of("--create", "--file", archive.toString(), "--date", date), sorted(from).stream()).toList();
 	}
--- a/software/visionary/reboot/andraia/Repeatable.java
@@ -9,7 +9,6 @@ import software.visionary.reboot.java.Artifacts;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.List;
 
 public final class Repeatable implements Runnable {
 	private final Layout layout;
@@ -29,24 +28,7 @@ public final class Repeatable implements Runnable {
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 		// Idempotent where javac already stamped; THE stamp for a module whose
 		// realization was among its own sources.
-		final var archive = new Archive(artifacts.jar(),
-				layout.classes(),
-				new ReleaseDate(coordinate.version()).iso(), List.of("--manifest", manifest(coordinate).toString(),
-				"--module-version", coordinate.version()));
 		archive.execute();
 	}
-
-	private Path manifest(final Resolution coordinate) {
-		return Exceptional.yoda(() -> {
-			final Path manifest = Files.createDirectories(layout.resolved())
-					.resolve("REPEATABLE-MANIFEST.MF");
-			Files.writeString(manifest, String.join("\n",
-					"Manifest-Version: 1.0",
-					"Implementation-Title: " + coordinate.axis().artifact(),
-					"Implementation-Version: " + coordinate.version(),
-					"") + "\n", StandardCharsets.UTF_8);
-			return manifest;
-		});
-	}
-
 }
+++ b/software/visionary/reboot/andraia/Archive.java
@@ -1,11 +1,14 @@
 package software.visionary.reboot.andraia;
 
+import org.jspecify.annotations.NonNull;
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
+import software.visionary.reboot.dot.matrix.Resolution;
 import software.visionary.reboot.java.Artifacts;
 import software.visionary.reboot.java.Tool;
 
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Comparator;
@@ -19,6 +22,29 @@ record Archive(Path archive, Path from, String date, List<String> extra) impleme
 	    return archive;
 	}
 
+	static @NonNull Archive getArchive(final Repeatable repeatable,
+	                                   final Artifacts artifacts,
+	                                   final Resolution coordinate,
+	                                   final Layout layout) {
+		return new Archive(artifacts.jar(),
+				layout.classes(),
+				new ReleaseDate(coordinate.version()).iso(), List.of("--manifest", manifest(coordinate, layout).toString(),
+				"--module-version", coordinate.version()));
+	}
+
+	private static Path manifest(final Resolution coordinate, final Layout layout) {
+		return Exceptional.yoda(() -> {
+			final Path manifest = Files.createDirectories(layout.resolved())
+					.resolve("REPEATABLE-MANIFEST.MF");
+			Files.writeString(manifest, String.join("\n",
+					"Manifest-Version: 1.0",
+					"Implementation-Title: " + coordinate.axis().artifact(),
+					"Implementation-Version: " + coordinate.version(),
+					"") + "\n", StandardCharsets.UTF_8);
+			return manifest;
+		});
+	}
+
 	List<String> arguments() {
 		return Stream.concat(Stream.of("--create", "--file", archive.toString(), "--date", date), sorted(from).stream()).toList();
 	}
+++ b/software/visionary/reboot/andraia/Repeatable.java
@@ -9,7 +9,6 @@ import software.visionary.reboot.java.Artifacts;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 
 public final class Repeatable implements Runnable {
 	private final Layout layout;
@@ -29,24 +28,7 @@ public final class Repeatable implements Runnable {
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 		// Idempotent where javac already stamped; THE stamp for a module whose
 		// realization was among its own sources.
+		final var archive = Archive.getArchive(this, artifacts, coordinate, layout);
 		archive.execute();
 	}
 }
23. INLINE VARIABLE + EXTRACT LOCAL VARIABLE +2 −4
--- a/software/visionary/reboot/andraia/RepeatableSources.java
@@ -51,9 +51,7 @@ public final class RepeatableSources implements Build {
             throw new BuildFailed("no " + layout.sources() + " to archive");
         }
         Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
-        final Path archive = artifacts.sources();
-        final Path from = layout.sources();
-        final String date = new ReleaseDate(artifacts.resolution().version()).iso();
-        new Archive(archive, from, date, List.of()).execute();
     }
 }
+++ b/software/visionary/reboot/andraia/RepeatableSources.java
@@ -51,9 +51,7 @@ public final class RepeatableSources implements Build {
             throw new BuildFailed("no " + layout.sources() + " to archive");
         }
         Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
+        final var archive = new Archive(artifacts.sources(), layout.sources(), new ReleaseDate(artifacts.resolution().version()).iso(), List.of());
+        archive.execute();
     }
 }

Phase 5: Standardize & converge

The factories consolidate. The abstract factory emerges. Parallel implementations get standardized into the same structural shape. The refactorer notices the pattern hiding in the code.

24. consolidate STATIC FACTORY METHOD +28 −20
--- a/software/visionary/reboot/andraia/Archive.java
@@ -16,20 +16,30 @@ import java.util.List;
 import java.util.stream.Stream;
 
 record Archive(Path archive, Path from, String date, List<String> extra) implements Command {
-	static Archive getArchive(final Layout layout) {
 	    final Artifacts artifacts = new Artifacts(layout);
-	    final var archive = new Archive(artifacts.javadoc(), layout.documentation(), new ReleaseDate(artifacts.resolution().version()).iso(), List.of());
-	    return archive;
 	}
 
-	static @NonNull Archive getArchive(final Repeatable repeatable,
-	                                   final Artifacts artifacts,
-	                                   final Resolution coordinate,
-	                                   final Layout layout) {
-		return new Archive(artifacts.jar(),
-				layout.classes(),
-				new ReleaseDate(coordinate.version()).iso(), List.of("--manifest", manifest(coordinate, layout).toString(),
-				"--module-version", coordinate.version()));
 	}
 
 	private static Path manifest(final Resolution coordinate, final Layout layout) {
@@ -45,6 +55,8 @@ record Archive(Path archive, Path from, String date, List<String> extra) impleme
 		});
 	}
 
 	List<String> arguments() {
 		return Stream.concat(Stream.of("--create", "--file", archive.toString(), "--date", date), sorted(from).stream()).toList();
 	}
--- a/software/visionary/reboot/andraia/Repeatable.java
@@ -6,9 +6,7 @@ import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.Resolution;
 import software.visionary.reboot.java.Artifacts;
 
-import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
-import java.nio.file.Path;
 
 public final class Repeatable implements Runnable {
 	private final Layout layout;
@@ -19,8 +17,6 @@ public final class Repeatable implements Runnable {
 
 	@Override
 	public void run() {
-		final Artifacts artifacts = new Artifacts(layout);
-		final Resolution coordinate = artifacts.resolution();
 		if (!Files.isDirectory(layout.classes())) {
 			throw new BuildFailed("no " + layout.classes()
 					+ " — run CompileJava before RepeatableBuild");
@@ -28,7 +24,7 @@ public final class Repeatable implements Runnable {
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 		// Idempotent where javac already stamped; THE stamp for a module whose
 		// realization was among its own sources.
-		final var archive = Archive.getArchive(this, artifacts, coordinate, layout);
 		archive.execute();
 	}
 }
--- a/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -36,7 +36,7 @@ public final class RepeatableJavadoc implements Build {
 
     public RepeatableJavadoc(final Layout layout, final DependencyResolutionStrategy resolver) {
             doc = new JavaDoc(layout, resolver);
-            archive = Archive.getArchive(layout);
     }
 
     /**
--- a/software/visionary/reboot/andraia/RepeatableSources.java
@@ -6,8 +6,8 @@
 package software.visionary.reboot.andraia;
 
 import java.nio.file.Files;
-import java.nio.file.Path;
 import java.util.List;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Build;
 import software.visionary.reboot.BuildFailed;
@@ -46,12 +46,12 @@ public final class RepeatableSources implements Build {
 
     @Override
     public void execute() {
-        final Artifacts artifacts = new Artifacts(layout);
         if (!Files.isDirectory(layout.sources())) {
             throw new BuildFailed("no " + layout.sources() + " to archive");
         }
         Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
-        final var archive = new Archive(artifacts.sources(), layout.sources(), new ReleaseDate(artifacts.resolution().version()).iso(), List.of());
         archive.execute();
     }
 }
+++ b/software/visionary/reboot/andraia/Archive.java
@@ -16,20 +16,30 @@ import java.util.List;
 import java.util.stream.Stream;
 
 record Archive(Path archive, Path from, String date, List<String> extra) implements Command {
+	static Archive javadoc(final Layout layout) {
 	    final Artifacts artifacts = new Artifacts(layout);
+		final var javadoc = artifacts.javadoc();
+		final var documentation = layout.documentation();
+		final var iso = new ReleaseDate(artifacts.resolution().version()).iso();
+		final var extra1 = List.<String >of();
+		return new Archive(javadoc, documentation, iso, extra1);
 	}
 
+	static @NonNull Archive sources(final Layout layout) {
+		final Artifacts artifacts = new Artifacts(layout);
+		return new Archive(artifacts.sources(), layout.sources(), new ReleaseDate(artifacts.resolution().version()).iso(), List.of());
+	}
+
+	static @NonNull Archive jar(final Layout layout) {
+		final Artifacts artifacts = new Artifacts(layout);
+		final Resolution coordinate = artifacts.resolution();
+
+		final var jar = artifacts.jar();
+		final var classes = layout.classes();
+		final var iso = new ReleaseDate(coordinate.version()).iso();
+		final var extra1 = List.of("--manifest", manifest(coordinate, layout).toString(),
+				"--module-version", coordinate.version());
+		return new Archive(jar, classes, iso, extra1);
 	}
 
 	private static Path manifest(final Resolution coordinate, final Layout layout) {
@@ -45,6 +55,8 @@ record Archive(Path archive, Path from, String date, List<String> extra) impleme
 		});
 	}
 
+
+
 	List<String> arguments() {
 		return Stream.concat(Stream.of("--create", "--file", archive.toString(), "--date", date), sorted(from).stream()).toList();
 	}
+++ b/software/visionary/reboot/andraia/Repeatable.java
@@ -6,9 +6,7 @@ import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.Resolution;
 import software.visionary.reboot.java.Artifacts;
 
 import java.nio.file.Files;
 
 public final class Repeatable implements Runnable {
 	private final Layout layout;
@@ -19,8 +17,6 @@ public final class Repeatable implements Runnable {
 
 	@Override
 	public void run() {
 		if (!Files.isDirectory(layout.classes())) {
 			throw new BuildFailed("no " + layout.classes()
 					+ " — run CompileJava before RepeatableBuild");
@@ -28,7 +24,7 @@ public final class Repeatable implements Runnable {
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 		// Idempotent where javac already stamped; THE stamp for a module whose
 		// realization was among its own sources.
+		final var archive = Archive.jar(layout);
 		archive.execute();
 	}
 }
+++ b/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -36,7 +36,7 @@ public final class RepeatableJavadoc implements Build {
 
     public RepeatableJavadoc(final Layout layout, final DependencyResolutionStrategy resolver) {
             doc = new JavaDoc(layout, resolver);
+            archive = Archive.javadoc(layout);
     }
 
     /**
+++ b/software/visionary/reboot/andraia/RepeatableSources.java
@@ -6,8 +6,8 @@
 package software.visionary.reboot.andraia;
 
 import java.nio.file.Files;
 import java.util.List;
+
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Build;
 import software.visionary.reboot.BuildFailed;
@@ -46,12 +46,12 @@ public final class RepeatableSources implements Build {
 
     @Override
     public void execute() {
         if (!Files.isDirectory(layout.sources())) {
             throw new BuildFailed("no " + layout.sources() + " to archive");
         }
         Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
+        final var archive = Archive.sources(layout);
         archive.execute();
     }
+
 }
25. INTRODUCE ABSTRACT FACTORY METHOD +73 −50
--- a/software/visionary/reboot/andraia/Archive.java
@@ -1,14 +1,9 @@
 package software.visionary.reboot.andraia;
 
-import org.jspecify.annotations.NonNull;
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
-import software.visionary.reboot.Layout;
-import software.visionary.reboot.dot.matrix.Resolution;
-import software.visionary.reboot.java.Artifacts;
 import software.visionary.reboot.java.Tool;
 
-import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Comparator;
@@ -16,45 +11,6 @@ import java.util.List;
 import java.util.stream.Stream;
 
 record Archive(Path archive, Path from, String date, List<String> extra) implements Command {
-	static Archive javadoc(final Layout layout) {
-	    final Artifacts artifacts = new Artifacts(layout);
-		final var javadoc = artifacts.javadoc();
-		final var documentation = layout.documentation();
-		final var iso = new ReleaseDate(artifacts.resolution().version()).iso();
-		final var extra1 = List.<String >of();
-		return new Archive(javadoc, documentation, iso, extra1);
-	}
-
-	static @NonNull Archive sources(final Layout layout) {
-		final Artifacts artifacts = new Artifacts(layout);
-		return new Archive(artifacts.sources(), layout.sources(), new ReleaseDate(artifacts.resolution().version()).iso(), List.of());
-	}
-
-	static @NonNull Archive jar(final Layout layout) {
-		final Artifacts artifacts = new Artifacts(layout);
-		final Resolution coordinate = artifacts.resolution();
-
-		final var jar = artifacts.jar();
-		final var classes = layout.classes();
-		final var iso = new ReleaseDate(coordinate.version()).iso();
-		final var extra1 = List.of("--manifest", manifest(coordinate, layout).toString(),
-				"--module-version", coordinate.version());
-		return new Archive(jar, classes, iso, extra1);
-	}
-
-	private static Path manifest(final Resolution coordinate, final Layout layout) {
-		return Exceptional.yoda(() -> {
-			final Path manifest = Files.createDirectories(layout.resolved())
-					.resolve("REPEATABLE-MANIFEST.MF");
-			Files.writeString(manifest, String.join("\n",
-					"Manifest-Version: 1.0",
-					"Implementation-Title: " + coordinate.axis().artifact(),
-					"Implementation-Version: " + coordinate.version(),
-					"") + "\n", StandardCharsets.UTF_8);
-			return manifest;
-		});
-	}
-
 
 
 	List<String> arguments() {
new file mode 100644
--- /dev/null
@@ -0,0 +1,8 @@
new file mode 100644
--- /dev/null
@@ -0,0 +1,62 @@
--- a/software/visionary/reboot/andraia/Repeatable.java
@@ -3,8 +3,6 @@ package software.visionary.reboot.andraia;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.BuildFailed;
 import software.visionary.reboot.Layout;
-import software.visionary.reboot.dot.matrix.Resolution;
-import software.visionary.reboot.java.Artifacts;
 
 import java.nio.file.Files;
 
@@ -24,7 +22,7 @@ public final class Repeatable implements Runnable {
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 		// Idempotent where javac already stamped; THE stamp for a module whose
 		// realization was among its own sources.
-		final var archive = Archive.jar(layout);
 		archive.execute();
 	}
 }
--- a/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -36,7 +36,7 @@ public final class RepeatableJavadoc implements Build {
 
     public RepeatableJavadoc(final Layout layout, final DependencyResolutionStrategy resolver) {
             doc = new JavaDoc(layout, resolver);
-            archive = Archive.javadoc(layout);
     }
 
     /**
--- a/software/visionary/reboot/andraia/RepeatableSources.java
@@ -12,7 +12,6 @@ import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Build;
 import software.visionary.reboot.BuildFailed;
 import software.visionary.reboot.Layout;
-import software.visionary.reboot.java.Artifacts;
 import software.visionary.reboot.java.CompileJava;
 
 /**
@@ -50,7 +49,7 @@ public final class RepeatableSources implements Build {
             throw new BuildFailed("no " + layout.sources() + " to archive");
         }
         Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
-        final var archive = Archive.sources(layout);
         archive.execute();
     }
+++ b/software/visionary/reboot/andraia/Archive.java
@@ -1,14 +1,9 @@
 package software.visionary.reboot.andraia;
 
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.java.Tool;
 
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Comparator;
@@ -16,45 +11,6 @@ import java.util.List;
 import java.util.stream.Stream;
 
 record Archive(Path archive, Path from, String date, List<String> extra) implements Command {
 
 
 	List<String> arguments() {
new file mode 100644
+++ b/software/visionary/reboot/andraia/ArchiveFactory.java
@@ -0,0 +1,8 @@
+package software.visionary.reboot.andraia;
+
+import software.visionary.reboot.Layout;
+
+import java.util.function.Function;
+
+public interface ArchiveFactory extends Function<Layout, Archive> {
+}
new file mode 100644
+++ b/software/visionary/reboot/andraia/Archives.java
@@ -0,0 +1,62 @@
+package software.visionary.reboot.andraia;
+
+import software.visionary.exceptional.Exceptional;
+import software.visionary.reboot.Layout;
+import software.visionary.reboot.dot.matrix.Resolution;
+import software.visionary.reboot.java.Artifacts;
+
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+
+public enum Archives implements ArchiveFactory {
+	JAR {
+		@Override
+		public Archive apply(final Layout layout) {
+			final Artifacts artifacts = new Artifacts(layout);
+			final Resolution coordinate = artifacts.resolution();
+
+			final var jar = artifacts.jar();
+			final var classes = layout.classes();
+			final var iso = new ReleaseDate(coordinate.version()).iso();
+			final var extra1 = List.of("--manifest", manifest(coordinate, layout).toString(),
+					"--module-version", coordinate.version());
+			return new Archive(jar, classes, iso, extra1);
+		}
+
+		private static Path manifest(final Resolution coordinate, final Layout layout) {
+			return Exceptional.yoda(() -> {
+				final Path manifest = Files.createDirectories(layout.resolved())
+						.resolve("REPEATABLE-MANIFEST.MF");
+				Files.writeString(manifest, String.join("\n",
+						"Manifest-Version: 1.0",
+						"Implementation-Title: " + coordinate.axis().artifact(),
+						"Implementation-Version: " + coordinate.version(),
+						"") + "\n", StandardCharsets.UTF_8);
+				return manifest;
+			});
+		}
+	},
+	SOURCES {
+		@Override
+		public Archive apply(final Layout layout) {
+			final Artifacts artifacts = new Artifacts(layout);
+			return new Archive(artifacts.sources(), layout.sources(), new ReleaseDate(artifacts.resolution().version()).iso(), List.of());
+		}
+	},
+	JAVADOC {
+		@Override
+		public Archive apply(final Layout layout) {
+			final Artifacts artifacts = new Artifacts(layout);
+			final var javadoc = artifacts.javadoc();
+			final var documentation = layout.documentation();
+			final var iso = new ReleaseDate(artifacts.resolution().version()).iso();
+			final var extra1 = List.<String >of();
+			return new Archive(javadoc, documentation, iso, extra1);
+		}
+	};
+
+	@Override
+	public abstract Archive apply(final Layout layout);
+}
+++ b/software/visionary/reboot/andraia/Repeatable.java
@@ -3,8 +3,6 @@ package software.visionary.reboot.andraia;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.BuildFailed;
 import software.visionary.reboot.Layout;
 
 import java.nio.file.Files;
 
@@ -24,7 +22,7 @@ public final class Repeatable implements Runnable {
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 		// Idempotent where javac already stamped; THE stamp for a module whose
 		// realization was among its own sources.
+		final var archive = Archives.JAR.apply(layout);
 		archive.execute();
 	}
 }
+++ b/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -36,7 +36,7 @@ public final class RepeatableJavadoc implements Build {
 
     public RepeatableJavadoc(final Layout layout, final DependencyResolutionStrategy resolver) {
             doc = new JavaDoc(layout, resolver);
+        archive = Archives.JAVADOC.apply(layout);
     }
 
     /**
+++ b/software/visionary/reboot/andraia/RepeatableSources.java
@@ -12,7 +12,6 @@ import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Build;
 import software.visionary.reboot.BuildFailed;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.CompileJava;
 
 /**
@@ -50,7 +49,7 @@ public final class RepeatableSources implements Build {
             throw new BuildFailed("no " + layout.sources() + " to archive");
         }
         Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
+        final var archive = Archives.SOURCES.apply(layout);
         archive.execute();
     }
26. Manifest is a Command +37 −15
--- a/software/visionary/reboot/andraia/Archives.java
@@ -1,5 +1,6 @@
 package software.visionary.reboot.andraia;
 
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.Resolution;
@@ -10,7 +11,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.List;
 
-public enum Archives implements ArchiveFactory {
 	JAR {
 		@Override
 		public Archive apply(final Layout layout) {
@@ -20,29 +21,49 @@ public enum Archives implements ArchiveFactory {
 			final var jar = artifacts.jar();
 			final var classes = layout.classes();
 			final var iso = new ReleaseDate(coordinate.version()).iso();
-			final var extra1 = List.of("--manifest", manifest(coordinate, layout).toString(),
 					"--module-version", coordinate.version());
 			return new Archive(jar, classes, iso, extra1);
 		}
 
-		private static Path manifest(final Resolution coordinate, final Layout layout) {
-			return Exceptional.yoda(() -> {
-				final Path manifest = Files.createDirectories(layout.resolved())
-						.resolve("REPEATABLE-MANIFEST.MF");
-				Files.writeString(manifest, String.join("\n",
-						"Manifest-Version: 1.0",
-						"Implementation-Title: " + coordinate.axis().artifact(),
-						"Implementation-Version: " + coordinate.version(),
-						"") + "\n", StandardCharsets.UTF_8);
-				return manifest;
-			});
 		}
 	},
 	SOURCES {
 		@Override
 		public Archive apply(final Layout layout) {
 			final Artifacts artifacts = new Artifacts(layout);
-			return new Archive(artifacts.sources(), layout.sources(), new ReleaseDate(artifacts.resolution().version()).iso(), List.of());
 		}
 	},
 	JAVADOC {
@@ -51,7 +72,8 @@ public enum Archives implements ArchiveFactory {
 			final Artifacts artifacts = new Artifacts(layout);
 			final var javadoc = artifacts.javadoc();
 			final var documentation = layout.documentation();
-			final var iso = new ReleaseDate(artifacts.resolution().version()).iso();
 			final var extra1 = List.<String >of();
 			return new Archive(javadoc, documentation, iso, extra1);
 		}
+++ b/software/visionary/reboot/andraia/Archives.java
@@ -1,5 +1,6 @@
 package software.visionary.reboot.andraia;
 
+import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.dot.matrix.Resolution;
@@ -10,7 +11,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.List;
 
+enum Archives implements ArchiveFactory {
 	JAR {
 		@Override
 		public Archive apply(final Layout layout) {
@@ -20,29 +21,49 @@ public enum Archives implements ArchiveFactory {
 			final var jar = artifacts.jar();
 			final var classes = layout.classes();
 			final var iso = new ReleaseDate(coordinate.version()).iso();
+			final var manifest = new Manifest(layout);
+			manifest.execute();
+			final var extra1 = List.of("--manifest", manifest.toString(),
 					"--module-version", coordinate.version());
 			return new Archive(jar, classes, iso, extra1);
 		}
 
+		record Manifest(Layout layout) implements Command {
+			public static final String LOCATION = "REPEATABLE-MANIFEST.MF";
+			public static final String MANIFEST_VERSION = "1.0";
+			public static final String MANIFEST_VERSION_HEADER = "Manifest-Version: " + MANIFEST_VERSION;
+			public static final String IMPLEMENTATION_TITLE = "Implementation-Title: ";
+			public static final String IMPLEMENTATION_VERSION = "Implementation-Version: ";
+
+			@Override
+			public String toString() {
+				final Artifacts artifacts = new Artifacts(layout);
+				final Resolution coordinate = artifacts.resolution();
+				return String.join("\n",
+						Manifest.MANIFEST_VERSION_HEADER,
+						Manifest.IMPLEMENTATION_TITLE + coordinate.axis().artifact(),
+						Manifest.IMPLEMENTATION_VERSION + coordinate.version(),
+						"") + "\n";
+			}
+
+			@Override
+			public void execute() {
+				Exceptional.yoda(() -> {
+					final Path manifest = Files.createDirectories(layout.resolved()).resolve(Manifest.LOCATION);
+					Files.writeString(manifest, new Manifest(layout).toString(), StandardCharsets.UTF_8);
+					return manifest;
+				});
+			}
 		}
 	},
 	SOURCES {
 		@Override
 		public Archive apply(final Layout layout) {
 			final Artifacts artifacts = new Artifacts(layout);
+			final var resolution = artifacts.resolution();
+			final var iso = new ReleaseDate(resolution.version()).iso();
+			final List<String> extra = List.of();
+			return new Archive(artifacts.sources(), layout.sources(), iso, extra);
 		}
 	},
 	JAVADOC {
@@ -51,7 +72,8 @@ public enum Archives implements ArchiveFactory {
 			final Artifacts artifacts = new Artifacts(layout);
 			final var javadoc = artifacts.javadoc();
 			final var documentation = layout.documentation();
+			final var resolution = artifacts.resolution();
+			final var iso = new ReleaseDate(resolution.version()).iso();
 			final var extra1 = List.<String >of();
 			return new Archive(javadoc, documentation, iso, extra1);
 		}
27. standardize form +40 −37
--- a/software/visionary/reboot/andraia/Archives.java
@@ -17,44 +17,14 @@ enum Archives implements ArchiveFactory {
 		public Archive apply(final Layout layout) {
 			final Artifacts artifacts = new Artifacts(layout);
 			final Resolution coordinate = artifacts.resolution();
-
-			final var jar = artifacts.jar();
-			final var classes = layout.classes();
 			final var iso = new ReleaseDate(coordinate.version()).iso();
 			final var manifest = new Manifest(layout);
 			manifest.execute();
 			final var extra1 = List.of("--manifest", manifest.toString(),
 					"--module-version", coordinate.version());
-			return new Archive(jar, classes, iso, extra1);
 		}
 
-		record Manifest(Layout layout) implements Command {
-			public static final String LOCATION = "REPEATABLE-MANIFEST.MF";
-			public static final String MANIFEST_VERSION = "1.0";
-			public static final String MANIFEST_VERSION_HEADER = "Manifest-Version: " + MANIFEST_VERSION;
-			public static final String IMPLEMENTATION_TITLE = "Implementation-Title: ";
-			public static final String IMPLEMENTATION_VERSION = "Implementation-Version: ";
-
-			@Override
-			public String toString() {
-				final Artifacts artifacts = new Artifacts(layout);
-				final Resolution coordinate = artifacts.resolution();
-				return String.join("\n",
-						Manifest.MANIFEST_VERSION_HEADER,
-						Manifest.IMPLEMENTATION_TITLE + coordinate.axis().artifact(),
-						Manifest.IMPLEMENTATION_VERSION + coordinate.version(),
-						"") + "\n";
-			}
-
-			@Override
-			public void execute() {
-				Exceptional.yoda(() -> {
-					final Path manifest = Files.createDirectories(layout.resolved()).resolve(Manifest.LOCATION);
-					Files.writeString(manifest, new Manifest(layout).toString(), StandardCharsets.UTF_8);
-					return manifest;
-				});
-			}
-		}
 	},
 	SOURCES {
 		@Override
@@ -62,23 +32,56 @@ enum Archives implements ArchiveFactory {
 			final Artifacts artifacts = new Artifacts(layout);
 			final var resolution = artifacts.resolution();
 			final var iso = new ReleaseDate(resolution.version()).iso();
-			final List<String> extra = List.of();
-			return new Archive(artifacts.sources(), layout.sources(), iso, extra);
 		}
 	},
 	JAVADOC {
 		@Override
 		public Archive apply(final Layout layout) {
 			final Artifacts artifacts = new Artifacts(layout);
-			final var javadoc = artifacts.javadoc();
-			final var documentation = layout.documentation();
 			final var resolution = artifacts.resolution();
 			final var iso = new ReleaseDate(resolution.version()).iso();
-			final var extra1 = List.<String >of();
-			return new Archive(javadoc, documentation, iso, extra1);
 		}
 	};
 
 	@Override
 	public abstract Archive apply(final Layout layout);
 }
+++ b/software/visionary/reboot/andraia/Archives.java
@@ -17,44 +17,14 @@ enum Archives implements ArchiveFactory {
 		public Archive apply(final Layout layout) {
 			final Artifacts artifacts = new Artifacts(layout);
 			final Resolution coordinate = artifacts.resolution();
 			final var iso = new ReleaseDate(coordinate.version()).iso();
 			final var manifest = new Manifest(layout);
 			manifest.execute();
 			final var extra1 = List.of("--manifest", manifest.toString(),
 					"--module-version", coordinate.version());
+			return new Archive(artifacts.jar(), layout.classes(), iso, extra1);
 		}
 
 	},
 	SOURCES {
 		@Override
@@ -62,23 +32,56 @@ enum Archives implements ArchiveFactory {
 			final Artifacts artifacts = new Artifacts(layout);
 			final var resolution = artifacts.resolution();
 			final var iso = new ReleaseDate(resolution.version()).iso();
+			final var manifest = new Manifest(layout);
+			manifest.execute();
+			final var extra1 = List.of("--manifest", manifest.toString(),
+					"--module-version", resolution.version());
+
+			return new Archive(artifacts.sources(), layout.sources(), iso, extra1);
 		}
 	},
 	JAVADOC {
 		@Override
 		public Archive apply(final Layout layout) {
 			final Artifacts artifacts = new Artifacts(layout);
 			final var resolution = artifacts.resolution();
 			final var iso = new ReleaseDate(resolution.version()).iso();
+			final var manifest = new Manifest(layout);
+			manifest.execute();
+			final var extra1 = List.of("--manifest", manifest.toString(),
+					"--module-version", resolution.version());
+			return new Archive(artifacts.javadoc(), layout.documentation(), iso, extra1);
 		}
 	};
 
+	record Manifest(Layout layout) implements Command {
+		public static final String LOCATION = "REPEATABLE-MANIFEST.MF";
+		public static final String MANIFEST_VERSION = "1.0";
+		public static final String MANIFEST_VERSION_HEADER = "Manifest-Version: " + MANIFEST_VERSION;
+		public static final String IMPLEMENTATION_TITLE = "Implementation-Title: ";
+		public static final String IMPLEMENTATION_VERSION = "Implementation-Version: ";
+
+		@Override
+		public String toString() {
+			final Artifacts artifacts = new Artifacts(layout);
+			final Resolution coordinate = artifacts.resolution();
+			return String.join("\n",
+					Manifest.MANIFEST_VERSION_HEADER,
+					Manifest.IMPLEMENTATION_TITLE + coordinate.axis().artifact(),
+					Manifest.IMPLEMENTATION_VERSION + coordinate.version(),
+					"") + "\n";
+		}
+
+		@Override
+		public void execute() {
+			Exceptional.yoda(() -> {
+				final Path manifest = Files.createDirectories(layout.resolved()).resolve(Manifest.LOCATION);
+				Files.writeString(manifest, new Manifest(layout).toString(), StandardCharsets.UTF_8);
+				return manifest;
+			});
+		}
+	}
+
 	@Override
 	public abstract Archive apply(final Layout layout);
 }
28. make uniform +59 −63
--- a/software/visionary/reboot/andraia/Archive.java
@@ -2,15 +2,19 @@ package software.visionary.reboot.andraia;
 
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.java.Tool;
 
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Stream;
 
-record Archive(Path archive, Path from, String date, List<String> extra) implements Command {
 
 
 	List<String> arguments() {
@@ -36,6 +40,39 @@ record Archive(Path archive, Path from, String date, List<String> extra) impleme
 
 	@Override
 	public void execute() {
 		new Tool("jar").run(arguments());
 	}
 }
--- a/software/visionary/reboot/andraia/Archives.java
@@ -1,87 +1,41 @@
 package software.visionary.reboot.andraia;
 
-import software.visionary.commander.Command;
-import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Layout;
-import software.visionary.reboot.dot.matrix.Resolution;
 import software.visionary.reboot.java.Artifacts;
 
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.List;
-
 enum Archives implements ArchiveFactory {
 	JAR {
 		@Override
-		public Archive apply(final Layout layout) {
 			final Artifacts artifacts = new Artifacts(layout);
-			final Resolution coordinate = artifacts.resolution();
-			final var iso = new ReleaseDate(coordinate.version()).iso();
-			final var manifest = new Manifest(layout);
-			manifest.execute();
-			final var extra1 = List.of("--manifest", manifest.toString(),
-					"--module-version", coordinate.version());
-			return new Archive(artifacts.jar(), layout.classes(), iso, extra1);
 		}
-
 	},
 	SOURCES {
 		@Override
-		public Archive apply(final Layout layout) {
 			final Artifacts artifacts = new Artifacts(layout);
-			final var resolution = artifacts.resolution();
-			final var iso = new ReleaseDate(resolution.version()).iso();
-			final var manifest = new Manifest(layout);
-			manifest.execute();
-			final var extra1 = List.of("--manifest", manifest.toString(),
-					"--module-version", resolution.version());
-
-			return new Archive(artifacts.sources(), layout.sources(), iso, extra1);
 		}
 	},
 	JAVADOC {
 		@Override
-		public Archive apply(final Layout layout) {
 			final Artifacts artifacts = new Artifacts(layout);
-			final var resolution = artifacts.resolution();
-			final var iso = new ReleaseDate(resolution.version()).iso();
-			final var manifest = new Manifest(layout);
-			manifest.execute();
-			final var extra1 = List.of("--manifest", manifest.toString(),
-					"--module-version", resolution.version());
-			return new Archive(artifacts.javadoc(), layout.documentation(), iso, extra1);
 		}
 	};
 
-	record Manifest(Layout layout) implements Command {
-		public static final String LOCATION = "REPEATABLE-MANIFEST.MF";
-		public static final String MANIFEST_VERSION = "1.0";
-		public static final String MANIFEST_VERSION_HEADER = "Manifest-Version: " + MANIFEST_VERSION;
-		public static final String IMPLEMENTATION_TITLE = "Implementation-Title: ";
-		public static final String IMPLEMENTATION_VERSION = "Implementation-Version: ";
-
-		@Override
-		public String toString() {
-			final Artifacts artifacts = new Artifacts(layout);
-			final Resolution coordinate = artifacts.resolution();
-			return String.join("\n",
-					Manifest.MANIFEST_VERSION_HEADER,
-					Manifest.IMPLEMENTATION_TITLE + coordinate.axis().artifact(),
-					Manifest.IMPLEMENTATION_VERSION + coordinate.version(),
-					"") + "\n";
-		}
-
-		@Override
-		public void execute() {
-			Exceptional.yoda(() -> {
-				final Path manifest = Files.createDirectories(layout.resolved()).resolve(Manifest.LOCATION);
-				Files.writeString(manifest, new Manifest(layout).toString(), StandardCharsets.UTF_8);
-				return manifest;
-			});
-		}
 	}
 
-	@Override
-	public abstract Archive apply(final Layout layout);
 }
--- a/software/visionary/reboot/andraia/ReleaseDate.java
@@ -7,6 +7,7 @@ package software.visionary.reboot.andraia;
 
 import java.time.format.DateTimeParseException;
 import java.time.OffsetDateTime;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -29,6 +30,10 @@ public record ReleaseDate(String version) {
 
     private static final Pattern CALENDAR = Pattern.compile("(\\d{4})\\.(\\d{2})\\.(\\d{2})");
 
     /**
      * The timestamp {@code jar --date} is handed.
      *
+++ b/software/visionary/reboot/andraia/Archive.java
@@ -2,15 +2,19 @@ package software.visionary.reboot.andraia;
 
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
+import software.visionary.reboot.Layout;
+import software.visionary.reboot.dot.matrix.Resolution;
+import software.visionary.reboot.java.Artifacts;
 import software.visionary.reboot.java.Tool;
 
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Stream;
 
+record Archive(Path archive, Path from, ReleaseDate date, Manifest manifest) implements Command {
 
 
 	List<String> arguments() {
@@ -36,6 +40,39 @@ record Archive(Path archive, Path from, String date, List<String> extra) impleme
 
 	@Override
 	public void execute() {
+		manifest.execute();
 		new Tool("jar").run(arguments());
 	}
+
+	record Manifest(Layout layout) implements Command {
+		public static final String LOCATION = "REPEATABLE-MANIFEST.MF";
+		public static final String MANIFEST_VERSION = "1.0";
+		public static final String MANIFEST_VERSION_HEADER = "Manifest-Version: " + MANIFEST_VERSION;
+		public static final String IMPLEMENTATION_TITLE = "Implementation-Title: ";
+		public static final String IMPLEMENTATION_VERSION = "Implementation-Version: ";
+
+		List<String> asCommandLineArgument() {
+			return List.of("--manifest", toString());
+		}
+
+		@Override
+		public String toString() {
+			final Artifacts artifacts = new Artifacts(layout);
+			final Resolution coordinate = artifacts.resolution();
+			return String.join("\n",
+					Manifest.MANIFEST_VERSION_HEADER,
+					Manifest.IMPLEMENTATION_TITLE + coordinate.axis().artifact(),
+					Manifest.IMPLEMENTATION_VERSION + coordinate.version(),
+					"") + "\n";
+		}
+
+		@Override
+		public void execute() {
+			Exceptional.yoda(() -> {
+				final Path manifest = Files.createDirectories(layout.resolved()).resolve(Manifest.LOCATION);
+				Files.writeString(manifest, new Manifest(layout).toString(), StandardCharsets.UTF_8);
+				return manifest;
+			});
+		}
+	}
 }
+++ b/software/visionary/reboot/andraia/Archives.java
@@ -1,87 +1,41 @@
 package software.visionary.reboot.andraia;
 
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.Artifacts;
 
 enum Archives implements ArchiveFactory {
 	JAR {
 		@Override
+		Archive make(Layout layout) {
 			final Artifacts artifacts = new Artifacts(layout);
+			final ReleaseDate iso = new ReleaseDate(artifacts.resolution().version());
+			final Archive.Manifest manifest = new Archive.Manifest(layout);
+			return new Archive(artifacts.jar(), layout.classes(), iso, manifest);
 		}
 	},
 	SOURCES {
 		@Override
+		Archive make(Layout layout) {
 			final Artifacts artifacts = new Artifacts(layout);
+			final ReleaseDate iso = new ReleaseDate(artifacts.resolution().version());
+			final Archive.Manifest manifest = new Archive.Manifest(layout);
+			return new Archive(artifacts.sources(), layout.sources(), iso, manifest);
 		}
 	},
 	JAVADOC {
 		@Override
+		Archive make(Layout layout) {
 			final Artifacts artifacts = new Artifacts(layout);
+			final ReleaseDate iso = new ReleaseDate(artifacts.resolution().version());
+			final Archive.Manifest manifest = new Archive.Manifest(layout);
+			return new Archive(artifacts.javadoc(), layout.documentation(), iso, manifest);
 		}
 	};
 
+	@Override
+	public Archive apply(final Layout layout) {
+		return make(layout);
 	}
 
+	abstract Archive make(Layout layout);
 }
+++ b/software/visionary/reboot/andraia/ReleaseDate.java
@@ -7,6 +7,7 @@ package software.visionary.reboot.andraia;
 
 import java.time.format.DateTimeParseException;
 import java.time.OffsetDateTime;
+import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -29,6 +30,10 @@ public record ReleaseDate(String version) {
 
     private static final Pattern CALENDAR = Pattern.compile("(\\d{4})\\.(\\d{2})\\.(\\d{2})");
 
+    List<String> asCommandLineArgument() {
+        return List.of("--module-version", version());
+    }
+
     /**
      * The timestamp {@code jar --date} is handed.
      *
29. I've never seen this shape before in my life...what pattern is this? +14 −13
--- a/software/visionary/reboot/andraia/Archive.java
@@ -18,7 +18,7 @@ record Archive(Path archive, Path from, ReleaseDate date, Manifest manifest) imp
 
 
 	List<String> arguments() {
-		return Stream.concat(Stream.of("--create", "--file", archive.toString(), "--date", date), sorted(from).stream()).toList();
 	}
 
 	List<String> sorted(final Path root) {
--- a/software/visionary/reboot/andraia/Archives.java
@@ -7,35 +7,36 @@ enum Archives implements ArchiveFactory {
 	JAR {
 		@Override
 		Archive make(Layout layout) {
-			final Artifacts artifacts = new Artifacts(layout);
-			final ReleaseDate iso = new ReleaseDate(artifacts.resolution().version());
-			final Archive.Manifest manifest = new Archive.Manifest(layout);
-			return new Archive(artifacts.jar(), layout.classes(), iso, manifest);
 		}
 	},
 	SOURCES {
 		@Override
 		Archive make(Layout layout) {
-			final Artifacts artifacts = new Artifacts(layout);
-			final ReleaseDate iso = new ReleaseDate(artifacts.resolution().version());
-			final Archive.Manifest manifest = new Archive.Manifest(layout);
-			return new Archive(artifacts.sources(), layout.sources(), iso, manifest);
 		}
 	},
 	JAVADOC {
 		@Override
 		Archive make(Layout layout) {
-			final Artifacts artifacts = new Artifacts(layout);
-			final ReleaseDate iso = new ReleaseDate(artifacts.resolution().version());
-			final Archive.Manifest manifest = new Archive.Manifest(layout);
-			return new Archive(artifacts.javadoc(), layout.documentation(), iso, manifest);
 		}
 	};
 
 	@Override
 	public Archive apply(final Layout layout) {
 		return make(layout);
 	}
 
 	abstract Archive make(Layout layout);
 }
+++ b/software/visionary/reboot/andraia/Archive.java
@@ -18,7 +18,7 @@ record Archive(Path archive, Path from, ReleaseDate date, Manifest manifest) imp
 
 
 	List<String> arguments() {
+		return Stream.concat(Stream.of("--create", "--file", archive.toString(), "--date", date.iso()), sorted(from).stream()).toList();
 	}
 
 	List<String> sorted(final Path root) {
+++ b/software/visionary/reboot/andraia/Archives.java
@@ -7,35 +7,36 @@ enum Archives implements ArchiveFactory {
 	JAR {
 		@Override
 		Archive make(Layout layout) {
+			return new Archive(artifacts().jar(), layout.classes(), release(), manifest());
 		}
 	},
 	SOURCES {
 		@Override
 		Archive make(Layout layout) {
+			return new Archive(artifacts().sources(), layout.sources(), release(), manifest());
 		}
 	},
 	JAVADOC {
 		@Override
 		Archive make(Layout layout) {
+			return new Archive(artifacts().javadoc(), layout.documentation(), release(), manifest());
 		}
 	};
 
+	private Layout layout;
+
+	void setLayout(Layout layout) {
+		this.layout = layout;
+	}
+
 	@Override
 	public Archive apply(final Layout layout) {
+		setLayout(layout);
 		return make(layout);
 	}
 
 	abstract Archive make(Layout layout);
+	Artifacts artifacts() { return  new Artifacts(layout); }
+	ReleaseDate release() { return new ReleaseDate(artifacts().resolution().version()); }
+	Archive.Manifest manifest() { return new Archive.Manifest(layout); }
 }
30. well this is certainly something +42 −39
--- a/software/visionary/reboot/andraia/Archive.java
@@ -14,11 +14,15 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Stream;
 
-record Archive(Path archive, Path from, ReleaseDate date, Manifest manifest) implements Command {
-
-
 	List<String> arguments() {
-		return Stream.concat(Stream.of("--create", "--file", archive.toString(), "--date", date.iso()), sorted(from).stream()).toList();
 	}
 
 	List<String> sorted(final Path root) {
@@ -33,14 +37,14 @@ record Archive(Path archive, Path from, ReleaseDate date, Manifest manifest) imp
 		return tree.filter(Files::isRegularFile)
 				.map(file -> root.relativize(file).toString())
 				.sorted(Comparator.naturalOrder())
-				.map(s -> List.of("-C", from.toString(), s))
 				.flatMap(List::stream)
 				.toList();
 	}
 
 	@Override
 	public void execute() {
-		manifest.execute();
 		new Tool("jar").run(arguments());
 	}
 
deleted file mode 100644
--- a/software/visionary/reboot/andraia/ArchiveFactory.java
@@ -1,8 +0,0 @@
-package software.visionary.reboot.andraia;
-
-import software.visionary.reboot.Layout;
-
-import java.util.function.Function;
-
-public interface ArchiveFactory extends Function<Layout, Archive> {
-}
--- a/software/visionary/reboot/andraia/Archives.java
@@ -3,39 +3,35 @@ package software.visionary.reboot.andraia;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.Artifacts;
 
-enum Archives implements ArchiveFactory {
 	JAR {
-		@Override
-		Archive make(Layout layout) {
-			return new Archive(artifacts().jar(), layout.classes(), release(), manifest());
-		}
 	},
 	SOURCES {
-		@Override
-		Archive make(Layout layout) {
-			return new Archive(artifacts().sources(), layout.sources(), release(), manifest());
-		}
 	},
 	JAVADOC {
-		@Override
-		Archive make(Layout layout) {
-			return new Archive(artifacts().javadoc(), layout.documentation(), release(), manifest());
-		}
 	};
 
-	private Layout layout;
 
 	void setLayout(Layout layout) {
 		this.layout = layout;
 	}
 
 	@Override
-	public Archive apply(final Layout layout) {
 		setLayout(layout);
-		return make(layout);
 	}
 
-	abstract Archive make(Layout layout);
 	Artifacts artifacts() { return  new Artifacts(layout); }
 	ReleaseDate release() { return new ReleaseDate(artifacts().resolution().version()); }
 	Archive.Manifest manifest() { return new Archive.Manifest(layout); }
--- a/software/visionary/reboot/andraia/Repeatable.java
@@ -22,7 +22,7 @@ public final class Repeatable implements Runnable {
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 		// Idempotent where javac already stamped; THE stamp for a module whose
 		// realization was among its own sources.
-		final var archive = Archives.JAR.apply(layout);
-		archive.execute();
 	}
 }
--- a/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -26,7 +26,8 @@ import software.visionary.reboot.java.CompileJava;
  */
 public final class RepeatableJavadoc implements Build {
     private final JavaDoc doc;
-    private final Archive archive;
 
     /** Documents the module the given layout is rooted at. */
         public RepeatableJavadoc() {
@@ -35,8 +36,9 @@ public final class RepeatableJavadoc implements Build {
     }
 
     public RepeatableJavadoc(final Layout layout, final DependencyResolutionStrategy resolver) {
             doc = new JavaDoc(layout, resolver);
-        archive = Archives.JAVADOC.apply(layout);
     }
 
     /**
@@ -53,7 +55,7 @@ public final class RepeatableJavadoc implements Build {
     @Override
     public void execute() {
         doc.execute();
-        archive.execute();
     }
 
     List<String> arguments() {
--- a/software/visionary/reboot/andraia/RepeatableSources.java
@@ -49,8 +49,6 @@ public final class RepeatableSources implements Build {
             throw new BuildFailed("no " + layout.sources() + " to archive");
         }
         Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
-        final var archive = Archives.SOURCES.apply(layout);
-        archive.execute();
     }
-
 }
new file mode 100644
--- /dev/null
@@ -0,0 +1,11 @@
+++ b/software/visionary/reboot/andraia/Archive.java
@@ -14,11 +14,15 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Stream;
 
+record Archive(Archives archives) implements Command {
 	List<String> arguments() {
+		return Stream.concat(Stream.of(
+				"--create",
+				"--file",
+				archives().what().toString(),
+				"--date",
+				archives().release().iso()),
+				sorted(archives().where()).stream()).toList();
 	}
 
 	List<String> sorted(final Path root) {
@@ -33,14 +37,14 @@ record Archive(Path archive, Path from, ReleaseDate date, Manifest manifest) imp
 		return tree.filter(Files::isRegularFile)
 				.map(file -> root.relativize(file).toString())
 				.sorted(Comparator.naturalOrder())
+				.map(s -> List.of("-C", archives().where().toString(), s))
 				.flatMap(List::stream)
 				.toList();
 	}
 
 	@Override
 	public void execute() {
+		archives().manifest().execute();
 		new Tool("jar").run(arguments());
 	}
 
deleted file mode 100644
+++ /dev/null
@@ -1,8 +0,0 @@
+++ b/software/visionary/reboot/andraia/Archives.java
@@ -3,39 +3,35 @@ package software.visionary.reboot.andraia;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.Artifacts;
 
+import java.nio.file.Path;
+
+enum Archives implements ToArchive {
 	JAR {
+		@Override public Path what()  { return artifacts().jar(); }
+		@Override public Path where() { return layout.classes(); }
 	},
 	SOURCES {
+		@Override public Path what()  { return artifacts().sources(); }
+		@Override public Path where() { return layout.sources(); }
 	},
 	JAVADOC {
+		@Override public Path what()  { return artifacts().javadoc(); }
+		@Override public Path where() { return layout.documentation(); }
 	};
 
+	protected Layout layout;
 
 	void setLayout(Layout layout) {
 		this.layout = layout;
 	}
 
 	@Override
+	public final void accept(final Layout layout) {
 		setLayout(layout);
+		final Archive archive = new Archive(this);
+		archive.execute();
 	}
 
 	Artifacts artifacts() { return  new Artifacts(layout); }
 	ReleaseDate release() { return new ReleaseDate(artifacts().resolution().version()); }
 	Archive.Manifest manifest() { return new Archive.Manifest(layout); }
+++ b/software/visionary/reboot/andraia/Repeatable.java
@@ -22,7 +22,7 @@ public final class Repeatable implements Runnable {
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 		// Idempotent where javac already stamped; THE stamp for a module whose
 		// realization was among its own sources.
+		final var archive = Archives.JAR;
+		archive.accept(layout);
 	}
 }
+++ b/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -26,7 +26,8 @@ import software.visionary.reboot.java.CompileJava;
  */
 public final class RepeatableJavadoc implements Build {
     private final JavaDoc doc;
+    private final Archives archive;
+    private final Layout layout;
 
     /** Documents the module the given layout is rooted at. */
         public RepeatableJavadoc() {
@@ -35,8 +36,9 @@ public final class RepeatableJavadoc implements Build {
     }
 
     public RepeatableJavadoc(final Layout layout, final DependencyResolutionStrategy resolver) {
+            this.layout = layout;
             doc = new JavaDoc(layout, resolver);
+        archive = Archives.JAVADOC;
     }
 
     /**
@@ -53,7 +55,7 @@ public final class RepeatableJavadoc implements Build {
     @Override
     public void execute() {
         doc.execute();
+        archive.accept(layout);
     }
 
     List<String> arguments() {
+++ b/software/visionary/reboot/andraia/RepeatableSources.java
@@ -49,8 +49,6 @@ public final class RepeatableSources implements Build {
             throw new BuildFailed("no " + layout.sources() + " to archive");
         }
         Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
+        Archives.SOURCES.accept(layout);
     }
 }
new file mode 100644
+++ b/software/visionary/reboot/andraia/ToArchive.java
@@ -0,0 +1,11 @@
+package software.visionary.reboot.andraia;
+
+import software.visionary.reboot.Layout;
+
+import java.nio.file.Path;
+import java.util.function.Consumer;
+
+public interface ToArchive extends Consumer<Layout> {
+	Path what();
+	Path where();
+}
31. rename for clarity +11 −11
--- a/software/visionary/reboot/andraia/Archive.java
@@ -14,15 +14,15 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Stream;
 
-record Archive(Archives archives) implements Command {
 	List<String> arguments() {
 		return Stream.concat(Stream.of(
 				"--create",
 				"--file",
-				archives().what().toString(),
 				"--date",
-				archives().release().iso()),
-				sorted(archives().where()).stream()).toList();
 	}
 
 	List<String> sorted(final Path root) {
@@ -37,14 +37,14 @@ record Archive(Archives archives) implements Command {
 		return tree.filter(Files::isRegularFile)
 				.map(file -> root.relativize(file).toString())
 				.sorted(Comparator.naturalOrder())
-				.map(s -> List.of("-C", archives().where().toString(), s))
 				.flatMap(List::stream)
 				.toList();
 	}
 
 	@Override
 	public void execute() {
-		archives().manifest().execute();
 		new Tool("jar").run(arguments());
 	}
 
similarity index 96%
rename from src/main/java/software/visionary/reboot/andraia/Archives.java
rename to src/main/java/software/visionary/reboot/andraia/Compiled.java
--- a/software/visionary/reboot/andraia/Archives.java
@@ -5,7 +5,7 @@ import software.visionary.reboot.java.Artifacts;
 
 import java.nio.file.Path;
 
-enum Archives implements ToArchive {
 	JAR {
 		@Override public Path what()  { return artifacts().jar(); }
 		@Override public Path where() { return layout.classes(); }
--- a/software/visionary/reboot/andraia/Repeatable.java
@@ -22,7 +22,7 @@ public final class Repeatable implements Runnable {
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 		// Idempotent where javac already stamped; THE stamp for a module whose
 		// realization was among its own sources.
-		final var archive = Archives.JAR;
 		archive.accept(layout);
 	}
 }
--- a/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -26,7 +26,7 @@ import software.visionary.reboot.java.CompileJava;
  */
 public final class RepeatableJavadoc implements Build {
     private final JavaDoc doc;
-    private final Archives archive;
     private final Layout layout;
 
     /** Documents the module the given layout is rooted at. */
@@ -38,7 +38,7 @@ public final class RepeatableJavadoc implements Build {
     public RepeatableJavadoc(final Layout layout, final DependencyResolutionStrategy resolver) {
             this.layout = layout;
             doc = new JavaDoc(layout, resolver);
-        archive = Archives.JAVADOC;
     }
 
     /**
--- a/software/visionary/reboot/andraia/RepeatableSources.java
@@ -49,6 +49,6 @@ public final class RepeatableSources implements Build {
             throw new BuildFailed("no " + layout.sources() + " to archive");
         }
         Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
-        Archives.SOURCES.accept(layout);
     }
 }
+++ b/software/visionary/reboot/andraia/Archive.java
@@ -14,15 +14,15 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Stream;
 
+record Archive(Compiled compiled) implements Command {
 	List<String> arguments() {
 		return Stream.concat(Stream.of(
 				"--create",
 				"--file",
+				compiled().what().toString(),
 				"--date",
+				compiled().release().iso()),
+				sorted(compiled().where()).stream()).toList();
 	}
 
 	List<String> sorted(final Path root) {
@@ -37,14 +37,14 @@ record Archive(Archives archives) implements Command {
 		return tree.filter(Files::isRegularFile)
 				.map(file -> root.relativize(file).toString())
 				.sorted(Comparator.naturalOrder())
+				.map(s -> List.of("-C", compiled().where().toString(), s))
 				.flatMap(List::stream)
 				.toList();
 	}
 
 	@Override
 	public void execute() {
+		compiled().manifest().execute();
 		new Tool("jar").run(arguments());
 	}
 
similarity index 96%
rename from src/main/java/software/visionary/reboot/andraia/Archives.java
rename to src/main/java/software/visionary/reboot/andraia/Compiled.java
+++ b/software/visionary/reboot/andraia/Compiled.java
@@ -5,7 +5,7 @@ import software.visionary.reboot.java.Artifacts;
 
 import java.nio.file.Path;
 
+enum Compiled implements ToArchive {
 	JAR {
 		@Override public Path what()  { return artifacts().jar(); }
 		@Override public Path where() { return layout.classes(); }
+++ b/software/visionary/reboot/andraia/Repeatable.java
@@ -22,7 +22,7 @@ public final class Repeatable implements Runnable {
 		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
 		// Idempotent where javac already stamped; THE stamp for a module whose
 		// realization was among its own sources.
+		final var archive = Compiled.JAR;
 		archive.accept(layout);
 	}
 }
+++ b/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -26,7 +26,7 @@ import software.visionary.reboot.java.CompileJava;
  */
 public final class RepeatableJavadoc implements Build {
     private final JavaDoc doc;
+    private final Compiled archive;
     private final Layout layout;
 
     /** Documents the module the given layout is rooted at. */
@@ -38,7 +38,7 @@ public final class RepeatableJavadoc implements Build {
     public RepeatableJavadoc(final Layout layout, final DependencyResolutionStrategy resolver) {
             this.layout = layout;
             doc = new JavaDoc(layout, resolver);
+        archive = Compiled.JAVADOC;
     }
 
     /**
+++ b/software/visionary/reboot/andraia/RepeatableSources.java
@@ -49,6 +49,6 @@ public final class RepeatableSources implements Build {
             throw new BuildFailed("no " + layout.sources() + " to archive");
         }
         Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
+        Compiled.SOURCES.accept(layout);
     }
 }
32. inline sprouted class +12 −29
deleted file mode 100644
--- a/software/visionary/reboot/andraia/Repeatable.java
@@ -1,28 +0,0 @@
-package software.visionary.reboot.andraia;
-
-import software.visionary.exceptional.Exceptional;
-import software.visionary.reboot.BuildFailed;
-import software.visionary.reboot.Layout;
-
-import java.nio.file.Files;
-
-public final class Repeatable implements Runnable {
-	private final Layout layout;
-
-	public Repeatable(final Layout layout) {
-		this.layout = layout;
-	}
-
-	@Override
-	public void run() {
-		if (!Files.isDirectory(layout.classes())) {
-			throw new BuildFailed("no " + layout.classes()
-					+ " — run CompileJava before RepeatableBuild");
-		}
-		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
-		// Idempotent where javac already stamped; THE stamp for a module whose
-		// realization was among its own sources.
-		final var archive = Compiled.JAR;
-		archive.accept(layout);
-	}
-}
--- a/software/visionary/reboot/andraia/RepeatableBuild.java
@@ -5,9 +5,12 @@
  */
 package software.visionary.reboot.andraia;
 
 import java.util.List;
 
 import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.CompileJava;
 
@@ -57,6 +60,14 @@ public final class RepeatableBuild implements Build {
 
     @Override
     public void execute() {
-        new Repeatable(layout).run();
     }
 }
deleted file mode 100644
+++ /dev/null
@@ -1,28 +0,0 @@
+++ b/software/visionary/reboot/andraia/RepeatableBuild.java
@@ -5,9 +5,12 @@
  */
 package software.visionary.reboot.andraia;
 
+import java.nio.file.Files;
 import java.util.List;
 
+import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Build;
+import software.visionary.reboot.BuildFailed;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.CompileJava;
 
@@ -57,6 +60,14 @@ public final class RepeatableBuild implements Build {
 
     @Override
     public void execute() {
+        if (!Files.isDirectory(layout.classes())) {
+            throw new BuildFailed("no " + layout.classes()
+                    + " — run CompileJava before RepeatableBuild");
+        }
+        Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
+        // Idempotent where javac already stamped; THE stamp for a module whose
+        // realization was among its own sources.
+        final var archive = Compiled.JAR;
+        archive.accept(layout);
     }
 }

Phase 6: Template method emergence

The parallel implementations now have the same skeleton. Push the variant behavior into overridable methods. The TEMPLATE METHOD pattern emerges — it was always there, but it took 32 commits to see it.

33. the names were swapped +10 −10
--- a/software/visionary/reboot/andraia/Archive.java
@@ -19,10 +19,10 @@ record Archive(Compiled compiled) implements Command {
 		return Stream.concat(Stream.of(
 				"--create",
 				"--file",
-				compiled().what().toString(),
 				"--date",
 				compiled().release().iso()),
-				sorted(compiled().where()).stream()).toList();
 	}
 
 	List<String> sorted(final Path root) {
@@ -37,7 +37,7 @@ record Archive(Compiled compiled) implements Command {
 		return tree.filter(Files::isRegularFile)
 				.map(file -> root.relativize(file).toString())
 				.sorted(Comparator.naturalOrder())
-				.map(s -> List.of("-C", compiled().where().toString(), s))
 				.flatMap(List::stream)
 				.toList();
 	}
--- a/software/visionary/reboot/andraia/Compiled.java
@@ -7,16 +7,16 @@ import java.nio.file.Path;
 
 enum Compiled implements ToArchive {
 	JAR {
-		@Override public Path what()  { return artifacts().jar(); }
-		@Override public Path where() { return layout.classes(); }
 	},
 	SOURCES {
-		@Override public Path what()  { return artifacts().sources(); }
-		@Override public Path where() { return layout.sources(); }
 	},
 	JAVADOC {
-		@Override public Path what()  { return artifacts().javadoc(); }
-		@Override public Path where() { return layout.documentation(); }
 	};
 
 	protected Layout layout;
--- a/software/visionary/reboot/andraia/ToArchive.java
@@ -6,6 +6,6 @@ import java.nio.file.Path;
 import java.util.function.Consumer;
 
 public interface ToArchive extends Consumer<Layout> {
-	Path what();
 	Path where();
 }
+++ b/software/visionary/reboot/andraia/Archive.java
@@ -19,10 +19,10 @@ record Archive(Compiled compiled) implements Command {
 		return Stream.concat(Stream.of(
 				"--create",
 				"--file",
+				compiled().where().toString(),
 				"--date",
 				compiled().release().iso()),
+				sorted(compiled().what()).stream()).toList();
 	}
 
 	List<String> sorted(final Path root) {
@@ -37,7 +37,7 @@ record Archive(Compiled compiled) implements Command {
 		return tree.filter(Files::isRegularFile)
 				.map(file -> root.relativize(file).toString())
 				.sorted(Comparator.naturalOrder())
+				.map(s -> List.of("-C", compiled().what().toString(), s))
 				.flatMap(List::stream)
 				.toList();
 	}
+++ b/software/visionary/reboot/andraia/Compiled.java
@@ -7,16 +7,16 @@ import java.nio.file.Path;
 
 enum Compiled implements ToArchive {
 	JAR {
+		@Override public Path where()  { return artifacts().jar(); }
+		@Override public Path what() { return layout.classes(); }
 	},
 	SOURCES {
+		@Override public Path where()  { return artifacts().sources(); }
+		@Override public Path what() { return layout.sources(); }
 	},
 	JAVADOC {
+		@Override public Path where()  { return artifacts().javadoc(); }
+		@Override public Path what() { return layout.documentation(); }
 	};
 
 	protected Layout layout;
+++ b/software/visionary/reboot/andraia/ToArchive.java
@@ -6,6 +6,6 @@ import java.nio.file.Path;
 import java.util.function.Consumer;
 
 public interface ToArchive extends Consumer<Layout> {
 	Path where();
+	Path what();
 }
34. push enforcement into the TEMPLATE METHOD +11 −19
--- a/software/visionary/reboot/andraia/Compiled.java
@@ -1,8 +1,11 @@
 package software.visionary.reboot.andraia;
 
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.Artifacts;
 
 import java.nio.file.Path;
 
 enum Compiled implements ToArchive {
@@ -29,6 +32,12 @@ enum Compiled implements ToArchive {
 	public final void accept(final Layout layout) {
 		setLayout(layout);
 		final Archive archive = new Archive(this);
 		archive.execute();
 	}
 
--- a/software/visionary/reboot/andraia/RepeatableBuild.java
@@ -60,14 +60,6 @@ public final class RepeatableBuild implements Build {
 
     @Override
     public void execute() {
-        if (!Files.isDirectory(layout.classes())) {
-            throw new BuildFailed("no " + layout.classes()
-                    + " — run CompileJava before RepeatableBuild");
-        }
-        Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
-        // Idempotent where javac already stamped; THE stamp for a module whose
-        // realization was among its own sources.
-        final var archive = Compiled.JAR;
-        archive.accept(layout);
     }
 }
--- a/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -26,7 +26,6 @@ import software.visionary.reboot.java.CompileJava;
  */
 public final class RepeatableJavadoc implements Build {
     private final JavaDoc doc;
-    private final Compiled archive;
     private final Layout layout;
 
     /** Documents the module the given layout is rooted at. */
@@ -38,7 +37,6 @@ public final class RepeatableJavadoc implements Build {
     public RepeatableJavadoc(final Layout layout, final DependencyResolutionStrategy resolver) {
             this.layout = layout;
             doc = new JavaDoc(layout, resolver);
-        archive = Compiled.JAVADOC;
     }
 
     /**
@@ -55,7 +53,7 @@ public final class RepeatableJavadoc implements Build {
     @Override
     public void execute() {
         doc.execute();
-        archive.accept(layout);
     }
 
     List<String> arguments() {
--- a/software/visionary/reboot/andraia/RepeatableSources.java
@@ -5,12 +5,9 @@
  */
 package software.visionary.reboot.andraia;
 
-import java.nio.file.Files;
 import java.util.List;
 
-import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Build;
-import software.visionary.reboot.BuildFailed;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.CompileJava;
 
@@ -45,10 +42,6 @@ public final class RepeatableSources implements Build {
 
     @Override
     public void execute() {
-        if (!Files.isDirectory(layout.sources())) {
-            throw new BuildFailed("no " + layout.sources() + " to archive");
-        }
-        Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
         Compiled.SOURCES.accept(layout);
     }
 }
+++ b/software/visionary/reboot/andraia/Compiled.java
@@ -1,8 +1,11 @@
 package software.visionary.reboot.andraia;
 
+import software.visionary.exceptional.Exceptional;
+import software.visionary.reboot.BuildFailed;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.Artifacts;
 
+import java.nio.file.Files;
 import java.nio.file.Path;
 
 enum Compiled implements ToArchive {
@@ -29,6 +32,12 @@ enum Compiled implements ToArchive {
 	public final void accept(final Layout layout) {
 		setLayout(layout);
 		final Archive archive = new Archive(this);
+		if (!Files.isDirectory(what())) {
+			throw new BuildFailed("no " + what());
+		}
+		Exceptional.yoda(() -> Files.createDirectories(layout.archives()));
+		// Idempotent where javac already stamped; THE stamp for a module whose
+		// realization was among its own sources.
 		archive.execute();
 	}
 
+++ b/software/visionary/reboot/andraia/RepeatableBuild.java
@@ -60,14 +60,6 @@ public final class RepeatableBuild implements Build {
 
     @Override
     public void execute() {
+        Compiled.JAR.accept(layout);
     }
 }
+++ b/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -26,7 +26,6 @@ import software.visionary.reboot.java.CompileJava;
  */
 public final class RepeatableJavadoc implements Build {
     private final JavaDoc doc;
     private final Layout layout;
 
     /** Documents the module the given layout is rooted at. */
@@ -38,7 +37,6 @@ public final class RepeatableJavadoc implements Build {
     public RepeatableJavadoc(final Layout layout, final DependencyResolutionStrategy resolver) {
             this.layout = layout;
             doc = new JavaDoc(layout, resolver);
     }
 
     /**
@@ -55,7 +53,7 @@ public final class RepeatableJavadoc implements Build {
     @Override
     public void execute() {
         doc.execute();
+        Compiled.JAVADOC.accept(layout);
     }
 
     List<String> arguments() {
+++ b/software/visionary/reboot/andraia/RepeatableSources.java
@@ -5,12 +5,9 @@
  */
 package software.visionary.reboot.andraia;
 
 import java.util.List;
 
 import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.CompileJava;
 
@@ -45,10 +42,6 @@ public final class RepeatableSources implements Build {
 
     @Override
     public void execute() {
         Compiled.SOURCES.accept(layout);
     }
 }
35. manifests in all, module-version only for JAR +109 −115
--- a/software/visionary/reboot/andraia/Archive.java
@@ -2,9 +2,6 @@ package software.visionary.reboot.andraia;
 
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
-import software.visionary.reboot.Layout;
-import software.visionary.reboot.dot.matrix.Resolution;
-import software.visionary.reboot.java.Artifacts;
 import software.visionary.reboot.java.Tool;
 
 import java.nio.charset.StandardCharsets;
@@ -12,17 +9,19 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Stream;
 
 record Archive(Compiled compiled) implements Command {
 	List<String> arguments() {
-		return Stream.concat(Stream.of(
-				"--create",
-				"--file",
-				compiled().where().toString(),
-				"--date",
-				compiled().release().iso()),
-				sorted(compiled().what()).stream()).toList();
 	}
 
 	List<String> sorted(final Path root) {
@@ -44,39 +43,15 @@ record Archive(Compiled compiled) implements Command {
 
 	@Override
 	public void execute() {
-		compiled().manifest().execute();
 		new Tool("jar").run(arguments());
 	}
 
-	record Manifest(Layout layout) implements Command {
-		public static final String LOCATION = "REPEATABLE-MANIFEST.MF";
-		public static final String MANIFEST_VERSION = "1.0";
-		public static final String MANIFEST_VERSION_HEADER = "Manifest-Version: " + MANIFEST_VERSION;
-		public static final String IMPLEMENTATION_TITLE = "Implementation-Title: ";
-		public static final String IMPLEMENTATION_VERSION = "Implementation-Version: ";
-
-		List<String> asCommandLineArgument() {
-			return List.of("--manifest", toString());
-		}
-
-		@Override
-		public String toString() {
-			final Artifacts artifacts = new Artifacts(layout);
-			final Resolution coordinate = artifacts.resolution();
-			return String.join("\n",
-					Manifest.MANIFEST_VERSION_HEADER,
-					Manifest.IMPLEMENTATION_TITLE + coordinate.axis().artifact(),
-					Manifest.IMPLEMENTATION_VERSION + coordinate.version(),
-					"") + "\n";
-		}
-
-		@Override
-		public void execute() {
-			Exceptional.yoda(() -> {
-				final Path manifest = Files.createDirectories(layout.resolved()).resolve(Manifest.LOCATION);
-				Files.writeString(manifest, new Manifest(layout).toString(), StandardCharsets.UTF_8);
-				return manifest;
-			});
-		}
 	}
 }
--- a/software/visionary/reboot/andraia/Compiled.java
@@ -3,15 +3,22 @@ package software.visionary.reboot.andraia;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.BuildFailed;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.Artifacts;
 
 import java.nio.file.Files;
 import java.nio.file.Path;
 
 enum Compiled implements ToArchive {
 	JAR {
 		@Override public Path where()  { return artifacts().jar(); }
 		@Override public Path what() { return layout.classes(); }
 	},
 	SOURCES {
 		@Override public Path where()  { return artifacts().sources(); }
@@ -43,5 +50,82 @@ enum Compiled implements ToArchive {
 
 	Artifacts artifacts() { return  new Artifacts(layout); }
 	ReleaseDate release() { return new ReleaseDate(artifacts().resolution().version()); }
-	Archive.Manifest manifest() { return new Archive.Manifest(layout); }
 }
deleted file mode 100644
--- a/software/visionary/reboot/andraia/ReleaseDate.java
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2026 Visionary Software Solutions
- *
- * SPDX-License-Identifier: GPL-3.0-or-later
- */
-package software.visionary.reboot.andraia;
-
-import java.time.format.DateTimeParseException;
-import java.time.OffsetDateTime;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * The one timestamp every entry in a repeatable archive carries.
- *
- * <p>***It comes from the RELEASE, never from the clock.*** A build's own start
- * time is the largest source of variance between two archives of one unchanged
- * tree, and it says nothing a reader wants: what an artifact belongs to is the
- * release it was cut for, which its coordinate already states.
- *
- * <p>A calendar release — {@code 2026.09.17} — is that date at midnight UTC. A
- * release named any other way has no date to take, so it takes the zip epoch:
- * a fixed instant is all repeatability requires, and 1980 is the earliest one a
- * zip entry can represent.
- */
-public record ReleaseDate(String version) {
-    /** The earliest instant a zip entry can hold, for a release with no date in it. */
-    static final String ZIP_EPOCH = "1980-01-01T00:00:00Z";
-
-    private static final Pattern CALENDAR = Pattern.compile("(\\d{4})\\.(\\d{2})\\.(\\d{2})");
-
-    List<String> asCommandLineArgument() {
-        return List.of("--module-version", version());
-    }
-
-    /**
-     * The timestamp {@code jar --date} is handed.
-     *
-     * @return ISO-8601 extended offset date-time, never null
-     */
-    public String iso() {
-        final Matcher release = CALENDAR.matcher(version);
-        return release.matches() ? midnight(release) : ZIP_EPOCH;
-    }
-
-    private static String midnight(final Matcher release) {
-        final String stamp = release.group(1) + "-" + release.group(2) + "-" + release.group(3)
-                + "T00:00:00Z";
-        return representable(stamp) ? stamp : ZIP_EPOCH;
-    }
-
-    /** A version can match the shape and still name no day — {@code 2026.13.45} does. */
-    private static boolean representable(final String stamp) {
-        try {
-            OffsetDateTime.parse(stamp);
-            return true;
-        } catch (final DateTimeParseException noSuchDay) {
-            return false;
-        }
-    }
-}
--- a/software/visionary/reboot/andraia/RepeatableBuild.java
@@ -5,12 +5,9 @@
  */
 package software.visionary.reboot.andraia;
 
-import java.nio.file.Files;
 import java.util.List;
 
-import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.Build;
-import software.visionary.reboot.BuildFailed;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.CompileJava;
 
@@ -22,7 +19,7 @@ import software.visionary.reboot.java.CompileJava;
  * this removes all three:</p>
  *
  * <ul>
- *   <li>***the clock*** — every entry is stamped with {@link ReleaseDate}, taken
  *       from the coordinate the module publishes as;</li>
  *   <li>***the walk order*** — the classes are handed over sorted, because a
  *       directory yields its entries in whatever order the filesystem chose;</li>
--- a/test/software/visionary/reboot/andraia/ReleaseDateTest.java
@@ -11,19 +11,19 @@ class ReleaseDateTest {
     }
 
     final Fact aCalendarReleaseIsThatDayAtMidnightUtc = given(() -> released("2026.09.17"))
-            .when(coordinate -> new ReleaseDate(coordinate).iso())
             .then(new Equaling<>("2026-09-17T00:00:00Z"));
 
     final Fact aReleaseWithNoDateInItTakesTheZipEpoch = given(() -> released("1.2.3"))
-            .when(coordinate -> new ReleaseDate(coordinate).iso())
-            .then(new Equaling<>(ReleaseDate.ZIP_EPOCH));
 
     final Fact aVersionShapedLikeADayThatIsNotOneTakesTheZipEpoch = given(() -> released("2026.13.45"))
-            .when(coordinate -> new ReleaseDate(coordinate).iso())
-            .then(new Equaling<>(ReleaseDate.ZIP_EPOCH));
 
     final Fact theSameReleaseAlwaysGivesTheSameStamp = given(() -> released("2026.08.20"))
-            .when(coordinate -> new ReleaseDate(coordinate).iso()
-                    .equals(new ReleaseDate(coordinate).iso()))
             .then(new Equaling<>(true));
 }
+++ b/software/visionary/reboot/andraia/Archive.java
@@ -2,9 +2,6 @@ package software.visionary.reboot.andraia;
 
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.java.Tool;
 
 import java.nio.charset.StandardCharsets;
@@ -12,17 +9,19 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Comparator;
 import java.util.List;
+import java.util.function.Function;
 import java.util.stream.Stream;
 
 record Archive(Compiled compiled) implements Command {
 	List<String> arguments() {
+		return Stream.of(
+				Stream.of("--create",
+						"--file", compiled().where().toString(),
+						"--date", compiled().release().iso()),
+				compiled().manifest().asCommandLineArgument().stream(),
+				compiled().moduleVersionArgs().stream(),
+				sorted(compiled().what()).stream())
+				.flatMap(Function.identity()).toList();
 	}
 
 	List<String> sorted(final Path root) {
@@ -44,39 +43,15 @@ record Archive(Compiled compiled) implements Command {
 
 	@Override
 	public void execute() {
+		writeManifest();
 		new Tool("jar").run(arguments());
 	}
 
+	private void writeManifest() {
+		Exceptional.yoda(() -> {
+			final Path manifest = Files.createDirectories(compiled().manifest().home()).resolve(Compiled.Manifest.LOCATION);
+			Files.writeString(manifest, compiled().manifest().toString(), StandardCharsets.UTF_8);
+			return manifest;
+		});
 	}
 }
+++ b/software/visionary/reboot/andraia/Compiled.java
@@ -3,15 +3,22 @@ package software.visionary.reboot.andraia;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.BuildFailed;
 import software.visionary.reboot.Layout;
+import software.visionary.reboot.dot.matrix.Resolution;
 import software.visionary.reboot.java.Artifacts;
 
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.time.OffsetDateTime;
+import java.time.format.DateTimeParseException;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 enum Compiled implements ToArchive {
 	JAR {
 		@Override public Path where()  { return artifacts().jar(); }
 		@Override public Path what() { return layout.classes(); }
+		@Override List<String> moduleVersionArgs() { return release().asCommandLineArgument(); }
 	},
 	SOURCES {
 		@Override public Path where()  { return artifacts().sources(); }
@@ -43,5 +50,82 @@ enum Compiled implements ToArchive {
 
 	Artifacts artifacts() { return  new Artifacts(layout); }
 	ReleaseDate release() { return new ReleaseDate(artifacts().resolution().version()); }
+	Manifest manifest() { return new Manifest(layout); }
+	/** Only JAR: {@code --module-version} requires {@code module-info.class} in the archive. */
+	List<String> moduleVersionArgs() { return List.of(); }
+
+	record Manifest(Layout layout) {
+		public static final String LOCATION = "REPEATABLE-MANIFEST.MF";
+		public static final String MANIFEST_VERSION = "1.0";
+		public static final String MANIFEST_VERSION_HEADER = "Manifest-Version: " + MANIFEST_VERSION;
+		public static final String IMPLEMENTATION_TITLE = "Implementation-Title: ";
+		public static final String IMPLEMENTATION_VERSION = "Implementation-Version: ";
+
+		List<String> asCommandLineArgument() {
+			return List.of("--manifest", home().resolve(LOCATION).toString());
+		}
+
+		@Override
+		public String toString() {
+			final Artifacts artifacts = new Artifacts(layout);
+			final Resolution coordinate = artifacts.resolution();
+			return String.join("\n",
+					Manifest.MANIFEST_VERSION_HEADER,
+					Manifest.IMPLEMENTATION_TITLE + coordinate.axis().artifact(),
+					Manifest.IMPLEMENTATION_VERSION + coordinate.version(),
+					"") + "\n";
+		}
+
+		Path home() { return layout.resolved(); }
+	}
+
+	/**
+	 * The one timestamp every entry in a repeatable archive carries.
+	 *
+	 * <p>***It comes from the RELEASE, never from the clock.*** A build's own start
+	 * time is the largest source of variance between two archives of one unchanged
+	 * tree, and it says nothing a reader wants: what an artifact belongs to is the
+	 * release it was cut for, which its coordinate already states.
+	 *
+	 * <p>A calendar release — {@code 2026.09.17} — is that date at midnight UTC. A
+	 * release named any other way has no date to take, so it takes the zip epoch:
+	 * a fixed instant is all repeatability requires, and 1980 is the earliest one a
+	 * zip entry can represent.
+	 */
+	public record ReleaseDate(String version) {
+	    /** The earliest instant a zip entry can hold, for a release with no date in it. */
+	    static final String ZIP_EPOCH = "1980-01-01T00:00:00Z";
+
+	    private static final Pattern CALENDAR = Pattern.compile("(\\d{4})\\.(\\d{2})\\.(\\d{2})");
+
+	    List<String> asCommandLineArgument() {
+	        return List.of("--module-version", version());
+	    }
+
+	    /**
+	     * The timestamp {@code jar --date} is handed.
+	     *
+	     * @return ISO-8601 extended offset date-time, never null
+	     */
+	    public String iso() {
+	        final Matcher release = CALENDAR.matcher(version);
+	        return release.matches() ? midnight(release) : ZIP_EPOCH;
+	    }
+
+	    private static String midnight(final Matcher release) {
+	        final String stamp = release.group(1) + "-" + release.group(2) + "-" + release.group(3)
+	                + "T00:00:00Z";
+	        return representable(stamp) ? stamp : ZIP_EPOCH;
+	    }
+
+	    /** A version can match the shape and still name no day — {@code 2026.13.45} does. */
+	    private static boolean representable(final String stamp) {
+	        try {
+	            OffsetDateTime.parse(stamp);
+	            return true;
+	        } catch (final DateTimeParseException noSuchDay) {
+	            return false;
+	        }
+	    }
+	}
 }
deleted file mode 100644
+++ /dev/null
@@ -1,62 +0,0 @@
+++ b/software/visionary/reboot/andraia/RepeatableBuild.java
@@ -5,12 +5,9 @@
  */
 package software.visionary.reboot.andraia;
 
 import java.util.List;
 
 import software.visionary.reboot.Build;
 import software.visionary.reboot.Layout;
 import software.visionary.reboot.java.CompileJava;
 
@@ -22,7 +19,7 @@ import software.visionary.reboot.java.CompileJava;
  * this removes all three:</p>
  *
  * <ul>
+ *   <li>***the clock*** — every entry is stamped with {@link Compiled.ReleaseDate}, taken
  *       from the coordinate the module publishes as;</li>
  *   <li>***the walk order*** — the classes are handed over sorted, because a
  *       directory yields its entries in whatever order the filesystem chose;</li>
+++ b/test/software/visionary/reboot/andraia/ReleaseDateTest.java
@@ -11,19 +11,19 @@ class ReleaseDateTest {
     }
 
     final Fact aCalendarReleaseIsThatDayAtMidnightUtc = given(() -> released("2026.09.17"))
+            .when(coordinate -> new Compiled.ReleaseDate(coordinate).iso())
             .then(new Equaling<>("2026-09-17T00:00:00Z"));
 
     final Fact aReleaseWithNoDateInItTakesTheZipEpoch = given(() -> released("1.2.3"))
+            .when(coordinate -> new Compiled.ReleaseDate(coordinate).iso())
+            .then(new Equaling<>(Compiled.ReleaseDate.ZIP_EPOCH));
 
     final Fact aVersionShapedLikeADayThatIsNotOneTakesTheZipEpoch = given(() -> released("2026.13.45"))
+            .when(coordinate -> new Compiled.ReleaseDate(coordinate).iso())
+            .then(new Equaling<>(Compiled.ReleaseDate.ZIP_EPOCH));
 
     final Fact theSameReleaseAlwaysGivesTheSameStamp = given(() -> released("2026.08.20"))
+            .when(coordinate -> new Compiled.ReleaseDate(coordinate).iso()
+                    .equals(new Compiled.ReleaseDate(coordinate).iso()))
             .then(new Equaling<>(true));
 }
36. push resolution responsibility into Layout +60 −36
--- a/software/visionary/reboot/andraia/Archive.java
@@ -9,19 +9,18 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Comparator;
 import java.util.List;
-import java.util.function.Function;
 import java.util.stream.Stream;
 
 record Archive(Compiled compiled) implements Command {
 	List<String> arguments() {
-		return Stream.of(
-				Stream.of("--create",
-						"--file", compiled().where().toString(),
-						"--date", compiled().release().iso()),
-				compiled().manifest().asCommandLineArgument().stream(),
-				compiled().moduleVersionArgs().stream(),
-				sorted(compiled().what()).stream())
-				.flatMap(Function.identity()).toList();
 	}
 
 	List<String> sorted(final Path root) {
--- a/software/visionary/reboot/andraia/Compiled.java
@@ -13,6 +13,7 @@ import java.time.format.DateTimeParseException;
 import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 enum Compiled implements ToArchive {
 	JAR {
@@ -54,6 +55,12 @@ enum Compiled implements ToArchive {
 	/** Only JAR: {@code --module-version} requires {@code module-info.class} in the archive. */
 	List<String> moduleVersionArgs() { return List.of(); }
 
 	record Manifest(Layout layout) {
 		public static final String LOCATION = "REPEATABLE-MANIFEST.MF";
 		public static final String MANIFEST_VERSION = "1.0";
--- a/software/visionary/reboot/andraia/JavaDoc.java
@@ -2,27 +2,21 @@ package software.visionary.reboot.andraia;
 
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
-import software.visionary.reboot.Layout;
-import software.visionary.reboot.dot.matrix.api.DependencyResolutionStrategy;
 import software.visionary.reboot.java.JavaSources;
 import software.visionary.reboot.java.ModuleNames;
 import software.visionary.reboot.java.Tool;
 
 import java.io.File;
 import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Stream;
 
 final class JavaDoc implements Command {
-	private final Layout layout;
-	private final DependencyResolutionStrategy resolver;
 
-	JavaDoc(final Layout layout, final DependencyResolutionStrategy resolver) {
 		this.layout = layout;
-		this.resolver = resolver;
 	}
 
 	@Override
@@ -32,23 +26,19 @@ final class JavaDoc implements Command {
 	}
 
 	private void runJavaDoc() {
-		final List<String> arguments = arguments();
-		new Tool("javadoc").run(arguments);
 	}
 
 	List<String> arguments() {
-		final List<String> arguments = new ArrayList<>();
-		arguments.addAll(resolveDependencies(Path.of(System.getProperty("user.home"), ".m2", "repository")));
-		arguments.addAll(commandArguments());
-		arguments.addAll(sources());
-		return arguments;
 	}
 
-	private List<String> resolveDependencies(final Path repository) {
-		return Stream.of("Compile", "Provided")
-				.map(marker -> Exceptional.yoda(() -> resolver.resolve(layout.moduleInfo()).pathFor(marker)))
-				.flatMap(List::stream)
-				.map(path -> repository.resolve(path.toString()))
 				.map(Objects::toString)
 				.reduce((a, b) -> a + File.pathSeparator + b)
 				.map(s -> List.of("--module-path", s))
@@ -56,11 +46,10 @@ final class JavaDoc implements Command {
 	}
 
 	private List<String> commandArguments() {
-		final String moduleName = ModuleNames.of(layout.classes())
-				.or(() -> ModuleNames.of(layout.moduleInfo()))
-				.orElse("");
 		return List.of(
-				"--patch-module", moduleName + "=" + layout.classes(),
 				"-Xdoclint:all,-html", "-quiet",
 				// ***javadoc dates its own output.*** Without this every page differs
 				// between two builds no matter what the archive does.
--- a/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -26,7 +26,7 @@ import software.visionary.reboot.java.CompileJava;
  */
 public final class RepeatableJavadoc implements Build {
     private final JavaDoc doc;
-    private final Layout layout;
 
     /** Documents the module the given layout is rooted at. */
         public RepeatableJavadoc() {
@@ -35,8 +35,8 @@ public final class RepeatableJavadoc implements Build {
     }
 
     public RepeatableJavadoc(final Layout layout, final DependencyResolutionStrategy resolver) {
-            this.layout = layout;
-            doc = new JavaDoc(layout, resolver);
     }
 
     /**
new file mode 100644
--- /dev/null
@@ -0,0 +1,29 @@
+++ b/software/visionary/reboot/andraia/Archive.java
@@ -9,19 +9,18 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Stream;
 
 record Archive(Compiled compiled) implements Command {
 	List<String> arguments() {
+		return Stream.of(initialArgs(), compiled().arguments(), sorted(compiled().what()).stream())
+				.reduce(Stream::concat).orElseGet(Stream::empty).toList();
+	}
+
+	private Stream<String> initialArgs() {
+		return Stream.of("--create",
+				"--file", compiled().where().toString(),
+				"--date", compiled().release().iso());
 	}
 
 	List<String> sorted(final Path root) {
+++ b/software/visionary/reboot/andraia/Compiled.java
@@ -13,6 +13,7 @@ import java.time.format.DateTimeParseException;
 import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Stream;
 
 enum Compiled implements ToArchive {
 	JAR {
@@ -54,6 +55,12 @@ enum Compiled implements ToArchive {
 	/** Only JAR: {@code --module-version} requires {@code module-info.class} in the archive. */
 	List<String> moduleVersionArgs() { return List.of(); }
 
+	Stream<String> arguments() {
+		return Stream.concat(
+				manifest().asCommandLineArgument().stream(),
+				moduleVersionArgs().stream());
+	}
+
 	record Manifest(Layout layout) {
 		public static final String LOCATION = "REPEATABLE-MANIFEST.MF";
 		public static final String MANIFEST_VERSION = "1.0";
+++ b/software/visionary/reboot/andraia/JavaDoc.java
@@ -2,27 +2,21 @@ package software.visionary.reboot.andraia;
 
 import software.visionary.commander.Command;
 import software.visionary.exceptional.Exceptional;
 import software.visionary.reboot.java.JavaSources;
 import software.visionary.reboot.java.ModuleNames;
 import software.visionary.reboot.java.Tool;
 
 import java.io.File;
 import java.nio.file.Files;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Stream;
 
 final class JavaDoc implements Command {
+	private final Resolvable layout;
 
+	JavaDoc(final Resolvable layout) {
 		this.layout = layout;
 	}
 
 	@Override
@@ -32,23 +26,19 @@ final class JavaDoc implements Command {
 	}
 
 	private void runJavaDoc() {
+		new Tool("javadoc").run(arguments());
 	}
 
 	List<String> arguments() {
+		return Stream.of(resolveDependencies(),
+				commandArguments(),
+				sources())
+				.flatMap(List::stream)
+				.toList();
 	}
 
+	private List<String> resolveDependencies() {
+		return layout.resolve()
 				.map(Objects::toString)
 				.reduce((a, b) -> a + File.pathSeparator + b)
 				.map(s -> List.of("--module-path", s))
@@ -56,11 +46,10 @@ final class JavaDoc implements Command {
 	}
 
 	private List<String> commandArguments() {
 		return List.of(
+				"--patch-module", ModuleNames.of(layout.classes())
+						.or(() -> ModuleNames.of(layout.moduleInfo()))
+						.orElse("") + "=" + layout.classes(),
 				"-Xdoclint:all,-html", "-quiet",
 				// ***javadoc dates its own output.*** Without this every page differs
 				// between two builds no matter what the archive does.
+++ b/software/visionary/reboot/andraia/RepeatableJavadoc.java
@@ -26,7 +26,7 @@ import software.visionary.reboot.java.CompileJava;
  */
 public final class RepeatableJavadoc implements Build {
     private final JavaDoc doc;
+    private final Resolvable layout;
 
     /** Documents the module the given layout is rooted at. */
         public RepeatableJavadoc() {
@@ -35,8 +35,8 @@ public final class RepeatableJavadoc implements Build {
     }
 
     public RepeatableJavadoc(final Layout layout, final DependencyResolutionStrategy resolver) {
+            this.layout = new Resolvable.CompileAndProvided(layout, resolver);
+            doc = new JavaDoc(this.layout);
     }
 
     /**
new file mode 100644
+++ b/software/visionary/reboot/andraia/Resolvable.java
@@ -0,0 +1,29 @@
+package software.visionary.reboot.andraia;
+
+import software.visionary.borobudur.Needed;
+import software.visionary.exceptional.Exceptional;
+import software.visionary.reboot.Layout;
+import software.visionary.reboot.dot.matrix.api.DependencyResolutionStrategy;
+
+import java.nio.file.Path;
+import java.util.List;
+import java.util.stream.Stream;
+
+public interface Resolvable extends Layout {
+	Stream<Path> resolve();
+
+	record CompileAndProvided(Layout layout, DependencyResolutionStrategy resolver) implements Resolvable {
+		@Override
+		public Stream<Path> resolve() {
+			return Stream.of(Needed.COMPILE, Needed.PROVIDED)
+					.map(marker -> Exceptional.yoda(() -> resolver.resolve(layout.moduleInfo()).pathFor(marker)))
+					.flatMap(List::stream)
+					.map(path -> (Path.of(System.getProperty("user.home"), ".m2", "repository").resolve(path.toString())));
+		}
+
+		@Override
+		public Path root() {
+			return layout().root();
+		}
+	}
+}

Train your LLM

The full 36-step refactoring sequence is available as a JSONL file — one record per commit, each containing the named move, the before/after file contents, and the unified diff. Use it as few-shot examples, fine-tuning data, or in-context learning material.

Each record has six fields: step (ordinal 1–36), sha, move (the commit message), before (file contents before), after (file contents after), diff (unified diff).

TRAIN YOUR LLM HERE.