Generate spreadsheet, diagram, and PDF report as a cohesive deliverable set with iteration budgeting per component
57
65%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./benchmarks/gdpval/skills/pdf-checklist-workflow-enhanced-a53b26/SKILL.mdThis skill provides a reusable pattern for creating a complete report package consisting of three interconnected deliverables: a spreadsheet (data table), a diagram (visual layout), and a PDF report (summary document). Designed for resilience with explicit iteration budgeting and workspace management.
Use this workflow when you need to:
Total budget must be divided across deliverables:
| Deliverable | Recommended Budget | Purpose |
|---|---|---|
| Spreadsheet | 8-10 iterations | Data gathering, table creation, validation |
| Diagram | 8-10 iterations | Visual generation, layout refinement |
| PDF Report | 8-10 iterations | Report assembly, formatting, final output |
| Buffer | 2-4 iterations | Error recovery, verification, fixes |
Never spend entire budget on one deliverable. Track iterations explicitly.
Before generating any deliverables, establish clean workspace state:
# Check current workspace state
ls -la /workspace/
# Create dedicated output directory
mkdir -p /workspace/deliverables
# Verify write permissions
touch /workspace/deliverables/test.tmp && rm /workspace/deliverables/test.tmpWhy: Prevents workspace path confusion that caused previous failures.
| Mode | Tool | Use When |
|---|---|---|
| A | execute_code_sandbox with openpyxl/pandas | Programmatic table generation |
| B | shell_agent with Python script | Complex data processing |
| C | create_file (CSV/XLSX) | Simple tabular data |
Example using openpyxl:
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
wb = Workbook()
ws = wb.active
ws.title = "Hardware Selection"
# Headers with styling
headers = ["Component", "Model", "Qty", "Unit Price", "Total"]
for col, header in enumerate(headers, 1):
cell = ws.cell(row=1, column=col, value=header)
cell.font = Font(bold=True)
cell.fill = PatternFill(start_color="4472C4", fill_type="solid")
cell.font = Font(color="FFFFFF", bold=True)
# Data rows
data = [
["CNC Controller", "Fanuc 0i-MF", 1, 2500, 2500],
["Servo Motor", "SGM7G-09A", 4, 450, 1800],
["HMI Panel", "GT2110-WTBD", 1, 380, 380]
]
for row_idx, row_data in enumerate(data, 2):
for col_idx, value in enumerate(row_data, 1):
ws.cell(row=row_idx, column=col_idx, value=value)
# Total row
ws.cell(row=len(data)+2, column=4, value="TOTAL:")
ws.cell(row=len(data)+2, column=5, value=f"=E2:E{len(data)+1}")
# Save
output_path = '/workspace/deliverables/hardware_selection_table.xlsx'
wb.save(output_path)
print(f'ARTIFACT_PATH:{output_path}')
print('Spreadsheet created successfully')execute_code_sandbox
code: <spreadsheet generation code>
language: pythonVerification (use 1 iteration):
run_shell
command: ls -lh /workspace/deliverables/*.xlsx && file /workspace/deliverables/*.xlsxIf execute_code_sandbox fails with '[ERROR] unknown error':
shell_agent insteadcreate_file with CSV formatIteration checkpoint: After 8 iterations on spreadsheet, move to diagram regardless of completion status.
| Type | Tool | Best For |
|---|---|---|
| Flowchart | graphviz + pydot | Process flows, decision trees |
| Layout | matplotlib + patches | Physical layouts, workcells |
| Architecture | diagrams library | System architecture |
| Simple shapes | PIL/Pillow | Basic diagrams |
Example using matplotlib for layout diagram:
import matplotlib.pyplot as plt
import matplotlib.patches as patches
fig, ax = plt.subplots(figsize=(12, 8))
ax.set_xlim(0, 100)
ax.set_ylim(0, 80)
ax.set_aspect('equal')
ax.axis('off')
# Title
ax.text(50, 75, 'CNC Workcell Layout', fontsize=16, ha='center',
fontweight='bold', bbox=dict(boxstyle='round', facecolor='wheat'))
# CNC Machine
cnc = patches.Rectangle((10, 30), 25, 20, linewidth=2,
edgecolor='darkblue', facecolor='lightblue',
label='CNC Machine')
ax.add_patch(cnc)
ax.text(22.5, 40, 'CNC\nMachine', ha='center', va='center', fontsize=10)
# Robot Arm
robot = patches.Circle((50, 40), 8, linewidth=2,
edgecolor='darkgreen', facecolor='lightgreen',
label='Robot')
ax.add_patch(robot)
ax.text(50, 40, 'Robot', ha='center', va='center', fontsize=10)
# Material Storage
storage = patches.Rectangle((70, 30), 20, 20, linewidth=2,
edgecolor='darkred', facecolor='lightcoral',
label='Storage')
ax.add_patch(storage)
ax.text(80, 40, 'Material\nStorage', ha='center', va='center', fontsize=9)
# Arrows showing flow
ax.annotate('', xy=(35, 40), xytext=(42, 40),
arrowprops=dict(arrowstyle='->', color='gray', lw=2))
ax.annotate('', xy=(58, 40), xytext=(65, 40),
arrowprops=dict(arrowstyle='->', color='gray', lw=2))
# Legend
ax.legend(loc='upper right', bbox_to_anchor=(0.98, 0.98))
# Save
output_path = '/workspace/deliverables/cnc_workcell_layout.png'
plt.savefig(output_path, dpi=150, bbox_inches='tight')
print(f'ARTIFACT_PATH:{output_path}')
print('Diagram created successfully')execute_code_sandbox
code: <diagram generation code>
language: pythonVerification:
run_shell
command: ls -lh /workspace/deliverables/*.png && file /workspace/deliverables/*.pngIf execute_code_sandbox fails:
shell_agent with explicit matplotlib installationIteration checkpoint: After 8 iterations on diagram, move to PDF regardless of completion status.
| Library | Best For | Installation |
|---|---|---|
fpdf2 | Simple reports, quick setup | !pip install fpdf2 |
reportlab | Professional reports, tables | !pip install reportlab |
matplotlib | Chart-heavy reports | Built-in |
Example using fpdf2 (simplest, most reliable):
from fpdf import FPDF
class ReportPDF(FPDF):
def header(self):
self.set_font('Arial', 'B', 14)
self.cell(0, 10, 'Project Assessment Report', 0, 1, 'C')
self.line(10, 20, 200, 20)
self.ln(10)
def footer(self):
self.set_y(-15)
self.set_font('Arial', 'I', 8)
self.cell(0, 10, f'Page {self.page_no()}', 0, 0, 'C')
def section(self, title):
self.set_font('Arial', 'B', 12)
self.set_fill_color(200, 220, 255)
self.cell(0, 8, title, 0, 1, 'L', 1)
self.ln(3)
def add_table_row(self, col1, col2, col3):
self.set_font('Arial', '', 10)
self.cell(60, 8, col1, 1)
self.cell(80, 8, col2, 1)
self.cell(40, 8, col3, 1)
self.ln()
pdf = ReportPDF()
pdf.add_page()
pdf.set_auto_page_break(auto=True, margin=15)
# Executive Summary
pdf.section('Executive Summary')
pdf.set_font('Arial', '', 11)
pdf.multi_cell(0, 7, 'This report provides a comprehensive assessment of the CNC workcell implementation project, including hardware selection, layout design, and cost analysis.')
pdf.ln(5)
# Hardware Selection Summary
pdf.section('Hardware Selection')
pdf.add_table_row('Component', 'Model', 'Cost')
pdf.add_table_row('CNC Controller', 'Fanuc 0i-MF', '$2,500')
pdf.add_table_row('Servo Motors', 'SGM7G-09A (x4)', '$1,800')
pdf.add_table_row('HMI Panel', 'GT2110-WTBD', '$380')
pdf.ln(5)
# Assessment Scores
pdf.section('Assessment Scores')
pdf.add_table_row('Criteria', 'Description', 'Score')
pdf.add_table_row('Completeness', 'All requirements addressed', '8/10')
pdf.add_table_row('Feasibility', 'Technical implementation possible', '9/10')
pdf.add_table_row('Cost Efficiency', 'Within budget constraints', '7/10')
pdf.ln(5)
# Conclusion
pdf.section('Conclusion')
pdf.multi_cell(0, 7, 'The proposed CNC workcell meets all critical requirements with a recommended implementation approach. Total estimated cost: $4,680.')
# Save
output_path = '/workspace/deliverables/assessment_report.pdf'
pdf.output(output_path)
print(f'ARTIFACT_PATH:{output_path}')
print('PDF report created successfully')execute_code_sandbox
code: <PDF generation code>
language: pythonVerification (critical - use read_file):
read_file
filetype: pdf
file_path: /workspace/deliverables/assessment_report.pdfAlternative verification:
run_shell
command: ls -lh /workspace/deliverables/*.pdf && pdftk /workspace/deliverables/*.pdf dump_data 2>/dev/null | head -20Verify all deliverables exist and are valid:
run_shell
command: |
echo "=== Deliverable Bundle Verification ==="
echo ""
echo "Spreadsheet:"
ls -lh /workspace/deliverables/*.xlsx 2>/dev/null || echo " NOT FOUND"
echo ""
echo "Diagram:"
ls -lh /workspace/deliverables/*.png 2>/dev/null || echo " NOT FOUND"
echo ""
echo "PDF Report:"
ls -lh /workspace/deliverables/*.pdf 2>/dev/null || echo " NOT FOUND"
echo ""
echo "=== Bundle Complete ==="Checklist:
| Error Type | Detection | Recovery Action | Max Retries |
|---|---|---|---|
[ERROR] unknown error (execute_code_sandbox) | Error in tool output | Switch to shell_agent or simplify code | 2 |
| File not found | Verification step fails | Check path, re-run generation | 1 |
| Library not installed | ImportError in output | Add !pip install at code start | 1 |
| Empty file (0 bytes) | ls -lh shows 0 size | Regenerate with error handling | 1 |
| Iteration budget exceeded | Iteration count reached | Document partial completion, proceed | N/A |
Always use: /workspace/deliverables/filename.extension
Never use:
/workspace/filename.extension (root clutter)./filename.extension (ambiguous)filename.extension (missing path)Use this template structure to generate all three deliverables efficiently:
# DELIVERABLE 1: Spreadsheet
import openpyxl
wb = openpyxl.Workbook()
ws = wb.active
ws['A1'] = 'Header'
wb.save('/workspace/deliverables/data.xlsx')
print('ARTIFACT_PATH:/workspace/deliverables/data.xlsx')
# DELIVERABLE 2: Diagram
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.text(0.5, 0.5, 'Diagram')
plt.savefig('/workspace/deliverables/diagram.png')
print('ARTIFACT_PATH:/workspace/deliverables/diagram.png')
# DELIVERABLE 3: PDF
from fpdf import FPDF
pdf = FPDF()
pdf.add_page()
pdf.set_font('Arial', '', 12)
pdf.cell(0, 10, 'Report')
pdf.output('/workspace/deliverables/report.pdf')
print('ARTIFACT_PATH:/workspace/deliverables/report.pdf')Track your iteration usage explicitly:
Iteration Log:
- Iteration 1-2: Workspace preparation
- Iteration 3-10: Spreadsheet creation (8 used)
- Iteration 11-18: Diagram generation (8 used)
- Iteration 19-26: PDF report (8 used)
- Iteration 27-30: Bundle verification (4 buffer)
Total: 30 iterations/workspace/deliverables/ prefixexecute_code_sandbox - Primary tool for all code generationshell_agent - Fallback when execute_code_sandbox fails repeatedlyread_file - Verify PDF content (filetype: pdf, xlsx, png)run_shell - Check file existence, sizes, and workspace statecreate_file - Fallback for simple data fileslist_dir - Verify deliverables directory contentsA successful execution produces:
/workspace/deliverables/*** End Files
c5a9c4b
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.