第 79 环 · 全名点完也接着聊(点谁都能接上)
第 78 环让「第N个 / 第N场」这条序号路做到「点完就接着聊」:等进场完成,硬件直接用恢复的上下文说下一句。可用户直接念名字点一场(「查资料」)时——第 59 环的全名命中、换场、恢复上下文全都照做——AI 仍旧一声不响。
同一次「点谁」的动作,凭「用什么方式点」分成两种待遇,用户听来就是「有时候记得我、有时候不认识我」。这一环把开口条件从「序号点选」拓宽到任何一次真点中:全名点中也接上下一句,删除和叫错名字仍不开口。
把「点中」拆成两种来路。pick_speak 新增 en_any(开关 NP_ANYSPK):sel_hit = ok && answered && !del && (per || ord) 始终开口(第 78 环语义不变);full_hit = ok && answered && !del && !per && !ord 只在 en_any=1 时开口。删除路永远不开口——删完没有「下一句」可接;叫错名字(ok=0)也不开口。
生成契约一字不差。全名路和序号路共用同一段接力:等 name_pick 已发的那条 enter 真跑完(见 busy 起、再见 busy 落)→ 只有 ok && mem_ok 才开口 → 话头取恢复的归档摘要低位、2 层、种子固定 0xA5 → 发一段整段生成。核一个生成入口寄存器都不写。
点法可读。新增 kind_out[1:0]:1 = 序号点选、2 = 全名命中。探针 PKS_KIND 让「全名真走了同一条路」可被读出,而不是只看一句回执。
开关保守。新写口 0xB6C NP_ANYSPK(默认 0 = 第 78 环语义);新只读 0xB70 PKS_KIND;新观察点 0xB7C SCREEN55。前 78 圈地址映射一字不改、ISA 编码一位没动。
单元 tb_pick_speak79(替身开关场 + 替身生成引擎,六用例):
en_any=0 + 全名命中 → 不动作(第 78 环老语义逐位不变);en_any=1 + 全名命中 → 等进场 busy 起落 → 摘要低位当话头 → gen_start/seed_we 各一拍 → spoke=1 / kind=2 / sid=0xA4 / n=3;en_any=1 + 序号点选 → 仍开口、kind=1(第 78 环能力不退化);del=1)→ 不动作;mem_ok=0)→ done=1 / spoke=0 / err=0,不发 gen_start;pick_done 还举着时 clear → 同一场不重复开口。ISA 协同 tb_isa_greet79(真整颗 SoC,四场目录 + 活清单 0x1C0 + slot2 = 0xA3 也有一份 4 条 K/V 归档):
NP_PKSPK=1, NP_ANYSPK=1, NP_ORDNM=1
说「查资料」→ 一条 npu.name
→ 换场 0xA3,回执「好,查资料,接着聊。」
→ 硬件自己先说一句:话头=摘要低位 2、种子 0xA5、4 步
seq=0x22、末 token 2、PKS_CORE=0、kind=2
PKS_RST → 说「第二个」
→ 序号路仍开口:sid=0xA2、kind=1、4 步 seq=0x22
SCREEN55 = 0xC4A38022
SCREEN = 0x79
回归:pick_speak79、pick_speak、name_pick77、rem_pick76、resume_speak70、isa_resume68、isa_greet77、isa_greet78、isa_greet79、min_soc64 十项全 PASS;第 78 环的序号开口、第 77 环的回执、第 68 环的先开口逐位不变。
spoke 上升都往同一个 firstrc 里拷,第二次开口会把第一次回执盖掉——加 rc_captured 只记第一次;mem_ok=1);空场应 done=1 / spoke=0 / err=0,不能为了「看起来能用」硬开口;del 必须排除——删完没有「下一句」;gen_start / seed_we 只写复位分支会常高(第 38/44/68 环同一颗钉子);kind_out 在认下点选那一拍锁存,否则后面 per/ord 信号落下就分不清这次是全名还是序号。点谁都能接上了,可开口第一句的「话头」还是归档摘要的低 2 位——一个指纹碎片,不是上一场真正停下的那个 token。下一环把话头接回末句:归档时记住这一场最后吐出的 token,续聊第一步直接拿它当输入,让第一句真正接着上一句往下说。