[
 {
  "id": "T01",
  "target": "bestpractice_pdf_to_markdown",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "### Cause of the Crash\nOn Apple Silicon macOS, Docling's **RT-DETR V2** model invokes `torch.float64` operations during the layout detection phase. Because PyTorch's Metal Performance Shaders (**MPS**) backend lacks support for `torch.float64`, the layout detection step triggers an unhandled backend crash.\n\n---\n\n### Workaround & Command-Line Flag\nTo work around this issue, force Docling to execute on the CPU instead of the MPS GPU backend by passing the **`--device cpu`** flag:\n\n```bash\ndocling input.pdf --to md --device cpu --output output_dir\n```\n\n#### Additional Recommendations:\n- **Text-only PDFs:** If the document does not require OCR, also pass `--no-ocr` to bypass extra model paths and prevent false recognition:\n  ```bash\n  docling input.pdf --to md --device cpu --no-ocr --output output_dir\n  ```\n- **Avoid relying solely on environment variables:** Do not rely on `PYTORCH_ENABLE_MPS_FALLBACK=1` as your primary fix, as it may not take effect depending on specific PyTorch/macOS version combinations. Using `--device cpu` directly is deterministic.",
  "error": null,
  "opened": [
   "bestpractice_pdf_to_markdown"
  ],
  "requested": [
   "bestpractice_pdf_to_markdown"
  ],
  "opened_target": true,
  "prompt_tokens": 14051,
  "completion_tokens": 389,
  "sec": 5.972243070602417,
  "cost": 0.011997,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T02",
  "target": "mac_universal_clipboard",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "Yes. The specific Keychain item is:\n\n**`handoff-own-encryption-key`**\n\nDeleting this item resets your Mac's local Handoff identity key without requiring a full iCloud sign-out.\n\n---\n\n### Step-by-Step Instructions\n\n#### 1. Delete the Keychain Item\n1. Open **Keychain Access** (found in `/Applications/Utilities/Keychain Access.app`).\n2. Search for:\n   ```text\n   handoff-own-encryption-key\n   ```\n3. Right-click the entry and select **Delete \"handoff-own-encryption-key\"** (confirm deletion if prompted).\n\n*(Alternatively, via Terminal)*:\n```bash\nsecurity delete-generic-password -s \"handoff-own-encryption-key\" 2>/dev/null\n```\n\n---\n\n#### 2. Reset the Mac Handoff Daemons and Preferences\nAfter deleting the key, reset the local pasteboard and Continuity daemons so macOS regenerates the identity state:\n\n```bash\ndefaults delete ~/Library/Preferences/com.apple.coreservices.useractivityd.plist ClipboardSharingEnabled 2>/dev/null; \\\ndefaults write ~/Library/Preferences/com.apple.coreservices.useractivityd.plist ClipboardSharingEnabled 1; \\\nkillall useractivityd 2>/dev/null; \\\nkillall sharingd 2>/dev/null; \\\nkillall pboard 2>/dev/null; \\\nsleep 2; \\\npgrep -fl 'useractivityd|sharingd|pboard'\n```\n\n---\n\n#### 3. Re-toggle Handoff & Test\n1. Go to **System Settings > General > AirDrop & Handoff**.\n2. Toggle **Allow Handoff between this Mac and your iCloud devices** off and then back on.\n3. Test bidirectional clipboard sync:\n   - Copy text on iPhone/iPad $\\rightarrow$ paste on Mac.\n   - Copy text on Mac $\\rightarrow$ paste on iPhone/iPad.\n\n---\n\n### Next Step if It Still Fails\nBefore resorting to an iCloud sign-out (which triggers massive re-syncs for iCloud Drive, Photos, and Keychain), try **booting the Mac into Safe Mode once**, then restarting normally. This clears macOS system and Continuity caches that often get corrupted across system updates.",
  "error": null,
  "opened": [
   "mac_universal_clipboard"
  ],
  "requested": [
   "mac_universal_clipboard"
  ],
  "opened_target": true,
  "prompt_tokens": 12657,
  "completion_tokens": 796,
  "sec": 9.042343854904175,
  "cost": 0.01247775,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T03",
  "target": "openreview",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "To resolve the HTTP 403 error caused by an expired token, follow these steps:\n\n1. **Delete the cached token file**:\n   ```bash\n   rm tmp/openreview_token.json\n   ```\n\n2. **Re-run your query**:\n   Run your `tools/openreview_cli.py` command again. The tool will automatically re-authenticate using the credentials configured in your `.env` file or environment variables (`OPENREVIEW_EMAIL` / `OPENREVIEW_PASSWORD`) and generate a fresh cached token.\n\n*(Note: OpenReview enforces a login rate limit of at most 3 logins per time window, so avoid deleting the token repeatedly in rapid succession.)*",
  "error": null,
  "opened": [
   "openreview"
  ],
  "requested": [
   "openreview"
  ],
  "opened_target": true,
  "prompt_tokens": 13320,
  "completion_tokens": 440,
  "sec": 9.516785860061646,
  "cost": 0.01164,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T04",
  "target": "workflow_bilibili_whisper_transcription",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "An interval of **2 to 3 seconds** should be maintained between successive downloads. \n\nTo effectively avoid triggering Bilibili's anti-scraping mechanisms (such as HTTP 352 or 412 errors), adhere to the following download practices:\n\n1. **Single-threaded execution:** Download audio files sequentially (one by one), never concurrently.\n2. **2–3 second delay:** Pause for 2 to 3 seconds between each download request.\n3. **Include browser headers:** Pass appropriate `User-Agent` and `Referer` headers (e.g., `Referer: https://www.bilibili.com/`).\n4. **Target audio-only:** Download only the required audio stream rather than the full video.\n5. **Handle failed IDs:** Implement retry logic and log any failed video IDs to avoid halting the batch run.",
  "error": null,
  "opened": [
   "workflow_bilibili_whisper_transcription",
   "download_and_transcribe"
  ],
  "requested": [
   "workflow_bilibili_whisper_transcription",
   "download_and_transcribe"
  ],
  "opened_target": true,
  "prompt_tokens": 16180,
  "completion_tokens": 580,
  "sec": 10.296602010726929,
  "cost": 0.01431,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T05",
  "target": "playwright_ajax_capture",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "When reverse-engineering internal APIs, this is a common architectural pattern: the `creation_uuid` returned by the `POST` response is typically an asynchronous client-side tracking token or queue reference rather than the canonical database primary key. The real entity ID is generated server-side only after processing completes.\n\nTo reliably obtain the real ID, adopt the **POST-then-GET (Fetch & Match)** pattern:\n\n---\n\n### Recommended Workflow: Fetch & Content Match\n\n1. **Submit the Creation `POST`**:\n   - Send the request to create the resource, noting the exact payload parameters you sent (e.g., specific text/body, title, or client timestamp).\n\n2. **Immediately Query the Collection (`GET`)**:\n   - Make a `GET` call to the corresponding list/feed endpoint (e.g., `GET /internal_api/.../messages` or `/posts`) for the relevant space, channel, or container.\n\n3. **Locate the Resource by Unique Attributes**:\n   - Iterate over the retrieved records and identify the newly created item by matching:\n     - The exact content or unique string submitted in the payload.\n     - Timestamp proximity (e.g., within the last few seconds).\n     - Author/sender identity.\n   - If the list returns the `creation_uuid` or `client_id` inside the metadata, match directly on that; otherwise, use strict content matching.\n\n4. **Extract and Reuse the Canonical ID**:\n   - Read the true numeric/canonical `id` from the matched item and proceed with downstream actions (e.g., replies, updates, reactions, or deletes).\n\n---\n\n### Implementation Best Practices & Traps to Avoid\n\n- **Do Not Fall Back to `creation_uuid`**: Never pass `response.get(\"id\")` blindly when it evaluates to `None`, and do not substitute `creation_uuid` where a numeric ID is expected. In many internal APIs, sending `None` or an invalid string ID does not throw an explicit error; instead, it silently degrades behavior (e.g., converting a threaded reply into an unintended standalone root message).\n- **Add a Brief Retry Loop**: Because server-side ingestion or search indexing may have slight asynchronous lag, query the list endpoint with a quick retry mechanism (e.g., up to 3 attempts with a 500ms delay) if the item does not appear immediately.\n- **Inject Disambiguating Markers if Needed**: If the automated flow creates repetitive or generic content, append a short unique marker (such as a zero-width space or a micro-timestamp) during tests to make the content match 100% deterministic against other existing posts.",
  "error": null,
  "opened": [
   "playwright_ajax_capture"
  ],
  "requested": [
   "playwright_ajax_capture"
  ],
  "opened_target": true,
  "prompt_tokens": 16185,
  "completion_tokens": 1356,
  "sec": 18.848571062088013,
  "cost": 0.01722375,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T06",
  "target": "workflow_watchdog",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "The recommended default wake-up interval for checking in on long-running background sub-agent tasks is **about 30 minutes (1800 seconds)**.\n\n### Operational Guidance:\n\n1. **Do not wait in place**: Once long-running tasks or batch sub-agents are dispatched, schedule an inspection wake-up immediately rather than idling or waiting for completion synchronously.\n2. **Mechanism**:\n   - In Claude Code, use `ScheduleWakeup`.\n   - In other environments, use a one-shot delayed execution mechanism (e.g., Process Launcher's `POST /run` with `delay_seconds: 1800` or a dynamic patrol pattern).\n3. **Evaluation on wake-up**:\n   - **Genuinely busy**: If new output is appearing and the agent is actively producing progress, leave it running and set another wake-up interval.\n   - **Stuck in a loop**: If there has been no progress for an extended period or it is repeating the same step/error, terminate the task (e.g., using `TaskStop`), then proceed with partial results or switch strategies.",
  "error": null,
  "opened": [
   "workflow_watchdog",
   "skill_agentic_patrol",
   "delayed_execution"
  ],
  "requested": [
   "workflow_watchdog",
   "skill_agentic_patrol",
   "delayed_execution"
  ],
  "opened_target": true,
  "prompt_tokens": 14783,
  "completion_tokens": 455,
  "sec": 9.991273880004883,
  "cost": 0.012793500000000001,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T07",
  "target": "workflow_parallel_subagents",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "You should not default to setting `temperature: 0` for subagents \"for stability\" for several key reasons:\n\n### 1. Risk of Degeneration and Repetition Loops on Long Outputs\nWhile `temperature: 0` (greedy decoding) works well for short, rigid tasks, forcing strict determinism on longer generation tasks (such as drafting, code synthesis, long research summaries, or artifact creation) frequently triggers degeneration, looping phrases, and repetitive structures. \n\n### 2. Interference with Provider and Model-Specific Sampling Strategies\nModern models and inference providers often configure their own default sampling parameters and decoding strategies optimized for specific model architectures (e.g., reasoning models, thinking tokens, and instruction-following models). For instance, models like DeepSeek (DS4) handle deterministic requirements at the protocol and tool-schema level; artificially imposing `temperature: 0` globally can conflict with backend sampling optimizations.\n\n### 3. Defeating the Purpose of Subagent Parallelism\nSubagents are primarily deployed for **independent exploration, diverse perspectives, and cross-validation** (e.g., stress-testing ideas, identifying edge cases, or conducting research). If multiple subagents run with strictly greedy decoding across overlapping task prompts, you reduce their ability to explore alternate reasoning paths or discover blind spots.\n\n---\n\n### Recommended Practice\n* **Default to not setting temperature**: Allow the underlying provider, server, or agent profile to use its calibrated default sampling parameters.\n* **Configure explicitly only when necessary**: Set temperature or fixed sampling only when you have a concrete, validated need for a specific model/task (such as strict zero-shot structured schema extraction without tool-calling, or regression testing requiring deterministic token traces).",
  "error": null,
  "opened": [
   "workflow_parallel_subagents",
   "bestpractice_ai_programming_mindset"
  ],
  "requested": [
   "workflow_parallel_subagents",
   "bestpractice_ai_programming_mindset"
  ],
  "opened_target": true,
  "prompt_tokens": 16797,
  "completion_tokens": 904,
  "sec": 14.205830097198486,
  "cost": 0.01598775,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T08",
  "target": "bestpractice_markdown_html_conversion",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "The recommended minimum padding for the `body` or main container on mobile devices is **24px or more**.\n\n### Recommended CSS Implementation\n\nTo prevent text from hugging the screen edges on mobile while maintaining clean spacing across screen sizes, you can apply this to your main container or `body`:\n\n```css\nbody, \n.container {\n  padding-left: 24px;\n  padding-right: 24px;\n  box-sizing: border-box;\n}\n\n/* Optional: clamp or media query for responsive scaling */\n@media (min-width: 768px) {\n  body, \n  .container {\n    padding-left: 32px;\n    padding-right: 32px;\n  }\n}\n```\n\nEnsure `box-sizing: border-box;` is active so the padding doesn't cause unexpected horizontal scrollbars on smaller viewports.",
  "error": null,
  "opened": [
   "bestpractice_markdown_html_conversion"
  ],
  "requested": [
   "bestpractice_markdown_html_conversion"
  ],
  "opened_target": true,
  "prompt_tokens": 12350,
  "completion_tokens": 558,
  "sec": 9.345407962799072,
  "cost": 0.011355,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T09",
  "target": "codex_cli",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "To disable `web_search` in your Codex configuration file and prevent HTTP 400 errors with custom OpenAI-compatible backends, follow these rules:\n\n### 1. Configuration Syntax & Placement\n\nIn your base configuration file (`$CODEX_HOME/config.toml`) or the profile configuration file being loaded, declare `web_search` as a **bare top-level key**:\n\n```toml\nweb_search = \"disabled\"\n\n# Place any [sections] below this line\n# [model]\n# ...\n```\n\n> **Important (TOML rule):** Keep `web_search = \"disabled\"` at the very top of the file, **above every `[section]` header**. If placed below a section header, TOML binds it to that preceding table instead of the root configuration.\n\n---\n\n### 2. Value Type Requirements\n\n* **Value Type:** Must be a **string unit variant**.\n* **Exact Value:** `\"disabled\"` (with quotes).\n* **Common Mistakes:** Do **not** use booleans or alternate words. Values like `false`, `true`, `\"off\"`, `\"on\"`, or `\"enabled\"` will be rejected by the parser with an error such as:\n  ```text\n  expected string only in 'web_search'\n  ```",
  "error": null,
  "opened": [
   "codex_cli",
   "opencode_cli",
   "skill_ai_agent_cli"
  ],
  "requested": [
   "codex_cli",
   "opencode_cli",
   "skill_ai_agent_cli"
  ],
  "opened_target": true,
  "prompt_tokens": 16037,
  "completion_tokens": 1116,
  "sec": 13.844493865966797,
  "cost": 0.01621275,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T10",
  "target": "apple_photos",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "The maximum number of image pairs allowed in a single delete manifest is **50 pairs**. \n\nLarger sets of candidate pairs must be split into independent plans, each requiring fresh review and authorization.",
  "error": null,
  "opened": [
   "apple_photos"
  ],
  "requested": [
   "apple_photos"
  ],
  "opened_target": true,
  "prompt_tokens": 13690,
  "completion_tokens": 218,
  "sec": 7.774893283843994,
  "cost": 0.011085000000000001,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T11",
  "target": "colab",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "In Google Colab CLI version 0.7.4, an unrecognized `--gpu` value is not rejected with an argument error—the CLI defaults to sending the request as **`A100`**.",
  "error": null,
  "opened": [
   "colab"
  ],
  "requested": [
   "colab"
  ],
  "opened_target": true,
  "prompt_tokens": 17228,
  "completion_tokens": 337,
  "sec": 7.721452951431274,
  "cost": 0.01418475,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T12",
  "target": "dataforseo",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "### Cause\n\nIn DataForSEO, error code **`40104`** occurs when your credentials are authenticated successfully, but the account is **not yet verified**. \n\nBecause your credentials are valid, basic management endpoints like account balance checks still work. However, DataForSEO blocks functional data endpoints—including keyword data endpoints and the sandbox environment—until full verification is completed.\n\n---\n\n### How to Fix\n\n1. **Log in to the DataForSEO Panel:**\n   Go to the [DataForSEO Dashboard](https://app.dataforseo.com/) using your account credentials.\n\n2. **Complete Account Verification:**\n   - Check for any pending verification prompts (such as email confirmation, phone verification, or completing company/profile information).\n   - If a manual review banner is present, follow the prompts or reach out to DataForSEO support via their live chat/support ticket to verify your account.\n\n3. **Verify and Re-test:**\n   Once verified in the dashboard, test the keyword endpoint again via the CLI:\n   ```bash\n   # Test against the sandbox\n   .venv/bin/dataforseo-skill --base-url https://sandbox.dataforseo.com keyword-suggestions \"agent harness\" --limit 3\n\n   # Test against the live endpoint\n   .venv/bin/dataforseo-skill keyword-suggestions \"agent harness\" --limit 10 --location-code 2840 --language-code en\n   ```",
  "error": null,
  "opened": [
   "dataforseo"
  ],
  "requested": [
   "dataforseo"
  ],
  "opened_target": true,
  "prompt_tokens": 12569,
  "completion_tokens": 673,
  "sec": 10.023528814315796,
  "cost": 0.0119505,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T13",
  "target": "firewalla",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "To query your physical Firewalla device, you need to include the **`--execute`** flag.\n\n### Why it is needed:\nBy design, the `firewalla-skill` CLI operates in **dry-run mode by default** to prevent accidental or unverified network calls. Live collection requires explicit user intent via `--execute` before the CLI will connect to and pull data from the physical Firewalla hardware.\n\n### Example Usage:\nMake sure your environment is activated, then append `--execute` to your commands:\n\n```bash\n# Query device inventory\nfirewalla-skill devices --execute --all --json --output reports/devices_all_latest.json\n\n# Query alarms\nfirewalla-skill alarms --execute --since-days 3 --include-archive --all --json --output reports/alarms_last3d_latest.json\n```",
  "error": null,
  "opened": [
   "firewalla"
  ],
  "requested": [
   "firewalla"
  ],
  "opened_target": true,
  "prompt_tokens": 12809,
  "completion_tokens": 258,
  "sec": 11.384288311004639,
  "cost": 0.01057425,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T14",
  "target": "apple_calendar",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "### Why `~/Library/Calendars/Calendar.sqlitedb` Failed\n\nOn modern versions of macOS, **`~/Library/Calendars/Calendar.sqlitedb` is a 0-byte decoy file**. If you check its file size (e.g., via `ls -la ~/Library/Calendars/Calendar.sqlitedb`), you will see it is completely empty (0 bytes). Querying a copy of it will always return empty results.\n\n---\n\n### The Correct Path\n\nThe actual live EventKit SQLite database resides inside Apple's shared Group Container:\n\n```text\n~/Library/Group Containers/group.com.apple.calendar/Calendar.sqlitedb\n```\n\n---\n\n### How to Snapshot and Query Correctly\n\nWhen querying this database from scripts, follow these best practices to ensure data integrity and avoid locks:\n\n1. **Copy the sidecar files (`-wal` and `-shm`) as well:**\n   SQLite operates in WAL (Write-Ahead Logging) mode. Recent or uncheckpointed changes live inside:\n   - `Calendar.sqlitedb-wal`\n   - `Calendar.sqlitedb-shm` (if present)\n\n   If you only copy `Calendar.sqlitedb`, your queries may miss recent events or return stale data. Copy all three files together into a temporary directory keeping their filenames identical:\n   ```bash\n   mkdir -p /tmp/cal_snapshot\n   cp ~/Library/Group\\ Containers/group.com.apple.calendar/Calendar.sqlitedb* /tmp/cal_snapshot/\n   ```\n\n2. **Open the copied snapshot in read-only mode:**\n   ```python\n   import sqlite3\n\n   conn = sqlite3.connect(\"file:/tmp/cal_snapshot/Calendar.sqlitedb?mode=ro\", uri=True)\n   cursor = conn.cursor()\n   ```\n\n3. **Time Semantics Gotcha (Apple Cocoa Epoch):**\n   - Timestamp columns (like `start_date` and `end_date`) do **not** use Unix epoch (1970).\n   - They store the number of seconds since **`2001-01-01 00:00:00 UTC`** (`NSDate` reference date).\n   - To convert to standard Unix epoch time, add `978307200` seconds.",
  "error": null,
  "opened": [
   "apple_calendar"
  ],
  "requested": [
   "apple_calendar"
  ],
  "opened_target": true,
  "prompt_tokens": 14229,
  "completion_tokens": 1022,
  "sec": 12.980652093887329,
  "cost": 0.01450425,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T15",
  "target": "skill_image_generation",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "When generating infographics with GPT Image 2.5, you should use a **\"draft-first repaint\" workflow** rather than generating from a text prompt alone.\n\n---\n\n### The Recommended Workflow\n\n1. **Generate a local structure draft first**:\n   * Create an intermediate visual layout containing the exact layout, titles, data points, and text annotations using tools like `matplotlib` (or Pillow, Graphviz, HTML/CSS).\n2. **Pass the draft as an input image (`-i`) to GPT Image 2.5**:\n   * Run the CLI/API using the draft as the reference input to redraw and stylize:\n     ```bash\n     generate-image -p \"Redraw this into a clean, modern technical infographic with polished visual presentation\" \\\n       -i draft.png \\\n       -o final_infographic.png \\\n       --model gpt-image-2.5-sunburst \\\n       --aspect-ratio 16:9\n     ```\n3. **Set an explicit long execution timeout**:\n   * Redrawing complex chart drafts routinely takes 300 seconds (5 minutes) or more. Ensure your runner sets `timeout=300000` ms to prevent premature process termination.\n\n---\n\n### Why This Workflow Is Necessary\n\n* **Text-to-image is unreliable for infographics**: Generating complex infographics from text alone causes unpredictable spatial layouts, messy visual hierarchies, and garbled or misaligned data structures.\n* **Layout and text preservation**: GPT Image 2.5 functions effectively as an image repainter. When provided with a concrete structural draft, it can parse the visual arrangement, accurately preserve title and annotation text, and focus its generation capacity on elevating the aesthetic polish, typography, and visual styling.\n* **Auditable intermediate assets**: Relying on a code-generated draft (such as matplotlib) gives you programmatic control over the underlying data and text before letting the image model handle visual refinement.",
  "error": null,
  "opened": [
   "skill_image_generation"
  ],
  "requested": [
   "skill_image_generation"
  ],
  "opened_target": true,
  "prompt_tokens": 13681,
  "completion_tokens": 1217,
  "sec": 13.592695474624634,
  "cost": 0.0148245,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T16",
  "target": "skill_intake",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "The sync step only processes **`.m4a`** and **`.qta`** files. \n\nAny other audio formats (such as `.wav`, `.mp3`, etc.) present in the source folder are ignored by default.\n\n### Additional Reasons Files Might Be Skipped:\n1. **Existing Destination Files**: If a recording for that timestamp has already been synced to the destination directory (`data/YYYYMMDD/YYYYMMDD_HHMM_watch.m4a`), the sync step skips it rather than overwriting it.\n2. **Missing `ffmpeg`**: If `.qta` files are failing to convert or sample generation produces `.wav` instead of `.m4a`, ensure `ffmpeg` is installed and detected by running:\n   ```bash\n   python -m intake_skill doctor\n   ```\n3. **Date Filters**: If running `sync` with a specific `--date YYYYMMDD`, files from other dates will not be included.\n\nYou can preview exactly which files are being picked up and where they are routed by running:\n```bash\npython -m intake_skill sync --dry-run\n```",
  "error": null,
  "opened": [
   "skill_intake"
  ],
  "requested": [
   "skill_intake"
  ],
  "opened_target": true,
  "prompt_tokens": 15682,
  "completion_tokens": 559,
  "sec": 15.423668146133423,
  "cost": 0.01385775,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T17",
  "target": "watch_development",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "On watchOS, the **Developer Mode** toggle does not appear in *Settings > Privacy & Security* until the Apple Watch has established an initial developer pairing with a Mac running Xcode.\n\nFollow these steps to make the option appear and enable it:\n\n---\n\n### Step 1: Ensure Prerequisites are Met\n* **Apple Watch connects via the iPhone:** The Apple Watch magnetic charging cable does not provide a data interface to your Mac. Xcode connects to the watch entirely through its paired iPhone.\n* Connect and trust your **paired iPhone** to your Mac (via USB or on the same Wi-Fi network).\n* Make sure **Wi-Fi and Bluetooth** are turned on for both your iPhone and Apple Watch.\n* Unlock both devices.\n\n---\n\n### Step 2: Establish Pairing in Xcode (Device Hub)\n1. Open Xcode on your Mac.\n2. Open **Device Hub** via:\n   * **Xcode > Open Developer Tool > Device Hub**, or \n   * The run-destination menu at the top of Xcode > **Manage Devices…**\n3. In Device Hub, click the **\"+\"** button and select **\"Pair Nearby Device\"**.\n4. When prompted, a numeric pairing code will appear on the Apple Watch display. Confirm the pairing code on the watch to establish trust.\n\n---\n\n### Step 3: Restart the Apple Watch\n1. Once the watch is recognized in Device Hub, **restart the Apple Watch** (press and hold the side button, tap the Power icon, slide to power off, then turn it back on).\n2. Rebooting triggers watchOS to surface the hidden Developer Mode menu item.\n\n---\n\n### Step 4: Turn On Developer Mode\n1. After the watch reboots, open **Settings** directly on the Apple Watch.\n2. Navigate to **Privacy & Security**.\n3. Scroll down to find **Developer Mode** (now visible).\n4. Tap it, toggle **Developer Mode** to **On**, and confirm the prompt to restart the watch once more.",
  "error": null,
  "opened": [
   "watch_development",
   "real_device",
   "ios_development"
  ],
  "requested": [
   "watch_development",
   "real_device",
   "ios_development"
  ],
  "opened_target": true,
  "prompt_tokens": 21922,
  "completion_tokens": 1071,
  "sec": 15.46733808517456,
  "cost": 0.020457749999999997,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T18",
  "target": "koyeb",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "### Why the Standard CLI Metrics Command Shouldn't Be Used\n\nThe standard CLI (`koyeb metrics get`) is unsafe for automated zero-traffic verification because **it maps upstream `null` telemetry values to `0`** (and emits chained JSON frames). \n\nThis creates a critical distinction failure:\n- A raw `null` indicates missing data, an uncollected interval, or unavailable telemetry.\n- A true `0` represents verified zero requests during that window.\n\nBecause the standard CLI collapses raw nulls into zeroes, missing data will appear as confirmed zero traffic, resulting in false-positive inactivity determinations that could prematurely scale down or sleep an active service.\n\n---\n\n### What Script to Use Instead\n\nUse the dedicated lossless reader script:\n\n```bash\nscripts/request_metrics.py\n```\n\n#### Why it works:\n- It preserves raw telemetry fidelity without coercing upstream `null` values to `0`.\n- It retains per-series labels, allowing automation to perform accurate, three-state classification (`traffic > 0`, `confirmed 0 traffic`, and `missing/null data`).\n- It has an explicit narrow read-only exception to the standard CLI wrapper specifically to preserve raw null request telemetry.\n\n#### Example Usage:\n```bash\npython3 scripts/request_metrics.py \\\n  --service-id <service-id> \\\n  --start 2026-01-01T00:00:00Z \\\n  --end 2026-01-01T01:00:00Z \\\n  --step 1h\n```",
  "error": null,
  "opened": [
   "koyeb"
  ],
  "requested": [
   "koyeb"
  ],
  "opened_target": true,
  "prompt_tokens": 14472,
  "completion_tokens": 959,
  "sec": 15.231184005737305,
  "cost": 0.014450249999999998,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T19",
  "target": "narwal",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "In `narwal-local`, **`is_docked` and `charging_state` are always `null` by design**. The CLI does not emit boolean or normalized enum values for them because the underlying protocol codes vary across firmware versions.\n\nTo reliably determine whether the robot is docked and charging via the CLI:\n\n---\n\n### 1. Primary Method: Check the Battery Trend\nThe official way to verify charging status is by tracking whether the battery percentage is rising over time:\n\n* **Option A: Run a bounded `watch` window**\n  Stream live telemetry broadcasts over a short duration (up to 300 seconds):\n  ```bash\n  narwal-local watch --duration 60\n  ```\n  Inspect the `battery_percent` values in the output JSON lines. If the percentage increases across the window, the vacuum is actively charging (and therefore docked).\n\n* **Option B: Compare spaced `snapshot` calls**\n  Run `narwal-local snapshot`, wait a short period, and run it again to compare `data.base_query.battery_percent`.\n\n---\n\n### 2. Inspect the Raw Protocol Fields\nWhile normalized fields are `null`, the raw payloads are preserved in the response:\n* Check `dock_raw` and `charging_status_raw` in the telemetry. \n* Note that these numeric codes depend on your specific model and firmware version, so they should be calibrated against your device rather than assumed.\n\n---\n\n### 3. Contextual State Clues\n* **Idle at Dock:** If `data.base_query.mode.semantic` is `\"standby\"`, task metrics (`area_m2`, `elapsed_seconds`) are `null`, and `battery_percent` is `100.0`, the robot is typically resting at the dock fully charged.\n* **Connection Rule:** Ensure you do not run multiple CLI commands concurrently (e.g., polling `snapshot` while running `watch`), as Narwal devices only permit **one connection per source IP**.",
  "error": null,
  "opened": [
   "narwal"
  ],
  "requested": [
   "narwal"
  ],
  "opened_target": true,
  "prompt_tokens": 16213,
  "completion_tokens": 1258,
  "sec": 16.83916401863098,
  "cost": 0.01687725,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T20",
  "target": "skill_opencode_data",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "### Why Subagent Fan-Out Sessions Are Missing\n\nWhen exporting OpenCode sessions to Markdown using `opencode_skill export`, **subagent fan-out sessions are excluded by default**. \n\nThe exporter filters them out unless explicitly told to keep them, in order to prevent internal task/subagent clutter and only export top-level, interactive user sessions.\n\n---\n\n### How to Include Them\n\nTo include subagent fan-out sessions in the export, add the **`--include-subagent`** flag to the export command:\n\n```bash\n.venv/bin/python -m opencode_skill export --out OUTPUT_DIR --include-subagent\n```\n\nYou can combine this with other flags such as `--since` to restrict the time window, or `--dry-run` to preview the count before writing files:\n\n```bash\n# Preview what would be exported including subagents\n.venv/bin/python -m opencode_skill export --out OUTPUT_DIR --include-subagent --dry-run\n\n# Export with subagents for a specific time range (e.g., past 30 days)\n.venv/bin/python -m opencode_skill export --out OUTPUT_DIR --include-subagent --since 30d\n```\n\n*(Note: If you are archiving or planning selections in the database with `plan` or `apply`, descendants are expanded across the `parent_id` chain by default to keep root and child sessions together, unless `--no-expand` is passed.)*",
  "error": null,
  "opened": [
   "ai_session_export",
   "skill_opencode_data"
  ],
  "requested": [
   "ai_session_export",
   "skill_opencode_data"
  ],
  "opened_target": true,
  "prompt_tokens": 15748,
  "completion_tokens": 534,
  "sec": 9.523216009140015,
  "cost": 0.0138135,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T21",
  "target": "speaker_notes",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "The strict upper limit (hard gate) is **22 words** per ordinary spoken sentence (with the standard target range being between 12 and 20 words).",
  "error": null,
  "opened": [
   "speaker_notes"
  ],
  "requested": [
   "speaker_notes"
  ],
  "opened_target": true,
  "prompt_tokens": 14742,
  "completion_tokens": 330,
  "sec": 9.407388925552368,
  "cost": 0.012294000000000001,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T22",
  "target": "skill_semantic_search",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "To define the base directory that relative paths should be resolved from, use the **`--source-root`** option:\n\n```bash\nsemantic-search rebuild --file-list tmp/files.txt --source-root /path/to/base/dir ...\n```\n\n### When the option is omitted:\nIf `--source-root` is omitted, `semantic-search` resolves relative entries against the **CLI's current working directory** (not the directory where the file list itself is located or was generated). \n\n*(Note: If the CLI is run from a different directory than the one where the relative paths originated, the paths won't match cached identities and queries can silently return empty results.)*",
  "error": null,
  "opened": [
   "skill_semantic_search"
  ],
  "requested": [
   "skill_semantic_search"
  ],
  "opened_target": true,
  "prompt_tokens": 13509,
  "completion_tokens": 469,
  "sec": 10.317842245101929,
  "cost": 0.0118905,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T23",
  "target": "smart_home_skill",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "**No**, you cannot retrieve the volume level or mute status using the smart home integration's status endpoint.\n\n### Why:\n* **Protocol limitation**: Samsung TV control is implemented via the local Tizen WebSocket API (`wss://TV_IP:8002`). Under this protocol, volume level and mute state are not readable.\n* **Returned state**: The `get_status` endpoint returns `PowerState` only. \n\nIf your automation requires setting volume levels, you will typically need to rely on relative blind adjustments (e.g., sending volume up/down or mute toggle keys) rather than reading and asserting absolute values.",
  "error": null,
  "opened": [
   "smart_home_skill"
  ],
  "requested": [
   "smart_home_skill"
  ],
  "opened_target": true,
  "prompt_tokens": 12762,
  "completion_tokens": 555,
  "sec": 10.313507080078125,
  "cost": 0.01165275,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T24",
  "target": "skill_unifi",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "Based on the `unifi-skill` documentation:\n\n### Exit Code\nThe specific exit code for authentication failure caused by an expired cookie is **`10`**.\n\n### How to Resolve It\n1. **Notify the human user**: Cookie refresh is explicitly a human step and cannot be performed autonomously by the agent.\n2. **Follow the refresh procedure**: Have the human export a fresh session cookie from the UniFi Network Controller according to the instructions in **`docs/cookie_refresh.md`**.\n3. **Update the cookie**: Place the refreshed cookie at the path configured in your `.env` file (e.g., via the cookie path environment variable) and re-run the command.",
  "error": null,
  "opened": [
   "skill_unifi"
  ],
  "requested": [
   "skill_unifi"
  ],
  "opened_target": true,
  "prompt_tokens": 12643,
  "completion_tokens": 254,
  "sec": 8.66234302520752,
  "cost": 0.01043475,
  "web_tools": [],
  "n_calls": 2,
  "nudged": false
 },
 {
  "id": "T25",
  "target": "asr",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "The maximum allowed duration for a single audio file is **7,200 seconds (exactly 2 hours)**.\n\n### Details & Behavior:\n- **Hard Limit**: Any single file longer than 7,200 seconds is rejected before the acoustic/diarization models even load.\n- **Batch Processing**: Multiple files whose combined duration exceeds 2 hours are permitted, provided no individual file exceeds the limit.\n- **Handling Long Recordings**: If your interview files exceed 2 hours, split them into smaller segments before running the pipeline. Note that speaker labels/letters do not automatically persist or correlate across slices.",
  "error": null,
  "opened": [
   "asr",
   "workflow_bilibili_whisper_transcription",
   "download_and_transcribe"
  ],
  "requested": [
   "asr",
   "workflow_bilibili_whisper_transcription",
   "download_and_transcribe"
  ],
  "opened_target": true,
  "prompt_tokens": 18278,
  "completion_tokens": 376,
  "sec": 8.789889335632324,
  "cost": 0.0151185,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T26",
  "target": "skill_outlook",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "When creating or updating calendar events with `calendar invite` or `calendar update`, the default timezone used if no `--timezone` argument is provided is **`UTC`**.\n\nImportant details to keep in mind:\n- Wall-clock values passed to `--start` and `--end` will be interpreted as UTC by default.\n- For `calendar update`, `--timezone` does **not** inherit the event's existing timezone from Microsoft Graph—it will still default to `UTC` if omitted.",
  "error": null,
  "opened": [
   "skill_google_docs",
   "skill_outlook"
  ],
  "requested": [
   "skill_google_docs",
   "skill_outlook"
  ],
  "opened_target": true,
  "prompt_tokens": 34076,
  "completion_tokens": 1115,
  "sec": 13.101240873336792,
  "cost": 0.02973825,
  "web_tools": [],
  "n_calls": 3,
  "nudged": true
 },
 {
  "id": "T27",
  "target": "skill_resend_email",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "### Why This Happened\n\nIn the Resend API (and the `resend_email_skill` CLI), the `--after` and `--before` flags are **pagination cursors**, not timestamp or date filters. \n\nWhen you pass an ISO timestamp like `2023-10-01T00:00:00Z`, the API returns a validation error because it expects a **UUID cursor value** corresponding to an email ID.\n\n---\n\n### How to Retrieve Emails by Time Window\n\nBecause the API does not support server-side date-range filtering on received email listings, the standard pattern is to fetch recent messages and filter by date locally:\n\n1. **Export a sufficiently large batch of recent emails to Markdown:**\n   ```bash\n   .venv/bin/python -m resend_email_skill.cli received export-all-md \\\n     --limit 100 \\\n     --output-dir data/received/markdown \\\n     --format json\n   ```\n\n2. **Filter locally by timestamp:**\n   Each exported Markdown file includes a `created_at` field in its frontmatter. You can parse or filter those files against your target window (`2023-10-01T00:00:00Z`).\n\n*(Note: If you need to paginate through the API across multiple pages, pass the UUID of the boundary email object as the `--after` or `--before` parameter rather than a date string.)*",
  "error": null,
  "opened": [
   "skill_resend_email"
  ],
  "requested": [
   "skill_resend_email"
  ],
  "opened_target": true,
  "prompt_tokens": 14013,
  "completion_tokens": 705,
  "sec": 11.146193742752075,
  "cost": 0.013153500000000002,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T28",
  "target": "skill_firecrawl",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "How you set this up depends on which search CLI tool you are using:\n\n---\n\n### 1. Using Tavily CLI (`python -m tavily_skill`)\n\nTavily natively supports using both `--include-domain` and `--exclude-domain` simultaneously. Both flags can be repeated as needed.\n\n```bash\npython -m tavily_skill search \"your search query\" \\\n  --include-domain github.com \\\n  --include-domain docs.anthropic.com \\\n  --exclude-domain badsite.com\n```\n\n- Each `--include-domain` restricts results to that specific domain.\n- Each `--exclude-domain` removes results matching that specific domain.\n\n---\n\n### 2. Using Firecrawl CLI (`python -m firecrawl_skill`)\n\nIn Firecrawl, the `--include-domain` and `--exclude-domain` CLI flags are **mutually exclusive** (passing both will result in a usage error).\n\nTo achieve both targeting and excluding at the same time in Firecrawl:\n1. Target the desired domains using `--include-domain`.\n2. Exclude the unwanted domain by embedding the `-site:` operator directly into the query string.\n\n```bash\npython -m firecrawl_skill search \"your search query -site:badsite.com\" \\\n  --include-domain github.com \\\n  --include-domain docs.anthropic.com\n```\n\n---\n\n### Notes on Output\n\nBoth CLIs write the complete search results to a JSON file rather than printing them directly to `stdout`. When the command finishes:\n- `stdout` will print a status JSON object containing `output_path`.\n- Open the file specified by `output_path` to view and parse the filtered search results.",
  "error": null,
  "opened": [
   "skill_tavily",
   "skill_firecrawl"
  ],
  "requested": [
   "skill_tavily",
   "skill_firecrawl"
  ],
  "opened_target": true,
  "prompt_tokens": 23900,
  "completion_tokens": 1123,
  "sec": 12.431177616119385,
  "cost": 0.022136250000000003,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T29",
  "target": "video-scoring-audio",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "You should avoid downmixing stereo audio to mono with `-ac 1` before measuring peak level because **ffmpeg sums correlated stereo channels with roughly a +3 dB boost**.\n\nSpecifically:\n- **It causes false clipping reports:** In correlated stereo (such as a voice-over or mono mix placed across both left and right channels), summing the channels inflates the measured amplitude. A mix that actually has a safe true peak (e.g., -1.5 dBFS) can measure at 1.19 after an `-ac 1` downmix, falsely reporting clipping.\n- **Correct measurement practice:** Always measure the peak across all channels independently (e.g., inspecting `np.max(np.abs(channels))` without summing), or use an integrated loudness and true-peak cross-check such as:\n  ```bash\n  ffmpeg -af ebur128=peak=true -f null -\n  ```",
  "error": null,
  "opened": [
   "video-scoring-audio"
  ],
  "requested": [
   "video-scoring-audio"
  ],
  "opened_target": true,
  "prompt_tokens": 17182,
  "completion_tokens": 817,
  "sec": 9.12901782989502,
  "cost": 0.01595025,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 },
 {
  "id": "T30",
  "target": "skill_playwright_test",
  "model": "gemini-3.8-flash",
  "condition": "index",
  "answer": "This infinite loop is caused by **stale session tokens stored in the browser profile (or user data directory)**.\n\n### Detailed Mechanism\n\n1. **Stale Token Detection**: The browser's `user-data-dir` or local storage still contains session tokens or cookies from a previous session or test run.\n2. **Failed Authentication**: When the application loads, the SSO client-side SDK detects the cached token, transitions into a \"signing in\" state, and attempts to authenticate against the backend using that token.\n3. **Continuous 401 & Retry**: The backend rejects the stale/expired credentials and returns a `401 Unauthorized` response.\n4. **Infinite Oscillation**: In response to the 401, the SSO SDK tries to recover or refresh the session, triggering another attempt with the existing stale state. This continuously alternates the UI between \"loading\" and \"signing in\" states while flooding backend logs with 401 errors.\n\n---\n\n### How to Fix It\n\n1. **Wipe the Browser Profile Directory**:\n   If using CDP or a dedicated debug profile, remove the profile directory before launching the browser:\n   ```bash\n   rm -rf /tmp/pw_debug_profile\n   ```\n2. **Use Isolated Contexts in Automation**:\n   When scripting browser automation (e.g., in Playwright), always instantiate a clean context rather than sharing or persisting browser contexts:\n   ```python\n   context = await browser.new_context()  # Ensures no inherited storage/cookies\n   ```\n3. **Manual Browser Debugging**:\n   If debugging directly in a standard browser, completely clear the site's cookies, `localStorage`, and `sessionStorage` in DevTools (under the **Application** tab -> **Storage** -> **Clear site data**), or test using an Incognito / private window.",
  "error": null,
  "opened": [
   "skill_session_keeper",
   "skill_playwright_test"
  ],
  "requested": [
   "skill_session_keeper",
   "skill_playwright_test"
  ],
  "opened_target": true,
  "prompt_tokens": 16133,
  "completion_tokens": 1126,
  "sec": 12.66966438293457,
  "cost": 0.01632225,
  "web_tools": [],
  "n_calls": 2,
  "nudged": true
 }
]