Skip to content

Issue #83: enforce document-only input.write snapshot contract#84

Merged
AmirTlinov merged 1 commit intomainfrom
builder/83-snapshot-write-validate-only
Feb 24, 2026
Merged

Issue #83: enforce document-only input.write snapshot contract#84
AmirTlinov merged 1 commit intomainfrom
builder/83-snapshot-write-validate-only

Conversation

@AmirTlinov
Copy link
Copy Markdown
Owner

@AmirTlinov AmirTlinov commented Feb 24, 2026

Summary

  • cut input.write over to full-replace document payloads (+ validate_only)
  • removed public op/granular write contract from schema, parser, tests, and docs
  • kept finalize checks fail-closed for normal + validate-only write paths

Validation

  • cargo fmt --check
  • cargo clippy --all-targets --all-features -- -D warnings
  • cargo test --all-targets --all-features
  • scripts/check_coverage_baseline.sh
  • cargo audit

Refs #83

@AmirTlinov
Copy link
Copy Markdown
Owner Author

@review review

@AmirTlinov
Copy link
Copy Markdown
Owner Author

VERDICT: PASS

Scope-only review for issue #83 is satisfied.

  • input.write is document-only full-replace snapshot (document) and op/legacy granular mutations are rejected with actionable guidance (schema + parser + tests).
  • validate_only performs finalize checks without persistence (no revision/state mutation).
  • Fail-closed finalize validation is preserved for both draft and finalize paths.
  • No scope drift: only README.md, src/adapters/mcp_stdio/mod.rs, src/adapters/mcp_stdio/schema.rs, src/adapters/mcp_stdio/tool_input.rs, src/app/input_usecases.rs, src/domain/models.rs, tests/e2e.rs, tests/integration_test.rs changed.
  • Verification: cargo test --all-targets --all-features, cargo test --test e2e, cargo test --test integration_test

Context pack: https://chat.openai.com/c/PK_NOT_SUPPORTED? Actually this is placeholder?

@AmirTlinov
Copy link
Copy Markdown
Owner Author

