@ -532,7 +532,7 @@ class AdminToolManagementServiceTests(unittest.TestCase):
self . assertEqual ( len ( self . draft_repository . drafts ) , 1 )
self . assertEqual ( len ( self . version_repository . versions ) , 2 )
self . assertEqual ( len ( self . metadata_repository . metadata_entries ) , 2 )
self . assertEqual ( len ( self . artifact_repository . artifacts ) , 4 )
self . assertEqual ( len ( self . artifact_repository . artifacts ) , 6 )
self . assertEqual ( self . draft_repository . drafts [ 0 ] . current_version_number , 2 )
self . assertEqual ( self . draft_repository . drafts [ 0 ] . version_count , 2 )
self . assertEqual ( self . draft_repository . drafts [ 0 ] . owner_display_name , " Coordenacao de Locacao " )
@ -672,6 +672,638 @@ class AdminToolManagementServiceTests(unittest.TestCase):
self . assertEqual ( payload [ " items " ] [ 0 ] [ " gate " ] , " generation_pipeline_required " )
self . assertIn ( ToolLifecycleStatus . APPROVED , payload [ " supported_statuses " ] )
def test_collaborator_draft_requires_director_authorization_before_generation ( self ) :
intake_payload = self . service . create_draft_submission (
{
" domain " : " revisao " ,
" tool_name " : " consultar_revisao_aberta " ,
" display_name " : " Consultar revisao aberta " ,
" description " : " Consulta revisoes abertas com filtros administrativos para a oficina. " ,
" business_goal " : " Ajudar o time a localizar revisoes abertas com mais contexto operacional. " ,
" parameters " : [ ] ,
} ,
owner_staff_account_id = 8 ,
owner_name = " Operacao de Oficina " ,
owner_role = StaffRole . COLABORADOR ,
)
payload = self . service . build_review_queue_payload ( )
self . assertEqual ( payload [ " items " ] [ 0 ] [ " version_id " ] , intake_payload [ " draft_preview " ] [ " version_id " ] )
self . assertEqual ( payload [ " items " ] [ 0 ] [ " gate " ] , " generation_decision_required " )
detail = self . service . build_review_detail_payload ( intake_payload [ " draft_preview " ] [ " version_id " ] )
self . assertEqual ( detail [ " human_gate " ] [ " current_gate " ] , " generation_decision_required " )
self . assertTrue ( detail [ " human_gate " ] [ " authorize_generation_action_available " ] )
self . assertFalse ( detail [ " human_gate " ] [ " run_pipeline_action_available " ] )
transition = self . service . authorize_generation (
intake_payload [ " draft_preview " ] [ " version_id " ] ,
actor_staff_account_id = 99 ,
actor_name = " Diretoria " ,
actor_role = StaffRole . DIRETOR ,
decision_notes = " A proposta esta alinhada e pode consumir a etapa de geracao governada. " ,
)
self . assertEqual ( transition [ " status " ] , ToolLifecycleStatus . DRAFT )
self . assertEqual ( transition [ " queue_entry " ] [ " gate " ] , " generation_pipeline_required " )
detail_after_authorization = self . service . build_review_detail_payload ( intake_payload [ " draft_preview " ] [ " version_id " ] )
self . assertTrue ( detail_after_authorization [ " human_gate " ] [ " run_pipeline_action_available " ] )
def test_request_changes_returns_generated_version_to_draft_with_changes_gate ( self ) :
intake_payload = self . service . create_draft_submission (
{
" domain " : " revisao " ,
" tool_name " : " consultar_revisao_aberta " ,
" display_name " : " Consultar revisao aberta " ,
" description " : " Consulta revisoes abertas com filtros administrativos para a oficina. " ,
" business_goal " : " Ajudar o time a localizar revisoes abertas com mais contexto operacional. " ,
" parameters " : [ ] ,
} ,
owner_staff_account_id = 8 ,
owner_name = " Operacao de Oficina " ,
)
version_id = intake_payload [ " draft_preview " ] [ " version_id " ]
self . service . run_generation_pipeline (
version_id ,
runner_staff_account_id = 8 ,
runner_name = " Operacao de Oficina " ,
runner_role = StaffRole . COLABORADOR ,
)
payload = self . service . request_changes (
version_id ,
actor_staff_account_id = 99 ,
actor_name = " Diretoria " ,
actor_role = StaffRole . DIRETOR ,
decision_notes = " A proposta precisa ajustar o codigo e a estrutura antes de nova validacao. " ,
)
self . assertEqual ( payload [ " status " ] , ToolLifecycleStatus . DRAFT )
self . assertEqual ( payload [ " queue_entry " ] [ " gate " ] , " changes_requested " )
detail = self . service . build_review_detail_payload ( version_id )
self . assertEqual ( detail [ " human_gate " ] [ " current_gate " ] , " changes_requested " )
self . assertTrue ( detail [ " human_gate " ] [ " run_pipeline_action_available " ] )
self . assertEqual ( detail [ " decision_history " ] [ - 1 ] [ " action_key " ] , ToolArtifactKind . GENERATION_CHANGE_REQUEST . value )
def test_close_proposal_archives_generated_version_without_notes ( self ) :
intake_payload = self . service . create_draft_submission (
{
" domain " : " revisao " ,
" tool_name " : " consultar_revisao_aberta " ,
" display_name " : " Consultar revisao aberta " ,
" description " : " Consulta revisoes abertas com filtros administrativos para a oficina. " ,
" business_goal " : " Ajudar o time a localizar revisoes abertas com mais contexto operacional. " ,
" parameters " : [ ] ,
} ,
owner_staff_account_id = 8 ,
owner_name = " Operacao de Oficina " ,
)
version_id = intake_payload [ " draft_preview " ] [ " version_id " ]
self . service . run_generation_pipeline (
version_id ,
runner_staff_account_id = 8 ,
runner_name = " Operacao de Oficina " ,
runner_role = StaffRole . COLABORADOR ,
)
payload = self . service . close_proposal (
version_id ,
actor_staff_account_id = 99 ,
actor_name = " Diretoria " ,
actor_role = StaffRole . DIRETOR ,
decision_notes = None ,
)
self . assertEqual ( payload [ " status " ] , ToolLifecycleStatus . ARCHIVED )
self . assertEqual ( payload [ " queue_entry " ] [ " gate " ] , " archived_history " )
detail = self . service . build_review_detail_payload ( version_id )
self . assertFalse ( detail [ " human_gate " ] [ " close_proposal_action_available " ] )
self . assertEqual ( detail [ " decision_history " ] [ - 1 ] [ " action_key " ] , ToolArtifactKind . PROPOSAL_CLOSURE . value )
self . assertIsNone ( detail [ " decision_history " ] [ - 1 ] [ " decision_notes " ] )
def test_rerun_generation_after_change_request_tracks_new_iteration_without_new_version ( self ) :
intake_payload = self . service . create_draft_submission (
{
" domain " : " revisao " ,
" tool_name " : " consultar_revisao_aberta " ,
" display_name " : " Consultar revisao aberta " ,
" description " : " Consulta revisoes abertas com filtros administrativos para a oficina. " ,
" business_goal " : " Ajudar o time a localizar revisoes abertas com mais contexto operacional. " ,
" parameters " : [
{
" name " : " placa " ,
" parameter_type " : " string " ,
" description " : " Placa usada na busca da revisao. " ,
" required " : True ,
}
] ,
} ,
owner_staff_account_id = 8 ,
owner_name = " Operacao de Oficina " ,
owner_role = StaffRole . COLABORADOR ,
)
version_id = intake_payload [ " draft_preview " ] [ " version_id " ]
version_number = intake_payload [ " draft_preview " ] [ " version_number " ]
self . service . authorize_generation (
version_id ,
actor_staff_account_id = 99 ,
actor_name = " Diretoria " ,
actor_role = StaffRole . DIRETOR ,
decision_notes = " A proposta pode consumir a primeira geracao governada. " ,
)
self . service . run_generation_pipeline (
version_id ,
runner_staff_account_id = 8 ,
runner_name = " Operacao de Oficina " ,
runner_role = StaffRole . COLABORADOR ,
)
feedback_notes = " Ajuste o retorno para destacar o resumo operacional e preserve a assinatura atual. "
self . service . request_changes (
version_id ,
actor_staff_account_id = 99 ,
actor_name = " Diretoria " ,
actor_role = StaffRole . DIRETOR ,
decision_notes = feedback_notes ,
)
second_generation = self . service . run_generation_pipeline (
version_id ,
runner_staff_account_id = 8 ,
runner_name = " Operacao de Oficina " ,
runner_role = StaffRole . COLABORADOR ,
)
self . assertEqual ( second_generation [ " version_id " ] , version_id )
self . assertEqual ( second_generation [ " version_number " ] , version_number )
self . assertEqual ( second_generation [ " status " ] , ToolLifecycleStatus . GENERATED )
generation_artifact = next (
artifact
for artifact in self . artifact_repository . artifacts
if artifact . artifact_kind == ToolArtifactKind . GENERATION_REQUEST
)
self . assertEqual ( generation_artifact . payload_json [ " generation_iteration " ] , 2 )
self . assertEqual ( generation_artifact . payload_json [ " generation_mode " ] , " change_request_refinement " )
self . assertEqual ( generation_artifact . payload_json [ " feedback_notes " ] , feedback_notes )
self . assertEqual ( len ( generation_artifact . payload_json [ " generation_iterations " ] ) , 2 )
self . assertEqual (
generation_artifact . payload_json [ " generation_iterations " ] [ - 1 ] [ " generation_iteration " ] ,
2 ,
)
validation_artifact = next (
artifact
for artifact in self . artifact_repository . artifacts
if artifact . artifact_kind == ToolArtifactKind . VALIDATION_REPORT
)
self . assertEqual ( validation_artifact . payload_json [ " generation_iteration " ] , 2 )
self . assertEqual ( validation_artifact . payload_json [ " generation_mode " ] , " change_request_refinement " )
self . assertEqual ( validation_artifact . payload_json [ " change_request_notes " ] , feedback_notes )
self . assertEqual ( len ( validation_artifact . payload_json [ " validation_iterations " ] ) , 2 )
self . assertEqual (
validation_artifact . payload_json [ " validation_iterations " ] [ - 1 ] [ " generation_iteration " ] ,
2 ,
)
def test_review_detail_and_runtime_snapshot_recover_legacy_generated_source_from_metadata ( self ) :
intake_payload = self . service . create_draft_submission (
{
" domain " : " locacao " ,
" tool_name " : " emitir_resumo_locacao " ,
" display_name " : " Emitir resumo de locacao " ,
" description " : " Resume contratos de locacao com filtros operacionais para o time interno. " ,
" business_goal " : " Dar visibilidade rapida aos contratos e aos principais dados da locacao. " ,
" parameters " : [
{
" name " : " contrato_id " ,
" parameter_type " : " string " ,
" description " : " Identificador do contrato consultado. " ,
" required " : True ,
}
] ,
} ,
owner_staff_account_id = 7 ,
owner_name = " Equipe Interna " ,
owner_role = StaffRole . COLABORADOR ,
)
version_id = intake_payload [ " draft_preview " ] [ " version_id " ]
self . service . authorize_generation (
version_id ,
actor_staff_account_id = 99 ,
actor_name = " Diretoria " ,
actor_role = StaffRole . DIRETOR ,
decision_notes = " A proposta foi autorizada para gerar codigo governado. " ,
)
self . service . run_generation_pipeline (
version_id ,
runner_staff_account_id = 7 ,
runner_name = " Equipe Interna " ,
runner_role = StaffRole . COLABORADOR ,
)
self . service . review_version (
version_id ,
reviewer_staff_account_id = 99 ,
reviewer_name = " Diretoria " ,
reviewer_role = StaffRole . DIRETOR ,
decision_notes = " Revisao humana concluida para publicar a iteracao legada. " ,
reviewed_generated_code = True ,
)
self . service . approve_version (
version_id ,
approver_staff_account_id = 99 ,
approver_name = " Diretoria " ,
approver_role = StaffRole . DIRETOR ,
decision_notes = " Aprovacao final registrada para publicacao governada. " ,
)
version = self . version_repository . get_by_version_id ( version_id )
validation_artifact = self . artifact_repository . get_by_tool_version_and_kind (
version . id ,
ToolArtifactKind . VALIDATION_REPORT ,
)
generation_artifact = self . artifact_repository . get_by_tool_version_and_kind (
version . id ,
ToolArtifactKind . GENERATION_REQUEST ,
)
validation_payload = dict ( validation_artifact . payload_json or { } )
validation_payload . pop ( " generated_source_code " , None )
validation_payload . pop ( " generated_source_checksum " , None )
validation_artifact . payload_json = validation_payload
generation_payload = dict ( generation_artifact . payload_json or { } )
generation_payload . pop ( " generation_iterations " , None )
generation_payload . pop ( " latest_generation " , None )
generation_payload . pop ( " generation_mode " , None )
generation_artifact . payload_json = generation_payload
detail = self . service . build_review_detail_payload ( version_id )
self . assertIn ( " async def run " , detail [ " generated_source_code " ] )
self . assertEqual ( detail [ " generation_context " ] [ " latest_generation_mode " ] , " legacy_generation " )
self . assertTrue ( self . service . _version_has_generated_source ( version_id ) )
import shutil
from pathlib import Path
sandbox_root = Path . cwd ( ) / " .tmp_test_admin_legacy_runtime_snapshot "
shutil . rmtree ( sandbox_root , ignore_errors = True )
package_dir = sandbox_root / GENERATED_TOOLS_PACKAGE
manifest_path = package_dir / " published_runtime_tools.json "
def build_file_path ( tool_name : str ) :
return package_dir / f " { tool_name } .py "
try :
with patch (
" admin_app.services.tool_management_service.get_generated_tools_runtime_dir " ,
return_value = package_dir ,
) , patch (
" admin_app.services.tool_management_service.get_generated_tool_publication_manifest_path " ,
return_value = manifest_path ,
) , patch (
" admin_app.services.tool_management_service.build_generated_tool_file_path " ,
side_effect = build_file_path ,
) :
payload = self . service . publish_version (
version_id ,
publisher_staff_account_id = 99 ,
publisher_name = " Diretoria " ,
publisher_role = StaffRole . DIRETOR ,
)
self . assertEqual ( payload [ " status " ] , ToolLifecycleStatus . ACTIVE )
self . assertTrue ( build_file_path ( " emitir_resumo_locacao " ) . exists ( ) )
self . assertIn (
" async def run " ,
build_file_path ( " emitir_resumo_locacao " ) . read_text ( encoding = " utf-8 " ) ,
)
finally :
shutil . rmtree ( sandbox_root , ignore_errors = True )
def test_failed_generation_without_validation_does_not_reconstruct_legacy_source ( self ) :
class _FailingGenerationService :
async def generate_tool_source ( self , * * kwargs ) :
return {
" generated_source_code " : None ,
" generation_model_used " : " gemini-3-pro-preview " ,
" issues " : [ " Vertex AI indisponivel para gerar o codigo nesta tentativa. " ] ,
" prompt_rendered " : " prompt de geracao com falha " ,
" elapsed_ms " : 17.0 ,
}
self . service . tool_generation_service = _FailingGenerationService ( )
intake_payload = self . service . create_draft_submission (
{
" domain " : " revisao " ,
" tool_name " : " consultar_revisao_aberta " ,
" display_name " : " Consultar revisao aberta " ,
" description " : " Consulta revisoes abertas com filtros administrativos para a oficina. " ,
" business_goal " : " Ajudar o time a localizar revisoes abertas com mais contexto operacional. " ,
" parameters " : [ ] ,
} ,
owner_staff_account_id = 8 ,
owner_name = " Operacao de Oficina " ,
owner_role = StaffRole . COLABORADOR ,
)
version_id = intake_payload [ " draft_preview " ] [ " version_id " ]
self . service . authorize_generation (
version_id ,
actor_staff_account_id = 99 ,
actor_name = " Diretoria " ,
actor_role = StaffRole . DIRETOR ,
decision_notes = " A proposta pode seguir para geracao governada apos triagem inicial. " ,
)
payload = self . service . run_generation_pipeline (
version_id ,
runner_staff_account_id = 8 ,
runner_name = " Operacao de Oficina " ,
runner_role = StaffRole . COLABORADOR ,
)
self . assertEqual ( payload [ " status " ] , ToolLifecycleStatus . FAILED )
detail = self . service . build_review_detail_payload ( version_id )
self . assertEqual ( detail [ " generated_source_code " ] , " " )
self . assertFalse ( detail [ " generation_context " ] [ " has_previous_generation " ] )
self . assertFalse ( self . service . _version_has_generated_source ( version_id ) )
version = self . version_repository . get_by_version_id ( version_id )
with self . assertRaisesRegex ( RuntimeError , " codigo gerado " ) :
self . service . _get_generated_source_code_for_version ( version . id )
def test_publish_allows_legacy_single_iteration_review_and_approval_metadata ( self ) :
intake_payload = self . service . create_draft_submission (
{
" domain " : " revisao " ,
" tool_name " : " consultar_revisao_aberta " ,
" display_name " : " Consultar revisao aberta " ,
" description " : " Consulta revisoes abertas com filtros administrativos para a oficina. " ,
" business_goal " : " Ajudar o time a localizar revisoes abertas com mais contexto operacional. " ,
" parameters " : [ ] ,
} ,
owner_staff_account_id = 99 ,
owner_name = " Diretoria " ,
owner_role = StaffRole . DIRETOR ,
)
version_id = intake_payload [ " draft_preview " ] [ " version_id " ]
version = self . version_repository . get_by_version_id ( version_id )
self . service . run_generation_pipeline (
version_id ,
runner_staff_account_id = 99 ,
runner_name = " Diretoria " ,
runner_role = StaffRole . DIRETOR ,
)
self . service . review_version (
version_id ,
reviewer_staff_account_id = 99 ,
reviewer_name = " Diretoria " ,
reviewer_role = StaffRole . DIRETOR ,
decision_notes = " Revisao humana registrada antes da migracao do contexto de iteracao. " ,
reviewed_generated_code = True ,
)
self . service . approve_version (
version_id ,
approver_staff_account_id = 99 ,
approver_name = " Diretoria " ,
approver_role = StaffRole . DIRETOR ,
decision_notes = " Aprovacao humana registrada antes da migracao do contexto de iteracao. " ,
)
generation_artifact = self . artifact_repository . get_by_tool_version_and_kind ( version . id , ToolArtifactKind . GENERATION_REQUEST )
validation_artifact = self . artifact_repository . get_by_tool_version_and_kind ( version . id , ToolArtifactKind . VALIDATION_REPORT )
review_artifact = self . artifact_repository . get_by_tool_version_and_kind ( version . id , ToolArtifactKind . DIRECTOR_REVIEW )
approval_artifact = self . artifact_repository . get_by_tool_version_and_kind ( version . id , ToolArtifactKind . DIRECTOR_APPROVAL )
generation_payload = dict ( generation_artifact . payload_json or { } )
generation_payload . pop ( " generation_iterations " , None )
generation_payload . pop ( " latest_generation " , None )
generation_payload . pop ( " generation_mode " , None )
generation_artifact . payload_json = generation_payload
validation_payload = dict ( validation_artifact . payload_json or { } )
validation_payload . pop ( " validation_iterations " , None )
validation_payload . pop ( " latest_validation " , None )
validation_payload . pop ( " generation_mode " , None )
validation_artifact . payload_json = validation_payload
review_payload = dict ( review_artifact . payload_json or { } )
review_payload . pop ( " reviewed_generation_iteration " , None )
review_payload . pop ( " reviewed_generation_mode " , None )
review_payload . pop ( " reviewed_generation_checksum " , None )
review_artifact . payload_json = review_payload
approval_payload = dict ( approval_artifact . payload_json or { } )
approval_payload . pop ( " approved_generation_iteration " , None )
approval_payload . pop ( " approved_generation_mode " , None )
approval_payload . pop ( " approved_generation_checksum " , None )
approval_artifact . payload_json = approval_payload
payload = self . service . publish_version (
version_id ,
publisher_staff_account_id = 99 ,
publisher_name = " Diretoria " ,
publisher_role = StaffRole . DIRETOR ,
)
self . assertEqual ( payload [ " status " ] , ToolLifecycleStatus . ACTIVE )
self . assertEqual ( payload [ " version_id " ] , version_id )
def test_rollback_allows_legacy_single_iteration_review_and_approval_metadata ( self ) :
first_intake = self . service . create_draft_submission (
{
" domain " : " vendas " ,
" tool_name " : " consultar_funil_comercial " ,
" display_name " : " Consultar funil comercial " ,
" description " : " Consulta o funil comercial consolidado para acompanhamento administrativo. " ,
" business_goal " : " Dar visibilidade ao time interno sobre os principais gargalos do funil. " ,
" parameters " : [ ] ,
} ,
owner_staff_account_id = 7 ,
owner_name = " Equipe Interna " ,
)
first_version_id = first_intake [ " draft_preview " ] [ " version_id " ]
self . service . run_generation_pipeline ( first_version_id , runner_staff_account_id = 7 , runner_name = " Equipe Interna " , runner_role = StaffRole . COLABORADOR )
self . service . review_version (
first_version_id ,
reviewer_staff_account_id = 99 ,
reviewer_name = " Diretoria " ,
reviewer_role = StaffRole . DIRETOR ,
decision_notes = " Primeira versao revisada antes da migracao do contexto de iteracao. " ,
reviewed_generated_code = True ,
)
self . service . approve_version (
first_version_id ,
approver_staff_account_id = 99 ,
approver_name = " Diretoria " ,
approver_role = StaffRole . DIRETOR ,
decision_notes = " Primeira versao aprovada antes da migracao do contexto de iteracao. " ,
)
self . service . publish_version ( first_version_id , publisher_staff_account_id = 99 , publisher_name = " Diretoria " , publisher_role = StaffRole . DIRETOR )
first_version = self . version_repository . get_by_version_id ( first_version_id )
generation_artifact = self . artifact_repository . get_by_tool_version_and_kind ( first_version . id , ToolArtifactKind . GENERATION_REQUEST )
validation_artifact = self . artifact_repository . get_by_tool_version_and_kind ( first_version . id , ToolArtifactKind . VALIDATION_REPORT )
review_artifact = self . artifact_repository . get_by_tool_version_and_kind ( first_version . id , ToolArtifactKind . DIRECTOR_REVIEW )
approval_artifact = self . artifact_repository . get_by_tool_version_and_kind ( first_version . id , ToolArtifactKind . DIRECTOR_APPROVAL )
generation_payload = dict ( generation_artifact . payload_json or { } )
generation_payload . pop ( " generation_iterations " , None )
generation_payload . pop ( " latest_generation " , None )
generation_payload . pop ( " generation_mode " , None )
generation_artifact . payload_json = generation_payload
validation_payload = dict ( validation_artifact . payload_json or { } )
validation_payload . pop ( " validation_iterations " , None )
validation_payload . pop ( " latest_validation " , None )
validation_payload . pop ( " generation_mode " , None )
validation_artifact . payload_json = validation_payload
review_payload = dict ( review_artifact . payload_json or { } )
review_payload . pop ( " reviewed_generation_iteration " , None )
review_payload . pop ( " reviewed_generation_mode " , None )
review_payload . pop ( " reviewed_generation_checksum " , None )
review_artifact . payload_json = review_payload
approval_payload = dict ( approval_artifact . payload_json or { } )
approval_payload . pop ( " approved_generation_iteration " , None )
approval_payload . pop ( " approved_generation_mode " , None )
approval_payload . pop ( " approved_generation_checksum " , None )
approval_artifact . payload_json = approval_payload
second_intake = self . service . create_draft_submission (
{
" domain " : " vendas " ,
" tool_name " : " consultar_funil_comercial " ,
" display_name " : " Consultar funil comercial " ,
" description " : " Consulta o funil comercial consolidado com novos filtros administrativos. " ,
" business_goal " : " Dar visibilidade ao time interno sobre gargalos do funil com cortes adicionais. " ,
" parameters " : [ ] ,
} ,
owner_staff_account_id = 7 ,
owner_name = " Equipe Interna " ,
)
second_version_id = second_intake [ " draft_preview " ] [ " version_id " ]
self . service . run_generation_pipeline ( second_version_id , runner_staff_account_id = 7 , runner_name = " Equipe Interna " , runner_role = StaffRole . COLABORADOR )
self . service . review_version (
second_version_id ,
reviewer_staff_account_id = 99 ,
reviewer_name = " Diretoria " ,
reviewer_role = StaffRole . DIRETOR ,
decision_notes = " Segunda versao revisada para substituir a publicacao anterior. " ,
reviewed_generated_code = True ,
)
self . service . approve_version (
second_version_id ,
approver_staff_account_id = 99 ,
approver_name = " Diretoria " ,
approver_role = StaffRole . DIRETOR ,
decision_notes = " Segunda versao aprovada para substituir a publicacao anterior. " ,
)
self . service . publish_version ( second_version_id , publisher_staff_account_id = 99 , publisher_name = " Diretoria " , publisher_role = StaffRole . DIRETOR )
payload = self . service . rollback_version (
second_version_id ,
actor_staff_account_id = 99 ,
actor_name = " Diretoria " ,
actor_role = StaffRole . DIRETOR ,
decision_notes = " Rollback compativel com artefatos legados de revisao e aprovacao. " ,
)
self . assertEqual ( payload [ " status " ] , ToolLifecycleStatus . ACTIVE )
self . assertEqual ( payload [ " version_id " ] , first_version_id )
def test_publish_requires_review_and_approval_for_latest_generation_iteration ( self ) :
intake_payload = self . service . create_draft_submission (
{
" domain " : " revisao " ,
" tool_name " : " consultar_revisao_aberta " ,
" display_name " : " Consultar revisao aberta " ,
" description " : " Consulta revisoes abertas com filtros administrativos para a oficina. " ,
" business_goal " : " Ajudar o time a localizar revisoes abertas com mais contexto operacional. " ,
" parameters " : [
{
" name " : " placa " ,
" parameter_type " : " string " ,
" description " : " Placa usada na busca da revisao. " ,
" required " : True ,
}
] ,
} ,
owner_staff_account_id = 99 ,
owner_name = " Diretoria " ,
owner_role = StaffRole . DIRETOR ,
)
version_id = intake_payload [ " draft_preview " ] [ " version_id " ]
version = self . version_repository . get_by_version_id ( version_id )
draft = self . draft_repository . get_by_tool_name ( " consultar_revisao_aberta " )
metadata = self . metadata_repository . get_by_tool_version_id ( version . id )
self . service . run_generation_pipeline (
version_id ,
runner_staff_account_id = 99 ,
runner_name = " Diretoria " ,
runner_role = StaffRole . DIRETOR ,
)
review_payload = self . service . review_version (
version_id ,
reviewer_staff_account_id = 99 ,
reviewer_name = " Diretoria " ,
reviewer_role = StaffRole . DIRETOR ,
decision_notes = " Revisao inicial completa do codigo governado. " ,
reviewed_generated_code = True ,
)
approve_payload = self . service . approve_version (
version_id ,
approver_staff_account_id = 99 ,
approver_name = " Diretoria " ,
approver_role = StaffRole . DIRETOR ,
decision_notes = " Aprovacao inicial completa da versao governada. " ,
)
self . assertEqual ( review_payload [ " status " ] , ToolLifecycleStatus . VALIDATED )
self . assertEqual ( approve_payload [ " status " ] , ToolLifecycleStatus . APPROVED )
self . service . _persist_generation_pipeline_artifact (
draft = draft ,
version = version ,
actor_staff_account_id = 99 ,
actor_name = " Diretoria " ,
actor_role = StaffRole . DIRETOR ,
llm_generated_source = None ,
llm_generation_model = None ,
llm_generation_issues = [ ] ,
generation_iteration = 2 ,
generation_mode = " change_request_refinement " ,
feedback_notes = " Foi identificada uma nova iteracao tecnica apos a aprovacao inicial. " ,
previous_source_checksum = self . service . _compute_source_checksum (
self . service . _get_generated_source_code_for_version ( version . id )
) ,
prompt_rendered = " prompt de refatoracao tecnica " ,
generation_elapsed_ms = 10.0 ,
commit = None ,
)
self . service . _execute_automated_contract_validation (
draft = draft ,
version = version ,
metadata = metadata ,
actor_staff_account_id = 99 ,
actor_name = " Diretoria " ,
llm_generated_source = None ,
generation_iteration = 2 ,
generation_mode = " change_request_refinement " ,
change_request_notes = " Foi identificada uma nova iteracao tecnica apos a aprovacao inicial. " ,
previous_source_checksum = self . service . _compute_source_checksum (
self . service . _get_generated_source_code_for_version ( version . id )
) ,
commit = None ,
)
with self . assertRaisesRegex ( ValueError , " iteracao mais recente " ) :
self . service . publish_version (
version_id ,
publisher_staff_account_id = 99 ,
publisher_name = " Diretoria " ,
publisher_role = StaffRole . DIRETOR ,
)
def test_run_generation_pipeline_promotes_version_to_generated ( self ) :
intake_payload = self . service . create_draft_submission (
{
@ -694,6 +1326,14 @@ class AdminToolManagementServiceTests(unittest.TestCase):
owner_role = StaffRole . COLABORADOR ,
)
self . service . authorize_generation (
intake_payload [ " draft_preview " ] [ " version_id " ] ,
actor_staff_account_id = 99 ,
actor_name = " Diretoria " ,
actor_role = StaffRole . DIRETOR ,
decision_notes = " A proposta pode seguir para geracao governada apos triagem inicial. " ,
)
payload = self . service . run_generation_pipeline (
intake_payload [ " draft_preview " ] [ " version_id " ] ,
runner_staff_account_id = 8 ,
@ -763,6 +1403,14 @@ class AdminToolManagementServiceTests(unittest.TestCase):
)
self . metadata_repository . metadata_entries [ 0 ] . display_name = " No "
self . service . authorize_generation (
intake_payload [ " draft_preview " ] [ " version_id " ] ,
actor_staff_account_id = 99 ,
actor_name = " Diretoria " ,
actor_role = StaffRole . DIRETOR ,
decision_notes = " A proposta pode seguir para geracao governada apos triagem inicial. " ,
)
payload = self . service . run_generation_pipeline (
intake_payload [ " draft_preview " ] [ " version_id " ] ,
runner_staff_account_id = 8 ,
@ -773,6 +1421,8 @@ class AdminToolManagementServiceTests(unittest.TestCase):
self . assertEqual ( payload [ " status " ] , ToolLifecycleStatus . FAILED )
self . assertEqual ( payload [ " current_step " ] , " generation " )
self . assertEqual ( payload [ " queue_entry " ] [ " gate " ] , " pipeline_retry_required " )
failed_detail = self . service . build_review_detail_payload ( intake_payload [ " draft_preview " ] [ " version_id " ] )
self . assertTrue ( failed_detail [ " human_gate " ] [ " run_pipeline_action_available " ] )
self . assertEqual ( payload [ " queue_entry " ] [ " automated_validation_status " ] , " failed " )
self . assertIn ( " revisar contrato da tool " , payload [ " queue_entry " ] [ " automated_validation_summary " ] . lower ( ) )
automated_checks = { check [ " key " ] : check for check in payload [ " automated_validations " ] }
@ -814,6 +1464,14 @@ class AdminToolManagementServiceTests(unittest.TestCase):
owner_role = StaffRole . COLABORADOR ,
)
self . service . authorize_generation (
intake_payload [ " draft_preview " ] [ " version_id " ] ,
actor_staff_account_id = 99 ,
actor_name = " Diretoria " ,
actor_role = StaffRole . DIRETOR ,
decision_notes = " A proposta pode seguir para geracao governada apos triagem inicial. " ,
)
payload = self . service . run_generation_pipeline (
intake_payload [ " draft_preview " ] [ " version_id " ] ,
runner_staff_account_id = 8 ,
@ -864,6 +1522,14 @@ class AdminToolManagementServiceTests(unittest.TestCase):
" _render_generated_tool_module_source " ,
return_value = " async def run(: \n pass \n " ,
) :
self . service . authorize_generation (
intake_payload [ " draft_preview " ] [ " version_id " ] ,
actor_staff_account_id = 99 ,
actor_name = " Diretoria " ,
actor_role = StaffRole . DIRETOR ,
decision_notes = " A proposta pode seguir para geracao governada apos triagem inicial. " ,
)
payload = self . service . run_generation_pipeline (
intake_payload [ " draft_preview " ] [ " version_id " ] ,
runner_staff_account_id = 8 ,
@ -915,6 +1581,14 @@ class AdminToolManagementServiceTests(unittest.TestCase):
" _render_generated_tool_module_source " ,
return_value = ' async def run(*, placa): \n raise RuntimeError( " smoke test boom " ) \n ' ,
) :
self . service . authorize_generation (
intake_payload [ " draft_preview " ] [ " version_id " ] ,
actor_staff_account_id = 99 ,
actor_name = " Diretoria " ,
actor_role = StaffRole . DIRETOR ,
decision_notes = " A proposta pode seguir para geracao governada apos triagem inicial. " ,
)
payload = self . service . run_generation_pipeline (
intake_payload [ " draft_preview " ] [ " version_id " ] ,
runner_staff_account_id = 8 ,
@ -1100,12 +1774,18 @@ class AdminToolManagementServiceTests(unittest.TestCase):
self . assertEqual ( payload [ " status " ] , ToolLifecycleStatus . APPROVED )
self . assertEqual ( payload [ " human_gate " ] [ " publication_action_available " ] , True )
self . assertEqual ( payload [ " generation_context " ] [ " latest_generation_iteration " ] , 1 )
self . assertEqual ( payload [ " generation_context " ] [ " generation_iterations_count " ] , 1 )
self . assertEqual ( payload [ " generation_context " ] [ " latest_generation_mode " ] , " initial_generation " )
self . assertTrue ( payload [ " generation_context " ] [ " has_previous_generation " ] )
self . assertIsNone ( payload [ " generation_context " ] [ " latest_change_request_notes " ] )
self . assertIn ( " async def run " , payload [ " generated_source_code " ] )
self . assertEqual ( len ( payload [ " automated_validations " ] ) , 4 )
self . assertEqual ( len ( payload [ " decision_history " ] ) , 2 )
self . assertEqual ( payload [ " decision_history " ] [ 0 ] [ " action_key " ] , ToolArtifactKind . DIRECTOR_REVIEW . value )
self . assertTrue ( payload [ " decision_history " ] [ 0 ] [ " reviewed_generated_code " ] )
self . assertIn ( " aprovacao formal " , payload [ " decision_history " ] [ 1 ] [ " decision_notes " ] . lower ( ) )
self . assertEqual ( len ( payload [ " decision_history " ] ) , 3 )
self . assertEqual ( payload [ " decision_history " ] [ 0 ] [ " action_key " ] , ToolArtifactKind . GENERATION_AUTHORIZATION . value )
self . assertEqual ( payload [ " decision_history " ] [ 1 ] [ " action_key " ] , ToolArtifactKind . DIRECTOR_REVIEW . value )
self . assertTrue ( payload [ " decision_history " ] [ 1 ] [ " reviewed_generated_code " ] )
self . assertIn ( " aprovacao formal " , payload [ " decision_history " ] [ 2 ] [ " decision_notes " ] . lower ( ) )
def test_publishing_new_version_archives_previous_active_version ( self ) :
first_intake = self . service . create_draft_submission (
@ -1362,6 +2042,13 @@ class AdminToolManagementTransactionalPersistenceTests(unittest.TestCase):
)
version_id = intake_payload [ " draft_preview " ] [ " version_id " ]
service . authorize_generation (
version_id ,
actor_staff_account_id = 99 ,
actor_name = " Diretoria " ,
actor_role = StaffRole . DIRETOR ,
decision_notes = " A proposta foi autorizada pela diretoria antes da geracao governada. " ,
)
service . run_generation_pipeline (
version_id ,
runner_staff_account_id = 7 ,