Puzzle Fetcher — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Puzzle Fetcher (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This skill handles downloading puzzle descriptions and input files from adventofcode.com using the aoc-cli tool, then parsing them to extract examples, expected outputs, and problem requirements.
# Download for specific day
aoc download --day {day} --year 2025 \
--puzzle-file puzzles/day{day:02}/puzzle.md \
--input-file puzzles/day{day:02}/input.txt
# Example for Day 1:
aoc download --day 1 --year 2025 \
--puzzle-file puzzles/day01/puzzle.md \
--input-file puzzles/day01/input.txt# If puzzle not yet unlocked
# aoc-cli will return error: "Puzzle X of 2025 is still locked"
# If already downloaded and --overwrite not specified
# aoc-cli will skip download and inform file exists
# Force re-download
aoc download --day 1 --year 2025 --overwriteThe puzzle.md file is in Markdown format. Parse it to extract:
## --- Day 1: Calorie Counting ---Extract: "Calorie Counting"
Look for patterns like:
For example:
1000 2000 3000
4000
This list represents...Example extraction logic:
123" → Extract 123Part 2 typically appears after:
## --- Part Two ---Important:
Structure the parsed data as JSON for downstream consumption:
{
"day": 1,
"year": 2025,
"title": "Calorie Counting",
"part1": {
"description": "Find the elf carrying the most calories...",
"examples": [
{
"input": "1000\n2000\n3000\n\n4000\n\n5000\n6000\n\n7000\n8000\n9000\n\n10000",
"expected_output": "24000",
"explanation": "The fourth elf has the most calories"
}
]
},
"part2": {
"description": "Find the top three elves carrying the most calories...",
"examples": [
{
"input": "1000\n2000\n3000\n\n4000\n\n5000\n6000\n\n7000\n8000\n9000\n\n10000",
"expected_output": "45000",
"explanation": "Top three totals: 24000 + 11000 + 10000"
}
]
},
"input_file_path": "puzzles/day01/input.txt",
"puzzle_file_path": "puzzles/day01/puzzle.md"
}Save this to: puzzles/day{day:02}/parsed.json
For example:
<example input here>
The answer is **123**→ Input: content of code block → Output: 123
If the input is `abc`, the output would be `42`.→ Input: "abc" → Output: 42
Given this input:
line1 line2
First, do X which gives Y.
Then, do Z which results in **final answer 42**.→ Input: "line1\nline2" → Output: 42
Some puzzles provide multiple examples:
For example:
Example 1:
Input: `abc`
Output: `1`
Example 2:
Input: `def`
Output: `2`Create separate example objects for each.
Some examples show the process but don't state the answer:
For example, given this input...
[process description]In this case:
Part 2 often says "using the same example from Part 1":
Before returning parsed data, validate:
✅ Puzzle file exists and is readable ✅ Input file exists and is readable ✅ At least one example extracted for Part 1 ✅ Title extracted successfully ✅ Part 1 description exists ✅ If Part 2 section exists, Part 2 data extracted
Error: Puzzle 5 of 2025 is still locked
Action: Return error status, orchestrator will handle retryError: Failed to connect to adventofcode.com
Action: Retry up to 3 times with exponential backoffError: Could not extract examples from puzzle description
Action: Save raw puzzle.md, flag for manual review
Log: Warning about parsing failure
Still proceed with solution attempt using manual test creationAfter fetching:
puzzles/
day01/
puzzle.md # Raw puzzle description from aoc-cli
input.txt # Real puzzle input
parsed.json # Structured parsed data
day02/
...Create test cases with:
aoc-cli command-line tool via BashWhen invoked directly:
# Fetch today's puzzle
./scripts/fetch-puzzle.sh
# Fetch specific day
./scripts/fetch-puzzle.sh 5
# Force re-download
./scripts/fetch-puzzle.sh 1 --force
# Dry run (download but don't parse)
./scripts/fetch-puzzle.sh 1 --dry-run~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.