Bug bash: interop #1221

Open
opened 2026-10-06 19:01:50 +00:00 by kayg · 9 comments
Owner

AREA: Sync and interop with real clients on this host. CalDAV/CardDAV with vdirsyncer plus khal/khard (install in a venv if missing), WebDAV with rclone and curl, any MCP/WebMCP endpoint the repo exposes. Round trip: create on the client and see it in the UI; edit in the UI and see it on the client; concurrent edits; ETags and If-Match; large collections; Unicode names; deletes; renames. Check RFC 4791, 6352 and 4918 behaviour and use web search for client quirks. Fix server bugs inside the DAV plugin crates only; file anything in core.

Tracking issue for the 2026-10-07 bug bash. Every bug found gets its own issue, linked here.

AREA: Sync and interop with real clients on this host. CalDAV/CardDAV with vdirsyncer plus khal/khard (install in a venv if missing), WebDAV with rclone and curl, any MCP/WebMCP endpoint the repo exposes. Round trip: create on the client and see it in the UI; edit in the UI and see it on the client; concurrent edits; ETags and If-Match; large collections; Unicode names; deletes; renames. Check RFC 4791, 6352 and 4918 behaviour and use web search for client quirks. Fix server bugs inside the DAV plugin crates only; file anything in core. Tracking issue for the 2026-10-07 bug bash. Every bug found gets its own issue, linked here.
Author
Owner

Starting #1221 from branch job/bash-interop at ff53d7b8b4da5a21f862d57dcc3496f8c019f647. The job worktree tracks origin/dev and is 264 commits behind at start; I will merge origin/dev once before final gates. I am reading the CalDAV/CardDAV, WebDAV and MCP contracts, then I will test each requested interop flow in order.

Starting #1221 from branch `job/bash-interop` at `ff53d7b8b4da5a21f862d57dcc3496f8c019f647`. The job worktree tracks origin/dev and is 264 commits behind at start; I will merge origin/dev once before final gates. I am reading the CalDAV/CardDAV, WebDAV and MCP contracts, then I will test each requested interop flow in order.
Author
Owner

Finding filed as #1299: vdirsyncer 0.21.0 discovers and syncs the empty CalDAV collections, but uploading a khal-created Unicode event returns HTTP 403 for the full-access CalDAV app password. Evidence: artifacts/bash-interop/caldav-vdirsyncer-403.log. Severity: major. I am tracing the DAV authorization response now and will fix it in the DAV plugin if the defect is inside this area.

Finding filed as #1299: vdirsyncer 0.21.0 discovers and syncs the empty CalDAV collections, but uploading a khal-created Unicode event returns HTTP 403 for the full-access CalDAV app password. Evidence: `artifacts/bash-interop/caldav-vdirsyncer-403.log`. Severity: major. I am tracing the DAV authorization response now and will fix it in the DAV plugin if the defect is inside this area.
Author
Owner

Finding filed as #1302: the Calendar at 390 px exposes a focusable input[type=file] without an accessible name. The 390 px light screenshot and DOM evidence are in artifacts/bash-interop/. Severity: minor. This is outside the DAV plugin area, so it is filed only.

Finding filed as #1302: the Calendar at 390 px exposes a focusable `input[type=file]` without an accessible name. The 390 px light screenshot and DOM evidence are in `artifacts/bash-interop/`. Severity: minor. This is outside the DAV plugin area, so it is filed only.
Author
Owner

Found and filed #1305: Rclone 1.75.1 returns Failed to copy: object not found for NFD/combining WebDAV filenames. Reproduced in the 508-file local upload. Evidence: artifacts/bash-interop/webdav-nfd-rclone-failures.txt. Severity major; investigating inside calternal-dav.

Found and filed #1305: Rclone 1.75.1 returns `Failed to copy: object not found` for NFD/combining WebDAV filenames. Reproduced in the 508-file local upload. Evidence: `artifacts/bash-interop/webdav-nfd-rclone-failures.txt`. Severity major; investigating inside calternal-dav.
Author
Owner

Update: #1305 is now confirmed as a minor client interop quirk. The server stores the filename in NFC and returns that canonical URI in Location; GET at the original NFD URI returns 404 while GET at Location succeeds. Rclone 1.75.1 reports a first-attempt error for direct NFD copyto; a 508-file directory copy retried successfully and the size/mtime check found 508 matching files. Evidence: artifacts/bash-interop/webdav-nfd-rclone-failures.txt.

Found and filed major WebDAV bug #1306: MOVE rejects a current If-Match ETag with 412. Conditional PUT and stale-tag rejection work. Evidence: artifacts/bash-interop/webdav-move-if-match.txt. I am fixing #1306 in the Files DAV provider.

