feat(KH2): fail-closed Muse-sync hard gate — permanent fix for MuseHub/GitHub drift
Mirrors git commit 4ec24a4 (branch feat/kh2-muse-sync-hard-gate). Adds StatusResult.muse_dirty/git_dirty, tools/muse_sync/ (check_muse_sync, frozen trigger: muse_dirty and not git_dirty), wired fail-closed into status --exit-code / review --freeze / governance-sync (exit 2, no precedence renumbering). Freeze doc reviewed -> pass (KH2-r2). 456 tests green (+27 KH2 seven-tier matrix).
sha256:a5c350ac215f14db6a07f76135744edb756fd6aeee1f86689a84ee016d718665
sha
+126
~26
symbols
sha256:dc27984c7abd549b780197c081bbe7b74d0f7f18f34542111a75c2861965dd4e
snapshot
+126
symbols added
~26
symbols modified
0
dead code introduced
Semantic Changes
152 symbols
+
Phase KH2 — Muse-sync hard gate (Thinking freeze)
section Phase KH2 — Muse-sync hard gate (Thinking freeze) L1–279
+
2 — What exists now (verified, do not redesign)
section §KH2.2 — What exists now (verified, do not redesign) L124–145
+
3 — StatusResult field additions (frozen)
section §KH2.3 — StatusResult field additions (frozen) L145–174
+
4 — MuseSyncReport + check_muse_sync (frozen)
section §KH2.4 — MuseSyncReport + check_muse_sync (frozen) L174–219
+
5 — Wiring: three fail-closed choke points (frozen)
section §KH2.5 — Wiring: three fail-closed choke points (frozen) L219–232
+
6 — Boundary: what this gate does and does not catch (frozen, stated plainly)
section §KH2.6 — Boundary: what this gate does and does not catch (frozen, stated plainly) L232–247
+
8 — Seven-tier test matrix (KH2b Auto build must satisfy)
section §KH2.8 — Seven-tier test matrix (KH2b Auto build must satisfy) L256–270
+
9 — Close-out (execute only when KH2 marked DONE)
section §KH2.9 — Close-out (execute only when KH2 marked DONE) L270–279
+
test_full_input_matrix_is_exhaustively_covered_and_stable
function
function test_full_input_matrix_is_exhaustively_covered_and_stable L42–52
+
test_identical_inputs_always_yield_identical_report
function
function test_identical_inputs_always_yield_identical_report L22–28
+
test_no_hidden_state_across_calls_with_varying_inputs
function
function test_no_hidden_state_across_calls_with_varying_inputs L31–39
+
test_governance_sync_refuses_then_proceeds_across_a_simulated_muse_commit
function
function test_governance_sync_refuses_then_proceeds_across_a_simulated_muse_commit L58–98
+
test_review_freeze_refuses_then_proceeds_across_a_simulated_muse_commit
function
function test_review_freeze_refuses_then_proceeds_across_a_simulated_muse_commit L31–55
+
test_git_only_adapter_leaves_muse_dirty_none
function
function test_git_only_adapter_leaves_muse_dirty_none L63–74
+
test_mirror_adapter_populates_both_dirty_fields
function
function test_mirror_adapter_populates_both_dirty_fields L30–45
+
test_muse_only_adapter_leaves_git_dirty_none
function
function test_muse_only_adapter_leaves_git_dirty_none L48–60
+
test_status_exit_code_0_when_muse_synced
function
function test_status_exit_code_0_when_muse_synced L93–106
+
test_status_exit_code_2_when_muse_pending
function
function test_status_exit_code_2_when_muse_pending L77–90
+
test_status_json_payload_reports_muse_sync_state
function
function test_status_json_payload_reports_muse_sync_state L109–126
+
test_status_call_count_unchanged_by_muse_sync_gate
function
function test_status_call_count_unchanged_by_muse_sync_gate L21–44
+
test_fails_closed_when_dirty_state_unreadable
function
function test_fails_closed_when_dirty_state_unreadable L19–25
+
test_muse_sync_payload_never_leaks_command_output_or_paths
function
function test_muse_sync_payload_never_leaks_command_output_or_paths L42–82
+
test_remediation_text_is_a_static_string_never_shell_invoked
function
function test_remediation_text_is_a_static_string_never_shell_invoked L28–39
+
test_review_freeze_refusal_does_not_run_review_provider
function
function test_review_freeze_refusal_does_not_run_review_provider L85–114
+
test_muse_sync_gate_bounded_with_large_muse_status_payload
function
function test_muse_sync_gate_bounded_with_large_muse_status_payload L12–51
+
test_mirror_pending_when_git_clean_and_muse_dirty
function
function test_mirror_pending_when_git_clean_and_muse_dirty L46–54
+
test_mirror_synced_when_both_dirty_mid_edit_non_trigger
function
function test_mirror_synced_when_both_dirty_mid_edit_non_trigger L67–74
+
test_mirror_synced_when_git_dirty_muse_clean_non_trigger
function
function test_mirror_synced_when_git_dirty_muse_clean_non_trigger L77–84
+
test_mirror_unreadable_when_git_dirty_unknown
function
function test_mirror_unreadable_when_git_dirty_unknown L96–102
+
test_mirror_unreadable_when_muse_dirty_unknown
function
function test_mirror_unreadable_when_muse_dirty_unknown L87–93
+
test_status_result_new_fields_default_to_none
function
function test_status_result_new_fields_default_to_none L22–28
~
status
Older
sync: catch up Muse canonical history to Git working tree (drift…
sha256:3e14450f4e65cee8e14d9f45292d93481c4093b63ac939e97bfb4ada25e003c9
All commits
Newer
fix(ci): remove misplaced live freeze-review workflow; fix public link
sha256:3f5c1f5a067da72bfefef5ce40268d41a72c700b4a277349336bf272cc9b5c67
0 comments
To add a comment, use the Muse CLI:
muse hub commit comment sha256:a5c350ac215f14db6a07f76135744edb756fd6aeee1f86689a84ee016d718665 --body "your comment"
No comments yet. Be the first to start the discussion.