Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,10 @@ When `input_format` is omitted, Renderflow auto-detects the format from the file

These document-source outputs are reflowable. The exact
[fixed-layout EPUB route](docs/user-guide/fixed-layout-epub.md) uses an explicit,
ordered PNG or JPEG collection with its own policy and publication metadata.
ordered PNG or JPEG collection with its own bounded policy and publication
metadata. `renderflow ebook inspect` checks the package structure and reports
typed evidence; optional local EPUBCheck v5 supplies separate conformance
evidence when available. SVG input and fixed-layout KEPUB are unsupported.

Not every input → output combination is supported. For example, `epub` and `latex` inputs cannot currently be converted to `docx`. Renderflow reports a clear error when an unsupported combination is specified.

Expand Down
26 changes: 25 additions & 1 deletion ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ schema: aether.architecture-document/v1
id: renderflow-roadmap
title: Renderflow Roadmap
kind: architecture-document
version: 0.1.5
version: 0.1.6
status: draft
owners:
- egohygiene
Expand All @@ -26,6 +26,30 @@ supersedes: []

# Renderflow Roadmap

## 2026-09-28 fixed-layout EPUB validation review handoff

[#417](https://github.com/egohygiene/renderflow/issues/417) merged in
[PR #435](https://github.com/egohygiene/renderflow/pull/435) at
`eaf3b98d4236a74ba30b6e40456cbf9757675a76`. Its in-process packager
builds deterministic, bounded fixed-layout EPUB from an explicitly ordered
homogeneous PNG or JPEG collection. SVG and fixed-layout KEPUB remain
unsupported. The #418 validation suite uses synthetic artwork only.

[#418](https://github.com/egohygiene/renderflow/issues/418) is the current
review checkpoint: inspect the generated package independently, distinguish
native structural results from optional EPUBCheck v5 results and unavailable
providers, exercise positive and adversarial synthetic fixtures, and align the
capability surfaces with that exact route. Missing or incomplete accessibility
evidence cannot be promoted to a claim of complete accessibility. A generated
EPUB still needs its selected reading-system and distribution-channel review.

After #418 review and merge, reconcile and close parent
[#414](https://github.com/egohygiene/renderflow/issues/414) with commit and
workflow evidence. [#419](https://github.com/egohygiene/renderflow/issues/419)
then owns the immutable integration-candidate release for
[Flow #52](https://github.com/egohygiene/flow/issues/52). The release is a
separate checkpoint; this branch does not publish or approve it.

## 2026-09-28 fixed-layout EPUB implementation handoff

[#417](https://github.com/egohygiene/renderflow/issues/417) adds the exact
Expand Down
1 change: 1 addition & 0 deletions crates/renderflow-cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ renderflow = { path = "../renderflow-core", package = "renderflow" }
tempfile = "3"
serde_json = "1"
sha2 = "0.10"
zip = { version = "2.4", default-features = false, features = ["deflate"] }

[[test]]
name = "cli_tests"
Expand Down
1 change: 1 addition & 0 deletions crates/renderflow-core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ petgraph = "0.8"

tempfile = "3"
zip = { version = "2.4", default-features = false, features = ["deflate"] }
roxmltree = "=0.20.0"

ureq = { version = "2", features = ["json"] }

Expand Down
2 changes: 1 addition & 1 deletion crates/renderflow-core/data/tool-registry.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ tools:
fidelity: lossless
support_tier: experimental
license_notes: "In-process Renderflow implementation; see the Renderflow repository license."
distribution_notes: "Exact bounded ordered-page PNG/JPEG route only; SVG, reflowable EPUB, fixed-layout KEPUB, retailer acceptance, and independent EPUB 3.3 conformance are separate contracts."
distribution_notes: "Exact bounded ordered-page PNG/JPEG route only; SVG, reflowable EPUB, fixed-layout KEPUB, retailer acceptance, and optional EPUBCheck conformance are separate contracts."

- id: tool.lulu-rules
name: Pinned Lulu publication rule pack
Expand Down
10 changes: 9 additions & 1 deletion crates/renderflow-core/src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,15 @@ pub fn run_cli(cli: Cli) -> Result<()> {
input,
format,
epubcheck,
} => commands::ebook::run_inspect(&input, &format, epubcheck)?,
fixed_layout,
run_manifest,
} => commands::ebook::run_inspect(
&input,
&format,
epubcheck,
fixed_layout,
run_manifest.as_deref(),
)?,
EbookCommands::Capabilities { format } => commands::ebook::run_capabilities(&format)?,
},
Some(Commands::Publication { subcommand }) => match subcommand {
Expand Down
6 changes: 6 additions & 0 deletions crates/renderflow-core/src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -525,6 +525,12 @@ pub enum EbookCommands {
/// Run the optional local EPUBCheck provider and include its report.
#[arg(long)]
epubcheck: bool,
/// Require exact native validation of the ordered PNG/JPEG fixed-layout route.
#[arg(long)]
fixed_layout: bool,
/// Bind the inspected EPUB to an explicit completed run manifest.
#[arg(long, value_name = "FILE")]
run_manifest: Option<String>,
},
/// Print the honest built-in EPUB/KEPUB capability contract.
Capabilities {
Expand Down
48 changes: 44 additions & 4 deletions crates/renderflow-core/src/commands/ebook.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,53 @@ use std::path::Path;

use anyhow::Result;

use crate::ebook::{inspect_ebook, EbookCapabilityContract};
use crate::ebook::{
inspect_ebook, inspect_ebook_with_manifest, EbookCapabilityContract, EbookDiagnostic,
EbookDiagnosticSeverity, FixedLayoutStatus,
};

pub fn run_inspect(input: &str, format: &str, epubcheck: bool) -> Result<()> {
let inspection = inspect_ebook(Path::new(input), epubcheck)?;
pub fn run_inspect(
input: &str,
format: &str,
epubcheck: bool,
fixed_layout: bool,
run_manifest: Option<&str>,
) -> Result<()> {
if (fixed_layout || run_manifest.is_some())
&& std::fs::metadata(input)?.len() > 512 * 1024 * 1024 + 1024 * 1024
{
anyhow::bail!(
"ebook.fixed_layout.bounds: EPUB file exceeds the exact route inspection bound"
);
}
let mut inspection = match run_manifest {
Some(manifest) => {
inspect_ebook_with_manifest(Path::new(input), epubcheck, Path::new(manifest))?
}
None => inspect_ebook(Path::new(input), epubcheck)?,
};
if fixed_layout
&& !matches!(
inspection.fixed_layout.as_ref().map(|item| item.status),
Some(FixedLayoutStatus::Validated)
)
{
if !matches!(
inspection.fixed_layout.as_ref().map(|item| item.status),
Some(FixedLayoutStatus::Invalid)
) {
inspection.diagnostics.push(EbookDiagnostic {
severity: EbookDiagnosticSeverity::Error,
code: "ebook.fixed_layout.unsupported".to_string(),
message: "EPUB does not satisfy the exact ordered PNG/JPEG fixed-layout route"
.to_string(),
});
}
inspection.valid = false;
}
emit(&inspection, format)?;
if !inspection.valid
|| inspection.epubcheck.as_ref().and_then(|item| item.passed) == Some(false)
|| (epubcheck && inspection.epubcheck.as_ref().and_then(|item| item.passed) != Some(true))
{
anyhow::bail!("e-book validation failed; see emitted evidence");
}
Expand Down
Loading
Loading