gabriel / muse public
feat BREAKING #216 feat/216-branchmeta-created-by #1 / 2
1 day ago · Sep 17, 2026 · Diff

feat(#216): persist write-once BranchMeta creation provenance

Stamp created_by/created_by_kind/created_at at create sites; additive branch_created_* list JSON; rename moves meta; tip created_by stays #215.

sha256:5eff0848db1d0748f3a195ca871a9275e7455d447690411ec2d83434e11baa65 sha
+80 ~29 −8 symbols
1169 changed · 1169 in snapshot files
sha256:96673f0b554d44c5a3c4e5a91d733c170757283bd6a249838b13dcb250ba8408 snapshot
+80
symbols added
~29
symbols modified
−8
symbols removed
1169
files changed
1169
files in snapshot
0
dead code introduced
Semantic Changes 117 symbols
~ tests/test_branch_created_meta.py .py 49 symbols added
+ TestCreateCopyRenameE2E class class TestCreateCopyRenameE2E L285–382
+ test_copy_dest_gets_new_created_at method method test_copy_dest_gets_new_created_at L317–338
+ test_force_copy_restamps_dest method method test_force_copy_restamps_dest L340–359
+ test_human_create_then_agent_tip_preserves_branch_creator method method test_human_create_then_agent_tip_preserves_branch_creator L286–315
+ test_rename_moves_creation_triple method method test_rename_moves_creation_triple L361–382
+ TestDataIntegrity class class TestDataIntegrity L414–482
+ test_corrupt_kind_json_null_listing_ok method method test_corrupt_kind_json_null_listing_ok L442–471
+ test_delete_removes_branch_section method method test_delete_removes_branch_section L473–482
+ test_intent_update_preserves_created_at_bytes method method test_intent_update_preserves_created_at_bytes L415–428
+ test_list_twice_identical_branch_created method method test_list_twice_identical_branch_created L430–440
+ TestPerformance class class TestPerformance L490–503
+ test_200_branch_list_under_5s method method test_200_branch_list_under_5s L491–503
+ TestResolveAndWriteOnceUnit class class TestResolveAndWriteOnceUnit L96–248
+ test_branch_created_from_meta_invalid_kind_null method method test_branch_created_from_meta_invalid_kind_null L224–235
+ test_branch_created_from_meta_naive_at_null method method test_branch_created_from_meta_naive_at_null L237–248
+ test_load_dump_round_trip_creation_and_intent method method test_load_dump_round_trip_creation_and_intent L167–200
+ test_move_branch_meta_relocates_dict method method test_move_branch_meta_relocates_dict L202–222
+ test_resolve_agent_env_wins method method test_resolve_agent_env_wins L99–106
+ test_resolve_both_empty_returns_none method method test_resolve_both_empty_returns_none L117–127
+ test_resolve_esc_only_env_returns_none method method test_resolve_esc_only_env_returns_none L138–148
+ test_resolve_human_from_handle method method test_resolve_human_from_handle L108–115
+ test_resolve_whitespace_env_falls_to_human method method test_resolve_whitespace_env_falls_to_human L129–136
+ test_write_once_second_stamp_preserves_created_at method method test_write_once_second_stamp_preserves_created_at L150–165
+ TestSecurity class class TestSecurity L511–570
+ test_esc_in_agent_id_not_in_toml_or_json method method test_esc_in_agent_id_not_in_toml_or_json L512–529
+ test_no_key_material_in_output method method test_no_key_material_in_output L531–546
+ test_quote_in_handle_round_trips_toml method method test_quote_in_handle_round_trips_toml L548–570
+ TestStampIntegration class class TestStampIntegration L256–277
+ test_plain_branch_stamps_toml_and_json method method test_plain_branch_stamps_toml_and_json L257–277
+ TestStress200 class class TestStress200 L390–406
+ test_200_creates_list_keys_present method method test_200_creates_list_keys_present L391–406
+ _HUB_URL variable variable _HUB_URL L32–32
+ _branch_json function function _branch_json L39–44
+ _entry function function _entry L47–48
+ _env function function _env L35–36
+ _set_user_handle function function _set_user_handle L59–74
+ _toml_branch function function _toml_branch L51–56
+ cli variable variable cli L29–29
+ CliRunner import import CliRunner L27–27
+ Mapping import import Mapping L22–22
+ annotations import import annotations L16–16
+ json import import json L18–18
+ mock import import mock L23–23
+ pathlib import import pathlib L19–19
+ pytest import import pytest L25–25
+ time import import time L20–20
+ tomllib import import tomllib L21–21
+ repo function function repo L78–88
+ runner variable variable runner L30–30
~ docs/MUSE-OVERSEER-HANDOVER.md .md 14 symbols added, 7 symbols removed, 5 symbols modified
NEXT SESSION — #216b Auto build (PRIMARY) section NEXT SESSION — #216b Auto build (PRIMARY) L10–72
Paste-ready prompt — 216b section Paste-ready prompt — 216b L37–72
code variable variable code L39–68
THE ONE NEXT STEP — Model: Auto section THE ONE NEXT STEP — Model: Auto L25–37
table section table L29–36
What just landed section What just landed L16–25
table section table L18–24
+ ARCHIVED SESSION — #216b Auto build section ARCHIVED SESSION — #216b Auto build L68–75
+ Build verification — 216b round 1 section Build verification — 216b round 1 L102–121
+ Evidence section Evidence L113–118
+ table section table L114–117
+ Findings section Findings L108–113
+ table section table L109–112
+ Honest summary section Honest summary L118–121
+ NEXT SESSION — #216 complete; pick next ticket (PRIMARY) section NEXT SESSION — #216 complete; pick next ticket (PRIMARY) L10–68
+ Paste-ready prompt — next ticket (Thinking) section Paste-ready prompt — next ticket (Thinking) L38–68
+ code variable variable code L40–64
+ THE ONE NEXT STEP — Model: Thinking section THE ONE NEXT STEP — Model: Thinking L26–38
+ table section table L30–37
+ What just landed section What just landed L16–26
+ table section table L18–25
~ table
~ muse/cli/commands/branch.py .py 6 symbols added, 8 symbols modified
+ _BranchCreatedBy class class _BranchCreatedBy L107–111
+ _branch_created_from_meta function function _branch_created_from_meta L197–227
+ BranchMeta import import BranchMeta L62–62
+ datetime import import datetime L53–53
+ move_branch_meta import import move_branch_meta L62–62
+ stamp_branch_created import import stamp_branch_created L62–62
~ run
~ muse/cli/commands/checkout.py .py 1 symbol added, 2 symbols modified
+ stamp_branch_created import import stamp_branch_created L93–93
~ run
~ muse/cli/commands/switch.py .py 1 symbol added, 1 symbol modified
+ stamp_branch_created import import stamp_branch_created L90–90
~ muse/cli/commands/worktree.py .py 1 symbol added, 1 symbol modified
+ stamp_branch_created import import stamp_branch_created L47–47
~ muse/cli/config.py .py 7 symbols added, 7 symbols modified
+ _resolve_branch_creator function function _resolve_branch_creator L1084–1108
+ Literal import import Literal L47–47
+ now_utc_iso import import now_utc_iso L49–49
+ os import import os L42–42
+ sanitize_provenance import import sanitize_provenance L53–53
+ move_branch_meta function function move_branch_meta L1143–1170
+ stamp_branch_created function function stamp_branch_created L1111–1140
~ tests/test_branch_intent_created_by.py .py 1 symbol added, 1 symbol removed, 1 symbol modified
test_create_without_intent_no_config_entry method method test_create_without_intent_no_config_entry L259–263
+ test_create_without_intent_stamps_creation_not_intent method method test_create_without_intent_stamps_creation_not_intent L259–269
Files Changed
+1169
1169 in snapshot
+ .coverage .coverage
+ .museattributes .museattributes
+ .museignore .museignore
+ CLAUDE.md .md
+ README.md .md
+ dev-setup.sh .sh
+ pyproject.toml .toml

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:5eff0848db1d0748f3a195ca871a9275e7455d447690411ec2d83434e11baa65 --body "your comment"