Fix release publishing and add a CI token fallback
Full build / Import + headless tests (push) Successful in 26s
Full build / Full desktop build + optional release (push) Failing after 3m58s

Tag builds since v0.2.2 built all artifacts but never published a release:
- tools/publish_release.sh only assembled AUTH in the GITEA_TOKEN branch; the
  ~/.git-credentials branch set CRED and then used an unbound ${AUTH[@]} under
  `set -u`, so every API call failed and the job ended "could not create or find
  release". It now sets AUTH=(-u "$CRED").
- The repo has no GITEA_TOKEN secret and the runner has no git credentials, so the
  workflow now falls back to the built-in workflow token:
  GITEA_TOKEN: ${{ secrets.GITEA_TOKEN || github.token }}.

v0.2.9 was then built and published locally with all five artifacts (portable
Linux/Windows/macOS, NSIS installer, AppImage) and the release page verified via
the API. v0.2.4-v0.2.8 remain unpublished; they are superseded by the latest.

Docs
- docs/RELEASING.md records the incident and the local-publish fallback.
- TODO gains a release-pipeline follow-up (verify CI on the next tag).
- MEMORY notes the root cause, the missing secret, and which releases exist.
- Version 0.2.10.
This commit is contained in:
zwitschi committed 2026-10-31 21:23:09 +01:00
1 parent 3f4ac7e9aa
commit 6684d36739
16 files changed
+110 -85

No files matched your search

+25 -25
View File
@@ -89,7 +89,7 @@ var _rig: Node3D = null
var _head: Node3D = null
var _bob_phase := 0.0
var _guard_ref: Node3D = null
var _ring: MeshInstance3D = null
var _focus_circle: MeshInstance3D = null
var _name_tag: Label3D = null
## Theater props and limbs for the idle poses (ADR-0010 rig).
var _photo_prop: MeshInstance3D = null
@@ -136,26 +136,29 @@ func _build_body(npc_type: int) -> void:
_rig.add_child(_head)
_add_box_prop(_rig, Vector3(0.16, 0.08, 0.28), Vector3(-0.16, 0.05, 0.02), Color(0.12, 0.12, 0.14))
_add_box_prop(_rig, Vector3(0.16, 0.08, 0.28), Vector3(0.16, 0.05, 0.02), Color(0.12, 0.12, 0.14))
_build_focus_ring()
_build_focus_circle()
_add_props(npc_type)
func _build_focus_ring() -> void:
_ring = MeshInstance3D.new()
_ring.name = "FocusRing"
var torus := TorusMesh.new()
torus.inner_radius = 0.26
torus.outer_radius = 0.34
torus.rings = 12
torus.ring_segments = 16
_ring.mesh = torus
func _build_focus_circle() -> void:
_focus_circle = MeshInstance3D.new()
_focus_circle.name = "FocusCircle"
# Blue, semi-transparent disc floating in front of the face (ADR-0008).
# Billboarded so it always reads as a circle on screen.
var disc := CylinderMesh.new()
disc.top_radius = 0.15
disc.bottom_radius = 0.15
disc.height = 0.001
disc.radial_segments = 24
_focus_circle.mesh = disc
var mat := StandardMaterial3D.new()
mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED
mat.albedo_color = Color(0.95, 0.82, 0.28, 0.9)
mat.albedo_color = Color(0.25, 0.55, 1.0, 0.45)
mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA
_ring.material_override = mat
_ring.position = Vector3(0, 0.28, 0)
_ring.visible = false
_head.add_child(_ring)
mat.billboard_mode = BaseMaterial3D.BILLBOARD_ENABLED
_focus_circle.material_override = mat
_focus_circle.position = Vector3(0, 0, 0.30)
_focus_circle.visible = false
_head.add_child(_focus_circle)
_name_tag = Label3D.new()
_name_tag.name = "NameTag"
_name_tag.text = npc.profile.display_name if npc and npc.profile else ""
@@ -168,12 +171,12 @@ func _build_focus_ring() -> void:
_head.add_child(_name_tag)
func set_focus_visual(focused: bool, menu_open: bool = false) -> void:
if _ring:
_ring.visible = focused
var mat := _ring.material_override as StandardMaterial3D
if _focus_circle:
_focus_circle.visible = focused
var mat := _focus_circle.material_override as StandardMaterial3D
if mat:
mat.albedo_color = Color(1.0, 0.92, 0.35, 1.0) if menu_open else Color(0.95, 0.82, 0.28, 0.85)
_ring.scale = Vector3.ONE * (1.15 if menu_open else 1.0)
mat.albedo_color = Color(0.35, 0.65, 1.0, 0.7) if menu_open else Color(0.25, 0.55, 1.0, 0.45)
_focus_circle.scale = Vector3.ONE * (1.15 if menu_open else 1.0)
if _name_tag:
_name_tag.visible = focused
@@ -394,10 +397,7 @@ func _animate(delta: float) -> void:
_bob_phase = 0.0
_rig.position.y = lerpf(_rig.position.y, 0.0, 0.2)
_rig.rotation.x = lerpf(_rig.rotation.x, 0.0, 0.2)
if _ring and _ring.visible:
var cam := get_viewport().get_camera_3d() if get_viewport() else null
if cam:
_ring.look_at(cam.global_position, Vector3.UP)
# The focus circle billboards via its material; no per-frame look_at needed.
# Attention cue: head turns toward the guard when awareness was raised.
if _head != null and npc.guard_noticed:
if _guard_ref == null or not is_instance_valid(_guard_ref):
+3 -3
View File
@@ -1,5 +1,5 @@
extends SceneTree
## Windowed smoke helper for the ADR-0007–0010 control pass (focus ring + action
## Windowed smoke helper for the ADR-0007–0010 control pass (focus circle + action
## wheel). Boots the real main scene, stages one NPC in front of the guard, opens
## the wheel, and saves two PNGs to user://screenshots/. Exits 1 if the focus or
## radial state did not come up, so it can be used as a smoke check.
@@ -76,7 +76,7 @@ func _advance() -> void:
(gm.guard.global_position as Vector3).y,
(gm.targeted_npc.global_position as Vector3).y,
])
_shoot("smoke-01-focus-ring.png")
_shoot("smoke-01-focus-circle.png")
gm.call("_open_radial")
state = 2
state_frames = 0
@@ -127,7 +127,7 @@ func _fail(message: String) -> void:
func _finish() -> void:
if failures.is_empty():
print("SMOKE OK: focus ring + action wheel opened and cancelled")
print("SMOKE OK: focus circle + action wheel opened and cancelled")
quit(0)
else:
for message in failures: