Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/holger

.nornir/README-full.md

holger — complete overview

The real README: the full pitch, quickstart, design and measured numbers. The repo-root README.md is the slim face; this chapter is the heavy detail, and it is also folded into the manual docs/manual.pdf by nornir docs book.

A secure, airgap-first artifact server: it speaks every package manager's native protocol (Maven · PyPI · cargo · npm · NuGet · Go · Gem · Deb · Helm · Docker) yet serves them from an immutable, content-addressed znippy store — so an entire registry can cross an airgap on a USB stick. Built to replace Nexus/Artifactory where auditability and airgap compliance matter more than a polished UI.

Why holger — airgap-first, a single Rust binary, an immutable znippy store and mTLS+OIDC built in — trading the mature UI / HA-replication surface Nexus & Artifactory ship:

capability holger Nexus Artifactory
Airgap-native (agent/server split, USB-carriable immutable bundles) ✅ ◐ ◐
Single static Rust binary (no JVM) ✅ ✗ (JVM) ✗ (JVM)
Speaks each tool's native protocol unmodified (pip / cargo / docker / helm / …) ✅ ✅ ✅
znippy store: immutable, content-addressed (blake3), O(1) random pull ✅ NA NA
mTLS and OIDC auth built in ✅ ◐ ◐
Fully OSS, no paid tier ✅ ◐ ✗
Mature web UI / enterprise RBAC / HA-replication ◐ ✅ ✅

Full numbers below — generated by nornir bench run holger.

What it does

Quickstart

# secure side: bring up the registry pair nornir embeds (writes config + /cache + /sparring archives)
holger-server dev-pair --data ./holger-data

# point cargo at it — holger speaks the sparse-registry protocol, fetches with no internet:
#   ~/.cargo/config.toml
#   [registries.holger]
#   index = "sparse+http://127.0.0.1:<port>/cache/index/"
# pip / docker / helm / npm point the same way — each tool thinks holger IS its registry.

# …or run a fully configured server from a RON graph:
holger-server start --config holger.ron

Build-space — holger presses nornir's build-thing

