@@ -8,6 +8,7 @@ import {registryAuthoritySourceCheck} from "../../loopx/control_plane/coordinati
88import {
99 claimLocalCoordinationTodo , createLocalCoordinationTodo , updateLocalCoordinationTodo ,
1010 terminalLifecycleLocalCoordinationTodo , pollLocalCoordinationMonitor ,
11+ LOCAL_COORDINATION_TODO_TERMINAL_LIFECYCLE_REQUEST_SCHEMA ,
1112} from "../../loopx/control_plane/coordination/local_authority_runtime.ts" ;
1213
1314test ( "registry witness captures primitive values across awaited request mutation" , async t => {
@@ -30,7 +31,6 @@ test("registry witness captures primitive values across awaited request mutation
3031const wires = [
3132 { invoke : createLocalCoordinationTodo , prefix : "loopx_local_coordination_todo_create_request" , legacy : [ 0 ] , current : 1 } ,
3233 { invoke : claimLocalCoordinationTodo , prefix : "loopx_local_coordination_todo_claim_request" , legacy : [ 0 ] , current : 1 } ,
33- { invoke : terminalLifecycleLocalCoordinationTodo , prefix : "loopx_local_coordination_todo_terminal_lifecycle_request" , legacy : [ 0 ] , current : 1 } ,
3434 { invoke : updateLocalCoordinationTodo , prefix : "loopx_local_coordination_todo_update_request" , legacy : [ 0 , 1 ] , current : 2 } ,
3535 { invoke : pollLocalCoordinationMonitor , prefix : "loopx_coordination_monitor_poll_request" , legacy : [ 0 , 1 ] , current : 2 } ,
3636] ;
@@ -47,3 +47,24 @@ for (const wire of wires) test(`${wire.prefix}: source obligation cannot silentl
4747 assert . match ( String ( result . reason ) , / r e g i s t r y _ s o u r c e / u) ;
4848 }
4949} ) ;
50+
51+ test ( "terminal lifecycle v3 rejects old wires and requires a registry witness" , async ( ) => {
52+ const prefix = "loopx_local_coordination_todo_terminal_lifecycle_request" ;
53+ for ( const version of [ 0 , 1 , 2 ] ) {
54+ const result = await terminalLifecycleLocalCoordinationTodo ( {
55+ schema_version : `${ prefix } _v${ version } ` , registry_source : null ,
56+ } ) ;
57+ assert . equal ( result . status , "failed" ) ;
58+ assert . match ( String ( result . reason ) , / s c h e m a m i s m a t c h / u) ;
59+ }
60+ for ( const source of [ undefined , { } , { path : "relative" , sha256 : "0" . repeat ( 64 ) } ,
61+ { path : "/unused" , sha256 : "invalid" } ] ) {
62+ const result = await terminalLifecycleLocalCoordinationTodo ( {
63+ schema_version : LOCAL_COORDINATION_TODO_TERMINAL_LIFECYCLE_REQUEST_SCHEMA ,
64+ command : "complete" , operation_identity : { kind : "explicit" , operation_id : "source-wire" } ,
65+ registry_source : source ,
66+ } ) ;
67+ assert . equal ( result . status , "failed" ) ;
68+ assert . match ( String ( result . reason ) , / r e g i s t r y _ s o u r c e / u) ;
69+ }
70+ } ) ;
0 commit comments