diff --git a/frontend/src/components/rules/PlanRulesPanel.vue b/frontend/src/components/rules/PlanRulesPanel.vue
new file mode 100644
index 0000000..4cab350
--- /dev/null
+++ b/frontend/src/components/rules/PlanRulesPanel.vue
@@ -0,0 +1,67 @@
+
+
+
+
+ Applicable rules
+
+
{{ rb }}
+
+
{{ topic }}
+
+ -
+ {{ r.title }} — {{ r.statement }}
+
+
+
+
+
+ Truncated at 50 rules — more apply.
+
+
+
+
+
diff --git a/frontend/src/views/TaskViewerView.vue b/frontend/src/views/TaskViewerView.vue
index f9065ef..fa77f60 100644
--- a/frontend/src/views/TaskViewerView.vue
+++ b/frontend/src/views/TaskViewerView.vue
@@ -10,6 +10,7 @@ import type { Note } from "@/types/note";
import type { TaskStatus } from "@/types/task";
import StatusBadge from "@/components/StatusBadge.vue";
import PriorityBadge from "@/components/PriorityBadge.vue";
+import PlanRulesPanel from "@/components/rules/PlanRulesPanel.vue";
import TagPill from "@/components/TagPill.vue";
import TableOfContents from "@/components/TableOfContents.vue";
import ShareDialog from "@/components/ShareDialog.vue";
@@ -379,6 +380,12 @@ const subTaskProgress = computed(() => {
@click="onBodyClick"
>
+
+
+