Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Complete operational workflow for implementer agents (Codex, Gemini, etc.) making code changes and writing tests. Drives all work through atomic commits — each loop operates on the smallest complete, reviewable change. Defines the Code Change Loop, Test Writing Loop, Lint Gate, and Issue Filing process with circuit breakers, severity levels, and escalation rules. Requires `committer` for all commits. Includes bundled provider-aware review scripts that keep same-model shell-outs as the last resor
.claude/skills/majiayu000-agent-loops/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 44% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 20% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-18 | ✓→✗ | ▼ Worse | 179% | 0% |
| case-01 | ✓→✓ | = Same ✓ | -1% | 0% |
Enable LLMs to reason, plan, and take autonomous actions.
pythonREACT_PROMPT = """You are an agent that reasons step by step. For each step, respond with: Thought: [your reasoning about what to do next] Action: [tool_name(arg1, arg2)] Observation: [you'll see the result here] When you have the final answer: Thought: I now have enough information Final Answer: [your response] Available tools: {tools} Question: {question} """ async def react_loop(question: str, tools: dict, max_steps: int = 10) -> str: """Execute ReAct reasoning loop.""" history = REACT_PROMPT.format(tools=list(tools.keys()), question=question) for step in range(max_steps): response = await llm.chat([{"role": "user", "content": history}]) history += response.content # Check for final answer if "Final Answer:" in response.content: return response.content.split("Final Answer:")[-1].strip() # Extract and execute action if "Action:" in response.content: action = parse_action(response.content) result = await tools[action.name](*action.args) history += f"\nObservation: {result}\n" return "Max steps reached without answer"
pythonasync def plan_and_execute(goal: str) -> str: """Create plan first, then execute steps.""" # 1. Generate plan plan = await llm.chat([{ "role": "user", "content": f"Create a step-by-step plan to: {goal}\n\nFormat as numbered list." }]) steps = parse_plan(plan.content) results = [] # 2. Execute each step for i, step in enumerate(steps): result = await execute_step(step, context=results) results.append({"step": step, "result": result}) # 3. Check if replanning needed if should_replan(results): return await plan_and_execute( f"{goal}\n\nProgress so far: {results}" ) # 4. Synthesize final answer return await synthesize(goal, results)
pythonasync def self_correcting_agent(task: str, max_retries: int = 3) -> str: """Agent that validates and corrects its own output.""" for attempt in range(max_retries): # Generate response response = await llm.chat([{ "role": "user", "content": task }]) # Self-validate validation = await llm.chat([{ "role": "user", "content": f"""Validate this response for the task: {task} Response: {response.content} Check for: 1. Correctness - Is it factually accurate? 2. Completeness - Does it fully answer the task? 3. Format - Is it properly formatted? If valid, respond: VALID If invalid, respond: INVALID: [what's wrong and how to fix]""" }]) if "VALID" in validation.content: return response.content # Correct based on feedback task = f"{task}\n\nPrevious attempt had issues: {validation.content}" return response.content # Return best attempt
pythonclass AgentMemory: """Sliding window memory for agents.""" def __init__(self, max_messages: int = 20): self.messages = [] self.max_messages = max_messages self.summary = "" def add(self, role: str, content: str): self.messages.append({"role": role, "content": content}) # Summarize old messages when window full if len(self.messages) > self.max_messages: self._compress() def _compress(self): """Summarize oldest messages.""" old = self.messages[:10] self.messages = self.messages[10:] # Async summarize would be better summary = summarize(old) self.summary = f"{self.summary}\n{summary}" def get_context(self) -> list: """Get messages with summary prefix.""" context = [] if self.summary: context.append({ "role": "system", "content": f"Previous context summary: {self.summary}" }) return context + self.messages
| Decision | Recommendation | |----------|----------------| | Max steps | 5-15 (prevent infinite loops) | | Temperature | 0.3-0.7 (balance creativity/focus) | | Memory window | 10-20 messages | | Validation | Every 3-5 steps |
function-calling - Tool definitions and executionmulti-agent-orchestration - Coordinating multiple agentslanggraph-workflows - Stateful agent graphsKeywords: react, reason, act, observe, loop Solves:
Keywords: tool, function, call, execution Solves:
Keywords: template, workflow, agent, typescript Solves:
Other measured skills in the registry, with their headline benchmark lift.