@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.
@@ -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/firejune/rigc#readme",
14
- "repository": "https://github.com/firejune/rigc",
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/firejune/rigc#readme",
10
- "repository": "https://github.com/firejune/rigc",
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/firejune/rigc/blob/main/bench/reference/README.md).
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/firejune/rigc/main/assets/banner.svg" alt="rigc — AI-authored 2D rigging and animation, verified before it is written" width="100%" />
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, which is published beside it with the same files at every version.
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/firejune/rigc/main/assets/rigc-demo.gif" alt="Loose part PNGs assembling themselves into a character that breathes, blinks and waves" width="600" />
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/firejune/rigc/blob/main/bench/reference/README.md)
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/firejune/rigc/blob/main/.github/workflows/ci.yml),
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, this repository and the executable keep their name and the registry
151
- entry carries one hyphen. **`spine-rigc` is the same package**: it is the name
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/firejune/rigc/blob/main/bench/reference/README.md)
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 firejune/rigc
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/firejune/rigc.git --path skills/rigc --scope workspace`.
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/firejune/rigc/blob/main/docs/LADDER.md) measures.
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/firejune/rigc/blob/main/docs/BENCHMARK.md#profiles--wrong-versus-not-how-we-do-it-here)
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/firejune/rigc/blob/main/docs/BENCHMARK.md#letting-someone-choose--rigc-vote).
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/firejune/rigc/blob/main/docs/LADDER.md) is the benchmark: the same job, from a brief
480
- and rendered frames, scored. [docs/PILOT.md](https://github.com/firejune/rigc/blob/main/docs/PILOT.md) is how to run an
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/firejune/rigc/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
+ <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/firejune/rigc/tree/main/gallery) is
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/firejune/rigc/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 |
539
- | [`gallery/squash`](https://github.com/firejune/rigc/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 |
540
- | [`gallery/flex`](https://github.com/firejune/rigc/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` |
541
- | [`gallery/ride`](https://github.com/firejune/rigc/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 |
542
- | [`gallery/portrait`](https://github.com/firejune/rigc/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 |
543
- | [`gallery/nod`](https://github.com/firejune/rigc/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 |
544
- | [`gallery/look`](https://github.com/firejune/rigc/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 |
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/firejune/rigc/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
+ <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/firejune/rigc/tree/main/films) — a `run.sh` that
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/firejune/rigc/blob/main/docs/BENCHMARK.md).
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/firejune/rigc/blob/main/docs/BENCHMARK.md#usage).
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/firejune/rigc/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 |
762
- | 📋 [LADDER.md](https://github.com/firejune/rigc/blob/main/docs/LADDER.md) · [GATE.md](https://github.com/firejune/rigc/blob/main/docs/GATE.md) · [PILOT.md](https://github.com/firejune/rigc/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 |
763
- | 🔬 [SURVEY_2026-08-22.md](https://github.com/firejune/rigc/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 |
764
- | 🧬 [GENERATIONS.md](https://github.com/firejune/rigc/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 |
765
- | 📓 [CASES.md](https://github.com/firejune/rigc/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 |
766
- | 🗺️ [ROADMAP.md](https://github.com/firejune/rigc/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 |
767
- | 📐 [CLAUDE.md](https://github.com/firejune/rigc/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/firejune/rigc/blob/main/CONTRIBUTING.md) calls it worth ten minutes before a first patch. Repository material |
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/firejune/rigc/blob/main/docs/LADDER.md) records
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/firejune/rigc/blob/main/docs/LADDER.md).
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/firejune/rigc/blob/main/docs/BENCHMARK.md).
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/firejune/rigc/blob/main/docs/LADDER.md).
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/firejune/rigc/blob/main/CONTRIBUTING.md) for what a change
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/firejune/rigc/blob/main/RELEASING.md).
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/firejune/rigc/blob/main/docs/GATE.md), which is
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/firejune/rigc/blob/main/docs/LADDER.md), and the enumerated allowed and forbidden lists are in
68
- [bench/runs/README.md](https://github.com/firejune/rigc/blob/main/bench/runs/README.md),
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/firejune/rigc/blob/main/docs/GENERATIONS.md) is
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/firejune/rigc/blob/main/docs/BENCHMARK.md),
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/firejune/rigc/blob/main/docs/LADDER.md): validate
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/firejune/rigc/blob/main/docs/LADDER.md) turns on. If a snippet here matches a reference file,
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/firejune/rigc/blob/main/docs/BENCHMARK.md), which
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/firejune/rigc/tree/main/gallery/squash)'s
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/firejune/rigc/tree/main/gallery/ride)** — a trolley on a drawn rail, moved
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/firejune/rigc/tree/main/gallery/look)** — a face
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/firejune/rigc/tree/main/gallery/walk)** — two mirrored two-bone leg chains
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/firejune/rigc/tree/main/gallery/squash) — a 9-vertex ball squashed about its contact point,
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/firejune/rigc/tree/main/gallery/portrait) — a 2.5D head turn, where the keys are the
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/firejune/rigc/tree/main/gallery/flex) — a leaf whose blade bends on a
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/firejune/rigc/tree/main/gallery/nod) — the
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/firejune/rigc/tree/main/gallery/nod)'s
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/firejune/rigc/issues). The `#555` the message itself cites is the change that made one-per-file an invariant, not a place to file against |
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/firejune/rigc/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`). |
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/firejune/rigc/blob/main/docs/LADDER.md) makes them a finish line you reach once.
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/firejune/rigc/blob/main/docs/LADDER.md); what it *does* seal is a score written
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/firejune/rigc/blob/main/docs/GENERATIONS.md)'s
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/firejune/rigc/blob/main/bench/studies/2026-09-03-visibleshare/README.md)
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/firejune/rigc/blob/main/bench/studies/2026-09-03-visibleshare/README.md).
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/firejune/rigc/blob/main/bench/studies/2026-09-03-visibleshare/README.md)
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