diff --git a/CHANGELOG.md b/CHANGELOG.md index 34d5934..a54eb3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 开发快照 0.1.355(同号版本说明归属修正) + +### Docs + +- **修正 0.1.28 / `f33730ed…` 的说明归属**:该 merge 真实边界是第一父 `c1d49adb…` + → `f33730ed…`(135 文件 +14226/-42),内容为开发版本历史修复(精确 SHA 说明提取、 + commit-specific→archive→tag、TargetSHAs/sourceHead、开发快照工具),并集成更早的 QA + 运营查询/组织/质量统计分支;不再复用同号 `3e7fcce0…` 的“持久本地副本/5 分钟同步/ + AI Markdown 预览”正文,也不声称该 merge 新增本地副本或已部署/验收。 +- 另一条 0.1.28(`3e7fcce0…`)仍使用其自身提交说明;其余 269 回填与 82 篇旧说明未改。 +- 新增同号不同 SHA 选择回归;270 条第一父统计/block hash oracle 仍为 0 mismatch。 + ## 开发快照 0.1.354(历史说明 merge/rename 精确修订) ### Docs @@ -2271,20 +2283,20 @@ ## 开发快照 snapshot/v0.1.28 - 2026-10-18 目标提交:f33730ed7437536c3d1e01cc2f20231af076b531 -### Added - -- 问答运营新增持久本地副本,每 5 分钟后台同步并支持立即同步;列表、详情、检索、质量范围和使用统计改为读取本地数据库。 -- AI 答案详情提供安全 Markdown 预览与原文查看,支持表格、代码块和链接;不执行原始 HTML,外部图片默认不请求。 - ### Changed +- **Merge PR #8:开发版本历史修复(并集成更早的 QA 运营分支)** +第一父 `c1d49adb…` → 本合并 `f33730ed…`:135 个文件,+14226/-42;第二父 `74ba737b…`。 +本合并的版本历史变更:新增 `internal/governance/development_notes.go` 按精确提交 SHA +提取开发说明;`internal/versionhistory/rules.go` 按 commit-specific CHANGELOG → +exact-SHA archive → annotated snapshot tag 顺序取说明;`sync.go` 支持 TargetSHAs、 +includeDeliveredCommits 与 sourceHead 绑定;`scripts/development_snapshot.py` 提供开发 +快照计划/显式发布入口(不调用 publish)。 -- 增加治理侧问答副本表与同步状态;同步由普通 worker 执行,使用独立只读源连接,源失败保留最后成功副本,权限校验失败阻断读取。 -- 副本激活与质量输入变化的复核失效同事务提交;同步持久去重、租约校验及重启恢复不改变源问答或现有生产写入。 - -### Fixed - -- 本地读取不再逐条重复写质量留档或解压完整范围长答案来统计字段,保留完整列、输入版本一致性和真实缺失值。 -- 初次观察即已同步完成时自动重查列表,避免较早的首次未同步错误一直停留。 +同一第一父边界还集成了更早的 QA 运营查询/组织/质量统计分支: +`internal/qaopsorg`、`internal/qaopsquality`、`internal/httpapi/qa_monthly.go`、 +`web/src/QAOperations.tsx`、`web/src/QAQuality.tsx` 等。该部分是集成既有分支,不是本 +merge 新开发;不声称已部署或验收。 +统计:135 个文件,+14226/-42。 ## 开发快照 snapshot/v0.1.27 - 2026-10-18 diff --git a/internal/versionhistory/development_notes_history_test.go b/internal/versionhistory/development_notes_history_test.go index dcd5df4..7445006 100644 --- a/internal/versionhistory/development_notes_history_test.go +++ b/internal/versionhistory/development_notes_history_test.go @@ -80,3 +80,32 @@ func TestMergeNotesUseFirstParentFactsAndRenameStats(t *testing.T) { } } } + +func TestSameVersionDifferentSHAsKeepOwnNotes(t *testing.T) { + body, err := os.ReadFile("../../CHANGELOG.md") + if err != nil { + t.Fatal(err) + } + changelog := string(body) + f337 := "f33730ed7437536c3d1e01cc2f20231af076b531" + notes := governance.ExtractDevelopmentNotesForCommit(changelog, "0.1.28", f337) + for _, want := range []string{"开发版本历史", "第一父", "development_notes.go"} { + if !strings.Contains(notes, want) { + t.Fatalf("f337 notes missing real version-history scope %q: %q", want, notes) + } + } + for _, forbidden := range []string{"持久本地副本", "每 5 分钟", "安全 Markdown"} { + if strings.Contains(notes, forbidden) { + t.Fatalf("f337 notes still carry the other 0.1.28 commit's body %q: %q", forbidden, notes) + } + } + // Same version number, two target SHAs: exact-SHA selection must not cross. + dual := "## 开发快照 snapshot/v0.1.28 - 2026-10-18\n目标提交:" + f337 + "\n\n### Changed\n\n- 版本历史修复\n\n" + + "## 开发快照 snapshot/v0.1.28 - 2026-10-18\n目标提交:3e7fcce0b1b077dd6c44f2a4d535813232b941fb\n\n### Added\n\n- 持久本地问答副本\n" + if got := governance.ExtractDevelopmentNotesForCommit(dual, "0.1.28", f337); !strings.Contains(got, "版本历史修复") || strings.Contains(got, "持久本地") { + t.Fatalf("same-version f337 selected wrong block: %q", got) + } + if got := governance.ExtractDevelopmentNotesForCommit(dual, "0.1.28", "3e7fcce0b1b077dd6c44f2a4d535813232b941fb"); !strings.Contains(got, "持久本地") || strings.Contains(got, "版本历史修复") { + t.Fatalf("same-version 3e7 selected wrong block: %q", got) + } +}