Home / Input Output / formal-ledger-specifications
Jun 29, 4-5 AM (0)
Jun 29, 5-6 AM (0)
Jun 29, 6-7 AM (0)
Jun 29, 7-8 AM (0)
Jun 29, 8-9 AM (0)
Jun 29, 9-10 AM (0)
Jun 29, 10-11 AM (0)
Jun 29, 11-12 PM (0)
Jun 29, 12-1 PM (0)
Jun 29, 1-2 PM (0)
Jun 29, 2-3 PM (0)
Jun 29, 3-4 PM (0)
Jun 29, 4-5 PM (0)
Jun 29, 5-6 PM (0)
Jun 29, 6-7 PM (0)
Jun 29, 7-8 PM (0)
Jun 29, 8-9 PM (1)
Jun 29, 9-10 PM (0)
Jun 29, 10-11 PM (0)
Jun 29, 11-12 AM (0)
Jun 30, 12-1 AM (0)
Jun 30, 1-2 AM (0)
Jun 30, 2-3 AM (0)
Jun 30, 3-4 AM (1)
Jun 30, 4-5 AM (0)
Jun 30, 5-6 AM (0)
Jun 30, 6-7 AM (0)
Jun 30, 7-8 AM (2)
Jun 30, 8-9 AM (5)
Jun 30, 9-10 AM (1)
Jun 30, 10-11 AM (0)
Jun 30, 11-12 PM (0)
Jun 30, 12-1 PM (0)
Jun 30, 1-2 PM (0)
Jun 30, 2-3 PM (1)
Jun 30, 3-4 PM (0)
Jun 30, 4-5 PM (0)
Jun 30, 5-6 PM (0)
Jun 30, 6-7 PM (0)
Jun 30, 7-8 PM (0)
Jun 30, 8-9 PM (1)
Jun 30, 9-10 PM (0)
Jun 30, 10-11 PM (0)
Jun 30, 11-12 AM (0)
Jul 01, 12-1 AM (2)
Jul 01, 1-2 AM (0)
Jul 01, 2-3 AM (1)
Jul 01, 3-4 AM (2)
Jul 01, 4-5 AM (0)
Jul 01, 5-6 AM (0)
Jul 01, 6-7 AM (0)
Jul 01, 7-8 AM (0)
Jul 01, 8-9 AM (1)
Jul 01, 9-10 AM (0)
Jul 01, 10-11 AM (0)
Jul 01, 11-12 PM (0)
Jul 01, 12-1 PM (0)
Jul 01, 1-2 PM (0)
Jul 01, 2-3 PM (0)
Jul 01, 3-4 PM (0)
Jul 01, 4-5 PM (0)
Jul 01, 5-6 PM (0)
Jul 01, 6-7 PM (0)
Jul 01, 7-8 PM (0)
Jul 01, 8-9 PM (1)
Jul 01, 9-10 PM (1)
Jul 01, 10-11 PM (0)
Jul 01, 11-12 AM (0)
Jul 02, 12-1 AM (0)
Jul 02, 1-2 AM (0)
Jul 02, 2-3 AM (0)
Jul 02, 3-4 AM (0)
Jul 02, 4-5 AM (0)
Jul 02, 5-6 AM (4)
Jul 02, 6-7 AM (0)
Jul 02, 7-8 AM (0)
Jul 02, 8-9 AM (0)
Jul 02, 9-10 AM (0)
Jul 02, 10-11 AM (0)
Jul 02, 11-12 PM (0)
Jul 02, 12-1 PM (3)
Jul 02, 1-2 PM (1)
Jul 02, 2-3 PM (0)
Jul 02, 3-4 PM (0)
Jul 02, 4-5 PM (0)
Jul 02, 5-6 PM (0)
Jul 02, 6-7 PM (0)
Jul 02, 7-8 PM (0)
Jul 02, 8-9 PM (0)
Jul 02, 9-10 PM (0)
Jul 02, 10-11 PM (0)
Jul 02, 11-12 AM (0)
Jul 03, 12-1 AM (1)
Jul 03, 1-2 AM (0)
Jul 03, 2-3 AM (0)
Jul 03, 3-4 AM (0)
Jul 03, 4-5 AM (0)
Jul 03, 5-6 AM (0)
Jul 03, 6-7 AM (0)
Jul 03, 7-8 AM (0)
Jul 03, 8-9 AM (1)
Jul 03, 9-10 AM (2)
Jul 03, 10-11 AM (2)
Jul 03, 11-12 PM (2)
Jul 03, 12-1 PM (2)
Jul 03, 1-2 PM (0)
Jul 03, 2-3 PM (0)
Jul 03, 3-4 PM (0)
Jul 03, 4-5 PM (0)
Jul 03, 5-6 PM (0)
Jul 03, 6-7 PM (0)
Jul 03, 7-8 PM (1)
Jul 03, 8-9 PM (0)
Jul 03, 9-10 PM (0)
Jul 03, 10-11 PM (0)
Jul 03, 11-12 AM (0)
Jul 04, 12-1 AM (0)
Jul 04, 1-2 AM (0)
Jul 04, 2-3 AM (0)
Jul 04, 3-4 AM (2)
Jul 04, 4-5 AM (0)
Jul 04, 5-6 AM (0)
Jul 04, 6-7 AM (0)
Jul 04, 7-8 AM (0)
Jul 04, 8-9 AM (0)
Jul 04, 9-10 AM (0)
Jul 04, 10-11 AM (0)
Jul 04, 11-12 PM (0)
Jul 04, 12-1 PM (0)
Jul 04, 1-2 PM (0)
Jul 04, 2-3 PM (0)
Jul 04, 3-4 PM (0)
Jul 04, 4-5 PM (0)
Jul 04, 5-6 PM (0)
Jul 04, 6-7 PM (0)
Jul 04, 7-8 PM (0)
Jul 04, 8-9 PM (0)
Jul 04, 9-10 PM (0)
Jul 04, 10-11 PM (0)
Jul 04, 11-12 AM (0)
Jul 05, 12-1 AM (0)
Jul 05, 1-2 AM (0)
Jul 05, 2-3 AM (1)
Jul 05, 3-4 AM (0)
Jul 05, 4-5 AM (0)
Jul 05, 5-6 AM (0)
Jul 05, 6-7 AM (0)
Jul 05, 7-8 AM (0)
Jul 05, 8-9 AM (0)
Jul 05, 9-10 AM (0)
Jul 05, 10-11 AM (0)
Jul 05, 11-12 PM (0)
Jul 05, 12-1 PM (0)
Jul 05, 1-2 PM (0)
Jul 05, 2-3 PM (0)
Jul 05, 3-4 PM (0)
Jul 05, 4-5 PM (0)
Jul 05, 5-6 PM (0)
Jul 05, 6-7 PM (0)
Jul 05, 7-8 PM (0)
Jul 05, 8-9 PM (0)
Jul 05, 9-10 PM (0)
Jul 05, 10-11 PM (0)
Jul 05, 11-12 AM (0)
Jul 06, 12-1 AM (0)
Jul 06, 1-2 AM (0)
Jul 06, 2-3 AM (0)
Jul 06, 3-4 AM (0)
Jul 06, 4-5 AM (0)
42 commits this week Jun 29, 2025 - Jul 06, 2025
cleanup, remove dead code, groups related functions
Clean up the project structure, remove dead code, and group related functions more logically without changing the pipeline's overall behavior.

