@@ -2,10 +2,9 @@ use tracedecay::automation::managed_skills::{
22 approve_managed_skill, archive_managed_skill, create_managed_skill_draft,
33 disable_managed_skill, discard_pending_managed_skill_update, list_managed_skills,
44 load_managed_skill, managed_skill_dir, restore_managed_skill, save_managed_skill,
5- set_managed_skill_state, stage_managed_skill_archive, stage_managed_skill_update,
6- update_managed_skill, ManagedSkillDraft , ManagedSkillProvenance , ManagedSkillSource ,
7- ManagedSkillState , ManagedSkillUpdate , ManagedSupportFile , SkillInstallTarget ,
8- MAX_MANAGED_SKILL_BODY_BYTES ,
5+ set_managed_skill_state, stage_managed_skill_update, update_managed_skill, ManagedSkillDraft ,
6+ ManagedSkillProvenance , ManagedSkillSource , ManagedSkillState , ManagedSkillUpdate ,
7+ ManagedSupportFile , SkillInstallTarget , MAX_MANAGED_SKILL_BODY_BYTES ,
98} ;
109use tracedecay:: automation:: skill_usage:: {
1110 ingest_analytics_events, load_skill_usage_records, record_skill_usage,
@@ -838,142 +837,6 @@ async fn staged_managed_skill_update_preserves_active_revision_until_approval()
838837 assert_eq ! ( reloaded. metadata. checksum, second_base) ;
839838}
840839
841- #[ tokio:: test]
842- async fn staged_managed_skill_archive_keeps_content_until_approval ( ) {
843- let temp = tempfile:: tempdir ( ) . unwrap ( ) ;
844- let profile_root = temp. path ( ) . join ( "profile" ) ;
845- create_managed_skill_draft ( & profile_root, draft ( ) )
846- . await
847- . unwrap ( ) ;
848- let active = approve_managed_skill ( & profile_root, "repo-hygiene" )
849- . await
850- . unwrap ( ) ;
851- let base_checksum = active. metadata . checksum . clone ( ) ;
852- let skill_dir = managed_skill_dir ( & profile_root, "repo-hygiene" ) . unwrap ( ) ;
853-
854- let staged = stage_managed_skill_archive (
855- & profile_root,
856- "repo-hygiene" ,
857- & base_checksum,
858- Some ( "overlaps with newer guidance" . to_string ( ) ) ,
859- )
860- . await
861- . unwrap ( ) ;
862- assert_eq ! ( staged. metadata. state, ManagedSkillState :: PendingApproval ) ;
863-
864- // Staging must not touch the active revision.
865- let with_pending = load_managed_skill ( & profile_root, "repo-hygiene" )
866- . await
867- . unwrap ( ) ;
868- assert_eq ! ( with_pending. metadata. state, ManagedSkillState :: Active ) ;
869- assert_eq ! ( with_pending. metadata. checksum, base_checksum) ;
870- let pending = with_pending. pending_update . as_ref ( ) . unwrap ( ) ;
871- assert_eq ! ( pending. resulting_state, Some ( ManagedSkillState :: Archived ) ) ;
872- assert_eq ! (
873- pending. staged_reason. as_deref( ) ,
874- Some ( "overlaps with newer guidance" )
875- ) ;
876-
877- // Approval archives without deleting any content.
878- let approved = approve_managed_skill ( & profile_root, "repo-hygiene" )
879- . await
880- . unwrap ( ) ;
881- assert_eq ! ( approved. metadata. state, ManagedSkillState :: Archived ) ;
882- assert_eq ! ( approved. body_markdown, active. body_markdown) ;
883- assert ! ( approved. pending_update. is_none( ) ) ;
884- assert ! ( skill_dir. join( "SKILL.md" ) . is_file( ) ) ;
885- assert ! ( skill_dir. join( "references/checklist.md" ) . is_file( ) ) ;
886- let reloaded = load_managed_skill ( & profile_root, "repo-hygiene" )
887- . await
888- . unwrap ( ) ;
889- assert_eq ! ( reloaded. metadata. state, ManagedSkillState :: Archived ) ;
890- assert_eq ! ( reloaded. body_markdown, active. body_markdown) ;
891- }
892-
893- #[ tokio:: test]
894- async fn staged_managed_skill_archive_can_be_discarded ( ) {
895- let temp = tempfile:: tempdir ( ) . unwrap ( ) ;
896- let profile_root = temp. path ( ) . join ( "profile" ) ;
897- create_managed_skill_draft ( & profile_root, draft ( ) )
898- . await
899- . unwrap ( ) ;
900- let active = approve_managed_skill ( & profile_root, "repo-hygiene" )
901- . await
902- . unwrap ( ) ;
903- stage_managed_skill_archive (
904- & profile_root,
905- "repo-hygiene" ,
906- & active. metadata . checksum ,
907- None ,
908- )
909- . await
910- . unwrap ( ) ;
911-
912- let discarded = discard_pending_managed_skill_update ( & profile_root, "repo-hygiene" )
913- . await
914- . unwrap ( ) ;
915- assert ! ( discarded. pending_update. is_none( ) ) ;
916- let reloaded = load_managed_skill ( & profile_root, "repo-hygiene" )
917- . await
918- . unwrap ( ) ;
919- assert_eq ! ( reloaded. metadata. state, ManagedSkillState :: Active ) ;
920- assert_eq ! ( reloaded. metadata. checksum, active. metadata. checksum) ;
921- }
922-
923- #[ tokio:: test]
924- async fn staged_managed_skill_archive_rejects_pinned_stale_and_duplicates ( ) {
925- let temp = tempfile:: tempdir ( ) . unwrap ( ) ;
926- let profile_root = temp. path ( ) . join ( "profile" ) ;
927- create_managed_skill_draft ( & profile_root, draft ( ) )
928- . await
929- . unwrap ( ) ;
930- let mut active = approve_managed_skill ( & profile_root, "repo-hygiene" )
931- . await
932- . unwrap ( ) ;
933- let base_checksum = active. metadata . checksum . clone ( ) ;
934-
935- let err = stage_managed_skill_archive ( & profile_root, "repo-hygiene" , "sha256:stale" , None )
936- . await
937- . unwrap_err ( ) ;
938- assert ! ( err. to_string( ) . contains( "is stale" ) ) ;
939-
940- active. set_pinned ( true ) ;
941- save_managed_skill ( & profile_root, & active) . await . unwrap ( ) ;
942- let err = stage_managed_skill_archive ( & profile_root, "repo-hygiene" , & base_checksum, None )
943- . await
944- . unwrap_err ( ) ;
945- assert ! ( err
946- . to_string( )
947- . contains( "pinned and exempt from staged archive" ) ) ;
948-
949- active. set_pinned ( false ) ;
950- save_managed_skill ( & profile_root, & active) . await . unwrap ( ) ;
951- stage_managed_skill_archive ( & profile_root, "repo-hygiene" , & base_checksum, None )
952- . await
953- . unwrap ( ) ;
954- let err = stage_managed_skill_archive ( & profile_root, "repo-hygiene" , & base_checksum, None )
955- . await
956- . unwrap_err ( ) ;
957- assert ! ( err. to_string( ) . contains( "already has a pending update" ) ) ;
958-
959- // Already-archived skills cannot be staged for archive again.
960- discard_pending_managed_skill_update ( & profile_root, "repo-hygiene" )
961- . await
962- . unwrap ( ) ;
963- let archived = archive_managed_skill ( & profile_root, "repo-hygiene" )
964- . await
965- . unwrap ( ) ;
966- let err = stage_managed_skill_archive (
967- & profile_root,
968- "repo-hygiene" ,
969- & archived. metadata . checksum ,
970- None ,
971- )
972- . await
973- . unwrap_err ( ) ;
974- assert ! ( err. to_string( ) . contains( "is already archived" ) ) ;
975- }
976-
977840#[ tokio:: test]
978841async fn staged_managed_skill_update_rejects_no_op_patch ( ) {
979842 let temp = tempfile:: tempdir ( ) . unwrap ( ) ;
0 commit comments