EPUB Metadata: Set Language and Version Before Export

Metadata settings have more than one destination. A value can be accepted by the editor, retained in the saved volume state, returned by an export command, and still be absent from content.opf. The STUDIO-259 evidence makes that distinction visible with one controlled package instead of treating a successful setting response as proof of serialization.

This EPUB metadata language version check used language ja, version 2.59, and publication date 2026-09-03. The stored matrix, the command responses, and the reopened package agree on some fields and deliberately report a gap for another. That gap is part of the result, not something to conceal with a manual OPF edit.

Give Each Metadata Value a Destination

Start with a matrix whose rows are language, version, and publication date. Give it columns for requested input, saved volume state, export response, OPF occurrence, and package status. This prevents a value observed in one layer from being promoted to a claim about every layer.

For the fixed specimen, the expected input row is exact: ja, 2.59, and 2026-09-03. The date must not drift to September 6 or to a timestamp from a different run. The generated EPUB is identified by SHA-256 e81a3e8f5bec75c87940d34c8018a33b651830a368ee758680242677a651141c.

Store the matrix beside the artifact rather than retyping its values into a general project note. The fixed JSON reports the saved volume state, export-response version, and three OPF counts in one record. That proximity reduces the chance that a date from an earlier five-chapter trial is accidentally combined with this one-chapter metadata probe.

Set One Controlled Metadata Row

Rune’s series settings received the manuscript language, while the volume settings received version and publication date. Reading the saved volume state back returned version 2.59 and date 2026-09-03. The export response also returned version 2.59.

Those responses establish persistence at the application and operation layers. They do not answer what the EPUB serialized. To answer that, preserve the output, reopen it as a ZIP package, locate content.opf through the container file, and search the XML by field rather than by a broad text impression.

Language Reaches the OPF

The fixed OPF contains the language value ja once. That is the package-level acceptance point for language. It is stronger than the series-setting response because it shows what the generated book carries, and narrower than a reader claim because no reading application was asked to interpret the field.

When the intended book language differs, do not merely change the OPF after export. Return to the source configuration, set the correct value, generate a new package, and repeat the count. The source-to-package path remains reproducible only when the configuration that produced the artifact is preserved.

The Publication Date Appears Twice

The exact date 2026-09-03 occurs twice in the reopened OPF. The evidence matrix records opf_publish_date_count: 2; reporting zero occurrences or using 2026-09-06 would contradict the stored artifact. Count and context both matter, so inspect the surrounding XML to identify how the two occurrences are used.

This article does not infer how a storefront or reader will display that date. An application may choose one field, apply a locale, or omit the date from its interface. The measured claim is limited to two literal OPF occurrences in the named package.

Version 2.59 Stops Before Serialization

Version 2.59 survived in saved volume state and in the export response, but the literal string occurs zero times in content.opf. Therefore the correct result is not “all metadata was exported.” It is “language and date were found at their measured destinations; version was retained by Rune’s state and response but was not serialized as literal 2.59 in this OPF.”

Do not patch the package to force the string into place. Without an identified schema element and product behavior, that edit could create unsupported metadata and would disappear on regeneration. If OPF carriage of the version is a release requirement, leave that row unresolved and verify the intended mapping in implementation or authoritative product documentation.

Recover When a Destination Is Missing

First confirm that the inspected EPUB is the one produced by the recorded run: match its digest and path. Then compare the saved state, export response, and OPF again. If only one input changed, generate a separate differential package and inspect the same field. Retain the original result so the discrepancy remains reproducible.

A corrected candidate passes only when its required destination is explicitly defined and observed. If version is intended solely as an application revision rather than OPF metadata, document that boundary. If it should serialize, record the exact element or attribute and its value. Do not use package validity as a substitute; valid=true means the local structural inspection passed, not that every requested business field appeared.

Sign Off With the Matrix, Not Memory

The fixed candidate reopened successfully with valid=true, four spine items, navigation and NCX present, no images, and no reported issues. Those structural facts accompany the metadata matrix but do not alter it. Language is one OPF occurrence, the publication date is two, and literal version 2.59 is zero.

The release note should carry the input values, saved readback, export response, OPF counts, EPUB digest, and unresolved requirements. Reader display and retailer ingestion stay unmeasured until tested in those named environments. This layered record lets a second operator reproduce the result without guessing which screen, response, or package value the word “saved” was meant to describe.

If policy requires a version visible to customers, assign that requirement to the correct downstream field instead of assuming the internal volume version provides it. The package inspected here cannot support that customer-facing conclusion. It can support a precise engineering handoff: the application retained 2.59, the exported OPF did not contain that literal, and the next investigation begins at the serialization contract.