diff --git a/src/main/java/io/github/misode/packtest/LoadDiagnostics.java b/src/main/java/io/github/misode/packtest/LoadDiagnostics.java
index f53630c..987eb92 100644
--- a/src/main/java/io/github/misode/packtest/LoadDiagnostics.java
+++ b/src/main/java/io/github/misode/packtest/LoadDiagnostics.java
@@ -1,13 +1,20 @@
 package io.github.misode.packtest;
 
+import org.slf4j.Logger;
+
 import java.util.ArrayList;
 import java.util.List;
 
 public class LoadDiagnostics {
     private static final List<Diagnostic> DIAGNOSTICS = new ArrayList<>();
 
-    public static void error(String resource, String id, String message) {
+    public static void error(Logger logger, String resource, String id, String message) {
         DIAGNOSTICS.add(new Diagnostic(resource, id, message));
+        String annotation = "";
+        if (PackTest.isAnnotationsEnabled()) {
+            annotation = "\n::error title=Failed to load " + resource + " " + id + "::" + message;
+        }
+        logger.info(PackTest.wrapError("Failed to load {} {} - {}") + annotation, resource, id, message);
     }
 
     public static List<Diagnostic> loadErrors() {
diff --git a/src/main/java/io/github/misode/packtest/PackTest.java b/src/main/java/io/github/misode/packtest/PackTest.java
index d0c5033..acc6656 100644
--- a/src/main/java/io/github/misode/packtest/PackTest.java
+++ b/src/main/java/io/github/misode/packtest/PackTest.java
@@ -23,6 +23,10 @@ public static boolean isAutoColoringEnabled() {
 		return isAutoEnabled() && !"false".equals(System.getProperty("packtest.auto.coloring"));
 	}
 
+	public static boolean isAnnotationsEnabled() {
+		return isAutoEnabled() && System.getProperty("packtest.auto.annotations") != null;
+	}
+
 	@Override
 	public void onInitialize() {
 		CommandRegistrationCallback.EVENT.register((dispatcher, buildContext, environment) -> {
diff --git a/src/main/java/io/github/misode/packtest/mixin/GameTestSequenceMixin.java b/src/main/java/io/github/misode/packtest/mixin/GameTestSequenceMixin.java
index 105eb75..1080f64 100644
--- a/src/main/java/io/github/misode/packtest/mixin/GameTestSequenceMixin.java
+++ b/src/main/java/io/github/misode/packtest/mixin/GameTestSequenceMixin.java
@@ -9,6 +9,9 @@
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Shadow;
 
+/**
+ * Add an idle method that includes the line number in the failure message
+ */
 @Mixin(GameTestSequence.class)
 public abstract class GameTestSequenceMixin implements PackTestSequence {
 
diff --git a/src/main/java/io/github/misode/packtest/mixin/LogTestReporterMixin.java b/src/main/java/io/github/misode/packtest/mixin/LogTestReporterMixin.java
index d1a9921..0db4bcb 100644
--- a/src/main/java/io/github/misode/packtest/mixin/LogTestReporterMixin.java
+++ b/src/main/java/io/github/misode/packtest/mixin/LogTestReporterMixin.java
@@ -32,10 +32,14 @@ private void onTestFailed(GameTestInfo info, CallbackInfo ci) {
             String lineNumber = info.getError() instanceof LineNumberException err
                     ? " on line " + err.getLineNumber()
                     : "";
+            String annotation = "";
+            if (PackTest.isAnnotationsEnabled() && info.isRequired()) {
+                annotation = "\n::error title=Test " + info.getTestName() + " failed" + lineNumber + "!::" + Util.describeError(info.getError());
+            }
             if (info.isRequired()) {
-                LOGGER.error(PackTest.wrapError("{} failed{}! {}"), info.getTestName(), lineNumber, Util.describeError(info.getError()));
+                LOGGER.error(PackTest.wrapError("{} failed{}! {}") + annotation, info.getTestName(), lineNumber, Util.describeError(info.getError()));
             } else {
-                LOGGER.warn(PackTest.wrapWarning("(optional) {} failed{}! {}"), info.getTestName(), lineNumber, Util.describeError(info.getError()));
+                LOGGER.warn(PackTest.wrapWarning("(optional) {} failed{}! {}") + annotation, info.getTestName(), lineNumber, Util.describeError(info.getError()));
             }
             ci.cancel();
         }
diff --git a/src/main/java/io/github/misode/packtest/mixin/LootDataTypeMixin.java b/src/main/java/io/github/misode/packtest/mixin/LootDataTypeMixin.java
index d8b954d..0c827d6 100644
--- a/src/main/java/io/github/misode/packtest/mixin/LootDataTypeMixin.java
+++ b/src/main/java/io/github/misode/packtest/mixin/LootDataTypeMixin.java
@@ -3,7 +3,6 @@
 import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
 import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
 import io.github.misode.packtest.LoadDiagnostics;
-import io.github.misode.packtest.PackTest;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.world.level.storage.loot.LootDataType;
 import org.slf4j.Logger;
@@ -24,8 +23,7 @@ public class LootDataTypeMixin {
 
     @WrapOperation(method = "method_53267", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;[Ljava/lang/Object;)V", remap = false))
     private void deserialize(Logger logger, String message, Object[] args, Operation<Void> original) {
-        String type = ((String)args[0]).substring(0, ((String)args[0]).length() - 1);
-        LoadDiagnostics.error(type, ((ResourceLocation)args[1]).toString(), (String)args[2]);
-        LOGGER.error(PackTest.wrapError("Couldn't parse {} {} - {}"), type, args[1], args[2]);
+        String type = ((String)args[0]).replaceAll("_", " ").replaceFirst("s$", "");
+        LoadDiagnostics.error(LOGGER, type, ((ResourceLocation)args[1]).toString(), (String)args[2]);
     }
 }
diff --git a/src/main/java/io/github/misode/packtest/mixin/RecipeManagerMixin.java b/src/main/java/io/github/misode/packtest/mixin/RecipeManagerMixin.java
index ec8f63f..34e1f21 100644
--- a/src/main/java/io/github/misode/packtest/mixin/RecipeManagerMixin.java
+++ b/src/main/java/io/github/misode/packtest/mixin/RecipeManagerMixin.java
@@ -3,7 +3,6 @@
 import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
 import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
 import io.github.misode.packtest.LoadDiagnostics;
-import io.github.misode.packtest.PackTest;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.world.item.crafting.RecipeManager;
 import org.slf4j.Logger;
@@ -24,7 +23,6 @@ public class RecipeManagerMixin {
     @WrapOperation(method = "apply(Ljava/util/Map;Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/util/profiling/ProfilerFiller;)V", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false))
     private void apply(Logger logger, String message, Object id, Object e, Operation<Void> original) {
         String error = ((Exception)e).getMessage();
-        LoadDiagnostics.error("recipe", ((ResourceLocation)id).toString(), error);
-        LOGGER.error(PackTest.wrapError(message + " - {}"), id, error);
+        LoadDiagnostics.error(LOGGER, "recipe", ((ResourceLocation)id).toString(), error);
     }
 }
diff --git a/src/main/java/io/github/misode/packtest/mixin/ServerAdvancementsManagerMixin.java b/src/main/java/io/github/misode/packtest/mixin/ServerAdvancementsManagerMixin.java
index 1fcd661..a07e29e 100644
--- a/src/main/java/io/github/misode/packtest/mixin/ServerAdvancementsManagerMixin.java
+++ b/src/main/java/io/github/misode/packtest/mixin/ServerAdvancementsManagerMixin.java
@@ -3,11 +3,12 @@
 import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
 import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
 import io.github.misode.packtest.LoadDiagnostics;
-import io.github.misode.packtest.PackTest;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.server.ServerAdvancementManager;
 import org.slf4j.Logger;
+import org.spongepowered.asm.mixin.Final;
 import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
 import org.spongepowered.asm.mixin.injection.At;
 
 /**
@@ -15,9 +16,12 @@
  */
 @Mixin(ServerAdvancementManager.class)
 public class ServerAdvancementsManagerMixin {
+    @Shadow
+    @Final
+    private static Logger LOGGER;
+
     @WrapOperation(method = "method_20723", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false))
     private void apply(Logger logger, String message, Object id, Object error, Operation<Void> original) {
-        LoadDiagnostics.error("advancement", ((ResourceLocation)id).toString(), (String)error);
-        original.call(logger, PackTest.wrapError(message), id, error);
+        LoadDiagnostics.error(LOGGER, "advancement", ((ResourceLocation)id).toString(), (String)error);
     }
 }
diff --git a/src/main/java/io/github/misode/packtest/mixin/ServerFunctionLibraryMixin.java b/src/main/java/io/github/misode/packtest/mixin/ServerFunctionLibraryMixin.java
index 543a6b9..217eae0 100644
--- a/src/main/java/io/github/misode/packtest/mixin/ServerFunctionLibraryMixin.java
+++ b/src/main/java/io/github/misode/packtest/mixin/ServerFunctionLibraryMixin.java
@@ -3,7 +3,6 @@
 import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
 import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
 import io.github.misode.packtest.LoadDiagnostics;
-import io.github.misode.packtest.PackTest;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.server.ServerFunctionLibrary;
 import org.slf4j.Logger;
@@ -24,7 +23,6 @@ public class ServerFunctionLibraryMixin {
     @WrapOperation(method = "method_29457", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false))
     private static void catchFunctionError(Logger logger, String message, Object id, Object e, Operation<Void> original) {
         String error = ((Exception)e).getMessage().replaceFirst("^[A-Za-z0-9.]+Exception: ", "");
-        LoadDiagnostics.error("function", ((ResourceLocation)id).toString(), error);
-        LOGGER.error(PackTest.wrapError(message + " - {}"), id, error);
+        LoadDiagnostics.error(LOGGER, "function", ((ResourceLocation)id).toString(), error);
     }
 }
diff --git a/src/main/java/io/github/misode/packtest/mixin/TagLoaderMixin.java b/src/main/java/io/github/misode/packtest/mixin/TagLoaderMixin.java
index ea6b898..3a6a979 100644
--- a/src/main/java/io/github/misode/packtest/mixin/TagLoaderMixin.java
+++ b/src/main/java/io/github/misode/packtest/mixin/TagLoaderMixin.java
@@ -4,7 +4,6 @@
 import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
 import com.mojang.serialization.DataResult;
 import io.github.misode.packtest.LoadDiagnostics;
-import io.github.misode.packtest.PackTest;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.tags.TagFile;
 import net.minecraft.tags.TagLoader;
@@ -35,13 +34,11 @@ private static Object removeDuplicateError(DataResult<Object> dataResult, boolea
     private static void catchTagError(Logger logger, String message, Object[] args, Operation<Void> original) {
         String error = ((Exception)args[3]).getMessage().replaceFirst("^[A-Za-z0-9.]+Exception: ", "");
         String type = ((ResourceLocation)args[1]).getPath().replaceFirst("tags/", "").replaceFirst("s?/.*", "");
-        LoadDiagnostics.error(type + " tag", ((ResourceLocation)args[0]).toString(), error);
-        LOGGER.error(PackTest.wrapError("Couldn't read {} tag {} - {}"), type, args[0], error);
+        LoadDiagnostics.error(LOGGER, type + " tag", ((ResourceLocation)args[0]).toString(), error);
     }
 
     @WrapOperation(method = "method_33175", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false))
     private static void catchTagReferenceError(Logger logger, String message, Object id, Object refs, Operation<Void> original) {
-        LoadDiagnostics.error("tag", ((ResourceLocation)id).toString(), "Missing references: " + refs);
-        original.call(logger, PackTest.wrapError(message), id, refs);
+        LoadDiagnostics.error(LOGGER, "tag", ((ResourceLocation)id).toString(), "Missing references: " + refs);
     }
 }