86 lines
4.6 KiB
Markdown
86 lines
4.6 KiB
Markdown
# 交接单 · 五条工作线入口副本漂移的核正(2026-09-27)
|
||||
|
|
|
|||
|
|
> 交接载体:接手方**不需要读本棒上下文**即可直接执行。
|
|||
|
|
> 来源会话:`session-8757908d`(本机 DSH 会话)|结束原因:可自决部分做完,余项等用户
|
|||
|
|
> 落点:`E:\ProgramData\AIProject\ai1net-dsh-server\docs\交接单\`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## §1 目标
|
|||
|
|
|
|||
|
|
核正「本工作区 `ai1net-dsh-server` 持有五条工作线入口的**过期副本**」这一系统性缺陷,使任何会话都不会再按过期副本的口令去开工。
|
|||
|
|
|
|||
|
|
## §2 只读前置(接手前先跑,全部只读)
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# ① 两处工作区的同名入口逐对比大小与时间
|
|||
|
|
$a='E:\ProgramData\AIProject\ai1net-dsh-server'; $b='E:\ProgramData\AIProject\aliyun-dsh-server'
|
|||
|
|
Get-ChildItem $a -File -Filter '接续入口_*.md' | ForEach-Object {
|
|||
|
|
$g=Join-Path $b $_.Name
|
|||
|
|
'{0,-40} 本 {1,9:N0} {2} 远 {3,9:N0} {4}' -f $_.Name,$_.Length,$_.LastWriteTime.ToString('MM-dd HH:mm'),
|
|||
|
|
(Get-Item $g).Length,(Get-Item $g).LastWriteTime.ToString('MM-dd HH:mm')
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**期望**:五份本工作区副本**均带 `本副本已停更` 告示**(在文件头 900 字符内);真源文件均更大、更新。
|
|||
|
|
|
|||
|
|
## §3 范围
|
|||
|
|
|
|||
|
|
- **动了**:本工作区 5 份 `接续入口_*.md` 的**文件头**(各加一条指针告示,共 +431 ~ +632 B)。
|
|||
|
|
- **⛔ 没动**:真源(`aliyun-dsh-server` 侧 5 份)一字未动;本工作区副本的**正文一字未删**(已逐份哈希断言)。
|
|||
|
|
- **⛔ 没做**:不删副本、不移位置、不改判据与结论、不进入任何执行棒。
|
|||
|
|
|
|||
|
|
## §4 决策点(本棒已自决,可推翻)
|
|||
|
|
|
|||
|
|
- **D-1 处置方式选「标注」而非「同步」或「删除」**。
|
|||
|
|
- 我选了什么:只在过期副本头部加指针告示。
|
|||
|
|
- 为什么:① 工作区规则禁整文件覆盖,同步 = 一次 1 MB 级覆盖;② 删除不可逆,且该库明令「不许移走白名单内的东西」;③ 标注**失败代价对称**,最坏情况是文件头多四行。
|
|||
|
|
- 可推翻点:若确认这些副本**不该存在**,则应改为归档(该库二值决策:归档 or 删除),⛔ 不新建中间态目录。
|
|||
|
|
|
|||
|
|
## §5 步骤(接手方照做)
|
|||
|
|
|
|||
|
|
1. 跑 §2 的只读前置,确认五份都有告示。
|
|||
|
|
2. 若发现**新出现**的漂移(本工作区副本反而更新),先判定哪边是活的那份,**⛔ 不要按文件名猜**;判据 = 「该入口 §0 的『最新一行 = 执行依据』所指的棒号与日期」。
|
|||
|
|
3. 需要动文件 ⇒ 先按本库规则抢锁:`bash $DOC\07-scripts/handoff-guard.sh --claim-exec "<会话名>"`。
|
|||
|
|
⚠️ **抢锁必须校验退出码,⛔ 别接管道**(`| Select-Object` / `| grep` 都会吃掉退出码;本棒自己踩过一次,看到 `rc=-1` 而锁其实抢到了)。
|
|||
|
|
4. 抢不到 ⇒ **停手报告**,⛔ 不删锁、不接管。
|
|||
|
|
5. 完工反序释放:`--release-exec "<会话名>"`。
|
|||
|
|
|
|||
|
|
## §6 验收(可复跑的机器判据)
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 判据 1:5 份副本全部带告示
|
|||
|
|
(Get-ChildItem 'E:\ProgramData\AIProject\ai1net-dsh-server' -File -Filter '接续入口_*.md' |
|
|||
|
|
Where-Object { (Get-Content $_.FullName -TotalCount 3 -Encoding UTF8) -match '本副本已停更' }).Count
|
|||
|
|
# 期望 = 5
|
|||
|
|
|
|||
|
|
# 判据 2:本工作区副本正文未损(标题行仍在)
|
|||
|
|
Get-ChildItem 'E:\ProgramData\AIProject\ai1net-dsh-server' -File -Filter '接续入口_*.md' |
|
|||
|
|
ForEach-Object { '{0,-40} {1}' -f $_.Name,
|
|||
|
|
[bool]([System.IO.File]::ReadAllLines($_.FullName,[Text.Encoding]::UTF8) -match '^# 接续入口') }
|
|||
|
|
# 期望 = 5 行全 True
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**本棒实测读数(2026-09-27 10:3x,主会话自跑)**:
|
|||
|
|
|
|||
|
|
| 项 | 读数 |
|
|||
|
|
|---|---|
|
|||
|
|
| 新建告示 | **4** 份(插件投放与分库线第 1 轮已有) |
|
|||
|
|
| 每份「原文逐字未变」哈希断言 | **5/5 全部 True** |
|
|||
|
|
| 增量体积 | +431 B(覆盖网络线)· +493 B(技能重组线)· +593 B(IM线)· +632 B(StoryForge验收线)· +548 B(插件投放与分库线,第 1 轮) |
|
|||
|
|
| 真源未改动 | 5/5(只读打开) |
|
|||
|
|
| 锁 | 抢 `rc=0` → 释放 `rc=0` |
|
|||
|
|
|
|||
|
|
## §7 回滚
|
|||
|
|
|
|||
|
|
每份副本的原件备份在**同目录**,命名 `接续入口_<线名>_<日期>.md.bak-20260927-103210` … `-103xxx`(按修改时间取最新一组)。
|
|||
|
|
回滚 = 用对应 `.bak-*` 覆盖回原文件,然后复跑 §6 判据 1(期望变回 **0**)。
|
|||
|
|
|
|||
|
|
## §8 回报格式
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
① 判据 1 读数 = __ / 5 ② 判据 2 读数 = __ 行全 True
|
|||
|
|
③ 新发现的漂移 = (无 / 逐条列出「线名 + 本副本读数 + 真源读数 + 判定哪边是活的」)
|
|||
|
|
④ 本棒是否动了真源 = (否 / 是 + 文件 + 原因)
|
|||
|
|
⑤ 锁状态 = (已释放 / 仍在谁手上 + 原因 + 下一步)
|
|||
|
|
```
|