Update: #1305 is now confirmed as a minor client interop quirk. The server stores the filename in NFC and returns that canonical URI in `Location`; GET at the original NFD URI returns 404 while GET at `Location` succeeds. Rclone 1.75.1 reports a first-attempt error for direct NFD `copyto`; a 508-file directory copy retried successfully and the size/mtime check found 508 matching files. Evidence: `artifacts/bash-interop/webdav-nfd-rclone-failures.txt`. Found and filed major WebDAV bug #1306: `MOVE` rejects a current `If-Match` ETag with 412. Conditional PUT and stale-tag rejection work. Evidence: `artifacts/bash-interop/webdav-move-if-match.txt`. I am fixing #1306 in the Files DAV provider.
Author
Owner

Found and filed #1309 (minor, file only): six of 250 CalDAV events with 124-character summaries return 403 fields cannot round trip as a Log line. The shorter entries and NFD/RTL/emoji summaries succeed. This is a Notes/core representation boundary, outside this DAV-only fix. Evidence: artifacts/bash-interop/caldav-long-summary-403.txt.

Found and filed #1309 (minor, file only): six of 250 CalDAV events with 124-character summaries return 403 `fields cannot round trip as a Log line`. The shorter entries and NFD/RTL/emoji summaries succeed. This is a Notes/core representation boundary, outside this DAV-only fix. Evidence: `artifacts/bash-interop/caldav-long-summary-403.txt`.
Author
Owner

Correction for #1309: I traced the rejection to a trailing space in the generated SUMMARY, not summary length. The Journal parser trims trailing whitespace, so this is a minor representation boundary filed only. I corrected #1309 title/body. Retrying the 250-event collection with the fixture trimmed.

Correction for #1309: I traced the rejection to a trailing space in the generated SUMMARY, not summary length. The Journal parser trims trailing whitespace, so this is a minor representation boundary filed only. I corrected #1309 title/body. Retrying the 250-event collection with the fixture trimmed.
Author
Owner

CalDAV upload bug #1299 is fixed and committed as a1c165256. passed;
running 62 tests
test areas::tests::default_colors_match_the_shared_web_vectors ... ok
test areas::tests::copies_have_distinct_stable_ids ... ok
test areas::tests::deletion_removes_only_the_selected_area ... ok
test areas::tests::duplicate_match_uses_day_time_and_title ... ok
test areas::tests::hostile_tag_names_never_enter_a_dav_path ... ok
test areas::tests::sibling_copies_share_line_and_both_change_etag ... ok
test files::tests::encoded_parent_segment_is_bad_request ... ok
test files::tests::home_prefix_cannot_enter_hidden_or_reserved_paths ... ok
test files::tests::home_prefix_matches_complete_path_components ... ok
test files::tests::expired_lock_is_pruned_and_class_two_advertisement_is_scoped ... ok
test files::tests::if_header_scan_detects_unterminated_tokens ... ok
test files::tests::propfind_content_type_follows_the_indexed_mime_for_each_href ... ok
test files::tests::propfind_content_type_ignores_hrefs_inside_properties ... ok
test files::tests::locks_require_tokens_and_are_scoped_by_user_path ... ok
test files::tests::read_upload_only_can_read_and_create_without_destructive_methods ... ok
test files::tests::refresh_accepts_a_resource_within_infinite_lock_scope ... ok
test files::tests::slow_dav_stream_flushes_pending_bytes_at_the_idle_threshold ... ok
test files::tests::split_transport_frames_remain_one_uncommitted_tail ... ok
test files::tests::tagged_if_tokens_authorize_only_the_named_resource ... ok
test files::tests::unlock_accepts_a_resource_within_infinite_lock_scope ... ok
test protocol::tests::calendar_query_bounds_use_the_logged_zone ... ok
test protocol::tests::dav_storage_error_uses_507_insufficient_storage ... ok
test protocol::tests::declared_oversized_icalendar_is_rejected_before_body_read ... ok
test protocol::tests::sync_tokens_cannot_be_replayed_into_another_area ... ok
test files::tests::sibling_mutations_run_together_and_same_path_mutations_wait ... ok
test files::tests::files_xml_routes_reject_over_depth_extensions_and_recover ... ok
test files::tests::depth_zero_parent_lock_blocks_new_member_but_depth_infinity_uses_member_scope ... ok
test files::tests::service_unavailable_restores_503_after_filesystem_mapping ... ok
test files::tests::propfind_stream_rewrites_tags_split_across_frames ... ok
test files::tests::full_chunk_waits_for_more_data_and_tail_keeps_its_offset ... ok
test files::tests::precondition_failure_restores_412_after_filesystem_mapping ... ok
test reminders::tests::future_properties_flags_and_non_parent_relations_are_preserved ... ok
test reminders::tests::completed_status_without_date_does_not_create_an_empty_completion ... ok
test reminders::tests::clearing_absolute_alarms_understands_case_and_folding_but_keeps_relative_alerts ... ok
test reminders::tests::legacy_native_clock_stays_floating_without_guessing_a_zone ... ok
test reminders::tests::macos27_timed_reminder_edit_keeps_early_alarm ... ok
test reminders::tests::description_is_mapped_and_named_timezones_are_kept ... ok
test reminders::tests::macos27_date_only_reminder_has_no_time_or_zone ... ok
test reminders::tests::macos27_completion_maps_status_and_keeps_vendor_properties ... ok
test protocol::tests::virtual_dav_xml_routes_reject_over_depth_extensions_and_recover ... ok
test reminders::tests::vtodo_created_uses_the_task_instant_in_utc ... ok
test reminders::tests::macos27_vtodo_with_timezone_and_alarm_is_accepted ... ok
test reminders::tests::vtodo_parser_maps_complete_and_dates_to_task_fields ... ok
test reminders::tests::scheduled_only_task_has_due_and_round_trips_without_inventing_a_deadline ... ok
test reminders::tests::vtodo_projection_carries_task_identity_dates_priority_recurrence_and_parent ... ok
test request_xml::tests::budgets_have_inclusive_limits ... ok
test reminders::tests::scheduled_due_role_uses_the_edited_visible_date_and_can_clear_it ... ok
test reminders::tests::markdown_dates_and_priority_override_stale_apple_metadata ... ok
test request_xml::tests::valid_documents_empty_bodies_and_utf16_work ... ok
test tests::macos27_put_fixture_projects_to_one_zoned_log_entry ... ok
test tests::khal_uid_round_trips_through_a_safe_log_block_identity ... ok
test tests::overnight_range_round_trips_with_a_next_day_dtend ... ok
test reminders::tests::vtodo_summary_round_trips_every_script_across_folds ... ok
test tests::reported_crossday_log_projects_exact_start_and_end_dates ... ok
test tests::rejects_dst_gap_and_fold_without_an_instant ... ok
test tests::zoned_journal_event_preserves_iana_zone_and_utc ... ok
test tests::projects_one_log_entry_and_rejects_unrepresentable_fields ... ok
test areas::tests::sibling_projection_keeps_the_same_log_line ... ok
test request_xml::tests::parser_enforces_depth_and_node_budgets ... ok
test files::tests::lock_leases_have_a_finite_per_user_capacity ... ok
test request_xml::tests::parser_enforces_decoded_data_budget_across_encodings ... ok
test files::tests::propfind_stream_accepts_a_120k_entry_listing_over_64_mib ... ok

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

