fix(session-mechanism): 看板标「状态未收口」+ 决策判据补两处口径 + 换目标留验收痕迹
- 项目看板:非「已完成」的目标,若一条验收判据都没有、或有判据但一条都没过, 卡片上标「无验收判据/验收未收口(N 条全未过)」—— 实测 aigc-idea-impression 的归档件曾在「执行中」列摆了 7 天(2026-10-18 核查) - 决策判据每轮注入:写明那份技术实现清单是举例不是穷举、「功能语义分叉」的判据 收窄为「用户日常操作路径有没有变」(2026-10-18 实测滥用后果:把两件技术实现 做成了待拍板) - goalctl 换目标归档:顺手判一次旧目标验收有没有收口,没收口写进归档件 `_验收未收口` 并在 lifecycle_why 留痕(不拦换目标)
This commit is contained in:
1 parent
879156f75c
commit
cc86680e05
4 files changed
+33
-3
No files matched your search
@@ -475,6 +475,8 @@ function _cardHtml(t){
|
|||||||
: '';
|
: '';
|
||||||
var badges = '<span class="badge">'+esc(t.life||"")+'</span>';
|
var badges = '<span class="badge">'+esc(t.life||"")+'</span>';
|
||||||
if(t.current) badges += '<span class="badge cur">当前</span>';
|
if(t.current) badges += '<span class="badge cur">当前</span>';
|
||||||
|
// 🔴 2026-10-18:目标「状态未收口」明说(后端判据:非已完成 且 无判据/判据全未过)
|
||||||
|
if(t.warn) badges += '<span class="badge miss" title="'+esc(t.warn)+'">'+esc(t.warn)+'</span>';
|
||||||
// 🔴🔴 「最后状态时间」(2026-10-11 用户:「所有目标项目都需要 加上时间(最后状态的时间)」)。
|
// 🔴🔴 「最后状态时间」(2026-10-11 用户:「所有目标项目都需要 加上时间(最后状态的时间)」)。
|
||||||
// 取 `cards[].life_at`(目标自己的 `lifecycle_at`)——⛔ **不是 `declared_at`**(那是登记时间,
|
// 取 `cards[].life_at`(目标自己的 `lifecycle_at`)——⛔ **不是 `declared_at`**(那是登记时间,
|
||||||
// 两者实测能差好几天:`contentm_agent` 一张卡 登记 10-10 22:24 / 状态 10-10 09:35)。
|
// 两者实测能差好几天:`contentm_agent` 一张卡 登记 10-10 22:24 / 状态 10-10 09:35)。
|
||||||
|
|||||||
@@ -418,6 +418,18 @@ def build_project(ws: Path) -> dict:
|
|||||||
g_eff = [k for k in g_acc if not str(k).startswith("_")]
|
g_eff = [k for k in g_acc if not str(k).startswith("_")]
|
||||||
g_items = [{"k": k, "v": str(g_acc[k]), "pass": _acc_is_pass(g_acc[k])}
|
g_items = [{"k": k, "v": str(g_acc[k]), "pass": _acc_is_pass(g_acc[k])}
|
||||||
for k in g_eff]
|
for k in g_eff]
|
||||||
|
# 🔴 2026-10-18 加「状态未收口」标记(用户令「该处理的都处理」,源自 10-18 看板核查):
|
||||||
|
# 非「已完成」的目标,若**一条验收判据都没有**、或**有判据但一条都没过**,
|
||||||
|
# 说明它没被任何检查会话判过 —— 实测 `aigc-idea-impression` 的归档件就是这样
|
||||||
|
# 在「执行中」列摆了 7 天。⇒ 卡片上明说,⛔ 不静默当活卡。
|
||||||
|
_warn = ""
|
||||||
|
if not life.startswith("已完成"):
|
||||||
|
_n_acc = len(g_eff)
|
||||||
|
_p_acc = sum(1 for i in g_items if i["pass"])
|
||||||
|
if _n_acc == 0:
|
||||||
|
_warn = "无验收判据"
|
||||||
|
elif _p_acc == 0:
|
||||||
|
_warn = "验收未收口(%d 条全未过)" % _n_acc
|
||||||
cards.append({
|
cards.append({
|
||||||
# 目标短 id + 来源后缀(防同 `short` 的多个目标 id 撞车,跳详情要用)
|
# 目标短 id + 来源后缀(防同 `short` 的多个目标 id 撞车,跳详情要用)
|
||||||
"id": (g_short or ws.name) + ("@cur" if src == "cur" else "@%s" % src),
|
"id": (g_short or ws.name) + ("@cur" if src == "cur" else "@%s" % src),
|
||||||
@@ -429,6 +441,8 @@ def build_project(ws: Path) -> dict:
|
|||||||
"declared_at": str(g.get("declared_at") or "").strip(),
|
"declared_at": str(g.get("declared_at") or "").strip(),
|
||||||
"life_at": str(g.get("lifecycle_at") or "").strip(),
|
"life_at": str(g.get("lifecycle_at") or "").strip(),
|
||||||
"topics": [str(x) for x in (g.get("topics") or []) if str(x).strip()],
|
"topics": [str(x) for x in (g.get("topics") or []) if str(x).strip()],
|
||||||
|
# 🔴 「状态未收口」标记(空串=正常)—— 见上面 `_warn` 那段判据
|
||||||
|
"warn": _warn,
|
||||||
# 🔴 该目标**自己的**判据(⛔ 不是 `p.acc` —— 那是当前目标的)
|
# 🔴 该目标**自己的**判据(⛔ 不是 `p.acc` —— 那是当前目标的)
|
||||||
"acc": {"n": len(g_eff), "pass": sum(1 for i in g_items if i["pass"]),
|
"acc": {"n": len(g_eff), "pass": sum(1 for i in g_items if i["pass"]),
|
||||||
"items": g_items},
|
"items": g_items},
|
||||||
|
|||||||
@@ -745,6 +745,19 @@ def declare() -> int:
|
|||||||
"它不再被推进,归档件可回查" % (_old_raw or "未声明"))
|
"它不再被推进,归档件可回查" % (_old_raw or "未声明"))
|
||||||
print(" 🔴 旧目标已收尾:`lifecycle` %s ⇒ 已暂停(不再推进,看板归「待执行」)"
|
print(" 🔴 旧目标已收尾:`lifecycle` %s ⇒ 已暂停(不再推进,看板归「待执行」)"
|
||||||
% (_old_raw or "(未声明)"))
|
% (_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"
|
_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")))
|
_dst = GOALS_DIR / ("%s__%s.json" % (_safe, time.strftime("%Y%m%d-%H%M")))
|
||||||
_n = 1
|
_n = 1
|
||||||
|
|||||||
@@ -193,9 +193,10 @@ RULES = (
|
|||||||
# 全文仍由 `SessionStart` 那份承担;这里只放"最常被违反的三条"。
|
# 全文仍由 `SessionStart` 那份承担;这里只放"最常被违反的三条"。
|
||||||
RULES_BRIEF = (
|
RULES_BRIEF = (
|
||||||
"【决策判据 · 每轮提醒(正本 references/04-决策方法论.md)】\n"
|
"【决策判据 · 每轮提醒(正本 references/04-决策方法论.md)】\n"
|
||||||
"· **技术实现自己定**(框架/库/目录结构/命名/参数/部署/排查)⇒ 写成陈述句"
|
"· **技术实现自己定**(框架/库/目录结构/命名/参数/部署/排查;**这份清单是举例、⛔ 不是穷举**)"
|
||||||
"(「我选了什么,可推翻」),⛔ **不做成选项让用户选**。\n"
|
"⇒ 写成陈述句(「我选了什么,可推翻」),⛔ **不做成选项让用户选**;凡属「怎么实现」一律自决。\n"
|
||||||
"· **只提报用户三类**:① 功能语义分叉(用户能感知)② 红线门禁 ③ 超出决策边界。\n"
|
"· **只提报用户三类**:① 功能语义分叉 —— 判据=**用户日常操作路径有没有变**(没变即自决)"
|
||||||
|
"② 红线门禁 ③ 超出决策边界。\n"
|
||||||
"· ⛔ 已定项混进待拍板清单 = 变相征询;⛔ 不用「你看呢/等你发话」收尾。\n"
|
"· ⛔ 已定项混进待拍板清单 = 变相征询;⛔ 不用「你看呢/等你发话」收尾。\n"
|
||||||
"· **先取证再结论**:用户原话 > 本机实测 > 文件在 > 文档说 > 推断。\n"
|
"· **先取证再结论**:用户原话 > 本机实测 > 文件在 > 文档说 > 推断。\n"
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in new issue
Block a user