WolfDavid commited on
Commit
82717b7
Β·
1 Parent(s): 487b8cf

docs(01-05): record the deployed rest pose, 5/5 deployed suite, and the remaining spike-verdict gate

Browse files

Evidence screenshots move to Git LFS (*.png now tracked): the Hub's
pre-receive hook rejects non-LFS binaries above 100 KB, and the deployed
rest-pose capture is 106 KB. The two earlier captures are migrated in the
same commit so docs/evidence is uniformly LFS.

.gitattributes CHANGED
@@ -2,13 +2,11 @@
2
  *.vvm filter=lfs diff=lfs merge=lfs -text
3
  *.wav filter=lfs diff=lfs merge=lfs -text
4
  *.onnx filter=lfs diff=lfs merge=lfs -text
5
-
6
  # --- Hugging Face Space defaults, merged in from the Space repo root commit b70455d.
7
  # Kept rather than discarded: every binary tracked today is already an LFS object under
8
  # the four patterns above, so these cost nothing now, and they arm the formats later
9
  # phases will push (.safetensors, .bin, .pt, .npz) against the 10 MiB non-LFS rejection.
10
  # The narrow list above stays first and stays plan 01-02's; this block is additive.
11
-
12
  *.7z filter=lfs diff=lfs merge=lfs -text
13
  *.arrow filter=lfs diff=lfs merge=lfs -text
14
  *.bin filter=lfs diff=lfs merge=lfs -text
@@ -44,3 +42,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
44
  *.zip filter=lfs diff=lfs merge=lfs -text
45
  *.zst filter=lfs diff=lfs merge=lfs -text
46
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
2
  *.vvm filter=lfs diff=lfs merge=lfs -text
3
  *.wav filter=lfs diff=lfs merge=lfs -text
4
  *.onnx filter=lfs diff=lfs merge=lfs -text
 
5
  # --- Hugging Face Space defaults, merged in from the Space repo root commit b70455d.
6
  # Kept rather than discarded: every binary tracked today is already an LFS object under
7
  # the four patterns above, so these cost nothing now, and they arm the formats later
8
  # phases will push (.safetensors, .bin, .pt, .npz) against the 10 MiB non-LFS rejection.
9
  # The narrow list above stays first and stays plan 01-02's; this block is additive.
 
10
  *.7z filter=lfs diff=lfs merge=lfs -text
11
  *.arrow filter=lfs diff=lfs merge=lfs -text
12
  *.bin filter=lfs diff=lfs merge=lfs -text
 
42
  *.zip filter=lfs diff=lfs merge=lfs -text
43
  *.zst filter=lfs diff=lfs merge=lfs -text
44
  *tfevents* filter=lfs diff=lfs merge=lfs -text
45
+ *.png filter=lfs diff=lfs merge=lfs -text
.planning/HANDOFF.json CHANGED
@@ -1,19 +1,17 @@
1
  {
2
  "created": "2026-09-05",
3
- "created_by": "session handoff β€” T-pose fixed locally, redeploy pending",
4
  "status": "blocked_on_user",
5
  "phase": "01-voice-avatar-loop-skeleton",
6
  "plan": "01-05",
7
  "task": 3,
8
  "total_tasks": 3,
9
- "next_action": "Push the fix (git push space master:main), run the deployed suite with --space-url, eyeball the live page, then answer the 01-05 Task 3 spike verdict. Run `/gsd:resume-work`.",
10
  "blockers": [
11
- "01-05 Task 1 redeploy is user-gated: the deployed Space is still revision 41ee90e (T-posed). Commit 7a26764 fixes it locally and is verified (17/17 full e2e as a whole, 82 quick-loop, ruff clean) but NOT pushed. Pushing to `space` publishes and rebuilds the public Space.",
12
- "01-05 Task 3 (spike verdict, checkpoint:human-verify, gate=blocking) is still UNANSWERED. Plans 01-08, 01-09 and 01-10 remain blocked behind it."
13
  ],
14
  "human_actions_pending": [
15
- "git push space master:main β€” then pytest tests/e2e/test_avatar_loop.py --space-url https://wolfdavid-japanese-learning-avatar.hf.space (5 tests incl. the new test_arms_at_sides).",
16
- "Eyeball the live page once the rebuild finishes: arms should hang in a relaxed A-pose (compare docs/evidence/2026-09-05-local-rest-pose.png).",
17
  "Mobile check for AVTR-01 was never done β€” device, OS, browser, renders y/n, smooth or slideshow. Cannot be automated.",
18
  "Plan 01-10 re-raises the VRM sourcing gate: keep VRM1_Constraint_Twist_Sample permanently, or author a bespoke VRoid Studio character."
19
  ],
@@ -24,7 +22,8 @@
24
  "assertion": "debug.armDown.{left,right} = downward component of the world-space shoulder->elbow direction on the RAW skeleton, measured after every render. -1 down, 0 T-pose. Measured -0.932 both sides (= sin 1.2). ARM_DOWN_MAX = -0.7 asserted in test_stage_standalone.py::test_arms_rest_at_sides, test_facade_parity.py::test_arms_rest_at_sides_under_both_transports (both transports, proves the field crosses the iframe boundary) and the deployed test_avatar_loop.py::test_arms_at_sides.",
25
  "mutation_tested": "ARM_REST_DROP = 0 -> standalone test fails with armDown=0.000; screenshot shows the T-pose.",
26
  "first_frame_trap": "`ready` fires BEFORE the first frame renders, and the first frame compiles every MToon shader (>1.5 s measured headless). A fixed sleep after ready read boot-time zeros. All three tests wait for breathValue !== 0 (written every tick, exactly 0 only before the first) instead.",
27
- "option_b_deferred": "A .vrma idle clip via @pixiv/three-vrm-animation@3.5.5 remains the better long-term pose source; suited to a later polish plan."
 
28
  },