running 38 tests
test apple_delete_of_one_area_copy_keeps_child_lines ... ok
test apple_finder_appledouble_probe_is_missing_not_forbidden ... ok
test apple_complete_fixture_put_and_uncomplete_round_trip ... ok
test apple_reminder_completion_keeps_multiline_description_for_get_and_report ... ok
test apple_calendar_move_and_delete_without_if_match ... ok
test apple_delete_with_children_succeeds ... ok
test apple_delete_then_put_move_keeps_the_log_entry_identity ... ok
test area_collection_discovery_and_sibling_copy_reads ... ok
test apple_collection_properties_replay_and_round_trip_for_journal_and_reminders ... ok
test concurrent_area_moves_use_the_source_etag_as_the_write_lock ... ok
test file_endpoint_requires_explicit_webdav_scope ... ok
test area_move_replaces_only_the_source_area_tag ... ok
test file_propfind_refuses_infinite_depth ... ok
test file_put_with_unterminated_if_header_is_rejected ... ok
test macos27_daily_repeat_request_round_trips_with_alarm ... ok
test file_route_rejects_dot_segments_before_dav_normalization ... ok
test macos27_journal_description_is_refused_as_unrepresentable ... ok
test file_propfind_body_is_bounded ... ok
test macos27_delete_without_if_match_uses_current_reminder_etag ... ok
test file_locks_are_expiring_tokens_checked_on_all_writes ... ok
test macos27_date_only_completion_put_round_trips ... ok
test macos27_priority_knobs_and_notes_round_trip ... ok
test file_options_advertises_webdav_class_two_with_locking ... ok
test macos27_timed_reminder_alarm_complete_and_uncomplete_round_trip ... ok
test macos27_multiline_reminder_notes_round_trip ... ok
test macos27_two_week_repeat_request_round_trips_with_alarm ... ok
test read_and_upload_only_scope_combines_access_without_escape ... ok
test macos27_weekday_repeat_request_round_trips_with_alarm ... ok
test macos27_weekly_repeat_request_round_trips_with_alarm ... ok
test macos27_unicode_and_timed_reminder_edits_round_trip ... ok
test selected_weekdays_monthly_day_and_yearly_rules_round_trip ... ok
test rejected_collection_property_blocks_valid_updates_in_the_same_patch ... ok
test unsupported_repeat_count_is_preserved_losslessly ... ok
test apple_reminders_report_and_put_round_trip ... ok
test reminders_collection_rejects_hostile_components_without_server_errors ... ok
test upload_only_scope_cannot_read_or_escape_its_prefix ... ok
test apple_caldav_request_replay_lists_and_writes_journal_and_reminders ... ok
test apple_calendar_multiget_accepts_100_hrefs_over_legacy_report_cap ... ok

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

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s passed (62 unit, 38 replay).

