feat(backthink): 自排 C1-2 本体 + TriggerUnknown 修 fail-open(V1)
- selfwake.go:WakeNow + 待跑槽容量 1(先探槽合并不过闸、槽空才过闸、同锁)+ 闸 4 轮/小时
($DATA_DIR/config/backthink.json,零新 env 键)+ 审计四条 what + 启动日志两键 + 组合根接线
- G-A(主人已批):TriggerUnknown 作零值、既有两值编号后移(语义不动),未知触发走**最紧分支**
- 5 个变异自检(拆闸/≤0 未回落/过闸挪到探槽前=G1 失效形态/槽无界/零值挪走)
⚠️ 服务侧已就绪但**她仍调不到**(自排工具面属 C1-3)⇒ 不得写「C 已完成」
This commit is contained in:
1 parent
301f8b4276
commit
ed5005307a
12 files changed
+1193
-8
No files matched your search
@@ -37,6 +37,11 @@ const (
|
||||
// defaultThinkTimeout 约束单次无人值守思考,因此它绝不会
|
||||
// 卡住 worker goroutine。
|
||||
defaultThinkTimeout = 30 * time.Second
|
||||
// defaultSelfWakeLimit / defaultSelfWakeWindow 是她**自排**一轮思考的上限:
|
||||
// 默认每窗口 4 轮、窗口 1 小时(design/12 §N C.5)。它是**成本闸**,
|
||||
// 与推送频次是两件事 —— PushGate 管「能不能打扰主人」,管不了 LLM 花费。
|
||||
defaultSelfWakeLimit = 4
|
||||
defaultSelfWakeWindow = time.Hour
|
||||
// defaultSessionID 在调用方未提供时限定一次思考的作用域。它是
|
||||
// loop.Run 的持久化键,刻意与 history.MainSessionID 不同,
|
||||
// 这样自主思考绝不会与活跃主会话的检查点
|
||||
@@ -89,12 +94,24 @@ type Config struct {
|
||||
KindWindow time.Duration
|
||||
// ThinkTimeout 约束单轮思考。为零用默认值。
|
||||
ThinkTimeout time.Duration
|
||||
// SelfWakeLimit 限制 SelfWakeWindow 内她自己排起的思考轮数
|
||||
// (design/12 §N C.5)。**≤0 ⇒ 回落默认**:没有「关闭上限」语义——
|
||||
// 一次笔误不许把成本保护关掉(与 channelbridge 的 directLimit 同一裁决口径)。
|
||||
// 它的取值来自 `$DATA_DIR/config/backthink.json`(零新 env 键,`.env` 冻结),
|
||||
// 缺失/为零时由 normalize 填默认。
|
||||
SelfWakeLimit int
|
||||
// SelfWakeWindow 是执行 SelfWakeLimit 的滑动窗口。**≤0 ⇒ 回落默认**。
|
||||
SelfWakeWindow time.Duration
|
||||
}
|
||||
|
||||
// ConfigFromBackground 把 config.BackgroundConfig(心跳周期、
|
||||
// 共享安静时段窗口与主动推送频次旋钮的来源)
|
||||
// 映射成 backthink.Config,env 未暴露的项保持其
|
||||
// 默认值,交给 normalize 填。
|
||||
//
|
||||
// 它**刻意不带**自排上限两个旋钮(design/12 §N C.5,2026-10-06 `.env` 冻结红线):
|
||||
// 自排的成本旋钮走 `$DATA_DIR/config/backthink.json`,进 `.env` 就是给冻结面开新键。
|
||||
// 组合根读到配置文件后直接赋在返回的 Config 上。
|
||||
func ConfigFromBackground(bg config.BackgroundConfig) Config {
|
||||
return Config{
|
||||
IntervalSec: bg.IntervalSec,
|
||||
@@ -145,6 +162,17 @@ func normalize(cfg Config) Config {
|
||||
if cfg.ThinkTimeout <= 0 {
|
||||
cfg.ThinkTimeout = defaultThinkTimeout
|
||||
}
|
||||
// 自排闸的旋钮与 PushLimit 同形:**≤0 一律回落默认**。这不是可有可无的填充——
|
||||
// session.RateLimiter 在 limit<=0 || window<=0 时 Allow() 恒 true 且一条事件都不记录
|
||||
// (它自称是「无规则」的安全默认),若把未 normalize 的 ≤0 直达滑窗,
|
||||
// 「回落默认」就**静默**变成「无上限」(无报错、无 WARN)。闸必须在构造前就
|
||||
// 拿到已回落的值(design/12 §N C.5 的 G3;探针 = C.8 判据 14)。
|
||||
if cfg.SelfWakeLimit <= 0 {
|
||||
cfg.SelfWakeLimit = defaultSelfWakeLimit
|
||||
}
|
||||
if cfg.SelfWakeWindow <= 0 {
|
||||
cfg.SelfWakeWindow = defaultSelfWakeWindow
|
||||
}
|
||||
return cfg
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user