Запрос
текст
В репозитории /home/deploy/apps/imperiaos на экране packages/app/views/platform/TokenVaultView.tsx после правки «приоритетный аккаунт» (коммиты 6b9942dcb, 2238c8ba1, e54779ca9, cec8230e7 — все сделаны ядром) нажатие по карточке аккаунта стало перекрывать тултипы при наведении (слово владельца 2026-09-27 ~12:1xZ: «нажатие стало перекрывать тултипы при наведении — бага на уровне архитектуры, которую нельзя пропускать»). Требуется: (1) найти в коде экрана, как именно клик перекрыл наведение (обёртка карточки в кликабельный слой, stopPropagation, слой подсветки поверх триггера тултипа, замена элемента) — назвать строки; (2) починить так, чтобы у карточки жили ОБА взаимодействия: наведение показывает тултип как до правки, клик ставит/снимает приоритет; никакого второго слоя над карточкой — расширить существующий элемент карточки, не накрывать его; (3) закрепить оба взаимодействия проверками экрана (тест взаимодействия: наведение → тултип виден; клик → PATCH priority; наведение после клика → тултип виден) в существующей сюите экрана packages/app; (4) назвать, почему это не поймал оракул прошлой правки — какого вида проверки не было у экрана. Оракул: pnpm --filter @imperiaos/app test:unit:run. Наблюдаемый интерфейс — экран dev.imperiaos.com/platform/admin/token-vault.
Классификация
вердикт
artifact:code
причина
new: no candidate
известных записей
218
Понятие c0
признаки
—
записи
jobs:letter:ats-form, jobs:letter:cold-founder, jobs:letter:money-system, jobs:letter:agent-tooling, jobs:letter:follow-up, jobs:letter:third-touch, compute_arithmetic, find_investor_fund_match, fix_code_defect_until_oracle_passes, build_goal_achievement_plan, find_goal_first_step, build_goal_milestones, build_goal_monitoring, find_goal_obstacle_plans, produce_code_patch, build_meeting_call_brief, find_meeting_local_time, find_role_requirements, find_meeting_likely_questions, find_org_profile, find_org_recent_news, find_owner_timezone, find_meeting_questions_to_ask, find_investor_decision_partner_name, find_investor_contact_channel, find_investor_opener, find_investor_thesis_fit, find_investor_signal_url, find_investor_signal, find_investor_thesis_source_url, find_company_oneliner_en, find_investor_thesis_quote, find_investor_thesis_bridge, find_counterparty_profile, build_investor_outreach_pack_for_named_fund, find_product_fit_usecase_goals, find_research_date, find_research_limits, find_excluded_usecases_by_hard_criteria, find_excluded_usecases, find_analog_usecase_catalog, build_inbox_digest_with_reply_drafts, find_customer_prospects_with_contacts, find_prospect_selection_criteria, find_prospect_gaps_and_assumptions, write_cold_email_with_org_news_hook, find_email_subject_from_org_news, find_org_news_bridge_en, find_org_news_decision_maker_name, find_org_recent_news_source_url, compare_vendors_and_recommend_one, find_research_unverified_gaps, find_recommendation_rationale, find_unverified_gaps_and_assumptions, find_options_reviews_summary, build_weighted_decision_matrix, build_weighted_decision_matrix_with_sensitivity, build_weighted_decision_matrix_with_robustness, find_options_tco_table, find_recommended_option, find_reproducer_test, find_investor_criteria, find_investor_shortlist, write_investor_first_emails_by_thesis, find_investors_and_draft_first_emails, run_oracle_before_fix_and_save_red_output, find_defect_root_cause_by_pass_fail_diff, rerun_oracle_after_patch_compare_to_baseline, find_investor_email_addressee_partner_name, find_investors_then_write_first_emails_per_partner, find_competitor_feature_catalog, find_analysis_date_cutoff, build_feature_fit_gap_table, find_rejected_features_with_reasons, select_features_by_kano_confidence_effort_as_goals, analyze_competitor_features_fit_gap_select_goals, select_features_by_declared_formula_as_goals_with_acceptance, select_fit_gap_features_by_rice_pert_as_goals_with_acceptance, select_features_by_rice_pert_as_goals_with_acceptance, select_fit_gap_features_by_value_confidence_pert_as_goals, select_features_by_rice_pert_formula_as_goals, select_fit_gap_features_by_rice_as_goals_with_acceptance, select_features_by_rice_as_goals_with_acceptance, select_features_by_value_confidence_effort_as_goals, select_features_by_formula_as_goals_with_acceptance, select_features_by_rice_capacity_as_goals_with_acceptance, select_fit_gap_features_by_rice_records_as_goals, fix_kernel_door_defect_until_oracle_green, rerun_oracle_after_patch_and_diff_per_case, write_minimal_kernel_patch_from_statements_until_oracle_green, extract_gap_core_from_review_item, write_measurable_acceptance_criterion_from_gap_core, design_missing_record_interfaces_from_gap_and_criterion, derive_executable_module_assertions_from_interfaces_and_acceptance, derive_red_green_readiness_scenario_from_done_criterion, implement_review_feature_as_records_with_readiness_test, write_gwt_acceptance_criteria_list_from_gap_core, design_prov_provenance_schema_and_migrate_text_records, find_competitor_feature_user_facing_reference, rewrite_done_criterion_into_red_given_when_then_scenarios, find_kernel_exit_points_sink_inventory, find_mail_inbound_producer_status_in_registry, write_secret_never_in_model_invariant_from_gap, find_webhook_door_contract, write_minimal_kernel_patch_from_interfaces_and_scenarios_until_green, write_gwt_acceptance_criteria_for_inbound_channel_with_abuse_cases, write_red_canary_sink_acceptance_test_before_patch, run_readiness_scenarios_and_cite_journal_seq_with_unverified, find_secret_typed_fact_keys_from_type_registry, write_gwt_acceptance_criteria_for_review_feature_with_e2e_done, write_gwt_acceptance_criteria_for_owner_fact_memory_view_find_forget, write_gwt_acceptance_criteria_for_review_feature_with_done_as_e2e, design_record_ops_list_inspect_forget_put_with_tombstone_journal, write_e2e_gwt_acceptance_criteria_for_review_feature_from_gap_core, write_3_5_gwt_acceptance_criteria_with_end_to_end_done_from_feature_task, design_record_store_interfaces_with_tombstone_and_journal, derive_record_store_interfaces_with_tombstone_and_journal, find_steps_that_must_run_without_model_call, design_list_inspect_forget_put_with_tombstone_and_journal, rewrite_gap_core_and_done_criterion_into_given_when_then_readiness_scenarios, write_gwt_acceptance_criteria_for_review_feature_with_done_e2e, design_mail_forward_to_task_records_with_readiness_test, write_minimal_kernel_patch_records_from_gap_core_and_gwt_scenarios, draft_minimal_feature_records_patch_from_gap_core_and_scenarios, draft_minimal_kernel_records_patch_from_gap_core_and_readiness_scenarios, write_minimal_schedule_tick_records_patch_from_gap_and_scenarios, write_recurring_goal_and_schedule_list_records_patch_in_kernel_repo, write_recurring_goal_schedule_tick_kernel_patch_as_records, write_schedule_tick_recurring_goal_records_patch_with_occurrence_id, write_recurring_goal_schedule_records_patch_with_misfire_policy, write_feature_records_kernel_patch_from_gap_and_scenarios, propose_kernel_patch_records_from_gap_core_and_readiness_scenarios, write_feature_records_patch_from_gap_and_scenarios_with_idempotent_tick, implement_recurring_schedule_goal_records_with_replay_acceptance, write_secret_handle_redaction_and_gate_substitution_kernel_patch_with_canary_test, report_test_and_regression_rerun_verified_vs_unverified, formulate_scoped_never_invariant_from_gap_with_refutation, identify_executed_kernel_patch_by_commit_patch_id_and_dirty_flag, implement_trigger_feature_from_review_item_as_records_with_replay_journal_acceptance, run_oracle_on_full_bench_before_patch_and_verify_target_red_reason, find_unreconciled_composition_acceptance_point_in_allowed_files, write_substitution_composition_patch_with_grounding_gate_naming_law, rerun_full_bench_oracle_after_patch_diff_per_check_vs_baseline_with_flaky_and_input_variants, identify_applied_kernel_patch_by_sha_patch_id_dirty_and_confirm_build_exit_code, patch_kernel_composition_to_assemble_only_from_part_values_until_oracle_green, write_closed_selection_policy_laws_and_decision_table_from_intent_and_incidents, find_counterparty_product_quote_and_bridge_to_demo_thesis, compose_c4_context_container_and_2_4_adr_decisions_with_honest_status, build_meeting_frame_utc_local_smart, inventory_live_decision_points_by_code_config_and_ledger_crosscheck, write_one_executable_pass_fail_unknown_check_per_law_over_source_facts, map_each_law_to_single_pap_pdp_and_role_tagged_enforcement_points, derive_timeboxed_demo_timeline_from_meeting_frame_with_live_share_and_reserve_flags, build_reverse_dated_prep_checklist_from_meeting_anchor_with_freeze_backup_and_rehearsal, find_verbatim_counterparty_product_quote_matching_demo_thesis_with_url, build_demo_qa_bank_bluf_from_owner_proofs_with_counterparty_bridge_and_honest_gaps, compose_interview_demo_plan_from_frame_bridge_timeline_architecture_qa_prep_and_fallback, decompose_numbered_feature_statements_into_traced_gwt_scenarios_with_boundary_forbidden_and_open_questions, write_bottom_up_feature_patch_storage_logic_api_ui_by_neighbor_analog_with_red_first_tests, trace_scenarios_to_tests_run_full_gates_fail_to_pass_land_and_list_unverified, retrieve_verbatim_prior_step_patch_with_full_base_sha_and_apply_check, derive_fail_to_pass_scenarios_from_patch_requirement_plus_pass_to_pass_regression_from_owner_proofs, implement_repo_feature_from_numbered_statements_via_edit_door_and_change_flow, derive_traced_gwt_scenarios_from_parent_task_numbered_statements_with_open_decisions, draft_bottom_up_storage_logic_api_ui_patch_with_red_first_tests_traced_to_owner_statements, draft_bottom_up_storage_logic_api_ui_patch_with_red_first_tests_per_layer_and_open_owner_decisions, decompose_owner_numbered_feature_statements_into_traced_gwt_set_unset_switch_rollback_invalid_characterization_with_open_questions, derive_traced_gwt_scenarios_set_unset_switch_rollback_invalid_from_owner_numbered_statements_with_assumptions_and_open_questions, decompose_owner_toggle_setting_statements_into_traced_gwt_set_unset_switch_invalid_rollback_characterization_ui_sequence_with_questions, write_bottom_up_storage_domain_api_toggle_ui_patch_with_red_first_tests_traced_to_scenarios_by_neighbor_setting, draft_bottom_up_single_choice_toggle_setting_patch_storage_rank_api_ui_with_stub_first_red_tests_and_owner_questions, draft_bottom_up_single_choice_setting_patch_storage_logic_api_ui_with_red_first_tests_and_owner_decisions, draft_bottom_up_single_choice_setting_patch_storage_rank_api_toggle_ui_red_first_with_open_decisions, draft_bottom_up_nullable_single_pick_setting_patch_storage_rank_api_toggle_ui_with_red_first_tests, draft_bottom_up_single_choice_setting_patch_storage_rank_api_ui_with_stub_first_red_tests_and_characterization_guard, draft_layered_storage_logic_api_ui_patch_with_assert_red_first_tests_per_statement_and_flagged_assumptions, draft_bottom_up_single_select_priority_patch_storage_rank_api_toggle_card_ui_with_red_first_tests_and_outline_clicks, draft_bottom_up_single_select_priority_toggle_patch_storage_rank_api_aria_pressed_ui_with_red_first_tests_by_neighbor, draft_bottom_up_single_choice_toggle_patch_storage_rank_api_ui_with_red_first_tests_by_neighbor_setting, draft_layered_storage_logic_api_ui_patch_with_red_first_tests_traced_to_statements_and_open_owner_decisions, draft_bottom_up_storage_logic_api_ui_patch_with_stub_then_red_assert_tests_traced_to_statements_and_scenarios, draft_bottom_up_storage_logic_api_ui_patch_with_red_first_tests_per_statement_and_open_decisions, draft_bottom_up_storage_rank_api_ui_priority_toggle_patch_with_stub_first_red_tests_and_open_owner_decisions, draft_bottom_up_setting_storage_rank_api_toggle_ui_patch_with_assertion_red_stubs_traced_to_statements_and_open_decisions, write_bottom_up_storage_logic_api_ui_patch_with_red_first_tests_traced_to_statements_and_scenarios, draft_bottom_up_storage_logic_api_ui_patch_red_first_traced_to_parent_statements_with_open_decisions, read_neighbor_setting_storage_route_test_via_code_door_with_path_line_quotes, measure_kernel_baseline_head_sha_file_digests_dirty_utc_and_preregistered_run_selection, audit_every_outbound_channel_log_over_run_window_with_coverage_positive_control_and_weakest_link_verdict, derive_utc_run_window_from_observed_start_end_receipts_with_bounded_clock_skew_margin, map_each_kernel_exit_point_to_witness_log_by_code_and_real_record_with_no_witness_flag, derive_traced_gwt_scenarios_for_nullable_single_select_setting_storage_rank_api_ui_with_characterization_baseline_and_open_questions, decompose_owner_numbered_criteria_into_atoms_read_run_door_registry_code_evidence_and_verdict_pass_fail_nei_with_address, verify_kernel_against_numbered_criteria_with_three_valued_verdicts_and_evidence_locators_read_only, draft_bottom_up_single_select_priority_toggle_patch_storage_rank_api_aria_pressed_ui_with_stub_first_red_tests_and_owner_decisions, check_every_outbound_channel_log_over_utc_run_window_with_liveness_positive_control_and_three_valued_verdict, draft_bottom_up_single_choice_setting_patch_storage_rank_api_aria_pressed_ui_red_first_with_characterization_guard_and_owner_decisions, draft_bottom_up_single_choice_setting_patch_storage_rank_api_toggle_ui_red_first_resolved_from_statements, draft_bottom_up_baseline_storage_logic_api_ui_patch_with_assertion_red_first_tests_per_statement_and_owner_open_decisions, draft_bottom_up_storage_rank_api_ui_priority_toggle_patch_with_stub_first_red_tests_and_stated_defaults, draft_bottom_up_storage_logic_api_ui_patch_with_stub_then_red_assert_tests_traced_to_statements_and_open_decisions, draft_bottom_up_storage_rank_api_toggle_ui_patch_red_first_by_neighbor_setting_with_open_decisions_and_unverified_gaps, draft_bottom_up_setting_storage_rank_api_aria_pressed_toggle_ui_patch_with_assertion_red_first_tests_by_neighbor_and_owner_decisions, draft_bottom_up_storage_rank_api_aria_pressed_ui_patch_with_assert_red_tests_per_statement_characterization_guard_and_owner_defaults, draft_bottom_up_storage_logic_api_ui_patch_with_assert_red_tests_characterization_guards_and_server_confirmed_toggle_ui, read_neighbor_setting_all_layers_with_path_line_quotes_wiring_rank_callsites_tests_absent_and_revision, derive_traced_f2p_gwt_scenarios_with_p2p_repo_regression_baseline_and_open_questions, read_neighbor_setting_port_store_overlay_usecase_wiring_routes_health_rank_callsites_tests_proxy_ui_with_path_line_quotes_gaps_and_revision, derive_traced_gwt_scenarios_per_parent_statement_with_set_unset_switch_unavailable_neighbor_grounded_and_open_questions, read_door_receipts_main_ref_and_repo_tree_to_attest_red_green_full_suite_land_or_mark_not_obtained, derive_utc_run_window_from_run_at_reflog_oracle_journal_with_anchor_owner_zone_skew_margin_and_boundary_events, compose_kernel_self_check_report_from_baseline_run_window_criterion_verdicts_and_outbound_audit, draft_bottom_up_setting_patch_by_neighbor_storage_rank_api_server_confirmed_toggle_ui_with_assert_red_tests_traced_to_scenarios, derive_utc_run_window_min_run_at_max_receipt_at_over_selected_run_ids_with_line_evidence_and_open_end_flag, derive_tight_utc_run_window_from_run_at_reflog_door_journal_excluding_own_attempts_with_open_edge_and_margin_variant, derive_utc_run_window_from_earliest_anchor_run_at_reflog_oracle_journal_with_owner_zone_night_frame_and_open_right_edge, derive_utc_run_window_from_run_at_reflog_door_verdicts_anchored_on_parent_task_night_in_owner_zone_with_skew_margin_self_runs_flagged, derive_tight_utc_run_window_from_run_at_reflog_oracle_journal_by_owner_local_night_anchor_with_open_edge_flag, retrieve_latest_prior_code_patch_draft_from_run_reports_with_full_base_sha_anchor_check_and_appliability_verdict, derive_utc_run_window_from_run_at_session_gap_anchored_on_named_runs_with_open_right_bound, draft_file_grounded_bottom_up_patch_by_neighbor_setting_with_scenario_tagged_tests_commit_order_and_unapplied_status, draft_bottom_up_storage_rule_api_ui_patch_by_neighbor_setting_with_scenario_traced_tests_and_honest_unapplied_status, reverify_neighbor_setting_layer_map_at_current_ref_with_corrections_all_rank_helper_callers_and_absence_greps, draft_rebased_neighbor_grounded_bottom_up_setting_domain_storage_usecase_api_toggle_ui_patch_with_scenario_tagged_assert_red_stubs_bisectable_commit_series_and_unapplied_status, read_code_door_run_receipts_and_main_reflog_to_attest_red_green_full_suite_land_per_claim_or_mark_not_obtained, draft_neighbor_grounded_bottom_up_storage_rule_api_ui_patch_with_scenario_tagged_tests_stub_red_reasons_commit_series_and_unapplied_status, draft_neighbor_grounded_bottom_up_setting_storage_rule_usecase_api_proxy_ui_patch_with_scenario_tagged_red_first_tests_commit_order_open_decisions_and_unapplied_status, draft_neighbor_grounded_bottom_up_setting_patch_with_scenario_tagged_red_first_tests_and_unapplied_status, draft_neighbor_grounded_bottom_up_setting_patch_anchor_edits_single_rank_seam_scenario_tagged_assert_red_tests_and_unapplied_status, draft_neighbor_grounded_bottom_up_setting_storage_rule_api_proxy_ui_patch_with_scenario_tagged_tests_commit_series_red_expectations_defaults_and_unapplied_status, draft_neighbor_grounded_bottom_up_storage_rule_api_ui_patch_with_scenario_tagged_red_first_tests_derived_decisions_and_unapplied_status, draft_bottom_up_storage_rule_api_ui_patch_stub_red_green_per_scenario_with_characterization_guards_open_decisions_and_unapplied_status, draft_neighbor_grounded_bottom_up_storage_rule_api_ui_patch_with_scenario_tagged_assertion_red_tests_and_unapplied_status, draft_neighbor_grounded_bottom_up_storage_usecase_rank_api_ui_patch_with_scenario_tagged_red_first_tests_guard_split_and_unapplied_status, draft_neighbor_grounded_bottom_up_storage_rule_usecase_rank_seam_api_proxy_ui_patch_with_scenario_tagged_red_first_tests_and_unapplied_status, draft_neighbor_grounded_bottom_up_setting_patch_single_dispatch_rank_seam_scenario_traced_assert_red_tests_and_unapplied_status, draft_rebased_neighbor_grounded_bottom_up_store_rank_api_toggle_ui_patch_with_scenario_tagged_assert_red_tests_traceability_and_unapplied_status, draft_rebased_neighbor_grounded_bottom_up_storage_domain_rank_api_proxy_ui_patch_with_scenario_tagged_assert_red_tests_stub_red_step_guards_mutant_checks_and_unapplied_status, draft_reverified_neighbor_grounded_bottom_up_setting_patch_store_usecase_single_rank_seam_api_confirmed_toggle_ui_with_scenario_tagged_assert_red_tests_mutation_check_and_unapplied_status, draft_rebased_bottom_up_setting_patch_overlay_carry_single_rank_seam_api_server_confirmed_toggle_ui_with_scenario_tagged_assert_red_tests_and_unapplied_status, draft_rebased_neighbor_grounded_bottom_up_setting_storage_rule_usecase_api_proxy_toggle_ui_patch_with_scenario_tagged_assert_red_tests_and_unapplied_status, draft_neighbor_grounded_bottom_up_setting_patch_storage_rank_api_toggle_ui_with_scenario_tagged_tests_red_stub_table_and_unapplied_status, draft_rebased_neighbor_grounded_bottom_up_setting_patch_single_rank_seam_scenario_tagged_red_first_tests_mutant_guards_and_unapplied_status, draft_reverified_bottom_up_storage_rule_api_ui_patch_with_stub_red_tests_per_scenario_tag_server_confirmed_toggle_mutants_and_unapplied_status, read_neighbor_setting_all_layers_at_current_main_head_with_drift_note_all_rank_helper_callers_and_absence_grep, derive_tagged_traced_gwt_scenarios_per_parent_statement_with_state_transitions_all_rank_tiers_unavailable_characterization_click_sequence_and_open_questions, read_main_ref_and_reflog_tail_count_goal_statement_arrays_pick_latest_t_run_with_result_verdict_and_times_read_only, draft_reverified_bottom_up_commit_series_by_neighbor_map_with_scenario_tagged_tests_it_fails_stubs_manual_diff_mutants_and_unapplied_status, inventory_kernel_exit_points_from_code_then_query_run_files_and_git_reflogs_over_run_window_with_three_valued_verdict_and_named_uncovered_channels, read_door_state_run_effect_applied_changeflow_and_main_ref_to_grade_each_statement_red_green_suite_land_or_not_obtained, compose_neighbor_map_tagged_scenarios_bottom_up_patch_red_first_and_door_receipts_status_per_statement, reverify_prior_neighbor_setting_anchor_map_at_current_main_ref_with_reflog_drift_all_shared_helper_callers_and_absence_greps, draft_head_reverified_bottom_up_commit_series_by_neighbor_map_with_scenario_tagged_stub_red_tests_manual_mutant_journal_and_unapplied_status, grade_each_goal_statement_from_door_effect_check_patch_after_changeflow_author_check_land_and_main_ref_or_not_obtained, compose_head_reverified_neighbor_map_tagged_scenarios_bottom_up_red_first_patch_and_door_receipt_status_per_statement, reread_main_ref_and_reflog_tail_count_drift_from_prior_map_sha_reverify_every_layer_anchor_all_shared_helper_callers_and_absence_greps_read_only, take_given_scenarios_verbatim_or_derive_tagged_gwt_per_statement_by_neighbor_map_then_trace_matrix_na_reasons_form_deviations_and_open_questions, draft_head_reverified_single_seam_bottom_up_commit_series_with_refactor_split_title_tagged_red_first_tests_manual_mutant_journal_equivalence_notes_and_unapplied_status, read_door_effect_changeflow_author_check_land_and_main_ref_reflog_then_grade_each_statement_monotonic_patch_f2p_applied_landed_or_not_obtained_with_code_gap_flags, compose_head_reverified_neighbor_map_scenarios_bottom_up_patch_and_per_statement_door_receipt_status, read_main_ref_reflog_tail_and_door_land_receipts_then_reresolve_every_layer_anchor_by_symbol_flip_absence_greps_to_present_per_layer_and_flag_live_tree_edits_read_only, grep_feature_vocabulary_all_cases_then_layer_hits_by_neighbor_chain_trace_callers_and_name_unreached_server_non_durable_untested_defects_with_path_line_and_empty_query_evidence_read_only, take_input_gwt_scenarios_verbatim_else_derive_stmt_tagged_gwt_from_parent_statements_by_neighbor_map_with_bidirectional_trace_and_open_questions, reverify_head_then_split_inventory_into_present_gap_defect_rows_and_draft_bottom_up_atomic_commits_with_scenario_tagged_f2p_red_on_base_p2p_guards_mutants_rollback_and_unapplied_status, reread_main_ref_and_reflog_tail_then_grep_feature_vocabulary_per_layer_classify_present_unwired_absent_broken_unknown_by_callers_and_data_path_map_rows_to_scenario_tags_with_orphans_and_counts_read_only, match_door_run_by_patch_version_then_ladder_green_author_check_land_mergedsha_eq_main_ref_and_reflog_line_then_grep_tree_per_statement_with_not_obtained_subitems, reverify_head_inventory_in_tree_partial_feature_find_defects_then_gap_only_bottom_up_patch_with_scenario_tests_and_per_statement_door_status
Понятие c8
признаки
artifact:code
записи
fix_code_defect_until_oracle_passes, fix_kernel_door_defect_until_oracle_green, implement_review_feature_as_records_with_readiness_test, design_mail_forward_to_task_records_with_readiness_test, implement_recurring_schedule_goal_records_with_replay_acceptance, implement_trigger_feature_from_review_item_as_records_with_replay_journal_acceptance, patch_kernel_composition_to_assemble_only_from_part_values_until_oracle_green, retrieve_verbatim_prior_step_patch_with_full_base_sha_and_apply_check, derive_fail_to_pass_scenarios_from_patch_requirement_plus_pass_to_pass_regression_from_owner_proofs, implement_repo_feature_from_numbered_statements_via_edit_door_and_change_flow, draft_bottom_up_storage_logic_api_ui_patch_with_red_first_tests_traced_to_owner_statements, draft_bottom_up_storage_logic_api_ui_patch_with_red_first_tests_per_layer_and_open_owner_decisions, write_bottom_up_storage_domain_api_toggle_ui_patch_with_red_first_tests_traced_to_scenarios_by_neighbor_setting, draft_bottom_up_single_choice_toggle_setting_patch_storage_rank_api_ui_with_stub_first_red_tests_and_owner_questions, draft_bottom_up_single_choice_setting_patch_storage_logic_api_ui_with_red_first_tests_and_owner_decisions, draft_bottom_up_single_choice_setting_patch_storage_rank_api_toggle_ui_red_first_with_open_decisions, draft_bottom_up_nullable_single_pick_setting_patch_storage_rank_api_toggle_ui_with_red_first_tests, draft_bottom_up_single_choice_setting_patch_storage_rank_api_ui_with_stub_first_red_tests_and_characterization_guard, draft_layered_storage_logic_api_ui_patch_with_assert_red_first_tests_per_statement_and_flagged_assumptions, draft_bottom_up_single_select_priority_patch_storage_rank_api_toggle_card_ui_with_red_first_tests_and_outline_clicks, draft_bottom_up_single_select_priority_toggle_patch_storage_rank_api_aria_pressed_ui_with_red_first_tests_by_neighbor, draft_bottom_up_single_choice_toggle_patch_storage_rank_api_ui_with_red_first_tests_by_neighbor_setting, draft_layered_storage_logic_api_ui_patch_with_red_first_tests_traced_to_statements_and_open_owner_decisions, draft_bottom_up_storage_logic_api_ui_patch_with_stub_then_red_assert_tests_traced_to_statements_and_scenarios, draft_bottom_up_storage_logic_api_ui_patch_with_red_first_tests_per_statement_and_open_decisions, draft_bottom_up_storage_rank_api_ui_priority_toggle_patch_with_stub_first_red_tests_and_open_owner_decisions, draft_bottom_up_setting_storage_rank_api_toggle_ui_patch_with_assertion_red_stubs_traced_to_statements_and_open_decisions, write_bottom_up_storage_logic_api_ui_patch_with_red_first_tests_traced_to_statements_and_scenarios, draft_bottom_up_storage_logic_api_ui_patch_red_first_traced_to_parent_statements_with_open_decisions, draft_bottom_up_single_select_priority_toggle_patch_storage_rank_api_aria_pressed_ui_with_stub_first_red_tests_and_owner_decisions, draft_bottom_up_single_choice_setting_patch_storage_rank_api_aria_pressed_ui_red_first_with_characterization_guard_and_owner_decisions, draft_bottom_up_single_choice_setting_patch_storage_rank_api_toggle_ui_red_first_resolved_from_statements, draft_bottom_up_baseline_storage_logic_api_ui_patch_with_assertion_red_first_tests_per_statement_and_owner_open_decisions, draft_bottom_up_storage_rank_api_ui_priority_toggle_patch_with_stub_first_red_tests_and_stated_defaults, draft_bottom_up_storage_logic_api_ui_patch_with_stub_then_red_assert_tests_traced_to_statements_and_open_decisions, draft_bottom_up_storage_rank_api_toggle_ui_patch_red_first_by_neighbor_setting_with_open_decisions_and_unverified_gaps, draft_bottom_up_setting_storage_rank_api_aria_pressed_toggle_ui_patch_with_assertion_red_first_tests_by_neighbor_and_owner_decisions, draft_bottom_up_storage_rank_api_aria_pressed_ui_patch_with_assert_red_tests_per_statement_characterization_guard_and_owner_defaults, draft_bottom_up_storage_logic_api_ui_patch_with_assert_red_tests_characterization_guards_and_server_confirmed_toggle_ui, draft_bottom_up_setting_patch_by_neighbor_storage_rank_api_server_confirmed_toggle_ui_with_assert_red_tests_traced_to_scenarios, retrieve_latest_prior_code_patch_draft_from_run_reports_with_full_base_sha_anchor_check_and_appliability_verdict, draft_file_grounded_bottom_up_patch_by_neighbor_setting_with_scenario_tagged_tests_commit_order_and_unapplied_status, draft_bottom_up_storage_rule_api_ui_patch_by_neighbor_setting_with_scenario_traced_tests_and_honest_unapplied_status, draft_rebased_neighbor_grounded_bottom_up_setting_domain_storage_usecase_api_toggle_ui_patch_with_scenario_tagged_assert_red_stubs_bisectable_commit_series_and_unapplied_status, draft_neighbor_grounded_bottom_up_storage_rule_api_ui_patch_with_scenario_tagged_tests_stub_red_reasons_commit_series_and_unapplied_status, draft_neighbor_grounded_bottom_up_setting_storage_rule_usecase_api_proxy_ui_patch_with_scenario_tagged_red_first_tests_commit_order_open_decisions_and_unapplied_status, draft_neighbor_grounded_bottom_up_setting_patch_with_scenario_tagged_red_first_tests_and_unapplied_status, draft_neighbor_grounded_bottom_up_setting_patch_anchor_edits_single_rank_seam_scenario_tagged_assert_red_tests_and_unapplied_status, draft_neighbor_grounded_bottom_up_setting_storage_rule_api_proxy_ui_patch_with_scenario_tagged_tests_commit_series_red_expectations_defaults_and_unapplied_status, draft_neighbor_grounded_bottom_up_storage_rule_api_ui_patch_with_scenario_tagged_red_first_tests_derived_decisions_and_unapplied_status, draft_bottom_up_storage_rule_api_ui_patch_stub_red_green_per_scenario_with_characterization_guards_open_decisions_and_unapplied_status, draft_neighbor_grounded_bottom_up_storage_rule_api_ui_patch_with_scenario_tagged_assertion_red_tests_and_unapplied_status, draft_neighbor_grounded_bottom_up_storage_usecase_rank_api_ui_patch_with_scenario_tagged_red_first_tests_guard_split_and_unapplied_status, draft_neighbor_grounded_bottom_up_storage_rule_usecase_rank_seam_api_proxy_ui_patch_with_scenario_tagged_red_first_tests_and_unapplied_status, draft_neighbor_grounded_bottom_up_setting_patch_single_dispatch_rank_seam_scenario_traced_assert_red_tests_and_unapplied_status, draft_rebased_neighbor_grounded_bottom_up_storage_domain_rank_api_proxy_ui_patch_with_scenario_tagged_assert_red_tests_stub_red_step_guards_mutant_checks_and_unapplied_status, draft_reverified_neighbor_grounded_bottom_up_setting_patch_store_usecase_single_rank_seam_api_confirmed_toggle_ui_with_scenario_tagged_assert_red_tests_mutation_check_and_unapplied_status, draft_rebased_bottom_up_setting_patch_overlay_carry_single_rank_seam_api_server_confirmed_toggle_ui_with_scenario_tagged_assert_red_tests_and_unapplied_status, draft_rebased_neighbor_grounded_bottom_up_setting_storage_rule_usecase_api_proxy_toggle_ui_patch_with_scenario_tagged_assert_red_tests_and_unapplied_status, draft_neighbor_grounded_bottom_up_setting_patch_storage_rank_api_toggle_ui_with_scenario_tagged_tests_red_stub_table_and_unapplied_status, draft_rebased_neighbor_grounded_bottom_up_setting_patch_single_rank_seam_scenario_tagged_red_first_tests_mutant_guards_and_unapplied_status, draft_reverified_bottom_up_storage_rule_api_ui_patch_with_stub_red_tests_per_scenario_tag_server_confirmed_toggle_mutants_and_unapplied_status, draft_reverified_bottom_up_commit_series_by_neighbor_map_with_scenario_tagged_tests_it_fails_stubs_manual_diff_mutants_and_unapplied_status, compose_neighbor_map_tagged_scenarios_bottom_up_patch_red_first_and_door_receipts_status_per_statement, draft_head_reverified_bottom_up_commit_series_by_neighbor_map_with_scenario_tagged_stub_red_tests_manual_mutant_journal_and_unapplied_status, compose_head_reverified_neighbor_map_tagged_scenarios_bottom_up_red_first_patch_and_door_receipt_status_per_statement, draft_head_reverified_single_seam_bottom_up_commit_series_with_refactor_split_title_tagged_red_first_tests_manual_mutant_journal_equivalence_notes_and_unapplied_status, compose_head_reverified_neighbor_map_scenarios_bottom_up_patch_and_per_statement_door_receipt_status, reverify_head_then_split_inventory_into_present_gap_defect_rows_and_draft_bottom_up_atomic_commits_with_scenario_tagged_f2p_red_on_base_p2p_guards_mutants_rollback_and_unapplied_status, reverify_head_inventory_in_tree_partial_feature_find_defects_then_gap_only_bottom_up_patch_with_scenario_tests_and_per_statement_door_status
Состав
выход
—
порядок
regression_root_cause → coexistence_fix_patch → interaction_tests → oracle_gap_kind; отчёт ui_regression_fix_report собирается в порядке (1) причина, (2) патч, (3) тесты с процедурой red→green, (4) пробел оракула, плюс честный статус: что применено, что запущено, что не получено
regression_root_cause
назначение
В диффе названных коммитов найти строки, которыми новое действие заглушило прежнее, назвать механизм и опровергнуть альтернативные гипотезы
статус
отчеканил
запись
read_symptom_screen_and_commit_range_then_quote_new_lines_name_suppression_mechanism_chain_refute_alternatives_and_flag_static_or_unattributed
coexistence_fix_patch
назначение
Патч, который возвращает прежнее поведение рядом с новым на том же существующем элементе, без нового слоя, с клавиатурным паритетом
статус
отчеканил
запись
partial_revert_mechanism_lines_on_same_element_restore_old_beside_new_add_keyboard_parity_and_f2p_p2p_interaction_tests_unapplied_status
interaction_tests
назначение
Тесты взаимодействия в сюите пакета: старое → новое (побочный эффект с методом и телом) → снова старое, плюс дочерние действия не переключают новое; процедура red→green
статус
отчеканил
запись
write_package_suite_interaction_tests_old_new_old_with_effect_method_body_exact_count_child_actions_zero_effect_strict_fetch_and_unrun_red_green_mutant_procedure
oracle_gap_kind
назначение
Назвать вид проверки, которой не было у оракула правки, и почему существующие проверки прошли
статус
отчеканил
запись
inventory_screen_suite_and_change_acceptance_scenarios_classify_each_by_trigger_executed_and_violated_property_asserted_name_missing_check_kind_by_fixed_taxonomy_and_unrun_counterfactual
text
источник
input
статус
ok
regression_root_cause
источник
empty
статус
empty
Добудь факт «В диффе названных коммитов найти строки, которыми новое действие заглушило прежнее, назвать механизм и опровергнуть альтернативные гипотезы» (regression_root_cause). Выбирать, когда: Есть экран или файл, диапазон коммитов правки и симптом. Нужны: ["text"]
исход
admitted
ответ
regression_root_cause = Корень у корня карточки: packages/app/views/platform/TokenVaultView.tsx:1377-1378. Правка «приоритетный аккаунт» повесила на внешний `<div>` карточки AccountCard сразу три вещи: `role="button" aria-pressed={priority}`, `onClick={onPriority}` и `title={priority ? t.priorityOnT
coexistence_fix_patch
источник
blocked-by: regression_root_cause
статус
blocked-by: regression_root_cause
после
regression_root_cause, files, statements, oracle
interaction_tests
источник
blocked-by: regression_root_cause
статус
blocked-by: regression_root_cause
после
regression_root_cause, coexistence_fix_patch, files, statements, oracle
oracle_gap_kind
источник
blocked-by: interaction_tests
статус
blocked-by: interaction_tests
после
interaction_tests
files
источник
derived
статус
ok
statements
источник
derived
статус
ok
oracle
источник
derived
статус
ok
coexistence_fix_patch
источник
ask
статус
ask
Добудь факт «Патч, который возвращает прежнее поведение рядом с новым на том же существующем элементе, без нового слоя, с клавиатурным паритетом» (coexistence_fix_patch). Выбирать, когда: Причина локализована строками и механизмом. Нужны: ["regression_root_cause","text"]
исход
admitted
ответ
coexistence_fix_patch = Патч на тот же корневой div карточки AccountCard (TokenVaultView.tsx). С корня снимается `title` (:1378) — именно его наследовали все потомки, у которых нет своей подсказки. `onClick={onPriority}` остаётся на месте. Рядом на том же элементе добавляются `tabIndex={0}` и `onKey
interaction_tests
источник
ask
статус
ask
Добудь факт «Тесты взаимодействия в сюите пакета: старое → новое (побочный эффект с методом и телом) → снова старое, плюс дочерние действия не переключают новое; процедура red→green» (interaction_tests). Выбирать, когда: Фикс сформулирован и нужно закрепить оба поведения. Нужны: ["coexistence_fix_patch","regression_root_cause"]
исход
admitted
ответ
interaction_tests = ["[старое] наведение: ни один потомок карточки acc1 не наследует title корня карточки; кнопка ⓘ показывает свои строки (acc1@example.com); запросов PATCH 0", "[новое] клик по имени acc1 → ровно один PATCH /api/tokens?action=pool-priority с телом {\"accountName\":\"acc1\"}; aria-p
oracle_gap_kind
источник
compose
статус
ok
Добудь факт «Назвать вид проверки, которой не было у оракула правки, и почему существующие проверки прошли» (oracle_gap_kind). Выбирать, когда: Известны прежнее покрытие экрана и сценарии приёмки правки. Нужны: ["text","interaction_tests"]
исход
admitted
ответ
oracle_gap_kind = ["тест взаимодействия с отрендеренным экраном: наведение на дочерний элемент карточки → чья подсказка видна (выполняется ли title ближайшего предка)", "регрессионная проверка прежнего поведения наведения (P2P): подсказки внутри карточки после правки те же, что до неё"] Правка «при
Исход
вид
write-failed
почему
дверь записи отказала — действующая версия не менялась
вызовов модели
6
Результат
вид
ask
не хватает
regression_root_cause
вопрос
Не хватает: строки и механизм регрессии в диффе названных коммитов
Ответ
текст
Итог: причину нашёл и назвал по строкам. Починку и тест подготовил как патч, но он НЕ применён: в этой сессии у меня только чтение (Read/Grep/Glob), шелла нет. Поэтому оракул `pnpm --filter @imperiaos/app test:unit:run` не запускался, red→green не получено, живой экран dev.imperiaos.com/platform/admin/token-vault не проверялся. ## (1) Как клик перекрыл наведение **Механизм.** Клик тут ни при чём. Правка добавила нативный `title` на корень карточки, и он стал подсказкой для всей плитки. Ни оверлея, ни перемонтирования нет. - `packages/app/views/platform/TokenVaultView.tsx:1377-1378` (HEAD): `<div role="button" aria-pressed={priority} … title={priority ? t.priorityOnTip : t.priorityTip} onClick={onPriority}`. - До правки корень был голым `<div style={{ display:'flex', … borderRadius: 8 }}>`, без `title` и без `onClick`. Это видно по контексту диффа в прогоне ядра `runtime/runs/88769d47-….json:73` и по карте соседа на 4afbc7a («:1361 card root div … no onClick»). - По стандарту HTML элемент без своего `title` получает `title` ближайшего предка. Значит, подсказка клика («клик — сделать аккаунт приоритетным…») теперь появляется везде, где у узла нет своего `title`: - имя аккаунта, чип ранга, чип статуса, бейдж ★; - строка ошибки и зазоры между фактами (`:1407`, `:1413`); - кнопка «Включить» (`:1455`). Подсказка на ней ещё и неверно описывает действие: кнопка включает аккаунт, а не ставит приоритет; - открытая ⓘ. У неё `title={open ? undefined : …}` (`:903`), поэтому после клика по ⓘ она наследует подсказку карточки. - Свои `title` у фактов (`:1421`, `:1435-1444`, полоски `:642`) формально остались. Но при движении мыши по плитке подсказка клика всплывает в каждом зазоре поверх них. - `stopPropagation` на обёртках `:1391` и `:1454` висит только на click. Наведение он не трогает, так что это не причина. **Какой коммит.** Диапазон 6b9942dcb → cec8230e7 (reflog `.git/logs/refs/heads/main:7391-7396`). По квитанции ядра (`runs/a881953e-….json:123`) UI-часть («клик по карточке → PATCH… подсветка aria-pressed») влита в **e54779ca**. Подтвердить построчно, какой именно коммит внёс строку 1378, я не могу: объекты запакованы, `git show` через Read недоступен. Что изменил cec8230e7, неизвестно. **Отвергнутые гипотезы:** - Слой поверх триггера: его нет, подсветка сделана `border`/`boxShadow` на том же div. - Замена или перемонтирование элемента: `key={t.id}` стабилен (`:1573`). - Глобальный перехватчик `title`: в `shared/ui/tooltip` его нет, `HoverTip` на этом экране не используется. ## (2) Починка: расширяем существующий корень, без нового слоя ```diff --- a/packages/app/views/platform/TokenVaultView.tsx -function AccountCard({ token, spend, now, doAction, actionLoading, priority, onPriority }: { +export function AccountCard({ token, spend, now, doAction, actionLoading, priority, onPriority }: { @@ -1375,6 +1375,11 @@ // ПРИОРИТЕТ — клик по карточке: один приоритет на пул, повторный клик по // подсвеченной снимает. Кнопки внутри карточки клик не пропускают. - return <div role="button" aria-pressed={priority} data-priority={priority ? 'true' : undefined} - title={priority ? t.priorityOnTip : t.priorityTip} onClick={onPriority} + // title НЕ на корне: нативный title наследуется каждым потомком без своего + // (HTML, «nearest ancestor»), и подсказка клика вставала вместо наведения по + // всей плитке (владелец 2026-09-27). Подсказка клика — на имени аккаунта. + return <div role="button" tabIndex={0} aria-pressed={priority} data-priority={priority ? 'true' : undefined} + onClick={onPriority} + onKeyDown={e => { if (e.target === e.currentTarget && (e.key === 'Enter' || e.key === ' ')) { e.preventDefault(); onPriority() } }} style={…без изменений…}> <div style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}> - <span style={{ fontWeight: 600, fontSize: 15 }}>{token.metadata.accountName}</span> + <span title={priority ? t.priorityOnTip : t.priorityTip} style={{ fontWeight: 600, fontSize: 15 }}>{token.metadata.accountName}</span> ``` Чтобы тест проверял настоящий PATCH, логику приоритета из `TokenVaultView` (`:2139-2167`) переношу без изменений в экспортируемый хук. Порядок хуков сохраняется: ```diff +export function usePoolPriority(servedPriority: string | null) { + const [priorityDraft, setPriorityDraft] = useState<string | null | undefined>(undefined) + … (строки 2140-2167 дословно) … + return { priorityAccount, onPriority } +} … const servedPriority = rawData?.priorityAccount ?? (…)?.priorityAccount ?? null - const [priorityDraft, setPriorityDraft] = … /* по onPriority включительно */ + const { priorityAccount, onPriority } = usePoolPriority(servedPriority) ``` Что это даёт: - Наведение снова работает как до правки: у узлов со своим `title` показывается их подсказка, у узлов без него — ничего. - Клик остаётся на том же div. - Подсказка действия висит на конкретном элементе (имени) и не наследуется. - Enter/Space на самой карточке делают то же, что клик. Проверка `target === currentTarget` не даёт Enter на «Включить» переключить приоритет. ## (3) Тест взаимодействия: новый файл `packages/app/tests/unit/vault-account-card.test.tsx` Файл лежит в той же сюите пакета, которую гоняет оракул. Отдельный `.tsx` нужен из-за JSX и окружения jsdom: существующий `vault-account-list.test.ts` работает в node без DOM. `@testing-library/user-event` в пакете не установлен, поэтому события идут через `fireEvent`, как в `messageFlowLifecycleView.test.tsx`. jsdom не рисует нативный балун, поэтому «тултип виден» проверяется через `closest('[title]')`: это тот `title`, который браузер обязан показать для узла под указателем. ```tsx /** * @vitest-environment jsdom * КАРТОЧКА АККАУНТА: НАВЕДЕНИЕ И КЛИК ЖИВУТ НА ОДНОМ ЭЛЕМЕНТЕ (владелец 2026-09-27: * «нажатие стало перекрывать тултипы при наведении»). title корня наследовался * потомками; балун jsdom не рисует — судится title ближайшего себя-или-предка. * Живая проверка — dev.imperiaos.com/platform/admin/token-vault. */ import React from 'react' import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' vi.mock('@imperiaos/shared/core/lib/i18n', () => ({ useLocale: () => 'ru' })) vi.mock('@imperiaos/shared/core/domain', async importOriginal => ({ ...(await importOriginal<Record<string, unknown>>()), invalidateAsyncData: vi.fn(), })) import { AccountCard, usePoolPriority } from '@/views/platform/TokenVaultView' const BURNS_TIP = 'Ключ ранжирования: ближайший момент, когда неизрасходованная квота сгорает — min(сброс недели, конец оплаченного месяца)' const PRIORITY_ON_TIP = 'приоритет пула — выдаётся первым, пока у него есть запас; повторный клик снимает' const NOW = Date.UTC(2026, 8, 27, 12) type Token = React.ComponentProps<typeof AccountCard>['token'] const tok = (name: string): Token => ({ id: name, provider: 'anthropic', accessToken: 'x', expiresAt: null, status: 'expiring', metadata: { accountName: name, tier: 'max_20x', tokenType: 'oauth_pkce', rateLimitMultiplier: 20 }, lifetimeFraction: 0, isUsable: true, needsRefresh: false, lastUsedAt: null, lastRefreshedAt: null, errorMessage: null, rateLimit: { util5h: 0.2, util7d: 0.3, reset5h: 0, reset7d: 0, probedAt: NOW }, } as Token) /** Подсказка, которую браузер покажет при наведении: свой title или ближайшего предка. */ function hoverTip(el: Element): string | null { fireEvent.mouseOver(el) return el.closest('[title]')?.getAttribute('title') ?? null } function Card({ doAction = vi.fn() }: { doAction?: (a: string, b: Record<string, unknown>) => void }) { const { priorityAccount, onPriority } = usePoolPriority(null) return <AccountCard token={tok('acc1')} spend={null} now={NOW} doAction={doAction} actionLoading={null} priority={priorityAccount === 'acc1'} onPriority={() => onPriority('acc1')} /> } const fetchMock = vi.fn(async (_url: RequestInfo | URL, _init?: RequestInit) => ({ ok: true, json: async () => ({ ok: true }) })) const priorityCalls = () => fetchMock.mock.calls.filter(([url]) => String(url).includes('action=pool-priority')) beforeEach(() => { fetchMock.mockClear(); vi.stubGlobal('fetch', fetchMock) }) afterEach(() => { cleanup(); vi.unstubAllGlobals() }) describe('AccountCard — наведение и клик вместе', () => { it('наведение → подсказка факта; узел без своей подсказки не получает подсказку клика', () => { render(<Card />) expect(hoverTip(screen.getByText(/^Сгорит через/))).toBe(BURNS_TIP) expect(hoverTip(screen.getByRole('button', { name: 'Включить' }))).toBeNull() }) it('наведение → клик (PATCH priority) → наведение снова показывает подсказку факта', async () => { render(<Card />) const card = screen.getByRole('button', { pressed: false }) expect(hoverTip(screen.getByText(/^Сгорит через/))).toBe(BURNS_TIP) fireEvent.click(card) await waitFor(() => expect(priorityCalls()).toHaveLength(1)) expect(priorityCalls()[0][1]).toMatchObject({ method: 'PATCH', body: JSON.stringify({ accountName: 'acc1' }) }) expect(screen.getByRole('button', { pressed: true })).toBe(card) expect(hoverTip(screen.getByText(/^Сгорит через/))).toBe(BURNS_TIP) expect(hoverTip(screen.getByRole('button', { name: 'Включить' }))).toBeNull() expect(hoverTip(screen.getByText('acc1'))).toBe(PRIORITY_ON_TIP) }) it('открытая ⓘ не наследует подсказку клика и не ставит приоритет', () => { render(<Card />) const dot = screen.getByRole('button', { name: 'i' }) fireEvent.click(dot) expect(hoverTip(dot)).toBeNull() expect(priorityCalls()).toHaveLength(0) }) it('«Включить» — своё действие, приоритет не трогает', () => { const doAction = vi.fn() render(<Card doAction={doAction} />) fireEvent.click(screen.getByRole('button', { name: 'Включить' })) expect(doAction).toHaveBeenCalledWith('switch', { accountName: 'acc1' }) expect(priorityCalls()).toHaveLength(0) }) it('клавиатура: Enter на карточке — то же, что клик', async () => { render(<Card />) fireEvent.keyDown(screen.getByRole('button', { pressed: false }), { key: 'Enter' }) await waitFor(() => expect(priorityCalls()).toHaveLength(1)) }) }) ``` **Как получить red→green** (не выполнено): откатить только две строки фикса, то есть вернуть `title` на корень и убрать его с имени. Ожидаемый результат: красные проверки «Включить» → `toBeNull` и ⓘ → `toBeNull` (вместо null придёт `priorityTip`). После фикса всё зелёное. Затем полный прогон оракула: прежние тесты не должны пасть, их число не должно уменьшиться. ## (4) Почему оракул прошлой правки это пропустил У экрана не было ни одной проверки на отрендеренном DOM. Всё покрытие — чистые функции в окружении node: - `vault-account-list.test.ts` проверяет `vaultOrder`, `vaultGroups` и `nextPriority` («три клика» проверяли логику, а не карточку); - по квитанции stmt-5 из `runs/a881953e`, остальное — маршрутные тесты ваула. Не хватало двух видов проверок: 1. **Тест взаимодействия**: рендер `AccountCard` и события наведения и клика на реальном узле. 2. **Проверка сохранения прежнего поведения при добавлении нового.** Сценарии приёмки S4-01…S4-11 описывают только клик и подсветку. Характеризационный S4-08 фиксировал только рамку и порядок, о наведении и подсказках в них нет ни одного сценария. Есть и третья причина. Наследование `title` — семантика стандарта, а не атрибут узла. Поэтому даже DOM-тест через `getByTitle` его бы не заметил: нужно проверять `title` ближайшего предка, как в тесте выше. ## Что осталось открытым - **Вложенные интерактивные элементы.** Внутри `role="button"` лежат `<button>` (ⓘ, «Включить», «Обновить»). Это нарушение правила axe nested-interactive, и оно было и до моего фикса. Чтобы его убрать, клик нужно вынести с корня на отдельный переключатель, а это противоречит условию «расширить существующий элемент карточки». Нужно ваше решение. - **Карточка может переехать после клика.** После PATCH и перезапроса ранг меняется, и карточка может сместиться в сетке (`vaultOrder`). Тогда под курсором окажется другая плитка. Это не проверено, стоит посмотреть при живой проверке. - **Не получено:** патч не применён, оракул не запускался, red→green нет, живой экран (наведение → клик → наведение) не проверен. Источники: - [HTML Standard (WHATWG), атрибут title](https://html.spec.whatwg.org/dev/dom.html): без своего `title` действует `title` ближайшего предка; пустая строка означает «подсказки нет»; полагаться на `title` не рекомендуется, потому что клавиатура и тач его не видят. - [MDN, title](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/title). - [WAI-ARIA APG, Tooltip Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/tooltip): показ по наведению и фокусу, Escape закрывает, фокус остаётся на триггере, связь через `aria-describedby`. - [Deque, nested-interactive](https://dequeuniversity.com/rules/axe/4.10/nested-interactive): внутри интерактивного элемента не должно быть фокусируемых потомков. - [Testing Library user-event](https://testing-library.com/docs/user-event/v13/): `hover`/`unhover` как предпочтительные события; пакет в `app` не установлен, поэтому использован `fireEvent`.

Не хватает: строки и механизм регрессии в диффе названных коммитов