CalDAV upload bug #1299 is fixed and committed as a1c165256. passed; running 62 tests test areas::tests::default_colors_match_the_shared_web_vectors ... ok test areas::tests::copies_have_distinct_stable_ids ... ok test areas::tests::deletion_removes_only_the_selected_area ... ok test areas::tests::duplicate_match_uses_day_time_and_title ... ok test areas::tests::hostile_tag_names_never_enter_a_dav_path ... ok test areas::tests::sibling_copies_share_line_and_both_change_etag ... ok test files::tests::encoded_parent_segment_is_bad_request ... ok test files::tests::home_prefix_cannot_enter_hidden_or_reserved_paths ... ok test files::tests::home_prefix_matches_complete_path_components ... ok test files::tests::expired_lock_is_pruned_and_class_two_advertisement_is_scoped ... ok test files::tests::if_header_scan_detects_unterminated_tokens ... ok test files::tests::propfind_content_type_follows_the_indexed_mime_for_each_href ... ok test files::tests::propfind_content_type_ignores_hrefs_inside_properties ... ok test files::tests::locks_require_tokens_and_are_scoped_by_user_path ... ok test files::tests::read_upload_only_can_read_and_create_without_destructive_methods ... ok test files::tests::refresh_accepts_a_resource_within_infinite_lock_scope ... ok test files::tests::slow_dav_stream_flushes_pending_bytes_at_the_idle_threshold ... ok test files::tests::split_transport_frames_remain_one_uncommitted_tail ... ok test files::tests::tagged_if_tokens_authorize_only_the_named_resource ... ok test files::tests::unlock_accepts_a_resource_within_infinite_lock_scope ... ok test protocol::tests::calendar_query_bounds_use_the_logged_zone ... ok test protocol::tests::dav_storage_error_uses_507_insufficient_storage ... ok test protocol::tests::declared_oversized_icalendar_is_rejected_before_body_read ... ok test protocol::tests::sync_tokens_cannot_be_replayed_into_another_area ... ok test files::tests::sibling_mutations_run_together_and_same_path_mutations_wait ... ok test files::tests::files_xml_routes_reject_over_depth_extensions_and_recover ... ok test files::tests::depth_zero_parent_lock_blocks_new_member_but_depth_infinity_uses_member_scope ... ok test files::tests::service_unavailable_restores_503_after_filesystem_mapping ... ok test files::tests::propfind_stream_rewrites_tags_split_across_frames ... ok test files::tests::full_chunk_waits_for_more_data_and_tail_keeps_its_offset ... ok test files::tests::precondition_failure_restores_412_after_filesystem_mapping ... ok test reminders::tests::future_properties_flags_and_non_parent_relations_are_preserved ... ok test reminders::tests::completed_status_without_date_does_not_create_an_empty_completion ... ok test reminders::tests::clearing_absolute_alarms_understands_case_and_folding_but_keeps_relative_alerts ... ok test reminders::tests::legacy_native_clock_stays_floating_without_guessing_a_zone ... ok test reminders::tests::macos27_timed_reminder_edit_keeps_early_alarm ... ok test reminders::tests::description_is_mapped_and_named_timezones_are_kept ... ok test reminders::tests::macos27_date_only_reminder_has_no_time_or_zone ... ok test reminders::tests::macos27_completion_maps_status_and_keeps_vendor_properties ... ok test protocol::tests::virtual_dav_xml_routes_reject_over_depth_extensions_and_recover ... ok test reminders::tests::vtodo_created_uses_the_task_instant_in_utc ... ok test reminders::tests::macos27_vtodo_with_timezone_and_alarm_is_accepted ... ok test reminders::tests::vtodo_parser_maps_complete_and_dates_to_task_fields ... ok test reminders::tests::scheduled_only_task_has_due_and_round_trips_without_inventing_a_deadline ... ok test reminders::tests::vtodo_projection_carries_task_identity_dates_priority_recurrence_and_parent ... ok test request_xml::tests::budgets_have_inclusive_limits ... ok test reminders::tests::scheduled_due_role_uses_the_edited_visible_date_and_can_clear_it ... ok test reminders::tests::markdown_dates_and_priority_override_stale_apple_metadata ... ok test request_xml::tests::valid_documents_empty_bodies_and_utf16_work ... ok test tests::macos27_put_fixture_projects_to_one_zoned_log_entry ... ok test tests::khal_uid_round_trips_through_a_safe_log_block_identity ... ok test tests::overnight_range_round_trips_with_a_next_day_dtend ... ok test reminders::tests::vtodo_summary_round_trips_every_script_across_folds ... ok test tests::reported_crossday_log_projects_exact_start_and_end_dates ... ok test tests::rejects_dst_gap_and_fold_without_an_instant ... ok test tests::zoned_journal_event_preserves_iana_zone_and_utc ... ok test tests::projects_one_log_entry_and_rejects_unrepresentable_fields ... ok test areas::tests::sibling_projection_keeps_the_same_log_line ... ok test request_xml::tests::parser_enforces_depth_and_node_budgets ... ok test files::tests::lock_leases_have_a_finite_per_user_capacity ... ok test request_xml::tests::parser_enforces_decoded_data_budget_across_encodings ... ok test files::tests::propfind_stream_accepts_a_120k_entry_listing_over_64_mib ... ok test result: ok. 62 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.33s running 38 tests test apple_delete_of_one_area_copy_keeps_child_lines ... ok test apple_finder_appledouble_probe_is_missing_not_forbidden ... ok test apple_complete_fixture_put_and_uncomplete_round_trip ... ok test apple_reminder_completion_keeps_multiline_description_for_get_and_report ... ok test apple_calendar_move_and_delete_without_if_match ... ok test apple_delete_with_children_succeeds ... ok test apple_delete_then_put_move_keeps_the_log_entry_identity ... ok test area_collection_discovery_and_sibling_copy_reads ... ok test apple_collection_properties_replay_and_round_trip_for_journal_and_reminders ... ok test concurrent_area_moves_use_the_source_etag_as_the_write_lock ... ok test file_endpoint_requires_explicit_webdav_scope ... ok test area_move_replaces_only_the_source_area_tag ... ok test file_propfind_refuses_infinite_depth ... ok test file_put_with_unterminated_if_header_is_rejected ... ok test macos27_daily_repeat_request_round_trips_with_alarm ... ok test file_route_rejects_dot_segments_before_dav_normalization ... ok test macos27_journal_description_is_refused_as_unrepresentable ... ok test file_propfind_body_is_bounded ... ok test macos27_delete_without_if_match_uses_current_reminder_etag ... ok test file_locks_are_expiring_tokens_checked_on_all_writes ... ok test macos27_date_only_completion_put_round_trips ... ok test macos27_priority_knobs_and_notes_round_trip ... ok test file_options_advertises_webdav_class_two_with_locking ... ok test macos27_timed_reminder_alarm_complete_and_uncomplete_round_trip ... ok test macos27_multiline_reminder_notes_round_trip ... ok test macos27_two_week_repeat_request_round_trips_with_alarm ... ok test read_and_upload_only_scope_combines_access_without_escape ... ok test macos27_weekday_repeat_request_round_trips_with_alarm ... ok test macos27_weekly_repeat_request_round_trips_with_alarm ... ok test macos27_unicode_and_timed_reminder_edits_round_trip ... ok test selected_weekdays_monthly_day_and_yearly_rules_round_trip ... ok test rejected_collection_property_blocks_valid_updates_in_the_same_patch ... ok test unsupported_repeat_count_is_preserved_losslessly ... ok test apple_reminders_report_and_put_round_trip ... ok test reminders_collection_rejects_hostile_components_without_server_errors ... ok test upload_only_scope_cannot_read_or_escape_its_prefix ... ok test apple_caldav_request_replay_lists_and_writes_journal_and_reminders ... ok test apple_calendar_multiget_accepts_100_hrefs_over_legacy_report_cap ... ok test result: ok. 38 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s passed (62 unit, 38 replay).
Author
Owner

