fix(session-mechanism): 看板标「状态未收口」+ 决策判据补两处口径 + 换目标留验收痕迹

- 项目看板:非「已完成」的目标,若一条验收判据都没有、或有判据但一条都没过,
  卡片上标「无验收判据/验收未收口(N 条全未过)」—— 实测 aigc-idea-impression
  的归档件曾在「执行中」列摆了 7 天(2026-10-18 核查)
- 决策判据每轮注入:写明那份技术实现清单是举例不是穷举、「功能语义分叉」的判据
  收窄为「用户日常操作路径有没有变」(2026-10-18 实测滥用后果:把两件技术实现
  做成了待拍板)
- goalctl 换目标归档:顺手判一次旧目标验收有没有收口,没收口写进归档件 `_验收未收口`
  并在 lifecycle_why 留痕(不拦换目标)
This commit is contained in:
admin committed 2026-10-18 20:17:49 +08:00
1 parent 879156f75c
commit cc86680e05
4 files changed
+33 -3

No files matched your search

+13
View File
@@ -745,6 +745,19 @@ def declare() -> int:
"它不再被推进,归档件可回查" % (_old_raw or "未声明"))
print(" 🔴 旧目标已收尾:`lifecycle` %s ⇒ 已暂停(不再推进,看板归「待执行」)"
% (_old_raw or "(未声明)"))
# 🔴 2026-10-18 加(看板核查实测:aigc 那张归档件在「执行中」摆了 7 天):
# 换目标时**顺手判一次旧目标的验收有没有收口**,没收口就在归档件上留痕。
# ⛔ 不拦换目标(用户急事优先);只让「没被判过的目标」在数据里自己说出来。
_oa = {k: v for k, v in (g.get("acceptance_state") or {}).items()
if not str(k).startswith("_")}
if not _oa:
g["_验收未收口"] = "归档时一条验收判据都没有(目标从没被判过)"
elif not any(_acc_is_pass(v) for v in _oa.values()):
g["_验收未收口"] = ("归档时 %d 条验收全未过(目标从没被判过)" % len(_oa))
if g.get("_验收未收口"):
g["lifecycle_why"] = "%s;%s" % (g["lifecycle_why"], g["_验收未收口"])
print(" ⚠️ 旧目标验收未收口:%s(已写进归档件 `_验收未收口`,看板会标出来)"
% g["_验收未收口"])
_safe = re.sub(r'[\\/:*?"<>|\r\n\t]+', "-", old_title).strip()[:40] or "untitled"
_dst = GOALS_DIR / ("%s__%s.json" % (_safe, time.strftime("%Y%m%d-%H%M")))
_n = 1