本文へ移動
cccskills
無料GitHub で公開

photo-caption-writer

当使用者说"给这张照片写图注"、"帮我写一段作品说明"、"这张照片配一句什么文字"、"展览标签怎么写"时使用。

Write a factual short photo caption or a longer artist statement from photographer-provided context and optional EXIF metadata. Use when a user asks for a caption, wall label, portfolio note, or brief statement for an existing photograph. Do not infer emotions, intent, place, identity, or circumstances from the image alone.

インストール方法を見る

含まれるファイル(3)

  • SKILL.md7.5 KB
  • scripts/extract_exif.py8.8 KB
  • scripts/image_io.py32.9 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Photo Caption Writer

Write concise, usable copy without turning guesses about a photograph into facts.

Inputs

Collect only what the requested output needs:

  • the photograph, or a description of it;
  • output mode: short or long;
  • destination or audience, if relevant;
  • facts the photographer confirms: time, place, subject, event, process, or circumstances;
  • the photographer's own intent, memory, or interpretation;
  • optional EXIF metadata.

Do not block on missing optional inputs. If the user asks for a factual detail that is absent, ask for it or omit it. Never fill the gap by guessing from pixels, filenames, or nearby context.

Workflow

  1. Separate the evidence. Make three private working lists:

    • confirmed: explicitly supplied by the photographer or extracted from metadata;
    • attributed: interpretations or intentions stated by the photographer;
    • unknown: anything merely inferred from the image.
  2. Extract metadata when useful. If a local image is available and the runtime can execute Python, run:

    python3 scripts/extract_exif.py IMAGE
    

    The script requires Pillow. It reads IFD0 and the Exif sub-IFD, where cameras store aperture, shutter, ISO, focal length, lens, and capture time, and prints source_file, captured_at, camera_make, camera_model, camera (maker not repeated), lens, exposure_time, aperture, iso, focal_length_mm, focal_length_35mm, and exposure_compensation_ev. captured_at comes from DateTimeOriginal only; a file that carries only IFD0 DateTime (its last edit or export time) gets null, so never present a file date as the capture time. GPS is never printed. Treat null fields as unavailable; do not mention them. If the script cannot run, use only metadata the user provides.

    HEIC/HEIF files (the iPhone default) need the pillow-heif package, or a JPEG copy first: sips -s format jpeg IMG.HEIC --out IMG.jpg (macOS; keeps the EXIF). The script exits 1 and prints that command instead of guessing.

    scripts/image_io.py is a shared copy of the photo skills' image module; identical copies live in photo-exif-frame, shoot-outing-review-card, photo-series-layout, and photo-spread-composer, and scripts/validate.sh requires them to stay byte-identical, so never edit one copy alone. fontTools is optional and only used by the rendering skills to check glyphs. python3 scripts/extract_exif.py --selftest runs the regression checks.

  3. Choose the mode.

    • short: one sentence, normally 15–35 words. State only useful context; include camera settings only when requested or editorially relevant.
    • long: one restrained paragraph, normally 70–150 words. Connect confirmed context, the photographer's attributed intent, and relevant process details.
  4. Draft in the user's language and requested voice. Prefer concrete nouns and verbs. Preserve uncertainty with wording such as “the photographer recalls” or “appears” only when uncertainty itself is useful and clearly marked.

  5. Run the honesty check. For every claim, identify its source. Remove or qualify any claim supported only by visual inference.

  6. Return clean copy. Give the finished caption first. Add a brief 待确认 list only when unresolved facts materially affect publication.

Source and attribution rules

  • EXIF supports capture settings and recorded timestamps; it does not establish creative intent.
  • A user-provided account supports that person's stated memory or intention, not an objective claim about every viewer's experience.
  • Visible content can support neutral description, but not hidden identity, exact location, relationship, emotion, symbolism, or cause.
  • Do not identify people, private places, medical conditions, political affiliation, or other sensitive traits from appearance.
  • Do not claim that a photograph “expresses,” “captures,” or “symbolizes” an idea unless the photographer supplied that interpretation. Attribute it when appropriate.
  • Preserve the distinction between capture time and file creation or modification time.
  • Do not expose GPS or other sensitive metadata unless the user explicitly asks and understands the publication context.

Output patterns

Short

[Publication-ready caption]

待确认(only if needed):
- [missing fact that materially changes the caption]

Long

[Publication-ready paragraph based on confirmed context and attributed intent]

待确认(only if needed):
- [missing fact that materially changes the statement]

Do not append an EXIF dump unless requested.

Quality checklist

  • The requested mode and approximate length are respected.
  • Every factual claim is confirmed, extracted, or visibly qualified.
  • Creative intent is supplied by or attributed to the photographer.
  • Missing EXIF fields were omitted rather than invented.
  • Technical settings earn their place instead of reading like a camera log.
  • No sensitive metadata or inferred sensitive trait is exposed.
  • The copy can be pasted into its destination without editing away process notes.