Completed bug bash

Branch: job/bash-interop
Head: 50495909d5

Commits:

  • a1c165256 Fix vdirsyncer CalDAV event uploads.
  • 50495909d Fix WebDAV MOVE If-Match handling.

Findings

Issue Symptom Severity Result
#1299 vdirsyncer event upload failed because opaque client UIDs and initial hrefs were treated as Notes block IDs. Major Fixed in a1c165256; khal 0.14.1 fixture and live vdirsyncer round trip pass.
#1306 WebDAV MOVE rejected the current quoted If-Match ETag. Major Fixed in 50495909d; live MOVE and current/stale validator regression pass.
#1305 NFD WebDAV path gets a canonical NFC Location; requesting the original decomposed URI returns 404. rclone's first copy attempt also reported this URI mismatch. Minor Filed only; path normalization is in core, outside this job's owned DAV plugin files.
#1302 Calendar accessibility scan found an unnamed file input. Minor Filed only; UI is outside this job's ownership.
#1309 Trailing whitespace in CalDAV SUMMARY does not round-trip through the Journal title representation. Minor Filed only; this is a core representation boundary.

Coverage

UI checks used a macOS-emulated Playwright browser. Calendar screenshots cover 390, 820, and 1440 px in light and dark themes. Pointer, phone touch, keyboard navigation, focus visibility, Enter, Escape, Shift+F10, Copy link, back/forward, reload, and offline/online recovery were exercised. Reduced motion and accessible names/roles were checked in the WebMCP matrix. The unnamed file input is the filed accessibility finding.

