Skip to content
Back to skills

061 Architecture 3f28b07b

ASecurity

The PDF-to-EPUB converter uses a layered architecture that clearly separates code by modification policy.

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 11, 2026
code-qualitypythongo

Security analysis

A100/100

Scanned October 11, 2026

npx -y skills add tools-only/X-Skills --skill 061-architecture_3f28b07b --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 061 Architecture 3f28b07b?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 061 Architecture 3f28b07b
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-061-architecture-3f28b07b/badge)](https://www.skillsdirectory.com/skills/tools-only-061-architecture-3f28b07b)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

SKILL.md
# Three-Layer Architecture

The PDF-to-EPUB converter uses a layered architecture that clearly separates code by modification policy.

## Overview

```
┌─────────────────────────────────────────────────────────────────┐
│  Layer 1: FROZEN                                                │
│  ─────────────────────────────────────────────────────────────  │
│  Fixed specifications and deterministic algorithms.             │
│  NEVER modify these files.                                      │
│                                                                 │
│  Files:                                                         │
│  • core/epub_builder.py                                         │
│  • core/text_segmenter.py                                       │
│  • validation/*                                                 │
└─────────────────────────────────────────────────────────────────┘
                              ↓
┌─────────────────────────────────────────────────────────────────┐
│  Layer 2: CONFIGURABLE                                          │
│  ─────────────────────────────────────────────────────────────  │
│  Behavior controlled by configuration parameters.               │
│  ALWAYS try config changes first before touching code.          │
│                                                                 │
│  Parameters:                                                    │
│  • ConversionConfig                                             │
│  • HeadingConfig                                                │
│  • ImageOptimizationConfig                                      │
│  • etc.                                                         │
└─────────────────────────────────────────────────────────────────┘
                              ↓
┌─────────────────────────────────────────────────────────────────┐
│  Layer 3: ADAPTABLE                                             │
│  ─────────────────────────────────────────────────────────────  │
│  Heuristics and strategies that may need tuning.                │
│  CAN modify if configuration doesn't solve the problem.         │
│                                                                 │
│  Files:                                                         │
│  • conversion/strategies/*                                      │
│  • detectors/structure_classifier.py                            │
│  • detectors/reading_order/*                                    │
│  • detectors/footnote_detector.py                               │
└─────────────────────────────────────────────────────────────────┘
```

---

## Layer 1: FROZEN

### Why These Files Cannot Be Modified

| File | Reason |
|------|--------|
| `core/epub_builder.py` | Implements EPUB3 specification. The spec is external and fixed. Changing this breaks EPUB validity. |
| `core/text_segmenter.py` | Uses deterministic chunking (600 chars, 100 overlap). Validation depends on PDF and EPUB being segmented identically. Changing parameters breaks validation. |
| `validation/completeness_checker.py` | Calculates quality metrics. Changing the algorithm makes metrics incomparable across runs. |
| `validation/order_checker.py` | Uses LCS algorithm for order verification. Changing this invalidates historical comparisons. |
| `core/pdf_extractor.py` | PyMuPDF interface. Changes here affect all downstream processing. |

Note: `validation/validator.py` is an orchestration layer and can be modified without changing validation metrics.

### Exception Policy

Only modify FROZEN files if:
1. There's a **fundamental bug** (incorrect implementation of spec)
2. The **specification changes** (new EPUB version)
3. You have **explicit approval** and understand all downstream effects

### Code Markers

These files contain a comment at the top:

```python
# FROZEN: Do not modify - implements fixed specification
# See reference/architecture.md for explanation
```

---

## Layer 2: CONFIGURABLE

### Available Configuration Parameters

```python
@dataclass
class ConversionConfig:
    # Page selection
    page_ranges: PageRanges
    #   - skip: List[int] - pages to skip entirely (e.g., [1, 2] for title)
    #   - content: Tuple[int, int] - main content range (e.g., (3, -3))
    #   - endnotes: Tuple[int, int] - endnotes range (e.g., (-2, -1))

    # Region exclusion
    exclude_regions: ExcludeRegions
    #   - top: float - fraction of page height to exclude (0.05 = 5%)
    #   - bottom: float
    #   - left: float
    #   - right: float

    # Multi-column handling
    multi_column: MultiColumnConfig
    #   - enabled: bool
    #   - column_count: int (1, 2, or 3)
    #   - threshold: float - gap detection sensitivity (0.0-1.0)

    # Reading order algorithm
    reading_order_strategy: str  # "y_sort" or "xy_cut"

    # Heading detection
    heading_detection: HeadingConfig
    #   - font_size_threshold: float - multiplier vs body (1.2 = 20% larger)
    #   - max_heading_levels: int (1-6)

    # Footnote processing
    footnote_processing: FootnoteConfig
    #   - enabled: bool
    #   - patterns: List[str] - regex patterns to match
    #   - generate_backlinks: bool

    # Image handling
    image_optimization: ImageOptimizationConfig
    #   - enabled: bool
    #   - max_width: int (pixels)
    #   - max_height: int (pixels)
    #   - jpeg_quality: int (1-100)
    #   - convert_png_to_jpeg: bool

    # Book metadata
    metadata: BookMetadata
    #   - title: str
    #   - author: str
    #   - language: str (ISO 639-1, e.g., "en")
```

### When to Adjust Configuration

| Problem | Config Parameter | Suggested Change |
|---------|-----------------|------------------|
| Headers/footers in output | `exclude_regions.top/bottom` | Increase to 0.08 |
| Losing page numbers | `exclude_regions.bottom` | Decrease to 0.03 |
| Wrong column order | `reading_order_strategy` | Change to "xy_cut" |
| Columns not detected | `multi_column.threshold` | Decrease to 0.3 |
| Headings missed | `heading_detection.font_size_threshold` | Decrease to 1.1 |
| Images too large | `image_optimization.*` | Reduce max_width |
| Footnotes not linked | `footnote_processing.patterns` | Add custom pattern |

### How to Apply Configuration

```python
# From Python
config = ConversionConfig(
    reading_order_strategy="xy_cut",
    exclude_regions=ExcludeRegions(top=0.08),
    # ... other settings
)
converter.convert(pdf_path, epub_path, config)

# From JSON file
converter.convert(pdf_path, epub_path, config_path="config.json")
```

---

## Layer 3: ADAPTABLE

### Files That Can Be Modified

| File | What You Can Modify | When |
|------|---------------------|------|
| `conversion/strategies/simple_strategy.py` | Override methods for specific PDF types | Config doesn't handle edge case |
| `conversion/strategies/base_strategy.py` | Add new hook methods | Need new processing step |
| `detectors/structure_classifier.py` | Heading detection heuristics | Font patterns non-standard |
| `detectors/reading_order/y_sorter.py` | Sorting logic | Custom layout requirements |
| `detectors/reading_order/xy_cut_sorter.py` | Column detection | Complex multi-column |
| `detectors/footnote_detector.py` | Add patterns to PATTERNS dict | New footnote format |
| `detectors/endnote_formatter.py` | HTML output format | Custom styling needed |

### Code Markers

These files contain a comment at the top:

```python
# ADAPTABLE: Can be modified for specific PDF types
# See reference/code-adaptation.md for guidelines
```

### Modification Guidelines

1. **Create subclass when possible** - don't modify base class
2. **Add, don't replace** - add new patterns, don't remove existing
3. **Test after changes** - run `pytest tests/` to verify
4. **Document changes** - add comment explaining why

### Example: Adding Custom Strategy

```python
# In conversion/strategies/magazine_strategy.py (new file)

from .base_strategy import BaseStrategy

class MagazineStrategy(BaseStrategy):
    """Strategy for magazine-style PDFs with heavy image content."""

    def extract(self, pdf_path, config):
        # Custom extraction prioritizing images
        ...

    def order_blocks(self, blocks, config):
        # Always use xy_cut for magazines
        ...
```

Register in converter.py:
```python
STRATEGY_REGISTRY = {
    "simple": SimpleStrategy,
    "magazine": MagazineStrategy,  # Add this
}
```

---

## Decision Flow

When facing a conversion problem:

```
1. IDENTIFY the problem
   └─► Validation tells you: completeness? order? headings?

2. TRY CONFIGURATION (Layer 2)
   └─► Adjust relevant parameters
   └─► Re-run conversion
   └─► Re-validate
   └─► Repeat up to 2-3 times with different values

3. IF CONFIG FAILS → MODIFY CODE (Layer 3)
   └─► Identify which ADAPTABLE file to change
   └─► Make minimal change
   └─► Test thoroughly
   └─► Document the change

4. NEVER TOUCH FROZEN FILES (Layer 1)
   └─► If you think you need to, you're probably wrong
   └─► Ask for help instead
```

---

## Why This Architecture?

### Benefits

1. **Prevents breaking changes** - Core algorithms are protected
2. **Encourages configuration** - Most problems solvable without code
3. **Safe experimentation** - ADAPTABLE files are isolated
4. **Clear boundaries** - Easy to know what's safe to change
5. **Reproducible results** - FROZEN validation ensures consistency

### Trade-offs

1. **Some flexibility lost** - Can't customize core algorithms
2. **Learning curve** - Need to understand layer boundaries
3. **More files** - Separation adds complexity

The benefits outweigh the costs for a tool that needs to be reliable and maintainable.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.