From db7719ca478d240b004ca23af7795e69260a18de Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 8 Nov 2026 06:29:55 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D(CI=E7=BA=A2=C2=B7?= =?UTF-8?q?=E8=BF=AD=E4=BB=A356=E8=BF=BD=E7=BB=BF=E4=B8=89):=20run136?= =?UTF-8?q?=E4=B8=A4=E7=BA=A2=E6=A0=B9=E5=9B=A0=E4=B8=8E=E4=BF=AE=E6=B3=95?= =?UTF-8?q?=E2=80=94=E2=80=94=E2=91=A0=E8=83=BD=E5=8A=9B=E5=AE=A1=E8=AE=A1?= =?UTF-8?q?:=E5=8D=A11=E6=96=B0=E5=BB=BA=E9=AA=8C=E8=AF=81=E5=87=BD?= =?UTF-8?q?=E6=95=B0=5Fassert=5Ffx=5Fchain=E6=BC=8F=E6=8C=82=E5=88=A4?= =?UTF-8?q?=E6=8D=AE=E5=87=BA=E5=A4=84=E6=B3=A8=E8=AE=B0(=E6=9C=BA?= =?UTF-8?q?=E6=A3=80=E7=BA=A2=E9=A1=B91=C2=B7Windows=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E5=90=8C=E7=BA=A2=E5=A4=8D=E7=8E=B0=E5=B9=B3=E5=8F=B0=E6=97=A0?= =?UTF-8?q?=E5=85=B3)=E2=80=94=E2=80=94=E6=B3=A8=E8=AE=B0=E8=A1=A5?= =?UTF-8?q?=E6=8C=82=E5=87=BD=E6=95=B0=E4=BD=93=E5=86=85=E9=A6=96=E8=A1=8C?= =?UTF-8?q?(=E6=9C=BA=E6=A3=80=E6=89=AB=E6=8F=8F=E5=8C=BA=E9=97=B4=3D?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E8=A1=8C=E8=B5=B7,=E5=86=99func=E4=B8=8A?= =?UTF-8?q?=E6=96=B9=E8=AE=A1=E5=85=A5=E4=B8=8A=E4=B8=80=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=90=8D=E4=B8=8B,=E5=90=8C=E6=96=87=E4=BB=B6check/=5Finit?= =?UTF-8?q?=E8=BF=87=E6=A3=80=E5=BD=A2=E6=80=81=E5=90=8C=E6=AC=BE),?= =?UTF-8?q?=E9=94=9AHUD=E6=A1=86=E6=9E=B6.md:272=E7=BB=93=E7=AE=97?= =?UTF-8?q?=E9=80=90=E8=A1=8C=E5=AE=9E=E6=97=B6=E6=BB=9A=E5=87=BA;=20?= =?UTF-8?q?=E2=91=A1=E9=9D=99=E6=80=81=E6=89=AB=E6=8F=8FS9:=E5=8D=A12?= =?UTF-8?q?=E6=96=B0=E5=A2=9Eboard=5Fview.gd:585=E6=98=BE=E5=BC=8F?= =?UTF-8?q?=E9=9D=9E=E5=8F=82=E6=95=B0=E5=8C=96Dictionary=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=3DR1=E6=97=A0=E7=B1=BB=E5=9E=8B=E5=AE=B9=E5=99=A8(Win?= =?UTF-8?q?dows=E6=9C=AC=E5=9C=B0=E5=90=8C=E7=BA=A2=E5=A4=8D=E7=8E=B0)?= =?UTF-8?q?=E2=80=94=E2=80=94=E6=94=B9:=3D=E6=8E=A8=E6=96=AD=E5=BD=A2?= =?UTF-8?q?=E6=80=81(=E8=A7=84=E7=BA=A6=C2=A776=E5=90=88=E6=B3=95=E9=9D=A2?= =?UTF-8?q?=C2=B7=E7=B1=BB=E5=9E=8B=E5=8D=95=E7=82=B9=3Dcell=5Fidentity?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=A3=B0=E6=98=8E;=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E5=8C=96Dictionary[String,Variant]=E6=B3=A8=E8=A7=A3=E5=AE=9E?= =?UTF-8?q?=E6=B5=8B=E6=8B=92=E6=94=B6=E5=87=BD=E6=95=B0=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E7=9A=84=E8=A3=B8Dictionary=E2=80=94=E2=80=94=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E6=97=B6Variant=E7=BA=A6=E6=9D=9F=E6=8C=89Nil?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C,10=E8=A1=8CSCRIPT=20ERROR=E5=AE=9E=E8=AF=81,?= =?UTF-8?q?=E8=AF=A5=E5=BD=A2=E6=80=81=E4=B8=8D=E5=8F=AF=E7=94=A8);=20?= =?UTF-8?q?=E8=AF=BB=E6=95=B0:=20=E8=83=BD=E5=8A=9B=E5=AE=A1=E8=AE=A1--str?= =?UTF-8?q?ict=E7=BB=BF(455=E5=87=BD=E6=95=B0=E7=BA=A2=E9=A1=B90)+?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E9=97=B8=E5=BD=92=E9=9B=B6+=E5=89=8D?= =?UTF-8?q?=E7=BD=AE=E6=A3=80=E6=9F=A5=E7=BB=BF(=E5=86=92=E7=83=9F+?= =?UTF-8?q?=E5=8D=95=E5=85=834=E5=88=86=E7=89=87)+=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E6=B5=8B=E8=AF=9576=E9=A1=B90=E5=A4=B1=E8=B4=A5=E4=B8=89?= =?UTF-8?q?=E9=97=B8=E5=85=A8=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/presentation/views/board_view.gd | 2 +- game/tests/unit/presentation/pacing_queue_test.gd | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/game/presentation/views/board_view.gd b/game/presentation/views/board_view.gd index 9ad8f01c..7db729d0 100644 --- a/game/presentation/views/board_view.gd +++ b/game/presentation/views/board_view.gd @@ -582,7 +582,7 @@ func _paint_cell_ink(c: Vector2i, u: Node2D, revealed: bool, seal: bool) -> Colo # 封印受理即揭示:身份字形按板事实当场可见(cell_identity 单点——不用等轮末判定; # 数字遮蔽不适用——遮蔽打脸受理即揭示)。 bg = COL_FLOOR - var ident: Dictionary = _board.cell_identity(c) + var ident := _board.cell_identity(c) # 推断形态(规约§76 合法面)——参数化注解拒收函数返回的裸 Dictionary if String(ident.get("kind", "")) == "mine": glyph = "危" digit_col = UiKit.RED_MINE diff --git a/game/tests/unit/presentation/pacing_queue_test.gd b/game/tests/unit/presentation/pacing_queue_test.gd index 30f7e13e..def26380 100644 --- a/game/tests/unit/presentation/pacing_queue_test.gd +++ b/game/tests/unit/presentation/pacing_queue_test.gd @@ -188,6 +188,7 @@ class FakeBoardZone extends BoardZoneView: func _assert_fx_chain(main: Node, rows_seen: Array) -> void: + # 判据出处: design/gdd/systems/表现与支撑/HUD框架.md:272 (结算逐行实时滚出——行→FX 排播链计数逐位一致) var rp = RowPacerScript.new() var fstage := FakeStage.new(null, root.get_node("/root/ConfigDB").presentation.battle_layout) var ffx := FakeFx.new() From e0103d82efec57af3cca3ec245fabe8784871a6a Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 8 Nov 2026 06:36:09 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(=E9=BB=84=E9=87=91?= =?UTF-8?q?=E5=9B=BE=E8=87=AA=E6=84=88=E8=A1=A5=E9=87=87=C2=B7CI=E9=87=87?= =?UTF-8?q?=E9=9B=86=E6=AD=A5):=20=E7=94=A8=E6=88=B7=E8=A3=81=E8=A1=A5?= =?UTF-8?q?=E9=87=87=E8=87=AA=E5=8A=A8=E5=8C=96=E2=80=94=E2=80=94=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E8=83=BD=E5=8A=9B=E5=9C=A8runner=E4=BC=9A=E8=AF=9D,?= =?UTF-8?q?=E4=BA=BA=E6=89=8B=E4=B8=8D=E5=81=9A=E4=BA=8C=E8=BF=9B=E5=88=B6?= =?UTF-8?q?=E6=90=AC=E8=BF=90;=20=E6=96=B0=E5=A2=9Etools/ci/golden=5Fselfh?= =?UTF-8?q?eal.sh+ci.yml=E9=87=87=E9=9B=86=E6=AD=A5(full=E6=89=B9=C2=B7?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=90=8E=E8=B7=91=E9=97=B8=E5=89=8D):=20?= =?UTF-8?q?=E7=BC=BA=E6=A3=8B=E7=9B=98=E4=B8=89=E4=BB=B6=E5=9F=BA=E7=BA=BF?= =?UTF-8?q?=E2=86=92golden=5Fbaseline=5Frefresh=E6=A3=8B=E7=9B=98=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E6=B8=B2=E6=9F=93=E2=86=92=E6=8F=90=E4=BA=A4=E5=9B=9E?= =?UTF-8?q?master=E6=8E=A8=E9=80=81=E2=86=92=E4=B8=8B=E4=B8=80=E8=BD=AEful?= =?UTF-8?q?l=E6=89=B9=E6=8B=89=E5=8F=96=E5=90=8E=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E9=97=B8=E7=BB=BF;=20=E6=8A=A4=E6=A0=8F=E4=B8=89=E9=81=93:=20G?= =?UTF-8?q?ITHUB=5FWORKSPACE=E5=BF=85=E5=9C=A8(=E6=9C=AC=E5=9C=B0=E8=AF=AF?= =?UTF-8?q?=E8=B7=91=E5=8D=B3=E6=8B=92=C2=B7=E5=AE=9E=E6=B5=8Bguard=5Fexit?= =?UTF-8?q?=3D1)/=E4=B8=89=E4=BB=B6=E9=BD=90=E7=9B=98=E9=9B=B6=E5=8A=A8?= =?UTF-8?q?=E4=BD=9C(=E5=B9=82=E7=AD=89=E6=97=A0=E5=BE=AA=E7=8E=AF)/?= =?UTF-8?q?=E5=9B=9B=E5=A4=B1=E8=B4=A5=E7=82=B9=E5=85=A8=E7=BD=AE=E7=BA=A2?= =?UTF-8?q?=E4=B8=8D=E9=9D=99=E9=BB=98;=20=E8=AF=BB=E6=95=B0:=20bash=20-n?= =?UTF-8?q?=E8=BF=87+guard=E5=AE=9E=E6=B5=8B=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 8 +++++++ tools/ci/golden_selfheal.sh | 43 +++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 tools/ci/golden_selfheal.sh diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 5f245aa1..d166db11 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -48,6 +48,14 @@ jobs: rm -rf game/.godot/imported /usr/local/bin/godot --headless --path game --editor --quit + - name: 棋盘黄金图自愈补采(full 批——缺基准时 runner 会话渲染→提交回 master→下一轮拉取生效) + if: steps.route.outputs.mode == 'full' + env: + GODOT_BIN: /usr/local/bin/godot + run: | + cd "$GITHUB_WORKSPACE/repo" + bash tools/ci/golden_selfheal.sh + - name: 跑闸 if: steps.route.outputs.mode != 'skip' env: diff --git a/tools/ci/golden_selfheal.sh b/tools/ci/golden_selfheal.sh new file mode 100644 index 00000000..7d7a0193 --- /dev/null +++ b/tools/ci/golden_selfheal.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +# 棋盘黄金图 CI 自愈补采(2026-11-08 用户裁:补采自动化——渲染能力在 runner 会话里,人手不做二进制搬运)。 +# 背景:golden 基线按平台分目录(render_gate.sh:37 gate_platform_id),改版批只能重制本平台侧; +# 他平台基线缺失=渲染闸红(基准未建),而补采必须在他平台真实渲染——只有 runner 会话做得到。 +# 本件挂 CI full 批(ci.yml 导入步之后、跑闸步之前):缺棋盘三件基线时跑 golden_baseline_refresh +# 棋盘模式,产物提交回 master 并推送,下一轮 full 批拉取后渲染闸绿。 +# 护栏: +# - 只认 CI 跑批环境(GITHUB_WORKSPACE 必在)——本地误跑立即拒(防人手把本平台基线提交出去)。 +# - 三件基线齐盘即零动作退出(幂等——不会每轮提交,无循环)。 +# - 只 add 三件 PNG;刷新红/落盘缺/提交败/push 败一律置红不静默,下一轮 full 批自动重试。 +set -u +: "${GITHUB_WORKSPACE:?本件只属 CI 跑批环境(GITHUB_WORKSPACE 必在)——人手补采走 tools/golden_baseline_refresh.sh}" +REPO="$(cd "$(dirname "$0")/../.." && pwd)" +cd "$REPO" +. "$REPO/tools/gate_platform.sh" +PLAT="$(gate_platform_id)" +GOLDEN_DIR="game/tests/golden/$PLAT" +BOARD_FILES="board_L1_dungeon.png board_L2_underdark.png board_L3_deep_underdark.png" + +_miss=0 +for b in $BOARD_FILES; do + [ -s "$GOLDEN_DIR/$b" ] || { _miss=1; echo "[selfheal] 缺基准: $GOLDEN_DIR/$b"; } +done +if [ "$_miss" -eq 0 ]; then + echo "[selfheal] $PLAT 棋盘三件基线在库——零动作(幂等护栏)" + exit 0 +fi + +GODOT_BIN="${GODOT_BIN:?GODOT_BIN 必注(runner 自举件安装位)}" \ + bash "$REPO/tools/golden_baseline_refresh.sh" game || { + echo "[selfheal] FAIL — 补采刷新脚本红(探针自检/裁剪失败见上)"; exit 1 +} +for b in $BOARD_FILES; do + [ -s "$GOLDEN_DIR/$b" ] || { echo "[selfheal] FAIL — 刷新后仍缺: $b"; exit 1; } +done +for b in $BOARD_FILES; do + git add "$GOLDEN_DIR/$b" +done +git -c user.name="gitea-actions" -c user.email="actions@noreply.git.kuaimeo.com" \ + commit -m "黄金图自愈补采($PLAT·棋盘三件): 渲染闸缺基准——golden_baseline_refresh棋盘模式在runner会话渲染产出,本提交由CI采集步自动落库,下一轮full批拉取后渲染闸绿;触发源提交见父提交" \ + || { echo "[selfheal] FAIL — git commit 失败(无差异或工作区异常)"; exit 1; } +git push origin HEAD:master || { echo "[selfheal] FAIL — push 失败(令牌权限/分支保护;修复前每轮 full 批会重试)"; exit 1; } +echo "[selfheal] 完成 — 基线已落库,下一轮 CI 拉取生效"