AREA flow Tested Methods / viewports Findings
CalDAV discovery and client create → UI Yes vdirsyncer 0.21.0 + khal 0.14.1 against the local production server; UI checked at 390/820/1440, light/dark. #1299 fixed. Unicode event appeared in the UI.
UI edit → client sync Yes UI rename, then vdirsyncer sync and khal readback; UI matrix above. No additional defect.
CardDAV / khard Attempted; unsupported by the designed surface vdirsyncer contact discovery and khard were installed. Discovery returned no home-set. DESIGN §49 I5 excludes Contacts/CardDAV. No endpoint was added.
WebDAV with curl Yes Local production server; create, duplicate create, GET, conditional PUT, stale PUT, MOVE, GET, DELETE. #1306 fixed. Current If-Match succeeds; stale If-Match returns 412.
WebDAV with rclone Yes rclone 1.75.1; copy, check, copyto, moveto, read, delete. 508-file corpus completed; Unicode NFD URI behavior filed as #1305.
MCP / WebMCP Yes MCP tools/list returned 307 tools. WebMCP create and cancel checked at 390/820/1440, light/dark, reduced/no-preference motion; touch, keyboard, pointer. Confirmation has named controls; cancel made no write; create appeared in UI.
Concurrent edits Yes Two UI tabs edited one item; first save returned 200, stale second tab sent no PATCH, first value remained. No data loss. This tested UI-tab concurrency, not a simultaneous external-client write.
ETags and If-Match Yes CalDAV and WebDAV protocol requests; current and stale values. WebDAV MOVE defect #1306 fixed.
Large collections Yes 250 CalDAV events; 508 WebDAV files. CalDAV query returned 253 total resources in 216 ms. rclone check found all 508 by size/mtime; hashes were unavailable.
Unicode names Yes NFD/NFC, RTL, emoji ZWJ, combining marks, Hebrew; client event and WebDAV corpus. #1305 records the NFD URI mismatch.
Deletes Yes CalDAV DELETE with current If-Match followed by vdirsyncer sync; WebDAV DELETE and rclone delete. Deleted objects returned 404 and the client removed its local copy.
Renames Yes UI CalDAV rename synchronized to khal; WebDAV MOVE via curl and rclone. MOVE now accepts the current quoted ETag.

