.NET API
RunStoreContract
Tracon.Testing.Contracts.Xunit.dllBehavior tests for the IRunStore contract.
public abstract class RunStoreContract : TenantIsolationContract<IRunStore>, IAsyncLifetime, IAsyncDisposable- Inheritance
- object ← StoreCancellationContract<IRunStore> ← TenantIsolationContract<IRunStore> ← RunStoreContract
- Implements
- IAsyncLifetime, IAsyncDisposable
- Inherited Members
- TenantIsolationContract<IRunStore>.TenantA, TenantIsolationContract<IRunStore>.TenantB, TenantIsolationContract<IRunStore>.UseAmbientTenant(MutableTenantContext), TenantIsolationContract<IRunStore>.SeedAsync(string, string, CancellationToken), TenantIsolationContract<IRunStore>.ExistsAsync(string, object), TenantIsolationContract<IRunStore>.CountAsync(string, CancellationToken), TenantIsolationContract<IRunStore>.TryDeleteAsync(string, object), TenantIsolationContract<IRunStore>.TryOverwriteAsync(string, string), TenantIsolationContract<IRunStore>.CancellableReadAsync(CancellationToken), TenantIsolationContract<IRunStore>.CancellableWriteAsync(CancellationToken), TenantIsolationContract<IRunStore>.WroteAnythingAsync(), TenantIsolationContract<IRunStore>.Tenant_cannot_read_another_tenants_record(), TenantIsolationContract<IRunStore>.Tenant_reads_its_own_record(), TenantIsolationContract<IRunStore>.Tenant_does_not_see_another_tenants_record_in_the_list(), TenantIsolationContract<IRunStore>.Tenant_cannot_delete_another_tenants_record(), TenantIsolationContract<IRunStore>.Same_name_lives_independently_across_two_tenants(), TenantIsolationContract<IRunStore>.AmbientTenant, StoreCancellationContract<IRunStore>.CreateStoreAsync(), StoreCancellationContract<IRunStore>.InitializeAsync(), StoreCancellationContract<IRunStore>.DisposeAsync(), StoreCancellationContract<IRunStore>.OnDisposeAsync(), StoreCancellationContract<IRunStore>.CancellableReadAsync(CancellationToken), StoreCancellationContract<IRunStore>.CancellableWriteAsync(CancellationToken), StoreCancellationContract<IRunStore>.WroteAnythingAsync(), StoreCancellationContract<IRunStore>.Canceled_token_throws_on_read(), StoreCancellationContract<IRunStore>.The_write_this_contract_checks_can_be_read_back(), StoreCancellationContract<IRunStore>.Canceled_token_throws_on_write_and_leaves_no_trace(), StoreCancellationContract<IRunStore>.Store, object.GetType(), object.MemberwiseClone(), object.ToString(), object.Equals(object?), object.Equals(object?, object?), object.ReferenceEquals(object?, object?), object.GetHashCode()
Remarks
Section titled “Remarks”The in-memory store and the PostgreSQL store must pass the same scenarios.
Constructors
Section titled “Constructors”RunStoreContract()
Section titled “ RunStoreContract()”protected RunStoreContract()Methods
Section titled “Methods”A_label_key_without_a_value_matches_any_value_of_that_key()
Section titled “ A_label_key_without_a_value_matches_any_value_of_that_key()”[Fact]public Task A_label_key_without_a_value_matches_any_value_of_that_key()Returns
Section titled “Returns”A_queued_workflow_row_keeps_its_workflow_session_and_attribution_when_it_starts()
Section titled “ A_queued_workflow_row_keeps_its_workflow_session_and_attribution_when_it_starts()”A queued workflow row keeps what it was queued with when the engine starts the same run.
[Fact]public Task A_queued_workflow_row_keeps_its_workflow_session_and_attribution_when_it_starts()Returns
Section titled “Returns”Remarks
Section titled “Remarks”The HTTP layer writes the queued row, where the caller is known; the workflow engine writes it again in a background worker, where the caller is not. The row must still name the workflow, its session and the caller.
A_run_promoted_from_Queued_to_Running_keeps_the_heartbeat_it_sent_while_it_waited()
Section titled “ A_run_promoted_from_Queued_to_Running_keeps_the_heartbeat_it_sent_while_it_waited()”[Fact]public Task A_run_promoted_from_Queued_to_Running_keeps_the_heartbeat_it_sent_while_it_waited()Returns
Section titled “Returns”A_run_that_reports_only_a_cache_count_still_produces_a_usage_record()
Section titled “ A_run_that_reports_only_a_cache_count_still_produces_a_usage_record()”[Fact]public Task A_run_that_reports_only_a_cache_count_still_produces_a_usage_record()Returns
Section titled “Returns”A_run_without_attribution_reads_back_as_null_not_as_an_empty_map()
Section titled “ A_run_without_attribution_reads_back_as_null_not_as_an_empty_map()”[Fact]public Task A_run_without_attribution_reads_back_as_null_not_as_an_empty_map()Returns
Section titled “Returns”A_second_start_without_a_continuation_link_keeps_the_first_one()
Section titled “ A_second_start_without_a_continuation_link_keeps_the_first_one()”The continuation link survives the second start of the same run, like the attribution does.
[Fact]public Task A_second_start_without_a_continuation_link_keeps_the_first_one()Returns
Section titled “Returns”Remarks
Section titled “Remarks”Workflow recovery writes the continuation’s row first, with the link, and the workflow engine then starts the same run again without knowing the link. A plain overwrite erased the chain, and the run that continued the work no longer pointed at the run it continued.
A_second_start_without_attribution_does_not_erase_the_first_one()
Section titled “ A_second_start_without_attribution_does_not_erase_the_first_one()”[Fact]public Task A_second_start_without_attribution_does_not_erase_the_first_one()Returns
Section titled “Returns”A_tree_in_which_only_a_child_reported_still_has_a_tree_total()
Section titled “ A_tree_in_which_only_a_child_reported_still_has_a_tree_total()”[Fact]public Task A_tree_in_which_only_a_child_reported_still_has_a_tree_total()Returns
Section titled “Returns”An_unknown_run_has_no_last_event_sequence()
Section titled “ An_unknown_run_has_no_last_event_sequence()”[Fact]public Task An_unknown_run_has_no_last_event_sequence()Returns
Section titled “Returns”AppendEventAsync_does_not_write_with_the_wrong_expected_tenant()
Section titled “ AppendEventAsync_does_not_write_with_the_wrong_expected_tenant()”[Fact]public Task AppendEventAsync_does_not_write_with_the_wrong_expected_tenant()Returns
Section titled “Returns”Applied_unit_prices_round_trip_and_do_not_enter_the_total()
Section titled “ Applied_unit_prices_round_trip_and_do_not_enter_the_total()”[Fact]public Task Applied_unit_prices_round_trip_and_do_not_enter_the_total()Returns
Section titled “Returns”Attribution_round_trips()
Section titled “ Attribution_round_trips()”[Fact]public Task Attribution_round_trips()Returns
Section titled “Returns”Canceled_token_throws_on_the_first_step_of_the_event_stream()
Section titled “ Canceled_token_throws_on_the_first_step_of_the_event_stream()”[Fact]public Task Canceled_token_throws_on_the_first_step_of_the_event_stream()Returns
Section titled “Returns”ClaimOrphanedRunsAsync_closes_a_Queued_row_whose_heartbeat_is_stale()
Section titled “ ClaimOrphanedRunsAsync_closes_a_Queued_row_whose_heartbeat_is_stale()”[Fact]public Task ClaimOrphanedRunsAsync_closes_a_Queued_row_whose_heartbeat_is_stale()Returns
Section titled “Returns”ClaimOrphanedRunsAsync_does_not_touch_a_Queued_row_with_a_fresh_heartbeat()
Section titled “ ClaimOrphanedRunsAsync_does_not_touch_a_Queued_row_with_a_fresh_heartbeat()”[Fact]public Task ClaimOrphanedRunsAsync_does_not_touch_a_Queued_row_with_a_fresh_heartbeat()Returns
Section titled “Returns”ClaimOrphanedRunsAsync_does_not_touch_a_Running_row_within_the_threshold()
Section titled “ ClaimOrphanedRunsAsync_does_not_touch_a_Running_row_within_the_threshold()”[Fact]public Task ClaimOrphanedRunsAsync_does_not_touch_a_Running_row_within_the_threshold()Returns
Section titled “Returns”ClaimOrphanedRunsAsync_marks_a_stale_Running_row_as_Failed()
Section titled “ ClaimOrphanedRunsAsync_marks_a_stale_Running_row_as_Failed()”[Fact]public Task ClaimOrphanedRunsAsync_marks_a_stale_Running_row_as_Failed()Returns
Section titled “Returns”ClaimOrphanedRunsAsync_never_touches_a_Queued_row_that_has_no_heartbeat()
Section titled “ ClaimOrphanedRunsAsync_never_touches_a_Queued_row_that_has_no_heartbeat()”[Fact]public Task ClaimOrphanedRunsAsync_never_touches_a_Queued_row_that_has_no_heartbeat()Returns
Section titled “Returns”ClaimOrphanedRunsAsync_reports_ContinuedFromRunId_on_the_claimed_record()
Section titled “ ClaimOrphanedRunsAsync_reports_ContinuedFromRunId_on_the_claimed_record()”[Fact]public Task ClaimOrphanedRunsAsync_reports_ContinuedFromRunId_on_the_claimed_record()Returns
Section titled “Returns”ClaimOrphanedRunsAsync_reports_the_kind_and_the_tree_position_on_the_claimed_record()
Section titled “ ClaimOrphanedRunsAsync_reports_the_kind_and_the_tree_position_on_the_claimed_record()”[Fact]public Task ClaimOrphanedRunsAsync_reports_the_kind_and_the_tree_position_on_the_claimed_record()Returns
Section titled “Returns”CompleteRunAsync_does_not_close_with_the_wrong_expected_tenant()
Section titled “ CompleteRunAsync_does_not_close_with_the_wrong_expected_tenant()”[Fact]public Task CompleteRunAsync_does_not_close_with_the_wrong_expected_tenant()Returns
Section titled “Returns”Completion_leaves_the_model_id_unchanged_when_no_override_is_given()
Section titled “ Completion_leaves_the_model_id_unchanged_when_no_override_is_given()”[Fact]public Task Completion_leaves_the_model_id_unchanged_when_no_override_is_given()Returns
Section titled “Returns”Completion_leaves_the_model_provider_unchanged_when_no_override_is_given()
Section titled “ Completion_leaves_the_model_provider_unchanged_when_no_override_is_given()”[Fact]public Task Completion_leaves_the_model_provider_unchanged_when_no_override_is_given()Returns
Section titled “Returns”Completion_overrides_the_model_id_when_a_fallback_answered()
Section titled “ Completion_overrides_the_model_id_when_a_fallback_answered()”[Fact]public Task Completion_overrides_the_model_id_when_a_fallback_answered()Returns
Section titled “Returns”Completion_overrides_the_model_provider_when_a_fallback_answered()
Section titled “ Completion_overrides_the_model_provider_when_a_fallback_answered()”[Fact]public Task Completion_overrides_the_model_provider_when_a_fallback_answered()Returns
Section titled “Returns”Completion_stores_error_class_and_fingerprint()
Section titled “ Completion_stores_error_class_and_fingerprint()”[Fact]public Task Completion_stores_error_class_and_fingerprint()Returns
Section titled “Returns”Completion_updates_the_summary()
Section titled “ Completion_updates_the_summary()”[Fact]public Task Completion_updates_the_summary()Returns
Section titled “Returns”ContinuedFromRunId_round_trips()
Section titled “ ContinuedFromRunId_round_trips()”[Fact]public Task ContinuedFromRunId_round_trips()Returns
Section titled “Returns”Cost_does_not_exist_at_all_when_model_is_unknown()
Section titled “ Cost_does_not_exist_at_all_when_model_is_unknown()”[Fact]public Task Cost_does_not_exist_at_all_when_model_is_unknown()Returns
Section titled “Returns”Cost_fields_are_null_but_source_is_written_as_unknown_when_pricing_is_undefined()
Section titled “ Cost_fields_are_null_but_source_is_written_as_unknown_when_pricing_is_undefined()”[Fact]public Task Cost_fields_are_null_but_source_is_written_as_unknown_when_pricing_is_undefined()Returns
Section titled “Returns”Cost_is_written_and_read_back()
Section titled “ Cost_is_written_and_read_back()”[Fact]public Task Cost_is_written_and_read_back()Returns
Section titled “Returns”Cost_recalculation_updates_the_target_row()
Section titled “ Cost_recalculation_updates_the_target_row()”[Fact]public Task Cost_recalculation_updates_the_target_row()Returns
Section titled “Returns”CountAsync(string, CancellationToken)
Section titled “ CountAsync(string, CancellationToken)”Reports how many records the given tenant sees through the listing endpoint.
protected override ValueTask<int> CountAsync(string tenantId, CancellationToken cancellationToken)Parameters
Section titled “Parameters”tenantId string
The reading tenant.
cancellationToken CancellationToken
The token every store call inside the hook must be handed; see TenantIsolationContract.SeedAsync.
Returns
Section titled “Returns”The number of records seen.
CreateScoreStoreAsync()
Section titled “ CreateScoreStoreAsync()”The score store that writes into the SAME backend as Store.
protected virtual ValueTask<IRunScoreStore?> CreateScoreStoreAsync()Returns
Section titled “Returns”The score store, or null when the fixture has none.
Remarks
Section titled “Remarks”IRunStore.GetExperimentResultsAsync averages the
run_scores rows belonging to each run, but scores are written
through a DIFFERENT interface. A fixture that cannot hand back a score
store pointing at the same backend skips the scenarios that need one;
every store in this repository overrides this.
Virtual and not abstract on purpose: this contract ships, and turning an existing contract class abstract would break every third-party store that already derives from it.
Custom_event_custom_type_round_trips_and_stays_null_for_every_other_type()
Section titled “ Custom_event_custom_type_round_trips_and_stays_null_for_every_other_type()”[Fact]public Task Custom_event_custom_type_round_trips_and_stays_null_for_every_other_type()Returns
Section titled “Returns”Empty_store_summary_returns_zero()
Section titled “ Empty_store_summary_returns_zero()”[Fact]public Task Empty_store_summary_returns_zero()Returns
Section titled “Returns”Event_cannot_be_appended_to_a_nonexistent_run()
Section titled “ Event_cannot_be_appended_to_a_nonexistent_run()”[Fact]public Task Event_cannot_be_appended_to_a_nonexistent_run()Returns
Section titled “Returns”Event_fields_round_trip()
Section titled “ Event_fields_round_trip()”[Fact]public Task Event_fields_round_trip()Returns
Section titled “Returns”Events_are_read_in_sequence_order()
Section titled “ Events_are_read_in_sequence_order()”[Fact]public Task Events_are_read_in_sequence_order()Returns
Section titled “Returns”Every_cost_total_includes_the_cache_charge()
Section titled “ Every_cost_total_includes_the_cache_charge()”[Fact]public Task Every_cost_total_includes_the_cache_charge()Returns
Section titled “Returns”ExistsAsync(string, object)
Section titled “ ExistsAsync(string, object)”Reports whether the record is visible from the given tenant’s viewpoint.
protected override ValueTask<bool> ExistsAsync(string tenantId, object key)Parameters
Section titled “Parameters”tenantId string
The reading tenant.
key object
The key returned by TenantIsolationContract.SeedAsync.
Returns
Section titled “Returns”true if the record is visible.
Experiment_results_are_summarized_per_arm()
Section titled “ Experiment_results_are_summarized_per_arm()”[Fact]public Task Experiment_results_are_summarized_per_arm()Returns
Section titled “Returns”Experiment_results_average_a_run_level_score_written_with_an_empty_message_id()
Section titled “ Experiment_results_average_a_run_level_score_written_with_an_empty_message_id()”[Fact]public Task Experiment_results_average_a_run_level_score_written_with_an_empty_message_id()Returns
Section titled “Returns”Experiment_results_include_cost()
Section titled “ Experiment_results_include_cost()”[Fact]public Task Experiment_results_include_cost()Returns
Section titled “Returns”Experiment_results_leave_a_message_level_score_out_of_the_average()
Section titled “ Experiment_results_leave_a_message_level_score_out_of_the_average()”[Fact]public Task Experiment_results_leave_a_message_level_score_out_of_the_average()Returns
Section titled “Returns”Experiment_results_return_empty_for_an_experiment_with_no_traffic()
Section titled “ Experiment_results_return_empty_for_an_experiment_with_no_traffic()”[Fact]public Task Experiment_results_return_empty_for_an_experiment_with_no_traffic()Returns
Section titled “Returns”Items_that_carried_no_amount_keep_their_count_and_a_null_amount()
Section titled “ Items_that_carried_no_amount_keep_their_count_and_a_null_amount()”[Fact]public Task Items_that_carried_no_amount_keep_their_count_and_a_null_amount()Returns
Section titled “Returns”List_returns_only_root_runs_by_default()
Section titled “ List_returns_only_root_runs_by_default()”[Fact]public Task List_returns_only_root_runs_by_default()Returns
Section titled “Returns”No_cost_total_adds_amounts_in_two_currencies()
Section titled “ No_cost_total_adds_amounts_in_two_currencies()”[Fact]public Task No_cost_total_adds_amounts_in_two_currencies()Returns
Section titled “Returns”Non_token_cost_is_a_total_of_its_own_and_never_a_term_of_the_token_cost()
Section titled “ Non_token_cost_is_a_total_of_its_own_and_never_a_term_of_the_token_cost()”[Fact]public Task Non_token_cost_is_a_total_of_its_own_and_never_a_term_of_the_token_cost()Returns
Section titled “Returns”Non_token_cost_snapshot_round_trips_and_a_run_that_reported_nothing_has_none()
Section titled “ Non_token_cost_snapshot_round_trips_and_a_run_that_reported_nothing_has_none()”[Fact]public Task Non_token_cost_snapshot_round_trips_and_a_run_that_reported_nothing_has_none()Returns
Section titled “Returns”Nonexistent_run_cannot_be_completed()
Section titled “ Nonexistent_run_cannot_be_completed()”[Fact]public Task Nonexistent_run_cannot_be_completed()Returns
Section titled “Returns”Nonexistent_run_returns_empty_events()
Section titled “ Nonexistent_run_returns_empty_events()”[Fact]public Task Nonexistent_run_returns_empty_events()Returns
Section titled “Returns”Nonexistent_run_returns_null()
Section titled “ Nonexistent_run_returns_null()”[Fact]public Task Nonexistent_run_returns_null()Returns
Section titled “Returns”Parent_filter_overrides_root_filter()
Section titled “ Parent_filter_overrides_root_filter()”[Fact]public Task Parent_filter_overrides_root_filter()Returns
Section titled “Returns”Query_applies_paging()
Section titled “ Query_applies_paging()”[Fact]public Task Query_applies_paging()Returns
Section titled “Returns”Query_by_continuation_does_not_return_another_tenants_run()
Section titled “ Query_by_continuation_does_not_return_another_tenants_run()”The forward walk does not cross a tenant boundary.
[Fact]public Task Query_by_continuation_does_not_return_another_tenants_run()Returns
Section titled “Returns”Query_filters_by_a_label_key_and_value_together()
Section titled “ Query_filters_by_a_label_key_and_value_together()”[Fact]public Task Query_filters_by_a_label_key_and_value_together()Returns
Section titled “Returns”Query_filters_by_agent_name()
Section titled “ Query_filters_by_agent_name()”[Fact]public Task Query_filters_by_agent_name()Returns
Section titled “Returns”Query_filters_by_error_type()
Section titled “ Query_filters_by_error_type()”[Fact]public Task Query_filters_by_error_type()Returns
Section titled “Returns”Query_filters_by_start_time()
Section titled “ Query_filters_by_start_time()”[Fact]public Task Query_filters_by_start_time()Returns
Section titled “Returns”Query_filters_by_status()
Section titled “ Query_filters_by_status()”[Fact]public Task Query_filters_by_status()Returns
Section titled “Returns”Query_filters_by_the_run_a_continuation_continues()
Section titled “ Query_filters_by_the_run_a_continuation_continues()”A chain is walked forward by asking for the runs that continue a given run.
[Fact]public Task Query_filters_by_the_run_a_continuation_continues()Returns
Section titled “Returns”Query_filters_by_user()
Section titled “ Query_filters_by_user()”[Fact]public Task Query_filters_by_user()Returns
Section titled “Returns”Query_session_filter_with_includeChildren_also_returns_child_runs()
Section titled “ Query_session_filter_with_includeChildren_also_returns_child_runs()”[Fact]public Task Query_session_filter_with_includeChildren_also_returns_child_runs()Returns
Section titled “Returns”Query_sorts_newest_first()
Section titled “ Query_sorts_newest_first()”[Fact]public Task Query_sorts_newest_first()Returns
Section titled “Returns”RecordToolInvocationAsync_does_not_write_with_the_wrong_expected_tenant()
Section titled “ RecordToolInvocationAsync_does_not_write_with_the_wrong_expected_tenant()”[Fact]public Task RecordToolInvocationAsync_does_not_write_with_the_wrong_expected_tenant()Returns
Section titled “Returns”Reusing_a_sequence_number_is_rejected()
Section titled “ Reusing_a_sequence_number_is_rejected()”[Fact]public Task Reusing_a_sequence_number_is_rejected()Returns
Section titled “Returns”Run_record_is_stamped_with_the_current_tenant()
Section titled “ Run_record_is_stamped_with_the_current_tenant()”[Fact]public Task Run_record_is_stamped_with_the_current_tenant()Returns
Section titled “Returns”SeedAsync(string, string, CancellationToken)
Section titled “ SeedAsync(string, string, CancellationToken)”Writes a sample record for the given tenant.
protected override ValueTask<object> SeedAsync(string tenantId, string name, CancellationToken cancellationToken)Parameters
Section titled “Parameters”tenantId string
The tenant that owns the record.
name string
The name distinguishing the record. The same name may be used by two tenants.
cancellationToken CancellationToken
The token every store call inside the hook must be handed. The cancellation contract calls this hook with a token that is already cancelled, so a hook that drops the token reports a store as sound when it is not.
Returns
Section titled “Returns”The key to use for reading the record back.
Remarks
Section titled “Remarks”The tenant is not a parameter on the interface; it is read from ITenantContext. Each hook therefore sets the current tenant first.
StartRunAsync_return_value_carries_the_coalesced_attribution()
Section titled “ StartRunAsync_return_value_carries_the_coalesced_attribution()”[Fact]public Task StartRunAsync_return_value_carries_the_coalesced_attribution()Returns
Section titled “Returns”StartRunAsync_upserts_when_called_twice_with_the_same_id()
Section titled “ StartRunAsync_upserts_when_called_twice_with_the_same_id()”[Fact]public Task StartRunAsync_upserts_when_called_twice_with_the_same_id()Returns
Section titled “Returns”Statistics_break_down_by_label_and_the_rows_do_not_partition_the_runs()
Section titled “ Statistics_break_down_by_label_and_the_rows_do_not_partition_the_runs()”[Fact]public Task Statistics_break_down_by_label_and_the_rows_do_not_partition_the_runs()Returns
Section titled “Returns”Statistics_break_down_by_user()
Section titled “ Statistics_break_down_by_user()”[Fact]public Task Statistics_break_down_by_user()Returns
Section titled “Returns”Statistics_narrow_to_one_label_when_asked()
Section titled “ Statistics_narrow_to_one_label_when_asked()”[Fact]public Task Statistics_narrow_to_one_label_when_asked()Returns
Section titled “Returns”Statistics_narrow_to_one_user_when_asked()
Section titled “ Statistics_narrow_to_one_user_when_asked()”[Fact]public Task Statistics_narrow_to_one_user_when_asked()Returns
Section titled “Returns”Statistics_total_the_token_breakdown_beside_the_input_and_output_totals()
Section titled “ Statistics_total_the_token_breakdown_beside_the_input_and_output_totals()”[Fact]public Task Statistics_total_the_token_breakdown_beside_the_input_and_output_totals()Returns
Section titled “Returns”Summary_aggregates_cost_and_reports_the_undefined_count()
Section titled “ Summary_aggregates_cost_and_reports_the_undefined_count()”[Fact]public Task Summary_aggregates_cost_and_reports_the_undefined_count()Returns
Section titled “Returns”Summary_aggregates_statuses_and_tokens()
Section titled “ Summary_aggregates_statuses_and_tokens()”[Fact]public Task Summary_aggregates_statuses_and_tokens()Returns
Section titled “Returns”Summary_and_time_series_do_not_leak_across_tenants()
Section titled “ Summary_and_time_series_do_not_leak_across_tenants()”[Fact]public Task Summary_and_time_series_do_not_leak_across_tenants()Returns
Section titled “Returns”Summary_computes_breakdown_by_error_class()
Section titled “ Summary_computes_breakdown_by_error_class()”[Fact]public Task Summary_computes_breakdown_by_error_class()Returns
Section titled “Returns”Summary_computes_error_rate_only_over_completed_runs()
Section titled “ Summary_computes_error_rate_only_over_completed_runs()”[Fact]public Task Summary_computes_error_rate_only_over_completed_runs()Returns
Section titled “Returns”Summary_computes_version_breakdown()
Section titled “ Summary_computes_version_breakdown()”[Fact]public Task Summary_computes_version_breakdown()Returns
Section titled “Returns”Summary_excludes_eval_runs()
Section titled “ Summary_excludes_eval_runs()”[Fact]public Task Summary_excludes_eval_runs()Returns
Section titled “Returns”Summary_filters_by_agent_name()
Section titled “ Summary_filters_by_agent_name()”[Fact]public Task Summary_filters_by_agent_name()Returns
Section titled “Returns”Summary_filters_by_start_time()
Section titled “ Summary_filters_by_start_time()”[Fact]public Task Summary_filters_by_start_time()Returns
Section titled “Returns”Summary_limits_agent_breakdown()
Section titled “ Summary_limits_agent_breakdown()”[Fact]public Task Summary_limits_agent_breakdown()Returns
Section titled “Returns”Summary_returns_at_most_three_failure_clusters_per_class()
Section titled “ Summary_returns_at_most_three_failure_clusters_per_class()”[Fact]public Task Summary_returns_at_most_three_failure_clusters_per_class()Returns
Section titled “Returns”Summary_returns_no_error_rate_when_no_run_has_completed()
Section titled “ Summary_returns_no_error_rate_when_no_run_has_completed()”[Fact]public Task Summary_returns_no_error_rate_when_no_run_has_completed()Returns
Section titled “Returns”Summary_rows_with_no_error_class_appear_in_the_unknown_bucket()
Section titled “ Summary_rows_with_no_error_class_appear_in_the_unknown_bucket()”[Fact]public Task Summary_rows_with_no_error_class_appear_in_the_unknown_bucket()Returns
Section titled “Returns”Summary_sorts_agent_breakdown_by_run_count()
Section titled “ Summary_sorts_agent_breakdown_by_run_count()”[Fact]public Task Summary_sorts_agent_breakdown_by_run_count()Returns
Section titled “Returns”The_cache_charge_round_trips_and_counts_toward_the_total()
Section titled “ The_cache_charge_round_trips_and_counts_toward_the_total()”[Fact]public Task The_cache_charge_round_trips_and_counts_toward_the_total()Returns
Section titled “Returns”The_largest_total_a_run_writes_fits_the_snapshot_column()
Section titled “ The_largest_total_a_run_writes_fits_the_snapshot_column()”[Fact]public Task The_largest_total_a_run_writes_fits_the_snapshot_column()Returns
Section titled “Returns”The_last_event_sequence_is_readable()
Section titled “ The_last_event_sequence_is_readable()”A run that is retried keeps its identity, so the second attempt must continue the event stream instead of restarting it.
[Fact]public Task The_last_event_sequence_is_readable()Returns
Section titled “Returns”Remarks
Section titled “Remarks”Without it the writer restarted at zero on every lease takeover, hit
the unique (run_id, seq) key, disabled itself for the rest of the
run, and then skipped the completion write. The job reported Completed
while the run stayed in RunStatus.Running forever. A store
answers this question so the writer never has to guess.
The_token_breakdown_round_trips_and_stays_null_when_it_was_never_reported()
Section titled “ The_token_breakdown_round_trips_and_stays_null_when_it_was_never_reported()”[Fact]public Task The_token_breakdown_round_trips_and_stays_null_when_it_was_never_reported()Returns
Section titled “Returns”Time_series_does_not_exclude_eval_runs()
Section titled “ Time_series_does_not_exclude_eval_runs()”[Fact]public Task Time_series_does_not_exclude_eval_runs()Returns
Section titled “Returns”Time_series_fills_empty_buckets()
Section titled “ Time_series_fills_empty_buckets()”[Fact]public Task Time_series_fills_empty_buckets()Returns
Section titled “Returns”Time_series_throws_when_the_bucket_limit_is_exceeded()
Section titled “ Time_series_throws_when_the_bucket_limit_is_exceeded()”[Fact]public Task Time_series_throws_when_the_bucket_limit_is_exceeded()Returns
Section titled “Returns”Token_info_stays_null_when_absent()
Section titled “ Token_info_stays_null_when_absent()”[Fact]public Task Token_info_stays_null_when_absent()Returns
Section titled “Returns”TouchHeartbeatAsync_refreshed_row_is_not_considered_orphaned()
Section titled “ TouchHeartbeatAsync_refreshed_row_is_not_considered_orphaned()”[Fact]public Task TouchHeartbeatAsync_refreshed_row_is_not_considered_orphaned()Returns
Section titled “Returns”TouchHeartbeatAsync_silently_skips_a_nonexistent_or_non_Running_id()
Section titled “ TouchHeartbeatAsync_silently_skips_a_nonexistent_or_non_Running_id()”[Fact]public Task TouchHeartbeatAsync_silently_skips_a_nonexistent_or_non_Running_id()Returns
Section titled “Returns”Tree_cost_adds_the_cache_charge_of_every_run_in_the_tree()
Section titled “ Tree_cost_adds_the_cache_charge_of_every_run_in_the_tree()”[Fact]public Task Tree_cost_adds_the_cache_charge_of_every_run_in_the_tree()Returns
Section titled “Returns”Tree_cost_is_not_summed_with_its_own_cost_separate_fields()
Section titled “ Tree_cost_is_not_summed_with_its_own_cost_separate_fields()”[Fact]public Task Tree_cost_is_not_summed_with_its_own_cost_separate_fields()Returns
Section titled “Returns”Tree_fields_round_trip()
Section titled “ Tree_fields_round_trip()”[Fact]public Task Tree_fields_round_trip()Returns
Section titled “Returns”Tree_non_token_cost_adds_every_run_in_the_tree_once()
Section titled “ Tree_non_token_cost_adds_every_run_in_the_tree_once()”[Fact]public Task Tree_non_token_cost_adds_every_run_in_the_tree_once()Returns
Section titled “Returns”Tree_query_returns_the_root_and_all_its_descendants()
Section titled “ Tree_query_returns_the_root_and_all_its_descendants()”[Fact]public Task Tree_query_returns_the_root_and_all_its_descendants()Returns
Section titled “Returns”Tree_total_combines_tokens_of_root_and_descendants()
Section titled “ Tree_total_combines_tokens_of_root_and_descendants()”[Fact]public Task Tree_total_combines_tokens_of_root_and_descendants()Returns
Section titled “Returns”Tree_total_stays_null_when_no_tokens_are_reported()
Section titled “ Tree_total_stays_null_when_no_tokens_are_reported()”[Fact]public Task Tree_total_stays_null_when_no_tokens_are_reported()Returns
Section titled “Returns”Tree_usage_sums_the_breakdown_across_child_runs()
Section titled “ Tree_usage_sums_the_breakdown_across_child_runs()”[Fact]public Task Tree_usage_sums_the_breakdown_across_child_runs()Returns
Section titled “Returns”Unit_prices_stay_null_when_the_model_price_is_unknown()
Section titled “ Unit_prices_stay_null_when_the_model_price_is_unknown()”[Fact]public Task Unit_prices_stay_null_when_the_model_price_is_unknown()Returns
Section titled “Returns”UpdateRunCostAsync_does_not_update_with_the_wrong_expected_tenant()
Section titled “ UpdateRunCostAsync_does_not_update_with_the_wrong_expected_tenant()”[Fact]public Task UpdateRunCostAsync_does_not_update_with_the_wrong_expected_tenant()Returns
Section titled “Returns”Workflow_run_lives_in_the_same_table()
Section titled “ Workflow_run_lives_in_the_same_table()”[Fact]public Task Workflow_run_lives_in_the_same_table()