@rig-c/core 2.39.0 → 2.39.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +2 -2
- package/NOTICE.md +1 -1
- package/README.md +43 -42
- package/docs/AUTHORING.md +25 -25
- package/docs/FACE.md +14 -14
- package/docs/INGEST.md +4 -4
- package/docs/MOTION.md +2 -2
- package/docs/PROMPTING.md +4 -4
- package/docs/RIGGING.md +33 -33
- package/package.json +4 -4
- package/skills/rigc/SKILL.md +8 -8
- package/skills/rigc-face/SKILL.md +6 -6
- package/skills/rigc-ingest/SKILL.md +5 -5
- package/skills/rigc-motion/SKILL.md +6 -6
- package/skills/rigc-rigging/SKILL.md +6 -6
- package/src/ballot.ts +1 -1
- package/src/bonedist.ts +1 -1
- package/src/cli/shared.ts +1 -1
- package/src/cli/spine_commands.ts +1 -1
- package/src/deformmeasure.ts +3 -3
- package/src/depth.ts +3 -3
- package/src/diff.ts +1 -1
- package/src/generation.ts +1 -1
- package/src/preview.ts +2 -2
- package/src/trackgen.ts +1 -1
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
"name": "rigc",
|
|
11
11
|
"source": "./",
|
|
12
12
|
"description": "Author Spine 4.3 rigs with rigc: an entry skill with the install line and the build, validate, render, check and vote loop, plus routers for rigging, motion, faces and foreign skeletons, each linking the shipped guide that owns its rules.",
|
|
13
|
-
"homepage": "https://github.com/
|
|
14
|
-
"repository": "https://github.com/
|
|
13
|
+
"homepage": "https://github.com/rig-c/core#readme",
|
|
14
|
+
"repository": "https://github.com/rig-c/core",
|
|
15
15
|
"license": "MIT",
|
|
16
16
|
"keywords": ["spine", "spine2d", "skeletal-animation", "rig", "compiler", "ai-agents"]
|
|
17
17
|
}
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
"name": "firejune",
|
|
7
7
|
"url": "https://github.com/firejune"
|
|
8
8
|
},
|
|
9
|
-
"homepage": "https://github.com/
|
|
10
|
-
"repository": "https://github.com/
|
|
9
|
+
"homepage": "https://github.com/rig-c/core#readme",
|
|
10
|
+
"repository": "https://github.com/rig-c/core",
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"keywords": ["spine", "spine2d", "skeletal-animation", "rig", "compiler", "ai-agents"]
|
|
13
13
|
}
|
package/NOTICE.md
CHANGED
|
@@ -144,4 +144,4 @@ licence file that does not exist.
|
|
|
144
144
|
`bench/reference/` is repository material — it is not in `package.json`'s `files`
|
|
145
145
|
list, so it is not part of the published npm package. The full reasoning, and the
|
|
146
146
|
per-rung framing behind it, is in
|
|
147
|
-
[`bench/reference/README.md`](https://github.com/
|
|
147
|
+
[`bench/reference/README.md`](https://github.com/rig-c/core/blob/main/bench/reference/README.md).
|
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="https://raw.githubusercontent.com/
|
|
2
|
+
<img src="https://raw.githubusercontent.com/rig-c/core/main/assets/banner.svg" alt="rigc — AI-authored 2D rigging and animation, verified before it is written" width="100%" />
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
@@ -15,12 +15,13 @@ gated by a list of named assertions before a byte is written — rigc's own vali
|
|
|
15
15
|
the published package, held to a `spine-core` round trip's verdicts in this
|
|
16
16
|
repository's CI. Built so AI agents can author rigs and check their own work; it ships
|
|
17
17
|
as an agent skill. On npm it is `rig-c` — the same package as `spine-rigc`, the name it
|
|
18
|
-
first shipped under,
|
|
18
|
+
first shipped under, and as `@rig-c/core`, its name under the toolchain's scope, both
|
|
19
|
+
published beside it with the same files at every version.
|
|
19
20
|
|
|
20
21
|
## What you get
|
|
21
22
|
|
|
22
23
|
<p align="center">
|
|
23
|
-
<img src="https://raw.githubusercontent.com/
|
|
24
|
+
<img src="https://raw.githubusercontent.com/rig-c/core/main/assets/rigc-demo.gif" alt="Loose part PNGs assembling themselves into a character that breathes, blinks and waves" width="600" />
|
|
24
25
|
</p>
|
|
25
26
|
|
|
26
27
|
<p align="center"><em>Fourteen part PNGs drawn from scratch for this repo, one rig spec, one motion spec — the assembly,
|
|
@@ -114,7 +115,7 @@ there by the render script rather than left to memory. The same file's
|
|
|
114
115
|
and art, not this material. `7-anticipation` publishes no `license.txt` upstream, so
|
|
115
116
|
no such grant exists for it and its frames are never committed — they render only
|
|
116
117
|
into a gitignored directory, enforced by `git check-ignore`. Full reasoning:
|
|
117
|
-
[`bench/reference/README.md`](https://github.com/
|
|
118
|
+
[`bench/reference/README.md`](https://github.com/rig-c/core/blob/main/bench/reference/README.md)
|
|
118
119
|
(repository material, not in the npm package).
|
|
119
120
|
|
|
120
121
|
The problem rigc is aimed at is narrow. An agent asked to author a rig has no way
|
|
@@ -141,18 +142,18 @@ repository it was cut from. What is measured is the install itself — pack,
|
|
|
141
142
|
install into an empty directory, build, render — on Linux, macOS and Windows
|
|
142
143
|
runners and on Linux at the declared minimum, Bun 1.2.0 (the `installs` and
|
|
143
144
|
`installs-matrix` jobs in
|
|
144
|
-
[`ci.yml`](https://github.com/
|
|
145
|
+
[`ci.yml`](https://github.com/rig-c/core/blob/main/.github/workflows/ci.yml),
|
|
145
146
|
repository material, not in the npm package); a platform
|
|
146
147
|
whose leg is red there is not one the package is known to run on.
|
|
147
148
|
|
|
148
149
|
**The npm package is `rig-c`; the command it installs is `rigc`.** npm
|
|
149
150
|
refuses the name `rigc` as too similar to packages that already exist, so the
|
|
150
|
-
project
|
|
151
|
-
|
|
151
|
+
project and the executable keep their name and the registry entry carries one
|
|
152
|
+
hyphen; the repository is [`rig-c/core`](https://github.com/rig-c/core). **`spine-rigc` is the same package**: it is the name
|
|
152
153
|
every version up to 2.20.4 shipped under, and it stays published as an alias —
|
|
153
154
|
every version from 2.20.4 on is on both names, with the same files — so a
|
|
154
155
|
project that depends on `spine-rigc` keeps receiving every release. A new
|
|
155
|
-
project installs `rig-c
|
|
156
|
+
project installs `rig-c`; `@rig-c/core` is the same package under the scope.
|
|
156
157
|
|
|
157
158
|
```bash
|
|
158
159
|
bunx rig-c --help # run it without installing
|
|
@@ -177,7 +178,7 @@ against Spine's official example projects — fetched, never committed — and a
|
|
|
177
178
|
reference frames this project renders from them, which **are** committed, each
|
|
178
179
|
example's own `license.txt` beside them under the redistribution grant those files
|
|
179
180
|
carry; the images stay **non-commercial only**. The reasoning is in
|
|
180
|
-
[`bench/reference/README.md`](https://github.com/
|
|
181
|
+
[`bench/reference/README.md`](https://github.com/rig-c/core/blob/main/bench/reference/README.md)
|
|
181
182
|
and the terms in [NOTICE.md](NOTICE.md). It needs a clone and `bun run
|
|
182
183
|
fetch-examples`, and says so by name when the corpus is absent. `check` is not one
|
|
183
184
|
of them: it reads whatever frames you point it at, so it runs from the installed
|
|
@@ -196,7 +197,7 @@ a rule keeps living in exactly one place. The repository is also a Claude Code
|
|
|
196
197
|
plugin marketplace:
|
|
197
198
|
|
|
198
199
|
```shell
|
|
199
|
-
/plugin marketplace add
|
|
200
|
+
/plugin marketplace add rig-c/core
|
|
200
201
|
/plugin install rigc@rigc
|
|
201
202
|
```
|
|
202
203
|
|
|
@@ -228,7 +229,7 @@ symlinked skill folder, which is not measured here, and Antigravity CLI 1.1.9 ha
|
|
|
228
229
|
way to list skills without starting a session, so what it does with a link is not
|
|
229
230
|
measured either; `--copy` is the shape that asks nothing of a host. Gemini CLI can
|
|
230
231
|
also fetch a skill itself, one folder at a time:
|
|
231
|
-
`gemini skills install https://github.com/
|
|
232
|
+
`gemini skills install https://github.com/rig-c/core.git --path skills/rigc --scope workspace`.
|
|
232
233
|
The routers are named `rigc-rigging`, `rigc-motion`, `rigc-face` and `rigc-ingest`
|
|
233
234
|
because that directory is flat — beside another tool's `motion`, a bare name is
|
|
234
235
|
whichever one the host picked — and under the Claude Code plugin they read
|
|
@@ -243,7 +244,7 @@ files, one `build`, one `validate`. No clone, no art pipeline, nothing fetched.
|
|
|
243
244
|
nowhere else in this repository. That is [AUTHORING.md](docs/AUTHORING.md) §3's
|
|
244
245
|
rule applied here: no example value in these documents is copied out of a
|
|
245
246
|
reference export, so nothing you read in a quickstart is an answer to anything
|
|
246
|
-
[the ladder](https://github.com/
|
|
247
|
+
[the ladder](https://github.com/rig-c/core/blob/main/docs/LADDER.md) measures.
|
|
247
248
|
|
|
248
249
|
**1. Install the command.**
|
|
249
250
|
|
|
@@ -370,7 +371,7 @@ rigc: look at it: rigc preview --candidate …/buoy/spine
|
|
|
370
371
|
```
|
|
371
372
|
|
|
372
373
|
`profile=spine` is the rulebook that judged it: *is this valid Spine 4.3 that any
|
|
373
|
-
runtime plays correctly?* That is the default, and the [Profiles](https://github.com/
|
|
374
|
+
runtime plays correctly?* That is the default, and the [Profiles](https://github.com/rig-c/core/blob/main/docs/BENCHMARK.md#profiles--wrong-versus-not-how-we-do-it-here)
|
|
374
375
|
section of the benchmark dossier is where the other one lives. `validate` then re-reads those
|
|
375
376
|
artifacts from disk and ends `rigc: green`. That is a rig. `spine/skeleton.json`
|
|
376
377
|
is Spine 4.3 skeleton data — it loads in a Spine runtime and it imports into the
|
|
@@ -448,7 +449,7 @@ The voter picks a winner or says "tie / no preference"; the page hands them a
|
|
|
448
449
|
small JSON file to save; `--record` checks that file against the ballot's own
|
|
449
450
|
hashes and appends one line to an append-only ledger, refusing by name anything
|
|
450
451
|
that does not belong to it. See
|
|
451
|
-
[Letting someone choose](https://github.com/
|
|
452
|
+
[Letting someone choose](https://github.com/rig-c/core/blob/main/docs/BENCHMARK.md#letting-someone-choose--rigc-vote).
|
|
452
453
|
|
|
453
454
|
**Where to go next.**
|
|
454
455
|
|
|
@@ -476,8 +477,8 @@ that does not belong to it. See
|
|
|
476
477
|
it, so a figure is read against that rather than against a number from a page;
|
|
477
478
|
AUTHORING.md §9.2 says what the two halves of that bound are and why the floor
|
|
478
479
|
is not zero.
|
|
479
|
-
- [docs/LADDER.md](https://github.com/
|
|
480
|
-
and rendered frames, scored. [docs/PILOT.md](https://github.com/
|
|
480
|
+
- [docs/LADDER.md](https://github.com/rig-c/core/blob/main/docs/LADDER.md) is the benchmark: the same job, from a brief
|
|
481
|
+
and rendered frames, scored. [docs/PILOT.md](https://github.com/rig-c/core/blob/main/docs/PILOT.md) is how to run an
|
|
481
482
|
agent through it and score what comes back.
|
|
482
483
|
- 🤖 **Handing the authoring to an AI agent?**
|
|
483
484
|
[docs/PROMPTING.md](docs/PROMPTING.md) is the operator's page — the six prompt
|
|
@@ -493,7 +494,7 @@ four candidates in one page and takes a human's answer back. Reach for them the
|
|
|
493
494
|
a rig compiles green, because green says nothing at all about the picture.
|
|
494
495
|
|
|
495
496
|
<p align="center">
|
|
496
|
-
<img src="https://raw.githubusercontent.com/
|
|
497
|
+
<img src="https://raw.githubusercontent.com/rig-c/core/main/assets/rigc-keypose.gif" alt="Two key poses read back by rigc pose, two candidate in-between motions compiled from them, and a rigc vote ballot picking one" width="600" />
|
|
497
498
|
</p>
|
|
498
499
|
|
|
499
500
|
<p align="center"><em>The whole loop on one character: two key poses are the given
|
|
@@ -526,7 +527,7 @@ something is drawn over them are `rigc chainfit`'s, once a candidate exists —
|
|
|
526
527
|
|
|
527
528
|
## The gallery — seven complete rigs over art that ships with them
|
|
528
529
|
|
|
529
|
-
Each directory in [`gallery/`](https://github.com/
|
|
530
|
+
Each directory in [`gallery/`](https://github.com/rig-c/core/tree/main/gallery) is
|
|
530
531
|
one rig spec, one motion spec and the PNGs they name, small enough to read in one
|
|
531
532
|
sitting. Each stars a single feature, so *how do I do X* has a working answer rather
|
|
532
533
|
than a field table, and each README carries the frame rate it was authored at, what
|
|
@@ -535,16 +536,16 @@ was verified, and what writing it cost. Repository material: a clone and
|
|
|
535
536
|
|
|
536
537
|
| Example | Stars | What it is |
|
|
537
538
|
| --- | --- | --- |
|
|
538
|
-
| [`gallery/walk`](https://github.com/
|
|
539
|
-
| [`gallery/squash`](https://github.com/
|
|
540
|
-
| [`gallery/flex`](https://github.com/
|
|
541
|
-
| [`gallery/ride`](https://github.com/
|
|
542
|
-
| [`gallery/portrait`](https://github.com/
|
|
543
|
-
| [`gallery/nod`](https://github.com/
|
|
544
|
-
| [`gallery/look`](https://github.com/
|
|
539
|
+
| [`gallery/walk`](https://github.com/rig-c/core/tree/main/gallery/walk) | `ik` constraints + **`ik` timelines** | Two two-bone leg chains solved to foot targets — the planted leg nailed down, the swinging one let go at the top of its lift |
|
|
540
|
+
| [`gallery/squash`](https://github.com/rig-c/core/tree/main/gallery/squash) | **`deform` timelines** | A ball squashed about its contact point and stretched along its travel, from two affine transforms the keys state rather than tabulate |
|
|
541
|
+
| [`gallery/flex`](https://github.com/rig-c/core/tree/main/gallery/flex) | **`contour` meshes** | A swallow-tailed banner and a serrated leaf: four meshes traced off their own alpha, waved by bone timelines and rippled by a `deform` |
|
|
542
|
+
| [`gallery/ride`](https://github.com/rig-c/core/tree/main/gallery/ride) | `path` attachments + **path constraints** | A trolley coasting down a drawn rail and rolling back, driven by a `position` timeline, with `groups` + `stagger` keying the wheels and the ears |
|
|
543
|
+
| [`gallery/portrait`](https://github.com/rig-c/core/tree/main/gallery/portrait) | **deform `transform`** + `derive` group tracks | A 2.5D head turn: two meshes and six feature bones all keyed from one stated expression, `dx = x(cos t − 1) − z·sin t`, with the depths in the spec rather than a README |
|
|
544
|
+
| [`gallery/nod`](https://github.com/rig-c/core/tree/main/gallery/nod) | the **`pitch`** and **`wave`** transform kinds | A head bowing and two lop ears rippling, on three meshes each laid out for the closed form that moves it — a fold angle solved for before authoring, and a shear whose winding no amplitude can reverse |
|
|
545
|
+
| [`gallery/look`](https://github.com/rig-c/core/tree/main/gallery/look) | **`slider` constraints** | A head that turns because a **value** says so: two dials drive two sliders, and the rendered animation moves the needles rather than the face — with a depth map under the face mesh, a soft mask on the cowlick, and a slider range derived from the turn ceiling `build` reports rather than picked by eye |
|
|
545
546
|
|
|
546
547
|
<p align="center">
|
|
547
|
-
<img src="https://raw.githubusercontent.com/
|
|
548
|
+
<img src="https://raw.githubusercontent.com/rig-c/core/main/assets/rigc-scene.gif" alt="A portrait rig breathing, glancing aside, then turning its head in 2.5D — hair and features sliding at different depths" width="600" />
|
|
548
549
|
</p>
|
|
549
550
|
|
|
550
551
|
<p align="center"><em>The portrait rig playing its three animations in one take — the turn is
|
|
@@ -557,7 +558,7 @@ and that cost is one stated expression per key. Compiled and rendered entirely b
|
|
|
557
558
|
published package.</em></p>
|
|
558
559
|
|
|
559
560
|
🎞️ **How the three films on this page were made** is kept with them, one directory per
|
|
560
|
-
film in [`films/`](https://github.com/
|
|
561
|
+
film in [`films/`](https://github.com/rig-c/core/tree/main/films) — a `run.sh` that
|
|
561
562
|
names every step, the assembler that cuts the shots and draws the type, and a README
|
|
562
563
|
saying what the film claims and which tool printed each figure on screen. Repository
|
|
563
564
|
material, like the gallery: a clone runs them.
|
|
@@ -592,7 +593,7 @@ commands take it and what its default is.
|
|
|
592
593
|
`diff`, `bonedist`, `check` and `bench` measure against something you were given; the
|
|
593
594
|
first three work on any reference you have, and `bench` is a repository workflow that needs a clone
|
|
594
595
|
and `bun run fetch-examples`. The reasoning behind them is in
|
|
595
|
-
[the benchmark dossier](https://github.com/
|
|
596
|
+
[the benchmark dossier](https://github.com/rig-c/core/blob/main/docs/BENCHMARK.md).
|
|
596
597
|
|
|
597
598
|
`build` and `validate` both default to `--profile spine` — the 34 validity rules, which
|
|
598
599
|
ask *is this valid Spine 4.3 that any runtime plays correctly?* `--profile spine-html`
|
|
@@ -609,7 +610,7 @@ Several cuts can also be registered in a `cuts.json` and built by name
|
|
|
609
610
|
(`build --cut my_cut --cuts path/to/cuts.json`); every path in that table resolves
|
|
610
611
|
relative to the `cuts.json` file itself, so the table lives with the project that owns
|
|
611
612
|
the art. Its shape is under
|
|
612
|
-
[Usage](https://github.com/
|
|
613
|
+
[Usage](https://github.com/rig-c/core/blob/main/docs/BENCHMARK.md#usage).
|
|
613
614
|
|
|
614
615
|
### Starting from a skeleton you already have
|
|
615
616
|
|
|
@@ -758,13 +759,13 @@ letting `A17` blame the editor for the harness's own doing.
|
|
|
758
759
|
| 📥 **[docs/INGEST.md](docs/INGEST.md)** | **working with a skeleton you did not author.** What every command can and cannot do with a foreign `skeleton.json`, reading it with the toolchain, transcription as the route that makes it yours, what each validator complaint means on an export, and the re-pivot/rename/extend recipes. Ships in the package too |
|
|
759
760
|
| 🤖 **[docs/PROMPTING.md](docs/PROMPTING.md)** | **handing the authoring to an AI agent** — the prompt clauses a measured pilot run paid for, and what you can leave unsaid. Ships in the package too |
|
|
760
761
|
| 🔬 **[docs/SPEC_COVERAGE.md](docs/SPEC_COVERAGE.md)** | **the Spine 4.3 format, field by field.** Every key the 4.3 JSON parser and atlas reader take, what each defaults to, and the parser line it comes from — the rows rigc's refusals cite by part number. Ships in the package too |
|
|
761
|
-
| 🎓 **[the benchmark dossier](https://github.com/
|
|
762
|
-
| 📋 [LADDER.md](https://github.com/
|
|
763
|
-
| 🔬 [SURVEY_2026-08-22.md](https://github.com/
|
|
764
|
-
| 🧬 [GENERATIONS.md](https://github.com/
|
|
765
|
-
| 📓 [CASES.md](https://github.com/
|
|
766
|
-
| 🗺️ [ROADMAP.md](https://github.com/
|
|
767
|
-
| 📐 [CLAUDE.md](https://github.com/
|
|
762
|
+
| 🎓 **[the benchmark dossier](https://github.com/rig-c/core/blob/main/docs/BENCHMARK.md)** | **why you can trust the output.** The yardstick, `diff` and `check` and what neither can see, the eight-rung ladder and the spineboy graduation exam, the run viewer, the 50 named assertions with their profiles, and the selftest that has watched every one of them fire. Repository material — it is not in the npm package |
|
|
763
|
+
| 📋 [LADDER.md](https://github.com/rig-c/core/blob/main/docs/LADDER.md) · [GATE.md](https://github.com/rig-c/core/blob/main/docs/GATE.md) · [PILOT.md](https://github.com/rig-c/core/blob/main/docs/PILOT.md) | the live rung ledger, the clause statements a candidate is graded against, and how to run an agent through the ladder and score what comes back |
|
|
764
|
+
| 🔬 [SURVEY_2026-08-22.md](https://github.com/rig-c/core/blob/main/docs/SURVEY_2026-08-22.md) | the survey the ladder was climbed by: rigc and the official examples as measured on 2026-08-22, and the gap list ordered by rung. A dated record, not kept current. Repository material |
|
|
765
|
+
| 🧬 [GENERATIONS.md](https://github.com/rig-c/core/blob/main/docs/GENERATIONS.md) | **Spine data from another generation.** Why a 3.8–4.2 file read as 4.3 fails in silence, the policy that follows (detect from `skeleton.spine`, never guess, play on the matching runtime), what `A16` and `ingest` do with such a file, and the editor as the migration path. Repository material |
|
|
766
|
+
| 📓 [CASES.md](https://github.com/rig-c/core/blob/main/docs/CASES.md) | **converting a Live2D model to Spine, and verifying the conversion.** The method — the source's own player headless, parts from its texture along the drawables, motion baked as deform keys, reference frames first, `check` — run once end to end on two Live2D sample models with no editor and no converter, and verified against the source's renderer and Spine's own runtime: the three instruments, the two rigc defects verifying it led to and v1.2.1 fixed, and where the method stops. Figures only — the models' licence keeps every asset out. Repository material |
|
|
767
|
+
| 🗺️ [ROADMAP.md](https://github.com/rig-c/core/blob/main/ROADMAP.md) | where this is going, and where it has been. What 1.0 had to mean before the number was claimed, and what it was claimed on — conditions rather than a feature list, because direction here comes from what users hit |
|
|
768
|
+
| 📐 [CLAUDE.md](https://github.com/rig-c/core/blob/main/CLAUDE.md) | **the doctrine** — why the validator's messages are the product, why nothing reaches disk before green, why no number is ever invented, and what a change has to keep. [CONTRIBUTING.md](https://github.com/rig-c/core/blob/main/CONTRIBUTING.md) calls it worth ten minutes before a first patch. Repository material |
|
|
768
769
|
|
|
769
770
|
## Why you can trust the output
|
|
770
771
|
|
|
@@ -786,7 +787,7 @@ attributability is **measured** to be capped below the bar reads down when every
|
|
|
786
787
|
observable about it is independently verified strict. Every other rung and the
|
|
787
788
|
graduation exam pass on the clause itself. Recompiling a stored candidate reproduces its
|
|
788
789
|
record **to the digit within one gate**; across an instrument change the digits move,
|
|
789
|
-
and [docs/LADDER.md](https://github.com/
|
|
790
|
+
and [docs/LADDER.md](https://github.com/rig-c/core/blob/main/docs/LADDER.md) records
|
|
790
791
|
where. The standing figures quoted above are from its *gate-v2.4 re-inspection*, which
|
|
791
792
|
is the current sweep.
|
|
792
793
|
|
|
@@ -805,19 +806,19 @@ a from-zero run is a tooling-progress measurement rather than a re-climb, which
|
|
|
805
806
|
why the certification above is scoped to tool + guide + protocol. One of those
|
|
806
807
|
attempts states the residual in its own words: *"in motion it is not at editor
|
|
807
808
|
quality."* All six, with their verdicts, are in
|
|
808
|
-
[docs/LADDER.md](https://github.com/
|
|
809
|
+
[docs/LADDER.md](https://github.com/rig-c/core/blob/main/docs/LADDER.md).
|
|
809
810
|
|
|
810
811
|
The whole dossier — the yardstick, `diff` and `check` and what neither of them can
|
|
811
812
|
see, every rung, the run viewer, the 50 assertions and the selftest behind them — is
|
|
812
|
-
[docs/BENCHMARK.md](https://github.com/
|
|
813
|
+
[docs/BENCHMARK.md](https://github.com/rig-c/core/blob/main/docs/BENCHMARK.md).
|
|
813
814
|
Live rung status is
|
|
814
|
-
[docs/LADDER.md](https://github.com/
|
|
815
|
+
[docs/LADDER.md](https://github.com/rig-c/core/blob/main/docs/LADDER.md).
|
|
815
816
|
|
|
816
817
|
## Contributing
|
|
817
818
|
|
|
818
|
-
Issues are the ledger; see [CONTRIBUTING.md](https://github.com/
|
|
819
|
+
Issues are the ledger; see [CONTRIBUTING.md](https://github.com/rig-c/core/blob/main/CONTRIBUTING.md) for what a change
|
|
819
820
|
has to clear before it lands. Releases are cut by release-please —
|
|
820
|
-
[RELEASING.md](https://github.com/
|
|
821
|
+
[RELEASING.md](https://github.com/rig-c/core/blob/main/RELEASING.md).
|
|
821
822
|
|
|
822
823
|
## Licence
|
|
823
824
|
|
package/docs/AUTHORING.md
CHANGED
|
@@ -57,15 +57,15 @@ provenance for a reader of record, and following one can arrive at a stored cand
|
|
|
57
57
|
or at the **derivation** of the gate a verdict is read against, none of which a run may
|
|
58
58
|
open. ⭐ The gate's **clause statements** are a different matter and a run may read them:
|
|
59
59
|
they are in
|
|
60
|
-
[GATE.md](https://github.com/
|
|
60
|
+
[GATE.md](https://github.com/rig-c/core/blob/main/docs/GATE.md), which is
|
|
61
61
|
repository material and not in the published package — item 11 of the allowed list — the
|
|
62
62
|
measure, the comparator, the number and the SKIP semantics, with no recorded figure in it.
|
|
63
63
|
So: read the
|
|
64
64
|
document, take its numbered sections as the input, and leave its footprints to whoever
|
|
65
65
|
is maintaining it. The rule this states is that an **allowed-reading surface has to be
|
|
66
66
|
closed under reading**; the criterion behind it is under *The honesty rule* in
|
|
67
|
-
[LADDER.md](https://github.com/
|
|
68
|
-
[bench/runs/README.md](https://github.com/
|
|
67
|
+
[LADDER.md](https://github.com/rig-c/core/blob/main/docs/LADDER.md), and the enumerated allowed and forbidden lists are in
|
|
68
|
+
[bench/runs/README.md](https://github.com/rig-c/core/blob/main/bench/runs/README.md),
|
|
69
69
|
which is also repository material and not in the published package,
|
|
70
70
|
*What a run may read* — the prompt that starts a run quotes them
|
|
71
71
|
outright, which is the copy that binds.
|
|
@@ -1076,7 +1076,7 @@ is a `BLOCK GENERATION_UNKNOWN`, never rounded to the nearest: a catalog that ro
|
|
|
1076
1076
|
handed 19 skeletons labelled `3.8.99` a 4.2 runtime and every one of them posed as NaN
|
|
1077
1077
|
(row 7). Reading a file with *that generation's own* defaults is not in this tool —
|
|
1078
1078
|
re-export as 4.3, or transcribe by hand ([INGEST.md](INGEST.md) §2).
|
|
1079
|
-
[GENERATIONS.md](https://github.com/
|
|
1079
|
+
[GENERATIONS.md](https://github.com/rig-c/core/blob/main/docs/GENERATIONS.md) is
|
|
1080
1080
|
the whole policy, and the editor migration it names.
|
|
1081
1081
|
|
|
1082
1082
|
📝 **Do not delete the `note`.** Both written specs carry one saying the file is
|
|
@@ -1160,7 +1160,7 @@ bun cli.ts pose --images path/to/parts --frame poseA.png [--out pose.json]
|
|
|
1160
1160
|
0.000 — is what says the shot is right and the name is yours. The measures, the
|
|
1161
1161
|
refusals and what makes the block absent instead of guessed:
|
|
1162
1162
|
[INGEST.md](INGEST.md) §1.3.1, and *The measure inventory* in
|
|
1163
|
-
[BENCHMARK.md](https://github.com/
|
|
1163
|
+
[BENCHMARK.md](https://github.com/rig-c/core/blob/main/docs/BENCHMARK.md),
|
|
1164
1164
|
which is repository material rather than part of this package.
|
|
1165
1165
|
|
|
1166
1166
|
🔍 **The wiring is compared by name too, not only the rosters** (issue #1085).
|
|
@@ -1185,7 +1185,7 @@ bun cli.ts pose --images path/to/parts --frame poseA.png [--out pose.json]
|
|
|
1185
1185
|
🚨 What it certifies is the **default skin** unless you pass `--skin <name>`:
|
|
1186
1186
|
on a rig with named skins, a run with no skin draws none of their art on either
|
|
1187
1187
|
side and reports a perfect `0.0000` about it (**§9**).
|
|
1188
|
-
- **`bench <rung>`** runs one rung of [the benchmark ladder](https://github.com/
|
|
1188
|
+
- **`bench <rung>`** runs one rung of [the benchmark ladder](https://github.com/rig-c/core/blob/main/docs/LADDER.md): validate
|
|
1189
1189
|
under `--profile spine`, then diff against that rung's reference export, and with
|
|
1190
1190
|
`--frames` the `check` table as well. Unlike the three above it is a **finish
|
|
1191
1191
|
line, not a loop**: it opens the reference export, so a run that consults it and
|
|
@@ -1840,7 +1840,7 @@ column restated beside each row here, is what to act on.
|
|
|
1840
1840
|
payloads in this guide are written to illustrate a field, never copied out of a
|
|
1841
1841
|
reference export — an example lifted from one would be handing an authoring agent an
|
|
1842
1842
|
answer to the rung it is standing on, which is the rule §10.6 states and the honesty
|
|
1843
|
-
rule in [LADDER.md](https://github.com/
|
|
1843
|
+
rule in [LADDER.md](https://github.com/rig-c/core/blob/main/docs/LADDER.md) turns on. If a snippet here matches a reference file,
|
|
1844
1844
|
that is a defect in this guide: report it.
|
|
1845
1845
|
|
|
1846
1846
|
### 3.1 `skeleton` — the header
|
|
@@ -2006,7 +2006,7 @@ is the half that is read exactly as stated: omit a `width` and the header carrie
|
|
|
2006
2006
|
box, which `bounds_present` is the measure of. Both are reported and gate nothing, for
|
|
2007
2007
|
the reason every reported measure is: no reading of the rendered frames could have
|
|
2008
2008
|
decided a setup-pose bounding box. The measure inventory that says so lives in
|
|
2009
|
-
[BENCHMARK.md](https://github.com/
|
|
2009
|
+
[BENCHMARK.md](https://github.com/rig-c/core/blob/main/docs/BENCHMARK.md), which
|
|
2010
2010
|
is repository material and not in the published package.
|
|
2011
2011
|
|
|
2012
2012
|
### 3.2 `bones` — Spine's bone list
|
|
@@ -2318,7 +2318,7 @@ there is nothing to measure it against.
|
|
|
2318
2318
|
vertices, and an octagon's sides pass `R · cos(π/8)` from its centre — so rim
|
|
2319
2319
|
vertices placed *on* a round silhouette leave the ink outline between the spokes
|
|
2320
2320
|
undrawn, and every assertion passes.
|
|
2321
|
-
[`gallery/squash`](https://github.com/
|
|
2321
|
+
[`gallery/squash`](https://github.com/rig-c/core/tree/main/gallery/squash)'s
|
|
2322
2322
|
README carries the inradius arithmetic, both coverage readings, and the rim move
|
|
2323
2323
|
that fixes it.
|
|
2324
2324
|
|
|
@@ -3557,7 +3557,7 @@ unresolved `spacingMode` fails the `=== Length` test and spaces bones as though
|
|
|
3557
3557
|
`Fixed` had been asked for; an unresolved `rotateMode` is neither `Tangent` nor
|
|
3558
3558
|
`ChainScale`, so bones follow the curve and never turn along it.
|
|
3559
3559
|
|
|
3560
|
-
🖼️ **Worked example: [`gallery/ride`](https://github.com/
|
|
3560
|
+
🖼️ **Worked example: [`gallery/ride`](https://github.com/rig-c/core/tree/main/gallery/ride)** — a trolley on a drawn rail, moved
|
|
3561
3561
|
by a `position` timeline, with `groups` + `stagger` keying the wheels.
|
|
3562
3562
|
|
|
3563
3563
|
#### 3.5.2 `slider` — a value that drives an animation
|
|
@@ -3988,7 +3988,7 @@ shows at the top of it, where a 60° turn then applies at 1.00000008 s rather th
|
|
|
3988
3988
|
one — pick `to`/`scale` so the endpoint lands **inside** the duration rather than
|
|
3989
3989
|
exactly on it.
|
|
3990
3990
|
|
|
3991
|
-
🖼️ **Worked example: [`gallery/look`](https://github.com/
|
|
3991
|
+
🖼️ **Worked example: [`gallery/look`](https://github.com/rig-c/core/tree/main/gallery/look)** — a face
|
|
3992
3992
|
whose yaw and pitch are two sliders sharing one bone, both `local: true` and both
|
|
3993
3993
|
`additive: true`, with each range derived from the turn ceiling `build` reports
|
|
3994
3994
|
for that mesh (§3.4) rather than chosen. [`docs/FACE.md`](FACE.md) §8's *The turn
|
|
@@ -5046,7 +5046,7 @@ consumer's process, which is late. `A34_CONSTRAINT_TIMELINE_TARGETS` checks the
|
|
|
5046
5046
|
same two from the other side, plus one thing the compiler cannot produce and a
|
|
5047
5047
|
hand-edited file can: an **empty key array**, which the parser skips in silence.
|
|
5048
5048
|
|
|
5049
|
-
🖼️ **Worked example: [`gallery/walk`](https://github.com/
|
|
5049
|
+
🖼️ **Worked example: [`gallery/walk`](https://github.com/rig-c/core/tree/main/gallery/walk)** — two mirrored two-bone leg chains
|
|
5050
5050
|
whose `mix`, `softness` and `bendPositive` are keyed through a stance and a swing,
|
|
5051
5051
|
with the README's table of what each key is for.
|
|
5052
5052
|
|
|
@@ -5272,14 +5272,14 @@ field name twice.
|
|
|
5272
5272
|
🖼️ **Worked examples, and they use a deform for four different things** — all
|
|
5273
5273
|
four are repository material rather than part of the published package, so the
|
|
5274
5274
|
links go to GitHub.
|
|
5275
|
-
[`gallery/squash`](https://github.com/
|
|
5275
|
+
[`gallery/squash`](https://github.com/rig-c/core/tree/main/gallery/squash) — a 9-vertex ball squashed about its contact point,
|
|
5276
5276
|
from the two affine transforms its keys **state**.
|
|
5277
|
-
[`gallery/portrait`](https://github.com/
|
|
5277
|
+
[`gallery/portrait`](https://github.com/rig-c/core/tree/main/gallery/portrait) — a 2.5D head turn, where the keys are the
|
|
5278
5278
|
**projection of a yaw** rather than a squash: two grid meshes whose columns are
|
|
5279
5279
|
placed to sample a cosine, and a measured account of the angle past which the
|
|
5280
|
-
mesh folds. [`gallery/flex`](https://github.com/
|
|
5280
|
+
mesh folds. [`gallery/flex`](https://github.com/rig-c/core/tree/main/gallery/flex) — a leaf whose blade bends on a
|
|
5281
5281
|
`contour` mesh no bone can bend, and the measurement that picked the model.
|
|
5282
|
-
[`gallery/nod`](https://github.com/
|
|
5282
|
+
[`gallery/nod`](https://github.com/rig-c/core/tree/main/gallery/nod) — the
|
|
5283
5283
|
projection on the **other** axis (a `pitch`, §4.11.1), and a **travelling wave**
|
|
5284
5284
|
whose only moving parameter is `phase`: each of its three meshes is laid out for
|
|
5285
5285
|
the model that bends it, so the rows are the argument rather than the vertex
|
|
@@ -5599,7 +5599,7 @@ every ratio, so the two blocks can be lined up band against band instead of wors
|
|
|
5599
5599
|
against worst — which on this build would have paired the inverted band with an
|
|
5600
5600
|
untouched one and called the difference mild.
|
|
5601
5601
|
|
|
5602
|
-
📘 **[`gallery/nod`](https://github.com/
|
|
5602
|
+
📘 **[`gallery/nod`](https://github.com/rig-c/core/tree/main/gallery/nod)'s
|
|
5603
5603
|
README is a second reading of the same block** (repository material, hence the
|
|
5604
5604
|
GitHub link), and it is the one where the figures are checked from two directions
|
|
5605
5605
|
at once. Its `pitch` band ratios are *derived* from the mesh's own row table and
|
|
@@ -6256,7 +6256,7 @@ or the key's position in its own track. These are the frequent ones, verbatim:
|
|
|
6256
6256
|
| `region "00_stage" of <pack>.atlas (declared 256x256 by its offsets) is 256x256 but the manifest window for "stage" is 250x256` | R5 — the row above under `--atlas-in`, and the prefix is the whole point: it says which of the two rigc **measured**, because the remedy differs. A bare path is a loose PNG it opened and you re-export; a `region … of <pack>` was read out of the pack, and you repack or aim the part at another region. This is the size row of §0.2's table, with the message it actually prints |
|
|
6257
6257
|
| `duplicate region name "X"` | two PNGs share a basename; one part, one page, one name |
|
|
6258
6258
|
| `"b/X.png" and the art already atlased as region "X" are two different files — … Rename one of the PNGs.` | R5 — the region name is the basename, so only one of the two can hold it. Rename a file (not a placeholder: the placeholder is free to repeat) |
|
|
6259
|
-
| `the image "X.png" was never added to the atlas, so there is no region "X" …` | nothing in the spec — every image an attachment names is measured and atlased, one per file whichever skin names it, so this says rigc skipped one. Report it on [the tracker](https://github.com/
|
|
6259
|
+
| `the image "X.png" was never added to the atlas, so there is no region "X" …` | nothing in the spec — every image an attachment names is measured and atlased, one per file whichever skin names it, so this says rigc skipped one. Report it on [the tracker](https://github.com/rig-c/core/issues). The `#555` the message itself cites is the change that made one-per-file an invariant, not a place to file against |
|
|
6260
6260
|
| `motion spec names archetype "A" but the rig spec at … is called "B"` | make `archetype` equal the rig's `name` |
|
|
6261
6261
|
| `animation "A" declares duration Ns but its last key is at Ms` | R7 — fix whichever of the two you meant |
|
|
6262
6262
|
| `animation "A" slot "X" attachment: key at Ns is Ms past the declared duration Ds` | §4.5 — the key is past the end of the animation and nothing will sample it. Move the key onto `duration`, or raise `duration` |
|
|
@@ -6451,7 +6451,7 @@ Fix A00 and run it again.
|
|
|
6451
6451
|
| `A04_MESH_TRIANGLES_AND_ENCODING` | both | authored mesh geometry: triangle count not a multiple of 3, an index out of range, or a `vertices` length that disagrees with `uvs` (the weighted/unweighted trap) **SKIP** when the skeleton carries no mesh attachment |
|
|
6452
6452
|
| `A05_CURVE_ARRAY_LENGTH` | both | a raw `curve` with the wrong number of values, a non-finite number in one, or a curve on a timeline that cannot take one. Four numbers **per value channel**. **SKIP** when no animation carries a timeline at all. Timelines with no `curve` on any key still PASS: every timeline name is checked against the channel table whether or not a curve sits on one Under `cli_core.ts build` the same clause runs over the text the emitter wrote and prints this line in the same words (`RC28`). |
|
|
6453
6453
|
| `A06_ATLAS_PAGE_SIZE_MATCHES_PNG` | both ◑ | the atlas `size:` disagrees with the PNG on disk — the message names the ratio it measured on **each** axis and the header that states the same art truthfully, and §0.2 has the whole of it: a runtime maps a region as a fraction of the DECLARED size and never reads the texture's own, so such a page draws, and what it breaks is every reader that addresses the page in texels. A uniform ratio is a `size:`/`scale:` pair away from honest and the message prints it; two ratios are not, because `scale:` carries one number, and the message says so rather than offering a header that would not work. **Or** a region's rectangle is not inside the page it names — rotation honoured, so a region at `rotate: 90` or `270` occupies `height x width` of the page and a region that fits only because it is turned is inside it. The message names the region, the rectangle it occupies, the page and the page's size. That clause is **validity** and runs under both profiles: a rectangle outside its page makes `u2 > 1` and samples whatever the wrap mode returns, and `--atlas-in` already refuses the same rectangle at compile time (§0.2). Under `spine-html` also: `pma` and rotation. Two regions on one page over the same texels was a clause here until issue #1099 and is `A49`'s now, read over what the two regions draw rather than over their rectangles. **Or** the page file is not a PNG at all, and then nothing about its size is measured: the message carries the page's path and the size the atlas declares, and names what the file is by its first bytes — one of WebP, JPEG, GIF, KTX, KTX2 by its signature, or no image format rigc recognises, the bytes in hex either way — or calls it **truncated** when it begins as a PNG and runs out before its `IEND`, or names the dimension when its `IHDR` states a width or height of **0**, which the format forbids (§0.2). **Or** the file reads as a PNG and its **image data cannot be decoded** — its compressed stream is inflated (not unfiltered) and the decoder refuses it, or it inflates short of the rows the header states — and the message names the file and carries the decoder's own words (`the decoder stops with "incorrect data check"`). That clause is validity too: nothing in rigc can read such a page back — and its failure is the **one** line that names such a page: `A19` SKIPs over it and points here rather than naming it again, the way `A17` alone names a missing file. **SKIP** when the atlas declares no page — and, rather than a PASS, when a page's file is **not on disk** and nothing else here failed: that page's size was not measured, so the reason names the pages not read (or says none was, when every file is missing) and points at `A17`, which fails naming each missing file — one missing file is named once, by the rule whose subject it is. With another `A06` failure standing, the missing page is `A17`'s alone |
|
|
6454
|
-
| `A07_ATLAS_TEXT_SHAPE` | both | atlas text: a region name with stray whitespace, or a blank line splitting a page block. rigc writes the atlas, so this means a hand-edited file. Three sentences are about blank lines and name three different repairs: `line 1: the file begins with a blank line` (or `with N blank lines` for a run, one finding) is a blank before the first page name — delete it; `line N: the file ends with a blank line` (or `with N blank lines`, one finding) is a blank after the last page block's final line — delete it, since rigc ends the file on one newline; `line N: consecutive blank lines` is two blank lines side by side between the first page and the last — delete one. None of the three is `the last page block declares no region`, which means a page name and its fields with no region after them. rigc writes none of the three: under `--atlas-in` the pack's blank lines are put in rigc's shape on re-emission (§0.2), so any of them means a file rigc did not write, handed to `validate`. ⚠️ An atlas with **no page block at all** — no non-blank line — is not one of those: its subject is absent, so this reports **SKIP** naming the byte count it read, and so do the four rules below whose subject is a page ([#608](https://github.com/
|
|
6454
|
+
| `A07_ATLAS_TEXT_SHAPE` | both | atlas text: a region name with stray whitespace, or a blank line splitting a page block. rigc writes the atlas, so this means a hand-edited file. Three sentences are about blank lines and name three different repairs: `line 1: the file begins with a blank line` (or `with N blank lines` for a run, one finding) is a blank before the first page name — delete it; `line N: the file ends with a blank line` (or `with N blank lines`, one finding) is a blank after the last page block's final line — delete it, since rigc ends the file on one newline; `line N: consecutive blank lines` is two blank lines side by side between the first page and the last — delete one. None of the three is `the last page block declares no region`, which means a page name and its fields with no region after them. rigc writes none of the three: under `--atlas-in` the pack's blank lines are put in rigc's shape on re-emission (§0.2), so any of them means a file rigc did not write, handed to `validate`. ⚠️ An atlas with **no page block at all** — no non-blank line — is not one of those: its subject is absent, so this reports **SKIP** naming the byte count it read, and so do the four rules below whose subject is a page ([#608](https://github.com/rig-c/core/issues/608)). A rig whose skins need no art writes exactly that file (§3.4), and before #608 this row refused it with two findings naming a page block that was not there. What an empty atlas does **not** excuse is an attachment that wants a region out of it — that is `A08` Under `cli_core.ts build` the same clause runs over the text the emitter wrote and prints this line in the same words (`RC28`). |
|
|
6455
6455
|
| `A08_REGION_NAMES_MATCH_ATTACHMENTS` | both | three things, and the message says which: an attachment whose `path` names **no region** of this atlas; a `path` carrying **stray whitespace**, printed quoted so you can see it; an **atlas region name** carrying stray whitespace (`A07` names that same line with its line number). The first two are read off the raw file **before** the loader is asked, so the miss is named here with the skin, the slot, the placeholder and the attachment's own name — the four things `AtlasAttachmentLoader`'s own `Region not found in atlas: <path> (attachment: <name>)` does not carry. There is no `spine-html` clause here — a placeholder is free to differ from the region its `path` names **SKIP** when no attachment names a region *and* the atlas declares none — both of its subjects at once |
|
|
6456
6456
|
| `A09_ANIMATION_DURATION_MATCHES_SPEC` | both | the loaded duration ≠ the declared one, or the two sides disagree about which animations exist (R7). Asymmetric by design: a frame of slack for an animation that ends early, and none worth the name for a key *past* the declared end, which is the same rule §4.5 states at compile time — held here against a skeleton the compiler never saw. **SKIP** when neither side has an animation at all — a static rig has no duration |
|
|
6457
6457
|
| `A10_NO_NAN_AFTER_STEPPING` | both | stepping the animation produced a pose that is not finite. It reads the **whole world transform** — all six terms `a`, `b`, `c`, `d`, `worldX`, `worldY` of every bone — then every vertex of every region and mesh the slots show, at the **setup pose** and at every stepped frame of every animation, through the same scan `render` refuses on, so the two cannot disagree. The detail names where (`the setup pose`, or `animation "x" frame i of 120 (t=…s)`), then the bone and the term (`bone "x" has a NaN`), or the slot, attachment and vertex (`vertex 3 has x Infinity`) when every bone is finite and a vertex is not — a `scaleX` chain whose product stays under the largest double does that. A bone at `rotation: 1e309` has a finite position and a `NaN` matrix, which is why the position alone is not read. Look for a number past the largest double, a degenerate curve or a zero scale. 🦴 **It also poses every bone `inherit` key at its own time**: the runtime resolves a mode by folding the case of its first letter and nothing else, and a spelling that misses is stored as **NaN** — the world position stays finite, `updateWorldTransform` matches no mode, and the bone keeps the rotation, scale and shear it had. The detail names the animation, the bone, the key's time and its spelling, beside the five. A bone whose *setup* spelling misses poses no mode at all, and is named the same way from the stepping loop. Neither is reachable from a rig spec — `build` refuses both spellings by name (§5.1) — so on a green build this clause is about files rigc did not write. Which mode a correct spelling poses is not judged here, because the lookup that resolved it is the one that would be checked. 🧍 **A skeleton with no animation is still read**: its setup pose is the whole of what it shows, so A10 reads it — the world transform and the vertices as above, and the bone's mode and the slot colours a stepped frame is read for, which on a static rig nothing else would reach — and names it `the setup pose` (`the setup pose: slot "x" colour is non-finite`). The stepping half had nothing, and a PASS row carries no detail, so the stats line says so: `nanStepping=skipped`, beside `animations=0`. `A09` does not follow — a declared duration is a fact about an animation and nothing else, so a static rig still gives it nothing. **SKIP** only when the skeleton carries **no bone and no animation**: there is then no pose to read and nothing to step |
|
|
@@ -7470,13 +7470,13 @@ that drew the reference frames, onto the same pixel grid, and reports what diffe
|
|
|
7470
7470
|
you specifically: it means **you may run `check` as often as you like** without
|
|
7471
7471
|
your run ceasing to be an honest authoring run. It is a loop, in the way `build` is
|
|
7472
7472
|
a loop. `bench` and `diff` against a rung's export are not — they read the answer,
|
|
7473
|
-
and [the ladder's honesty rule](https://github.com/
|
|
7473
|
+
and [the ladder's honesty rule](https://github.com/rig-c/core/blob/main/docs/LADDER.md) makes them a finish line you reach once.
|
|
7474
7474
|
|
|
7475
7475
|
📌 **That is also why the MAE figures quoted through this section stay.** Every one of
|
|
7476
7476
|
them is a candidate's own reading against rendered frames — the exam question, not the
|
|
7477
7477
|
answer key — so none of them narrows a reference-side measure, and a guide that censored
|
|
7478
7478
|
them would be teaching less for no gain in honesty. The criterion is under *The honesty
|
|
7479
|
-
rule* in [LADDER.md](https://github.com/
|
|
7479
|
+
rule* in [LADDER.md](https://github.com/rig-c/core/blob/main/docs/LADDER.md); what it *does* seal is a score written
|
|
7480
7480
|
over a reference's own count, and no such figure appears here.
|
|
7481
7481
|
|
|
7482
7482
|
🚨 **If you drive the runtime yourself, a bone's local transform lives on
|
|
@@ -9350,7 +9350,7 @@ read an absent `mixY` as that same `0`. *The key before's* is a sequence key's
|
|
|
9350
9350
|
the same either way.
|
|
9351
9351
|
|
|
9352
9352
|
⚠️ **Why 4.3's defaults, when they are not every generation's** (row 4 of
|
|
9353
|
-
[GENERATIONS.md](https://github.com/
|
|
9353
|
+
[GENERATIONS.md](https://github.com/rig-c/core/blob/main/docs/GENERATIONS.md)'s
|
|
9354
9354
|
table).
|
|
9355
9355
|
An omitted physics `inertia` is 0.5 to the 4.3 parser and 1 to the 4.2 one, and that
|
|
9356
9356
|
is exactly why a key is left out only against the parser rigc links: the file states
|
|
@@ -9729,7 +9729,7 @@ two things.
|
|
|
9729
9729
|
with the `visibleShare` it was computed on. ⚠️ **`visibleShare` is a per-frame
|
|
9730
9730
|
diagnostic and not a summary statistic** — it is measured through the fitted
|
|
9731
9731
|
placements, so a median or a mean of it is not comparable across fits. §12.3 says
|
|
9732
|
-
what that costs and [the `visibleShare` study](https://github.com/
|
|
9732
|
+
what that costs and [the `visibleShare` study](https://github.com/rig-c/core/blob/main/bench/studies/2026-09-03-visibleshare/README.md)
|
|
9733
9733
|
measures it — repository material, not shipped in the package.
|
|
9734
9734
|
- **Hierarchy and attachment geometry**, so the search collapses. A child bone
|
|
9735
9735
|
whose parent is already placed does not have four degrees of freedom: the rig
|
|
@@ -9909,7 +9909,7 @@ the answer landed and is *less* steady, not more (p99 0.6588 against 0.5592).
|
|
|
9909
9909
|
**The field is reporting a bistable fit faithfully.** What is safe: reading it beside
|
|
9910
9910
|
its own residual, on its own frame — which is what it exists for. What is safe as a
|
|
9911
9911
|
corpus statistic: a **maximum**, which saturates. Full method and evidence:
|
|
9912
|
-
[`bench/studies/2026-09-03-visibleshare`](https://github.com/
|
|
9912
|
+
[`bench/studies/2026-09-03-visibleshare`](https://github.com/rig-c/core/blob/main/bench/studies/2026-09-03-visibleshare/README.md).
|
|
9913
9913
|
|
|
9914
9914
|
And per part:
|
|
9915
9915
|
|
|
@@ -9967,7 +9967,7 @@ simply unused; a name the directory lacks is refused `no-part-image` by name.
|
|
|
9967
9967
|
floor. Read it per frame beside its own residual. If a corpus statistic is
|
|
9968
9968
|
needed, a **maximum** is the one that survives (it saturates), and it should be
|
|
9969
9969
|
quoted with its spread. §12.3 carries the figures;
|
|
9970
|
-
[`bench/studies/2026-09-03-visibleshare`](https://github.com/
|
|
9970
|
+
[`bench/studies/2026-09-03-visibleshare`](https://github.com/rig-c/core/blob/main/bench/studies/2026-09-03-visibleshare/README.md)
|
|
9971
9971
|
carries the method.
|
|
9972
9972
|
- ⚠️ **Setup draw order, on one frame.** A `drawOrder` timeline reorders your slots
|
|
9973
9973
|
at runtime and this cannot know the time, so a candidate that has one is masked in
|