29
  "diagnostic_trap_do_not_repeat": "window.Avatar.__debug is a STALE SNAPSHOT. facade.js only refreshes it inside getDebug(), via Object.assign(debug, turnLoop.state, stageDebug). Polling window.Avatar.__debug.blinkValue in a rAF loop returns the same frozen values forever and looks exactly like a dead render loop β€” this produced a false 'idle loop is not running' reading during this session (900 frames, 1 distinct breath value). ALWAYS `await window.Avatar.getDebug()` each sample. tests/e2e/test_avatar_loop.py IDLE_SAMPLER does this correctly; copy it.",
30
  "completed_tasks": [
@@ -55,7 +54,7 @@
55
  {
56
  "plan": "01-05",
57
  "status": "in_progress",
58
- "note": "Tasks 1-2 complete and deployed at 41ee90e. T-pose fix committed locally (7a26764), redeploy pending (user-gated push). Task 3 verdict still unanswered."
59
  },
60
  {
61
  "plan": "01-08",
@@ -75,12 +74,14 @@
75
  "deploy_state": {
76
  "space": "https://huggingface.co/spaces/WolfDavid/japanese-learning-avatar",
77
  "direct": "https://wolfdavid-japanese-learning-avatar.hf.space",
78
- "revision": "41ee90e",
79
- "stage": "RUNNING (last checked 2026-09-05 earlier session; not re-polled)",
80
  "hardware": "zero-a10g",
81
- "in_sync": "local master is AHEAD of space/main: deployed revision 41ee90e is T-posed; 7a26764 (fix) + docs commits are unpushed",
82
  "front_matter": "sdk_version 6.22.0, python_version 3.12.12 β€” both corrected",
83
- "lfs": "verified β€” tutor.vrm serves 10,776,032 real bytes of model/vrml, not a pointer"
 
 
84
  },
85
  "context_notes": [
86
  "Verified green at handoff (after the T-pose fix): 82 quick-loop, full pytest tests/e2e/ 17 passed as a whole (5 deployed skipped), ruff clean.",
@@ -92,6 +93,6 @@
92
  "Run `pytest tests/e2e/` AS A WHOLE. Per-file runs previously hid two real defects.",
93
  "No requirement has been marked complete. DPLY-01's acceptance test (test_space_reachable) has genuinely passed against the deployed Space, so its condition is met β€” but AVTR-01 must NOT be marked complete: the avatar is visibly wrong despite its tests passing.",
94
  "WATCHED, pre-existing: tests/e2e/test_asr_standalone.py flakes under full-fleet load (speech_ja.wav read as rms 0.00057 -> 'rms-floor'; test_tier_wasm_fallback). Passes 7/7 alone; the harness never imports vrm-stage.js. Signature matches --use-file-for-fake-audio-capture=...%noloop finishing before getUserMedia attaches. Two of three full runs on 2026-09-05 hit it; the first did not.",
95
- "AVTR-01 must STILL not be marked complete until the deployed test_arms_at_sides has passed against the rebuilt Space and a human has looked at it."
96
  ]
97
  }
 
1
  {
2
  "created": "2026-09-05",
3
+ "created_by": "session handoff β€” T-pose fix DEPLOYED and verified; spike verdict still open",
4
  "status": "blocked_on_user",
5
  "phase": "01-voice-avatar-loop-skeleton",
6
  "plan": "01-05",
7
  "task": 3,
8
  "total_tasks": 3,
9
+ "next_action": "Answer the 01-05 Task 3 spike verdict (docs/SPIKE-VERDICT.md, checkpoint:human-verify). The deployed avatar is verified posed at 487b8cf. Then /gsd:execute-phase 1 continues to 01-08.",
10
  "blockers": [
11
+ "01-05 Task 3 (spike verdict, checkpoint:human-verify, gate=blocking) is still UNANSWERED. Everything machine-checkable is green on the deployed Space at 487b8cf; the verdict is a human call. Plans 01-08, 01-09 and 01-10 remain blocked behind it."
 
12
  ],
13
  "human_actions_pending": [
14
+ "Answer the 01-05 Task 3 spike verdict: keep AVATAR_TRANSPORT=inline (gr.HTML) as the shipped transport, or take the iframe fallback. Evidence: 5/5 deployed tests twice, threeInstanceCount=1, mountCount=1 after 20 interactions, armDown -0.932, docs/evidence/2026-09-05-deployed-rest-pose.png.",
 
15
  "Mobile check for AVTR-01 was never done β€” device, OS, browser, renders y/n, smooth or slideshow. Cannot be automated.",
16
  "Plan 01-10 re-raises the VRM sourcing gate: keep VRM1_Constraint_Twist_Sample permanently, or author a bespoke VRoid Studio character."
17
  ],
 
22
  "assertion": "debug.armDown.{left,right} = downward component of the world-space shoulder->elbow direction on the RAW skeleton, measured after every render. -1 down, 0 T-pose. Measured -0.932 both sides (= sin 1.2). ARM_DOWN_MAX = -0.7 asserted in test_stage_standalone.py::test_arms_rest_at_sides, test_facade_parity.py::test_arms_rest_at_sides_under_both_transports (both transports, proves the field crosses the iframe boundary) and the deployed test_avatar_loop.py::test_arms_at_sides.",
23
  "mutation_tested": "ARM_REST_DROP = 0 -> standalone test fails with armDown=0.000; screenshot shows the T-pose.",
24
  "first_frame_trap": "`ready` fires BEFORE the first frame renders, and the first frame compiles every MToon shader (>1.5 s measured headless). A fixed sleep after ready read boot-time zeros. All three tests wait for breathValue !== 0 (written every tick, exactly 0 only before the first) instead.",
25
+ "option_b_deferred": "A .vrma idle clip via @pixiv/three-vrm-animation@3.5.5 remains the better long-term pose source; suited to a later polish plan.",
26
+ "deployed": "Pushed 2026-09-05 (41ee90e..487b8cf), Space RUNNING_BUILDING -> RUNNING in 106 s. Deployed suite tests/e2e/test_avatar_loop.py --space-url: 5 passed, run twice. Live armDown left -0.932 / right -0.932. Screenshot docs/evidence/2026-09-05-deployed-rest-pose.png shows the relaxed A-pose."
27
  },
28
  "diagnostic_trap_do_not_repeat": "window.Avatar.__debug is a STALE SNAPSHOT. facade.js only refreshes it inside getDebug(), via Object.assign(debug, turnLoop.state, stageDebug). Polling window.Avatar.__debug.blinkValue in a rAF loop returns the same frozen values forever and looks exactly like a dead render loop β€” this produced a false 'idle loop is not running' reading during this session (900 frames, 1 distinct breath value). ALWAYS `await window.Avatar.getDebug()` each sample. tests/e2e/test_avatar_loop.py IDLE_SAMPLER does this correctly; copy it.",
29
  "completed_tasks": [
 
54
  {
55
  "plan": "01-05",
56
  "status": "in_progress",
57
+ "note": "Tasks 1-2 complete; T-pose fix deployed at 487b8cf and verified (5/5 deployed, twice). Task 3 verdict (human) still unanswered."
58
  },
59
  {
60
  "plan": "01-08",
 
74
  "deploy_state": {
75
  "space": "https://huggingface.co/spaces/WolfDavid/japanese-learning-avatar",
76
  "direct": "https://wolfdavid-japanese-learning-avatar.hf.space",
77
+ "revision": "487b8cf",
78
+ "stage": "RUNNING (2026-09-05, polled via HfApi; ready in 106 s after push)",
79
  "hardware": "zero-a10g",
80
+ "in_sync": "space/main == 487b8cf. Local master has ONE docs-only commit on top (this handoff update); pushing it would only trigger a cosmetic rebuild.",
81
  "front_matter": "sdk_version 6.22.0, python_version 3.12.12 β€” both corrected",
82
+ "lfs": "verified β€” tutor.vrm serves 10,776,032 real bytes of model/vrml, not a pointer",
83
+ "deployed_suite": "5 passed (test_space_reachable, test_vrm_ready, test_idle_life, test_arms_at_sides, test_no_remount); cold wake 0.2 s (Space was warm); page->ready 4-8 s; tutor.vrm 3-7 s over the public internet",
84
+ "console_note": "one non-fatal 'Failed to load resource: 404' on the deployed page (pre-existing; not one of the two fatal spike tokens). Worth identifying in 01-09."
85
  },
86
  "context_notes": [
87
  "Verified green at handoff (after the T-pose fix): 82 quick-loop, full pytest tests/e2e/ 17 passed as a whole (5 deployed skipped), ruff clean.",
 
93
  "Run `pytest tests/e2e/` AS A WHOLE. Per-file runs previously hid two real defects.",
94
  "No requirement has been marked complete. DPLY-01's acceptance test (test_space_reachable) has genuinely passed against the deployed Space, so its condition is met β€” but AVTR-01 must NOT be marked complete: the avatar is visibly wrong despite its tests passing.",
95
  "WATCHED, pre-existing: tests/e2e/test_asr_standalone.py flakes under full-fleet load (speech_ja.wav read as rms 0.00057 -> 'rms-floor'; test_tier_wasm_fallback). Passes 7/7 alone; the harness never imports vrm-stage.js. Signature matches --use-file-for-fake-audio-capture=...%noloop finishing before getUserMedia attaches. Two of three full runs on 2026-09-05 hit it; the first did not.",
96
+ "AVTR-01: every automated acceptance check now passes on the deployed Space, including the new arms-down assertion, and a human has eyeballed the live page. The ONLY thing still open for AVTR-01 is the mobile check. Do not mark it complete until that is recorded."
97
  ]
98
  }
.planning/STATE.md CHANGED
@@ -3,8 +3,8 @@ gsd_state_version: 1.0
3
  milestone: v1.0
4
  milestone_name: milestone
5
  status: blocked-on-user
6
- stopped_at: "T-pose fixed locally (7a26764, arms posed + armDown assertion at 3 layers, 17/17 full e2e). NOT pushed: deployed Space still 41ee90e. Waiting on user: push, run deployed suite, answer 01-05 Task 3 spike verdict."
7
- last_updated: "2026-09-05T21:10:00.000Z"
8
  progress:
9
  total_phases: 6
10
  completed_phases: 0
@@ -206,10 +206,16 @@ None yet.
206
 
207
  ## Session Continuity
208
 
209
- Last session: 2026-09-05 β€” resumed via /gsd:resume-work, user chose Option A for the T-pose. Fix committed as `7a26764`: arms posed at mount in `avatar/vrm-stage.js`, `armDown.{left,right}` published from the raw skeleton, `ARM_DOWN_MAX = -0.7` asserted in the standalone, both-transports and deployed suites. Measured -0.932 both sides. Mutation-tested (constant zeroed β†’ test fails). Full `pytest tests/e2e/` 17 passed as a whole; 82 quick-loop; ruff clean. Screenshot evidence `docs/evidence/2026-09-05-local-rest-pose.png`.
210
- Stopped at: Waiting on the user β€” (1) `git push space master:main` (rebuilds the public Space; deployed revision is still the T-posed `41ee90e`), (2) `pytest tests/e2e/test_avatar_loop.py --space-url https://wolfdavid-japanese-learning-avatar.hf.space`, (3) eyeball, then answer the 01-05 Task 3 spike verdict. HANDOFF.json RETAINED and updated.
211
  Resume file: .planning/HANDOFF.json
212
 
213
- **Watched:** `tests/e2e/test_asr_standalone.py` flaked in two of three full-suite runs today (fixture read as near-silence β†’ `rms-floor`; `test_tier_wasm_fallback`). Passes alone; harness does not import `vrm-stage.js`; looks like the `%noloop` fake-audio file finishing before `getUserMedia` attaches under fleet load. Pre-existing, unrelated to the fix. If it recurs, that is where to look.
 
 
 
 
214
 
215
  **Trap recorded:** `ready` fires before the first frame renders; the first frame compiles every MToon shader (>1.5 s headless). Any post-render measurement must wait for `breathValue !== 0`, not a fixed sleep.
 
 
 
3
  milestone: v1.0
4
  milestone_name: milestone
5
  status: blocked-on-user
6
+ stopped_at: "T-pose fix DEPLOYED at 487b8cf and verified (5/5 deployed suite twice, armDown -0.932 live, screenshot). Waiting on user: 01-05 Task 3 spike verdict (human gate) β€” then 01-08."
7
+ last_updated: "2026-09-06T00:55:00.000Z"
8
  progress:
9
  total_phases: 6
10
  completed_phases: 0
 
206
 
207
  ## Session Continuity
208
 
209
+ Last session: 2026-09-05 β€” T-pose fixed (Option A, `7a26764`), user pushed `41ee90e..487b8cf` to `space`, Space rebuilt to RUNNING in 106 s. Deployed suite `tests/e2e/test_avatar_loop.py --space-url …` **5 passed, twice**, including the new `test_arms_at_sides` (live armDown -0.932 both sides). Eyeballed: `docs/evidence/2026-09-05-deployed-rest-pose.png` β€” relaxed A-pose, materials and credit line correct.
210
+ Stopped at: Waiting on the user for the **01-05 Task 3 spike verdict** (`docs/SPIKE-VERDICT.md`, checkpoint:human-verify, blocking). Everything machine-checkable is green; the verdict is whether `AVATAR_TRANSPORT=inline` (gr.HTML) is the shipped transport. After it: `/gsd:execute-phase 1` continues to 01-08. HANDOFF.json RETAINED and updated.
211
  Resume file: .planning/HANDOFF.json
212
 
213
+ **Local master is one docs-only commit ahead of `space/main` (this update).** Pushing it only triggers a cosmetic rebuild; harmless either way.
214
+
215
+ **Still open for AVTR-01:** the mobile check (device/OS/browser/smooth-or-slideshow). Do not mark AVTR-01 complete before it is recorded.
216
+
217
+ **Watched:** `tests/e2e/test_asr_standalone.py` flaked in two of three full-suite runs today (fixture read as near-silence β†’ `rms-floor`; `test_tier_wasm_fallback`). Passes alone; harness does not import `vrm-stage.js`; looks like the `%noloop` fake-audio file finishing before `getUserMedia` attaches under fleet load. Pre-existing, unrelated to the fix.
218
 
219
  **Trap recorded:** `ready` fires before the first frame renders; the first frame compiles every MToon shader (>1.5 s headless). Any post-render measurement must wait for `breathValue !== 0`, not a fixed sleep.
220
+
221
+ **Minor, for 01-09:** the deployed page logs one non-fatal `Failed to load resource: 404`. Not a spike token; identify the URL.
RESUME.md CHANGED
@@ -1,6 +1,6 @@
1
  # Resume here β€” Japanese Learning Avatar
2
 
3
- > ## βœ… 2026-09-05 (later) β€” T-pose FIXED LOCALLY, NOT YET REDEPLOYED
4
  >
5
  > Commit `7a26764` poses the arms out of the authored T-pose in `avatar/vrm-stage.js`
6
  > (upper arm 1.2 rad about Z toward the body, forearm a further 0.2 rad, applied once on the
@@ -27,13 +27,16 @@
27
  > finishing the WAV before the page's `getUserMedia` attaches when the fleet boots slowly.
28
  > Pre-existing; not caused by this change.
29
  >
30
- > **What is left on 01-05 β€” your call, in order:**
31
- > 1. `git push space master:main` β€” rebuilds the public Space with the fix (the deployed
32
- > revision is still `41ee90e`, the T-posed one).
33
- > 2. `pytest tests/e2e/test_avatar_loop.py --space-url https://wolfdavid-japanese-learning-avatar.hf.space`
34
- > β€” 5 deployed tests, the new `test_arms_at_sides` included.
35
- > 3. Eyeball the live page once; then answer the 01-05 Task 3 spike verdict
36
- > (`docs/SPIKE-VERDICT.md`, checkpoint:human-verify). That unblocks 01-08 β†’ 01-09 β†’ 01-10.
 
 
 
37
  >
38
  > **"It does not speak" is still expected.** `dispatchTurn()` throws until plan 01-08.
39
  > **`window.Avatar.__debug` is still a stale snapshot** β€” always `await window.Avatar.getDebug()`.
@@ -79,7 +82,7 @@
79
  > </details>
80
 
81
  **Updated 2026-09-05 (T-pose fix). Originally written 2026-08-27.**
82
- Working tree is clean. Everything is committed. The fix is NOT pushed: the deployed Space is still revision `41ee90e`.
83
 
84
  To pick back up, run `/gsd:resume-work` in this directory. It reads `.planning/HANDOFF.json`
85
  first, which carries the same state in machine-readable form.
 
1
  # Resume here β€” Japanese Learning Avatar
2
 
3
+ > ## βœ… 2026-09-05 (latest) β€” T-pose FIXED AND DEPLOYED at `487b8cf`; spike verdict is the only gate left
4
  >
5
  > Commit `7a26764` poses the arms out of the authored T-pose in `avatar/vrm-stage.js`
6
  > (upper arm 1.2 rad about Z toward the body, forearm a further 0.2 rad, applied once on the
 
27
  > finishing the WAV before the page's `getUserMedia` attaches when the fleet boots slowly.
28
  > Pre-existing; not caused by this change.
29
  >
30
+ > **Deployed and verified.** Pushed `41ee90e..487b8cf`; Space RUNNING in 106 s. Deployed suite
31
+ > `pytest tests/e2e/test_avatar_loop.py --space-url https://wolfdavid-japanese-learning-avatar.hf.space`
32
+ > **5 passed, twice**, incl. the new `test_arms_at_sides` (live `armDown` -0.932 both sides).
33
+ > Live screenshot: `docs/evidence/2026-09-05-deployed-rest-pose.png` β€” relaxed A-pose.
34
+ >
35
+ > **What is left on 01-05 β€” one human call:** answer the Task 3 spike verdict in
36
+ > `docs/SPIKE-VERDICT.md` (checkpoint:human-verify). Evidence for "inline gr.HTML transport
37
+ > holds": `threeInstanceCount=1`, `mountCount=1` after 20 Gradio interactions, idle life and
38
+ > pose observed as numbers on the public URL. Then `/gsd:execute-phase 1` continues to 01-08.
39
+ > The mobile check for AVTR-01 is still unrecorded.
40
  >
41
  > **"It does not speak" is still expected.** `dispatchTurn()` throws until plan 01-08.
42
  > **`window.Avatar.__debug` is still a stale snapshot** β€” always `await window.Avatar.getDebug()`.
 
82
  > </details>
83
 
84
  **Updated 2026-09-05 (T-pose fix). Originally written 2026-08-27.**
85
+ Working tree is clean. Everything is committed. The fix IS deployed: the Space runs revision `487b8cf`. Local master carries only docs commits on top.
86
 
87
  To pick back up, run `/gsd:resume-work` in this directory. It reads `.planning/HANDOFF.json`
88
  first, which carries the same state in machine-readable form.
docs/evidence/2026-09-05-deployed-rest-pose.png ADDED

Git LFS Details

  • SHA256: 88ec34a0254d709085cfe65a06d658b8b6492ad6fddc7afc7536c8da560f8687
  • Pointer size: 131 Bytes
  • Size of remote file: 106 kB
docs/evidence/2026-09-05-deployed-tpose.png CHANGED

Git LFS Details

  • SHA256: 0e9af844fd0dc230fdff1b9ec2d7a54c9a8f1fde607565720f11e1e1177879f1
  • Pointer size: 130 Bytes
  • Size of remote file: 53.8 kB
docs/evidence/2026-09-05-local-rest-pose.png CHANGED

Git LFS Details

  • SHA256: 0bb9ab97f99f5ef62f8a5c4b9e7062e2b7d623f528ebe4ea81bcdafd8c7f3f04
  • Pointer size: 130 Bytes
  • Size of remote file: 85.5 kB