Tests

  1. Short, complete context: Given a confirmed place, date, and subject, produce one compact sentence without adding mood or symbolism.
  2. Long, photographer-supplied intent: Turn supplied facts and a first-person explanation into a restrained paragraph; do not strengthen the explanation into an objective truth.
  3. Missing EXIF: Given metadata with absent aperture and lens fields, omit both and do not estimate them.
  4. Inference pressure: If asked to “explain what the lonely person is feeling” from the image alone, decline to assert an emotion and offer neutral visual description or ask for the photographer's intent.
  5. Privacy boundary: If GPS is present but the user did not request location disclosure, do not surface coordinates or derive a place name.
  6. Camera JPEG: For a camera file whose exposure fields sit in the Exif sub-IFD (tests/fixtures/photo-caption-writer/camera-subifd.jpg), every field of extract_exif.py is non-null and the file's GPS is not printed.
  7. Export time only: For a file with only IFD0 DateTime (export-datetime-only.jpg), captured_at is null; state no capture date and ask for one if the caption needs it.
  8. HEIC: For IMG_0001.heic, the script exits 1 with the sips command; convert or ask, never guess the settings.

Full cases: tests/cases/photo-caption-writer.md.

变更记录 / Changelog

版本日期变更类型
0.1.12026-09-26extract_exif.py 改用共享的 image_io.py 读 Exif 子 IFD,相机 JPEG 的光圈、快门、ISO、焦距、镜头、拍摄时间不再全是 null;拍摄时间只取 DateTimeOriginal;新增 camera、focal_length_35mm 两个键和 --selftest;写明 HEIC 先用 sips 转 JPEG;description 前加中文触发语;示例命令改用 python3patch
0.1.02026-09-09初始版本minor

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

当学生说"Common App 活动栏写不下"、"这段活动描述超字数了"、"帮我把这几条压到限制内"时使用。先按官方申请表核对当季字符限额,再逐条检查;一次把所有条目量完并直接给出压缩版,只在需要砍掉实质内容时才用选择题问该保哪部分。每改一版都用工具重新数一遍字符,绝不凭感觉说"这样应该够了"。只压缩,不代写空白。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

当学生说"我参加过一些活动但没整理过"、"帮我把经历录进去"、"我的活动档案是空的"时使用。让学生一口气把记得的活动说出来,直接把这段话拆成结构化的长期事项(角色、组织、起止时间、做了什么、结果、级别),说不清的字段留空标"待补"而不是编,再用一张选择题卡把级别判定与是否重复这类关键项一次问完,然后提案入库。只记录学生真正说出口的内容,级别按事实判定,绝不往高了写。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

当学生问"招生官会怎么看我的档案"、"我的背景还差什么"、"帮我评估一下现在的申请竞争力"时使用。以顶尖大学招生官的视角通读学生的档案、长期活动与已写下的反思,不问任何前置问题直接产出一份指名道姓的坦诚点评:这份材料的亮点、招生官真实的解读方式、明显的短板与空白、以及接下来最值得做的一到两件事。只读不写,不修改学生的任何数据,也不代写任何申请材料。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

当使用者说"帮我填词"、"按这个字数模板写歌词"、"用多Agent对抗式写词"、"这首副歌帮我想几句"时使用,前提是字数骨架和这首歌写什么都已经有了;只有主题、还没定写什么时先用 lyric-concept-builder。拿一份字数骨架和意象系统,派三个 sonnet 子代理按不同路子并行独立起草(场景派 / 口语派 / 意象派),再派一个红队子代理逐句挑毛病,主 Agent 按句裁决拼稿,最后统一辙口与意象。收敛判据卡死:字数用 lyric-doctor 的脚本对模板数、每段同辙、hook 不含陈词、主歌二对主歌一有推进。不抄现有歌词,不替使用者决定这首歌要说什么。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

当想知道一段 AI 回答"哪些能直接用、哪些必须先验证、哪些只能当建议"时使用。按声明类型分四级——低风险草稿材料、观点与策略建议、可查证的事实声明、会改变状态的可执行指令——每级配一句默认处置动作;再按影响半径排序,给出最小的下一步检查。可执行类一律标"不能直接执行;先做代码审阅/沙箱测试/回滚准备",其中破坏性或提权的命令排在最前。教的是一套可复用的复查习惯,不是替使用者把所有内容都核实一遍:本 skill 只分级、排序、定处置,要逐条核实走 ai-output-fact-checker,整段代码要做入库体检走 ai-code-onboarding-checklist。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

当拿到一段 AI 生成的代码,还没决定要不要信、要不要跑、要不要往上继续加东西时使用。先做一遍客观体检:行数与嵌套深度、有没有测试、有没有硬编码密钥或遗留 TODO、依赖是不是真实存在、有没有危险调用(eval/exec、shell=True、递归删除、反序列化、提权、外发网络,按正文给的 grep 模式逐类查);再给风险评级和下一步动作。老实写明它查不了算法正确性——体检通过不等于代码是对的。回答里文字、事实和代码混在一起时先用 ai-answer-triage 分级;只审相对已有代码的一份改动用 ai-diff-review-protocol。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

ChromiteCr のスキルをすべて見る

このスキルの問題を報告する