10
+ true
true
plain
true
diff --git a/src/main/java/com/shortthirdman/primekit/coderbyte/GoalOrientedActionPlanner.java b/src/main/java/com/shortthirdman/primekit/coderbyte/GoalOrientedActionPlanner.java
new file mode 100644
index 0000000..d81f671
--- /dev/null
+++ b/src/main/java/com/shortthirdman/primekit/coderbyte/GoalOrientedActionPlanner.java
@@ -0,0 +1,146 @@
+package com.shortthirdman.primekit.coderbyte;
+
+import com.shortthirdman.primekit.core.agents.Action;
+import com.shortthirdman.primekit.core.agents.Plan;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.PriorityQueue;
+
+/**
+ * A planner that uses the A* search algorithm to find an optimal sequence of actions
+ * (a Plan) to transition from an initial state to a desired goal state.
+ * @author shortthirdman
+ * @since 1.2.0
+ */
+public class GoalOrientedActionPlanner {
+
+ /**
+ * Calculates the optimal plan to reach the goal state from the initial state
+ * using the provided set of available actions.
+ *
+ * This method implements the A* search algorithm, exploring states based on
+ * accumulated cost (g-score) and a heuristic estimating the remaining distance
+ * to the goal (f-score).
+ *
+ * @param initialState the starting state map containing key-value condition pairs
+ * @param goal the target state map containing required key-value condition pairs
+ * @param availableActions the list of actions the planner can utilize
+ * @return an {@link Optional} containing the optimal {@link Plan} if a valid sequence
+ * is found, or an empty {@link Optional} if the goal is unreachable
+ */
+ public Optional plan(
+ Map initialState,
+ Map goal,
+ List availableActions) {
+ var open = new PriorityQueue<>(Comparator.comparingDouble(Node::f));
+ var closed = new HashSet