M4:事件层(可按需排空的日志 + 游标)+ 16 项判据

新增 mcfold/events.py:EventLog(环形缓冲 + seq + 游标)
- 不做回调式推送:LLM 是回合制的,回调会让事件在两次观察之间静默丢失
- drain(limit) 只取本轮、剩余留待下次(不丢)
- 细分层(block_changed❌y:z)独立可查,不污染粗粒度流
- render_events() 输出紧凑文本行,省 token

session 接线:block_change / multi_block_change / chat / damage /
entity spawn·move·destroy / held_item_slot,并加 chat()/command() 发送

修的真 bug:
- dropped 恒 0:deque(maxlen=) 丢元素无声 ⇒ 改手动计数(事件丢了必须说)
- 事件键 to_state_id 与渲染器的 to 不一致 ⇒ 显示 None,改为解出方块名;
  from 区分「未加载/界外」而非裸 None
- run_tests.sh 只数 ✓ 不数 ★ ⇒ 判据少报(98 修正为 110)

实测:/setblock 后事件正确报 grass_block→stone→air,与状态层一致
判据:110 项全通过;4 项变异全部被抓
This commit is contained in:
JianFeeeee
2026-09-26 12:27:28 +08:00
parent 40b2e1d60f
commit d2b4c5029d
7 changed files with 805 additions and 3 deletions

View File

@ -26,7 +26,10 @@ for t in tests/test_*.py; do
fi
out=$(python3 "$t" 2>&1)
if echo "$out" | grep -qE "全部通过|通过$"; then
n=$(echo "$out" | grep -c "^ ✓")
# ★ 计数必须包含 ★ 判据:我特意用 ★ 标出「这条守住了一个真 bug 的回归」,
# 它们同样是**通过**的判据。只数 ✓ 会让总数少报(曾 16 条只报 7 条)
# —— 报告少报也是撒谎。
n=$(echo "$out" | grep -cE "^ (✓|★)")
skipped=$(echo "$out" | grep -c "^ - 跳过")
total=$((total+n))
# ★ 全跳过的套件不算绿:它对环境一无所知,报绿等于把"没测"说成"测过了"