Performance

  • 250-event CalDAV collection query: 216 ms; 253 resources returned. The closest stored baseline is a 50,000-resource calendar query at p95 1,845.533 ms (#573); cardinality and load differ, so this is not a like-for-like comparison.
  • rclone uploaded 508 files (about 4.38 MB including a 4 MiB file) in 3:38.80 on the shared local host. The WebDAV baseline (#476) uses concurrent 1 MB/100 MB uploads, so it is not comparable.
  • Throttled UI reload completed in 3,614 ms at 350 ms latency / 75 kbps down / 30 kbps up; offline failed calmly and online reload recovered.
  • This round did not capture p50/p95 distributions, CPU/RSS, long-task data, or a five-minute memory soak. No comparable baseline measurement was made.

Gates

$ cargo fmt --check
(exit 0; no output)

$ cargo clippy -p calternal-dav --all-targets -- -D warnings
Finished; no warnings.

$ cargo test -p calternal-dav
test result: ok. 62 passed; 0 failed
Replay tests: 38 passed; 0 failed

$ cargo clippy -p calternal-plugin-files --all-targets -- -D warnings
Finished; no warnings.

$ cargo test -p calternal-plugin-files
test result: FAILED. 260 passed; 1 failed; 4 ignored
Failure: public_password_rejection_does_not_wait_for_data_mutation_lock (Elapsed).
Isolated rerun with --test-threads=1 passed in 1.88s; classified as a load-sensitive timeout.

$ cargo clippy -p calternal-server --all-targets -- -D warnings
Finished dev profile [unoptimized + debuginfo] target(s) in 15m 37s

$ cargo test -p calternal-server
test result: FAILED. 252 passed; 20 failed; 12 ignored; 0 measured; 0 filtered out; finished in 245.18s
Several setup failures returned 507 / InsufficientStorage; available disk was about 9.4 GB against the configured 31.7 GB reserve. A nested startup/backfill test also timed out.

$ cd apps/web && bun run check
perf-lint: PASS; 0 violations; 22548 scoped exceptions
svelte-check found 0 errors and 1 warning in 1 file (empty CSS ruleset in shared AttachmentDeck.svelte).

$ cd apps/web && bun run test
Test Files  287 passed (287)
Tests       2035 passed (2035)
Duration    243.29s

The Vitest run passed; the outer zsh log-capture wrapper then failed while assigning its readonly status variable. bun run build also passed for the server test prerequisite. The server test failures are host free-space/timeouts, not DAV assertion failures.

Decisions and remaining gaps

  • Keep UUID and existing @calternal UID forms. Map other opaque CalDAV UIDs to reversible u1_ safe block IDs. Accept bounded client-chosen resource hrefs on create and return the canonical Location; keep UID as the stable event identity.
  • Keep CardDAV/Contacts unavailable under DESIGN §49 I5.
  • Preserve the canonical NFC path behavior and file #1305 for core ownership; do not add an NFD alias in a DAV plugin.
  • Screenshots and protocol evidence are in artifacts/bash-interop/. The installed fj issue CLI supports comments but exposes no attachment command, so screenshots remain in the worktree rather than uploaded as issue attachments. No visual code was changed.
  • Remaining verification gaps: no cross-client simultaneous edit, no five-minute memory/CPU/long-task profile, no p50/p95 measurement, and no CardDAV endpoint because it is intentionally out of scope.
  • For the merge round, run bash tests/adversarial/run-split.sh against the combined real-server build. It runs the XUser and authorization matrices plus hostile input and concurrency probes; it must show no crashes, 5xx responses, authorization leaks, or inconsistent DAV state.
## Completed bug bash Branch: job/bash-interop Head: 50495909d543f29dfad429cae88f9b26fa18646f Commits: - a1c165256 Fix vdirsyncer CalDAV event uploads. - 50495909d Fix WebDAV MOVE If-Match handling. ### Findings | Issue | Symptom | Severity | Result | | --- | --- | --- | --- | | #1299 | vdirsyncer event upload failed because opaque client UIDs and initial hrefs were treated as Notes block IDs. | Major | Fixed in a1c165256; khal 0.14.1 fixture and live vdirsyncer round trip pass. | | #1306 | WebDAV MOVE rejected the current quoted If-Match ETag. | Major | Fixed in 50495909d; live MOVE and current/stale validator regression pass. | | #1305 | NFD WebDAV path gets a canonical NFC Location; requesting the original decomposed URI returns 404. rclone's first copy attempt also reported this URI mismatch. | Minor | Filed only; path normalization is in core, outside this job's owned DAV plugin files. | | #1302 | Calendar accessibility scan found an unnamed file input. | Minor | Filed only; UI is outside this job's ownership. | | #1309 | Trailing whitespace in CalDAV SUMMARY does not round-trip through the Journal title representation. | Minor | Filed only; this is a core representation boundary. | ### Coverage UI checks used a macOS-emulated Playwright browser. Calendar screenshots cover 390, 820, and 1440 px in light and dark themes. Pointer, phone touch, keyboard navigation, focus visibility, Enter, Escape, Shift+F10, Copy link, back/forward, reload, and offline/online recovery were exercised. Reduced motion and accessible names/roles were checked in the WebMCP matrix. The unnamed file input is the filed accessibility finding. | AREA flow | Tested | Methods / viewports | Findings | | --- | --- | --- | --- | | CalDAV discovery and client create → UI | Yes | vdirsyncer 0.21.0 + khal 0.14.1 against the local production server; UI checked at 390/820/1440, light/dark. | #1299 fixed. Unicode event appeared in the UI. | | UI edit → client sync | Yes | UI rename, then vdirsyncer sync and khal readback; UI matrix above. | No additional defect. | | CardDAV / khard | Attempted; unsupported by the designed surface | vdirsyncer contact discovery and khard were installed. Discovery returned no home-set. | DESIGN §49 I5 excludes Contacts/CardDAV. No endpoint was added. | | WebDAV with curl | Yes | Local production server; create, duplicate create, GET, conditional PUT, stale PUT, MOVE, GET, DELETE. | #1306 fixed. Current If-Match succeeds; stale If-Match returns 412. | | WebDAV with rclone | Yes | rclone 1.75.1; copy, check, copyto, moveto, read, delete. | 508-file corpus completed; Unicode NFD URI behavior filed as #1305. | | MCP / WebMCP | Yes | MCP tools/list returned 307 tools. WebMCP create and cancel checked at 390/820/1440, light/dark, reduced/no-preference motion; touch, keyboard, pointer. | Confirmation has named controls; cancel made no write; create appeared in UI. | | Concurrent edits | Yes | Two UI tabs edited one item; first save returned 200, stale second tab sent no PATCH, first value remained. | No data loss. This tested UI-tab concurrency, not a simultaneous external-client write. | | ETags and If-Match | Yes | CalDAV and WebDAV protocol requests; current and stale values. | WebDAV MOVE defect #1306 fixed. | | Large collections | Yes | 250 CalDAV events; 508 WebDAV files. | CalDAV query returned 253 total resources in 216 ms. rclone check found all 508 by size/mtime; hashes were unavailable. | | Unicode names | Yes | NFD/NFC, RTL, emoji ZWJ, combining marks, Hebrew; client event and WebDAV corpus. | #1305 records the NFD URI mismatch. | | Deletes | Yes | CalDAV DELETE with current If-Match followed by vdirsyncer sync; WebDAV DELETE and rclone delete. | Deleted objects returned 404 and the client removed its local copy. | | Renames | Yes | UI CalDAV rename synchronized to khal; WebDAV MOVE via curl and rclone. | MOVE now accepts the current quoted ETag. | ### Performance - 250-event CalDAV collection query: 216 ms; 253 resources returned. The closest stored baseline is a 50,000-resource calendar query at p95 1,845.533 ms (#573); cardinality and load differ, so this is not a like-for-like comparison. - rclone uploaded 508 files (about 4.38 MB including a 4 MiB file) in 3:38.80 on the shared local host. The WebDAV baseline (#476) uses concurrent 1 MB/100 MB uploads, so it is not comparable. - Throttled UI reload completed in 3,614 ms at 350 ms latency / 75 kbps down / 30 kbps up; offline failed calmly and online reload recovered. - This round did not capture p50/p95 distributions, CPU/RSS, long-task data, or a five-minute memory soak. No comparable baseline measurement was made. ### Gates $ cargo fmt --check (exit 0; no output) $ cargo clippy -p calternal-dav --all-targets -- -D warnings Finished; no warnings. $ cargo test -p calternal-dav test result: ok. 62 passed; 0 failed Replay tests: 38 passed; 0 failed $ cargo clippy -p calternal-plugin-files --all-targets -- -D warnings Finished; no warnings. $ cargo test -p calternal-plugin-files test result: FAILED. 260 passed; 1 failed; 4 ignored Failure: public_password_rejection_does_not_wait_for_data_mutation_lock (Elapsed). Isolated rerun with --test-threads=1 passed in 1.88s; classified as a load-sensitive timeout. $ cargo clippy -p calternal-server --all-targets -- -D warnings Finished dev profile [unoptimized + debuginfo] target(s) in 15m 37s $ cargo test -p calternal-server test result: FAILED. 252 passed; 20 failed; 12 ignored; 0 measured; 0 filtered out; finished in 245.18s Several setup failures returned 507 / InsufficientStorage; available disk was about 9.4 GB against the configured 31.7 GB reserve. A nested startup/backfill test also timed out. $ cd apps/web && bun run check perf-lint: PASS; 0 violations; 22548 scoped exceptions svelte-check found 0 errors and 1 warning in 1 file (empty CSS ruleset in shared AttachmentDeck.svelte). $ cd apps/web && bun run test Test Files 287 passed (287) Tests 2035 passed (2035) Duration 243.29s The Vitest run passed; the outer zsh log-capture wrapper then failed while assigning its readonly status variable. bun run build also passed for the server test prerequisite. The server test failures are host free-space/timeouts, not DAV assertion failures. ### Decisions and remaining gaps - Keep UUID and existing @calternal UID forms. Map other opaque CalDAV UIDs to reversible u1_ safe block IDs. Accept bounded client-chosen resource hrefs on create and return the canonical Location; keep UID as the stable event identity. - Keep CardDAV/Contacts unavailable under DESIGN §49 I5. - Preserve the canonical NFC path behavior and file #1305 for core ownership; do not add an NFD alias in a DAV plugin. - Screenshots and protocol evidence are in artifacts/bash-interop/. The installed fj issue CLI supports comments but exposes no attachment command, so screenshots remain in the worktree rather than uploaded as issue attachments. No visual code was changed. - Remaining verification gaps: no cross-client simultaneous edit, no five-minute memory/CPU/long-task profile, no p50/p95 measurement, and no CardDAV endpoint because it is intentionally out of scope. - For the merge round, run `bash tests/adversarial/run-split.sh` against the combined real-server build. It runs the XUser and authorization matrices plus hostile input and concurrency probes; it must show no crashes, 5xx responses, authorization leaks, or inconsistent DAV state.
Commenting is not possible because the repository is archived.
No labels
No milestone
No project
No assignees
1 participant
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal-v0#1221
No description provided.