@@ -333,6 +333,79 @@ assert.strictEqual(taskAutoBlockProjection.automatic, false)
333333assert . match ( taskAutoBlockProjection . message , / 不 能 自 动 续 批 / )
334334assert . strictEqual ( projectAutoCheckpointDecision ( { } ) . decisionDigest , null )
335335
336+ function invalidValidationControlIntent ( overrides = { } , binding = null , options = { } ) {
337+ const intent = { ...clone ( tasklessAutoIntent ) , ...overrides }
338+ return ! validateValidationControlIngressIntent ( intent , binding , options ) . valid
339+ }
340+
341+ expectNegative ( 'validation-control-intent-non-object' , ( ) => ! validateValidationControlIngressIntent ( null ) . valid )
342+ expectNegative ( 'validation-control-intent-array' , ( ) => ! validateValidationControlIngressIntent ( [ ] ) . valid )
343+ expectNegative ( 'validation-control-intent-schema' , ( ) => invalidValidationControlIntent ( {
344+ schemaVersion : 'ValidationControlIngressIntentV0'
345+ } ) )
346+ expectNegative ( 'validation-control-intent-required-field' , ( ) => invalidValidationControlIntent ( { envelopeId : '' } ) )
347+ expectNegative ( 'validation-control-intent-digest-shape' , ( ) => invalidValidationControlIntent ( { envelopeDigest : 'invalid' } ) )
348+ expectNegative ( 'validation-control-intent-mode' , ( ) => invalidValidationControlIntent ( { executionMode : 'manual' } ) )
349+ expectNegative ( 'validation-control-intent-action' , ( ) => invalidValidationControlIntent ( { action : 'execute' } ) )
350+ expectNegative ( 'validation-control-intent-authority-kind' , ( ) => invalidValidationControlIntent ( { authorityKind : 'model' } ) )
351+ expectNegative ( 'validation-control-intent-budget-digest-shape' , ( ) => invalidValidationControlIntent ( {
352+ requestedBudgetDigest : 'invalid'
353+ } ) )
354+ expectNegative ( 'validation-control-intent-path-count-shape' , ( ) => invalidValidationControlIntent ( {
355+ declaredChangedPathCount : 0
356+ } ) )
357+ expectNegative ( 'validation-control-intent-budget-digest-unexpected' , ( ) => invalidValidationControlIntent ( {
358+ action : 'none' ,
359+ authorityKind : 'none' ,
360+ requestedBudgetDigest : 'a' . repeat ( 64 )
361+ } ) )
362+ expectNegative ( 'validation-control-intent-path-count-unexpected' , ( ) => invalidValidationControlIntent ( {
363+ action : 'none' ,
364+ authorityKind : 'none' ,
365+ declaredChangedPathCount : 2
366+ } ) )
367+ expectNegative ( 'validation-control-intent-confirm-authority' , ( ) => invalidValidationControlIntent ( {
368+ action : 'confirm-current-budget' ,
369+ authorityKind : 'none'
370+ } ) )
371+ expectNegative ( 'validation-control-intent-auto-authority' , ( ) => invalidValidationControlIntent ( { authorityKind : 'none' } ) )
372+ expectNegative ( 'validation-control-intent-authority-unexpected' , ( ) => invalidValidationControlIntent ( {
373+ action : 'none' ,
374+ authorityKind : 'auto'
375+ } ) )
376+ expectNegative ( 'validation-control-intent-revoke-flag' , ( ) => invalidValidationControlIntent ( {
377+ action : 'revoke' ,
378+ authorityKind : 'none'
379+ } ) )
380+ expectNegative ( 'validation-control-intent-non-revoke-flag' , ( ) => invalidValidationControlIntent ( {
381+ revocationRequested : true
382+ } ) )
383+ expectNegative ( 'validation-control-intent-ceiling' , ( ) => invalidValidationControlIntent ( {
384+ authorityCeiling : 'V2'
385+ } ) )
386+ expectNegative ( 'validation-control-intent-time-order' , ( ) => invalidValidationControlIntent ( {
387+ expiresAt : tasklessAutoIntent . issuedAt
388+ } ) )
389+ expectNegative ( 'validation-control-intent-root' , ( ) => invalidValidationControlIntent ( { projectRootIdentity : null } ) )
390+ expectNegative ( 'validation-control-intent-root-schema' , ( ) => invalidValidationControlIntent ( {
391+ projectRootIdentity : { ...validationRootIdentity , schemaVersion : 'ProjectRootIdentityV0' }
392+ } ) )
393+ expectNegative ( 'validation-control-intent-digest' , ( ) => invalidValidationControlIntent ( {
394+ intentDigest : '0' . repeat ( 64 )
395+ } ) )
396+ expectNegative ( 'validation-control-intent-binding' , ( ) => invalidValidationControlIntent ( { } , {
397+ envelopeId : 'other-envelope' ,
398+ envelopeDigest : '0' . repeat ( 64 ) ,
399+ sourceMessageDigest : '1' . repeat ( 64 ) ,
400+ hostSessionDigest : '2' . repeat ( 64 ) ,
401+ contextEpoch : 'ctx-other' ,
402+ project : 'other' ,
403+ projectRootIdentity : { ...validationRootIdentity , digest : '3' . repeat ( 64 ) }
404+ } ) )
405+ expectNegative ( 'validation-control-intent-expired' , ( ) => invalidValidationControlIntent ( { } , null , {
406+ now : Date . parse ( tasklessAutoIntent . expiresAt ) + 1
407+ } ) )
408+
336409function invalidValidationControl ( overrides = { } , binding = null , options = { } ) {
337410 const receipt = { ...clone ( confirmControl ) , ...overrides }
338411 return ! validateValidationControlIngressReceipt ( receipt , binding , options ) . valid
0 commit comments