concurrent-edit-attribution-check
Skill2 starsChanged 11 days agoMITView on GitHub
改无版本控制目录(如 ~/.qoder/skills、服务器配置目录)中的共享文件时,发现陌生 .bak、现役文件 md5 与自己刚备份内容不一致、疑似并行会话改了同一文件、或平台拦截 SKILL_HASH_CHANGED 时使用。配方:备份后 md5 三方比对判断改动归属,diff 定位对方改动行,全程定点替换不整文件覆盖,改完断言对方改动仍在;含备份保留策略误判与复验判据自洽两个坑。两套改动相撞把回归大面积判红时先二分 harness 漂移/产品缺陷,可协调的启动期校验一律 clamp 到语义安全值并暴露在健康端点,不做拒绝启动。触发词:大面积判红、拒绝启动、clamp、领地预检。
In this repository131 other files it gives its agents.
- agent-client-network-triageSkill
- architecture-designerSkill
- async-python-patternsSkill
- audit-ci-cost-leversSkill
- awesome-design-mdSkill
- byok-model-retrySkill
- cloudbase-wechat-integrationSkill
- continuation-state-auditSkill
- counterexample-driven-plan-reviewSkill
- deliver-prdSkill
- desktop-update-push-triageSkill
- diagnose-github-actions-quotaSkill
- diagnose-windows-webview2-blank-windowSkill
- disk-junction-migrationSkill
- distinctive-design-systemsSkill
- dsh-session-format-debugSkill
- electron-app-stuck-spinner-triageSkill
- electron-asar-code-forensicsSkill
- electron-tray-icon-diagnosisSkill
- encrypted-office-visual-inspectionSkill
- frontend-design-ui-uxSkill
- frontend-developmentSkill
- game-designer-toolkitSkill
- game-numeric-designSkill
- github-acceleratorSkill
- global-config-smoke-runnerSkill
- goal-driven-executionSkill
- hid-device-protocol-probeSkill
- i-have-adhdSkill
- injected-context-slimmingSkill
- java-architectSkill
- java-qualitySkill
- kafka-best-practicesSkill
- large-sqlite-text-extractionSkill
- local-api-contractsSkill
- local-browser-e2eSkill
- local-db-migrationsSkill
- local-frontend-a11ySkill
- local-performance-evidenceSkill
- local-reverse-proxy-triageSkill
- local-rust-engineeringSkill
- local-spring-mybatisSkill
- mechanize-rule-into-hook-guardSkill
- memory-bank-divergence-repairSkill
- memory-entry-updateSkill
- merge-inbound-qoder-packageSkill
- minigame-dev-proSkill
- miniprogram-developmentSkill
- mongodb-atlas-stream-processingSkill
- mongodb-connectionSkill
- mongodb-mcp-setupSkill
- mongodb-natural-language-queryingSkill
- mongodb-query-optimizerSkill
- mongodb-schema-designSkill
- mongodb-search-and-aiSkill
- mysqlSkill
- nextjs-app-router-patternsSkill
- nginx-config-builderSkill
- nodejs-backend-patternsSkill
- oauth-login-failure-triageSkill
- The first 60 shown.
The file
Files
并发编辑归属分辨(.bak 比对配方)
何时用
满足任一信号即适用,适用时必须先做归属分辨再动笔:
- 目录里出现不是自己创建的
.bak/ 临时副本文件 - 现役文件的 md5 与自己刚刚备份的内容不一致
- 平台拦截
SKILL_HASH_CHANGED(=写者身份在另一条会话) - 已知有多会话并行工作,且要改的文件可能被共享
git 仓库里的文件先跑 git status / git diff 比清单差异(见记忆「多会话并行归属」);本配方管无版本控制目录。
核心判据
三方 md5 比对:现役文件 / 自己刚备份的副本 / 目录里其他同名 .bak。
- 现役 ≠ 自己刚备份 ⇒ 有并发写者,走下方六步配方
- 现役 = 自己备份,但目录里多出陌生 .bak ⇒ 先过误判①再定归属
六步配方
- 备份:
node ~/.qoder/scripts/backup-file.js "<要改的文件>",记下备份文件名与时间。 - 三方比对:
md5sum现役、自己的备份、其他同名 .bak。现役 ≠ 自己备份 ⇒ 确认并发写入;不猜、不下"应该没事"的结论。 - 定位对方改动:
diff自己的备份 vs 现役,逐块列出对方改了哪些行;与自己计划的改动行比对重叠。 - 分支处置:
- 改动行重叠:停下,向用户汇报双方意图,等裁决;不擅自合并语义冲突。
- 不重叠:只用定点替换(Edit 精确 old/new 串,每次只替换自己的目标行);禁止 Write 整文件覆盖——整文件重写会静默抹掉对方改动。
- 断言对方改动仍在:改完读回文件,对对方改动的特征串做正则/子串断言(判据必须能失败);断言失败=自己改坏了对方内容,立即修复。
- 本方判据复验:按原验收判据复跑(扫描、退出码入判据),同时过误判②。
三个易误判(全部实证)
- 备份保留策略自动删旧快照 ≠ 并发写入:
backup-file.js按保留策略(同文件 ≤3 份、删 7 天前、至少留 1 份)会自己删旧 .bak。看到"少了一份 .bak"先核对删除是否与本次备份动作同时发生,别误判成有人动了历史快照。 - 复验判据要与自己新写的内容自洽:自己的改动本身可能命中自己的检测——例:把敏感串换成
192\.0\.2\.1这类"安全示例"后,敏感扫描的"0 命中"判据必然失效。判据要排除自己新写的行,或换用不受影响的判据,否则全绿也是假绿。 - 区块插入也可能毁周边:Edit 插入新块前记下插入点周边锚点行;改完校验周边结构完整(实证:插入第 7 条时覆盖了相邻小节标题行)。
写前领地预检(动手前先证明无人持有)
改 ~/.qoder 载体(技能 / rules / hooks / settings.json / 记忆)之前,先只读跑一遍:
- 重测前提数字:文件存在性、字节数 / 行数、载体总数、重叠或冲突计数(任务包里的前提可能已过期)。
- 看新近度:目标目录 mtime、附近是否刚出现
.bak或临时产物。 - 找并发会话:
mcp__builtin__list_chat_sessions里标题含同一载体名且runtimeState=running的会话。 - 判同源:两侧(
.qoder/.qoder-cn)是否 junction 到同一真源,避免改了一侧以为两侧都变。 - 取基线红:
rules-weekly-audit.js --no-fix、sync-global-config.sh --check、领域 collisions 脚本,记下既有红与新引入红。
命中并发写入或前提失效 ⇒ 本轮零写入,交付差集报告 + 待裁定项;不要换工具绕过。
两套改动相撞把回归打满红(先二分,再判可协调)
并行写者给共享脚本新增「启动期校验」,常把另一会话的回归套件大面积判红——先怀疑两套改动相撞,不要先怀疑网络或产品。
- 跑一遍把红项二分:harness 漂移(测试夹具与新增校验前提不匹配)还是产品缺陷。实证:27/28 红全部源于测试传的小
TIMEOUT_MS撞上对方新增的「EARLY_HEADERS_MS >= TIMEOUT_MS即拒绝启动」。 - 判定该校验是不是"可协调组合":像"提前响应阈值 ≥ 总超时"这类只是数值搭配不当的,一律自动收紧(clamp)到语义安全值,并把生效值暴露在本地健康端点(如
/_health增timeoutMs/earlyHeadersMs)让断言可核;确实无法协调的组合才 fail-closed 拒绝启动。- 反直觉处:把可调和小超时做成拒绝启动=自建全站断网。守护 / hook 式 fail-closed 的直觉会让人保留这种校验——先问一句"这个组合真的非法吗"。
- 补显式基准:harness 的基础 env 固定关闭可选特性,保证存量断言的语义与改动前一致;不补基准,"全绿"只说明夹具跟着新逻辑一起漂了。
- 加新用例覆盖被 clamp 的边界,断言 clamp 后的实际生效值,而不是断言"没报错"。
- 拿改前备份跑同一套做负对照:只允许新用例判红,存量用例必须绿;存量仍红说明改动动了常规路径,回到第 1 步重判归属。
平台信号
SKILL_HASH_CHANGED拦截 = 写者身份在另一条会话。如实停下,汇报卡在哪一步,不绕过、不换通道重写。- Edit/Write 被守卫拦截时按提示先预览,不换工具绕行。
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

