agentleFS
stage2devstage2dev/power-platform-skills/skills/power-automate/SKILL.md

power-automate

Skill3 starsChanged 41 days agoMITView on GitHub

Use quando o trabalho envolver flow do Power Automate: desenhar ou revisar um flow chamado pelo app (trigger Power Apps V2, Response de 4 campos, Try/Catch, Switch por ação), cola esse flow no designer (clipboard, escopo colável, allConnectionData), autorização e escopo por unidade dentro do flow, chamar procedure SQL (Execute stored procedure), receber lote de sistema externo por HTTP com token, gravar no Dataverse por $batch/upsert, escopo de log, expressão que estoura em execução (if não curto-circuita, string(null), outputs de Select), contrato tela-flow-procedure, ou verificar um JSON de flow. Não use para a chamada .Run() do lado do app (use `powerapps-canvas`), a procedure e o DDL (use `sql-procedures`), tabelas e Security Role (use `dataverse`), nem ambientes, soluções e connection references em geral (use `power-platform`).

2 other projects use a version of this.

Adopted by

Most recently taken up by

The file

Files
SKILL.md

power-automate

Produz flows do Power Automate coláveis no designer e verificáveis: o escopo JSON com a anatomia padrão (autorizar -> normalizar -> validar -> gravar -> responder, Catch completo), o contrato com a tela, o desenho de SQL, HTTP, $batch e log, e o scripts/verificar-fluxo.py que acusa os defeitos que só estouram em execução. Padrões decididos (F1-F6, C1-C6, A1-A4) estão em decisoes-padrao.md -- esta skill os implementa, não os redefine.

Regras inegociáveis

  1. O flow decide; a procedure executa. O flow normaliza, valida, autoriza e traduz o código da escrita em mensagem. Por quê: regra no cliente é contornável e a conta do conector é compartilhada.
  2. A identidade do chamador vem do contexto (MyProfile_V2), nunca de parâmetro do trigger. Por quê: quem chama por fora da tela diria quem é.
  3. Autorização por ação: cada Caso_<acao> confere a flag da própria ação antes da primeira escrita; zero linha de perfil = negar. Por quê: um portão único antes do Switch deixou quem cadastra encerrar de forma irreversível.
  4. Flag de segurança nasce ligada em CONFIG. Por quê: um escopo por unidade nasceu desligado e qualquer perfil gravou em qualquer unidade.
  5. Resposta sempre com os 4 campos {status, description, id, url} (texto), status em success|warning|error. Por quê: a tela lê ret.url num flow que não exporta.
  6. Todo Nega_* é um par Response + Terminate. Por quê: Response não encerra o flow; o próximo nó roda com a resposta já enviada.
  7. O Catch escuta Failed, TimedOut e Skipped. Por quê: os irmãos do Try (perfil, chamador) falhando deixam o Try Skipped e a execução termina sem Response.
  8. Parâmetros do trigger são posicionais e texto; parâmetro novo entra no fim. Por quê: inserir no meio faz os valores deslizarem e o flow grava o campo errado sem erro.
  9. Escrita em SQL só por Execute stored procedure (V2); nome de procedure e de connection reference vêm do ambiente, nunca do documento. Por quê: Insert/Update row não funciona com trigger no servidor e nomes supostos custaram colagens.
  10. Nenhum nome de ambiente literal fora do CONFIG (servidor, GUID, tabela dev*): variável de ambiente e connection reference. Por quê: promover para produção vira editar o flow.
  11. Protege o argumento, não a condição: if() avalia os dois ramos, e string(null) é ''. Por quê: as duas coisas estouraram em execução, em sítios que "já tinham sido corrigidos".
  12. O arquivo que o designer devolveu é o gabarito; gerador só escreve em dist/. Por quê: regerar sobre o gabarito apagou uma correção que só existia no disco.
  13. Entrada externa por trigger HTTP separado, credencial no cabeçalho, resposta derivada do resultado real da validação. Por quê: uma Condição de constantes deixou o ramo 401 morto.

