Repository navigation
Description
The README has no way for a reader to reach the community. Add the WeChat group QR code to it.
Source
The owner sends a phone photo of the group's QR code (screenshot/photo, IMG_2431.jpeg). The photo is not in the repository and not on the bot machine: the implementer must ask the owner for the file in the issue thread and attach it, or receive it in the PR.
What to do
- Crop the photo tight to the QR code: keep the whole code plus a small white quiet zone, cut the surrounding phone UI, chat header and any personal information (avatars, nicknames, message previews). Nothing outside the code may remain if it identifies a person.
- Re-encode, do not upscale a blurry crop: if the crop is soft, regenerate a clean image from the same WeChat invite instead of sharpening. The code must stay scannable by a normal phone at 100% zoom.
- Store it as a file in the repository, e.g.
docs/assets/wechat-group.png(PNG, at least 400x400 for the code area, sRGB, no metadata). Do not hotlink an external image host. - Add a short
## Communitysection toREADME.md, in English, with the image and alt text (WeChat group QR code for FlyBot), and one line saying what the group is for. Place it after## Contributing/before the license/notice section, not at the very top.
Acceptance
- The image in
README.mdrenders on GitHub and scans to the group invite. - No personal data from the source photo is in the cropped file or its metadata.
- The image file is committed in the repository, not linked from elsewhere.
README.mdstays valid, links still resolve, and the repo's docs/lint checks pass.
Caveat to decide in the PR
A WeChat group QR code expires (WeChat rotates it about every 7 days), so a committed image rots. Two ways to handle it: rotate the image when it expires (needs a reminder and a maintainer who can regenerate it), or keep the picture plus a line telling readers to ask for a fresh code if it has expired. Say which one the PR takes; do not leave a dead code with no note.
Activity
Birfy commentedon Oct 22, 2026
Written-by: Triage
Triage:
needs-info, notagent-ready. The photo is not reachable from a Bot, no Bot here can look at an image, and the expiry policy is a maintainer decision. Details below, plus three corrections to the spec that are worth making before anyone writes the PR.Not a duplicate: nothing else open mentions the README, a community section or WeChat.
#773/#774are the in-product room QR (6-digit code) and#742is the self-test catalog; this is separate.Corrections against
maind83d762ddocs/assets/. Every image lives indocs/images/(logo-wordmark.svg,demo-tree.gif,demo-social.gif,demo-face.gif,group.png,team.png). Usedocs/images/wechat-group.png; a new assets directory for one file splits where images live for no gain.README.mdhas no## Contributingheading. Its tail is## Built on→## More(that is whereCONTRIBUTING.mdis linked) →## License→## Disclaimer. The## Communitysection goes between## Moreand## License.AGENTS.md("Keep the README and README.zh.md in step when you change one of them") means the PR touches both files:## Communitybefore## License, and## 社区before## 许可与声明inREADME.zh.md. That Chinese file stays Chinese; the English-only rule covers the English README, issues, PR text and commits..pngor.jpg), and name it to match. With no image tooling on this machine (see below) a "conversion" would be a hand-rolled one, and that is exactly how a code stops scanning. For a PNG, droppingtEXt/eXIfchunks by hand is safe because they are separate chunks; for a JPEG, stripping EXIF means re-encoding, so a JPEG has to arrive clean from the owner.Why it cannot be picked up now
.jpg/.jpeg/.heic/.webptouched in the last two days and found none. A group-chat attachment cannot be fetched by a Bot. It has to arrive as a GitHub attachment on this issue (or a path on this machine).convert,magick,ffmpeg,identify,python3are all absent), the shipped packages have no image dependency (bothcore/package.jsonandplugins/social/package.jsondeclaredeps: {}), and this model declares no image input:read_imageon an existing repository PNG fails with model "DeepSeek-V4.1-Flash-1017" does not declare image input. So "no avatars, nicknames or previews left" and "still scans" cannot be checked by the implementer. They are the owner's check on the committed file, and the PR has to say so under## Not runinstead of claiming them.A better source makes the crop disappear
WeChat saves the group QR from the group's own settings ("save image") as a clean square code with a white quiet zone: no chat header, no avatars, no nicknames, no message preview. Ask for that saved image rather than a phone screenshot of the chat. If only the screenshot exists, the crop is a human step on the owner's side, not an agent step.
The expiry decision is the second blocker
A static committed code dies in about 7 days. My recommendation: keep the image and put one line under it saying the code expires and how to ask for a new one, and keep the source file in the repository so replacing it is a one-file change. Rotation needs a person who can regenerate it every 7 days plus a reminder, and this repository has exactly three timers (Release 02:00, SelfTest 09:00 and 21:00 Asia/Shanghai) that nobody may add to, so "rotate automatically" is not available. Say static + note and I write it into the acceptance.
What makes this
agent-ready(a T0 docs change, after both blockers clear):docs/images/wechat-group.png(or.jpg) committed as received and untouched;## Communityin both READMEs at the placement above, alt textWeChat group QR code for FlyBot, one line on what the group is for and the expiry line; relative path only, no external host;npm run verifyunaffected; the PR's## Not runnames the owner's phone-scan check.Birfy commentedon Oct 22, 2026
Written-by: Triage
Correction to my earlier comment: the photo is on this machine, and I was wrong to say it is not.
I searched for
*.jpg/*.jpeg/*.heic/*.webpby extension. DSH stores attachments by sha256 with no extension, at<DSH_HOME>/attachments/v1/objects/<hex[0:2]>/<hex[2:]>, so that search could never find it. What is actually there:bdc77c709327f813556c2c685d907f351f16a624da9173ed90a06c698b9082df→/data/dsh/attachments/v1/objects/bd/c77c709327f813556c2c685d907f351f16a624da9173ed90a06c698b9082df, a 213,569-byte JPEG, 1080x1596, no EXIF, written 14:13:04Z — the same object#779logged. I cannot confirm it is theIMG_2431.jpegyou meant, because I still cannot see it.What that changes: nobody has to re-upload anything for the bytes to exist; an implementer can copy or commit that file directly.
What it does not change: the crop and the scan still cannot be checked by a Bot here.
read_imagerefuses every file — that is#779, and it is the profile's job, not this repository's.convert,magick,ffmpeg,identify,python3are all absent, and both packages shipdeps: {}./data/uiprobe/browsers/chromium-1248/), but its Linux build has noBarcodeDetector('BarcodeDetector' in window === false), and there is no jsQR, zxing or any other decoder on disk. So "scans to the group invite" cannot be proven here by anything but a person's phone.So the two blockers from the triage comment stand, unchanged: (a) the clean QR image — still preferable from the group's own "save image" so no crop is needed, and (b) the expiry decision (my recommendation: static image plus a line telling readers to ask for a new one).
Birfy commentedon Oct 25, 2026
Written-by: Triage
needs-human. The material exists on the machine —/data/dsh/attachments/v1/objects/bd/c77c709327f813556c2c685d907f351f16a624da9173ed90a06c698b9082df, a 1080x1596 JPEG — so nobody needs to re-upload anything. What is missing is a person who can look at it:read_imagerefuses every file on this machine (#779); andconvert,magick,ffmpeg,identify,python3are all absent.Crop, personal-information removal and "is it still scannable at 100% zoom" are exactly the three checks a Bot here cannot perform, and a wrong community QR code in a public README is worse than none.
What unblocks it: the owner (or any host with vision) crops it tight and confirms it scans, then drops the PNG at
docs/assets/wechat-group.png. The## Communitysection of the README is a five-line docs change and can be done by a Bot the moment the file is committed — say the word and I will file that half asagent-readyso it is not waiting on the image.Birfy commentedon Oct 25, 2026
Partly blocked on the owner
The image is on this machine (
/data/dsh/attachments/v1/objects/bd/c77c…, 1080x1596 JPEG), but this host has no vision model and no image tooling, so it cannot crop it tightly, remove personal information, or confirm it still scans at 100% zoom.Two conditions before this becomes
agent-ready: the owner supplies a cropped image that scans at 100%, and the file lands in the README asset path. The five README lines are a 10-minute job after that.Birfy commentedon Oct 25, 2026
Written-by: Triage
Noted (owner, 2026-10-25): the picture is on this machine, so the only open item is a person cropping it and confirming it scans — this host has no vision model and no image tools.
The moment
docs/assets/wechat-group.pngexists and scans, ping me and the README half becomesagent-readyin the same round: a## Communitysection, the image with alt textWeChat group QR code for FlyBot, one line about what the group is, anddocs/as the only changed path.Birfy commentedon Nov 6, 2026
Written-by: Chief
可开发(2026-11-06 复核后放行)。原来卡在「这台机器没有视觉模型、没有图像工具」——那个前提不成立了,我实测了一遍。
现象与素材
/data/dsh/attachments/v1/objects/bd/bdc77c709327f813556c2c685d907f351f16a624da9173ed90a06c698b9082df(JPEG,1080×1596,213,569 字节;注意路径里是bd/目录 +bdc77…文件名,之前评论里写成bd/c77c…少了两个字符,按上面这条为准)。jpeg-js解码 +jsQR定位,整图能解出邀请链接:payload 以https://weixin.qq.com/g/AwYAADxvpVtVZlgH…开头,四个角点约 (144,543)-(938,1337),即码面 ~794×794 像素。也就是说不需要人眼定位,几何位置是算出来的。改动面
scripts/community-qr.mjs(放仓库根scripts/,与现有维护脚本同层):读源图 →jsQR取四个角点 → 按码面尺寸外扩 ≥20% 白边裁剪 → 写docs/assets/wechat-group.png(PNG,RGBA,sRGB;pngjs默认不写文本元数据,因此源照片的 EXIF/个人数据不会带过去)→ 打印 payload 与像素尺寸。依赖只进 devDependencies(jpeg-js、jsqr、pngjs),不碰运行时代码。README.md新增## Community小节,放在## Contributing之后、许可/声明之前:一行英文说明(FlyBot 的社区群)+。docs/assets/wechat-group.png(这是一次性产物,脚本留着供以后换码)。验收
node scripts/community-qr.mjs幂等:对源图运行后产出与仓库里的 PNG 逐字节相同(把 payload 与sha256打在输出里)。inversionAttempts、加轻微模糊/缩放,或换quirc/zxing系解码器),把结论和证据写进 PR;若换解码器仍解不出,就如实写「解码器验证未通过、需人扫一次」,不许写成通过。TZ=UTC npm run verify绿(文档改动,Docs-not-needed:不需要)。风险面
T0/T1:只加一个脚本、一个图片资产和 README 一节,不碰
core/运行时代码、不碰 CI 门禁。唯一风险是图片进仓库多一点体积(当前 827 KB 这一版可以压到 ≤300 KB)。Birfy commentedon Nov 6, 2026
Written-by: Dev 8e25
Claiming #775 — branch
dev/775-community-qr. First step: generatedocs/assets/wechat-group.pngfrom the source JPEG withscripts/community-qr.mjs, then the README section; no existing PR or branch for this issue.