Skip to content

chore: sync with upstream nnnotes main (12df2a6) - #2

Merged
nichinichisou0609 merged 12 commits into
mainfrom
sync/upstream-20260930
Sep 29, 2026
Merged

nichinichisou0609 merged 12 commits into
mainfrom
sync/upstream-20260930

Conversation

@nichinichisou0609

Copy link
Copy Markdown

Summary

Merges upstream MetaSekaiLab/nnnotes main at 12df2a6 into this fork (a merge commit, no rebase): 0.1.2, nnnotes music-data with the deck model built in (nnnotes._deck, Rust via maturin), the play scenarios (MetaSekaiLab#5) and --decoded-master (MetaSekaiLab#6). The fork was at upstream 0.1.1 plus the story site commits.

  • .github/workflows/ci.yml (the only conflict): upstream's action versions, Swatinem/rust-cache@v2 and rust job, with the fork's uv pip install steps.
  • .github/workflows/story-site.yml: Swatinem/rust-cache@v2 before the install, which now builds nnnotes._deck.
  • pyproject.toml merged by itself (maturin build backend; the fork's UnityPy comment kept).
  • Upstream's .github/workflows/deck.yml (opens deck pin PRs) comes along; it will be disabled in this fork with gh workflow disable, the file kept.

Test plan

  • CI: test (3.11 / 3.12 / 3.13), goldens, rust, commitlint

Generated with Claude Code

nichinichisou0609 and others added 12 commits September 28, 2026 01:11
script_class returned an error for a component whose m_Script is null; it now returns None, so
prefabs that keep such a component export normally.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A room with no nodes or buffers produced empty glTF arrays and an empty BIN chunk, which glTF
validators reject. Empty arrays are now left out, and a room without geometry is a scene without
nodes in a file without the BIN chunk. Rooms with geometry are written byte for byte as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Several `nnnotes story` processes sharing one `--models` directory could remove a model another
process had just installed, or read one while it was being replaced, and fail. A model is now
installed in one rename; when another process installs the same model first, its copy is kept
(exports are byte-identical) and this one is dropped. `--force` moves the previous directory aside
before installing, and a reader that finds the directory gone in between exports the model itself.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every story episode is exported and checked one by one, every spot and room background exports
and validates as glTF, and full multi-region site builds are byte-identical across two runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The actions ran on the deprecated Node.js 20 runtime: checkout v7, setup-python v7, setup-node v7,
upload-artifact v7, download-artifact v8 and action-gh-release v3 run on Node.js 24. Artifacts are
downloaded by name, which the path change of download-artifact v5 leaves as it was.

commitlint runs on Node.js 22 (20 is past its end of life).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`nnnotes songs` writes one canonical JSON file (nnnotes.songs/1) with every
live song of a master data version: titles, readings and credits in the five
text languages, bands, vocal characters, category, tags, release time, the
BGM cue and its length read from the ACB, and per difficulty the level,
note counts by operate type, BPM, note times, music length, skill events and
fevers. It joins a deck data file of the same version by score id.
`--jackets DIR` also writes every song's jacket as WebP.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`nnnotes music-data` replaces `songs` and `deck-data`: one canonical JSON file
(nnnotes.music-data/1) with every song's metadata, every chart's facts and, per
chart, the deck statistics of ournotes-deck (chart-stats/2: whole-live
simulation, Gekisou on, per seed). The deck model is built into nnnotes as the
PyO3 extension nnnotes._deck, pinned to one ournotes-deck commit in
rust/Cargo.toml, so one nnnotes version always carries one deck model; its
results are checked against the chart facts (notes, times, missions, skill
events, fevers) and a mismatch fails the export. `--full` adds the deck input
(the master subset and every chart), `--no-deck` leaves the statistics out.

The build moves to maturin: abi3 wheels for Python 3.11+ on Linux, Windows and
macOS, and an sdist with the Rust sources. The deck workflow opens a pull
request when ournotes-deck's main moves past the pinned commit.

BREAKING CHANGE: the `songs` and `deck-data` commands and their formats are
gone; `music-data` writes both in one file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t play

The deck model moves to ournotes-deck d4abb52 (chart-stats scenarios). Every chart's `deck`
carries `offSeeds`, the chart measured with Gekisou off as a solo live plays; its ranges carry
`rankBonusPercents` and its seeds `rangeWeights`, `rankCheck`, `scorePerfect` and
`rangeScorePerfect`, from which a page derives a Gekisou live at any ranks and a Just rate.

The statistics are checked against the master data and themselves: the rank bonus percentages
against the MasterLiveGekisouRankingScoreBonus rows of the song's mission pattern, every rank
bonus against trunc(rangeScore * percent / 100), the Perfect play of a chart without Just notes
against the play, the array shapes, one Gekisou off seed, and every check and rank check within
its bound. docs/music-data.md and the schema describe the new fields (optional in the schema:
older files do not have them).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ed-master)

`nnnotes music-data --decoded-master` reads master data decoded elsewhere, the directory the
other commands read (`[paths] master`, `--master`, `[servers.<region>] master`): one
`<Table>.json` per table and the `MasterManifest.json` of the files they were decoded from, as a
master data snapshot published with its manifest carries it. No master key is needed, so a
workflow can build the file from such a snapshot without the key.

The master data version and each table's SHA-256 are the manifest's (the decoded tables cannot
be checked against the files as served); `master.source` stays `api`, and the file is byte for
byte the one `--master-files` writes from the same files. A missing manifest, an unlisted table,
a table without a SHA-256 in the manifest, a missing or unreadable table stop the command as
before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream MetaSekaiLab/nnnotes main 12df2a6: 0.1.2, the music-data command with the deck model
nnnotes._deck (Rust, maturin), its play scenarios and --decoded-master.

ci.yml: upstream's actions, Rust cache and rust job, with this fork's uv installs.
story-site.yml: the Rust cache for the install, which now builds nnnotes._deck.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@nichinichisou0609
nichinichisou0609 merged commit fdb7073 into main Sep 29, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant