success Pipeline #29

ab23a1fcmastertriggered by push7m 44s

Steps

successpipeline setup3s
successsetup8s
( 1/16) Upgrading libcrypto3 (3.5.8-r0 -> 3.5.9-r0)
( 2/16) Upgrading libssl3 (3.5.8-r0 -> 3.5.9-r0)
( 3/16) Installing binaryen (129-r0)
( 4/16) Installing brotli-libs (1.2.0-r1)
( 5/16) Installing c-ares (1.34.8-r0)
( 6/16) Installing libunistring (1.4.2-r0)
( 7/16) Installing libidn2 (2.3.8-r0)
( 8/16) Installing nghttp2-libs (1.70.0-r0)
( 9/16) Installing libpsl (0.21.5-r3)
(10/16) Installing libcurl (8.22.0-r0)
(11/16) Installing curl (8.22.0-r0)
(12/16) Installing just (1.48.1-r0)
(13/16) Installing make (4.4.1-r4)
(14/16) Installing pkgconf (2.5.1-r0)
(15/16) Installing openssl-dev (3.5.9-r0)
(16/16) Installing openssl-libs-static (3.5.9-r0)
Executing busybox-1.37.0-r31.trigger
Executing ca-certificates-20260909-r0.trigger
OK: 266.2 MiB in 45 packages
info: downloading 2 components
info: downloading component rust-std
/tmp/trunk.tar.gz: OK
just 1.48.1
1.4.2
trunk 0.21.14
rustfmt 1.9.0-stable (48a229ceae 2026-09-01)
clippy 0.1.98 (48a229ceae 2026-09-01)
successlint4s
cargo fmt --check
cargo clippy --workspace --all-targets -- -D warnings
    Checking pimdav v0.1.0 (/ci/build/project/pimdav)
    Checking api-types v0.1.0 (/ci/build/project/api-types)
    Checking server v0.1.0 (/ci/build/project/server)
    Checking web v0.1.0 (/ci/build/project/web)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 3.29s
warning: the following packages contain code that will be rejected by a future version of Rust: proc-macro-error2 v2.0.1
note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 1`
successtest1m 37s
cargo test --workspace
   Compiling pimdav v0.1.0 (/ci/build/project/pimdav)
   Compiling api-types v0.1.0 (/ci/build/project/api-types)
   Compiling server v0.1.0 (/ci/build/project/server)
   Compiling web v0.1.0 (/ci/build/project/web)
    Finished `test` profile [unoptimized + debuginfo] target(s) in 10.59s
warning: the following packages contain code that will be rejected by a future version of Rust: proc-macro-error2 v2.0.1
note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 1`
     Running unittests src/lib.rs (/ci/cache/target/debug/deps/api_types-858efac1f0974f27)

running 7 tests
test tests::mutation_defaults_missing_fields ... ok
test tests::mode_wire_format_is_rw_ro ... ok
test tests::me_round_trip ... ok
test tests::mutation_round_trip_skips_absent_fields ... ok
test tests::op_wire_format ... ok
test tests::pim_share_mode_wire_format ... ok
test tests::root_defaults_mode_to_rw ... ok

test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

     Running unittests src/lib.rs (/ci/cache/target/debug/deps/pimdav-0fe92edffec5c257)

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

     Running tests/bundle.rs (/ci/cache/target/debug/deps/bundle-affcacba118a9f62)

running 19 tests
test feeds_skip_a_component_cut_off_before_its_end ... ok
test import_splits_cards ... ok
test byte_order_mark_is_ignored ... ok
test escaped_tzid_finds_its_zone ... ok
test a_free_this_and_future_override_frees_the_later_instances ... ok
test calendar_names_itself ... ok
test quoted_tzid_keeps_its_zone ... ok
test a_busy_range_override_of_a_free_series_stays_busy ... ok
test busy_time_hides_what_blocks_nothing ... ok
test a_second_master_of_a_uid_gets_an_object_of_its_own ... ok
test busy_time_writes_exdates_once_and_import_drops_cut_parts ... ok
test public_feeds_reduce_private_objects ... ok
test override_placement_reads_the_masters_own_time_zones ... ok
test shared_uid_across_types_splits_and_empty_uid_is_missing ... ok
test an_override_follows_the_master_that_has_its_instance ... ok
test feed_merges_objects_and_deduplicates_zones ... ok
test import_splits_by_uid_with_overrides_and_zones ... ok
test overrides_of_several_masters_are_placed_quickly ... ok
test many_masters_of_one_uid_are_placed_quickly ... ok

test result: ok. 19 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.08s

     Running tests/contact.rs (/ci/cache/target/debug/deps/contact-9c6c91bd6443dcc9)

running 9 tests
test photo_forms ... ok
test anniversaries ... ok
test vcard_2_1_bare_types_label_values ... ok
test the_card_view_reads_apple_dates ... ok
test non_ascii_dates_are_ignored ... ok
test leap_day_birthday ... ok
test birthday_forms ... ok
test many_apple_dates_stay_linear ... ok
test many_labelled_emails_stay_linear ... ok

test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.24s

     Running tests/corpus.rs (/ci/cache/target/debug/deps/corpus-e14995ea1814cf73)

running 1 test
test corpus_matches_oracle ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.70s

     Running tests/expand.rs (/ci/cache/target/debug/deps/expand-12791e708c413356)

running 27 tests
test dst_gap_and_fold ... ok
test dtstart_is_the_first_of_count ... ok
test duration_days_are_nominal_and_dtend_is_exact ... ok
test instance_for_finds_instances_moved_by_this_and_future ... ok
test a_this_and_future_move_across_dst_keeps_the_local_time ... ok
test instance_for_finds_an_instance_moved_across_dst ... ok
test exdate_forms ... ok
test mixed_numbered_and_plain_weekdays ... ok
test rdate_period_on_dtstart_keeps_its_length ... ok
test old_biweekly_rule_keeps_its_grid ... ok
test instances_longer_than_a_year_are_found_inside ... ok
test rdate_is_deduplicated_and_excluded ... ok
test todo_uses_due ... ok
test this_and_future_moves_later_instances ... ok
test utc_until_on_an_all_day_series_keeps_its_day ... ok
test window_overlap ... ok
test utc_until_east_of_utc_keeps_last_instance ... ok
test unsupported_rules_leave_dtstart_only ... ok
test old_sub_daily_rule_skips_ahead ... ok
test sub_daily_rule_keeps_its_grid_across_hour_limits ... ok
test a_huge_duration_does_not_expand_an_endless_rule_to_the_cap ... ok
test unused_time_zones_cost_nothing ... ok
test bysetpos_gives_the_same_instances_in_any_window ... ok
test a_rule_that_never_matches_stops_early ... ok
test custom_vtimezone_rules ... ok
test runaway_rule_is_truncated ... ok
test the_rules_of_one_series_share_one_budget ... ok

test result: ok. 27 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.94s

     Running tests/itip.rs (/ci/cache/target/debug/deps/itip-5c98f543cbb5e729)

running 70 tests
test a_cancelled_range_cancels_the_later_instances ... ok
test a_reply_status_keeps_only_its_code ... ok
test a_client_scheduled_attendee_gets_no_cancel ... ok
test a_new_override_takes_the_others_state_from_its_range ... ok
test a_changed_exrule_is_a_reschedule ... ok
test a_range_on_the_last_day_of_a_date_until_ends_the_series_before_it ... ok
test a_range_an_attendee_is_left_out_of_ends_their_series ... ok
test a_huge_duration_does_not_panic ... ok
test a_date_until_on_the_same_day_extends_the_series ... ok
test a_copy_without_its_master_keeps_the_shift ... ok
test a_new_override_that_changes_the_length_is_a_reschedule ... ok
test a_range_from_the_first_instance_cancels_the_whole_series ... ok
test a_reordered_save_sends_nothing ... ok
test a_new_override_at_the_shifted_time_is_no_move ... ok
test a_new_override_that_moves_bumps_the_sequence ... ok
test an_attendee_may_complete_one_instance ... ok
test a_stale_range_past_the_series_cuts_nothing ... ok
test a_room_declines_one_instance_a_this_and_future_override_moves ... ok
test a_room_declines_a_series_with_many_conflicts_as_a_whole ... ok
test a_rule_in_another_form_is_the_same_rule ... ok
test attendee_delete_declines ... ok
test accept_and_apply_reply ... ok
test attendees_may_not_drop_a_cancelled_instance ... ok
test an_attendee_dropped_from_the_master_gets_a_cancel_despite_a_client_override ... ok
test answering_an_instance_the_series_lacks_changes_nothing ... ok
test a_room_declines_only_the_first_instance_of_a_this_and_future_override ... ok
test a_sequence_bump_reaches_the_copies_quietly ... ok
test attendees_may_delete_an_instance_or_drop_one_of_their_instances ... ok
test an_override_without_end_has_the_default_length ... ok
test attendees_may_not_move_the_meeting ... ok
test attendees_may_not_change_an_instance_through_its_override ... ok
test attendees_keep_the_organizers_status_of_an_instance ... ok
test dropping_a_declined_instance_replies_with_the_series_answer ... ok
test an_attendee_may_write_the_same_end_in_another_form ... ok
test forget_a_deleted_principal ... ok
test invite ... ok
test instances_only_reach_their_attendees ... ok
test a_spelled_out_rule_that_adds_leap_days_is_a_change ... ok
test declining_one_instance ... ok
test clients_may_name_the_week_start_or_confirm_their_instance ... ok
test roles ... ok
test reply_for_a_missing_instance_adds_nothing ... ok
test removed_attendee_and_delete_cancel ... ok
test rooms_answer_from_their_bookings ... ok
test sender_is_named_for_the_owner ... ok
test an_attendee_may_write_the_same_rule_in_another_form ... ok
test reschedule_resets_participation ... ok
test the_highest_sequence_does_not_overflow ... ok
test count_and_until_compare_by_the_last_instance ... ok
test clients_may_spell_out_the_month_and_day_of_a_rule ... ok
test unchanged_or_forced ... ok
test updates_keep_what_the_attendee_owns ... ok
test rule_ends_compare_in_the_wall_time_of_the_start ... ok
test moving_a_far_until_costs_only_the_gap ... ok
test many_attendees_and_ranges_stay_fast ... ok
test many_ranges_one_attendee_is_left_out_of_stay_fast ... ok
test an_attendee_may_delete_many_instances_but_not_without_end ... ok
test an_override_of_no_instance_is_refused_and_many_overrides_stay_fast ... ok
test a_month_rule_that_adds_leap_days_is_a_change ... ok
test a_reply_may_not_add_an_override_of_no_instance_by_a_far_key ... ok
test a_reply_never_grows_the_object_past_the_limit ... ok
test narrowing_a_range_never_grows_the_object_past_the_limit ... ok
test many_attendees_share_one_message_body ... ok
test far_apart_replies_on_a_dense_series_all_land ... ok
test a_copy_with_many_overrides_is_answered_fast ... ok
test far_ranges_on_an_endless_dense_series_stay_fast ... ok
test far_rule_changes_on_many_components_share_one_budget ... ok
test an_attendee_may_not_answer_an_instance_no_one_can_confirm ... ok
test many_far_apart_replies_on_an_endless_dense_series_stay_fast ... ok
test a_series_left_out_of_two_far_ranges_ends_at_the_first ... ok

test result: ok. 70 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.20s

     Running tests/principal.rs (/ci/cache/target/debug/deps/principal-01bec423335c7fcf)

running 4 tests
test directory_card_escapes_text ... ok
test list_all_and_stray_properties ... ok
test zero_nresults_means_no_limit ... ok
test property_search_and_calendarserver_search ... ok

test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

     Running tests/protocol.rs (/ci/cache/target/debug/deps/protocol-17e309328345a09d)

running 12 tests
test missing_dtstamp_is_inserted ... ok
test a_cut_or_nested_object_is_refused ... ok
test vcards ... ok
test one_master_per_object_and_no_blank_uid ... ok
test a_rule_with_a_huge_count_is_refused ... ok
test multistatus_round_trips ... ok
test propfind_bodies ... ok
test calendar_objects ... ok
test update_bodies ... ok
test deep_bodies_and_control_characters ... ok
test too_many_rules_are_refused ... ok
test huge_objects_are_refused ... ok

test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s

     Running tests/report.rs (/ci/cache/target/debug/deps/report-ce081ca0afe4247d)

running 34 tests
test an_instance_moved_by_a_range_takes_the_overrides_component ... ok
test busy_time ... ok
test address_data_converts_versions ... ok
test expand_keeps_a_task_without_start ... ok
test busy_time_follows_own_answer ... ok
test expand_puts_a_kept_task_in_utc ... ok
test expand_puts_every_zoned_time_of_an_instance_in_utc ... ok
test a_photo_data_uri_survives_the_conversion_to_4_0 ... ok
test limit_recurrence_keeps_an_override_whose_original_overlaps_the_range ... ok
test limit_recurrence_keeps_an_override_moved_out_of_the_range ... ok
test vcard_three_is_the_default ... ok
test bad_filters_are_valid_filter_conditions ... ok
test floating_times_use_the_query_zone ... ok
test outbox_free_busy_request ... ok
test unicode_casemap_folds_after_nfkd ... ok
test an_empty_comp_selects_the_whole_component ... ok
test text_match_ignores_pretty_printing ... ok
test vcard_three_gets_plain_numbers_and_apple_birthdays ... ok
test an_open_range_on_an_endless_rule_needs_no_expansion ... ok
test card_uris_and_geo_survive_conversion ... ok
test binary_values_that_are_text_keep_their_encoding ... ok
test a_task_alarm_without_start_fires_from_due ... ok
test card_filters ... ok
test expand_keeps_dates_and_limit_keeps_used_overrides ... ok
test groups_and_companies_in_apple_forms ... ok
test a_photo_without_type_gets_its_media_type_in_4_0 ... ok
test alarms_fire_per_instance ... ok
test report_bodies ... ok
test uri_values_keep_their_commas_and_semicolons ... ok
test only_values_sent_in_base64_are_written_in_base64 ... ok
test freebusy_components_and_properties ... ok
test todo_time_ranges ... ok
test many_overrides_expand_once_per_query ... ok
test expand_refuses_an_answer_too_big_to_build ... ok

test result: ok. 34 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.31s

     Running unittests src/lib.rs (/ci/cache/target/debug/deps/server-5d71aea3c9871ddf)

running 105 tests
test api::search::tests::join_rel_lifts_a_path_to_the_server_root ... ok
test api::search::tests::excludes_cover_descendants_but_not_name_siblings ... ok
test api::common::tests::share_query_field_is_p_share ... ok
test api::search::tests::name_match_ignores_the_parent_path ... ok
test api::search::tests::name_match_needs_every_word ... ok
test api::files::tests::query_fields_are_the_shared_constants ... ok
test api::search::tests::query_fields_are_the_shared_constants ... ok
test api::search::tests::truncation_caps_length ... ok
test api::search::tests::truncation_strips_terminator ... ok
test api::search::tests::truncation_keeps_utf8_boundary ... ok
test archive::tests::format_metadata ... ok
test archive::tests::format_parsing ... ok
test archive::tests::build_fails_on_missing_dir ... ok
test api::pim_schedule::tests::a_rule_running_on_has_not_ended_and_costs_nothing ... ok
test api::files::tests::publish_refuses_an_existing_target_without_overwrite ... ok
test assets::tests::asset_paths_outside_dist_are_rejected ... ok
test auth::tests::login_delay_grows_after_free_tries ... ok
test auth::tests::parse_session_cookie_variants ... ok
test auth::tests::session_cookie_shape ... ok
test auth::tests::share_cookie_is_per_share_and_session_scoped ... ok
test auth::tests::verify_rejects_garbage_hashes ... ok
test cli::tests::defaults_applied ... ok
test cli::tests::flags_override_defaults ... ok
test archive::tests::walk_is_sorted_case_insensitively ... ok
test auth::tests::token_shapes_and_uniqueness ... ok
test db::tests::share_expiry_logic ... ok
test cli::tests::required_args_enforced ... ok
test archive::tests::tar_round_trip ... ok
test error::tests::extra_object_is_merged_into_body ... ok
test archive::tests::tar_gz_round_trip ... ok
test error::tests::io_error_maps_to_500 ... ok
test error::tests::plain_error_body ... ok
test archive::tests::tar_zst_round_trip ... ok
test archive::tests::zip_round_trip ... ok
test fs::tests::copy_recursive_missing_source ... ok
test fs::tests::detect_kind_reads_from_disk ... ok
test fs::tests::is_within_or_eq_matrix ... ok
test fs::tests::copy_refuses_into_self_and_handles_conflict ... ok
test fs::tests::copy_file_and_dir_preserves_mtime ... ok
test fs::tests::list_dir_error_cases ... ok
test fs::tests::magic_numbers_classify_by_content ... ok
test fs::tests::list_dir_reports_broken_symlink_as_empty_file ... ok
test fs::tests::list_dir_reports_kinds ... ok
test fs::tests::mkdir_creates_nested_dirs ... ok
test fs::tests::list_dir_sorts_folders_first_then_case_insensitive ... ok
test fs::tests::mkdir_rejects_conflict_and_bad_names ... ok
test fs::tests::move_file_and_dir_across_dirs ... ok
test fs::tests::list_dir_pages_the_sorted_listing ... ok
test fs::tests::remove_file_and_dir ... ok
test fs::tests::rename_moves_file_and_dir ... ok
test fs::tests::rename_conflicts_and_overwrite ... ok
test fs::tests::move_refuses_into_self_and_conflicts ... ok
test fs::tests::rename_validates_new_name ... ok
test fs::tests::resolve_dir_requires_existing_directory ... ok
test fs::tests::resolve_file_targets_files ... ok
test fs::tests::resolve_path_missing_is_not_found ... ok
test fs::tests::resolve_path_rejects_parent_traversal ... ok
test fs::tests::resolve_path_rejects_symlink_escape ... ok
test fs::tests::resolve_path_traverses_inside_root ... ok
test fs::tests::resolve_root_rejects_symlink_escape ... ok
test fs::tests::resolve_root_rejects_escape_and_missing ... ok
test fs::tests::sort_keeps_folders_first_in_every_order ... ok
test fs::tests::sort_orders_by_the_chosen_key ... ok
test fs::tests::svg_is_offered_as_an_image ... ok
test fs::tests::truncated_utf8_at_the_read_boundary_is_still_text ... ok
test fs::tests::unsigned_files_fall_back_to_the_text_heuristic ... ok
test fs::tests::resolve_root_whole_root_and_subdir ... ok
test fs::tests::validate_name_accepts_simple_names ... ok
test fs::tests::validate_name_rejects_traversal_and_paths ... ok
test fs::tests::write_checked_error_cases ... ok
test fs::tests::parallel_rows_match_serial ... ok
test fs::tests::sniff_permit_never_exceeds_the_budget ... ok
test tests::build_app_missing_root_fails ... ok
test tests::build_app_root_must_be_directory ... ok
test thumb::tests::a_hit_refreshes_a_stale_entry_only ... ok
test thumb::tests::an_edit_changes_the_cache_key ... ok
test thumb::tests::the_key_fans_out_into_a_bucket ... ok
test thumb::tests::the_sweeper_drops_only_cold_entries ... ok
test thumb::tests::two_writes_of_one_entry_use_different_scratch_names ... ok
test webauthn::tests::a_browser_on_another_origin_is_refused ... ok
test db::tests::fresh_db_state ... ok
test webauthn::tests::a_handle_answers_once ... ok
test tests::build_app_custom_port_bind ... ok
test tests::build_app_ok ... ok
test db::tests::v1_db_migrates_to_v2 ... ok
test db::tests::app_passwords_open_one_account_and_stamp_their_use ... ok
test db::tests::revoking_a_path_takes_its_descendants_only ... ok
test db::tests::settings_round_trip ... ok
test db::tests::named_sign_in_leftovers_are_dropped ... ok
test db::tests::sessions_lifecycle ... ok
test db::tests::pim_patch_keeps_concurrent_changes ... ok
test webauthn::tests::a_flood_of_strangers_stays_bounded_and_spares_a_sign_in ... ok
test db::tests::setup_is_won_by_exactly_one_caller ... ok
test db::tests::the_sweep_drops_expired_shares_and_stale_unlocks ... ok
test db::tests::share_unlocks_are_bound_to_one_share ... ok
test db::tests::deleted_defaults_come_back ... ok
test db::tests::shares_crud ... ok
test db::tests::an_admin_password_reset_revokes_the_app_passwords ... ok
test fs::tests::write_checked_conflict_on_stale_mtime ... ok
test fs::tests::write_checked_updates_content_and_returns_new_mtime ... ok
test db::tests::rooms_are_principals_not_accounts ... ok
test db::tests::changing_a_password_drops_that_users_sessions ... ok
test auth::tests::password_hash_round_trip ... ok
test db::tests::user_crud_and_roots ... ok
test db::tests::admin_user_and_passwords ... ok

test result: ok. 105 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.40s

     Running unittests src/main.rs (/ci/cache/target/debug/deps/dovenest-b175d1e6807a4600)

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

     Running tests/api/main.rs (/ci/cache/target/debug/deps/api-22b8191be786c4d0)

running 274 tests
test auth::first_boot_me_reports_first_boot ... ok
test auth::setup_validates_input ... ok
test app_passwords::the_routes_need_a_session ... ok
test admin::settings_round_trip_visible_in_me ... ok
test auth::week_start_defaults_to_monday_and_is_validated ... ok
test auth::logout_invalidates_session ... ok
test auth::me_requires_valid_session ... ok
test auth::setup_creates_admin_and_sets_cookie ... ok
test admin::update_unknown_user_is_404 ... ok
test app_passwords::the_list_never_shows_a_secret_and_the_count_is_capped ... ok
test auth::public_url_reaches_client ... ok
test admin::lockout_guards ... ok
test app_passwords::an_app_password_mounts_an_account_that_requires_a_passkey ... ok
test dav::a_browser_get_of_a_collection_returns_a_listing ... ok
test dav::a_lock_is_reported_and_its_timeout_is_capped ... ok
test dav::a_listing_still_shows_a_symlink_as_its_target ... ok
test dav::a_copy_and_a_put_to_one_path_do_not_interleave ... ok
test dav::a_path_that_climbs_out_of_the_mount_is_not_a_server_error ... ok
test dav::a_dangling_symlink_is_not_a_writable_destination ... ok
test dav::a_dangling_symlink_is_still_listed ... ok
test auth::default_root_is_validated_and_dropped_with_its_root ... ok
test dav::a_listing_escapes_entry_names ... ok
test admin::admins_can_browse_the_server_root_read_only ... ok
test app_passwords::an_app_password_opens_webdav_and_nothing_else ... ok
test dav::a_listing_omits_dotfiles ... ok
test app_passwords::revoking_one_closes_the_mount_immediately ... ok
test dav::a_scriptable_file_is_sandboxed_over_dav ... ok
test dav::a_session_cookie_works_instead_of_basic ... ok
test admin::admin_routes_require_admin ... ok
test auth::root_name_is_configurable ... ok
test dav::a_share_mounts_at_its_own_root_without_a_login ... ok
test auth::disabled_user_loses_session_and_cannot_login ... ok
test dav::a_writable_share_can_be_written_and_expiry_ends_it ... ok
test dav::an_encoded_slash_does_not_split_the_share_token ... ok
test dav::an_exclusive_lock_blocks_everyone_without_the_token ... ok
test dav::concurrent_writers_leave_a_whole_file ... ok
test dav::copy_replaces_a_symlink_instead_of_writing_through_it ... ok
test auth::login_flows ... ok
test dav::a_mount_cannot_leave_its_roots ... ok
test dav::a_move_cannot_wipe_a_root_through_its_destination ... ok
test dav::a_read_only_root_can_still_be_copied_out_of ... ok
test dav::deep_xml_bodies_are_refused ... ok
test dav::a_read_only_root_refuses_every_write ... ok
test dav::deleting_a_shared_path_over_webdav_revokes_the_share ... ok
test dav::an_abandoned_lock_expires ... ok
test dav::deleting_a_symlink_does_not_revoke_its_targets_share ... ok
test dav::deleting_a_symlink_removes_the_link_not_its_target ... ok
test files::a_dangling_symlink_can_be_deleted ... ok
test files::a_symlink_out_of_the_root_still_cannot_be_read_or_written ... ok
test dav::deleting_a_symlinked_directory_does_not_empty_its_target ... ok
test dav::deleting_the_mount_point_removes_nothing ... ok
test dav::a_share_password_with_edge_spaces_opens_the_mount ... ok
test dav::get_and_put_round_trip_through_the_mount ... ok
test dav::locks_are_scoped_to_their_own_path ... ok
test dav::mkcol_move_copy_and_delete ... ok
test dav::moving_a_symlinked_directory_moves_the_link ... ok
test dav::propfind_lists_the_roots_then_their_contents ... ok
test dav::a_protected_share_asks_for_its_password_over_basic ... ok
test files::an_interrupted_upload_leaves_no_scratch_file ... ok
test files::archive_does_not_follow_symlinks_out_of_the_root ... ok
test dav::deleting_a_root_removes_nothing ... ok
test files::content_action_serves_raw_bytes_with_mtime ... ok
test dav::unauthenticated_requests_get_a_basic_challenge ... ok
test files::content_is_capped_at_two_mibibytes ... ok
test files::copying_a_symlink_copies_what_it_points_at ... ok
test files::copying_onto_a_symlink_replaces_it ... ok
test app_passwords::app_passwords_are_private_to_their_account ... ok
test files::delete_file_and_folder ... ok
test files::deleting_a_symlink_removes_the_link_not_its_target ... ok
test files::download_encodes_non_ascii_and_control_characters_in_filename ... ok
test files::download_folder_as_all_archive_formats ... ok
test dav::a_changed_password_locks_the_mount_out_at_once ... ok
test files::download_folder_requires_valid_format ... ok
test files::download_honours_single_byte_ranges ... ok
test files::download_revalidates_with_last_modified ... ok
test files::download_single_file ... ok
test files::editor_save_over_two_mibibytes_is_rejected_with_the_localized_error ... ok
test files::editor_save_round_trip_and_conflict ... ok
test files::exists_check_does_not_follow_symlinked_directories_out_of_the_root ... ok
test files::file_dated_before_1970_is_served ... ok
test files::list_root_sorted_folders_first ... ok
test files::list_subdir_and_errors ... ok
test files::listing_is_paged_in_the_requested_order ... ok
test files::listing_reports_sniffed_kinds ... ok
test files::mkdir_and_rename ... ok
test files::move_and_copy_across_dirs ... ok
test files::moving_a_symlink_moves_the_link ... ok
test files::path_traversal_is_blocked ... ok
test files::preview_serves_inline_and_rejects_dirs ... ok
test files::renaming_a_symlink_renames_the_link ... ok
test files::revalidation_keeps_the_file_policy ... ok
test files::upload_creates_files_and_folders ... ok
test files::scriptable_files_are_served_sandboxed ... ok
test files::upload_does_not_clobber_a_file_created_during_the_transfer ... ok
test files::upload_does_not_follow_symlinked_directories_out_of_the_root ... ok
test passkeys::a_conditional_challenge_asks_for_autofill_mediation ... ok
test passkeys::a_handle_cannot_be_answered_twice_or_invented ... ok
test passkeys::a_passkey_challenge_never_names_an_account ... ok
test admin::user_lifecycle ... ok
test passkeys::a_registration_handle_cannot_be_used_to_sign_in ... ok
test passkeys::a_short_new_password_is_refused ... ok
test passkeys::an_account_cannot_hold_more_passkeys_than_the_limit ... ok
test passkeys::an_invented_login_handle_is_refused ... ok
test passkeys::every_credential_route_needs_a_session ... ok
test passkeys::one_of_several_passkeys_can_always_go ... ok
test passkeys::registration_asks_the_authenticator_to_store_the_credential ... ok
test passkeys::requiring_both_blocks_removing_either_half ... ok
test passkeys::requiring_both_needs_both_to_exist ... ok
test passkeys::the_last_passkey_cannot_go_while_there_is_no_password ... ok
test files::exists_check_reports_targets_without_creating_anything ... ok
test passkeys::the_password_cannot_go_while_it_is_the_only_credential ... ok
test passkeys::a_wrong_password_reveals_nothing_about_the_second_factor ... ok
test files::read_only_root_blocks_writes_but_allows_reads ... ok
test passkeys::deleting_an_account_takes_its_passkeys_with_it ... ok
test passkeys::removing_the_password_leaves_a_passkey_only_account ... ok
test files::user_cannot_touch_foreign_root ... ok
test passkeys::signing_in_works_on_a_host_passkeys_cannot_use ... ok
test passkeys::a_passkey_only_account_can_set_a_password_again ... ok
test dav::two_users_with_same_named_roots_do_not_share_locks ... ok
test passkeys::the_password_alone_never_signs_in_an_account_that_requires_both ... ok
test passkeys::another_accounts_passkey_is_out_of_reach ... ok
test pim::a_taken_slug_leaves_the_first_collection_alone ... ok
test passkeys::the_passkey_first_order_signs_in_only_with_the_right_password ... ok
test passkeys::the_passkey_list_is_per_account_and_carries_no_key_material ... ok
test passkeys::webdav_refuses_an_account_that_requires_a_passkey ... ok
test passkeys::an_admin_password_clears_the_passkeys_and_the_requirement ... ok
test pim::a_cut_initial_sync_resumes_past_pruned_tombstones ... ok
test passkeys::changing_the_password_ends_every_other_session ... ok
test pim::calendar_reports ... ok
test pim::dead_properties_are_capped_in_total ... ok
test pim::a_cut_initial_sync_survives_writes_between_its_pages ... ok
test pim::deleting_a_missing_object_records_no_change ... ok
test pim::a_proppatch_whose_collection_goes_while_its_body_arrives_is_not_a_500 ... ok
test pim::a_put_racing_the_collection_delete_never_fails_with_500 ... ok
test pim::deleting_a_user_deletes_their_collections ... ok
test pim::address_objects ... ok
test pim::addressbook_reports ... ok
test pim::homes_list_the_default_collections ... ok
test pim::bad_filters_are_refused_by_name ... ok
test pim::calendar_objects ... ok
test pim::hrefs_follow_the_requested_spelling ... ok
test pim::a_deleted_user_gets_the_login_challenge ... ok
test pim::long_names_and_405s ... ok
test pim::make_and_patch_collections ... ok
test pim::missing_dtstamp_is_added ... ok
test pim::mkcol_checks_target_and_values ... ok
test pim::mkcol_refuses_long_slugs_and_the_101st_collection ... ok
test pim::move_objects ... ok
test pim::expand_answers_are_capped ... ok
test pim::moving_an_object_onto_itself_changes_nothing ... ok
test pim::multiget_answers_each_href_once_and_caps_the_count ... ok
test pim::of_two_deletes_of_one_collection_only_one_succeeds ... ok
test pim::other_users_are_off_limits ... ok
test pim::proppatch_follows_document_order ... ok
test pim::discovery ... ok
test pim::pruned_tombstones_invalidate_old_sync_tokens ... ok
test pim::sync_collection ... ok
test pim::the_default_calendar_stays ... ok
test pim::principal_search ... ok
test pim_clients::discovery_by_get_and_from_the_root ... ok
test pim_clients::vcard_three_for_apple ... ok
test pim::system_address_book ... ok
test pim::expand_answers_are_capped_in_bytes ... ok
test pim::other_accounts_get_no_client_properties_or_loans_of_disabled_owners ... ok
test pim::lent_collections ... ok
test pim_io::collection_names_and_descriptions_are_checked ... ok
test pim_derived::admin_sees_and_revokes_feeds ... ok
test pim_clients::client_properties_are_stored ... ok
test pim_io::a_skipped_import_into_a_new_user_leaves_only_the_default_calendar ... ok
test pim_io::an_import_racing_the_collection_delete_never_fails_with_500 ... ok
test pim_io::export_round_trip ... ok
test pim_derived::birthday_calendar ... ok
test pim_derived::own_shares_list_only_mine ... ok
test pim_derived::photos_without_a_cache ... ok
test pim_io::a_feed_password_matches_with_edge_spaces ... ok
test pim_io::a_loan_to_a_disabled_user_takes_a_new_mode ... ok
test pim_io::feeds_of_a_disabled_owner_stop ... ok
test pim_io::import_as_a_new_collection ... ok
test pim_io::import_splits_and_updates ... ok
test pim_derived::contact_photos ... ok
test pim_io::an_import_of_meetings_long_over_sends_nothing ... ok
test pim::rooms_and_resources ... ok
test pim_clients::addresses_and_logins_for_unusual_names ... ok
test pim_io::the_web_api_keeps_the_dav_limits ... ok
test pim_schedule::a_delete_that_matches_nothing_writes_nothing ... ok
test pim_schedule::a_plain_event_with_the_same_uid_does_not_block_a_meeting ... ok
test pim_schedule::a_put_may_not_change_the_uid_of_an_object ... ok
test pim_schedule::find_uid_prefers_the_scheduling_copy ... ok
test pim_schedule::a_disabled_attendee_keeps_getting_updates_and_cancels ... ok
test pim_io::import_schedules_like_a_put_and_keeps_uniqueness ... ok
test pim_schedule::free_busy_answers_each_principal_once_and_caps_the_attendees ... ok
test pim_derived::deleted_principals_are_forgotten ... ok
test pim_schedule::deleting_a_user_forgets_an_address_split_by_a_fold ... ok
test pim_schedule::discovery_names_inbox_and_outbox ... ok
test pim_io::share_candidates_leave_out_owner_borrowers_and_disabled ... ok
test pim_schedule::a_room_organizer_gets_its_inbox_with_the_first_reply ... ok
test pim_schedule::attendees_have_limits ... ok
test pim_schedule::deleting_a_calendar_cancels_its_meetings ... ok
test pim_schedule::deleting_an_organizer_cancels_and_forgets_it ... ok
test pim_schedule::move_does_not_overwrite_a_meeting ... ok
test pim_io::feeds ... ok
test pim_schedule::invitations_go_to_the_chosen_calendar ... ok
test pim_schedule::one_resource_per_scheduled_uid ... ok
test pim_schedule::invite_and_answer ... ok
test pim_schedule::a_plain_loan_may_bump_the_sequence ... ok
test pim_schedule::organizer_changes_reach_attendees ... ok
test pim_schedule::move_stays_with_one_owner ... ok
test pim_schedule::imports_on_a_plain_loan_skip_meetings ... ok
test pim_schedule::a_quiet_import_keeps_the_attendees_answers ... ok
test pim_schedule::foreign_uids_are_not_overwritten ... ok
test search::backslash_paths_are_normalised_before_trimming ... ok
test search::both_scopes_stream_from_one_walk ... ok
test search::exclude_list_is_normalised ... ok
test search::excluded_folders_never_appear_in_results ... ok
test search::hidden_and_gitignored_entries_are_searched ... ok
test pim_schedule::outbox_answers_free_busy ... ok
test pim_schedule::replies_need_a_listed_attendee ... ok
test pim_schedule::rooms_answer_from_their_bookings ... ok
test search::name_scope_ignores_the_parent_path ... ok
test pim_schedule::rooms_check_series_to_their_horizon ... ok
test pim_schedule::rooms_receive_bookings ... ok
test search::path_narrows_the_walk_to_a_subfolder ... ok
test pim_schedule::two_addresses_of_one_attendee_get_one_delivery ... ok
test search::search_rejects_bad_input_and_anonymous_callers ... ok
test shares::a_root_can_be_shared_and_keeps_a_name ... ok
test shares::a_share_password_must_be_long_enough ... ok
test shares::a_share_token_cannot_read_the_admin_listing ... ok
test pim_schedule::uris_reach_copies_and_inboxes_unescaped ... ok
test shares::create_list_and_delete_shares ... ok
test shares::mutating_a_target_revokes_its_shares ... ok
test shares::read_only_share_blocks_writes_writable_share_allows ... ok
test shares::share_expiry ... ok
test shares::share_expiry_must_be_rfc3339 ... ok
test shares::share_folder_browsing_and_download_anonymously ... ok
test shares::share_of_a_single_file ... ok
test shares::share_scopes_a_signed_in_user ... ok
test shares::share_target_validation ... ok
test thumbs::a_small_video_is_not_upscaled ... ok
test shares::share_token_is_not_the_creators_identity ... ok
test pim_schedule::deleting_a_disabled_user_retracts_its_meetings ... ok
test thumbs::a_video_gets_a_thumbnail_of_one_frame ... ok
test thumbs::a_video_without_ffmpeg_caches_nothing ... ok
test pim_ui::feeds_are_capped_and_never_born_expired ... ok
test shares::unlocking_an_open_share_is_rejected ... ok
test shares::writable_shares_gated_by_setting ... ok
test thumbs::a_broken_image_fails_once_and_is_remembered ... ok
test shares::a_subfolder_share_by_empty_path_is_unaffected ... ok
test thumbs::a_folder_has_no_thumbnail ... ok
test shares::an_admin_can_end_a_share_the_creator_can_no_longer_reach ... ok
test thumbs::a_share_scopes_thumbnails_to_the_shared_folder ... ok
test pim_ui::an_instance_a_range_moved_shows_the_ranges_text ... ok
test pim_ui::tasks_are_not_instances ... ok
test pim_ui::collections_can_be_created_changed_and_deleted ... ok
test pim_ui::the_default_calendar_can_be_chosen ... ok
test thumbs::a_text_file_has_no_thumbnail ... ok
test pim_ui::contacts_are_searched_across_books ... ok
test thumbs::a_transparent_png_is_flattened_onto_white ... ok
test shares::read_only_root_cannot_be_shared_writably ... ok
test thumbs::an_image_smaller_than_the_cap_is_not_upscaled ... ok
test pim_ui::instances_expand_readable_calendars ... ok
test thumbs::an_image_gets_a_webp_thumbnail ... ok
test pim_ui::invitations_are_listed_and_answered ... ok
test pim_ui::object_detail_for_events_and_contacts ... ok
test thumbs::thumbnails_are_off_without_a_cache_folder ... ok
test thumbs::the_response_is_immutable ... ok
test thumbs::concurrent_requests_for_one_file_all_get_the_thumbnail ... ok
test thumbs::the_profile_setting_round_trips ... ok
test thumbs::the_second_request_is_served_from_the_cache ... ok
test shares::unlocking_a_file_share_returns_its_kind ... ok
test thumbs::editing_the_file_makes_a_new_cache_entry ... ok
test shares::a_password_locks_the_share_and_its_files ... ok
test shares::an_admin_sees_every_share_with_its_creator ... ok
test pim_schedule::sharees_schedule_only_when_allowed ... ok
test thumbs::another_users_root_is_still_out_of_reach ... ok

test result: ok. 274 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 64.47s

     Running tests/api_spa.rs (/ci/cache/target/debug/deps/api_spa-3560a772353e2b53)

running 1 test
test spa_fallback_and_api_guards ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

     Running unittests src/main.rs (/ci/cache/target/debug/deps/web-d5c17d605dff737a)

running 34 tests
test i18n::tests::tables_are_sorted_without_duplicates ... ok
test util::tests::format_date_drops_seconds_and_zone ... ok
test router::tests::query_pairs_round_trip ... ok
test uploads::tests::chunk_respects_both_caps ... ok
test util::tests::page_numbers_keep_the_ends_and_the_neighbours ... ok
test util::tests::sort_spec_round_trips_through_its_stored_form ... ok
test views::calendar::tests::a_bar_hidden_on_a_busy_day_splits ... ok
test views::calendar::tests::a_bar_pushed_below_the_lines_is_counted_where_it_hides ... ok
test views::calendar::tests::a_lone_item_on_a_low_line_gets_no_more ... ok
test views::calendar::tests::a_weekly_rule_names_its_start_day ... ok
test views::calendar::tests::bars_split_across_weeks ... ok
test views::calendar::tests::busy_days_share_the_last_line_with_more ... ok
test views::calendar::tests::a_rule_reads_as_words ... ok
test views::calendar::tests::civil_days_round_trip ... ok
test views::calendar::tests::grid_starts_on_the_week_start ... ok
test views::calendar::tests::links_are_found_in_text ... ok
test views::calendar::tests::links_need_a_host_and_keep_balanced_brackets ... ok
test views::calendar::tests::midnight_end_is_the_next_day ... ok
test views::calendar::tests::more_counts_the_hidden_items_of_a_column ... ok
test views::calendar::tests::opened_round_trips ... ok
test views::calendar::tests::times_on_each_day ... ok
test views::calendar::tests::url_years_are_clamped ... ok
test views::contacts::tests::vcard_dates ... ok
test views::pim::tests::a_new_collection_gets_an_unused_color ... ok
test views::pim::tests::solo_toggles_between_one_and_all ... ok
test views::search::tests::highlight_empty_words_is_plain ... ok
test views::search::tests::highlight_escapes_markup ... ok
test views::search::tests::highlight_handles_non_ascii ... ok
test views::search::tests::highlight_is_case_insensitive ... ok
test views::search::tests::highlight_marks_all_words ... ok
test views::search::tests::highlight_marks_hits ... ok
test views::search::tests::highlight_no_hit_is_plain ... ok
test views::shell::tests::default_root_rules ... ok
test i18n::tests::translations_cover_all_keys ... ok

test result: ok. 34 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests api_types

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests pimdav

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests server

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

successbuild5m
cd web && bun install --frozen-lockfile && bun run build
bun install v1.4.2 (744846f84)

+ @codemirror/lang-cpp@6.0.3
+ @codemirror/lang-css@6.3.1
+ @codemirror/lang-html@6.4.12
+ @codemirror/lang-java@6.0.2
+ @codemirror/lang-javascript@6.2.5
+ @codemirror/lang-json@6.0.2
+ @codemirror/lang-markdown@6.5.2
+ @codemirror/lang-php@6.0.2
+ @codemirror/lang-python@6.2.1
+ @codemirror/lang-rust@6.0.2
+ @codemirror/lang-sql@6.10.0
+ @codemirror/lang-xml@6.1.0
+ @codemirror/state@6.7.6
+ @codemirror/theme-one-dark@6.1.3
+ codemirror@6.0.2

39 packages installed [66.00ms]
$ bun build cm/wrapper.js --format iife --target browser --minify --outfile cm6.js
Bundled 40 modules in 17ms

  cm6.js  1.0 MB  (entry point)

cd web && trunk build --release
2026-10-05T05:41:03.253107Z  INFO Starting trunk 0.21.14
2026-10-05T05:41:03.545817Z  INFO starting build
   Compiling api-types v0.1.0 (/ci/build/project/api-types)
   Compiling web v0.1.0 (/ci/build/project/web)
    Finished `release` profile [optimized] target(s) in 1m 24s