VERDICT: PASS\n\nPASS with no blocking findings.\n- Document-only contract and validate-only dry-run are implemented and tested.\n- Legacy /mutation field writes return clear migration guidance.\n- Finalize fail-closed checks remain enforced on write paths.\n\nVerification artifacts: unit/adapter/e2e/integration tests all passing on PR branch (

running 83 tests
test adapters::mcp_stdio::tool_output::tests::default_output_read_uses_orchestrator_profile ... ok
test adapters::mcp_stdio::tests::test_output_format_parameter_is_rejected ... ok
test adapters::mcp_stdio::tests::test_parse_initialize_timeout_ms ... ok
test adapters::mcp_stdio::tool_output::tests::explicit_profile_is_parsed ... ok
test adapters::mcp_stdio::tool_output::tests::page_token_is_forwarded_without_profile_override ... ok
test adapters::mcp_stdio::tool_output::tests::legacy_read_fields_are_rejected ... ok
test adapters::mcp_stdio::tests::test_domain_error_contract_for_migration_required ... ok
test adapters::mcp_stdio::tests::test_domain_error_contract_for_pack_id_conflict ... ok
test adapters::mcp_stdio::tests::test_domain_error_contract_for_deserialize_error ... ok
test adapters::mcp_stdio::tests::test_domain_error_contract_is_strict_json ... ok
test adapters::mcp_stdio::tests::test_domain_error_contract_keeps_string_request_id ... ok
test adapters::storage_json::tests::test_decode_rejects_malformed ... ok
test adapters::mcp_stdio::tool_output::tests::selected_metadata_remains_present_when_content_contains_marker_substrings ... ok
test adapters::mcp_stdio::tool_output::tests::selected_metadata_is_deterministically_overwritten_in_legend ... ok
test adapters::storage_json::tests::test_encode_decode_roundtrip ... ok
test adapters::storage_json::tests::test_decode_with_path_wraps_migration_error ... ok
test adapters::storage_json::tests::test_list_pack_paths_nonexistent_dir ... ok
test adapters::mcp_stdio::tests::test_frame_size_limit ... ok
test adapters::mcp_stdio::tests::test_oversized_header_line_is_rejected ... ok
test adapters::mcp_stdio::tests::test_content_length_header_case_insensitive ... ok
test adapters::mcp_stdio::tests::test_oversized_json_line_is_rejected ... ok
test adapters::mcp_stdio::tests::test_content_type_then_content_length_is_accepted ... ok
test adapters::mcp_stdio::tests::test_json_line_batch_messages_are_parsed_sequentially ... ok
test adapters::mcp_stdio::tests::test_content_length_framing ... ok
test adapters::mcp_stdio::tests::test_plain_json_line_is_accepted ... ok
test adapters::mcp_stdio::tests::test_plain_json_without_newline_is_accepted ... ok
test adapters::mcp_stdio::tests::test_plain_multiline_json_is_rejected ... ok
test adapters::mcp_stdio::tests::test_transport_mode_detection ... ok
test adapters::storage_json::tests::test_load_all_active_skips_and_removes_corrupt_or_oversized_pack ... ok
test app::ports::tests::freshness_state_boundaries_are_stable ... ok
test adapters::storage_json::tests::test_purge_expired_removes_only_expired ... ok
test app::resolver::tests::resolve_by_id_success ... ok
test adapters::storage_json::tests::test_write_pack_atomic_persists_and_is_decodable ... ok
test app::resolver::tests::resolve_by_id_not_found_no_name_fallthrough ... ok
test app::resolver::tests::resolve_empty_identifier_returns_invalid_data ... ok
test adapters::code_excerpt_fs::tests::test_file_not_found_returns_stale_ref ... ok
test adapters::storage_json::tests::test_get_by_id_returns_none_for_corrupt_pack_and_recovers_file ... ok
test domain::models::tests::test_cannot_finalize_empty_pack ... ok
test app::resolver::tests::resolve_by_name_success ... ok
test adapters::storage_json::tests::test_purge_expired_removes_unreadable_and_oversized_pack_files ... ok
test domain::models::tests::test_extend_ttl_from_now_when_already_expired ... ok
test adapters::storage_json::tests::test_load_all_active_excludes_expired ... ok
test adapters::code_excerpt_fs::tests::test_path_outside_root_is_rejected ... ok
test adapters::code_excerpt_fs::tests::test_file_too_large_is_rejected ... ok
test adapters::code_excerpt_fs::tests::test_range_end_exceeds_total_lines ... ok
test adapters::code_excerpt_fs::tests::test_reads_exact_lines ... ok
test app::resolver::tests::resolve_name_not_found ... ok
test adapters::code_excerpt_fs::tests::test_crlf_line_endings_are_trimmed ... ok
test domain::models::tests::test_is_expired_when_future ... ok
test domain::models::tests::test_is_expired_when_past ... ok
test adapters::code_excerpt_fs::tests::test_reads_single_line ... ok
test domain::models::tests::test_migrate_schema_ahead_returns_error ... ok
test adapters::storage_json::tests::test_save_with_expected_revision_rejects_oversized_payload_with_validation_error ... ok
test adapters::storage_json::tests::test_create_new_rejects_oversized_payload_with_validation_error ... ok
test adapters::storage_json::tests::test_delete_pack_file_removes_target_without_reading_payload ... ok
test domain::models::tests::test_migrate_schema_rejects_non_compact_pack_id ... ok
test domain::models::tests::test_cannot_finalize_with_only_empty_section ... ok
test domain::models::tests::test_set_ttl_and_extend_ttl ... ok
test domain::models::tests::test_ttl_must_be_positive ... ok
test domain::models::tests::test_finalize_minimal_pack_succeeds ... ok
test adapters::storage_json::tests::test_get_by_name_prefers_latest_finalized_then_revision ... ok
test domain::models::tests::test_migrate_schema_rejects_older_schema ... ok
test domain::models::tests::test_set_meta_requires_fields ... ok
test adapters::storage_json::tests::test_get_by_name_reports_candidate_ids_on_rank_tie ... ok
test domain::models::tests::test_delete_ref_not_found_returns_error ... ok
test domain::models::tests::test_revision_increments_on_mutation ... ok
test domain::models::tests::test_cannot_finalize_without_qa_verdict ... ok
test domain::models::tests::test_finalized_pack_is_immutable ... ok
test domain::models::tests::test_ttl_remaining_human_expired ... ok
test domain::models::tests::test_ttl_remaining_human_hours ... ok
test domain::models::tests::test_ttl_remaining_human_minutes ... ok
test adapters::storage_json::tests::test_list_packs_filters_by_freshness_and_can_surface_expired ... ok
test domain::types::tests::test_line_range_span_limit ... ok
test domain::types::tests::test_line_range_validation ... ok
test domain::types::tests::test_pack_name_must_not_look_like_pack_id ... ok
test domain::types::tests::test_pack_name_validation ... ok
test domain::types::tests::test_pack_id_validation ... ok
test domain::types::tests::test_relative_path_validation ... ok
test domain::types::tests::test_status_from_str ... ok
test domain::models::tests::test_upsert_ref_replaces_existing ... ok
test domain::types::tests::test_section_key_validation ... ok
test adapters::code_excerpt_fs::tests::test_range_start_exceeds_total_lines ... ok
test adapters::mcp_stdio::tests::test_tool_success_rejects_oversized_payload ... ok

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

running 0 tests

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

running 25 tests
test e2e_v3_rejects_legacy_actions_with_invalid_data ... ok
test e2e_server_exits_if_initialize_never_arrives ... ok
test e2e_initialize_accepts_unframed_json_message ... ok
test e2e_output_rejects_format_parameter ... ok
test e2e_initialize_with_content_type_header ... ok
test e2e_unframed_json_line_batch_is_processed_sequentially ... ok
test e2e_touch_ttl_requires_mode_field ... ok
test e2e_notification_without_id_produces_no_response ... ok
test e2e_create_requires_ttl_minutes ... ok
test e2e_input_rejects_legacy_alias_fields ... ok
test e2e_schema_mismatch_reports_migration_required ... ok
test e2e_tool_error_contract_is_machine_readable ... ok
test e2e_output_get_name_resolution_metadata_and_ambiguity_candidates ... ok
test e2e_concurrent_create_same_name_rejects_one_process ... ok
test e2e_input_delete_pack_is_deterministic ... ok
test e2e_freshness_metadata_filters_and_warnings ... ok
test e2e_output_read_rejects_legacy_match_cursor_mode_fields ... ok
test e2e_finalize_validation_reports_missing_sections_and_invalid_refs ... ok
test e2e_request_id_and_revision_conflict_contract ... ok
test e2e_output_read_supports_profiles_contains_and_page_token ... ok
test e2e_tool_call_roundtrip_with_real_stdio ... ok
test e2e_multi_agent_handoff_compact_full_and_stale_path ... ok
test e2e_output_read_orchestrator_default_is_bounded_and_reviewer_is_full ... ok
test e2e_shutdown_notification_has_no_side_effects ... ok
test e2e_shutdown_exit_terminates_server ... ok

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

running 31 tests
test test_malformed_pack_file_is_recovered_by_list ... ok
test test_schema_mismatch_returns_migration_required ... ok
test test_list_with_query ... ok
test test_create_applies_tags ... ok
test test_name_resolution_ambiguity_exposes_candidate_ids ... ok
test test_finalize_empty_pack_rejected ... ok
test test_name_resolution_is_deterministic_and_prefers_finalized ... ok
test test_duplicate_name_is_rejected ... ok
test test_get_rendered_exposes_freshness_state_and_warning_when_expiring_soon ... ok
test test_finalize_pack_with_only_empty_section_rejected ... ok
test test_checked_mutation_rejects_stale_revision ... ok
test test_json_round_trip ... ok
test test_draft_workflow_remains_flexible_before_finalize ... ok
test test_touch_ttl_updates_revision_and_legend ... ok
test test_revision_increments ... ok
test test_upsert_section_update_preserves_order_without_explicit_order ... ok
test test_output_read_reviewer_profile_preserves_full_evidence ... ok
test test_full_pack_lifecycle ... ok
test test_finalize_rejects_ref_when_line_end_exceeds_file_length ... ok
test test_output_read_contains_filter ... ok
test test_revision_conflict_changed_section_keys_are_bounded ... ok
test test_output_read_page_token_paging_is_deterministic_and_validated ... ok
test test_output_read_executor_profile_is_actionable_compact ... ok
test test_delete_pack_action_recovers_corrupted_and_oversized_without_affecting_healthy_pack ... ok
test test_set_meta_empty_payload_rejected ... ok
test test_expired_pack_is_not_visible_immediately_in_list ... ok
test test_delete_section ... ok
test test_finalize_missing_qa_or_verdict_is_actionable ... ok
test test_list_pagination ... ok
test test_output_read_orchestrator_default_is_compact_and_bounded ... ok
test test_stale_ref_in_output ... ok

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

running 13 tests
test test_get_rendered_empty_identifier ... ok
test test_list_filtered_returns_packs ... ok
test test_resolve_by_name ... ok
test test_get_rendered_not_found_id ... ok
test test_get_rendered_status_filter_mismatch ... ok
test test_render_stale_ref_shown_as_warning ... ok
test test_render_with_name_and_brief ... ok
test test_render_legend_contains_id_and_status ... ok
test test_render_with_diagram_block ... ok
test test_lang_detection_rust_extension ... ok
test test_render_with_tags ... ok
test test_lang_detection_unknown_extension ... ok
test test_render_with_section_and_ref ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s).\n\nContext pack:

@AmirTlinov
Copy link
Copy Markdown
Owner Author

VERDICT: PASS

PASS with no blocking findings.

  • Document-only input.write snapshot contract and validate_only dry-run are implemented and tested.
  • Legacy op/granular write usage is rejected with actionable guidance.
  • Finalize fail-closed checks remain enforced for write paths.
  • Scope remains limited to the requested files.

Verification artifacts: cargo test --all-targets --all-features (all tests passing on PR branch).

Context pack: pk_t4773pbv

@AmirTlinov AmirTlinov merged commit a0fb165 into main Feb 24, 2026
1 check passed
@AmirTlinov AmirTlinov deleted the builder/83-snapshot-write-validate-only branch February 24, 2026 15:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant