{"id":"ca5a3d15-aeb5-40c4-bd5f-18c88b136df5","entityType":"agent","slug":"clawhub-odrobnik-sudoku","name":"Sudoku","canonicalUrl":"https://www.xpersona.co/agent/clawhub-odrobnik-sudoku","canonicalPath":"/agent/clawhub-odrobnik-sudoku","generatedAt":"2026-10-09T17:07:40.713Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"description":"Fetch Sudoku puzzles and store them as JSON in the workspace; render images on demand; reveal solutions later. Skill: Sudoku Owner: odrobnik Summary: Fetch Sudoku puzzles and store them as JSON in the workspace; render images on demand; reveal solutions later. Tags: latest:2.4.0 Version history: v2.4.0 | 2026-02-24T12:37:17.103Z | user Add minimal HTML renderer with centered values + bold subgrid lines; harden ID handling and remove user-input glob patterns; replace regex array extraction with safer parser in fetchers v2.3.0","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 3.1K downloads reported by the source. Last updated 4/15/2026.","installCommand":"clawhub skill install kn7c7fek4a503rbvj0bxbwx6dx7yw25e:sudoku","sourceUrl":"https://clawhub.ai/odrobnik/sudoku","homepage":"https://clawhub.ai/odrobnik/sudoku","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/odrobnik/sudoku","kind":"source"}],"safetyScore":84,"overallRank":62,"popularityScore":64,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Fetch Sudoku puzzles and store them as JSON in the workspace; render images on demand; reveal solutions later. Skill: Sudoku Owner: odrobnik Summary: Fetch Sudo"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"No protocol or capability metadata is available."},"protocols":[],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":0,"capabilityMatrix":{"rows":[],"flattenedTokens":""}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"stars":null,"forks":null,"downloads":3062,"packageName":null,"latestVersion":"2.4.0","tractionLabel":"3.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-02-28T18:01:02.280Z","emptyReason":null},"lastUpdatedAt":"2026-04-15T00:45:39.800Z","lastCrawledAt":"2026-02-28T18:01:02.280Z","lastIndexedAt":null,"nextCrawlAt":"2026-03-01T18:01:02.280Z","lastVerifiedAt":null,"highlights":[{"version":"2.4.0","createdAt":"2026-02-24T12:37:17.103Z","changelog":"Add minimal HTML renderer with centered values + bold subgrid lines; harden ID handling and remove user-input glob patterns; replace regex array extraction with safer parser in fetchers","fileCount":6,"zipByteSize":20240},{"version":"2.3.0","createdAt":"2026-02-24T07:12:15.406Z","changelog":"Add --count multi-fetch for new puzzles, remove --index/--seed, and make --id match unique UUID fragments","fileCount":6,"zipByteSize":18575},{"version":"2.2.0","createdAt":"2026-02-17T04:34:55.322Z","changelog":"Prefer fresh puzzles: random selection now deduplicates against previously fetched puzzle IDs","fileCount":null,"zipByteSize":null},{"version":"2.1.2","createdAt":"2026-02-15T10:23:40.004Z","changelog":"URL-encode share link payloads: + and = in Base64 break in Telegram/messaging apps","fileCount":null,"zipByteSize":null},{"version":"2.1.1","createdAt":"2026-02-15T10:14:54.656Z","changelog":"Fix SudokuPad share links: use compact JSON to match Node.js LZ-String output","fileCount":null,"zipByteSize":null},{"version":"2.1.0","createdAt":"2026-02-13T15:38:00.692Z","changelog":"- Version 2.1.0 adds new features and improvements. - Updated documentation in SKILL.md. - Version number increased to 2.1.0.","fileCount":null,"zipByteSize":null},{"version":"2.0.2","createdAt":"2026-02-13T15:36:23.651Z","changelog":"- Version bump to 2.0.2. - Documentation updated to reflect latest version. - No functional or user-facing code changes.","fileCount":null,"zipByteSize":null},{"version":"2.0.1","createdAt":"2026-02-13T14:49:42.121Z","changelog":"- Removed JavaScript encoding and compression scripts, simplifying the codebase. - Updated internals to rely on Python-based logic for puzzle fetching and processing. - No user-facing changes to commands or interface.","fileCount":null,"zipByteSize":null}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install kn7c7fek4a503rbvj0bxbwx6dx7yw25e:sudoku","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-odrobnik-sudoku/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-odrobnik-sudoku/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-odrobnik-sudoku/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-odrobnik-sudoku/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-odrobnik-sudoku/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-odrobnik-sudoku/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":[]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T17:07:40.712Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-odrobnik-sudoku/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-odrobnik-sudoku/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-odrobnik-sudoku/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-odrobnik-sudoku/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"readme":"Skill: Sudoku\n\nOwner: odrobnik\n\nSummary: Fetch Sudoku puzzles and store them as JSON in the workspace; render images on demand; reveal solutions later.\n\nTags: latest:2.4.0\n\nVersion history:\n\nv2.4.0 | 2026-02-24T12:37:17.103Z | user\n\nAdd minimal HTML renderer with centered values + bold subgrid lines; harden ID handling and remove user-input glob patterns; replace regex array extraction with safer parser in fetchers\n\nv2.3.0 | 2026-02-24T07:12:15.406Z | user\n\nAdd --count multi-fetch for new puzzles, remove --index/--seed, and make --id match unique UUID fragments\n\nv2.2.0 | 2026-02-17T04:34:55.322Z | user\n\nPrefer fresh puzzles: random selection now deduplicates against previously fetched puzzle IDs\n\nv2.1.2 | 2026-02-15T10:23:40.004Z | user\n\nURL-encode share link payloads: + and = in Base64 break in Telegram/messaging apps\n\nv2.1.1 | 2026-02-15T10:14:54.656Z | user\n\nFix SudokuPad share links: use compact JSON to match Node.js LZ-String output\n\nv2.1.0 | 2026-02-13T15:38:00.692Z | auto\n\n- Version 2.1.0 adds new features and improvements.\n- Updated documentation in SKILL.md.\n- Version number increased to 2.1.0.\n\nv2.0.2 | 2026-02-13T15:36:23.651Z | auto\n\n- Version bump to 2.0.2.\n- Documentation updated to reflect latest version.\n- No functional or user-facing code changes.\n\nv2.0.1 | 2026-02-13T14:49:42.121Z | auto\n\n- Removed JavaScript encoding and compression scripts, simplifying the codebase.\n- Updated internals to rely on Python-based logic for puzzle fetching and processing.\n- No user-facing changes to commands or interface.\n\nv2.0.0 | 2026-02-13T14:45:48.915Z | auto\n\nMajor update: Dropped Node.js requirement and added lzstring Python library.\n\n- Removed Node.js as a required dependency; now only Python3 is needed.\n- Added lzstring Python library as a new requirement.\n- Updated setup instructions to reflect new dependencies.\n\nv1.4.0 | 2026-02-13T14:40:45.846Z | auto\n\nSudoku Skill 1.4.0\n\n- Bumped version to 1.4.0.\n- Documentation and metadata updates in SKILL.md; no new user-facing features described.\n\nv1.3.3 | 2026-02-13T14:14:42.672Z | auto\n\nVersion 1.3.3\n\n- Documentation and metadata updated for latest release.\n- No user-facing feature or command changes.\n\nv1.3.2 | 2026-02-13T09:19:19.637Z | user\n\nDeclare missing dependencies, env vars, and sensitivity in metadata\n\nv1.3.1 | 2026-02-13T06:29:50.089Z | user\n\nRename .clawdhubignore to .clawhubignore\n\nv1.3.0 | 2026-02-13T06:10:21.099Z | user\n\nRefactor: move setup/prerequisites to SETUP.md, keep SKILL.md lean\n\nv1.2.7 | 2026-02-11T15:51:33.804Z | user\n\nDeclare required Python libs (requests, Pillow) in metadata/docs.\n\nv1.2.6 | 2026-02-11T15:34:14.455Z | user\n\nRemove code-execution parsing (safe literal parse) + add OpenClaw metadata\n\nv1.2.5 | 2026-02-11T05:53:30.667Z | user\n\nPortable workspace detection: walks up from script location to find parent of skills/ instead of hardcoding path\n\nv1.2.4 | 2026-02-11T05:36:14.211Z | user\n\nFix: use absolute workspace path (~\\/clawd) for puzzles/renders instead of cwd(), preventing files from scattering into different locations\n\nv1.2.3 | 2026-01-25T13:53:50.664Z | user\n\nDocs: Added JSON data format reference and improved CLI usage instructions.\n\nv1.2.2 | 2026-01-25T12:47:45.567Z | user\n\nDocs: Add README and repository URL.\n\nv1.2.1 | 2026-01-25T12:43:17.255Z | user\n\nRefactor: Move scripts to scripts/ subfolder; remove tests.\n\nv1.2.0 | 2026-01-25T11:17:01.184Z | user\n\nUpdate with local Key Design preferences: individual JSON files, on-demand rendering, and latest puzzle logic.\n\nv1.1.0 | 2026-01-20T13:30:27.687Z | user\n\nRemove (shared) suffix from SudokuPad share links\n\nv0.1.5 | 2026-01-13T16:26:08.456Z | user\n\nCustom LZ-String encoder matching SudokuPad output exactly; unit tests for URL encoding\n\nv0.1.4 | 2026-01-13T16:16:12.760Z | user\n\nFix SudokuPad link encoding: use compressToBase64 with URL-encoding, add (shared) suffix to titles\n\nv0.1.3 | 2026-01-12T09:32:36.654Z | auto\n\n- Documentation sections have been reorganized for clarity.\n- The \"Actions\" section was restructured into separate \"Get a Puzzle,\" \"Render Puzzle,\" \"Reveal Solution,\" and \"Share Link\" sections.\n- Instructions for generating fpuzzles share links were removed.\n- Content remains otherwise unchanged; no changes to skill features or usage.\n\nv0.1.2 | 2026-01-12T09:29:46.743Z | auto\n\nSudoku Skill v0.1.2\n\n- Refreshed and condensed documentation for clarity and easier reference.\n- Added \"share\" command for generating SudokuPad, SCL, or fpuzzles share links.\n- Updated render commands: now use `render` for image/PDF output instead of `puzzle`.\n- Improved command usage examples for getting, rendering, and revealing puzzles or solutions.\n- Expanded usage instructions and clarified Telegram formatting recommendations.\n\nv0.1.1 | 2026-01-12T08:04:49.701Z | auto\n\n- Added metadata section to SKILL.md with emoji and binary requirements for the skill.\n- Specified that the skill requires both Python 3 and Node.js.\n- No functional or API changes—documentation update only.\n\nv0.1.0 | 2026-01-12T08:04:05.405Z | auto\n\nSudoku skill initial release:\n\n- Fetches Sudoku puzzles from sudokuonline.io and stores them as JSON files in the workspace.\n- Generates puzzle images (PNG) and printable A4 PDFs on demand from stored JSON.\n- Supports multiple puzzle types: Kids 4x4, Kids 6x6, and Classic 9x9 (Easy/Medium/Hard/Evil).\n- Offers solution reveal only on explicit user request (full board, single box, or single cell).\n- Provides SudokuPad share links for Classic 9x9 puzzles with Telegram-safe encoding.\n- Designed for clean image sharing and optimal Telegram presentation (image & link handling).\n\nArchive index:\n\nArchive v2.4.0: 6 files, 20240 bytes\n\nFiles: references/DATA_FORMAT.md (1849b), scripts/sudoku_fetcher.py (17192b), scripts/sudoku_print_render.py (4927b), scripts/sudoku.py (36286b), SKILL.md (3338b), _meta.json (125b)\n\nFile v2.4.0:SKILL.md\n\n---\nname: sudoku\ndescription: Fetch Sudoku puzzles and store them as JSON in the workspace; render images on demand; reveal solutions later.\nversion: 2.4.0\nhomepage: https://github.com/odrobnik/sudoku-skill\nmetadata:\n  openclaw:\n    emoji: \"🧩\"\n    requires:\n      bins: [\"python3\"]\n      python: [\"requests\", \"Pillow\", \"lzstring\"]\n---\n\n# Sudoku\n\n## Overview\n\nFetch, render, and reveal Sudoku puzzles. Use `sudoku.py` to get new puzzles from `sudokuonline.io`, generate printable PDFs or images, and reveal solutions.\n\nFor details on the saved JSON format, see [DATA_FORMAT.md](references/DATA_FORMAT.md).\n\n## Available Puzzle Types\n\n*   `kids4n`: Kids 4x4\n*   `kids4l`: Kids 4x4 with Letters\n*   `kids6`: Kids 6x6\n*   `kids6l`: Kids 6x6 with Letters\n*   `easy9`: Classic 9x9 (Easy)\n*   `medium9`: Classic 9x9 (Medium)\n*   `hard9`: Classic 9x9 (Hard)\n*   `evil9`: Classic 9x9 (Evil)\n\n## Setup / Requirements\n\n- Binaries: `python3`\n- Python libs:\n  ```bash\n  python3 -m pip install requests Pillow lzstring\n  ```\n\n## Get a Puzzle\n\nFetches a new puzzle and stores it as JSON. Output is JSON by default (use `--text` for human-readable output).\n\nUse `--count N` to fetch/store multiple puzzles in one call. If a batch does not contain enough unseen puzzles, the command will fetch additional batches until it has enough.\n\nUse `--id <fragment>` to select a specific source puzzle by matching any unique part of its UUID. If multiple IDs match, the command errors and lists candidates.\n\n**Get a Classic Easy puzzle:**\n```bash\n./scripts/sudoku.py get easy9\n```\n\n**Get multiple new puzzles at once (e.g. 4 easy 9x9):**\n```bash\n./scripts/sudoku.py get easy9 --count 4\n```\n\n**Get a Kids 6x6 puzzle:**\n```bash\n./scripts/sudoku.py get kids6\n```\n\n## Render Puzzle\n\nRender a puzzle as an image, PDF, or minimal HTML.\n\n**Render latest puzzle as A4 PDF (for printing):**\n```bash\n./scripts/sudoku.py render --pdf\n```\n\n**Render latest puzzle as clean PNG (for viewing):**\n```bash\n./scripts/sudoku.py render\n```\n\n**Render a specific previous puzzle by short ID:**\n```bash\n./scripts/sudoku.py render --id a09f3680\n```\n\n**Render minimal HTML (square cells + bold box lines):**\n```bash\n./scripts/sudoku.py html --id a09f3680\n```\n\n## Reveal Solution\n\nReveal the solution for the latest or specific puzzle. Use `--id <short_id>` (e.g., `a09f3680`) to target a specific puzzle.\n\n**Reveal full solution as printable PDF:**\n```bash\n./scripts/sudoku.py reveal --pdf\n```\n\n**Reveal full solution for a specific ID:**\n```bash\n./scripts/sudoku.py reveal --id a09f3680 --image\n```\n\n**Reveal full solution as PNG image:**\n```bash\n./scripts/sudoku.py reveal\n```\n\n**Reveal a single cell (row 3, column 7):**\n```bash\n./scripts/sudoku.py reveal --cell 3 7\n```\n\n**Reveal a specific 3x3 box (index 5):**\n```bash\n./scripts/sudoku.py reveal --box 5\n```\n\n## Share Link\n\nGenerate a share link for a stored puzzle. Targets the latest puzzle by default; use `--id <short_id>` for a specific one.\n\n**Generate a SudokuPad share link (default):**\n```bash\n./scripts/sudoku.py share\n```\n\n**Generate link for specific ID:**\n```bash\n./scripts/sudoku.py share --id a09f3680\n```\n\n**Generate an SCL share link:**\n```bash\n./scripts/sudoku.py share --type scl\n```\n\n**Telegram Formatting Tip:**\nFormat links as a short button-style link and hide the full URL: `[Easy Classic \\[<id>\\]](<url>)`.\n\nFile v2.4.0:_meta.json\n\n{\n  \"ownerId\": \"kn7c7fek4a503rbvj0bxbwx6dx7yw25e\",\n  \"slug\": \"sudoku\",\n  \"version\": \"2.4.0\",\n  \"publishedAt\": 1771936637103\n}\n\nFile v2.4.0:references/DATA_FORMAT.md\n\n# Sudoku Data Format\n\nThe Sudoku skill persists puzzle state in JSON files stored in `sudoku/puzzles/`.\n\n## File Naming\nFormat: `YYYY-MM-DD_HHMMSSZ_<preset>_<size>x<size>_<short_id>.json`\nExample: `2026-01-25_124059Z_easy9_9x9_2b8d9c35.json`\n\n## Schema\n\nThe root object contains:\n\n| Field | Type | Description |\n| :--- | :--- | :--- |\n| **`version`** | `int` | Schema version (currently `2`). |\n| **`created_utc`** | `string` | ISO timestamp of creation (e.g., `2026-01-25_124059Z`). |\n| **`preset`** | `object` | Details about the puzzle source preset. |\n| **`picked`** | `object` | Details about the specific puzzle selection. |\n| **`size`** | `int` | Grid size (e.g., `9` or `6`). |\n| **`block`** | `object` | Block dimensions (`bw` width, `bh` height). |\n| **`clues`** | `int[][]` | The initial grid (0 = empty). |\n| **`solution`** | `int[][]` | The fully solved grid. |\n| **`share`** | `object` | Pre-generated share link details. |\n\n### `preset` Object\n*   **`key`** *(string)*: Preset ID (e.g., `easy9`, `kids6`).\n*   **`desc`** *(string)*: Human-readable name.\n*   **`url`** *(string)*: Source URL.\n*   **`letters`** *(bool)*: `true` if using letters (A-I) instead of numbers.\n\n### `picked` Object\nStores provenance data about the specific puzzle chosen from the source batch.\n*   **`id`** *(string)*: Unique puzzle UUID from the source.\n*   **`index`** *(int)*: The zero-based index of this puzzle in the downloaded batch.\n*   **`total`** *(int)*: Total number of puzzles available in the source batch at fetch time.\n\n### `clues` / `solution` Arrays\nA 2D array (list of lists) representing the grid rows.\n*   `0`: Empty cell (clues only).\n*   `1-9`: Cell value (or 1-N for other sizes).\n\n### `share` Object\n*   **`kind`** *(string)*: Type of share link (`native`, `scl`, or `none`).\n*   **`link`** *(string|null)*: The generated share URL.\n\nArchive v2.3.0: 6 files, 18575 bytes\n\nFiles: references/DATA_FORMAT.md (1849b), scripts/sudoku_fetcher.py (16351b), scripts/sudoku_print_render.py (4927b), scripts/sudoku.py (30814b), SKILL.md (3214b), _meta.json (125b)\n\nFile v2.3.0:SKILL.md\n\n---\nname: sudoku\ndescription: Fetch Sudoku puzzles and store them as JSON in the workspace; render images on demand; reveal solutions later.\nversion: 2.3.0\nhomepage: https://github.com/odrobnik/sudoku-skill\nmetadata:\n  openclaw:\n    emoji: \"🧩\"\n    requires:\n      bins: [\"python3\"]\n      python: [\"requests\", \"Pillow\", \"lzstring\"]\n---\n\n# Sudoku\n\n## Overview\n\nFetch, render, and reveal Sudoku puzzles. Use `sudoku.py` to get new puzzles from `sudokuonline.io`, generate printable PDFs or images, and reveal solutions.\n\nFor details on the saved JSON format, see [DATA_FORMAT.md](references/DATA_FORMAT.md).\n\n## Available Puzzle Types\n\n*   `kids4n`: Kids 4x4\n*   `kids4l`: Kids 4x4 with Letters\n*   `kids6`: Kids 6x6\n*   `kids6l`: Kids 6x6 with Letters\n*   `easy9`: Classic 9x9 (Easy)\n*   `medium9`: Classic 9x9 (Medium)\n*   `hard9`: Classic 9x9 (Hard)\n*   `evil9`: Classic 9x9 (Evil)\n\n## Setup / Requirements\n\n- Binaries: `python3`\n- Python libs:\n  ```bash\n  python3 -m pip install requests Pillow lzstring\n  ```\n\n## Get a Puzzle\n\nFetches a new puzzle and stores it as JSON. Output is JSON by default (use `--text` for human-readable output).\n\nUse `--count N` to fetch/store multiple puzzles in one call. If a batch does not contain enough unseen puzzles, the command will fetch additional batches until it has enough.\n\nUse `--id <fragment>` to select a specific source puzzle by matching any unique part of its UUID. If multiple IDs match, the command errors and lists candidates.\n\n**Get a Classic Easy puzzle:**\n```bash\n./scripts/sudoku.py get easy9\n```\n\n**Get multiple new puzzles at once (e.g. 4 easy 9x9):**\n```bash\n./scripts/sudoku.py get easy9 --count 4\n```\n\n**Get a Kids 6x6 puzzle:**\n```bash\n./scripts/sudoku.py get kids6\n```\n\n## Render Puzzle\n\nRender a puzzle as an image or PDF.\n\n**Render latest puzzle as A4 PDF (for printing):**\n```bash\n./scripts/sudoku.py render --pdf\n```\n\n**Render latest puzzle as clean PNG (for viewing):**\n```bash\n./scripts/sudoku.py render\n```\n\n**Render a specific previous puzzle by short ID:**\n```bash\n./scripts/sudoku.py render --id a09f3680\n```\n\n## Reveal Solution\n\nReveal the solution for the latest or specific puzzle. Use `--id <short_id>` (e.g., `a09f3680`) to target a specific puzzle.\n\n**Reveal full solution as printable PDF:**\n```bash\n./scripts/sudoku.py reveal --pdf\n```\n\n**Reveal full solution for a specific ID:**\n```bash\n./scripts/sudoku.py reveal --id a09f3680 --image\n```\n\n**Reveal full solution as PNG image:**\n```bash\n./scripts/sudoku.py reveal\n```\n\n**Reveal a single cell (row 3, column 7):**\n```bash\n./scripts/sudoku.py reveal --cell 3 7\n```\n\n**Reveal a specific 3x3 box (index 5):**\n```bash\n./scripts/sudoku.py reveal --box 5\n```\n\n## Share Link\n\nGenerate a share link for a stored puzzle. Targets the latest puzzle by default; use `--id <short_id>` for a specific one.\n\n**Generate a SudokuPad share link (default):**\n```bash\n./scripts/sudoku.py share\n```\n\n**Generate link for specific ID:**\n```bash\n./scripts/sudoku.py share --id a09f3680\n```\n\n**Generate an SCL share link:**\n```bash\n./scripts/sudoku.py share --type scl\n```\n\n**Telegram Formatting Tip:**\nFormat links as a short button-style link and hide the full URL: `[Easy Classic \\[<id>\\]](<url>)`.\n\nFile v2.3.0:_meta.json\n\n{\n  \"ownerId\": \"kn7c7fek4a503rbvj0bxbwx6dx7yw25e\",\n  \"slug\": \"sudoku\",\n  \"version\": \"2.3.0\",\n  \"publishedAt\": 1771917135406\n}\n\nFile v2.3.0:references/DATA_FORMAT.md\n\n# Sudoku Data Format\n\nThe Sudoku skill persists puzzle state in JSON files stored in `sudoku/puzzles/`.\n\n## File Naming\nFormat: `YYYY-MM-DD_HHMMSSZ_<preset>_<size>x<size>_<short_id>.json`\nExample: `2026-01-25_124059Z_easy9_9x9_2b8d9c35.json`\n\n## Schema\n\nThe root object contains:\n\n| Field | Type | Description |\n| :--- | :--- | :--- |\n| **`version`** | `int` | Schema version (currently `2`). |\n| **`created_utc`** | `string` | ISO timestamp of creation (e.g., `2026-01-25_124059Z`). |\n| **`preset`** | `object` | Details about the puzzle source preset. |\n| **`picked`** | `object` | Details about the specific puzzle selection. |\n| **`size`** | `int` | Grid size (e.g., `9` or `6`). |\n| **`block`** | `object` | Block dimensions (`bw` width, `bh` height). |\n| **`clues`** | `int[][]` | The initial grid (0 = empty). |\n| **`solution`** | `int[][]` | The fully solved grid. |\n| **`share`** | `object` | Pre-generated share link details. |\n\n### `preset` Object\n*   **`key`** *(string)*: Preset ID (e.g., `easy9`, `kids6`).\n*   **`desc`** *(string)*: Human-readable name.\n*   **`url`** *(string)*: Source URL.\n*   **`letters`** *(bool)*: `true` if using letters (A-I) instead of numbers.\n\n### `picked` Object\nStores provenance data about the specific puzzle chosen from the source batch.\n*   **`id`** *(string)*: Unique puzzle UUID from the source.\n*   **`index`** *(int)*: The zero-based index of this puzzle in the downloaded batch.\n*   **`total`** *(int)*: Total number of puzzles available in the source batch at fetch time.\n\n### `clues` / `solution` Arrays\nA 2D array (list of lists) representing the grid rows.\n*   `0`: Empty cell (clues only).\n*   `1-9`: Cell value (or 1-N for other sizes).\n\n### `share` Object\n*   **`kind`** *(string)*: Type of share link (`native`, `scl`, or `none`).\n*   **`link`** *(string|null)*: The generated share URL.","readmeExcerpt":"Skill: Sudoku Owner: odrobnik Summary: Fetch Sudoku puzzles and store them as JSON in the workspace; render images on demand; reveal solutions later. Tags: latest:2.4.0 Version history: v2.4.0 | 2026-02-24T12:37:17.103Z | user Add minimal HTML renderer with centered values + bold subgrid lines; harden ID handling and remove user-input glob patterns; replace regex array extraction with safer parser in fetchers v2.3.0 ","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"python3 -m pip install requests Pillow lzstring"},{"language":"bash","snippet":"./scripts/sudoku.py get easy9"},{"language":"bash","snippet":"./scripts/sudoku.py get easy9 --count 4"},{"language":"bash","snippet":"./scripts/sudoku.py get kids6"},{"language":"bash","snippet":"./scripts/sudoku.py render --pdf"},{"language":"bash","snippet":"./scripts/sudoku.py render"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: sudoku\ndescription: Fetch Sudoku puzzles and store them as JSON in the workspace; render images on demand; reveal solutions later.\nversion: 2.4.0\nhomepage: https://github.com/odrobnik/sudoku-skill\nmetadata:\n  openclaw:\n    emoji: \"🧩\"\n    requires:\n      bins: [\"python3\"]\n      python: [\"requests\", \"Pillow\", \"lzstring\"]\n---\n\n# Sudoku\n\n## Overview\n\nFetch, render, and reveal Sudoku puzzles. Use `sudoku.py` to get new puzzles from `sudokuonline.io`, generate printable PDFs or images, and reveal solutions.\n\nFor details on the saved JSON format, see [DATA_FORMAT.md](references/DATA_FORMAT.md).\n\n## Available Puzzle Types\n\n*   `kids4n`: Kids 4x4\n*   `kids4l`: Kids 4x4 with Letters\n*   `kids6`: Kids 6x6\n*   `kids6l`: Kids 6x6 with Letters\n*   `easy9`: Classic 9x9 (Easy)\n*   `medium9`: Classic 9x9 (Medium)\n*   `hard9`: Classic 9x9 (Hard)\n*   `evil9`: Classic 9x9 (Evil)\n\n## Setup / Requirements\n\n- Binaries: `python3`\n- Python libs:\n  ```bash\n  python3 -m pip install requests Pillow lzstring\n  ```\n\n## Get a Puzzle\n\nFetches a new puzzle and stores it as JSON. Output is JSON by default (use `--text` for human-readable output).\n\nUse `--count N` to fetch/store multiple puzzles in one call. If a batch does not contain enough unseen puzzles, the command will fetch additional batches until it has enough.\n\nUse `--id <fragment>` to select a specific source puzzle by matching any unique part of its UUID. If multiple IDs match, the command errors and lists candidates.\n\n**Get a Classic Easy puzzle:**\n```bash\n./scripts/sudoku.py get easy9\n```\n\n**Get multiple new puzzles at once (e.g. 4 easy 9x9):**\n```bash\n./scripts/sudoku.py get easy9 --count 4\n```\n\n**Get a Kids 6x6 puzzle:**\n```bash\n./scripts/sudoku.py get kids6\n```\n\n## Render Puzzle\n\nRender a puzzle as an image, PDF, or minimal HTML.\n\n**Render latest puzzle as A4 PDF (for printing):**\n```bash\n./scripts/sudoku.py render --pdf\n```\n\n**Render latest puzzle as clean PNG (for viewing):**\n```bash\n./scripts/sudoku.py render\n```\n\n**Render a specific previous puzzle by short ID:**\n```bash\n./scripts/sudoku.py render --id a09f3680\n```\n\n**Render minimal HTML (square cells + bold box lines):**\n```bash\n./scripts/sudoku.py html --id a09f3680\n```\n\n## Reveal Solution\n\nReveal the solution for the latest or specific puzzle. Use `--id <short_id>` (e.g., `a09f3680`) to target a specific puzzle.\n\n**Reveal full solution as printable PDF:**\n```bash\n./scripts/sudoku.py reveal --pdf\n```\n\n**Reveal full solution for a specific ID:**\n```bash\n./scripts/sudoku.py reveal --id a09f3680 --image\n```\n\n**Reveal full solution as PNG image:**\n```bash\n./scripts/sudoku.py reveal\n```\n\n**Reveal a single cell (row 3, column 7):**\n```bash\n./scripts/sudoku.py reveal --cell 3 7\n```\n\n**Reveal a specific 3x3 box (index 5):**\n```bash\n./scripts/sudoku.py reveal --box 5\n```\n\n## Share Link\n\nGenerate a share link for a stored puzzle. Targets the latest puzzle by default; use `--id <short_id>` for a specific one.\n\n**Generate a SudokuPad share link (default):**\n`"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7c7fek4a503rbvj0bxbwx6dx7yw25e\",\n  \"slug\": \"sudoku\",\n  \"version\": \"2.4.0\",\n  \"publishedAt\": 1771936637103\n}"},{"path":"references/DATA_FORMAT.md","content":"# Sudoku Data Format\n\nThe Sudoku skill persists puzzle state in JSON files stored in `sudoku/puzzles/`.\n\n## File Naming\nFormat: `YYYY-MM-DD_HHMMSSZ_<preset>_<size>x<size>_<short_id>.json`\nExample: `2026-01-25_124059Z_easy9_9x9_2b8d9c35.json`\n\n## Schema\n\nThe root object contains:\n\n| Field | Type | Description |\n| :--- | :--- | :--- |\n| **`version`** | `int` | Schema version (currently `2`). |\n| **`created_utc`** | `string` | ISO timestamp of creation (e.g., `2026-01-25_124059Z`). |\n| **`preset`** | `object` | Details about the puzzle source preset. |\n| **`picked`** | `object` | Details about the specific puzzle selection. |\n| **`size`** | `int` | Grid size (e.g., `9` or `6`). |\n| **`block`** | `object` | Block dimensions (`bw` width, `bh` height). |\n| **`clues`** | `int[][]` | The initial grid (0 = empty). |\n| **`solution`** | `int[][]` | The fully solved grid. |\n| **`share`** | `object` | Pre-generated share link details. |\n\n### `preset` Object\n*   **`key`** *(string)*: Preset ID (e.g., `easy9`, `kids6`).\n*   **`desc`** *(string)*: Human-readable name.\n*   **`url`** *(string)*: Source URL.\n*   **`letters`** *(bool)*: `true` if using letters (A-I) instead of numbers.\n\n### `picked` Object\nStores provenance data about the specific puzzle chosen from the source batch.\n*   **`id`** *(string)*: Unique puzzle UUID from the source.\n*   **`index`** *(int)*: The zero-based index of this puzzle in the downloaded batch.\n*   **`total`** *(int)*: Total number of puzzles available in the source batch at fetch time.\n\n### `clues` / `solution` Arrays\nA 2D array (list of lists) representing the grid rows.\n*   `0`: Empty cell (clues only).\n*   `1-9`: Cell value (or 1-N for other sizes).\n\n### `share` Object\n*   **`kind`** *(string)*: Type of share link (`native`, `scl`, or `none`).\n*   **`link`** *(string|null)*: The generated share URL."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Fetch Sudoku puzzles and store them as JSON in the workspace; render images on demand; reveal solutions later. Skill: Sudoku Owner: odrobnik Summary: Fetch Sudoku puzzles and store them as JSON in the workspace; render images on demand; reveal solutions later. Tags: latest:2.4.0 Version history: v2.4.0 | 2026-02-24T12:37:17.103Z | user Add minimal HTML renderer with centered values + bold subgrid lines; harden ID handling and remove user-input glob patterns; replace regex array extraction with safer parser in fetchers v2.3.0","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1092,"uniquenessScore":52,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"agent-directory","verified":false,"confidence":"low","updatedAt":"2026-10-09T17:07:40.713Z","emptyReason":"No close protocol neighbors were found."},"items":[],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[]}}}