[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71DXFDM5TJVVQ5VP33WQ0F7":3,"skill-same:01M71DXFDM5TJVVQ5VP33WQ0F7":65},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":30,"linkOnly":31,"markdownContent":32,"markdownBody":33,"frontMatter":34,"refName":36,"commitSha":37,"skillDirectory":38,"forksCount":39,"repositoryHtmlUrl":40,"repositoryHomepageUrl":6,"ownerHtmlUrl":41,"ownerBlogUrl":42,"ownerDescription":43,"updatedAt":44,"install":45,"resources":58},"01M71DXFDM5TJVVQ5VP33WQ0F7","finish-estimate",null,"Mark a pending time estimate complete with actual duration.","indigoai-us\u002Fhq-core","indigoai-us","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F122242446?v=4","01M71DTQ5NGD10GT1Z7E6XKWC5","HQ","01M71DTQ6BKSYYBNC9RAKT3YDK",95,"MIT","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffinish-estimate\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29],"finish","estimate","finish estimate","Bash","read","edit","time","complete","with","mark","pending","2026-11-10 10:12:30",false,"---\nname: finish-estimate\ndescription: Mark a pending time estimate complete with actual duration.\nallowed-tools: Bash, Read, Edit\n---\n\n# \u002Ffinish-estimate - Record Actual Time\n\nLook up an estimate by ID (or grab the most-recent `pending`) and fill in the actual elapsed time, ratio, and verdict.\n\n**Input:** $ARGUMENTS\n\nExamples:\n- `latest 10m` — close out the most-recently-logged pending estimate with 10 minutes\n- `est_f43cca6aa1 1h` — close out a specific estimate\n- `latest 45m \"Tauri sign step took longer than expected\"` — with a note\n\n## Steps\n\n1. **Parse arguments**\n   - First token: estimate ID (`est_*`) or literal `latest`\n   - Second token: actual duration in same format as `\u002Ftrack-estimate` (`10m`, `1.5h`, `2d`)\n   - Remaining (optional): notes string\n\n2. **Resolve target entry**\n   - If `latest`: read `workspace\u002Festimate-log\u002Flog.jsonl`, find the most-recent entry with `kind == \"estimate\"` AND `status == \"pending\"`. Take its `id`.\n   - Else: search for the line where `id == \u003Cprovided>`.\n   - If no match, abort with a clear message.\n\n3. **Normalize actual duration**\n   Same parser as `\u002Ftrack-estimate`. Compute `actual_minutes` (single value, not a range — actuals are point measurements).\n\n4. **Compute verdict**\n   ```\n   ratio = actual_minutes \u002F expected_minutes\n   verdict = \"under\" if ratio \u003C 0.8\n           | \"on\"    if 0.8 \u003C= ratio \u003C= 1.2\n           | \"over\"  if ratio > 1.2\n   ```\n\n5. **Rewrite the entry's line in `log.jsonl`**\n   - Read the file line by line.\n   - For the matched line, parse the JSON, add fields:\n     - `actual_minutes`\n     - `actual_at` (current ISO timestamp)\n     - `ratio`\n     - `verdict`\n     - `status: \"completed\"`\n     - `notes` if provided\n   - Re-emit with canonical (alphabetical) key order.\n   - Write back the full file (atomic via temp + rename).\n\n6. **Report**\n   ```\n   ID: \u003Cid>\n   Task: \u003Ctask-or-surrounding-truncated>\n   Estimate: \u003Cexpected> min (range \u003Cmin>-\u003Cmax>)\n   Actual:   \u003Cactual> min\n   Ratio:    \u003Cratio> ({factor}x {over\u002Funder\u002Fon})\n   Category: \u003Ccategory>\n   ```\n\n   Where `factor`:\n   - `over`: `round(ratio, 1)` — e.g. `2.4x over`\n   - `under`: `round(1\u002Fratio, 1)` — e.g. `3.0x under`\n   - `on`: `±X%` — e.g. `+12%`\n\n## Implementation hint\n\nUse jq for the in-place rewrite. Atomic pattern:\n\n```bash\nLOG=workspace\u002Festimate-log\u002Flog.jsonl\nTMP=$(mktemp)\njq -c --arg id \"$ID\" --argjson actual \"$ACTUAL_MINUTES\" --arg ts \"$NOW_ISO\" --arg verdict \"$VERDICT\" --argjson ratio \"$RATIO\" --arg notes \"$NOTES\" '\n  if .id == $id then\n    . + {actual_minutes: $actual, actual_at: $ts, ratio: $ratio, verdict: $verdict, status: \"completed\"}\n    + (if $notes != \"\" then {notes: $notes} else {} end)\n  else . end\n' \"$LOG\" > \"$TMP\" && mv \"$TMP\" \"$LOG\"\n```\n\n`jq -c` keeps it as JSONL. Field order may shift after the merge; that's fine — the dedup grep doesn't depend on order.\n\n## Notes\n\n- Once `status: \"completed\"`, an entry won't be re-processed by `latest` — so it's safe to run repeatedly.\n- If you mistyped the actual, just run again with the correct value — the rewrite is idempotent.\n- Don't worry about precise wall-clock timing. The signal we want is \"ratio order of magnitude\" (2x, 5x, 0.5x), not minutes-of-minutes precision.\n\n## See also\n\n- `\u002Fcalibration-report` — review accuracy across estimates\n- `\u002Ftrack-estimate` — start a new one\n","# \u002Ffinish-estimate - Record Actual Time\n\nLook up an estimate by ID (or grab the most-recent `pending`) and fill in the actual elapsed time, ratio, and verdict.\n\n**Input:** $ARGUMENTS\n\nExamples:\n- `latest 10m` — close out the most-recently-logged pending estimate with 10 minutes\n- `est_f43cca6aa1 1h` — close out a specific estimate\n- `latest 45m \"Tauri sign step took longer than expected\"` — with a note\n\n## Steps\n\n1. **Parse arguments**\n   - First token: estimate ID (`est_*`) or literal `latest`\n   - Second token: actual duration in same format as `\u002Ftrack-estimate` (`10m`, `1.5h`, `2d`)\n   - Remaining (optional): notes string\n\n2. **Resolve target entry**\n   - If `latest`: read `workspace\u002Festimate-log\u002Flog.jsonl`, find the most-recent entry with `kind == \"estimate\"` AND `status == \"pending\"`. Take its `id`.\n   - Else: search for the line where `id == \u003Cprovided>`.\n   - If no match, abort with a clear message.\n\n3. **Normalize actual duration**\n   Same parser as `\u002Ftrack-estimate`. Compute `actual_minutes` (single value, not a range — actuals are point measurements).\n\n4. **Compute verdict**\n   ```\n   ratio = actual_minutes \u002F expected_minutes\n   verdict = \"under\" if ratio \u003C 0.8\n           | \"on\"    if 0.8 \u003C= ratio \u003C= 1.2\n           | \"over\"  if ratio > 1.2\n   ```\n\n5. **Rewrite the entry's line in `log.jsonl`**\n   - Read the file line by line.\n   - For the matched line, parse the JSON, add fields:\n     - `actual_minutes`\n     - `actual_at` (current ISO timestamp)\n     - `ratio`\n     - `verdict`\n     - `status: \"completed\"`\n     - `notes` if provided\n   - Re-emit with canonical (alphabetical) key order.\n   - Write back the full file (atomic via temp + rename).\n\n6. **Report**\n   ```\n   ID: \u003Cid>\n   Task: \u003Ctask-or-surrounding-truncated>\n   Estimate: \u003Cexpected> min (range \u003Cmin>-\u003Cmax>)\n   Actual:   \u003Cactual> min\n   Ratio:    \u003Cratio> ({factor}x {over\u002Funder\u002Fon})\n   Category: \u003Ccategory>\n   ```\n\n   Where `factor`:\n   - `over`: `round(ratio, 1)` — e.g. `2.4x over`\n   - `under`: `round(1\u002Fratio, 1)` — e.g. `3.0x under`\n   - `on`: `±X%` — e.g. `+12%`\n\n## Implementation hint\n\nUse jq for the in-place rewrite. Atomic pattern:\n\n```bash\nLOG=workspace\u002Festimate-log\u002Flog.jsonl\nTMP=$(mktemp)\njq -c --arg id \"$ID\" --argjson actual \"$ACTUAL_MINUTES\" --arg ts \"$NOW_ISO\" --arg verdict \"$VERDICT\" --argjson ratio \"$RATIO\" --arg notes \"$NOTES\" '\n  if .id == $id then\n    . + {actual_minutes: $actual, actual_at: $ts, ratio: $ratio, verdict: $verdict, status: \"completed\"}\n    + (if $notes != \"\" then {notes: $notes} else {} end)\n  else . end\n' \"$LOG\" > \"$TMP\" && mv \"$TMP\" \"$LOG\"\n```\n\n`jq -c` keeps it as JSONL. Field order may shift after the merge; that's fine — the dedup grep doesn't depend on order.\n\n## Notes\n\n- Once `status: \"completed\"`, an entry won't be re-processed by `latest` — so it's safe to run repeatedly.\n- If you mistyped the actual, just run again with the correct value — the rewrite is idempotent.\n- Don't worry about precise wall-clock timing. The signal we want is \"ratio order of magnitude\" (2x, 5x, 0.5x), not minutes-of-minutes precision.\n\n## See also\n\n- `\u002Fcalibration-report` — review accuracy across estimates\n- `\u002Ftrack-estimate` — start a new one\n",{"name":5,"description":7,"allowed-tools":35},"Bash, Read, Edit","main","205cf61728a27ef15e9153aa38df5856fc8d82f5",".claude\u002Fskills\u002Ffinish-estimate",18,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core","https:\u002F\u002Fgithub.com\u002Findigoai-us","https:\u002F\u002Fhqforwork.com\u002F","The AI Context Layer for Teams","2026-11-12 06:53:38",{"source":8,"skillName":5,"commands":46,"prompt":56,"zipAvailable":57},[47,50,53],{"tool":48,"command":49},"npx","npx skills add indigoai-us\u002Fhq-core --skill finish-estimate",{"tool":51,"command":52},"bunx","bunx skills add indigoai-us\u002Fhq-core --skill finish-estimate",{"tool":54,"command":55},"pnpm","pnpm dlx skills add indigoai-us\u002Fhq-core --skill finish-estimate","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffinish-estimate\u002FSKILL.md",true,[59],{"path":60,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":63,"sourceHtmlUrl":64},"agents\u002Fopenai.yaml","REFERENCE","参考文档",131,"https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffinish-estimate\u002Fagents\u002Fopenai.yaml",[66,85,115,139,150,160],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":30},"01M71E4MQ04WPK1EVDS7VKJ3E8","social-graphic","Generate 1080x1080 HTML social graphics for HQ update posts.","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fworkers\u002Fpublic\u002Fsocial-strategist\u002Fskills\u002Fsocial-graphic\u002FSKILL.md",[],[73,74,22,75,24,76,23,77,78,79,80,81,82,83,84],"social","social graphic","html","write","update","generate","graphics","browser","open","agent-browser","for","posts",{"skillNo":86,"name":82,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":98,"publishedAt":30},"01M71E4H33K4P5H5M7ENPTMFSC","Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to \"open a website\", \"fill out a form\", \"click a button\", \"take a screenshot\", \"scrape data from a page\", \"test this web app\", \"login to a site\", \"automate browser actions\", or any task requiring programmatic web interaction.","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fworkers\u002Fpublic\u002Fqa-tester\u002Fskills\u002Fagent-browser\u002FSKILL.md",[90,95],{"categoryNo":91,"categoryName":92,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":96,"categoryName":97,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000023","Skill与智能体开发",[99,80,100,101,102,103,22,104,105,106,107,108,81,109,82,110,111,112,113,114],"agent browser","click","ai agents","app","scrape","when","apps","actions","extracting","take a screenshot","testing","programmatic","browser automation","website","cli","interaction",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":30},"01M71E4FDBD7J8Y45JJ9KMMYGN","work-mesh","Work Mesh Live — automatic presence via hq mesh daemon; context reconcile\u002Forganize; manual session task-status, blocked, and note only.","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fwork-mesh\u002FSKILL.md",[],[122,123,124,22,125,126,127,128,129,130,131,132,133,134,23,135,136,137,138],"work mesh","work","mesh","status","context","note","live","presence","automatic","reconcile","only","organize","task","session","manual","daemon","via",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":145,"publishedAt":30},"01M71E4EGHNAAGWAPV6KGBMQ9W","review","Parity worker review skill (materialization fixture).","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fscripts\u002Ftests\u002Ffixtures\u002Fagent-session\u002Fworker-materialization\u002Fparity-worker\u002Fskills\u002Freview\u002FSKILL.md",[],[141,146,147,148,149],"review skill","fixture","parity","worker",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":156,"publishedAt":30},"01M71E4D1FZDJPDC15DRERKX8Y","run","Run or list HQ workers (parity fixture).","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fscripts\u002Ftests\u002Ffixtures\u002Fagent-session\u002Fskills\u002Frun\u002FSKILL.md",[],[152,157,158,148,159,147],"parity fixture","workers","list",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":166,"publishedAt":30},"01M71E4BF4MV5SEWZJZ4T1QPQW","handoff","Preserve session state for a follow-up agent (parity fixture).","https:\u002F\u002Fgithub.com\u002Findigoai-us\u002Fhq-core\u002Fblob\u002Fmain\u002Fcore\u002Fscripts\u002Ftests\u002Ffixtures\u002Fagent-session\u002Fskills\u002Fhandoff\u002FSKILL.md",[],[162,157,167,168,135,169,83,148,170,171,147],"up","preserve","session state","follow-up","state"]