Gunnar

nordisk/edda

Cargo.toml

# Edda — the nordisk shared-lib samling.
#
# The collected corpus (Norse *Edda*) of reusable, NON-facett library crates
# extracted from nornir so they release on their own cadence and are shared by
# nornir, korp, holger, … . facett stays its own repo (it's the egui component
# framework); Edda is everything else that's a library, not an app.
#
# Members land under crates/*. Tenants so far: jera (job ledger + no-shell
# container + KVM boot), nornir-git, nornir-cli-outcome, nornir-coverage,
# nornir-saga, nornir-testmatrix, nornir-robotui, nornir-bench, and the dedup
# leaves nornir-hash / nornir-xtask-support / nornir-pages / nornir-humanize
# (the ONE human-readable formatter — bytes/count/duration/percent). Leaf repos
# (korp/holger/knut/skade/znippy/ordning/modgunn/facett/Skidbladnir/Njord/…)
# consume nornir-testmatrix + nornir-robotui from the crates.io registry by
# version; their local `path=` sibling entries are their own to re-point.
# Still queued: build-thing, guard (tier 2).
[workspace]
resolver = "3"
members = ["crates/*", "xtask"]
# `crates/storage-git-gix` is now a real package (the gix-backed implementation
# of `git-storage-trait`'s `GitOps`) and is picked up by the `crates/*` glob. The
# two `parked-gix*` directories inside it are quarantined salvage material,
# not sources; the package's `include` key names what is actually part of it.
exclude = []

# ── the 50 ms push sleep, and why this table exists ──────────────────────────
# MEASURED 2026-08-10 as a COUNT, not a clock: 33 x `clock_nanosleep(50ms)
# <0.0501>` for 33 pushes. gitoxide#2877 — `gix-features`' watcher thread sleeps
# a flat 50 ms inside `in_parallel_with_slice`, reached unconditionally from
# `write_data_iter_to_stream`, i.e. from every `index_pack`. It is `P-030` in the
# performance record.
#
# gunnar has carried the fix since before the split (`vendor/gix-features`, the
# "park rather than sleep" change at `src/parallel/in_parallel.rs:222`) and
# declares it in ITS `[patch.crates-io]`. edda had no `[patch]` table at all — so
# the gix arm of the storage A/B paid the 50 ms and the Arrow arm did not,
# **because of which repository the binary was built in, not which engine it
# ran**. Every push and `prepare` clock in a two-engine comparison was confounded.
#
# It also corrects the record: `gunnar/.nornir/performance-triage.md` files
# `P-030` as "DEAD — gix" because "the receive path no longer calls it". True of
# the Arrow arm; FALSE of the gix arm, which calls it on every push.
#
# One vendored copy, not two: this points at gunnar's tree rather than
# duplicating it (LAW 5 — one writer). gunnar already path-depends on
# `../edda/crates/*`, so the two checkouts are already required together; this
# does not add a requirement that was not there.

# ── RESOLVED 2026-08-23: gix-features 0.49.1 carries the fix, so this table is gone ──
#
# gitoxide#2877 was fixed upstream. Stock `gix-features 0.49.1` on crates.io
# contains the park-rather-than-sleep change VERBATIM — the `park_timeout` loop,
# the `unpark` calls, and the comment down to the sentence about an `unpark` that
# arrives before the `park_timeout` being remembered by the park token. It was
# taken upstream, not reinvented.
#
# Everything above is therefore history. The confound it describes — the gix arm
# of the storage A/B paying 50 ms because of WHICH REPOSITORY the binary was built
# in — is fixed by a version floor instead of a fork: `gunnar-pack` and
# `gunnar-delta` now require `gix-features = "0.49.1"`, not `"0.49"`. That
# distinction is the whole point. A caret `"0.49"` admits 0.49.0, which does NOT
# have the fix, so a consumer honouring the stated minimum would silently pay the
# 50 ms again — the understated-floor trap, and the reason the floor is pinned to
# the version that actually carries the fix.
#
# The vendored fork still exists and gunnar still patches it from its OWN root
# (`gunnar/Cargo.toml:387`) and its bench root, because the fork carries a SECOND,
# unrelated change that is NOT upstream: `Stepwise::Inline`, which stops spawning
# two threads when one was asked for. So the gunnar server keeps that; edda no
# longer needs a fork to get the fix it actually cared about.
#
# Removing this table also un-holds the release cascade. A `[patch.crates-io]`
# entry pointing at a path this repository does not itself produce reads as a
# foreign fork to the release gate, which held `gunnar-pack` and `gunnar-delta`
# off crates.io, and they held `gunnar-client`, which held `dwarves`.

# Rickard, 2026-09-05: test artifacts carry line tables only — full DWARF in every test
# binary and its deps was the bulk of a target dir (gunnar/target 271 GB, korp/target 852 GB
# on the day the disks filled); backtraces still show file:line.
[profile.test]
debug = "line-tables-only"

# TEMPORARY (2026-10-03, merge of release-3 into main): `appliance-grow`'s `md`
# feature links korp-installer =0.1.20 from crates.io, whose korp-boot-bios takes
# nornir-build-thing from crates.io, whose nornir-git is on russh 0.61 — and
# russh 0.61 pins curve25519-dalek =5.0.0-pre.6, which cannot share this lock
# with ed25519-dalek 3's curve25519-dalek 5.0.0 (W3). Pointed at THIS
# repository's own crate (russh 0.63) until nornir-build-thing/nornir-git
# are published on the gix 0.88 / russh 0.63 line; then this table goes.
[patch.crates-io]
nornir-build-thing = { path = "crates/nornir-build-thing" }