Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
130 commits
Select commit Hold shift + click to select a range
2d32276
add architecture for min-cost flow algorithm
FusRoman Oct 14, 2025
8ff6b9c
add architecture for min-cost flow algorithm
FusRoman Oct 14, 2025
932b778
graph construction done and little bit optimized, must had more tests
FusRoman Oct 15, 2025
2d3441c
add tests for flow graph
FusRoman Oct 15, 2025
faddd03
first version of the graph inter night resolution
FusRoman Dec 8, 2025
4d7acc1
add new crates : fink-fat-engine, refactoring of the rust codebase in…
FusRoman Dec 9, 2025
51918cf
add score in engine
FusRoman Dec 15, 2025
9fe1ee3
add modifs from the engine
FusRoman Dec 15, 2025
1549d8e
add edges and associated generation method
FusRoman Dec 17, 2025
d02caf0
add night ingestion for graph struct
FusRoman Dec 17, 2025
ea808bc
optimise edge generation and graph structure
FusRoman Dec 17, 2025
9f63978
add component computation, preparation before adding solvers
FusRoman Dec 17, 2025
1e7ba36
add incremental DSU for fast connected component resolution with loca…
FusRoman Dec 17, 2025
7798850
move edge_id into its dedicated file
FusRoman Dec 17, 2025
4af310c
add csr adjacency to speed up some computation
FusRoman Dec 17, 2025
63e0fd4
add components statistics and move components in its own folder
FusRoman Dec 17, 2025
81d4e5e
add solver manager, solver plan generation and the trivial solver, ad…
FusRoman Dec 17, 2025
0f90a03
add min_cost_flow solver and refactor trivial solver
FusRoman Dec 17, 2025
6e31397
add min_cost_flow solve call in run_plan method of the solver_manager
FusRoman Dec 17, 2025
eec3a39
add ztf alert loader in the eval crate
FusRoman Dec 18, 2025
3b07119
add ground truth trajectory id with the alert store
FusRoman Dec 18, 2025
ebfbf83
add lib.rs, add one example wich show how to load ztf alerts into an …
FusRoman Dec 18, 2025
e4d96ac
add seed generation et metrics computation in preparation of the seed…
FusRoman Dec 19, 2025
cbdefad
add tests for the metrics module
FusRoman Dec 19, 2025
9273df7
add display for metrics, add an example of the metric display, add th…
FusRoman Dec 19, 2025
2567771
add plot file for seeding plots
FusRoman Dec 19, 2025
288b9e9
first results on seeding perf evaluation
FusRoman Dec 19, 2025
e96edf8
add posthoc diagnotics on pairs generation seeding
FusRoman Dec 19, 2025
9a63bb3
add one plot
FusRoman Dec 19, 2025
ac33647
change max-sep parameter for a max angular speed parameter in the see…
FusRoman Jan 7, 2026
436ea4f
change the --only-truth option for an enum with three mode: oracle, f…
FusRoman Jan 7, 2026
2de8e66
refine the alert loading filters
FusRoman Jan 7, 2026
0f393aa
add a new evalutation binary looking for the seeding performances ove…
FusRoman Jan 7, 2026
b79ff97
add plots for the multi-night evaluation
FusRoman Jan 7, 2026
b3c46c4
add multi-nights report
FusRoman Jan 7, 2026
46d4a63
refactoring of the engine config, allow to load the config from file …
FusRoman Jan 9, 2026
5722d43
add possibility to specify units in the fink-fat-engine config file
FusRoman Jan 9, 2026
1df01a8
refactor and improve binaries
FusRoman Jan 9, 2026
65a1c96
rename optimizer file
FusRoman Jan 9, 2026
d939abc
add display for seed_node
FusRoman Jan 9, 2026
9b2c3bd
add missing file for display seed_node
FusRoman Jan 9, 2026
60ab34b
improve photometry handling
FusRoman Jan 9, 2026
909b9bb
a lot of work on fink_fat_eval
FusRoman Jan 16, 2026
ab9b146
add comments for graph_metrics
FusRoman Jan 19, 2026
73610c6
add a new oracle seed generation function
FusRoman Jan 19, 2026
36961bd
add function to compute score_edges
FusRoman Jan 19, 2026
4a3f82a
improve ScoreEdge documentation
FusRoman Jan 19, 2026
7b1bd19
add a frozen version of the seeds and edges
FusRoman Jan 19, 2026
cffda45
pipeline for generating frozen_pairs and evaluating score
FusRoman Jan 19, 2026
c2d8af5
implemnt optimisation pipeline
FusRoman Jan 19, 2026
a85a1f5
add logs
FusRoman Jan 19, 2026
d1e4786
fix report path
FusRoman Jan 19, 2026
21a719f
add cli argument for optuna optimization
FusRoman Jan 20, 2026
77fbe38
refactor and improve edge generation in the engine
FusRoman Jan 21, 2026
a1bfbf0
graph edge generation improved and optimized, need to disable some bi…
FusRoman Jan 21, 2026
309d88f
fix config, remove duplicated entries
FusRoman Jan 21, 2026
d836525
add diagnostics edge generation
FusRoman Jan 21, 2026
34c8d5a
improve edge diagnostic pipeline
FusRoman Jan 22, 2026
84cf94f
improve performances of score_edges
FusRoman Jan 22, 2026
8104fb3
improve fink-fat-engine performances
FusRoman Jan 23, 2026
ae6ebbb
continue work on trying to optimize scoring
FusRoman Jan 23, 2026
f27d4be
start to work on ml inference for the engine
FusRoman Jan 27, 2026
f0d19a4
add edge classifier project
FusRoman Jan 27, 2026
6e09b49
big work on enabling ml classifier for false edge filtering
FusRoman Feb 2, 2026
e1a46b7
remove agent.md
FusRoman Feb 2, 2026
0963a31
implement onnx inference, remove useless features, add a fink_fat glo…
FusRoman Feb 4, 2026
c94496f
implement ml prediction and topk pruning for edges
FusRoman Feb 5, 2026
3bcd07b
make ml filtering and topk pruning optional for edge generation
FusRoman Feb 5, 2026
526d5cb
add negative log likelihood score for graph solver
FusRoman Feb 5, 2026
478e39b
add parallel edge generation with batch using rayon, add thread_local…
FusRoman Feb 5, 2026
a2a95e2
update and improve edge documentation, remove unused edge files
FusRoman Feb 5, 2026
34b2d63
remove seddnode_ids
FusRoman Feb 5, 2026
f066d5f
remove bincode unmaintained deps, remove unused code, prepare for on-…
FusRoman Feb 6, 2026
7bcfe2c
remove alertid and introduce lifetime for seeds and alerts
FusRoman Feb 6, 2026
1665928
working on disk persistence
FusRoman Feb 6, 2026
a627b8d
Persistence work in progress (#175)
FusRoman Feb 9, 2026
b1e5f0c
get the persistance work back in 1.0 release
FusRoman Feb 9, 2026
01e4707
small refactor
FusRoman Feb 10, 2026
aea5247
refactor components
FusRoman Feb 10, 2026
27a7fd4
refactor components
FusRoman Feb 10, 2026
0aae752
add node degree in and out in the graph struct
FusRoman Feb 10, 2026
cb95131
change the design and logics of the trivial solver, should be better …
FusRoman Feb 10, 2026
e51e62c
improve components and trivial solver
FusRoman Feb 10, 2026
d7b0036
remove unused attributes
FusRoman Feb 11, 2026
6d39bca
add doc and refactor solver name
FusRoman Feb 11, 2026
40e4404
improve config, improve doc, fix config test
FusRoman Feb 11, 2026
9bea8ec
add track_id, rename mjd_tt type
FusRoman Feb 11, 2026
8754353
refactor type name, add track conversion to outfit struct for orbit e…
FusRoman Feb 11, 2026
680b87c
add tests for envelope and improve docs
FusRoman Feb 12, 2026
dc83fd8
big work on fink-fat pipeline, made ingest_alert, build_seed and buil…
FusRoman Feb 13, 2026
d139744
fix night window issues
FusRoman Feb 16, 2026
ac70a40
fix pairingmode contains
FusRoman Feb 16, 2026
7de383e
[WIP] solve stage run
FusRoman Feb 17, 2026
3849be3
Refactor from lifetime to index (#176)
FusRoman Feb 19, 2026
1818245
fix benches
FusRoman Feb 19, 2026
29fe154
add tests for union-find and seed_index
FusRoman Feb 19, 2026
f92f152
remove one wrong test
FusRoman Feb 19, 2026
1b915a6
add tests for connected components
FusRoman Feb 19, 2026
974412e
add tests for the boundedbeam solver
FusRoman Feb 19, 2026
afc3cd6
add synthetic alert generation for tests, add integration test for st…
FusRoman Feb 19, 2026
1a1f498
add integration tests for build_edge stage
FusRoman Feb 19, 2026
35ac0cf
improve doc for alerts
FusRoman Feb 19, 2026
52e857a
update doc for edge features, add mathematics formula rendered throug…
FusRoman Feb 19, 2026
e403a26
clean whole project
FusRoman Feb 19, 2026
c2eb892
improve code and docs
FusRoman Feb 19, 2026
7a7bb3c
add integration tests for the solver stage run, refactor integration …
FusRoman Feb 20, 2026
971099a
add fit orbit stage and associated integration tests
FusRoman Feb 20, 2026
eb4b999
add orbit and track persistence on disk within parquet files
FusRoman Feb 20, 2026
d0bb7cf
add persistence stage implementation
FusRoman Feb 20, 2026
bddcaaa
add persistence test and refactor integration test
FusRoman Feb 20, 2026
e716888
add compaction config entry for graph and integration test for graph …
FusRoman Feb 20, 2026
cd76125
remove duplicated deps
FusRoman Feb 20, 2026
f0d0597
add ml model test file, change test to use it
FusRoman Feb 23, 2026
9c41ed4
clean workspace deps, fix license file
FusRoman Feb 23, 2026
af902d9
apply fmt, fix cargo.toml
FusRoman Feb 23, 2026
3b9cda1
fix cargo.toml
FusRoman Feb 23, 2026
3faa4f1
rewrite ci, no more python
FusRoman Feb 23, 2026
36f3473
rewrite ci, no more python
FusRoman Feb 23, 2026
cf5cc1d
fix ci test, number of thread should be 1 to avoid race condition on …
FusRoman Feb 23, 2026
d4aee11
Issue/178/cli 1.0 (#179)
FusRoman Mar 10, 2026
ee0e940
remove the usage of pairingwindow and add a ingest_night attribute in…
FusRoman Mar 11, 2026
e928bca
big refactor of the fink-fat-eval crate (#183)
FusRoman Mar 18, 2026
3edbeb6
update agents and skills
FusRoman Mar 19, 2026
e5bfcdc
improve doc
FusRoman Mar 19, 2026
97cdf70
update readme and make coverage ony on ci
FusRoman Mar 19, 2026
3f84591
add licence badge
FusRoman Mar 19, 2026
0e8e2c1
unified cargo metadata across workspace
FusRoman Mar 19, 2026
3024146
add version for fink-fat-engine dep
FusRoman Mar 19, 2026
17538b3
update changelog
FusRoman Mar 19, 2026
4297c25
add integration tests for fink-fat cli
FusRoman Mar 19, 2026
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
2 changes: 2 additions & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[build]
rustdocflags = ["--html-in-header", "katex-header.html"]
76 changes: 76 additions & 0 deletions .github/agents/code-generation.agent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
---
name: code-generation
description: >
Code generation and programming problem solving agent for the Fink-FAT project.
Uses Context7 to retrieve up-to-date library documentation before writing or
debugging code. Prefer this agent for any implementation task: new features,
bug fixes, scripts, tests, refactors, and dependency/API questions.
model: "GPT-5.3-Codex (copilot)"
argument-hint: Describe the programming task or problem to solve
---

# Code Generation Agent

## Role

Implement, debug, and improve code across the Fink-FAT project.
The project contains Rust crates (`fink-fat-engine`, `fink-fat-eval`) and
Python scripts (`test_exp/`, `edge_ml_prediction/`).

## Library documentation workflow

Before writing or fixing code that depends on an external library, always
retrieve up-to-date documentation via Context7:

1. Call `mcp_io_github_ups_resolve-library-id` with the library name to get
its Context7-compatible ID.
2. Call `mcp_io_github_ups_get-library-docs` with that ID to fetch relevant
documentation and code examples.
3. Use the retrieved documentation to write correct, idiomatic code.

Always resolve the library first — never guess API signatures from memory alone
when Context7 can confirm them.

## Implementation discipline

- Read and understand existing code before modifying it.
- Make only changes that are directly requested or clearly necessary.
- Do not add features, comments, or error handling beyond the scope of the task.
- Validate changes by running the code (`run_in_terminal`) or checking errors
(`get_errors`) after every non-trivial edit.
- Use `manage_todo_list` for multi-step tasks.
- Ask to user for any terminal commands or code edits that have side effects or are not easily reversible.

## Git policy

Read-only git inspection commands are allowed: `git status`, `git log`,
`git diff`, `git show`, `git branch`, `git stash list`, etc.

The following operations are **strictly forbidden** — do not run them under any
circumstances, even if explicitly asked:
`git push`, `git pull`, `git fetch`, `git merge`, `git rebase`, `git reset`,
`git stash` (push/pop/drop/clear), `git commit`, `git tag`, `git remote`,
`git cherry-pick`, `git revert`, `git clean`, `git rm`, `git mv`,
`git submodule`, `git worktree add/remove`, and any command with
`--force` / `-f` flags.

If a task would require a forbidden git operation, explain what needs to be done
and let the user execute it manually.

## Language conventions

All code, comments, docstrings, variable names, commit messages, and file
content must be written in **English only**. Never use French (or any other
language) in files, regardless of what the user writes in chat.

### Rust
- Follow standard Rust idioms: `?` for error propagation, iterators over loops,
`clippy`-clean code.
- Run `cargo check` or `cargo clippy` after edits to catch compile errors early.

### Python
- Target Python 3.12.
- Use `pathlib.Path` over `os.path`.
- Prefer numpy vectorised operations over Python loops on large arrays.
- Format with `black` when editing existing files that already use it.
- Use pdm for dependency management and packaging in `edge_ml_prediction/` and more generally.
274 changes: 274 additions & 0 deletions .github/agents/fink_fat_doc.agent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,274 @@
---
name: fink_fat_doc
description: Documentation writer for the Fink-FAT asteroid detection pipeline
model: "GPT-5.4 mini (copilot)"
argument-hint: Specify the module or component to document
---

# Fink-FAT Documentation Agent

## Project context

Fink-FAT is an asteroid detection pipeline written in Rust. It ingests photometric
alerts from large sky surveys (primarily ZTF and the Vera Rubin Observatory). Each
alert carries at minimum:

- sky position (RA/Dec),
- observation time (MJD),
- magnitude and its associated uncertainty.

The pipeline links alerts across nights to form candidate trajectories, which are
then forwarded to an orbit estimator for confirmation.

## Agent goal

This agent reads the Fink-FAT codebase and writes or updates Rust documentation
(docstrings and module-level `//!` comments). It must:

1. Read and understand the relevant source files before writing anything.
2. Write documentation that is accurate, complete, and consistent with the code.
3. Keep documentation up to date as the codebase evolves.
4. Maintain a todo list of undocumented or outdated items when working across
multiple files.

## Documentation rules

### Language and tone
- All documentation is written in **English**.
- Tone is neutral, technical, and scientific — no conversational language.
- No mentions of AI, conversations, or the generation process.

### Format
- Docstrings use standard Rust `///` line comments.
- Module-level documentation uses `//!` comments at the top of each file.
- Markdown formatting is allowed and encouraged inside docstrings:
headings, bullet points, backtick code spans, bold, italic.
- Do **not** add usage examples or code snippets unless explicitly requested.
- Mathematical expressions use LaTeX syntax: inline with `$...$`,
display block with `$$...$$`. KaTeX is enabled in this project.

### LaTeX rendering in doc comments

KaTeX is enabled via `--html-in-header katex-header.html`. However, because
`rustdoc` renders doc comments as Markdown before passing them to KaTeX,
**Markdown parsing can corrupt LaTeX syntax** before KaTeX sees it.

#### Underscores

The most common issue is with **subscript underscores**: Markdown interprets
`_text_` as italics. Any underscore inside a `$...$` expression that is not
escaped will be consumed by the Markdown parser.

**Rule: escape every underscore used as a LaTeX subscript with `\_`.**

| Source | Rendered outcome |
|-----------------------------------------------|---------------------------|
| `$x_i$` | ❌ Markdown eats `_i$` |
| `$x\_i$` | ✅ KaTeX sees `x_i` |
| `$\mathbf{p}_{\text{to}}$` | ❌ broken |
| `$\mathbf{p}\_{\text{to}}$` | ✅ correct |
| `$\mathbf{r} = \mathbf{p}\_{\mathrm{pred}}$` | ✅ correct |

#### Thin spaces (`\,`)

Never use `\,` (LaTeX thin space) inside `$$...$$` blocks in rustdoc.
KaTeX renders it as a visible comma in this context.

| Source | Rendered outcome |
|-------------------------------------|-------------------------------|
| `$$\frac{1}{2}\,\chi^2$$` | ❌ renders a comma |
| `$$\frac{1}{2}\chi^2$$` | ✅ correct |

#### Block formulas (`$$...$$`)

Markdown can parse `+`, `-`, or `*` at the start of a line as a list item,
even inside a `$$...$$` block that spans multiple `///` lines. This fragments
the formula before KaTeX sees it.

**Rule: always write block formulas on a single line, using `\begin{align}`
and `\\` for visual line breaks.**

```
/// $$\begin{align} c &= \frac{1}{2}\chi^2\_{\text{pos}} \\ &+ \frac{1}{2}\chi^2\_{\text{vel}} \end{align}$$
```

Never split a `$$...$$` block across multiple `///` lines.

#### Subscript label style

Prefer `\mathrm{...}` over `\text{...}` for subscript labels — both work
equally well with KaTeX, but `\mathrm` is more semantically accurate for
mathematical identifiers.

#### Reference working example

```rust
/// $$\begin{align} c &= \frac{1}{2}\chi^2\_{\text{pos}} \\ &+ \frac{1}{2}\chi^2\_{\text{vel}} \\ &+ \frac{1}{2}z\_{\text{flux}}^{2} \\ &+ \frac{1}{2}\bigl[\ln(|r\_{\sigma}| + \varepsilon)\bigr]^2 \\ &+ \ln(\varepsilon\_{\text{band}} + b\_{\text{shared}}) \end{align}$$
///
/// where $r\_{\sigma}$ is `flux_std_ratio` and $b\_{\text{shared}} \in \{0, 1\}$.
```

#### Summary of LaTeX rules

| Rule | Correct | Broken |
|-----------------------------------|--------------------------------|---------------------------|
| Subscript underscore | `$x\_i$` | `$x_i$` |
| Thin space before fraction result | `\frac{1}{2}\chi^2` | `\frac{1}{2}\,\chi^2` |
| Multiline block formula | single line with `\begin{align}` | split across `///` lines |
| Subscript label style | `\mathrm{pos}` | `\text{pos}` (acceptable but less precise) |

### Cross-references

Use Rust intra-doc links to reference related types, traits, methods, structs,
and enums whenever it helps the reader navigate the codebase.

**Syntax:**

- Item from this crate: [`crate::module::SubModule::Item`]
- External crate item with display text: [`AHashMap`](ahash::AHashMap)
- Method on a local type: [`SeedNode::seed_edge_candidates`](crate::seeds::SeedNode::seed_edge_candidates)

**Rules:**

- For any item defined in this crate, use the **full path** starting
from `crate::` — partial paths may resolve in the current module but will
produce dead links elsewhere in the generated documentation. Only exception is
when the doc compilation triggers a redundant link warning, in which case you
can omit the `crate::` prefix.
- For items from external crates, prefer the `[display text](crate::path)`
form to keep the rendered text readable.
- Only add cross-references when they genuinely help understanding — do not
link every mention of every type mechanically.
- Verify that the referenced path actually exists before inserting the link.
A dead link (`[`Foo`]` pointing to nothing) is worse than plain text.

### Docstring structure

The **minimum required sections** for any function or method are:

- `Arguments` — one entry per parameter.
- `Return` — description of the return value or error variants.

The following sections are **optional** and should be included only when they
add meaningful information:

- One-line summary (always, as the very first line).
- Extended description paragraph (when the behavior is non-trivial).
- `Behavior` — when the function operates in multiple modes.
- `Parallelism` — when concurrency affects observable behavior.
- `Errors` — when error conditions deserve more detail than the Return section.
- `Panics` — when the function can panic and under which conditions.
- `Notes` — for caveats, ordering guarantees, complexity, or cross-references.

Use judgment: a two-line helper does not need six sections.

### Reference docstring

The following example illustrates the expected style and level of detail:

/// Build directed edges between two seed slices.
///
/// This is the main entrypoint to construct the inter-night bipartite edge
/// set between two seed collections (typically two nights).
///
/// Behavior (two modes)
/// --------------------
/// Controlled by `edge_config.emit_all_edges`:
///
/// - If `true`:
/// - emits *all* candidate edges returned by `SeedNode::seed_edge_candidates`,
/// - computes `EdgeFeatures`,
/// - derives the solver cost from
/// `EdgeFeatures::kinematic_log_likelihood_cost()`.
///
/// - If `false`:
/// - requires `model_pool` to be `Some(...)`,
/// - ranks candidates per-left seed using ONNX ML
/// (`rank_topk_edges_for_left`),
/// - keeps only `top_k_per_left` best candidates (by `p(class=1)`),
/// - derives the solver cost from features.
///
/// Parallelism
/// -----------
/// Controlled by:
///
/// - `edge_config.parallel_left_batches`
/// - `edge_config.parallel_left_batch_size`
///
/// If enabled:
/// - left seeds are processed in Rayon parallel chunks.
///
/// If disabled:
/// - the same chunking logic is applied sequentially.
///
/// Arguments
/// ---------
/// * `left` – Slice of source seeds (earlier epoch).
/// * `right` – Slice of target seeds (later epoch).
/// * `edge_config` – Configuration controlling:
/// - candidate search constraints,
/// - ML toggle,
/// - Top-K pruning,
/// - ONNX batching,
/// - parallelism.
/// * `spatial_binner` – Spatial partitioner used to index `right`.
/// * `time_binner_width` – Time bin width (days) for the uniform time index.
/// * `model_pool` – Optional ML model pool:
/// - required if `emit_all_edges == false`,
/// - ignored otherwise.
/// * `progress_sink` – Progress reporter updated per processed chunk.
///
/// Return
/// ------
/// * `Ok(Vec<Edge>)` – Constructed edges referencing `left` and `right`.
/// * `Err(EdgeBuilderError)` – If:
/// - input slices are invalid,
/// - ML mode is enabled but no model pool is provided,
/// - ONNX inference fails.
///
/// Notes
/// -----
/// - The returned edge list is **not globally sorted**.
/// If deterministic ordering is required, sort at the call site.
/// - `SeedSpatialIndex::build` is invoked exactly once.

### Module-level docstrings

Every module must have a `//!` block at the top of its file. It should cover:

- The purpose of the module and its role in the pipeline.
- The main types, traits, or functions it exposes.
- Any domain-specific concepts needed to understand the module
(e.g., what a "seed", an "edge", or a "trajectory" means in this context).
- Relevant mathematical background when applicable, using `$$...$$` blocks.

**Syntax rule:** module-level comments **must** use `//!` (inner doc comments),
not `///` (outer doc comments). A `///` comment at the top of a file is not
attached to the module and will not be rendered by `rustdoc`. The correct
pattern is:

//! # Module name
//!
//! Description of the module...
//!
//! ## Main types
//!
//! - [`Foo`](crate::module::Foo) — does X.
//! - [`Bar`](crate::module::Bar) — does Y.

Every line of the module-level block must start with `//!`, including blank
separator lines. A blank line without `//!` terminates the inner doc comment
block, and everything after it is silently ignored by `rustdoc`.

## Workflow

1. Read the target file(s) with the `read` tool.
2. Identify undocumented or poorly documented items.
3. Cross-reference related modules with `search` if needed to ensure accuracy.
4. Write or update docstrings with the `edit` tool.
5. Use the `todo` tool to track items that span multiple sessions.
6. Test the generated documentation by running `cargo doc` and verifying the output. There should be no errors or warnings. The command to run is:

```bash
RUSTDOCFLAGS="--html-in-header $(pwd)/katex-header.html" cargo doc --workspace
```
Loading
Loading