Conversation
The third of the three formats, and the only one not covered by a round-trip test: FsStoryPackWriter and FsStoryPackReader produce and consume the folder that ends up under .content/ on a device. Ten cases, specifications and characterization together. What survives: version, night mode marker, nodes in order, asset bytes exactly and per node, transitions, the shared action node, control settings; an asset used by several nodes is stored once. What does not, pinned as KNOWN GAP: the pack uuid (the writer names the folder by its last eight hex digits, the reader takes the folder name — the library sidesteps this by renaming), the node uuids (no room in the 44-byte record, invented on read), and a missing audio (a silent placeholder comes back). Two cases pin the bytes on disk against the layout verified on a device in FORMATS.md: the 512-byte ni header and 44-byte node records, the 12-byte ri/si entries, li as node indices, .cleartext present, bt absent. The writer refuses anything but a 320x240 RLE bitmap and an ID3-less mono MP3, so the fixtures go through ImageConversion and AudioConversion from a drawn image and a synthesised tone: one MP3 encode per class, and the two converters exercised on the way. No device data. Part of #2 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This was referenced Sep 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
The third of the three formats, and the only one without a round-trip test:
FsStoryPackWriterandFsStoryPackReaderproduce and consume the folder that ends up under.content/on a device.FsPackRoundTripTest, ten cases, specifications and characterization together, in the mould ofBinaryPackRoundTripTestandArchivePackRoundTripTest.What survives: version, night mode marker, nodes in order, asset bytes exactly and per node, transitions, the shared action node, control settings; an asset used by several nodes is stored once (header counts and one file each).
What does not, pinned as
KNOWN GAP:56789ABC.LibraryServicesidesteps this by renaming to<full uuid>.converted_<millis>, which the second case shows works;FIXMEinFsStoryPackReader);Two cases pin the bytes on disk against the layout verified on a real card in
FORMATS.md§5–6 (#59): the 512-byteniheader field by field, the 44-byte node record and its padding, the 12-byteri/sientries (000\00000000),lias node indices,.cleartextpresent,btabsent.Fixtures
The writer refuses anything but a 320×240 4-bit RLE bitmap and an ID3-less mono MP3, so
PackFixtures' pattern bytes cannot be used. The assets go through the project's ownImageConversion.anyToRLECompressedBitmapandAudioConversion.anyToMp3from a drawn image and a synthesised tone — one MP3 encode per class (~0.5 s), and the two converters exercised on the way. No device data, no third-party content.TESTING.mdcoverage map updated with the row. The count row is not touched: it reports the Windows CI figure, which this PR's run will give.Locally:
mvn … test→ 340 run, 0 failures (39 FAT32 opt-in skips).git diff --exit-codeclean.Part of lgnap#2 — remaining there: cross-format conversions,
PackAssetsCompression, failure paths.🤖 Generated with Claude Code