diff --git a/src/agents/sisyphus-junior.ts b/src/agents/sisyphus-junior.ts
new file mode 100644
index 00000000..13568225
--- /dev/null
+++ b/src/agents/sisyphus-junior.ts
@@ -0,0 +1,131 @@
+import type { AgentConfig } from "@opencode-ai/sdk"
+import { isGptModel } from "./types"
+import type { CategoryConfig } from "../config/schema"
+import {
+ createAgentToolRestrictions,
+ migrateAgentConfig,
+} from "../shared/permission-compat"
+
+const SISYPHUS_JUNIOR_PROMPT = `
+Sisyphus-Junior - Focused executor from OhMyOpenCode.
+Execute tasks directly. NEVER delegate or spawn other agents.
+
+
+
+BLOCKED ACTIONS (will fail if attempted):
+- task tool: BLOCKED
+- sisyphus_task tool: BLOCKED
+- sisyphus_task tool: BLOCKED (already blocked above, but explicit)
+- call_omo_agent tool: BLOCKED
+
+You work ALONE. No delegation. No background tasks. Execute directly.
+
+
+
+## Notepad Location (for recording learnings)
+NOTEPAD PATH: .sisyphus/notepads/{plan-name}/
+- learnings.md: Record patterns, conventions, successful approaches
+- issues.md: Record problems, blockers, gotchas encountered
+- decisions.md: Record architectural choices and rationales
+- problems.md: Record unresolved issues, technical debt
+
+You SHOULD append findings to notepad files after completing work.
+
+## Plan Location (READ ONLY)
+PLAN PATH: .sisyphus/plans/{plan-name}.md
+
+⚠️⚠️⚠️ CRITICAL RULE: NEVER MODIFY THE PLAN FILE ⚠️⚠️⚠️
+
+The plan file (.sisyphus/plans/*.md) is SACRED and READ-ONLY.
+- You may READ the plan to understand tasks
+- You may READ checkbox items to know what to do
+- You MUST NOT edit, modify, or update the plan file
+- You MUST NOT mark checkboxes as complete in the plan
+- Only the Orchestrator manages the plan file
+
+VIOLATION = IMMEDIATE FAILURE. The Orchestrator tracks plan state.
+
+
+
+TODO OBSESSION (NON-NEGOTIABLE):
+- 2+ steps → todowrite FIRST, atomic breakdown
+- Mark in_progress before starting (ONE at a time)
+- Mark completed IMMEDIATELY after each step
+- NEVER batch completions
+
+No todos on multi-step work = INCOMPLETE WORK.
+
+
+
+Task NOT complete without:
+- lsp_diagnostics clean on changed files
+- Build passes (if applicable)
+- All todos marked completed
+
+
+`
+
+function buildSisyphusJuniorPrompt(promptAppend?: string): string {
+ if (!promptAppend) return SISYPHUS_JUNIOR_PROMPT
+ return SISYPHUS_JUNIOR_PROMPT + "\n\n" + promptAppend
+}
+
+// Core tools that Sisyphus-Junior must NEVER have access to
+const BLOCKED_TOOLS = ["task", "sisyphus_task", "call_omo_agent"]
+
+export function createSisyphusJuniorAgent(
+ categoryConfig: CategoryConfig,
+ promptAppend?: string
+): AgentConfig {
+ const prompt = buildSisyphusJuniorPrompt(promptAppend)
+ const model = categoryConfig.model
+
+ const baseRestrictions = createAgentToolRestrictions(BLOCKED_TOOLS)
+ const mergedConfig = migrateAgentConfig({
+ ...baseRestrictions,
+ ...(categoryConfig.tools ? { tools: categoryConfig.tools } : {}),
+ })
+
+ const base: AgentConfig = {
+ description:
+ "Sisyphus-Junior - Focused task executor. Same discipline, no delegation.",
+ mode: "subagent" as const,
+ model,
+ maxTokens: categoryConfig.maxTokens ?? 64000,
+ prompt,
+ color: "#20B2AA",
+ ...mergedConfig,
+ }
+
+ if (categoryConfig.temperature !== undefined) {
+ base.temperature = categoryConfig.temperature
+ }
+ if (categoryConfig.top_p !== undefined) {
+ base.top_p = categoryConfig.top_p
+ }
+
+ if (categoryConfig.thinking) {
+ return { ...base, thinking: categoryConfig.thinking } as AgentConfig
+ }
+
+ if (categoryConfig.reasoningEffort) {
+ return {
+ ...base,
+ reasoningEffort: categoryConfig.reasoningEffort,
+ textVerbosity: categoryConfig.textVerbosity,
+ } as AgentConfig
+ }
+
+ if (isGptModel(model)) {
+ return { ...base, reasoningEffort: "medium" } as AgentConfig
+ }
+
+ return {
+ ...base,
+ thinking: { type: "enabled", budgetTokens: 32000 },
+ } as AgentConfig
+}