docs(memory): 十一键措辞收口(seed* + snapshot*)
tempTtlSec 落地后,`memory-tidy.json` 的播种契约就是**十一键**,而三处文件的注释仍 写「十键」。这些是**过时的陈述**(不是风格问题):下一位读者会从「快照契约:十键非 nil」里读出一个错误的口径,而 `memoryTidySeedComplete` 实际校验的正是十一键。 改的只是措辞,一行逻辑没动: - internal/config/runtimeconfig/memorytidy_seed.go:25,160 - internal/config/runtimeconfig/memorytidy_seed_test.go:19,27,62,82,97,214 - internal/runtime/memory/tidy_snapshot_test.go:14,27,159 (`cmd/cyrene/wire_memory_tidy.go:65` 还有同类的一处「这十键」,该文件属 M3 的 scope,未动 —— 塔已转 M3。) 验收:go build ./... + go vet ./... + go test -count=1 ./... 全绿。
This commit is contained in:
1 parent
979d1cfbb2
commit
5daba92d0f
3 files changed
+10
-10
No files matched your search
@@ -22,7 +22,7 @@
|
|||||||
// 残缺);调用方记一条 WARN 即可 —— 播种失败时运行期仍按 `.env` + 代码默认跑,
|
// 残缺);调用方记一条 WARN 即可 —— 播种失败时运行期仍按 `.env` + 代码默认跑,
|
||||||
// 行为与播种前逐字相同。
|
// 行为与播种前逐字相同。
|
||||||
//
|
//
|
||||||
// 日志**只打路径、原因与键名,不打值**:这十键今天都不是凭据,但「配置日志不打值」
|
// 日志**只打路径、原因与键名,不打值**:这十一键今天都不是凭据,但「配置日志不打值」
|
||||||
// 是本仓既有口径(materialize.go 的「绝不打 apiKey」),这里从一开始就照做,免得
|
// 是本仓既有口径(materialize.go 的「绝不打 apiKey」),这里从一开始就照做,免得
|
||||||
// 日后加一个敏感键时要回头改日志。
|
// 日后加一个敏感键时要回头改日志。
|
||||||
package runtimeconfig
|
package runtimeconfig
|
||||||
@@ -157,7 +157,7 @@ func writeMemoryTidySeed(log *slog.Logger, path string, seed MemoryTidyTuning, r
|
|||||||
return MemoryTidySeed{Written: true}, nil
|
return MemoryTidySeed{Written: true}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// memoryTidySeedComplete 报告种子是否「十键齐全且值可用」。
|
// memoryTidySeedComplete 报告种子是否「十一键齐全且值可用」。
|
||||||
//
|
//
|
||||||
// 为什么要「齐全」而不是「非 nil 就放行」:MemoryTidyTuning 的指针语义是「nil = 没配」,
|
// 为什么要「齐全」而不是「非 nil 就放行」:MemoryTidyTuning 的指针语义是「nil = 没配」,
|
||||||
// 一份缺键的种子写下去虽然与「不写」在读取端等价,但它会让文件里出现 null —— 这份文件
|
// 一份缺键的种子写下去虽然与「不写」在读取端等价,但它会让文件里出现 null —— 这份文件
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import (
|
|||||||
// 本文件锁定**启动播种**(memorytidy_seed.go;主人 2026-10-07:「**`.env` 只做兜底
|
// 本文件锁定**启动播种**(memorytidy_seed.go;主人 2026-10-07:「**`.env` 只做兜底
|
||||||
// 用** …… 后端**自动创建**独立的面板配置文件」)的四条纪律:
|
// 用** …… 后端**自动创建**独立的面板配置文件」)的四条纪律:
|
||||||
//
|
//
|
||||||
// ① 文件不存在 ⇒ 按调用方给的「当前生效值」播种(**十键齐全**,不是只播老六键);
|
// ① 文件不存在 ⇒ 按调用方给的「当前生效值」播种(**十一键齐全**,不是只播老六键);
|
||||||
// ② 文件已存在 ⇒ **一个字节都不动**(也不留 `.tmp`);
|
// ② 文件已存在 ⇒ **一个字节都不动**(也不留 `.tmp`);
|
||||||
// ③ 文件损坏 ⇒ **不写盘**(WARN + 按 `.env` 跑),绝不「修好它」;
|
// ③ 文件损坏 ⇒ **不写盘**(WARN + 按 `.env` 跑),绝不「修好它」;
|
||||||
// ④ 幂等:连跑两次只在第一次写盘。
|
// ④ 幂等:连跑两次只在第一次写盘。
|
||||||
@@ -59,7 +59,7 @@ func seedPath(t *testing.T) string {
|
|||||||
return filepath.Join(t.TempDir(), "config", memoryTidyFileName)
|
return filepath.Join(t.TempDir(), "config", memoryTidyFileName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// decodeSeed 把盘上的文件解成键集合,供「十键齐全」的断言(比结构体更贴近主人看到
|
// decodeSeed 把盘上的文件解成键集合,供「十一键齐全」的断言(比结构体更贴近主人看到
|
||||||
// 的那份文件)。
|
// 的那份文件)。
|
||||||
func decodeSeed(t *testing.T, path string) map[string]json.RawMessage {
|
func decodeSeed(t *testing.T, path string) map[string]json.RawMessage {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
@@ -79,7 +79,7 @@ func assertNoTempLeft(t *testing.T, path string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TestSeedMemoryTidy_SeedsMissingFile 是本任务的主用例:文件不存在 ⇒ 播种,且**内容
|
// TestSeedMemoryTidy_SeedsMissingFile 是本任务的主用例:文件不存在 ⇒ 播种,且**内容
|
||||||
// 就是调用方给的快照**(十键齐全、含四项频率键),目录也一并建出来。
|
// 就是调用方给的快照**(十一键齐全、含四项频率键),目录也一并建出来。
|
||||||
func TestSeedMemoryTidy_SeedsMissingFile(t *testing.T) {
|
func TestSeedMemoryTidy_SeedsMissingFile(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
path := seedPath(t) // 连 config/ 目录都不存在
|
path := seedPath(t) // 连 config/ 目录都不存在
|
||||||
@@ -94,7 +94,7 @@ func TestSeedMemoryTidy_SeedsMissingFile(t *testing.T) {
|
|||||||
}
|
}
|
||||||
assertNoTempLeft(t, path)
|
assertNoTempLeft(t, path)
|
||||||
|
|
||||||
// 十键齐全(含新增的四项频率键)——「别只播老六键」的断言就在这里。
|
// 十一键齐全(含新增的四项频率键)——「别只播老六键」的断言就在这里。
|
||||||
keys := decodeSeed(t, path)
|
keys := decodeSeed(t, path)
|
||||||
for _, key := range memoryTidySeedKeys {
|
for _, key := range memoryTidySeedKeys {
|
||||||
if _, ok := keys[key]; !ok {
|
if _, ok := keys[key]; !ok {
|
||||||
@@ -211,7 +211,7 @@ func TestSeedMemoryTidy_SeedsBlankFile(t *testing.T) {
|
|||||||
t.Fatalf("结果 = %+v, want 按「还没配过」播种", res)
|
t.Fatalf("结果 = %+v, want 按「还没配过」播种", res)
|
||||||
}
|
}
|
||||||
if len(decodeSeed(t, path)) != len(memoryTidySeedKeys) {
|
if len(decodeSeed(t, path)) != len(memoryTidySeedKeys) {
|
||||||
t.Fatalf("空白文件被播种后应当十键齐全:%s", readRaw(t, path))
|
t.Fatalf("空白文件被播种后应当十一键齐全:%s", readRaw(t, path))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import (
|
|||||||
// 本文件锁定**启动播种的值来源**(tidy_snapshot.go;主人 2026-10-07:「`.env` 只做
|
// 本文件锁定**启动播种的值来源**(tidy_snapshot.go;主人 2026-10-07:「`.env` 只做
|
||||||
// 兜底用 —— 后端**自动创建**独立的面板配置文件**要做**」):
|
// 兜底用 —— 后端**自动创建**独立的面板配置文件**要做**」):
|
||||||
//
|
//
|
||||||
// ① 快照十键齐全、值可用(否则 runtimeconfig.SeedMemoryTidy 会拒绝落盘);
|
// ① 快照十一键齐全、值可用(否则 runtimeconfig.SeedMemoryTidy 会拒绝落盘);
|
||||||
// ② 值取「**当时解析出来的生效值**」—— `.env` 给了就用 `.env`,没给就用代码默认
|
// ② 值取「**当时解析出来的生效值**」—— `.env` 给了就用 `.env`,没给就用代码默认
|
||||||
// (默认值来自 normalizeTidyConfig / normalizeReviewConfig,不另写一份);
|
// (默认值来自 normalizeTidyConfig / normalizeReviewConfig,不另写一份);
|
||||||
// ③ 最关键的一条:把快照当成面板值叠回去,**归一化结果与「没有面板文件」逐字相同**
|
// ③ 最关键的一条:把快照当成面板值叠回去,**归一化结果与「没有面板文件」逐字相同**
|
||||||
@@ -24,7 +24,7 @@ func snapBoolPtr(v bool) *bool { return &v }
|
|||||||
|
|
||||||
func snapIntPtr(v int) *int { return &v }
|
func snapIntPtr(v int) *int { return &v }
|
||||||
|
|
||||||
// TestTidyTuningSnapshot_CodeDefaults 钉住「什么都没配」时的十键 = 归一化的代码默认值。
|
// TestTidyTuningSnapshot_CodeDefaults 钉住「什么都没配」时的十一键 = 归一化的代码默认值。
|
||||||
// 期望值直接取自默认值常量(本包唯一那处定义),因此这条用例证明的是**接线**:
|
// 期望值直接取自默认值常量(本包唯一那处定义),因此这条用例证明的是**接线**:
|
||||||
// 快照确实走了 normalizeTidyConfig / normalizeReviewConfig,而不是另写一份默认值。
|
// 快照确实走了 normalizeTidyConfig / normalizeReviewConfig,而不是另写一份默认值。
|
||||||
func TestTidyTuningSnapshot_CodeDefaults(t *testing.T) {
|
func TestTidyTuningSnapshot_CodeDefaults(t *testing.T) {
|
||||||
@@ -156,7 +156,7 @@ func TestTidyTuningSnapshot_PanelRoundTripKeepsEffectiveConfig(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestTidyTuningSnapshot_IsCompleteAndPositive 钉住快照契约:十键非 nil、数值键为正、
|
// TestTidyTuningSnapshot_IsCompleteAndPositive 钉住快照契约:十一键非 nil、数值键为正、
|
||||||
// 钟点在 0..23。runtimeconfig.SeedMemoryTidy 会按这条契约拒收残缺种子,因此这里先
|
// 钟点在 0..23。runtimeconfig.SeedMemoryTidy 会按这条契约拒收残缺种子,因此这里先
|
||||||
// 在**产生方**把它钉住,免得「播种写不出去」要到启动日志里才发现。
|
// 在**产生方**把它钉住,免得「播种写不出去」要到启动日志里才发现。
|
||||||
func TestTidyTuningSnapshot_IsCompleteAndPositive(t *testing.T) {
|
func TestTidyTuningSnapshot_IsCompleteAndPositive(t *testing.T) {
|
||||||
|
|||||||
Reference in new issue
Block a user