Unicode-safe fallback workflow for multi-format document generation with character sanitization
62
72%
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/document-gen-fallback-enhanced-enhanced-c5d426/SKILL.mdFirst, assess whether to delegate to shell_agent or use manual workflow:
.docx)shell_agent has succeeded on similar tasks beforeshell_agent returns unknown or unclear errors.docx, .pdf, .html)shell_agent attempts failed on similar content1. Does the document contain: em-dashes (—), curly quotes (" "), arrows (→),
checkmarks (✓), or other special symbols? → Use Manual Workflow
2. Is non-ASCII text present (é, ñ, ü, 中文,العربية)? → Use Manual Workflow with sanitization
3. Did shell_agent already fail on this or similar content? → Use Manual Workflow
4. Need multiple output formats with guaranteed success? → Use Manual Workflow
5. Simple ASCII document, single format, first attempt? → Try shell_agent FirstQuick Path (for straightforward documents): Delegate directly to shell_agent with clear instructions:
shell_agent
task: Create a Word document from markdown content. Write the markdown to
/tmp/document.md, then convert to .docx using pandoc, and verify the output exists.Manual Path (for complex/Unicode-heavy documents): Split the workflow into discrete, observable steps:
write_file to create source document (Markdown)run_shell with pandoc for each target format| Scenario | Recommended Approach | Rationale |
|---|---|---|
| Simple ASCII doc, single format | shell_agent | Faster, less manual overhead |
| Unicode symbols present | Manual workflow | Prevents LaTeX encoding failures |
| Previous shell_agent failure | Manual workflow | Avoids repeat failures |
| Multiple formats needed | Manual workflow | Granular control per format |
| Time-sensitive, low-risk | shell_agent first | Try fast path, fallback if needed |
write_file to create source document (Markdown)run_shell with pandoc for each target formatCritical: PDF generation via pandoc typically uses LaTeX (pdflatex or xelatex), which has limited Unicode support. Common problematic characters include:
| Character | Issue | Safe Replacement |
|---|---|---|
— (em dash) | May not render | -- or - |
– (en dash) | May not render | - |
" " (curly quotes) | Encoding errors | " " (straight quotes) |
' ' (curly apostrophe) | Encoding errors | ' (straight apostrophe) |
… (ellipsis) | May not render | ... |
→ ← ↑ ↓ (arrows) | LaTeX incompatibility | -> <- ^ v |
✓ ✗ (checkmarks) | May not render | [x] [ ] |
★ ● (symbols) | May not render | * - |
© ® ™ | May require packages | (c) (r) (tm) |
| Non-ASCII letters (é, ñ, ü) | Font-dependent | Use xeLaTeX or replace |
Write your document content as Markdown to a temporary source file. This gives you full visibility into the content being generated.
write_file
path: /tmp/document_source.md
content: |
# Document Title
## Section 1
Content here...
## Section 2
More content...Before PDF conversion, create a sanitized version of your markdown with LaTeX-safe characters:
write_file
path: /tmp/document_source_sanitized.md
content: |
# Document Title
## Section 1
Content here... (with all special chars replaced per table above)Alternative: Use a shell script to sanitize:
run_shell
command: sed -e 's/—/--/g' -e 's/–/-/g' -e 's/"([^"]*)"/"\1"/g' -e 's/'([^']*)/'\1'/g' /tmp/document_source.md > /tmp/document_source_sanitized.mdNote: Keep the original unsanitized file for DOCX/HTML conversion (these formats handle Unicode better).
Use run_shell with explicit pandoc commands for each format. Use sanitized source for PDF, original for other formats.
run_shell
command: pandoc /tmp/document_source.md -o output.docxrun_shell
command: pandoc /tmp/document_source_sanitized.md -o output.pdfrun_shell
command: pandoc /tmp/document_source.md -o output.htmlCheck that files were created successfully:
run_shell
command: ls -lh output.docx output.pdf output.html# Generate Simple Meeting Notes
## Delegate to shell_agent
shell_agent
task: |
Create meeting notes document:
1. Write to /tmp/meeting_notes.md with content:
"# Team Meeting Notes
## Date: 2024-01-15
## Attendees: Alice, Bob, Carol
## Action Items
- Alice: Complete report by Friday
- Bob: Schedule follow-up meeting
## Next Meeting: 2024-01-22"
2. Convert to Word: pandoc /tmp/meeting_notes.md -o meeting_notes.docx
3. Verify: ls -lh meeting_notes.docx# Generate Negotiation Strategy Document
## Step 1: Write Markdown source
write_file
path: /tmp/negotiation_strategy.md
content: |
# Negotiation Strategy
## Executive Summary
[Content with original unicode...]
## Resolution Path
[Content...]
## BATNA Analysis
[Content...]
## Step 2: Create sanitized version for PDF
write_file
path: /tmp/negotiation_strategy_sanitized.md
content: |
# Negotiation Strategy
## Executive Summary
[Content with unicode replaced: em-dash -> --, curly quotes -> straight, etc.]
## Resolution Path
[Content...]
## BATNA Analysis
[Content...]
## Step 3: Convert to DOCX (from original)
run_shell
command: pandoc /tmp/negotiation_strategy.md -o negotiation_strategy.docx
## Step 4: Convert to PDF (from sanitized)
run_shell
command: pandoc /tmp/negotiation_strategy_sanitized.md -o negotiation_strategy.pdf
## Step 5: Convert to HTML (from original)
run_shell
command: pandoc /tmp/negotiation_strategy.md -o negotiation_strategy.html
## Step 6: Verify
run_shell
command: ls -lh negotiation_strategy.*| Aspect | shell_agent | Manual Workflow |
|---|---|---|
| Error visibility | Opaque, may retry silently | Each step shows explicit output |
| Recovery | Automatic but may loop | Manual intervention at specific step |
| Debugging | Hard to isolate failure point | Clear which step failed |
| Unicode control | Agent may not handle encoding | You control character sanitization |
| Control | Agent decides approach | You control each conversion |
# Markdown to Word
pandoc input.md -o output.docx
# Markdown to PDF (requires LaTeX or wkhtmltopdf)
pandoc input.md -o output.pdf
# Markdown to PDF with Unicode-safe engine (better Unicode support)
pandoc input.md -o output.pdf --pdf-engine=xelatex
# Markdown to HTML
pandoc input.md -o output.html
# With custom template
pandoc input.md --template=template.html -o output.html
# With metadata
pandoc input.md -o output.pdf --metadata title="Document Title"PDF generation fails with encoding error:
--pdf-engine=xelatex for better Unicode support--pdf-engine=wkhtmltopdf as alternativePDF generation fails: LaTeX not found:
apt-get install texlive-latex-recommended texlive-fonts-recommended--pdf-engine=wkhtmltopdf insteadDOCX formatting issues: Add --reference-doc=template.docx for custom styles
Unicode/encoding errors in any format:
-f markdown+utf8 to pandoc commandfile -i source.mdSpecial characters not rendering in PDF:
Missing pandoc: Install via apt-get install pandoc or brew install pandoc
For repeated use, create a reusable sanitization script:
#!/bin/bash
# sanitize_for_pdf.sh - Replace problematic unicode chars for LaTeX/PDF
if [ -z "$1" ]; then
echo "Usage: $0 <input.md> [output.md]"
exit 1
fi
INPUT="$1"
OUTPUT="${2:-${1%.md}_sanitized.md}"
sed -e 's/—/--/g' \
-e 's/–/-/g' \
-e 's/"([^"]*)"/"\1"/g' \
-e 's/'([^']*)/'\1'/g' \
-e 's/…/.../g' \
-e 's/→/->/g' \
-e 's/←/<-/g' \
-e 's/✓/[x]/g' \
-e 's/✗/[ ]/g' \
-e 's/©/(c)/g' \
-e 's/®/(r)/g' \
-e 's/™/(tm)/g' \
"$INPUT" > "$OUTPUT"
echo "Sanitized: $INPUT -> $OUTPUT"Save as sanitize_for_pdf.sh, make executable with chmod +x sanitize_for_pdf.sh, then use:
run_shell
command: ./sanitize_for_pdf.sh /tmp/document_source.md /tmp/document_source_sanitized.mdAfter successful shell_agent completion: Continue using shell_agent for similar straightforward documents.
After shell_agent failure on Unicode content: Switch to manual workflow for that document and similar future documents. Document the failure pattern.
After successful manual workflow: You now have a proven approach. For future similar documents:
document-gen-fallback: Original fallback workflow without Unicode guidancedocument-gen-unicode-safe (parent) if you need the original prescriptive manual-only approach
name: document-gen-adaptive-workflow
description: Adaptive document generation with smart fallback to manual Unicode-safe workflowFor straightforward documents without Unicode concerns:
shell_agent
task: |
1. Write markdown content to /tmp/report.md using write_file
2. Convert to Word format: pandoc /tmp/report.md -o report.docx
3. Convert to PDF: pandoc /tmp/report.md -o report.pdf --pdf-engine=xelatex
4. Verify both files exist with: ls -lh report.docx report.pdf
5. Report the file sizes and confirm successful generationIf shell_agent succeeds: Task complete.
If shell_agent fails: Switch to Manual Path below.
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.