warning: the following packages contain code that will be rejected by a future version of Rust: proc-macro-error2 v2.0.1
note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 1`
2026-10-05T05:42:28.612826Z  INFO downloading wasm-bindgen version="0.2.129"
2026-10-05T05:42:29.431942Z  INFO installing wasm-bindgen
2026-10-05T05:42:44.758055Z  INFO applying new distribution
2026-10-05T05:42:44.758451Z  INFO success
rm -rf server/dist
cp -r web/dist server/dist
cargo build --locked --release -p server --features embedded
   Compiling pimdav v0.1.0 (/ci/build/project/pimdav)
   Compiling api-types v0.1.0 (/ci/build/project/api-types)
   Compiling server v0.1.0 (/ci/build/project/server)
    Finished `release` profile [optimized] target(s) in 3m 18s
successe2e9s
   Compiling pimdav v0.1.0 (/ci/build/project/pimdav)
   Compiling api-types v0.1.0 (/ci/build/project/api-types)
   Compiling server v0.1.0 (/ci/build/project/server)
    Finished `test` profile [unoptimized + debuginfo] target(s) in 8.84s
     Running tests/api/main.rs (/ci/cache/target/debug/deps/api-b8e1e6995c9c516b)

running 1 test
test embedded::embedded_frontend_is_complete ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 274 filtered out; finished in 0.13s

skippedrelease0s
Skipped: condition not met
successimage-files0s
successimage28s
Building the build VM image localhost/hearthforge-buildvm:cc6944880123. This happens once per Hearthforge version.
[1/4] STEP 1/4: FROM docker.io/library/alpine:3.24 AS guest
[1/4] STEP 2/4: RUN apk add --no-cache buildah crun netavark e2fsprogs tar ca-certificates
( 1/60) Installing libcap2 (2.78-r0)
( 2/60) Installing json-c (0.18-r1)
( 3/60) Installing libseccomp (2.6.0-r2)
( 4/60) Installing crun (1.30.1-r0)
( 5/60) Installing libmd (1.2.0-r0)
( 6/60) Installing libbsd (0.12.2-r0)
( 7/60) Installing skalibs-libs (2.15.0.0-r0)
( 8/60) Installing utmps-libs (0.1.3.3-r0)
( 9/60) Installing linux-pam (1.7.1-r2)
(10/60) Installing shadow-libs (4.18.0-r1)
(11/60) Installing shadow-subids (4.18.0-r1)
(12/60) Installing libffi (3.5.2-r1)
(13/60) Installing libintl (1.0-r0)
(14/60) Installing libeconf (0.8.3-r0)
(15/60) Installing libblkid (2.42.3-r1)
(16/60) Installing libmount (2.42.3-r1)
(17/60) Installing pcre2 (10.49-r0)
(18/60) Installing glib (2.88.1-r1)
(19/60) Installing libslirp (4.9.1-r0)
(20/60) Installing slirp4netns (1.3.3-r0)
  Executing slirp4netns-1.3.3-r0.post-install
  * modprobe: can't change directory to '/lib/modules': No such file or directory
(21/60) Installing containers-common (0.64.2-r0)
(22/60) Installing libgpg-error (1.61-r0)
(23/60) Installing libassuan (3.0.2-r0)
(24/60) Installing ncurses-terminfo-base (6.6_p20260516-r0)
(25/60) Installing libncursesw (6.6_p20260516-r0)
(26/60) Installing pinentry (1.3.2-r0)
  Executing pinentry-1.3.2-r0.post-install
(27/60) Installing libgcrypt (1.12.2-r0)
(28/60) Installing gnupg-gpgconf (2.4.9-r1)
(29/60) Installing brotli-libs (1.2.0-r1)
(30/60) Installing gmp (6.3.0-r4)
(31/60) Installing nettle (3.10.2-r0)
(32/60) Installing libunistring (1.4.2-r0)
(33/60) Installing libidn2 (2.3.8-r0)
(34/60) Installing libtasn1 (4.21.0-r0)
(35/60) Installing p11-kit (0.26.2-r0)
(36/60) Installing zstd-libs (1.5.7-r2)
(37/60) Installing gnutls (3.8.13-r0)
(38/60) Installing libksba (1.7.0-r0)
(39/60) Installing gdbm (1.26-r0)
(40/60) Installing libsasl (2.1.28-r9)
(41/60) Installing libldap (2.6.15-r0)
(42/60) Installing npth (1.8-r0)
(43/60) Installing gnupg-dirmngr (2.4.9-r1)
(44/60) Installing sqlite-libs (3.53.4-r0)
(45/60) Installing gnupg-keyboxd (2.4.9-r1)
(46/60) Installing libbz2 (1.0.8-r6)
(47/60) Installing gpg (2.4.9-r1)
(48/60) Installing gpg-agent (2.4.9-r1)
(49/60) Installing gpgsm (2.4.9-r1)
(50/60) Installing gpgme (2.0.1-r1)
(51/60) Installing buildah (1.44.0-r1)
(52/60) Installing ca-certificates (20260909-r0)
(53/60) Installing libcom_err (1.47.4-r0)
(54/60) Installing e2fsprogs-libs (1.47.4-r0)
(55/60) Installing libuuid (2.42.3-r1)
(56/60) Installing e2fsprogs (1.47.4-r0)
(57/60) Installing libgcc (15.2.0-r5)
(58/60) Installing netavark (1.17.2-r0)
(59/60) Installing acl-libs (2.3.2-r1)
(60/60) Installing tar (1.35-r5)
Executing busybox-1.37.0-r31.trigger
Executing glib-2.88.1-r1.trigger
Executing ca-certificates-20260909-r0.trigger
OK: 75.5 MiB in 76 packages
--> dfc9a3df0ee6
[1/4] STEP 3/4: COPY guest/ /
--> 14319d0bd7a5
[1/4] STEP 4/4: RUN chmod 755 /init
--> 881c41d04ecd
[2/4] STEP 1/3: FROM docker.io/library/alpine:3.24 AS kernel
[2/4] STEP 2/3: RUN apk add --no-cache --no-scripts linux-virt kmod
( 1/14) Installing xz-libs (5.8.4-r0)
( 2/14) Installing zstd-libs (1.5.7-r2)
( 3/14) Installing kmod (34.2-r1)
( 4/14) Installing lddtree (1.27-r0)
( 5/14) Installing mdev-conf (4.10-r0)
( 6/14) Installing libeconf (0.8.3-r0)
( 7/14) Installing libblkid (2.42.3-r1)
( 8/14) Installing device-mapper-libs (2.03.35-r3)
( 9/14) Installing json-c (0.18-r1)
(10/14) Installing libuuid (2.42.3-r1)
(11/14) Installing cryptsetup-libs (2.8.6-r0)
(12/14) Installing kmod-libs (34.2-r1)
(13/14) Installing mkinitfs (3.14.1-r0)
(14/14) Installing linux-virt (6.18.54-r0)
OK: 59.7 MiB in 30 packages
--> 9c5b552057aa
[2/4] STEP 3/3: RUN set -eu;     kver=$(ls /lib/modules);     mkdir -p /out/modules;     for m in virtio_blk virtio_net ext4 overlay virtio_rng; do         modprobe -S "$kver" --show-depends "$m";     done | awk '$1 == "insmod" && !seen[$2]++ { print $2 }' > /tmp/modules;     i=0;     while read -r ko; do         i=$((i + 1));         gunzip -c "$ko" > "/out/modules/$(printf %02d $i)-$(basename "$ko" .gz)";     done < /tmp/modules;     cp /boot/vmlinuz-virt /out/vmlinuz
--> 56e3c119e454
[3/4] STEP 1/5: FROM docker.io/library/alpine:3.24 AS initramfs
[3/4] STEP 2/5: RUN apk add --no-cache cpio
(1/1) Installing cpio (2.15-r0)
Executing busybox-1.37.0-r31.trigger
OK: 8332 KiB in 17 packages
--> a46ca1fe14d5
[3/4] STEP 3/5: COPY --from=guest / /rootfs/
--> b12584df88ea
[3/4] STEP 4/5: COPY --from=kernel /out/modules/ /rootfs/lib/hf-modules/
--> cb5836c34d23
[3/4] STEP 5/5: RUN set -eu;     cd /rootfs;     mkdir -p proc sys dev tmp run var/lib/containers;     find . -print0 | cpio --null --quiet -o -H newc | gzip -1 > /initramfs.gz
--> e396d2b8c3ea
[4/4] STEP 1/7: FROM docker.io/library/alpine:3.24
[4/4] STEP 2/7: RUN apk add --no-cache "qemu-system-$(apk --print-arch)" tar
( 1/52) Installing libcap-ng (0.8.5-r2)
( 2/52) Installing libffi (3.5.2-r1)
( 3/52) Installing libintl (1.0-r0)
( 4/52) Installing libeconf (0.8.3-r0)
( 5/52) Installing libblkid (2.42.3-r1)
( 6/52) Installing libmount (2.42.3-r1)
( 7/52) Installing pcre2 (10.49-r0)
( 8/52) Installing glib (2.88.1-r1)
( 9/52) Installing brotli-libs (1.2.0-r1)
(10/52) Installing gmp (6.3.0-r4)
(11/52) Installing nettle (3.10.2-r0)
(12/52) Installing libunistring (1.4.2-r0)
(13/52) Installing libidn2 (2.3.8-r0)
(14/52) Installing libtasn1 (4.21.0-r0)
(15/52) Installing p11-kit (0.26.2-r0)
(16/52) Installing zstd-libs (1.5.7-r2)
(17/52) Installing gnutls (3.8.13-r0)
(18/52) Installing numactl (2.0.19-r0)
(19/52) Installing liburing (2.14-r0)
(20/52) Installing qemu (11.0.3-r0)
  Executing qemu-11.0.3-r0.pre-install
  Executing qemu-11.0.3-r0.post-install
  * 
  * If you want to run VM as unprivileged user and let Qemu create tunX devices,
  * then you must add that user to the group "qemu".
  * If you use KVM for hardware-assisted virtualization, then you may also need
  * to add that user to the group "kvm".
  * 
(21/52) Installing qemu-bridge-helper (11.0.3-r0)
(22/52) Installing qemu-edk2-i386-vars (11.0.3-r0)
(23/52) Installing libaio (0.3.113-r2)
(24/52) Installing libelf (0.195-r0)
(25/52) Installing libbpf (1.7.0-r1)
(26/52) Installing capstone (5.0.9-r0)
(27/52) Installing libbz2 (1.0.8-r6)
(28/52) Installing musl-fts (1.2.7-r7)
(29/52) Installing xz-libs (5.8.4-r0)
(30/52) Installing libdw (0.195-r0)
(31/52) Installing libfdt (1.7.2-r1)
(32/52) Installing libjpeg-turbo (3.1.3-r0)
(33/52) Installing lzo (2.10-r5)
(34/52) Installing pixman (0.46.4-r0)
(35/52) Installing libpng (1.6.59-r0)
(36/52) Installing gdbm (1.26-r0)
(37/52) Installing libsasl (2.1.28-r9)
(38/52) Installing libseccomp (2.6.0-r2)
(39/52) Installing libslirp (4.9.1-r0)
(40/52) Installing libgcc (15.2.0-r5)
(41/52) Installing libstdc++ (15.2.0-r5)
(42/52) Installing snappy (1.2.2-r0)
(43/52) Installing vde2-libs (2.3.3-r6)
(44/52) Installing libcom_err (1.47.4-r0)
(45/52) Installing e2fsprogs-libs (1.47.4-r0)
(46/52) Installing libnl3 (3.11.0-r0)
(47/52) Installing libuuid (2.42.3-r1)
(48/52) Installing yajl (2.1.0-r9)
(49/52) Installing xen-libs (4.21.2-r1)
(50/52) Installing qemu-system-x86_64 (11.0.3-r0)
(51/52) Installing acl-libs (2.3.2-r1)
(52/52) Installing tar (1.35-r5)
Executing busybox-1.37.0-r31.trigger
Executing glib-2.88.1-r1.trigger
OK: 91.1 MiB in 68 packages
--> a1e42668dc13
[4/4] STEP 3/7: COPY --from=kernel /out/vmlinuz /vm/vmlinuz
--> 1e0be6248258
[4/4] STEP 4/7: COPY --from=initramfs /initramfs.gz /vm/initramfs.gz
--> 52490a152b49
[4/4] STEP 5/7: COPY run-vm /usr/local/bin/run-vm
--> c5800350e624
[4/4] STEP 6/7: RUN chmod 755 /usr/local/bin/run-vm && mkdir -p /in/context /out /work
--> 64b5fa0b58e2
[4/4] STEP 7/7: ENTRYPOINT ["/usr/local/bin/run-vm"]
[4/4] COMMIT localhost/hearthforge-buildvm:cc6944880123
--> 74597ef96308
Successfully tagged localhost/hearthforge-buildvm:cc6944880123
74597ef963084955c80517f853630667b7fb0ddf9430d6c6a0432919d5547695
Successfully built 74597ef96308
Successfully tagged localhost/hearthforge-buildvm:cc6944880123
Built the build VM image localhost/hearthforge-buildvm:cc6944880123
[2/3] STEP 1/2: FROM scratch AS prebuilt
[2/3] STEP 2/2: COPY ci-bin/dovenest /dovenest
--> 07e741becc94
[3/3] STEP 1/9: FROM alpine:3.24
Resolved "alpine" as an alias (/etc/containers/registries.conf.d/00-shortnames.conf)
Trying to pull docker.io/library/alpine:3.24...
Getting image source signatures
Writing manifest to image destination
[3/3] STEP 2/9: ARG BIN_STAGE=build
--> 7f230144a5a1
[3/3] STEP 3/9: RUN apk add --no-cache ca-certificates ffmpeg     && mkdir -p /data /var/lib/dovenest /var/cache/dovenest
(  1/108) Installing ca-certificates (20260909-r0)
(  2/108) Installing libSvtAv1Enc (4.1.0-r0)
(  3/108) Installing aom-libs (3.14.1-r0)
(  4/108) Installing libxau (1.0.12-r0)
(  5/108) Installing libmd (1.2.0-r0)
(  6/108) Installing libbsd (0.12.2-r0)
(  7/108) Installing libxdmcp (1.1.5-r1)
(  8/108) Installing libxcb (1.17.0-r2)
(  9/108) Installing libx11 (1.8.13-r0)
( 10/108) Installing hwdata-pci (0.408-r0)
( 11/108) Installing libpciaccess (0.19-r0)
( 12/108) Installing libdrm (2.4.134-r0)
( 13/108) Installing libxext (1.3.7-r0)
( 14/108) Installing libxfixes (6.0.2-r0)
( 15/108) Installing libffi (3.5.2-r1)
( 16/108) Installing wayland-libs-client (1.25.0-r0)
( 17/108) Installing libva (2.23.0-r0)
( 18/108) Installing libvdpau (1.5-r4)
( 19/108) Installing libgcc (15.2.0-r5)
( 20/108) Installing libstdc++ (15.2.0-r5)
( 21/108) Installing libvpl (2.15.0-r1)
( 22/108) Installing ffmpeg-libavutil (8.1.2-r0)
( 23/108) Installing libdav1d (1.5.3-r0)
( 24/108) Installing brotli-libs (1.2.0-r1)
( 25/108) Installing libhwy (1.3.0-r0)
( 26/108) Installing lcms2 (2.19-r0)
( 27/108) Installing libjxl (0.11.2-r1)
( 28/108) Installing lame-libs (3.100-r5)
( 29/108) Installing opus (1.6.1-r0)
( 30/108) Installing rav1e-libs (0.8.1-r0)
( 31/108) Installing libgomp (15.2.0-r5)
( 32/108) Installing soxr (0.1.3-r7)
( 33/108) Installing ffmpeg-libswresample (8.1.2-r0)
( 34/108) Installing libogg (1.3.6-r0)
( 35/108) Installing libtheora (1.2.0-r1)
( 36/108) Installing libvorbis (1.3.7-r2)
( 37/108) Installing libvpx (1.15.2-r1)
( 38/108) Installing libsharpyuv (1.6.0-r0)
( 39/108) Installing libwebp (1.6.0-r0)
( 40/108) Installing libwebpmux (1.6.0-r0)
( 41/108) Installing x264-libs (0.164.3108-r1)
( 42/108) Installing numactl (2.0.19-r0)
( 43/108) Installing x265-libs (4.1-r0)
( 44/108) Installing xvidcore (1.3.7-r2)
( 45/108) Installing ffmpeg-libavcodec (8.1.2-r0)
( 46/108) Installing alsa-lib (1.2.15.3-r0)
( 47/108) Installing libexpat (2.8.5-r0)
( 48/108) Installing libbz2 (1.0.8-r6)
( 49/108) Installing libpng (1.6.59-r0)
( 50/108) Installing freetype (2.14.3-r0)
( 51/108) Installing fontconfig (2.17.1-r1)
( 52/108) Installing fribidi (1.0.16-r3)
( 53/108) Installing libintl (1.0-r0)
( 54/108) Installing libeconf (0.8.3-r0)
( 55/108) Installing libblkid (2.42.3-r1)
( 56/108) Installing libmount (2.42.3-r1)
( 57/108) Installing pcre2 (10.49-r0)
( 58/108) Installing glib (2.88.1-r1)
( 59/108) Installing graphite2 (1.3.14-r6)
( 60/108) Installing harfbuzz (13.2.1-r0)
( 61/108) Installing libunibreak (6.1-r0)
( 62/108) Installing libass (0.17.4-r1)
( 63/108) Installing libudfread (1.2.0-r1)
( 64/108) Installing libbluray (1.4.0-r0)
( 65/108) Installing libdvdcss (1.4.3-r0)
( 66/108) Installing libdvdread (6.1.3-r2)
( 67/108) Installing libdvdnav (6.1.1-r1)
( 68/108) Installing mpg123-libs (1.33.5-r0)
( 69/108) Installing libopenmpt (0.8.9-r0)
( 70/108) Installing cjson (1.7.19-r1)
( 71/108) Installing mbedtls3 (3.6.7-r0)
( 72/108) Installing librist (0.2.15-r0)
( 73/108) Installing libsrt (1.5.3-r1)
( 74/108) Installing libssh (0.12.2-r0)
( 75/108) Installing xz-libs (5.8.4-r0)
( 76/108) Installing libxml2 (2.13.9-r2)
( 77/108) Installing libsodium (1.0.22-r0)
( 78/108) Installing libzmq (4.3.5-r2)
( 79/108) Installing ffmpeg-libavformat (8.1.2-r0)
( 80/108) Installing serd-libs (0.32.8-r0)
( 81/108) Installing zix-libs (0.8.0-r0)
( 82/108) Installing sord-libs (0.16.22-r0)
( 83/108) Installing sratom (0.6.20-r0)
( 84/108) Installing lilv-libs (0.24.26-r1)
( 85/108) Installing libdovi (3.3.2-r0)
( 86/108) Installing spirv-tools (1.4.341.0-r0)
( 87/108) Installing glslang-libs (1.4.341.0-r0)
( 88/108) Installing shaderc (2026.1-r0)
( 89/108) Installing vulkan-loader (1.4.347-r0)
( 90/108) Installing libplacebo (7.360.1-r0)
( 91/108) Installing ffmpeg-libswscale (8.1.2-r0)
( 92/108) Installing vidstab (1.1.1-r0)
( 93/108) Installing zimg (3.0.6-r0)
( 94/108) Installing ffmpeg-libavfilter (8.1.2-r0)
( 95/108) Installing libasyncns (0.8-r5)
( 96/108) Installing dbus-libs (1.16.2-r2)
( 97/108) Installing libltdl (2.6.0-r1)
( 98/108) Installing orc (0.4.41-r0)
( 99/108) Installing libflac (1.4.3-r2)
(100/108) Installing libsndfile (1.2.2-r2)
(101/108) Installing speexdsp (1.2.1-r2)
(102/108) Installing tdb-libs (1.4.15-r1)
(103/108) Installing libpulse (17.0-r7)
(104/108) Installing libjpeg-turbo (3.1.3-r0)
(105/108) Installing json-c (0.18-r1)
(106/108) Installing v4l-utils-libs (1.32.0-r1)
(107/108) Installing ffmpeg-libavdevice (8.1.2-r0)
(108/108) Installing ffmpeg (8.1.2-r0)
Executing busybox-1.37.0-r31.trigger
Executing ca-certificates-20260909-r0.trigger
Executing glib-2.88.1-r1.trigger
OK: 135.8 MiB in 124 packages
--> cf3c08465c4e
[3/3] STEP 4/9: COPY --from=${BIN_STAGE} /dovenest /usr/local/bin/dovenest
--> 43dcf4ff099c
[3/3] STEP 5/9: EXPOSE 8080
--> 57e9c7b30664
[3/3] STEP 6/9: VOLUME ["/data", "/var/lib/dovenest"]
--> 0f129027600c
[3/3] STEP 7/9: HEALTHCHECK --interval=30s --start-period=10s --timeout=5s --retries=3     CMD wget -qO /dev/null http://127.0.0.1:8080/ || exit 1
--> 336395329966
[3/3] STEP 8/9: ENTRYPOINT ["/usr/local/bin/dovenest"]
--> 4c9100a9452d
[3/3] STEP 9/9: CMD ["--root", "/data", "--db", "/var/lib/dovenest/db.sqlite", "--bind", "0.0.0.0"]
[3/3] COMMIT localhost/hf-build
--> 35a23df5f456
Successfully tagged localhost/hf-build:latest
35a23df5f4562577362ef03c2f8eba4f5c915d8b24392a753907539e965fe854
hearthforge: image written
[   10.605130] reboot: Restarting system
Pushed forge.unix-root.de/dovenest:ab23a1fc
Pushed forge.unix-root.de/dovenest:edge
Digest sha256:b558774d2ccbd82fb08855fa1bfb7e89b114ce0c5dbe08649b44f0be1222c4a5
skippedimage-release0s
Skipped: condition not met

Artifacts