holger is the first real consumer of nornir-build-thing (nornir task #36), the dependency-light core that turns declarative cargo build variants + a content-addressed build-provenance attestation into reusable data. holger declares its build-space — one product built three ways — and drives build-thing end to end without pulling nornir's iceberg / arrow / eframe stack.

The three deployment tiers, declared as data (.nornir/build-variants.toml, embedded byte-for-byte in the holger-build-space crate so the file and the code can never drift):

tier package × bin features what it is
embedded holger → holger-embedded embedded, --no-default-features the tiniest executable — the in-process engine (HolgerObject / functional API), sign riding in via the CLI's server-lib dep
mini holger → holger-mikro mini, --no-default-features the stripped read-only standalone server for airgap/red-zone
full holger → holger-full full, --no-default-features the writable everything-on server (proxy / upstreams / federation / import)

Each tier is a typed (package × bin × features × profile × target) point in a nornir_build_thing::BuildVariantSet, grounded in holger's actual workspace crates and Cargo features (sign, testmatrix, served, gui) — nothing invented. Three distinctly-named executables from one source tree, the mode features mutually exclusive via compile_error! guards in server/cli/src/main.rs; the legacy default holger-server bin stays for the systemd service spec. nornir build --list-variants reflects all three; nornir build --variant full --attest --seal validates, materializes + runs the right cargo build, then captures and znippy-seals a build-provenance attestation.

holger drives the same seam first-party via its own xtask: cargo run -p xtask build --list (describe all tiers + materialized commands), build --variant <tier> (assemble one), and build --all (assemble all three deployment tiers, one functional_status row each plus an aggregate). See .nornir/holger-tiers.md — including the open fat/thin (holger / holger-thin) duplication question.

How holger consumes the crate (build-space/src/lib.rs):

// DESCRIBE — reflect the build-space onto the data-driven surface a UI/CLI renders.
let surface = holger_build_space::build_surface()?;          // three tier rows
for v in &surface.variants {
    println!("{}: {}", v.name, v.command_line);               // materialized cargo argv
}

// PRESS — validate a tier + capture a content-addressed build-provenance attestation.
let att = holger_build_space::press_tier("full", repo_root, Outcome::Success, &artifacts)?;
assert!(att.digest_matches_record()?);                        // stable SHA-256 over the record

The provenance record binds the verbatim tier descriptor, the resolved inputs (cargo argv, features, profile, VCS rev + working-tree freshness), the toolchain, the host (cores + memory), the outcome, and the SHA-256 of every produced artifact — folded to a stable digest. The attestation is unsealed; holger never fabricates a signature (the real seal is znippy's detached-CMS signer, wired behind nornir's build-provenance feature).

The worked example — cargo run -p holger-build-space --example press_build_thing — describes holger's build-space and then presses the full tier: it captures the attestation, persists it to a dep-light JsonFileSink ledger, reloads it, and proves the digest still verifies. The round-trip is asserted by the holger-build-space test suite (press_full_tier_captures_and_ round_trips_provenance, pressed_record_persists_to_a_reloadable_ledger, tampering_a_pressed_record_breaks_the_digest).

Benchmarks

holger vs Nexus vs Artifactory, head-to-head on the same cached corpus (crates / jars / wheels), served over HTTP on both sides — a true like-for-like, over-the-wire comparison. Each row is one comparison scenario run against a real backend container. holger_served_mbs is holger fetched over its native HTTP door (handle_http2_request, the path stock cargo/pip/npm hit); nexus_served_mbs / artifactory_served_mbs are the rival fetched over its HTTP API. The faster backend is bolded per row; ops_per_sec is the served HTTP GET rate and p50/p99/p999/mean_ms are the per-request latency percentiles — every one measured identically on all three systems (the same pure-Rust concurrent GET pool over loopback), so they are the honest like-for-like latency head-to-head. The tight top-of-README mashup transposes these into a systems-as-rows table across six contested columns. (The old in-process get_file() figure is kept only as an internal holger_inprocess_read_ceiling_mbs regression ceiling — a Holger-vs-Holger number, deliberately NOT shown beside the competitor.) Numbers are generated from the latest nornir bench run holger — never hand-edited; an empty rival cell means that backend's container was not available on the bench host.

Fair hardware — every system at full machine. There is no throttled variant: FairResources::detect() reads whatever host it runs on and hands each JVM rival container every core (--cpus) + 75 % of RAM (--memory, swap pinned to the cap) + a fair JVM heap at 50 % of that container cap (-Xmx). Holger runs in-process on the same cores. The fight is fair at the top; holger still wins every contested column. The host and core count are stamped on each table below — they are a property of the run, not of this paragraph, and two hosts are never one trend line.

v0.1.0 · oden · 32 cores · 2026-07-23

workload holger_served_mbs nexus_served_mbs artifactory_served_mbs ops_per_sec holger_p50_ms holger_p99_ms
artifactory_load 100.57 12.24 168744 0.17 0.47
nexus_load 108.43 10.60 181863 0.15 0.46

Tests

Every Rust test in the workspace (incl. #[tokio::test] async tests), grouped by the standard categories. Run with cargo test --workspace.

Unit tests (550)

file tests
agent/connector/artifactory/src/lib.rs base_url_is_trimmed, download_url_joins_repo_path_name, same_origin_matches_base_host_scheme_port, download_rejects_cross_origin_before_sending_creds, bearer_and_basic_auth_select_correctly, build_aql_filters_files_and_escapes_repo, map_results_drops_folders_and_joins_paths, same_origin_rejects_different_port
agent/connector/nexus/src/lib.rs same_origin_matches_base_host_scheme_port, download_rejects_cross_origin_before_sending_creds
agent/connector/world/src/lib.rs allowlist_accepts_canonical_hosts, allowlist_rejects_ssrf_and_plain_http, download_rejects_non_allowlisted_url
agent/connector/world/src/pip.rs test_normalize_name_basic, test_normalize_name_edge_cases, test_archive_path, test_archive_path_normalization, test_parse_requirements_txt, test_parse_requirements_txt_invalid, test_parse_uv_lockfile
agent/lib/src/operations.rs safe_join_allows_normal_relative_paths, safe_join_rejects_hostile_upstream_paths, pkg_type_for_file_agrees_with_znippy_plugin_extensions, read_capped_accepts_within_limit_and_rejects_bomb, znippy_directory_round_trip_is_byte_exact, tar_zstd_directory_round_trip_is_byte_exact, cross_archive_conversions_are_byte_exact
airgap/src/lib.rs scale_preset_expansion, stacks_explicit_all_expands, stacks_none_uses_scale_preset, argv_mirrors_documented_flags, validate_allows_artifactory_now_that_agent_is_wired, validate_refuses_both_halves, validate_needs_creds_only_when_pushing, plan_lists_every_stack_and_endpoints, execute_refuses_missing_driver, parse_roundtrips
bench-scenarios/src/audit.rs audit_append_yields_real_throughput
bench-scenarios/src/lib.rs propose_clamps_to_quarter_free
bench-scenarios/src/retention.rs executor_throughput_smoke
bench-scenarios/src/served.rs corpus_served_over_protocol, pip_index_served_over_protocol
build-space/src/lib.rs enumerates_the_three_tiers, each_tier_has_the_right_target_and_feature_combo, modes_are_mutually_exclusive_and_bins_require_their_mode, every_tier_validates_against_the_offered_feature_universe, tiers_materialize_the_expected_cargo_commands, surface_reflects_three_valid_rows_with_build_actions, three_tiers_validate_and_assemble_produce_artifacts, press_full_tier_captures_and_round_trips_provenance, pressed_record_persists_to_a_reloadable_ledger, pressing_an_unknown_tier_is_rejected, assemble_tier_rejects_unknown_tier_before_building, assemble_mini_tier_builds_and_attests, airgap_tiers_link_no_outbound_http_client, tampering_a_pressed_record_breaks_the_digest
holger-demo/src/lib.rs holger_infra_is_a_registry_and_replica_scoped_by_zone, shell_previews_holgers_own_infra_not_the_widget_default, shell_has_no_demo_button_guard, jera_central_lists_a_zoned_job, generate_submits_holger_infra_into_pane_and_jera
holger-embed/src/lib.rs fixture_panel_reports_holger_state, read_model_enumerates_dev_pair_and_feeds_the_panel
server/cli/src/main.rs holger_unit_system_scope, holger_unit_user_scope, holger_spec_lifecycle_matches_and_is_fat, collect_files_is_recursive_and_relative, scan_passes_clean_and_blocks_vulnerable, explicit_config_overrides_default
server/lib/src/audit/arrow_ipc.rs roundtrips_events_through_a_segment, is_append_only_across_reopen, corrupt_segment_does_not_abort_replay_of_intact_segments, read_dir_on_missing_dir_is_empty
server/lib/src/audit/mod.rs action_wire_roundtrips, memory_log_collects_in_order, noop_log_is_inert
server/lib/src/auth.rs role_privilege_ordering_and_capabilities, rbac_is_off_until_policy_is_configured, role_resolution_explicit_then_default_then_least_privilege, per_repo_acl_overrides_global_role, no_methods_is_open_access, mtls_cn_authenticates_missing_cn_refused, oauth2_disabled_is_fail_closed_and_coexists_with_bearer, matching_bearer_yields_subject_wrong_refused, empty_secret_method_is_disabled, writer_allowed_reader_denied_rbac, valid_oidc_jwt_authenticates_expired_refused, oidc_identity_maps_to_rbac_role
server/lib/src/exposed/fast_routes.rs lookup_resolves_every_registered_name_to_its_own_backend, same_first_byte_siblings_do_not_alias_and_lengths_are_covered, lookup_misses_return_none, empty_route_table_looks_up_nothing, all_repos_returns_every_registered_route, high_byte_names_bucket_correctly
server/lib/src/exposed/http.rs start_http_gateway_propagates_bind_failure, read_gate_is_off_by_default_and_reads_stay_open, read_gate_on_refuses_anonymous_and_admits_any_authenticated_role, read_gate_denied_role_cannot_read_globally_or_per_repo, read_gate_on_without_auth_methods_refuses_every_read, rbac_off_allows_all_writes, rbac_on_reader_cannot_write_or_delete, rbac_on_writer_uploads_admin_deletes, rbac_on_anonymous_write_fails_closed, rbac_default_role_writer, rbac_per_repo_acl_scopes_the_write_gate, checksum_absent_is_ok, checksum_empty_header_is_ok, checksum_sha256_match_ok, checksum_sha256_uppercase_ok, checksum_sha256_mismatch_rejected, checksum_sha256_garbage_rejected, checksum_sha512_match_and_mismatch, checksum_both_digests_match_ok, search_query_parses_every_axis, search_query_empty_and_unknown_keys, search_query_plus_is_space, sbom_coord_parses_axes, sbom_door_serves_byte_identical_and_404s_missing, search_query_parses_property_filters, properties_door_serves_map_and_validates_coordinate, properties_write_door_sets_and_removes
server/lib/src/exposed/tls.rs extracts_common_name_from_cert, empty_chain_yields_no_cn
server/lib/src/group.rs fetch_returns_first_member_hit_in_order, http_returns_first_non_404_member, list_merges_and_dedups_by_coordinate, group_is_read_only_and_takes_member_format, empty_group_is_raw_and_resolves_nothing
server/lib/src/grpc.rs read_gate_off_serves_anonymous_reads_even_with_rbac_on, read_gate_on_refuses_anonymous_serves_reader_denies_denied, read_gate_covers_every_read_door_not_just_fetch, read_gate_leaves_health_open, fetch_artifact_quarantine_gate_refuses_tagged_serves_untagged, stream_artifact_quarantine_gate_refuses_tagged_serves_untagged, stream_artifact_audits_download_hit_and_miss, list_artifacts_audits_list, list_artifacts_unknown_repo_audits_404, archive_endpoints_audit_list, list_repositories_audits_list, server_profile_derived_static_when_all_repos_read_only, server_profile_derived_dynamic_when_a_repo_is_writable, server_profile_override_forces_static_over_writable_repos, put_artifact_enforces_body_cap, promote_seals_and_audits_for_admin, promote_refused_for_non_admin, promote_is_immutable_on_repromote, promote_without_store_fails_precondition, promote_requires_source_property, offline_method_is_oidc, search_rpc_finds_hits_excludes_non_matches_and_audits, search_rpc_property_axis_filters_and_fails_closed
server/lib/src/grpc/services.rs replicate_rpc_copies_then_is_idempotent, replicate_rpc_rejects_same_source_and_dest, replicate_rpc_dry_run_is_the_default_and_writes_nothing, replicate_rpc_records_an_audit_event, attach_then_fetch_rpc_is_byte_identical, fetch_missing_or_wrong_coordinate_is_not_found, set_then_get_rpc_round_trip, set_empty_values_removes_key_over_rpc, set_property_is_write_gated, set_property_without_store_fails_precondition, fetch_emits_green_on_hit_red_on_miss, stream_emits_red_on_miss, list_emits_red_on_missing_repo, archive_info_emits_red_on_missing_repo, put_rbac_denied_emits_red_on_gate_and_store, put_open_emits_green_on_gate_and_store
server/lib/src/lib.rs relative_default_anchors_under_data_root, absolute_config_wins_over_data_root, without_data_root_stays_cwd_relative, dev_pair_ron_parses_instantiates_and_wires, group_repo_wires_and_resolves_across_members, replicate_between_two_file_backed_stores_is_complete_and_idempotent
server/lib/src/metrics.rs request_counter_counts_exactly_n_per_verb, errors_count_only_5xx, retention_runs_increment, render_is_parseable_prometheus_reflecting_state, audit_action_maps_to_the_expected_verb, recording_via_audit_action_counts_the_grpc_plane_by_verb, proxy_outcomes_count_and_render_by_result_label, duration_histogram_buckets_sum_and_count, label_values_are_escaped
server/lib/src/object.rs page_size_zero_returns_everything_sorted_no_next_token, walks_every_page_exactly_once_across_the_full_listing, next_token_is_the_end_offset_and_slices_the_right_window, offset_past_the_end_returns_empty_page_and_no_token, garbage_and_missing_token_both_start_from_offset_zero, name_filter_narrows_the_set_before_paging, empty_backend_lists_nothing
server/lib/src/promote/mod.rs seal_transitions_and_content_addresses, promoted_artifact_is_immutable, crafted_to_repo_cannot_escape_prod_root, seal_records_a_done_job_in_the_ledger, refused_reseal_records_a_failed_job, seal_without_ledger_writes_no_job, identical_content_dedups_but_refs_are_distinct, gate_blocks_vulnerable_and_passes_clean, gate_from_imported_osv_snapshot_blocks_affected, warn_gate_permits_even_a_blocking_verdict, no_gate_is_pass_through_default_unchanged, tampered_blob_fails_integrity_on_read, parse_property_requirement_forms, property_requirement_met_gates_on_the_map, an_artifact_walks_the_ladder_and_the_lineage_says_where_it_is, an_illegal_hop_is_refused_before_the_store_is_touched, without_a_ladder_promotion_is_exactly_what_it_was, withdrawal_moves_the_answer_not_the_sealed_bytes, the_policy_gate_runs_per_rung_not_per_engine
server/lib/src/promote/stages.rs a_hop_up_one_rung_is_legal_and_carries_the_rungs_gate, skipping_going_backwards_and_unknown_stages_are_all_refused_up_front, a_skipping_ladder_permits_the_jump_but_still_only_forward, the_lineage_records_every_hop_and_answers_where_is_it_now, withdrawal_is_an_append_not_a_deletion_and_the_history_keeps_both, a_crafted_ladder_name_cannot_escape_the_log_root, a_torn_trailing_line_does_not_destroy_the_readable_history
server/lib/src/properties.rs set_then_get_round_trip_multi_value, set_dedups_values, set_empty_values_removes_key, missing_coordinate_is_empty_and_never_matches, properties_do_not_leak_across_coordinate_or_repo, matches_key_exists_vs_exact_value, overwriting_a_key_is_last_wins_and_keeps_other_keys
server/lib/src/provision.rs dev_pair_ron_is_byte_identical_through_the_manifest, a_provisioned_manifest_parses_instantiates_and_wires, problems_are_reported_up_front_and_all_at_once, a_url_ish_bind_address_is_reduced_to_host_port
server/lib/src/proxy.rs fetch_returns_primary_hit_without_consulting_upstreams, fetch_falls_through_to_upstream_on_primary_miss, fetch_returns_none_when_all_miss, fetch_skips_erroring_upstream_and_serves_from_the_next_one, fetch_errors_when_every_upstream_errored_and_none_hit, http_skips_erroring_upstream_and_serves_from_the_next_one, http_returns_primary_on_non_404, http_falls_through_to_upstream_on_primary_404, http_returns_404_when_all_404, proxy_name_and_format_delegate_to_primary, fetch_caches_upstream_hit_into_writable_primary, negative_cache_short_circuits_repeated_fetch_miss, negative_cache_disabled_requeries_every_fetch_miss, negative_cache_never_shadows_a_later_primary_hit, negative_cache_short_circuits_repeated_http_miss, proxy_outcomes_bump_the_global_metrics_family, negative_cache_expired_entry_is_a_miss
server/lib/src/raw.rs put_then_fetch_round_trip, fetch_missing_returns_none, put_and_fetch_reject_path_traversal, http_put_get_delete_round_trip, http_get_missing_is_404_and_wrong_repo_is_404, http_rejects_traversal_in_path, list_enumerates_nested_and_round_trips_to_fetch, list_filters_by_substring_and_respects_limit, delete_artifact_verifies_content_id_before_unlink, writable_and_raw_format, method_not_allowed_for_unknown_verb
server/lib/src/replication.rs dry_run_reports_every_artifact_and_writes_nothing, execute_copies_every_source_artifact_byte_identical, rerun_is_a_no_op_everything_already_present_by_content_id, changed_content_is_recopied_not_skipped, read_only_destination_fails_closed_never_silently_drops, partial_destination_copies_only_the_missing_remainder, limit_caps_examined_artifacts_and_flags_truncation
server/lib/src/repository.rs writable_archive_config_builds_writable_backend, archive_path_config_is_read_only_drift, rust_remote_config_builds_read_only_upstream, nexus_remote_config_builds_read_only_upstream, artifactory_remote_config_builds_read_only_upstream, unrecognised_upstream_format_fails_boot_instead_of_defaulting_to_rust, azure_and_aws_remote_configs_build_read_only_upstreams, remote_upstream_configs_fail_closed_without_federation
server/lib/src/retention.rs empty_input_yields_empty_plan, noop_policy_keeps_everything, keep_last_n_reclaims_older_versions_per_name, keep_last_n_is_per_name_not_global, max_age_reclaims_old_and_keeps_young, protect_latest_saves_the_newest_even_when_aged, keep_min_per_name_is_a_floor_against_age, quota_evicts_oldest_until_under_bound, quota_never_evicts_a_protected_latest, combined_policy_composes_keep_last_and_quota, namespace_separates_groups, plan_is_deterministic, record_without_created_at_is_never_aged_out, cmp_version_orders_numeric_segments, property_pinned_record_survives_a_sweep_that_reclaims_the_untagged, property_pinned_record_is_not_quota_evicted
server/lib/src/sbom.rs attach_then_fetch_is_byte_identical, missing_sbom_is_not_found, wrong_coordinate_does_not_match, re_attach_overwrites_last_wins, hostile_coordinate_cannot_escape_the_root, build_cyclonedx_is_modgunn_schema_verbatim
server/lib/src/search.rs name_search_finds_matches_and_excludes_non_matches, name_search_is_case_insensitive_substring, gavc_namespace_and_version_narrow_the_set, checksum_search_matches_content_digest_and_reports_it, checksum_search_excludes_non_matching_content, repo_scoping_restricts_the_search, path_search_matches_raw_archive_paths_only, empty_query_lists_every_artifact_across_repos, limit_caps_hits_and_flags_truncation, truncated_set_when_cap_lands_on_a_repo_boundary, not_truncated_when_cap_equals_total_matches, property_axis_includes_only_tagged_and_excludes_untagged, property_filter_without_lookup_matches_nothing, property_filters_and_compose_with_axes, property_key_presence_matches_any_value
server/lib/src/security.rs ecosystem_mapping_is_canonical, parse_coords_across_ecosystems, parse_coords_skips_metadata, clean_listing_passes, known_high_vuln_blocks, low_npm_advisory_warns_all_versions, log4shell_kev_blocks_as_critical, metadata_files_are_skipped_not_scanned, all_repository_types_map_and_scan_clean, verdict_states_pass_warn_block_and_strongest_wins, report_state_json_carries_counts_and_findings
server/lib/src/upstream/mod.rs auth_translation_is_field_preserving, format_translation_maps_and_falls_back, adapter_is_read_only_and_delegates_identity, azure_repo_splits_project_and_feed
server/lib/src/upstream_rust.rs crates_io_defaults_build_expected_urls, custom_base_urls_are_honored, put_is_rejected_read_only, hung_upstream_times_out_instead_of_hanging, live_fetch_serde_from_crates_io
server/repository/file-oci/src/lib.rs tags_list_unknown_repo_returns_404_name_unknown, version_probe, full_push_pull_roundtrip_session_upload, list_and_archive_files_surface_pushed_images, list_limit_zero_returns_all, percent_encoded_digest_on_finalize, monolithic_upload, chunked_upload_via_patch, digest_mismatch_rejected, manifest_with_unknown_blob_rejected, unknown_blob_and_manifest_404, malformed_digest_400, traversal_in_image_or_reference_blocked, referenced_digests_scan, put_via_trait_requires_blobs
server/repository/file-rust/src/lib.rs sparse_path_test_1, sparse_path_test_2, sparse_path_test_3, sparse_path_test_n, sparse_path_into_tuple, delete_artifact_verifies_content_id_before_unlink, put_then_fetch_round_trip, put_and_fetch_reject_path_traversal, fetch_missing_returns_none, list_returns_all_put_artifacts, list_filters_by_name_substring, list_on_missing_base_dir_is_empty, config_json_uses_configurable_base_url, sparse_index_returns_real_checksums, sparse_index_missing_crate_returns_404, download_returns_real_crate_bytes, download_missing_crate_returns_404, streaming_hash_matches_in_memory_hash, cksum_cache_hits_and_invalidates_on_change
server/repository/znippy-composer/src/lib.rs test_new, test_format, serves_injected_archive
server/repository/znippy-conda/src/lib.rs test_new, test_format, package_filename_is_name_version_build_tar_bz2, serves_injected_archive
server/repository/znippy-deb/src/control.rs parses_uncompressed_control_tar, parses_gzip_control_tar, parses_xz_control_tar, parses_zstd_control_tar, non_deb_bytes_yield_none, deb_without_control_member_yields_none, unsupported_codec_yields_none
server/repository/znippy-deb/src/lib.rs test_new, deb_control_parse_capability, serves_injected_archive, synthesizes_apt_index_from_pool, native_control_parse_enriches_packages, test_format, fetch_no_version_collision_udeb_and_arch
server/repository/znippy-docker/src/lib.rs test_new, test_format, serves_injected_archive, serves_namespaced_image_and_tags_list
server/repository/znippy-gem/src/lib.rs test_new, test_format, gem_basename_drops_ruby_platform_keeps_native, serves_injected_archive
server/repository/znippy-go/src/lib.rs test_new, test_format, serves_injected_archive, version_list_info_and_mod_routes
server/repository/znippy-helm/src/index.rs parse_chart_yaml_extracts_fields, parse_chart_yaml_ignores_nested_and_requires_name_version, generate_index_skips_malformed_chart, chart_meta_from_tgz_roundtrip, chart_decode_uses_parallel_lgz, digest_is_stable_sha256, generate_index_lists_entry_with_digest_and_url, generate_index_groups_versions_under_one_chart, generate_index_empty_is_valid_header, parse_chart_yaml_unquotes_single_quotes, generate_index_escapes_special_scalars
server/repository/znippy-helm/src/lib.rs test_new, test_format, list_parses_chart_coordinates, http_serves_tgz_and_404s_unknown, http_serves_prebaked_index_yaml, synthesized_index_and_subdir_chart_serve
server/repository/znippy-maven/src/lib.rs maven_metadata_maturity_disclosure, checksum_hex_is_lowercase_and_known, snapshot_metadata_declares_local_copy_and_lists_classifiers, maven_version_ordering, maven_metadata_lists_versions_latest_and_release, maven_metadata_all_snapshots_has_no_release, maven_metadata_xml_escapes_entities, test_new_maven_repo, test_readonly, test_format
server/repository/znippy-npm/src/lib.rs test_new, test_format, parse_tgz_version_handles_hyphenated_name, parse_npm_wire_splits_scoped_tarball_and_packument, serves_injected_archive
server/repository/znippy-nuget/src/lib.rs test_new, v3_index_uses_configured_base_url, test_format, serves_injected_archive, flatcontainer_version_list_route
server/repository/znippy-package/src/lib.rs test_new, test_format, serves_injected_archive, verified_open_accepts_trusted_root_and_serves_bytes, verified_open_rejects_wrong_and_empty_roots, unverified_open_still_works_on_signed_archive
server/repository/znippy-python/src/lib.rs test_html_escape_blocks_injection, parse_dist_filename_wheels_and_sdists, test_new, test_readonly, test_format, test_sha256_hex_known_vector, test_json_escape_blocks_injection, test_normalize_name
server/repository/znippy-rpm/src/header.rs parses_full_header, missing_optional_tags_are_none, non_rpm_bytes_yield_none, truncated_store_yields_none
server/repository/znippy-rpm/src/lib.rs format_block_xml_attr_escapes_all_five_entities_incl_apos, test_new, test_format, rpm_header_parse_capability, native_header_parse_enriches_primary, parse_nevra_filename, serves_injected_archive, synthesizes_rpm_md_index_from_packages, fetch_no_version_collision_and_multi_package_primary
server/repository/znippy-rust/src/lib.rs new_repo_has_no_files, znippy_repo_is_readonly, has_archive_reflects_reader, config_json_uses_configured_base_url, sparse_index_returns_real_checksums_for_archived_crate, sparse_index_returns_404_for_absent_crate, sparse_index_with_multiple_versions_returns_all, download_returns_crate_bytes_from_archive, parse_crate_path_handles_hyphenated_names, list_with_no_reader_is_empty, writable_repo_put_then_serve_roundtrip, concurrent_puts_do_not_corrupt_archive, cargo_publish_stores_and_serves, sparse_index_serves_real_published_deps, index_meta_from_publish_maps_deps_keeps_all_kinds, feature_referenced_dev_dep_survives_in_index_entry, cargo_publish_rejected_on_read_only_repo
server/ui/src/about.rs about_oracle_carries_identity_and_framework
server/ui/src/app.rs every_tab_has_exactly_one_palette_command, static_mode_drops_upload_from_the_palette_and_nothing_else, command_palette_dispatches_tabs_and_tools, repo_row_context_action_navigates, about_command_opens_popup_and_reports_identity_and_framework, demo_tool_dispatches_a_jera_job_observably, default_preset_is_dark_and_roster_is_collapsed, switching_preset_rethemes_the_resolved_palette, apply_publishes_the_coherent_legacy_palette_into_egui, settings_pane_is_the_one_home_of_look_and_feel
server/ui/src/app/scene.rs holger_scene_is_valid, every_decomposed_tab_body_is_a_draggable_split_of_two_named_halves, every_pane_title_tab_label_and_menu_group_is_uniquely_addressable, holger_scene_ron_round_trips_byte_stable, every_tab_leaf_and_rail_pane_is_foldable, shell_is_a_draggable_master_detail_split_over_a_drawer_rail, menubar_groups_route_existing_commands, no_look_and_feel_at_the_shell_root, view_accelerators_are_unique_across_the_whole_strip
server/ui/src/data.rs status_ok_populates_view_and_state_json, status_error_is_surfaced_not_loaded, repos_load_selects_first_and_preserves_selection_by_name, upload_enabled_tracks_selected_repo_writable, fetch_found_sets_size_and_does_not_leak_bytes_into_state_json, fetch_missing_is_not_found_not_error, fetch_transport_error_is_surfaced, put_rejected_on_read_only_repo, put_succeeds_on_writable_repo, combined_state_json_has_all_three_views, archive_lists_files_and_stats, archive_transport_error_is_surfaced, browse_lists_artifacts_for_repo, security_scan_clean_repo_passes, security_scan_vulnerable_repo_blocks_with_advisory, dependency_graph_colours_all_nodes_by_verdict, dependency_graph_surfaces_transport_error, migrate_config_cli_command_switches_source_flag, ds_config_cli_command_reflects_scale_and_target, security_scan_transport_error_is_surfaced, browse_unknown_repo_is_empty_not_error, holger_ds_micro_run_produces_real_throughput, migrate_without_url_surfaces_clear_validation, airgap_dry_run_produces_plan_result, deploy_plans_over_real_sealed_bundle, deploy_empty_archive_surfaces_clear_message, deploy_transport_error_is_surfaced, airgap_mtls_without_certs_surfaces_clear_error
server/ui/src/data/lineage.rs audit_event_maps_and_derives_ecosystem_and_upstream, channel_audit_tap_streams_live_into_view, replay_from_audit_dir_round_trips, demo_events_fill_and_dedup, classify_covers_ecosystems_and_falls_back, explicit_upstream_overrides_derived, no_upstream_ecosystem_wires_only_requested_by, bare_list_event_counts_but_adds_no_node, incremental_pump_pops_nodes_in_across_frames
server/ui/src/demo.rs tour_walks_every_tab, due_is_time_injected_and_fires_once, offline_fill_is_safe_and_populated
server/ui/src/infra.rs demo_spec_maps_validates_and_is_pinned, demo_dispatch_records_a_jera_boot_container_job
server/ui/src/login_seam.rs subject_of_reads_jwt_identity, login_config_reads_env_then_placeholders, credential_names_are_store_driven_names_only
server/ui/src/robot_remote.rs drives_the_holger_shell_over_a_real_unix_socket, drives_every_recorded_tab_scenario_over_a_real_unix_socket
traits/src/lib.rs znippy_type_ids_match_znippy_skeletons, znippy_type_ids_derive_from_znippy_handlers_not_holger_copies, upstream_path_maps_per_ecosystem_layout, upstream_auth_defaults_to_none, format_str_roundtrips_aliases
traits/src/znippy_format.rs a_missing_or_garbage_archive_is_undetermined_not_refused, the_pin_refuses_newer_and_admits_current_and_older, the_refusal_names_the_archive_the_version_and_the_ceiling, the_gate_memo_is_keyed_on_the_file_not_the_path

Integration tests (133)

file tests
agent/cli/tests/integration_artifactory_bench_twin.rs test_artifactory_load_twin_small_scale
agent/cli/tests/integration_holger.rs test_holger_h2c_with_mannequin_nexus, test_oidc_auth_flow_with_mannequin, test_mtls_auth_validation_with_mannequin
agent/cli/tests/integration_latency_bench_twin.rs test_latency_tail_twin_small_scale
agent/cli/tests/integration_latency_tail.rs test_tail_latency_gc_pressure
agent/cli/tests/integration_nexus_bench_twin.rs test_nexus_load_twin_small_scale
agent/cli/tests/integration_nexus_load.rs test_nexus_load_with_real_artifacts
agent/cli/tests/integration_pip.rs test_pip_requirements_txt_to_directory, test_pip_uv_lock_to_directory, test_pip_airgap_and_push_to_mannequin
agent/cli/tests/integration_tar_zstd.rs test_tar_zstd_round_trip_with_mannequin, test_tar_zstd_archive_contents_valid, test_tar_zstd_push_to_holger_with_oidc
build-space/tests/auth_ship_small.rs bearer_only_tier_excludes_oidc_closure, full_tier_links_both_modern_providers
holger-recipe/tests/toml_parity.rs the_committed_toml_is_the_codes_emission_byte_for_byte
build-space/tests/example_press_runs.rs press_build_thing_example_runs_end_to_end
build-space/tests/suite_build_shape.rs holger_build_variants_validate_with_fat_thin_service_shape
holger-demo/tests/robot.rs holger_shell_robot_json_drive_scenario
mannequin/tests/gui_robot.rs mannequin_gui_renders_three_system_nodes_with_badges, mannequin_gui_click_selects_node_and_state_reflects_it, mannequin_chart_renders_under_every_look_preset
mannequin/tests/look_preset_robot.rs look_preset_switcher_is_remote_drivable_and_observable
mannequin/tests/robot_shell.rs mannequin_shell_is_a_draggable_master_detail_split_with_chrome, robot_drag_divider_moves_both_pane_rects, robot_chrome_minimise_maximise_restore_move_the_rects, robot_fold_hides_the_body_and_keeps_the_way_back, robot_map_selection_drives_the_detail_pane
mannequin/tests/smoke_serve.rs mannequin_boots_in_process_and_serves, mannequin_serve_boots_and_listens
server/cli/tests/tools_robot.rs tool_robot_drives_every_working_tool_verb
server/lib/tests/graceful_backend_init.rs corrupt_archive_disables_only_that_repo, all_repos_failing_hard_fails, future_format_archive_disables_only_that_repo_and_the_server_serves_on
server/lib/tests/integration_oci_tls.rs oci_push_pull_over_tls, writes_blocked_without_auth_reads_open
server/lib/tests/retention_adapter.rs plan_repo_retention_keeps_last_n_over_a_live_listing, plan_repo_retention_property_pin_survives_sweep, plan_repo_retention_noop_policy_keeps_all
server/lib/tests/retention_executor.rs dry_run_reclaims_nothing, execute_drops_exactly_the_delete_set_and_keeps_the_rest, execute_never_drops_a_protected_latest, executor_refuses_a_delete_flag_on_a_protected_record, execute_records_a_jera_job_when_a_ledger_is_attached
server/lib/tests/unit_tests.rs test_parse_minimal_config, test_wire_holger, test_rust_api_fetch, test_list_repositories, test_fetch_unknown_repo_errors, test_maven_config, generated_proto_types_roundtrip
server/repository/znippy-conda/tests/plugin_read_view.rs conda_backend_serves_package_via_view_and_real_repodata
server/repository/znippy-gem/tests/plugin_read_view.rs gem_backend_serves_platform_gem_via_view_and_real_compact_index
server/repository/znippy-maven/tests/plugin_read_view.rs maven_backend_serves_snapshot_and_classifier_via_view, maven_backend_synthesizes_checksums_and_snapshot_metadata
server/repository/znippy-npm/tests/plugin_read_view.rs npm_backend_serves_scoped_package_via_view
server/repository/znippy-python/tests/plugin_read_view.rs python_backend_serves_wheel_and_sdist_via_view
server/repository/znippy-python/tests/uv_airflow_journey.rs uv_style_install_resolves_and_verifies_every_wheel, airflow_dag_hydrates_each_task_env_from_holger
server/repository/znippy-rust/tests/format_version_gate.rs a_future_version_archive_is_refused_at_open_and_the_good_repo_keeps_serving, a_writable_archive_gone_future_fails_the_request_not_the_server, the_gate_admits_the_current_format_and_stays_out_of_the_way
server/repository/znippy-rust/tests/integration_znippy_serve.rs test_znippy_archive_full_roundtrip, test_znippy_archive_smoke, test_znippy_archive_smoke_hermetic, test_all_types_download_pack_benchmark
server/repository/znippy-rust/tests/plugin_read_view.rs rust_backend_serves_hyphenated_prerelease_via_view
server/ui/tests/demo_walk.rs demo_walk_robot_drives_every_view_offline
server/ui/tests/lineage_feed.rs live_feed_fills_lineage_graph, replay_batch_clusters_by_ecosystem
server/ui/tests/local_core.rs ui_data_round_trips_through_real_local_holger, browse_paginates_with_load_more
server/ui/tests/remote_grpc.rs ui_data_round_trips_over_real_grpc, large_payload_round_trips_over_grpc, bearer_token_path_is_wire_correct
server/ui/tests/robot_login_pane.rs holger_seam_drives_the_shared_login_pane_no_leak, login_pane_renders_a_signin_button
server/ui/tests/robot_scene.rs robot_scene_drag_master_detail_divider_moves_both_rects, robot_scene_drag_rail_divider_moves_the_rail_panes, robot_scene_chrome_minimise_maximise_restore_move_the_rects, robot_scene_every_chromed_pane_minimises_and_restores, robot_scene_rail_drives_the_one_master_selection, every_registered_tab_is_covered, robot_scene_tabview_visits_every_pane, robot_scene_folds_and_unfolds_every_pane, robot_scene_menubar_drives_nav_commands, robot_scene_menubar_help_opens_about, robot_scene_deep_link_navigates_pane_by_name, robot_scene_responsive_phone_collapses_split_and_shuts_the_drawer, robot_scene_every_decomposed_tab_body_drags_maximises_and_restores_by_rect
server/ui/tests/robot_ui.rs browse_view_state_json_lists_seeded_artifacts, archive_view_state_json_exposes_tree_and_stats
server/ui/tests/robot_ui_app.rs robot_drives_scene_shell_tabs_and_folds, robot_drives_tabs_tools_and_static_mode, robot_drives_lineage_tab, robot_drives_tools_1_3_5_panes, robot_runs_each_tool_real_action_and_sees_version, robot_tools_panes_self_report_render_status, robot_clicks_repo_node_and_lights_its_subgraph, robot_static_mode_reflects_server_profile, robot_static_mode_disables_other_tools, robot_repo_row_selection_propagates, robot_status_tab_nav_and_refresh, robot_upload_writable_reflects_selected_repo, robot_static_mode_redirects_upload_to_status, robot_look_preset_switcher_and_static_override, robot_tool_config_selectables_change_state, robot_airgap_validate_can_run_state, robot_startup_splash_dismisses_on_click, robot_artifact_fetch_found_and_not_found, robot_browse_tab_refresh_lists_artifacts, robot_archive_tab_refresh_stats_and_files, robot_security_scan_block_verdict, robot_deploys_selected_repo_sealed_bundle, robot_opens_about_and_dispatches_the_jera_demo, robot_drives_the_adopted_facett_scene, robot_scene_folds_controls_on_narrow_viewport, robot_helix_tab_winds_the_scanned_repo_dag
server/ui/tests/thin_client.rs every_shipped_ui_tier_is_thin_and_only_the_named_one_embeds, the_shared_audit_still_refuses_what_holger_needs_it_to_refuse
server/ui/tests/tier_ladder.rs the_tier_ladder_is_strictly_leaner_by_crate_count, the_tier_ladder_is_strictly_leaner_in_bytes
server/ui/tests/warehouse_scan.rs tools3_scan_uses_warehouse_advisories_when_configured
xtask/tests/build_verb.rs build_list_prints_the_three_tiers_and_emits_a_row, build_variant_presses_a_tier_end_to_end, build_all_assembles_every_deployment_tier
xtask/tests/holger_matrix.rs holger_component_matrix_is_green, build_space_press_cells_are_green_for_every_tier, holger_matrix_heavy_mannequin_boot, holger_multicore_sanity_scales_with_cores, red_cell_shows_up_red_in_the_grid, testmatrix_feature_emits_functional_rows_into_the_sink

Doc tests (2)

file doc-tests
build-space/src/lib.rs 1
server/repository/znippy-conda/src/lib.rs 1

Dependency graph