This refactoring replaces large, imperative `try-except` blocks with collections of
smaller, pure, testable functions composed in a robust chain. It's a significant
improvement in the clarity and reliability of the Agda processing stage.

+  Functions in `modules/` orchestrate the pipeline logic. They describe *what* to do
and should be free of `try-except` blocks for I/O. They operate on `Result` objects.

+  Functions in `utils/` provide reusable tools that perform the "impure" work. They
   are the "boundary" and use `try-except` internally to convert exceptions into `Err`
   values.

+  Move pure logic to utility modules.
+  All functions in `postprocess.py` that perform text replacements are pure
   transformations; move them to `utils/text_processing.py`, making them reusable
   utilities. To make them truly pure, modified them to accept data (like code
   blocks and label maps) as arguments instead of relying on global variables.
+  Update Pipeline Orchestrator. Add new function to `modules/latex_pipeline.py` that
   orchestrates these post-processing steps.  Replaces old method of calling
   `postprocess.py` as an external script, which eliminates a `subprocess` call and
   integrates the logic seamlessly.
+  Delete Legacy Script. `postprocess.py` is now retired.
+  Add new `utils/file_ops.py` utility module including directory functions from `setup.py`.
+  Merge `asset_generator.py` into `site_assembly.py`, since `site_assembly.py` already uses functions from `asset_generator.py`.
+  Clean up `build_config.py` (remove `get_legacy_paths()`---it's now dead code)
+  Error handling is now more precise: it skips files that are missing their
   intermediate parts (a recoverable issue) but will correctly halt the entire build on
   a more serious problem (like a permissions error when writing the final file).
+  More specific exceptions. The functions now catch `OSError` for file system
   permission issues, which is more descriptive than a generic `Exception`.
+  Cleaner Logic. functions are now simpler and no longer returns a `Result`, as a
   `FileNotFoundError` is not a critical failure for this specific task—it simply means
   the file size is 0.

1.  **Correct Usage (Boundary Functions):** The `try` blocks in
    `utils/command_runner.py` and `utils/file_ops.py` are fine; they serve as the
    necessary bridge between impure libraries (`subprocess`, `shutil`) and our
    functional code. These should stay.

2.  **Candidates for Refactoring (Orchestration Logic):** Most other `try` blocks,
    especially those in the `modules/` directory, are wrapping larger chunks of logic.
    These are prime candidates for refactoring. Instead of a large `try...except` block,
    these functions should be chains of smaller operations that each return a `Result`.

+  No `try-except`. The main logic is now free of explicit exception handling. All
   I/O error handling is delegated to the `ls_dir` utility.
+  Clarifies Error Handling.  The `calculate_file_metadata` function remains a good
   example of a case where a local `try-except` is a valid choice because the goal is
   to **provide a default value**, not to halt the entire pipeline on failure. This
   distinguishes it from critical I/O operations where failure must be propagated.
+  Declarative. The code now reads like a description of what it does ("list the
   directory and then map the result to processed files") rather than a sequence of
   imperative steps.
+  Preserves Behavior. Because our `calculate_file_metadata` function already handles
   its own `FileNotFoundError` by returning a default value, the mapping operation
   `[... for p in paths]` is safe and won't crash the whole pipeline if one file has
   an issue, perfectly preserving the logic of your original implementation.