Fluxo de trabalho

  1. Comece pelo catálogo (assets/componentes/INDICE.md): se existe bloco para a peça, use-o em vez de escrever do zero. Depois classifique a tarefa e carregue só o que ela pede:
TarefaCarregue
Desenhar ou revisar um flow chamado pela telareferences/anatomia-flow.md, references/contrato-app-flow.md, assets/flow-gravar-molde.json
Montar um flow por peças (CONFIG, chamador, Switch, autorizar, gravar, Catch, log, HTTP, $batch…)assets/componentes/INDICE.md — 34 blocos coláveis, cada um validado, com ordem de montagem
Permissão, perfil, escopo por unidadereferences/autorizacao-no-flow.md
Entregar/colar no designer, montar o JSONreferences/formato-clipboard.md, references/gabarito-designer.md
Expressão que falha só em execuçãoreferences/expressoes-wdl-armadilhas.md
Flow que grava em SQLreferences/sql-no-flow.md (a procedure é de sql-procedures)
Receber lote de sistema externoreferences/http-entrada-externa.md, references/dataverse-batch-upsert.md
Criar tabelas e carga mockup no Dataverse pela Web API (flow pronto, $batch)skills/power-platform/references/construtor-dataverse.md (do orquestrador)
Log de execução, suportereferences/log-execucao.md
Gerar flows por script, pipelinereferences/gerador-e-gabarito.md
Documento de contratoassets/contrato-flow-molde.md
Entender de onde veio um padrãoreferences/licoes-de-campo.md
  1. Mapeie antes de escrever: ambiente e idioma do designer; connection references que existem (power-platform); nome AS-BUILT da procedure ou da tabela (sql-procedures, dataverse); quais ações o flow tem e a flag de cada uma; destino do log (ADR).
  2. Escreva o contrato primeiro (assets/contrato-flow-molde.md): chamada, tabela de parâmetros posicionais, autorização por ação, tabela código -> mensagem.
  3. Parta do molde assets/flow-gravar-molde.json: troque <procedure_...>, <prefixo>_... e os nomes de ação; mantenha a estrutura. O trigger é digitado à mão na ordem do contrato (não é colável).
  4. Verifique antes de colar (e de novo no que o designer devolver): python <pasta-da-skill>/scripts/verificar-fluxo.py <arquivo-ou-pasta>.
  5. Cole (Ctrl+V no ponto de inserção do designer, de cima para baixo; o trigger já deve existir), religue as conexões, rode com um usuário de teste sem permissão, um com permissão e um de outra unidade, e confira o histórico.
  6. Devolva o que o designer devolveu ao gabarito (arquivo somente leitura) e, se for gerar, traga as diferenças para o gerador antes do segundo flow (gerador-e-gabarito.md).

Referências

ArquivoQuando ler
references/anatomia-flow.mdAntes de desenhar qualquer flow chamado pela tela; Nega/Terminate e Catch
references/contrato-app-flow.mdTrigger, Response de 4 campos, código -> mensagem, parâmetro novo, job assíncrono
references/autorizacao-no-flow.mdPerfil, flag por ação, escopo por unidade, fail-closed
references/formato-clipboard.mdEnvelopes de escopo e de folha, como colar, allConnectionData, idioma do trigger
references/gabarito-designer.mdR1-R13: o que o designer devolve, o que bloqueia e o que só normaliza
references/expressoes-wdl-armadilhas.mdif(), string(null), outputs() x body(), bit, 8.192 caracteres, @{}
references/sql-no-flow.mdExecute stored procedure (V2), ler o retorno, limites do conector
references/http-entrada-externa.mdTrigger Request, token no cabeçalho, status real, aceite x síncrono, N=1 x lote
references/dataverse-batch-upsert.md$batch, changeset, upsert, 429, paginação
references/log-execucao.mdEscopo Log, tabelas pai/filho, workflow().run.name, tensão com Terminate
references/gerador-e-gabarito.mdGerador seguro, gabarito imutável, round-trip
references/licoes-de-campo.mdDefeitos reais de flows (SQL, HTTP + $batch) e a regra que previne cada um
assets/componentes/INDICE.mdCatálogo de blocos coláveis (.md explicado + .json validado), maturidade e ordem de montagem
assets/flow-gravar-molde.jsonEscopo colável de partida (passa no verificador)
assets/contrato-flow-molde.mdMolde do contrato tela <-> flow <-> procedure

