maybe-im-smart — 保留目标,换个地方找做法 は何をしますか?
输出是一个动作——执行者、本周的第一步、如何判断它有效。不是一个想法。
准则:加载后,是否继续
仅在命中 description 中的触发条件时加载。加载后,通过第一道门:下一步必须看不见——困难不算,只有无候选才算。然后通过第二道门:缺失什么——只有第一类走此流程:
| 缺失什么 | 去哪里 | 边界 |
|---|---|---|
| 缺失动作(该做什么) | 此流程 | 仅此类需要换个地方找做法 |
| 缺失事实(是什么) | 查证 | 让用户回答 AI 自己能查的事实,浪费用户时间 |
| 缺失约束(什么不能动) | 问,且问准确 | 只问“什么不能动”;问“怎么做”就把行动空间交还给了用户 |
其他几种情况不属于此。下一步已知但不想做 = 执行问题。技术意义上的死锁(线程互相等待、工具调用循环、重试风暴)= 需要修复的 bug,不是“用户反复问 AI,AI 反复问用户”的来回往复;那种来回往复属于“问答来回 ≥3 轮”类别。没有卡点的主题头脑风暴 = 直接问想法。润色和解释 = 没有要切换的检索领域。
另一半是审计,跳过上述判断和声明。 若要判断一个已有的跨域对应关系的结构自洽性(在它进入推理链之前,或在其机制搬回领域 A 之前),直接阅读 references/audit.md;只判断结构,不判断类比真假。
自查:不必等用户开口
外部事件信号可以从记录中计数。以下信号仅限 AI 侧,只有 AI 能承认它们:
- AI 当前回复的实质动作是让用户在候选里挑选(要求选择,而非事实)
- AI 准备提出的候选中,没有一条是用户没提过的
如果两者之一成立,就算作卡住,此时不需要满足“下一步看不见”和“缺失的是动作”这两道门。
当判断成立时,声明触发条件,让用户可以拒绝或降级:
<那一项证据> — 用 maybe-im-smart 跑一轮,分三步:分解、检索、落地(
references/probe.md)。
从 description 中命中的条目或 AI 承认的那句话里逐字复制<那一项证据>,不要改写为摘要。
如果不成立,一个字也不要说。
1. 分类任务类型
| 类型 | 卡点的形状 | 示例 |
|---|---|---|
| 检测 | 必须发现某事物存在与否;遗漏或误报 | 评审仍有遗漏 |
| 阻断 | 必须阻止某事发生 | 同一事件重复发生 |
| 分配 | 有限资源分配到多个需求 | 日程冲突、预算拆分 |
| 协调 | 多方的行动必须保持一致 | 交接失真、跨团队一致 |
| 时序 | 顺序或节奏出错 | 依赖颠倒、反馈延迟 |
| 连续性 | 系统不能在扰动下崩溃 | 容量耗尽、关键人员离职 |
| 决策 | 信息不完整时仍需下结论 | 在证据不足时是否发布 |
如果都没有,自己命名一个。 这个表格只为了逼出“这个问题的形状是什么”。
2. 分解:四列
| 列 | 问什么 | 示例(代码评审遗漏缺陷) |
|---|---|---|
keep 保留什么 | 现在是什么在维持它运行?动了它一切塌掉 | 合并前的独立判断 |
block 阻断什么 | 哪个失败正在发生? | 有判断但不起作用 |
stuck 卡在哪里 | 一句话“想要 X,但缺少 Y” | 提高检测率,但加人反而降低 |
constraints 什么不能动 | 写出实际被撞到的那个约束 | 不能增加人员;不能延长排期 |
除四列外,保留领域 A 的操作表 ops_A — 名称: 输入 → 输出,对象用其真实名称。落地门用它来检查 subject(在领域 A 里吗?)和 action(旧动作改名了?)。
分解失败 = 卡点还没定位到;回去定位。如果 stuck 不能写成“想要 X,但缺少 Y”,就不要继续。
3. 去提示语重述
重复问两个问题直到两者都失败:这个名称是否暗示了用途?能否进一步分解?方法、标准和示例:见 references/probe.md 的第一部分。
产出:
- 一个中性重述(≤40 字符,不包含本领域的领域特定术语)
- 3-5 个搜索词(中性名词或动词)
搜索词中包含本领域术语意味着这一步还没做完。 将这些术语列入 domain_terms;工具通过子串匹配来阻断。
4. 检索(2a 方向生成 → 2b 对一手来源的验证 → 2c 缺口填补)
先扫描本领域,然后离开它。 2a 的第一步。
这里的“来源”不是指“另一个领域”。 来源有两个粒度:
| 什么变了 | 来源是 | 机制 |
|---|---|---|
| 分支切换 | 领域 A 内的另一个分支 | 替换主线的前提,不是映射 |
| 跨域切换 | 另一个领域 | 结构映射 φ: A→B |
两种“另一分支”,都算: 一种是被同行挤掉的(过去做过,后来被放弃);一种是从未被当作方法使用过——本领域中已存在的东西(文档标准中的必填字段、已有的索引结构、另一个团队用的粗糙变通方案),只是没人把它应用到这个问题上。第二种不是发明:它必须已存在于本领域;只是位置变了。
b_domain 记录实际来源:对于分支切换,写领域 A 的名称加上分支名称;对于跨域切换,写那个领域。只有可命名的具体来源才算。
“本领域已穷尽”是不可判定的;不要判断它。 检查两个表,每种一条记录:
| 扫描什么 | 如何扫描 | 记录什么 |
|---|---|---|
| 共享前提 | 见下方“如何打破前提”,五步 | 一个前提 + 一个拒绝该前提的实践,或“本领域无此实践” |
| 未走的分支 | 问两种。① 本领域曾经的主流实践现在被遗弃了——是被反驳了,还是仅仅过时了?② 为何本领域已存在的某个东西从未被用作方法? | 分支名称 + 未走的原因;如果没有,写“本领域无此分支” |
如何打破前提——扫描“共享前提”表。五步,一步不能少:
- 把失败的路径放在一起;把它们的共享前提写成一句能否定的话——如果不能否定,前提还没说清楚。
- 把它拆成能逐个否定的子句。
- 对每个子句:本领域有没有不把它当作前提的实践?如果有,填进去;该子句扫描完成。
- 凡是回答“没有”的子句,就是离开的方向。
- 用这个子句的否定作为搜索词。不是学科名称——学科名称只会返回该学科的关键词论文,搜索会直接循环回起点。
confidence 在打破前提时不计算。
只有当两个表都回答“无”时,才允许离开。“空”意味着无反例实践,不是没有文字。 一行写着“本领域无此实践”也算空。
分支切换不仅仅是重新思考。 一个标准:新分支不包含失败路径的共享前提。更多努力、更细粒度、在同一个前提下调整参数,只会把主线推得更远。无法命名:分支还没找到。
两个表扫描的是主线没有走过的地方,不是主线本身。 开放性问题同样对待:避开本领域的陈词滥调,而不是避开本领域本身。
本领域条目以与跨域条目相同的地位进入 recall:structure 写明“哪个本领域分支,现在走哪一条”。离开是通过第三步的两个输出确认的:restated 中零个领域 A 术语(工具不检查——自己数)和 terms 中没有 domain_terms 中的词(工具会阻断)。工具不检查两个表。
三个子步骤都属于第二阶段,在同一轮中按顺序执行。不要把它们合并成一个查询——合并在 2c 会变成 2a 的延续。
| 步骤 | 动作 | 输出 | 硬格式 | 能证明什么 |
|---|---|---|---|---|
| 2a 方向生成 | 从参数化记忆中:实践可能在哪儿(先本领域未走的分支) | 一个方向 + “那里可能有什么” | origin: "recall",confidence,视角 operator;3-6 条,≥2 个视角;status 始终为 unverified | 仅“见过这个区域”,不代表实践确实在那里 |
| 2b 对一手来源的验证 | 对照外部一手来源检查每条:那个实践存在吗? | verified / refuted / unverified(检查了但无法确定,保持 unverified) | verified 必须带出处;refuted 必须带修正 | 将猜测转化为可引用的事实 |
| 2c 缺口填补 | 更改搜索词再搜,针对 2a 从未想到的方向 | 新来源 | origin: "search" 和每条 status;每条结果记录 query | 越过训练数据边界 |
2c 返回与 2a 相同的实践(相同领域、相同实践)= 这一步没有离开;那是延续,不是缺口的填补。同一领域中的另一个实践算——但“其他”必须进入 structure,否则无法与记录中的 2a 条目区分,工具也无法判断重复。工具不检查这一点;自己数。
提示和顺序,见 references/probe.md。不要计算召回准确率:2a 给出方向,不是命题。
四种构架视角(用于 2a 方向生成,在落地门重新对照候选)
在 2a 中,给每个方向标记一个视角;3-6 条覆盖 ≥2 个。 四个条目来自同一个视角,就是一个类比复制四份,对错都在一起——在 2a 检查发散性,而不是最后的落地门。
视角问的是“在哪里”,不是“多远”。答案可以是本领域的另一个分支,也可以是另一个领域。
| 构架视角 | 用它问什么 |
|---|---|
function(功能) | 动词(检测 / 缓冲 / 限流 / 校准)在哪个领域是标准组件? |
conflict(矛盾) | 谁把“想要 X,同时又不要 X”当作日常工作? |
scale(尺度) | 低一级(单个事件)和高一级(组织、生态系统)的领域如何做同样的事? |
failure(失败) | 哪个领域有书面的事故档案来处理这种失败? |
5. 反向翻译:落地为本领域行动
反向翻译源侧的每个实践;舍弃不可译的。
先写 why;如果写不出就舍弃条目。 不是在其他列之后追加——到那时已决定保留,写的只是为它找到的辩护。why 是进场门:A 侧引用 decompose.stuck 的原话;B 侧说明在那个领域什么起作用。仅 B 侧(“那个领域这样做很好”)是空转;仅 A 侧只是重述卡点;两者对不上 = 不可译。
对于 evidence,选择:来源实践的出处,或 inferred。标记 inferred 允许;把推断当作出处写则不允许。它管辖事实(实践在那里存在);why 管辖对应关系(与领域 A 卡点位置相同?)。
工具只检查 why 非空;无法判断它是否先于其他列写的。 软性,像 2c 的自查:阻断明显未完成的。
6. 两道门和命令
python3 scripts/maybe_smart.py --recall decompose.json # 记录门
python3 scripts/maybe_smart.py --check cands.json decompose.json # 落地门
python3 scripts/maybe_smart.py analogy.json # 审计(可选)
--quiet 是输出开关,不是模式位:默认打印完整报告;带上它只输出结果行(PASS / FAIL;--check 处理一对并打印一行)。退出码:0 通过 / 1 阻止 / 2 输入错误。
记录门:task_type 非空且全部四列存在;restated ≤40 字符;terms ≥3 且不包含 domain_terms 中的词(如果 domain_terms 未列出,此门无法检查,视为未通过);每条 recall 条目的 b_domain 非空;≥3 条 recall 条目;相同来源、相同实践不重复(一个分支下的两个不同实践算两条);status 只接受 verified / refuted / unverified;verified 带 source,refuted 带 correction;至少 1 条 origin 为 search 且记录了 query 的条目。