From 281764a6045f7bee3271dc5b0be6e97c792e9625 Mon Sep 17 00:00:00 2001 From: firejune Date: Sun, 6 Sep 2026 18:50:41 +0900 Subject: [PATCH 1/7] docs: a rough roadmap to 1.0, and the road so far MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Deliberately short and undated. The standing rule here is that direction comes from what users hit rather than from what this repository predicts, and writing a roadmap does not suspend it β€” so the file says that outright and lists conditions that have to become true rather than work booked in advance. What 1.0 means is one thing: the input spec stops moving. Pre-1.0 a spec change is a minor bump and nobody pays; after 1.0 the author of a rig spec pays, so the number should not be claimed until the surface has earned it. The input spec changed in four of the last nine releases, which is the measurement behind the goals rather than a complaint about them. Four goals, each with an exit rather than a date: real art has used the new surface, the spec has stopped growing on its own initiative, every claim the repository makes about itself is derived, and the published package works on a machine that has never seen this repository. The first gates the second, which is why the order is what it is. What is explicitly not in 1.0 is written down too, because leaving it out is how a roadmap grows by inference: the format-agnostic core comes after the feature work, full coverage of the 4.3 surface is a separate axis, and the dated research notes stay dated. 1.0 is not everything works; it is that the boundary is honest and stable. The history is in the same register and carries no counts, since counts drift the moment they are written and LADDER.md and the CHANGELOG hold the real record. Its last phase is the third goal, still open, which is the seam between the two halves of the file. Linked from the README's documentation table. Co-Authored-By: Claude Opus 5 --- README.md | 1 + ROADMAP.md | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 ROADMAP.md diff --git a/README.md b/README.md index abbd23b..5c7ebad 100644 --- a/README.md +++ b/README.md @@ -575,6 +575,7 @@ letting `A17` blame the editor for the harness's own doing. | πŸ”¬ **[docs/SPEC_COVERAGE.md](docs/SPEC_COVERAGE.md)** | Spine 4.3's full export surface against what rigc emits and what the official examples measurably use, with the ordered gap list | | πŸŽ“ **[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 41 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 | | πŸ“‹ [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 | +| πŸ—ΊοΈ [ROADMAP.md](https://github.com/firejune/rigc/blob/main/ROADMAP.md) | where this is going, and where it has been. What 1.0 has to mean before the number is claimed β€” conditions rather than a feature list, because direction here comes from what users hit | ## Why you can trust the output diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 0000000..731c611 --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,103 @@ +# Roadmap to 1.0 + +Rough, and deliberately so. No dates, no feature list. + +## The road so far + +Rough too, and in order rather than by date. [LADDER.md](docs/LADDER.md) and +the [CHANGELOG](CHANGELOG.md) hold what actually happened. + +- **Split out of a game project's sandbox.** The first commit is a rig compiler + v0 carved off a working project. The split moved the cut-specific *files* out + and left the *code* still knowing about one set of art; closing that took its + own pass, and the rule it left behind is that anything only a person who has + seen that art could understand belongs with the consumer. +- **The ladder.** Spine's own numbered example projects, taken as a difficulty + ladder with spineboy as the graduation exam. All of it cleared, and the rungs + stay in place as regression gates rather than being retired. +- **The gate was put under the gate.** A rung's pass was withdrawn when a + tolerance change moved the box a set is measured in, then restored after the + gate answered the two questions that exposed. The instrument being measurable + by something other than itself is the part worth keeping. +- **Published, and packaged for an agent.** A registry package with an + allowlist rather than the whole tree, and the authoring guide shipped inside + it, because the tool's user is something that reads documentation at runtime. +- **A gallery, and films of it.** Worked examples built to be read, and short + films assembled from them. Making them was the best defect-finder the project + has had β€” most of the examples found a real bug on their first build. +- **The face.** Depth input, the fold angle a depth map can support, and Spine's + own `slider`, which turns a face angle into a **value** instead of a moment on + a timeline. The object offers a dial; the consumer decides when to turn it. +- **Currency.** Gates pointed at the repository's own claims β€” its counts, its + quoted output, the transcripts in its documentation β€” after several of them + were found stale in a row. That work is the third goal below, still open. + +## What 1.0 means here + +**The input spec stops moving.** + +Everything else about a version number is bookkeeping; that one thing is a +promise to whoever writes a rig spec. Today it costs nothing to break β€” the +package is pre-1.0, so a spec change is a minor bump and nobody pays. After +1.0 the author pays, so the number should not be claimed until the surface has +earned it. + +β›” **This file does not set direction.** Direction comes from what users hit, +not from what this repository predicts, and the standing rule against a +prediction-driven roadmap is not suspended by writing one down. What follows +is a list of **conditions that have to become true** before the promise above +can honestly be made β€” not work booked in advance. + +## The goals + +### Real art has used the new surface + +Every construct added recently β€” depth input, the turn ceiling, sliders, +parameter-driven faces β€” is measured only against generated fixtures. A +registered cuts run comes back green and touches none of them, because the +cuts predate them. A spec frozen at 1.0 that real art has never exercised is a +prediction, not a measurement. + +**Done when** each construct has at least one cut of real art compiling +through it. + +This gates the next goal and is the reason the order is what it is. + +### The spec has stopped growing on its own initiative + +The input surface still grows most weeks, and it grows because this repository +is exploring, not because an author asked for something and could not express +it. + +**Done when** changes to the rig and motion specs come from a need somebody +reported, over enough consecutive releases to be a pattern rather than a lull. + +### Every claim the repository makes about itself is derived + +A version that says *this documentation is true* cannot keep any claim a human +maintains by hand. Counts, quoted transcripts, coverage figures, invisible +markers: each is a place the tool and the page can part in silence. + +**Done when** nothing load-bearing is hand-maintained, and the derivations +themselves are asserted β€” a scanner that stops matching goes quiet, not red. + +### The published package works on a machine that has never seen this repo + +The tree can be green while the installed package throws, because the package +is an allowlist and the repository is not. Nothing in the tree fails when a +module is added and not listed. + +**Done when** installing from the registry and running a build is checked +mechanically, every release. + +## Not in 1.0 + +- **A format-agnostic core with its own backend.** Ruled to come after the + feature work rather than during it, and nothing here changes that. +- **Full coverage of the Spine 4.3 format.** 1.0 is not *everything works*, it + is **the boundary is honest and stable**: what rigc emits, it emits + correctly, and what it does not, it refuses by name. Coverage is a separate + axis and is allowed to keep moving after 1.0. +- **Rewriting the dated research notes.** A note stamped with the day it was + measured is doing its job; making it current would make it a live claim, and + live claims have to be derived. From d2d9864eff87888413a5f7c8a33abbf5aeba9f92 Mon Sep 17 00:00:00 2001 From: firejune Date: Sun, 6 Sep 2026 20:56:51 +0900 Subject: [PATCH 2/7] docs(roadmap): say what the project is for, and that Spine is a backend MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The file stated what 1.0 means procedurally and never stated what the work is for, which let Spine read as the centre of it rather than as one supported tool. The end state is rigging and animation produced by an AI with no human hands. rigc links spine-core for a narrower reason than allegiance to a format: everything written to disk has to have been read back by a parser rigc did not write, and that is what makes the output trustworthy. That is an oracle, not a dependency, and another backend does not need permission β€” it needs an oracle of its own, which is the larger half of building one. The 1.0 promise is unchanged and its reason improves. The rig and motion specs are the part that belongs to no backend, so a format can be swapped under a spec that holds still and cannot be swapped under one that does not. One consequence is stated because an earlier framing said the opposite: the goal is not an AI draft a person finishes by hand. An editor round trip is how a result gets checked, not where it gets finished. Co-Authored-By: Claude Opus 5 --- ROADMAP.md | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 731c611..c778091 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -2,6 +2,26 @@ Rough, and deliberately so. No dates, no feature list. +## What this is for + +**Rigging and animation produced by an AI, with no human hands.** That is the +end state. Everything below is either a step toward it or a way of knowing +whether a step worked. + +Spine is **one tool this supports, not what this is.** rigc links `spine-core` +today for a narrower reason than allegiance to a format: everything written to +disk has to have been read back by a parser rigc did not write, and that is +the only thing making the output trustworthy. That is an **oracle, not a +dependency**, and the distinction is the whole difference between a backend and +a commitment. Another backend does not need permission β€” it needs its own +oracle, and shipping one without that is the thing the doctrine refuses. + +⚠️ One consequence worth stating, because an earlier framing said the opposite: +the goal is not an AI draft that a person then finishes by hand. A round trip +through the editor is how a result gets **checked**, not where it gets +finished. Where a face angle became a value rather than a moment on a +timeline, that was the direction β€” nobody keys it. + ## The road so far Rough too, and in order rather than by date. [LADDER.md](docs/LADDER.md) and @@ -37,7 +57,10 @@ the [CHANGELOG](CHANGELOG.md) hold what actually happened. **The input spec stops moving.** Everything else about a version number is bookkeeping; that one thing is a -promise to whoever writes a rig spec. Today it costs nothing to break β€” the +promise to whoever writes a rig spec β€” and it is the promise that survives the +goal above, because the rig and motion specs are the part that does not belong +to any one backend. A format can be swapped under a spec that holds still. It +cannot be swapped under one that does not. Today it costs nothing to break β€” the package is pre-1.0, so a spec change is a minor bump and nobody pays. After 1.0 the author pays, so the number should not be claimed until the surface has earned it. @@ -92,8 +115,10 @@ mechanically, every release. ## Not in 1.0 -- **A format-agnostic core with its own backend.** Ruled to come after the - feature work rather than during it, and nothing here changes that. +- **A second backend.** Not because Spine is the point β€” it is not β€” but + because the sequencing was ruled: the feature work first, the core split + after. A backend also needs an oracle of its own before it can ship, and + building that is the larger half of the job. - **Full coverage of the Spine 4.3 format.** 1.0 is not *everything works*, it is **the boundary is honest and stable**: what rigc emits, it emits correctly, and what it does not, it refuses by name. Coverage is a separate From d02d38e21924abf05d83822b0451322bcd327283 Mon Sep 17 00:00:00 2001 From: firejune Date: Sun, 6 Sep 2026 21:01:51 +0900 Subject: [PATCH 3/7] docs(roadmap): coverage follows from what authors need, it is not a direction Calling coverage "a separate axis" made covering someone else's format into a direction this project travels. It is not one. Coverage follows from what an author needs to express, and a construct nobody has asked for is not a gap. Co-Authored-By: Claude Opus 5 --- ROADMAP.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index c778091..12367d6 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -121,8 +121,9 @@ mechanically, every release. building that is the larger half of the job. - **Full coverage of the Spine 4.3 format.** 1.0 is not *everything works*, it is **the boundary is honest and stable**: what rigc emits, it emits - correctly, and what it does not, it refuses by name. Coverage is a separate - axis and is allowed to keep moving after 1.0. + correctly, and what it does not, it refuses by name. Coverage follows from + what authors need to express β€” it is not a direction of its own, and a + construct nobody has asked for is not a gap. - **Rewriting the dated research notes.** A note stamped with the day it was measured is doing its job; making it current would make it a live claim, and live claims have to be derived. From c033f88ebb0d6809f615862a4577ec7cedaf83d8 Mon Sep 17 00:00:00 2001 From: firejune Date: Sun, 6 Sep 2026 21:05:43 +0900 Subject: [PATCH 4/7] docs(roadmap): the milestone is the second oracle, not the second backend MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A statement that treats Spine as already optional is ahead of the code rather than describing it. spine-core is the oracle today as a fact: nothing rigc writes is trusted until a parser rigc did not write has read it back, and the benchmark ladder is an oracle in the same sense β€” art this project did not author and answers it cannot tune to. Neither is deference; both are the only independent check there is. The frame changes at one moment, when the core can be its own oracle. Not when a second backend can emit: emitting is the easy half and output nobody can check is worth nothing. Co-Authored-By: Claude Opus 5 --- ROADMAP.md | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 12367d6..c955efe 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -22,6 +22,26 @@ through the editor is how a result gets **checked**, not where it gets finished. Where a face angle became a value rather than a moment on a timeline, that was the direction β€” nobody keys it. +## What changes the frame + +Today `spine-core` is the oracle, and that is **a fact about the code, not a +preference**: nothing rigc writes is trusted until a parser rigc did not write +has read it back. So a sentence that treats Spine as already optional is ahead +of the code rather than describing it, and the benchmark ladder β€” Spine's own +example projects, art this project did not author and answers it cannot tune +to β€” is an oracle in exactly the same sense. Neither is deference. Both are +the only independent check there is right now. + +The frame changes at one moment: **when this project's own core can be its own +oracle.** Not when a second backend can emit β€” emitting is the easy half, and +output nobody can check is worth nothing. When there is an independent check on +the core's own format, Spine becomes one backend among several *as a fact* +rather than as an intent. + +β‡’ **The milestone is not the second backend. It is the second oracle.** That is +the long-term feature's real content, and it is why the sequencing puts it +after the rest rather than beside it. + ## The road so far Rough too, and in order rather than by date. [LADDER.md](docs/LADDER.md) and @@ -115,10 +135,10 @@ mechanically, every release. ## Not in 1.0 -- **A second backend.** Not because Spine is the point β€” it is not β€” but - because the sequencing was ruled: the feature work first, the core split - after. A backend also needs an oracle of its own before it can ship, and - building that is the larger half of the job. +- **A second oracle, and the backend behind it.** Not because Spine is the + point β€” it is not β€” but because the sequencing was ruled: the feature work + first, the core split after. See *What changes the frame*: the emitting is + the easy half. - **Full coverage of the Spine 4.3 format.** 1.0 is not *everything works*, it is **the boundary is honest and stable**: what rigc emits, it emits correctly, and what it does not, it refuses by name. Coverage follows from From 6e306e86047c354dd242ecc5381e823e9e66b312 Mon Sep 17 00:00:00 2001 From: firejune Date: Sun, 6 Sep 2026 21:10:42 +0900 Subject: [PATCH 5/7] docs(roadmap): the three places a hand is the wrong instrument, and where each stands MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The file said what the project is for and never said where it expects to be better than the alternative. Three places, chosen for being the ones a hand is the wrong instrument in rather than for being hard: vertex work at a density posing cannot reach, jiggle tension as a property of a region rather than a curve somebody drew, and turning a flat drawing through an angle it was never drawn at. The line that makes the claim checkable is posing. Writing the brief is not a hand and choosing the art is not a hand; making a pose is. Every neighbouring tool has a person making poses somewhere, and this one is trying not to at any layer β€” which a run can be measured against rather than only asserted. None of the three is proven end-to-end, so the first goal now carries where each stands instead of implying it: the vertex gate holds at densities the artifact cannot, nothing yet measures whether a jiggle is right, and on measured depth noise is also a slope so the reported angle may be set by sampling rather than shape. Two of the three are blocked outside the compiler, which makes the differentiator and the oracle question the same question. Co-Authored-By: Claude Opus 5 --- ROADMAP.md | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/ROADMAP.md b/ROADMAP.md index c955efe..3c668ab 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -16,6 +16,32 @@ dependency**, and the distinction is the whole difference between a backend and a commitment. Another backend does not need permission β€” it needs its own oracle, and shipping one without that is the thing the doctrine refuses. +### Where the machine is better, which is the whole bet + +Three places, and they are not chosen for being hard β€” they are chosen for +being **the places a hand is the wrong instrument**: + +- **Vertex work.** Geometry dense enough that posing it by hand is not slow, it + is impossible. +- **Jiggle tension.** How a soft region answers an impulse, as a property of + the region rather than a curve somebody drew. +- **2.5D look and feel.** Turning a flat drawing through an angle it was never + drawn at, from a depth the art carries. + +⭐ **The line that makes this checkable is posing.** Writing the brief is not a +hand. Choosing the art is not a hand. *Making a pose* is. Every neighbouring +tool has a person making poses somewhere β€” key forms, key poses β€” and this one +is trying not to, at any layer. That is a claim a run can be measured against +rather than a slogan. + +⚠️ None of the three is proven end-to-end yet, and the honest statement of +where each stands belongs with the first goal below rather than here. Two of +them are additionally blocked by something outside the compiler: at the density +that makes vertex work worth doing, a deform key is megabytes, which the +current backend cannot carry. **The differentiator and the oracle question are +the same question**, which is the strongest argument for the sequencing there +is. + ⚠️ One consequence worth stating, because an earlier framing said the opposite: the goal is not an AI draft that a person then finishes by hand. A round trip through the editor is how a result gets **checked**, not where it gets @@ -102,7 +128,21 @@ cuts predate them. A spec frozen at 1.0 that real art has never exercised is a prediction, not a measurement. **Done when** each construct has at least one cut of real art compiling -through it. +through it, and each of the three bets above has a run behind it with **no +hand-made pose at any layer**. + +Where they stand, stated rather than implied: + +- **Vertex work** β€” the gate holds at densities far past what a hand reaches, + and the artifact does not: at that density a deform key is megabytes. The + compiler is not the limit; the backend is. +- **Jiggle tension** β€” emitted and gated for *structure*. Nothing yet measures + whether a jiggle is **right**, and a gate that cannot fail on a wrong one is + not a gate. +- **2.5D** β€” the angle a depth map supports is derived in closed form and + reported before anything is animated. On measured depth, though, **noise is + also a slope**, so the reported angle could be set by sampling rather than by + shape. Unverified. This gates the next goal and is the reason the order is what it is. From eb88d2d1614347e5ca03ae5eb306c79d5a122e21 Mon Sep 17 00:00:00 2001 From: firejune Date: Sun, 6 Sep 2026 21:18:29 +0900 Subject: [PATCH 6/7] docs(roadmap): real art means the consumer that is waiting, not a back catalogue The first goal said real art without saying whose, which leaves it satisfiable by whatever is nearest to hand. A project is waiting on rigc to become usable before it starts, and its art is the one this goal is about. That is also what makes the first goal gate the second: a spec declared finished against art chosen after the fact to fit it has not been tested by anything. Co-Authored-By: Claude Opus 5 --- ROADMAP.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ROADMAP.md b/ROADMAP.md index 3c668ab..63e96c9 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -144,6 +144,12 @@ Where they stand, stated rather than implied: also a slope**, so the reported angle could be set by sampling rather than by shape. Unverified. +⭐ **"Real art" has a specific meaning, and it is not this repository's own +fixtures or anyone's back catalogue.** A project is waiting on rigc to become +usable before it starts, and its art is what this goal is about. That is also +what makes the first goal gate the second: a spec cannot be declared finished +against art chosen after the fact to fit it. + This gates the next goal and is the reason the order is what it is. ### The spec has stopped growing on its own initiative From fc779d990db96904db0e1986a4cecc7b049f5e13 Mon Sep 17 00:00:00 2001 From: firejune Date: Sun, 6 Sep 2026 21:26:08 +0900 Subject: [PATCH 7/7] docs(roadmap): the three bets are the input to the format question, not a detour MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sequencing the core after the feature work already had one reason β€” a format cannot be designed for constructs nobody has discovered. It has a second and better one: proving 2.5D on real art is exactly the experiment that asks whether a deform should be stored as offsets or evaluated from a depth and an angle, and jiggle asks the same of an impulse response. So the representation question is not deferred by the sequencing, it is answered by it. Running both tracks at once would mean guessing in two places instead of measuring in one. Co-Authored-By: Claude Opus 5 --- ROADMAP.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ROADMAP.md b/ROADMAP.md index 63e96c9..88fb9f5 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -68,6 +68,14 @@ rather than as an intent. the long-term feature's real content, and it is why the sequencing puts it after the rest rather than beside it. +⭐ And *after*, not *beside*, for a second reason: **the three bets are the +input to the format question, not a detour around it.** Proving 2.5D on real +art is exactly the experiment that asks whether a deform should be stored as +offsets or evaluated from a depth and an angle, and jiggle asks the same thing +of an impulse response. Starting a format before those answers arrive would be +designing a container for contents nobody has measured β€” and running both +tracks at once would only mean guessing in two places instead of one. + ## The road so far Rough too, and in order rather than by date. [LADDER.md](docs/LADDER.md) and