Scripts

<pasta-da-skill> é o Base directory que aparece quando a skill é carregada. Rode da raiz do projeto (o script procura power-platform.config.json do diretório atual para cima) ou passe --config.

ComandoO que checaExit
python <pasta-da-skill>/scripts/verificar-fluxo.py <arquivo|pasta>F001 JSON; F002 envelope; F003/F019 identidade e segmentos do nó; F004 nome duplicado; F005 runAfter órfão; F006 referência a ação inexistente; F007 items(); F008 caso de Switch; F009 Catch sem Skipped; F010 Response sem os 4 campos; F011 outputs() de Select/Query; F012 coalesce(string()); F013 expressão > 8.192; F014 literal de ambiente; F015 Response sem Terminate; F016 condição constante; F017 conexão ausente; F018 @{} em parâmetro; F020 condição de If em texto ou sem and/or; F021 Inicializar variável fora da raiz; F022 variável sozinha num campo colado; F023 Fazer até em texto colado0 sem erro, 1 com erro, 2 uso incorreto
python <pasta-da-skill>/scripts/verificar-fluxo.py --estrito <...>também coalesce(string(x), '') (F012)idem
python <pasta-da-skill>/scripts/verificar-fluxo.py --config <arquivo>usa pastas.flows e ignorar de power-platform.config.jsonidem

Formatos lidos: envelope de escopo e de folha do clipboard (.json, ou .md com só o JSON) e definition de solução exportada. Só lê; saída caminho:ação: ERRO|AVISO Fnnn mensagem.

Definição de pronto

Comandos da raiz do projeto (ver nota em Scripts).

  • python <pasta-da-skill>/scripts/verificar-fluxo.py <flow> -> 0 erro(s) (avisos lidos e justificados no contrato).
  • Contrato do flow preenchido; nº de argumentos do .Run() == nº de parâmetros do trigger.
  • Teste de negação executado: usuário sem a flag da ação recebe error e nada é gravado.
  • Teste de falha de conector: com a connection reference desligada, o app recebe a mensagem do Catch (nunca timeout).
  • Nenhum literal de ambiente fora do CONFIG (F014 limpo ou aviso justificado).
  • O JSON devolvido pelo designer está em gabarito/ (somente leitura) e nenhum gerador escreve sobre ele.
  • Tarefa marcada feita traz a coluna Evidência: comando, saída e data (P2).

Armadilhas

  1. if() não protege a chamada de dentro: proteja o argumento -- expressoes-wdl-armadilhas.md §1.
  2. coalesce(string(x), '0') nunca cai no fallback -- mesmo arquivo, §2.
  3. outputs('Select') devolve o envelope; use body() -- §3.
  4. bit do SQL chega true/false; comparar com 1 ou com o booleano true inverte a regra -- §4.
  5. Caso de Switch com nome de ação derruba a colagem -- anatomia-flow.md §5.
  6. Catch sem Skipped: execução sem Response -- mesmo arquivo, §4.
  7. Response sem Terminate responde duas vezes -- mesmo arquivo, §3.
  8. Ordem mail/userPrincipalName invertida nega todo mundo -- autorizacao-no-flow.md §1.
  9. Rodar o gerador com edição manual no disco apaga a correção -- gerador-e-gabarito.md §2.
  10. 200 antes de gravar sem declarar que é aceite -- http-entrada-externa.md §5.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.