Spaces:
Running on Zero
Running on Zero
docs(01-05): record the deployed rest pose, 5/5 deployed suite, and the remaining spike-verdict gate
Browse filesEvidence 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 +1 -2
- .planning/HANDOFF.json +14 -13
- .planning/STATE.md +11 -5
- RESUME.md +12 -9
- docs/evidence/2026-09-05-deployed-rest-pose.png +3 -0
- docs/evidence/2026-09-05-deployed-tpose.png +0 -0
- docs/evidence/2026-09-05-local-rest-pose.png +0 -0
.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
|
| 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": "
|
| 10 |
"blockers": [
|
| 11 |
-
"01-05 Task
|
| 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 |
-
"
|
| 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
|
| 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": "
|
| 79 |
-
"stage": "RUNNING (
|
| 80 |
"hardware": "zero-a10g",
|
| 81 |
-
"in_sync": "
|
| 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
|
| 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
|
| 7 |
-
last_updated: "2026-09-
|
| 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 β
|
| 210 |
-
Stopped at: Waiting on the user
|
| 211 |
Resume file: .planning/HANDOFF.json
|
| 212 |
|
| 213 |
-
**
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 (
|
| 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 |
-
> **
|
| 31 |
-
>
|
| 32 |
-
>
|
| 33 |
-
>
|
| 34 |
-
>
|
| 35 |
-
>
|
| 36 |
-
>
|
|
|
|
|
|
|
|
|
|
| 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
|
| 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
|
docs/evidence/2026-09-05-deployed-tpose.png
CHANGED
|
|
|
|
Git LFS Details
|
docs/evidence/2026-09-05-local-rest-pose.png
CHANGED
|
|
|
|
Git LFS Details
|