gabriel / muse public
feat BREAKING annotate dev
gabriel · 149 days ago · Apr 16, 2026 · Diff

feat(annotate): ground-up redesign with labels, status, notes, score + 7-tier tests

sha256:b3126f273ef7d5f9e929d6558be5e9353b41c07f6ea7f6b65ee38a56dc80b259 sha
+159 ~16 −8 symbols
sha256:792e4b93478641e02ef47bf5b9f6617463807e87eb8ba9500515860f929b1d24 snapshot
+159
symbols added
~16
symbols modified
−8
symbols removed
0
dead code introduced
Semantic Changes 183 symbols
~ muse/cli/commands/annotate.py .py 13 symbols added, 2 symbols removed, 5 symbols modified
_commit_to_json function function _commit_to_json L173–190
_parse_reviewer_list function function _parse_reviewer_list L149–170
+ _MAX_LABEL_LEN variable variable _MAX_LABEL_LEN L120–120
+ _MAX_NOTE_LEN variable variable _MAX_NOTE_LEN L121–121
+ _STATUS_VALUES variable variable _STATUS_VALUES L123–125
+ _UNSET variable variable _UNSET L170–170
+ _Unset class class _Unset L160–167
+ __new__ method method __new__ L164–167
+ _parse_name_list function function _parse_name_list L254–275
+ _record_to_json function function _record_to_json L283–340
+ _validate_label function function _validate_label L203–204
+ _validate_name function function _validate_name L178–196
+ _validate_note function function _validate_note L235–246
+ _validate_score function function _validate_score L219–232
+ _validate_status function function _validate_status L207–216
~ _show
~ run
~ muse/core/store.py .py 1 symbol added, 6 symbols modified
+ _float_val function function _float_val L219–235
~ tests/test_annotate_command.py .py 145 symbols added, 6 symbols removed, 5 symbols modified
TestAnnotateCommand class class TestAnnotateCommand L63–123
test_add_multiple_reviewers method method test_add_multiple_reviewers L84–97
test_add_reviewer method method test_add_reviewer L70–82
test_add_reviewer_idempotent method method test_add_reviewer_idempotent L99–108
test_increment_test_run_counter method method test_increment_test_run_counter L110–118
test_show_annotations_when_no_flags method method test_show_annotations_when_no_flags L64–68
+ TestCommitResolution class class TestCommitResolution L613–634
+ test_full_commit_id method method test_full_commit_id L614–617
+ test_head_implicit method method test_head_implicit L631–634
+ test_short_prefix method method test_short_prefix L619–624
+ TestDataIntegrity class class TestDataIntegrity L836–963
+ test_gcounter_monotone method method test_gcounter_monotone L874–880
+ test_gcounter_never_decrements method method test_gcounter_never_decrements L882–888
+ test_json_changed_false_when_no_mutation method method test_json_changed_false_when_no_mutation L950–954
+ test_json_roundtrip_labels method method test_json_roundtrip_labels L943–948
+ test_json_roundtrip_reviewed_by method method test_json_roundtrip_reviewed_by L929–934
+ test_json_roundtrip_score method method test_json_roundtrip_score L936–941
+ test_lww_score_last_write_wins method method test_lww_score_last_write_wins L901–908
+ test_lww_status_last_write_wins method method test_lww_status_last_write_wins L891–898
+ test_no_changes_message_when_idempotent method method test_no_changes_message_when_idempotent L956–963
+ test_notes_allow_duplicates method method test_notes_allow_duplicates L920–926
+ test_notes_append_only_preserves_order method method test_notes_append_only_preserves_order L911–918
+ test_orset_label_idempotent method method test_orset_label_idempotent L856–862
+ test_orset_label_union method method test_orset_label_union L864–871
+ test_orset_reviewer_idempotent method method test_orset_reviewer_idempotent L838–844
+ test_orset_reviewer_union method method test_orset_reviewer_union L846–853
+ TestJsonOutput class class TestJsonOutput L348–425
+ test_json_commit_id_matches method method test_json_commit_id_matches L379–385
+ test_json_dry_run_flag method method test_json_dry_run_flag L400–409
+ test_json_flag_exits_0 method method test_json_flag_exits_0 L349–354
+ test_json_has_all_keys method method test_json_has_all_keys L364–377
+ test_json_is_valid method method test_json_is_valid L356–362
+ test_json_mutation_reflects_new_values method method test_json_mutation_reflects_new_values L387–398
+ test_json_parent_commit_id_null_for_root method method test_json_parent_commit_id_null_for_root L419–425
+ test_json_snapshot_id_present method method test_json_snapshot_id_present L411–417
+ TestLabelFlags class class TestLabelFlags L478–513
+ test_add_comma_separated_labels method method test_add_comma_separated_labels L488–497
+ test_add_single_label method method test_add_single_label L479–486
+ test_remove_label method method test_remove_label L499–505
+ test_remove_nonexistent_label_warns method method test_remove_nonexistent_label_warns L507–513
+ TestNoteFlag class class TestNoteFlag L549–572
+ test_append_note method method test_append_note L550–557
+ test_empty_note_exits_1 method method test_empty_note_exits_1 L569–572
+ test_multiple_notes_accumulate method method test_multiple_notes_accumulate L559–567
+ TestPerformance class class TestPerformance L785–828
+ test_combined_mutation_under_300ms method method test_combined_mutation_under_300ms L810–828
+ test_json_output_under_200ms method method test_json_output_under_200ms L803–808
+ test_show_annotation_under_200ms method method test_show_annotation_under_200ms L786–791
+ test_single_mutation_under_200ms method method test_single_mutation_under_200ms L793–801
+ TestReviewerFlags class class TestReviewerFlags L428–475
+ test_add_comma_separated_reviewers method method test_add_comma_separated_reviewers L438–447
+ test_add_multi_flag_reviewers method method test_add_multi_flag_reviewers L449–459
+ test_add_single_reviewer method method test_add_single_reviewer L429–436
+ test_remove_nonexistent_reviewer_warns method method test_remove_nonexistent_reviewer_warns L469–475
+ test_remove_reviewer method method test_remove_reviewer L461–467
+ TestScoreFlag class class TestScoreFlag L575–610
+ test_invalid_score_exits_1 method method test_invalid_score_exits_1 L593–596
+ test_score_one_boundary method method test_score_one_boundary L605–610
+ test_score_overwrite method method test_score_overwrite L585–591
+ test_score_zero_boundary method method test_score_zero_boundary L598–603
+ test_set_score method method test_set_score L576–583
+ TestSecurity class class TestSecurity L642–702
+ test_ansi_escape_in_reviewer_rejected method method test_ansi_escape_in_reviewer_rejected L648–651
+ test_commit_ref_glob_metachar_safe method method test_commit_ref_glob_metachar_safe L698–702
+ test_control_char_in_label_rejected method method test_control_char_in_label_rejected L653–656
+ test_control_char_in_reviewer_rejected method method test_control_char_in_reviewer_rejected L643–646
+ test_error_goes_to_stderr_not_stdout method method test_error_goes_to_stderr_not_stdout L691–696
+ test_invalid_status_value_rejected method method test_invalid_status_value_rejected L676–679
+ test_oversized_label_rejected method method test_oversized_label_rejected L664–668
+ test_oversized_note_rejected method method test_oversized_note_rejected L670–674
+ test_oversized_reviewer_rejected method method test_oversized_reviewer_rejected L658–662
+ test_score_nan_rejected method method test_score_nan_rejected L686–689
+ test_score_out_of_range_rejected method method test_score_out_of_range_rejected L681–684
+ TestShowMode class class TestShowMode L306–345
+ test_show_head_when_no_commit_arg method method test_show_head_when_no_commit_arg L342–345
+ test_show_includes_labels_header method method test_show_includes_labels_header L322–325
+ test_show_includes_notes_header method method test_show_includes_notes_header L332–335
+ test_show_includes_reviewed_by_header method method test_show_includes_reviewed_by_header L312–315
+ test_show_includes_score_header method method test_show_includes_score_header L337–340
+ test_show_includes_status_header method method test_show_includes_status_header L327–330
+ test_show_includes_test_runs_header method method test_show_includes_test_runs_header L317–320
+ test_show_no_flags_exits_0 method method test_show_no_flags_exits_0 L307–310
+ TestStatusFlag class class TestStatusFlag L516–546
+ test_invalid_status_exits_1 method method test_invalid_status_exits_1 L535–538
+ test_set_all_valid_statuses method method test_set_all_valid_statuses L526–533
+ test_set_approved method method test_set_approved L517–524
+ test_status_overwrite method method test_status_overwrite L540–546
+ TestStoreRoundTrip class class TestStoreRoundTrip L215–298
+ test_all_fields_in_one_call method method test_all_fields_in_one_call L264–287
+ test_dry_run_does_not_write method method test_dry_run_does_not_write L289–298
+ test_labels_persisted method method test_labels_persisted L233–238
+ test_notes_persisted method method test_notes_persisted L247–255
+ test_reviewed_by_persisted method method test_reviewed_by_persisted L216–224
+ test_score_persisted method method test_score_persisted L257–262
+ test_status_persisted method method test_status_persisted L240–245
+ test_test_runs_persisted method method test_test_runs_persisted L226–231
+ TestStress class class TestStress L710–777
+ test_100_sequential_reviewer_adds method method test_100_sequential_reviewer_adds L711–720
+ test_200_notes_appended method method test_200_notes_appended L730–739
+ test_20_labels_added method method test_20_labels_ L759–768
+ test_50_sequential_test_runs method method test_50_sequential_test_runs L722–728
+ test_note_at_max_len_accepted method method test_note_at_max_len_accepted L741–748
+ test_reviewer_at_max_len_accepted method method test_reviewer_at_max_len_accepted L750–757
+ test_status_updated_many_times method method test_status_updated_many_times L770–777
+ TestValidateLabel class class TestValidateLabel L125–143
+ test_control_char_exits method method test_control_char_exits L141–143
+ test_empty_label_exits method method test_empty_label_exits L137–139
+ test_label_at_max_len_passes method method test_label_at_max_len_passes L129–131
+ test_label_over_max_len_exits method method test_label_over_max_len_exits L133–135
+ test_valid_label_passes method method test_valid_label_passes L126–127
+ TestValidateNote class class TestValidateNote L189–207
+ test_empty_exits method method test_empty_exits L193–195
+ test_note_at_max_len_passes method method test_note_at_max_len_passes L201–203
+ test_note_over_max_len_exits method method test_note_over_max_len_exits L205–207
+ test_valid_note_passes method method test_valid_note_passes L190–191
+ test_whitespace_only_exits method method test_whitespace_only_exits L197–199
+ TestValidateReviewer class class TestValidateReviewer L93–122
+ test_ansi_escape_exits method method test_ansi_escape_exits L116–118
+ test_control_char_exits method method test_control_char_exits L112–114
+ test_empty_name_exits method method test_empty_name_exits L100–102
+ test_name_at_max_len_passes method method test_name_at_max_len_passes L104–106
+ test_name_over_max_len_exits method method test_name_over_max_len_exits L108–110
+ test_newline_exits method method test_newline_exits L120–122
+ test_valid_agent_id_passes method method test_valid_agent_id_passes L97–98
+ test_valid_name_passes method method test_valid_name_passes L94–95
+ TestValidateScore class class TestValidateScore L163–186
+ test_above_one_exits method method test_above_one_exits L177–179
+ test_below_zero_exits method method test_below_zero_exits L173–175
+ test_integer_string_passes method method test_integer_string_passes L185–186
+ test_midpoint_passes method method test_midpoint_passes L170–171
+ test_non_numeric_exits method method test_non_numeric_exits L181–183
+ test_one_passes method method test_one_passes L167–168
+ test_zero_passes method method test_zero_passes L164–165
+ TestValidateStatus class class TestValidateStatus L146–160
+ test_all_valid_statuses_pass method method test_all_valid_statuses_pass L147–149
+ test_case_sensitive method method test_case_sensitive L158–160
+ test_empty_string_clears method method test_empty_string_clears L151–152
+ test_unknown_status_exits method method test_unknown_status_exits L154–156
+ _MAX_LABEL_LEN import import _MAX_LABEL_LEN L26–26
+ _MAX_NOTE_LEN import import _MAX_NOTE_LEN L26–26
+ _MAX_REVIEWER_LEN import import _MAX_REVIEWER_LEN L26–26
+ _STATUS_VALUES import import _STATUS_VALUES L26–26
+ _validate_label import import _validate_label L26–26
+ _validate_note import import _validate_note L26–26
+ _validate_reviewer import import _validate_reviewer L26–26
+ _validate_score import import _validate_score L26–26
+ _validate_status import import _validate_status L26–26
+ annotations import import annotations L14–14
+ json import import json L17–17
+ read_commit import import read_commit L38–38
+ time import import time L19–19
~ repo
← Older Oldest on dev
All commits
Newer → Latest on dev

0 comments

No comments yet. Be the first to start the discussion.

To add a comment, use the Muse CLI: muse hub commit comment sha256:b3126f273ef7d5f9e929d6558be5e9353b41c07f6ea7f6b65ee38a56dc80b259 --body "your comment"