[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7927H40WMAMXY9AXPYEPK23":3,"skill-same:01M7927H40WMAMXY9AXPYEPK23":48},{"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":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":27,"repositoryHtmlUrl":28,"repositoryHomepageUrl":29,"ownerHtmlUrl":30,"ownerBlogUrl":31,"ownerDescription":32,"updatedAt":33,"install":34,"resources":47},"01M7927H40WMAMXY9AXPYEPK23","file-handling",null,"Read images and large files without destroying the conversation. Use before reading any image — a screenshot you took, a chart you rendered, a photo the user sent — and before reading a file you have not sized. Reading an oversized image ends the conversation permanently and cannot be undone.","pymc-labs\u002Fdaimon","pymc-labs","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F69535651?v=4","01M7925X8T3KFBJ7FJ7V31YCC3","PyMC Labs","01M7925X9W5S549AGZZ126G8JA",24,"MIT","https:\u002F\u002Fgithub.com\u002Fpymc-labs\u002Fdaimon\u002Fblob\u002Fmain\u002Fdefaults\u002Fskills\u002Ffile-handling\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: file-handling\ndescription: Read images and large files without destroying the conversation. Use before reading any image — a screenshot you took, a chart you rendered, a photo the user sent — and before reading a file you have not sized. Reading an oversized image ends the conversation permanently and cannot be undone.\n---\n\n# File handling\n\nWhat you read becomes permanent. Every `read` is inlined into this conversation\nand replayed to the model on every later turn — you cannot remove it, edit it, or\napologise for it. Two kinds of read are unrecoverable, and both are avoidable in\none extra command.\n\n## Images: longest edge under 2000px, always\n\n**The failure.** The API caps how large an image may be. That cap is *not fixed*:\nonce a conversation carries more than 20 images it tightens to **2000px on the\nlongest edge**, and it is applied to the whole conversation — so an image that was\nlegal when you read it becomes illegal later, when some unrelated 21st image\npushes the count over. The request is then rejected outright, every following turn\nreplays the same illegal image, and **the conversation is dead for good.** Not\nslow, not degraded — dead, with no way to remove the offending block.\n\n**The rule: never read an image whose longest edge is 2000px or more.** Under that\nsize nothing can retroactively invalidate it, whatever else the conversation\naccumulates.\n\nCheck before you read, whenever you did not create the file at a known size:\n\n```bash\npython3 -c \"from PIL import Image; print(Image.open('shot.png').size)\"\n```\n\nDownscale in place if it is over — 1600px is a safe target that stays sharp:\n\n```bash\npython3 -c \"from PIL import Image; p='shot.png'; im=Image.open(p); im.thumbnail((1600,1600)); im.save(p)\"\n```\n\n### Screenshots are the usual culprit\n\nTwo habits produce oversized files without looking like they do:\n\n| Habit | What you get | Fix |\n|---|---|---|\n| `device_scale_factor=2` | doubles both edges — a 1800×1400 viewport becomes 3600×2800 | use `device_scale_factor=1` |\n| `full_page=True` on a long page | width fine, height enormous — e.g. 980×4262 | capture viewport sections and read them one at a time |\n\nNote the second one: a full-page capture is usually *within* the limit on width\nand far over it on height. Checking only the width will not save you.\n\n```python\n# safe defaults for a page screenshot\npage = browser.new_page(viewport={\"width\": 1440, \"height\": 900})  # scale factor 1\npage.screenshot(path=\"shot.png\")                                   # not full_page\n```\n\n### Keep the count down too\n\nThe cap only tightens past 20 images, so fewer images is its own protection — and\neach one costs tokens on every subsequent turn.\n\n- Re-read **one** file as you revise it, rather than saving `v1.png`, `v2.png`,\n  `v3.png` and reading each.\n- Crop to the region you are actually checking instead of reading the whole frame.\n- When you have inspected an image and acted on it, do not read it again to\n  confirm — you still have your own description of it.\n\n## Large text files: look before you read\n\nA whole-file `read` of something large is not fatal, but it is irreversible and it\ncrowds out everything else for the rest of the conversation. Size it first:\n\n```bash\nwc -lc path\u002Fto\u002Ffile\n```\n\nFor anything big, retrieve only what you need — `grep` for the symbol, `head`\u002F\n`tail` for structure, or `read` with a line range. Reach for a whole-file read\nwhen the file is genuinely small or you genuinely need all of it.\n\n## Files you produce for the user\n\nEvery new file written to `\u002Fmnt\u002Fsession\u002Foutputs\u002F` is attached to your reply after\nthe turn, then removed from outputs. Write only this turn's finished deliverables\nthere — the chart, notebook or PDF. Never copy a whole working\u002Frun directory into\noutputs or re-copy files already delivered. Keep working files — sources such as\n`.typ` or `.tex`, drafts, intermediate data, logs — in `\u002Froot\u002Fwork`, which a\nworkspace move also carries. Name each file in your reply by its filename and\nnever call it \"above\" or \"below\". Do not also post it with `send_message` into\nthe thread you are answering; that delivers it twice. Do not read a file back\npurely to prove you wrote it; `ls -la` confirms it exists and costs nothing.\n","# File handling\n\nWhat you read becomes permanent. Every `read` is inlined into this conversation\nand replayed to the model on every later turn — you cannot remove it, edit it, or\napologise for it. Two kinds of read are unrecoverable, and both are avoidable in\none extra command.\n\n## Images: longest edge under 2000px, always\n\n**The failure.** The API caps how large an image may be. That cap is *not fixed*:\nonce a conversation carries more than 20 images it tightens to **2000px on the\nlongest edge**, and it is applied to the whole conversation — so an image that was\nlegal when you read it becomes illegal later, when some unrelated 21st image\npushes the count over. The request is then rejected outright, every following turn\nreplays the same illegal image, and **the conversation is dead for good.** Not\nslow, not degraded — dead, with no way to remove the offending block.\n\n**The rule: never read an image whose longest edge is 2000px or more.** Under that\nsize nothing can retroactively invalidate it, whatever else the conversation\naccumulates.\n\nCheck before you read, whenever you did not create the file at a known size:\n\n```bash\npython3 -c \"from PIL import Image; print(Image.open('shot.png').size)\"\n```\n\nDownscale in place if it is over — 1600px is a safe target that stays sharp:\n\n```bash\npython3 -c \"from PIL import Image; p='shot.png'; im=Image.open(p); im.thumbnail((1600,1600)); im.save(p)\"\n```\n\n### Screenshots are the usual culprit\n\nTwo habits produce oversized files without looking like they do:\n\n| Habit | What you get | Fix |\n|---|---|---|\n| `device_scale_factor=2` | doubles both edges — a 1800×1400 viewport becomes 3600×2800 | use `device_scale_factor=1` |\n| `full_page=True` on a long page | width fine, height enormous — e.g. 980×4262 | capture viewport sections and read them one at a time |\n\nNote the second one: a full-page capture is usually *within* the limit on width\nand far over it on height. Checking only the width will not save you.\n\n```python\n# safe defaults for a page screenshot\npage = browser.new_page(viewport={\"width\": 1440, \"height\": 900})  # scale factor 1\npage.screenshot(path=\"shot.png\")                                   # not full_page\n```\n\n### Keep the count down too\n\nThe cap only tightens past 20 images, so fewer images is its own protection — and\neach one costs tokens on every subsequent turn.\n\n- Re-read **one** file as you revise it, rather than saving `v1.png`, `v2.png`,\n  `v3.png` and reading each.\n- Crop to the region you are actually checking instead of reading the whole frame.\n- When you have inspected an image and acted on it, do not read it again to\n  confirm — you still have your own description of it.\n\n## Large text files: look before you read\n\nA whole-file `read` of something large is not fatal, but it is irreversible and it\ncrowds out everything else for the rest of the conversation. Size it first:\n\n```bash\nwc -lc path\u002Fto\u002Ffile\n```\n\nFor anything big, retrieve only what you need — `grep` for the symbol, `head`\u002F\n`tail` for structure, or `read` with a line range. Reach for a whole-file read\nwhen the file is genuinely small or you genuinely need all of it.\n\n## Files you produce for the user\n\nEvery new file written to `\u002Fmnt\u002Fsession\u002Foutputs\u002F` is attached to your reply after\nthe turn, then removed from outputs. Write only this turn's finished deliverables\nthere — the chart, notebook or PDF. Never copy a whole working\u002Frun directory into\noutputs or re-copy files already delivered. Keep working files — sources such as\n`.typ` or `.tex`, drafts, intermediate data, logs — in `\u002Froot\u002Fwork`, which a\nworkspace move also carries. Name each file in your reply by its filename and\nnever call it \"above\" or \"below\". Do not also post it with `send_message` into\nthe thread you are answering; that delivers it twice. Do not read a file back\npurely to prove you wrote it; `ls -la` confirms it exists and costs nothing.\n",{"name":5,"description":7},"main","53379a071acd911295e30689207bdb481cbc5466","defaults\u002Fskills\u002Ffile-handling",8,"https:\u002F\u002Fgithub.com\u002Fpymc-labs\u002Fdaimon","https:\u002F\u002Fdaimon.pymc-labs.com\u002F","https:\u002F\u002Fgithub.com\u002Fpymc-labs","https:\u002F\u002Fwww.pymc-labs.com","The Bayesian Consultancy","2026-11-14 00:31:23",{"source":8,"skillName":5,"commands":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add pymc-labs\u002Fdaimon --skill file-handling",{"tool":40,"command":41},"bunx","bunx skills add pymc-labs\u002Fdaimon --skill file-handling",{"tool":43,"command":44},"pnpm","pnpm dlx skills add pymc-labs\u002Fdaimon --skill file-handling","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fpymc-labs\u002Fdaimon\u002Fblob\u002Fmain\u002Fdefaults\u002Fskills\u002Ffile-handling\u002FSKILL.md",true,[],[49,56,63,70,77,84],{"skillNo":50,"name":51,"nameZh":6,"description":52,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":53,"categories":54,"keywords":55,"publishedAt":19},"01M7929HJTKXW1ZTXENBK958ZE","daimon-context","Use when the user asks about team context, project status, decisions, or discussions that live in Slack or Discord, or names a daimon. Routes the question to the right daimon servers and merges their answers.","https:\u002F\u002Fgithub.com\u002Fpymc-labs\u002Fdaimon\u002Fblob\u002Fmain\u002Fplugin\u002Fskills\u002Fdaimon-context\u002FSKILL.md",[],[],{"skillNo":57,"name":58,"nameZh":6,"description":59,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":60,"categories":61,"keywords":62,"publishedAt":19},"01M7929EP24ZTERFDGV0EH61ZD","qa-echo-skill","QA fixture skill. When asked for the QA echo phrase, reply ECHO-SKILL-OK.","https:\u002F\u002Fgithub.com\u002Fpymc-labs\u002Fdaimon\u002Fblob\u002Fmain\u002Fpackages\u002Ftesting\u002Ffixtures\u002Ftarget53\u002Fcatalog\u002Ffixtures\u002FSKILL.md",[],[],{"skillNo":64,"name":65,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":69,"publishedAt":19},"01M7929B143T2Z2K2GWKS9J6AC","workspace-write","Send or draft Gmail and create or edit Google Drive files, Docs and Calendar events through a dedicated shared Workspace identity.","https:\u002F\u002Fgithub.com\u002Fpymc-labs\u002Fdaimon\u002Fblob\u002Fmain\u002Fdefaults\u002Fskills\u002Fworkspace-write\u002FSKILL.md",[],[],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":19},"01M792966D6TGSTZ3T1G8972W1","workspace-setup","First-time workspace setup and agent-roster operations for a Daimon workspace — working repo, keys, skills, MCP servers, routines, and which changes need an admin.","https:\u002F\u002Fgithub.com\u002Fpymc-labs\u002Fdaimon\u002Fblob\u002Fmain\u002Fdefaults\u002Fskills\u002Fworkspace-setup\u002FSKILL.md",[],[],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":19},"01M7929307QKVB84Q8F5MV85D4","toggl-edits","Update or bulk edit stopped Toggl Track entries for an explicitly named workspace member using a shared admin key.","https:\u002F\u002Fgithub.com\u002Fpymc-labs\u002Fdaimon\u002Fblob\u002Fmain\u002Fdefaults\u002Fskills\u002Ftoggl-edits\u002FSKILL.md",[],[],{"skillNo":85,"name":86,"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":90,"publishedAt":19},"01M7928YNB3YG57VQ7GTDZ9274","team-etiquette","Post for other people without wasting their time. Use before posting outside this conversation, tagging people outside it, sharing a document, video, audio or slides with others, or creating or editing a routine that posts for or tags others.","https:\u002F\u002Fgithub.com\u002Fpymc-labs\u002Fdaimon\u002Fblob\u002Fmain\u002Fdefaults\u002Fskills\u002Fteam-etiquette\u002FSKILL.md",[],[]]