Skip to content

feat: step 9b — a hello the producer builds: hm? → heh → elbow-down wave → weight-shift settle (#9) - #11

Merged
firejune merged 1 commit into
mainfrom
gs-9-hello
Oct 20, 2026
Merged

firejune merged 1 commit into
mainfrom
gs-9-hello

Conversation

@firejune

Copy link
Copy Markdown
Contributor

Closes #9.

What

  • scripts/hello.ts (Bun, node:fs only, wave.ts's style) writes one motion spec hello.anim.json — rigc-motion/1, animation hello, 16 tracks × 97 keys, 4 s at 24 fps, loopable — that the config names in motion.animations_from (a string path relative to the config; set with the existing take.ts). rig-parts build … --loop gates it beside the idle: ANIMATIONS_DO_NOT_FOLD: PASS, check: PASS, build: PASS. Producer-first; no hand overlay. Authored test motion, no footage.
  • Beats: hm? (head +6°, chest +1°, brows up) → heh (eyes scaley 0.70, mouth [1.12, 0.90], two 4 px shoulder lifts) → elbow-down wave (sleeve_r0 ≤ 4°, forearm up then ±15° at 2 Hz, two waves) → settle (hip −6 px with IK legs, ankles planted, skirt links following).
  • README step 9b "Say hello" (headings still 1–10), step 10 opens &anim=hello&under=idle (idle on track 0, hello on track 1) and keeps the wave link; scripts/play.html gains the optional &under=; scripts/check-adapters.ts runs 9b and asserts the build holds idle + hello and both step-10 links' tracks (local run: exit 0, every [bar:*] PASS); docs/REFERENCE.md: versions, timings, the 9b section with bars and the 15-pair table.

Why elbow-down / why 6 px — the upper-arm image is the puff sleeve + arm as one piece under a sleeveless top: swinging it out opens background at the armhole (step 9's wave: 3,772 px; even 25 % of its swing 1,070). Single-bone sweep: shoulder gap 0 at −3°, 50 at −6°; the forearm is free at the elbow. The thigh art starts at the hem, so a hip move past ~6 px opens the hem; shoes are one image on root, so no foot lifts. An overhead hello needs a raised-arm painting set (alternate set with its own skeleton), not a wider deform.

Bars (stated before measuring): seam gap ≤ 25 px, ghost ≤ 50 px, pass-through 0, sleeve_r0 within ±4°, hip ≤ 6 px.
Measured (walkthrough's build, current npm: parts 1.48.0, rig-c 2.64.1, pose 0.37.0, play 1.12.0; rigc render --fps 24 --seam … --pass-through …):

pair hello gap/ghost
upperarm_r|topwear 8/8
forearm_r|upperarm_r 1/25 (the build's one WARN, SEAM_OVER_MOTION, not a bar)
topwear|bottomwear 1/9
thigh_l|bottomwear 3/1
shin_r|thigh_r · shin_l|thigh_l 0/9 · 0/5
neck|topwear 0/5
all other pairs ≤ 2
Pass-through 0/97 on both thighs. --angle-range sleeve_r0:chest: 4.00° max. Hip 5.96 px of world travel; ankles ≤ 0.0007 px.

Reproduction: the README's sh blocks from a clean folder (hello.ts copied in place of the unpublished clone) → identical hello.anim.json, config.json, both builds (byte-identical to the measured run). Warm-cache run: steps 1–10 133 s + 9b 81 s. The "about 3 minutes" heading now reads ~3.6 min on this machine; left unchanged because its anchor is referenced (separate decision).

Candid read of the result: the wave is the strongest beat; "hm?" and "heh" are subtle at full-body size (a squint-smile, not a closed-curve eye-smile — that needs a curved lash image); the settle is invisible by design (it returns the loop to rest).

🤖 Generated with Claude Code

…ave → weight-shift settle (#9)

scripts/hello.ts writes one motion spec (rigc-motion/1, animation
"hello": 16 tracks, 97 keys over 4 s at 24 fps) that the config names in
motion.animations_from; rig-parts build gates it beside the idle. An
authored test motion, no footage. The leg IK reads the leg bones from
out/rig/rig.json so both ankles stay planted through the 6 px hip shift.

Why the arm stays elbow-down: the upper-arm image is the puff sleeve and
the arm as one piece under a sleeveless top, so swinging it out opens
background at the armhole (the step-9 wave opens 3,772 px there). The
hello keeps sleeve_r0 within 4.0 deg of rest and waves from the elbow.
Why the weight shift is 6 px: the thigh art starts at the hem.

Measured on the walkthrough's build (parts 1.48.0, rig-c 2.64.1,
pose 0.37.0, play 1.12.0): all 15 seam pairs within gap <= 25 / ghost
<= 50 px (worst: forearm_r|upperarm_r 1/25), pass-through 0/97,
ANIMATIONS_DO_NOT_FOLD PASS, check PASS, build PASS; sleeve_r0 range
4.00 deg; ankles drift <= 0.0007 px.

- README: step 9b with the exact commands and expected lines; step 10
  plays idle on track 0 and hello on track 1 (&under=idle), keeps the
  wave link
- scripts/play.html: optional &under=<anim> (track 0 under anim on 1)
- scripts/check-adapters.ts: runs 9b, asserts idle + hello in the build
  and both step-10 links' tracks
- docs/REFERENCE.md: versions, run-4 timings, the 9b section with the
  bars and the 15-pair table

Closes #9

Co-Authored-By: Roa <342598975+fj-roa[bot]@users.noreply.github.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-20T14:12:25.979898Z 85e63ae PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 85e63aec5b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread scripts/hello.ts
Comment on lines +157 to +164
const n = Math.round(seconds * fps);
const r4 = (x: number) => Math.round(x * 1e4) / 1e4 || 0;
let maxUpper = 0;
let maxShift = 0;
const tracks = curves.map(([target, property, f, group]) => {
const keys = [];
for (let i = 0; i <= n; i++) {
const t = i / fps;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep the final key at the requested duration

When --seconds * --fps is not an integer, rounding the frame count and then calculating each timestamp as i / fps makes the last key fall before or after the declared animation duration. For example, --seconds 1 --fps 1.5 emits keys at 0, 0.66667, and 1.33333 while declaring a one-second animation; rounding downward can instead omit the rest-pose endpoint and cause a visible loop jump. Either constrain the accepted values or generate timestamps so the final key is exactly seconds.

Useful? React with 👍 / 👎.

@firejune

Copy link
Copy Markdown
Contributor Author

HQ sign on 85e63ae: owner eye-checked the clip and accepted ("안녕 많이 좋아졌다"); producer-first (one motion spec via config motion.animations_from, no hand overlay), bars stated before measuring and met (15 seam pairs inside, pass-through 0/97, sleeve_r0 4.00°, hip 5.96 px), README-as-written re-run byte-identical. Arming.

@firejune
firejune merged commit f1ab7cf into main Oct 20, 2026
1 check passed
@firejune
firejune deleted the gs-9-hello branch October 20, 2026 14:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

A sincere hello: hm? → heh (eye-smile, shoulder bob) → elbow-down wave → weight-shift settle, through the producer

1 participant