From tac
Guides adding try-catch console logging for successes, errors, and state to make app behavior visible to AI agents in debugging and agentic coding workflows.
npx claudepluginhub melodic-software/claude-code-plugins --plugin tacThis skill is limited to using the following tools:
Guide for adding console output to make errors visible to agents. This is one of the most critical leverage points - without stdout visibility, agents operate blind.
Guides authoring Claude Code agent .md files for reliable triggering with example blocks, right model selection, and consistent output. Use when creating, improving, or reviewing agents.
Audits codebases for 12 leverage points of agentic coding including context, tests, docs, logging, and architecture. Identifies gaps and prioritizes fixes for AI agent success.
Audits Claude Code agents for violations, gaps, and improvements across 7 dimensions like description quality and frontmatter, outputting structured repair plans.
Share bugs, ideas, or general feedback.
Guide for adding console output to make errors visible to agents. This is one of the most critical leverage points - without stdout visibility, agents operate blind.
Agents can only act on what they can see. If your application fails silently:
Standard out is often the missing link when agents fail.
def process_data(data):
return transform(data) # Silent - what happened?
function processData(data) {
return transform(data); // Silent - success? failure?
}
def process_data(data):
try:
result = transform(data)
print(f"SUCCESS: Processed {len(result)} items")
return result
except Exception as e:
print(f"ERROR in process_data: {str(e)}")
raise
function processData(data) {
try {
const result = transform(data);
console.log(`SUCCESS: Processed ${result.length} items`);
return result;
} catch (error) {
console.error(`ERROR in processData: ${error.message}`);
throw error;
}
}
Success with context
Errors with detail
State changes
Look for:
For each function, add output on success:
print(f"SUCCESS: {operation} completed - {context}")
Wrap in try/except with error output:
try:
# operation
except Exception as e:
print(f"ERROR in {function_name}: {str(e)}")
raise # Re-raise so agent sees the error
Run the application and verify:
import logging
# Simple print for immediate visibility
print(f"INFO: Starting {operation}")
print(f"SUCCESS: {operation} complete")
print(f"ERROR: {operation} failed - {error}")
# Or use logging for more control
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info(f"Starting {operation}")
logger.error(f"{operation} failed: {error}")
// Simple console for immediate visibility
console.log(`INFO: Starting ${operation}`);
console.log(`SUCCESS: ${operation} complete`);
console.error(`ERROR: ${operation} failed - ${error.message}`);
// Or use a logger
import { logger } from './logger';
logger.info(`Starting ${operation}`);
logger.error(`${operation} failed`, { error });
import "log"
log.Printf("INFO: Starting %s", operation)
log.Printf("SUCCESS: %s complete", operation)
log.Printf("ERROR: %s failed - %v", operation, err)
This is the most common place agents need visibility:
@app.post("/api/upload")
async def upload_file(file: UploadFile):
print(f"INFO: Received upload request for {file.filename}")
try:
result = await process_file(file)
print(f"SUCCESS: Uploaded {file.filename} - {len(result)} rows processed")
return {"status": "success", "rows": len(result)}
except Exception as e:
print(f"ERROR: Upload failed for {file.filename} - {str(e)}")
raise HTTPException(status_code=500, detail=str(e))
# BAD
def fetch_data():
return requests.get(url).json()
# GOOD
def fetch_data():
print(f"INFO: Fetching data from {url}")
response = requests.get(url)
print(f"SUCCESS: Received {len(response.content)} bytes")
return response.json()
# BAD - agent never sees the error
try:
risky_operation()
except:
pass
# GOOD - agent sees what went wrong
try:
risky_operation()
except Exception as e:
print(f"ERROR: risky_operation failed - {str(e)}")
raise
// BAD
try {
riskyOperation();
} catch (e) {}
// GOOD
try {
riskyOperation();
} catch (error) {
console.error(`ERROR: riskyOperation failed - ${error.message}`);
throw error;
}
After adding stdout:
Date: 2025-12-26 Model: claude-opus-4-5-20251101