@andespindola/crow-skills 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,6 +8,8 @@ coordinator records the transition.
8
8
  crow_ledger.py start --title "..." --host claude [--phase id=Título ...] [--session ID] [--global]
9
9
  crow_ledger.py phase ID --run RUN [--title T] [--status running|done|...]
10
10
  crow_ledger.py unit ID --run RUN [--title T] [--phase P] [--owner O] [--status S] [--progress 0..1] [--summary TXT]
11
+ crow_ledger.py resources --run RUN [--from-probe FILE|-] [--mode M] [--agents N] [--heavy N] [--workers N]
12
+ [--pressure L] [--source probe|os|assumed] [--note TXT] # parallelism decision before a fan-out
11
13
  crow_ledger.py finish --run RUN [--status done|failed|cancelled]
12
14
  crow_ledger.py show [--run RUN] # process list for the chat (● main / ○ owner activity)
13
15
  crow_ledger.py show --tree [--run RUN] # phase tree with ASCII bars, when the user asks for detail
@@ -37,6 +39,9 @@ import tempfile
37
39
  SCHEMA = "crow-run/1"
38
40
  UNIT_STATUSES = ("pending", "running", "done", "failed", "skipped")
39
41
  RUN_STATUSES = ("running", "done", "failed", "cancelled")
42
+ RESOURCE_MODES = ("parallel", "reduced", "sequential")
43
+ RESOURCE_LEVELS = ("normal", "warn", "critical", "unknown")
44
+ RESOURCE_SOURCES = ("probe", "os", "assumed")
40
45
 
41
46
 
42
47
  def now():
@@ -146,6 +151,39 @@ def locate(run_id=None, write=False):
146
151
  return best[1], best[2]
147
152
 
148
153
 
154
+ def probe_decision(text):
155
+ """Fields of a resources decision from `crow-skills resources --json` (envelope or bare document)."""
156
+ try:
157
+ data = json.loads(text)
158
+ except ValueError:
159
+ raise SystemExit("crow_ledger: --from-probe não é JSON.")
160
+ if isinstance(data, dict) and isinstance(data.get("data"), dict):
161
+ data = data["data"]
162
+ if not isinstance(data, dict) or data.get("schema") != "crow-resources/1":
163
+ raise SystemExit("crow_ledger: --from-probe não é um documento crow-resources/1.")
164
+ rec = data.get("recommendation") or {}
165
+ return {"mode": rec.get("mode"), "maxParallelAgents": rec.get("maxParallelAgents"),
166
+ "maxParallelHeavyJobs": rec.get("maxParallelHeavyJobs"), "maxWorkersPerJob": rec.get("maxWorkersPerJob"),
167
+ "pressure": (data.get("pressure") or {}).get("level"), "source": "probe"}
168
+
169
+
170
+ def resources_text(data):
171
+ value = data.get("resources")
172
+ if not isinstance(value, dict) or not value.get("mode"):
173
+ return ""
174
+ def count(key):
175
+ number = value.get(key)
176
+ return number if isinstance(number, int) and not isinstance(number, bool) else None
177
+ parts = [clean(value["mode"], 20)]
178
+ if count("maxParallelAgents") is not None:
179
+ parts.append("<=" + str(count("maxParallelAgents")) + " agente(s)")
180
+ if count("maxParallelHeavyJobs") is not None:
181
+ parts.append("<=" + str(count("maxParallelHeavyJobs")) + " job(s) pesado(s)")
182
+ if value.get("pressure"):
183
+ parts.append("pressão " + clean(value["pressure"], 20))
184
+ return "recursos: " + " - ".join(parts) + (" (" + clean(value["note"]) + ")" if value.get("note") else "")
185
+
186
+
149
187
  def bar(fraction, width=20):
150
188
  filled = int(round(max(0.0, min(1.0, fraction)) * width))
151
189
  return "[" + "#" * filled + "-" * (width - filled) + "]"
@@ -203,6 +241,8 @@ def render(data):
203
241
  icons = {"done": "x", "running": ">", "failed": "!", "pending": " ", "skipped": "-"}
204
242
  lines = ["crow > " + clean(data.get("title")) + " [" + data.get("status", "running") + "]",
205
243
  bar(overall) + " " + str(int(overall * 100)) + "% " + str(done) + "/" + str(len(counted)) + " unidades"]
244
+ if resources_text(data):
245
+ lines.append(resources_text(data))
206
246
  phases = data.get("phases", []) or []
207
247
  known = [p.get("id") for p in phases]
208
248
  groups = [(p.get("title") or p.get("id"), [u for u in units if u.get("phase") == p.get("id")]) for p in phases]
@@ -245,6 +285,15 @@ def main(argv=None):
245
285
  unit.add_argument("--status", choices=UNIT_STATUSES)
246
286
  unit.add_argument("--progress", type=float)
247
287
  unit.add_argument("--summary")
288
+ res = sub.add_parser("resources", help="registra a decisão de paralelismo (antes de um fan-out)")
289
+ res.add_argument("--from-probe", help="arquivo com a saída de crow-skills resources --json, ou - para stdin")
290
+ res.add_argument("--mode", choices=RESOURCE_MODES)
291
+ res.add_argument("--agents", type=int, help="máximo de agentes em paralelo decidido")
292
+ res.add_argument("--heavy", type=int, help="máximo de jobs pesados (build, suíte, dev server) em paralelo")
293
+ res.add_argument("--workers", type=int, help="workers por job (-j, --maxWorkers, pytest -n)")
294
+ res.add_argument("--pressure", choices=RESOURCE_LEVELS)
295
+ res.add_argument("--source", choices=RESOURCE_SOURCES, help="probe (crow-skills), os (comandos do sistema) ou assumed")
296
+ res.add_argument("--note", help="uma linha: o que foi decidido e por quê")
248
297
  finish = sub.add_parser("finish")
249
298
  finish.add_argument("--status", choices=RUN_STATUSES[1:], default="done")
250
299
  for name in ("show", "path"):
@@ -253,7 +302,7 @@ def main(argv=None):
253
302
  if name == "show":
254
303
  child.add_argument("--tree", action="store_true", help="árvore de fases com barras, em vez da lista de processos")
255
304
  child.add_argument("--ascii", action="store_true", help="lista de processos só com ASCII")
256
- for child in (phase, unit, finish):
305
+ for child in (phase, unit, res, finish):
257
306
  child.add_argument("--run")
258
307
  args = p.parse_args(argv)
259
308
 
@@ -272,7 +321,7 @@ def main(argv=None):
272
321
  save(path, data)
273
322
  print(run_id + " " + str(path))
274
323
  return 0
275
- path, data = locate(getattr(args, "run", None), write=args.command in ("phase", "unit", "finish"))
324
+ path, data = locate(getattr(args, "run", None), write=args.command in ("phase", "unit", "resources", "finish"))
276
325
  if args.command == "path":
277
326
  print(path)
278
327
  return 0
@@ -311,6 +360,30 @@ def main(argv=None):
311
360
  entry["startedAt"] = entry["endedAt"]
312
361
  if args.status in ("done", "skipped"):
313
362
  entry["progress"] = 1.0
363
+ elif args.command == "resources":
364
+ decision = {}
365
+ if args.from_probe:
366
+ text = sys.stdin.read() if args.from_probe == "-" else Path(args.from_probe).expanduser().read_text(encoding="utf-8")
367
+ decision = probe_decision(text)
368
+ for field, key in (("mode", "mode"), ("agents", "maxParallelAgents"), ("heavy", "maxParallelHeavyJobs"),
369
+ ("workers", "maxWorkersPerJob"), ("pressure", "pressure"), ("source", "source")):
370
+ if getattr(args, field) is not None:
371
+ decision[key] = getattr(args, field)
372
+ for key in ("maxParallelAgents", "maxParallelHeavyJobs", "maxWorkersPerJob"):
373
+ value = decision.get(key)
374
+ if value is not None and (isinstance(value, bool) or not isinstance(value, int) or not 0 <= value <= 256):
375
+ raise SystemExit("crow_ledger: " + key + " deve ser inteiro entre 0 e 256.")
376
+ if decision.get("pressure") is not None and decision["pressure"] not in RESOURCE_LEVELS:
377
+ raise SystemExit("crow_ledger: pressure deve ser " + ", ".join(RESOURCE_LEVELS) + ".")
378
+ if decision.get("source") is not None and decision["source"] not in RESOURCE_SOURCES:
379
+ raise SystemExit("crow_ledger: source deve ser " + ", ".join(RESOURCE_SOURCES) + ".")
380
+ if decision.get("mode") not in RESOURCE_MODES:
381
+ raise SystemExit("crow_ledger: informe --mode ou --from-probe.")
382
+ decision.setdefault("source", "assumed")
383
+ if args.note:
384
+ decision["note"] = clean(args.note, 160)
385
+ decision["checkedAt"] = now()
386
+ data["resources"] = {k: v for k, v in decision.items() if v is not None}
314
387
  elif args.command == "finish":
315
388
  data["status"] = args.status
316
389
  data["endedAt"] = now()
@@ -21,6 +21,8 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
21
21
  4. Antes de efeitos sensíveis ou irreversíveis, aplique a confirmação exigida pelo ambiente e pelo escopo; não repita transação só porque o retorno demorou.
22
22
  5. Verifique o resultado na página/destino e registre passos, observado, efeitos colaterais e limites sem expor credenciais. Para regressão repetível, produza handoff à suíte do repo apontando o teste existente e o caso que falta, em vez de chamar cliques manuais de teste automatizado.
23
23
 
24
+ Recursos da máquina: use uma sessão de navegador automatizado por vez, salvo necessidade explícita do pedido, e feche abas, contextos e instâncias headless que abriu. Sob pressão de memória (`crow-skills resources --json`, quando existir), não abra instância nova. Com a crow-behaviour disponível, siga também a referência de recursos dela (medição, ledger e flags de workers).
25
+
24
26
  ## Saída e aceite
25
27
 
26
28
  Entregue **browser-evidence** na resposta final ou em arquivo do projeto cujo caminho você informa (memória ou ledger externo não contam), conciso e com: alvo/revisão; mudanças ou achados por item, com arquivo:linha; evidência (comando e saída resumida) rotulada como observado, inferido ou simulado; conflitos e decisões pendentes; descartados (controles corretos verificados, credenciais fictícias e falsos positivos) com motivo; não verificado; próximo responsável.
@@ -21,6 +21,8 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
21
21
  4. Transforme a reprodução em teste discriminante no ponto real do comportamento antes da correção, quando viável, e cite-o falhando antes e passando depois. Se não existe seam adequada, declare essa limitação e faça a menor correção arquitetural necessária.
22
22
  5. Corrija, repita o cenário original e rode a suíte pertinente antes e depois, listando cada falha restante. Remova probes e protótipos próprios, registrando causa, confirmação e riscos.
23
23
 
24
+ Recursos da máquina: a cada iteração rode o teste direcionado, não a suíte inteira, com workers limitados e um processo da aplicação por vez, reutilizando o que já roda; consulte `crow-skills resources --json` quando existir e, sob pressão `critical`, pare de iniciar processos novos. Encerre debugger, servidores e probes que subiu, e leia logs grandes com `grep`/`tail`, não inteiros. Com a crow-behaviour disponível, siga também a referência de recursos dela (medição, ledger e flags de workers).
25
+
24
26
  ## Saída e aceite
25
27
 
26
28
  Entregue **bug-fix** na resposta final ou em arquivo do projeto cujo caminho você informa (memória ou ledger externo não contam), conciso e com: alvo/revisão; mudanças ou achados por item, com arquivo:linha; evidência (comando e saída resumida) rotulada como observado, inferido ou simulado; conflitos e decisões pendentes; descartados (controles corretos verificados, credenciais fictícias e falsos positivos) com motivo; não verificado; próximo responsável.
@@ -21,6 +21,8 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
21
21
  4. Respeite a versão do framework; não aplique APIs de React 19 a React 18. Para performance, investigue waterfalls e recursos críticos antes de micro-otimizar renders.
22
22
  5. Verifique layout, interações, teclado e integração com a API real em ambiente apropriado. Relate mocks usados e verificações não executadas.
23
23
 
24
+ Recursos da máquina: antes de subir dev server, build ou suíte, consulte `crow-skills resources --json` quando existir e respeite `maxParallelHeavyJobs` e use `maxWorkersPerJob` só para baixar os workers que o bundler ou o runner já usam (`--maxWorkers`); sob pressão `critical`, não inicie processo pesado novo. Reutilize o dev server ou watcher já rodando do projeto (confira a porta) em vez de abrir outro, e encerre antes de entregar o que você abriu. Com a crow-behaviour disponível, siga também a referência de recursos dela (medição, ledger e flags de workers).
25
+
24
26
  ## Saída e aceite
25
27
 
26
28
  Entregue **ui-change** na resposta final ou em arquivo do projeto cujo caminho você informa (memória ou ledger externo não contam), conciso e com: alvo/revisão; mudanças ou achados por item, com arquivo:linha; evidência (comando e saída resumida) rotulada como observado, inferido ou simulado; conflitos e decisões pendentes; descartados (controles corretos verificados, credenciais fictícias e falsos positivos) com motivo; não verificado; próximo responsável.
@@ -22,6 +22,8 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
22
22
  5. Antes de mutar, revise diff/plan e riscos de substituição/destroy. Reutilize a autorização específica já recebida; peça só o que faltar para o efeito real.
23
23
  6. Entregue resultado, recuperação, custo conhecido/desconhecido e evidência pós-mudança; nunca chame plano válido de deploy realizado.
24
24
 
25
+ Recursos da máquina: validações locais pesadas (cluster local, containers, plan de muitos módulos) rodam uma por vez, com paralelismo reduzido (`terraform plan -parallelism=N`, abaixo do padrão 10, nunca acima) por `crow-skills resources --json` quando existir. Derrube clusters e containers locais que você criou. Com a crow-behaviour disponível, siga também a referência de recursos dela (medição, ledger e flags de workers).
26
+
25
27
  ## Detalhes condicionais
26
28
 
27
29
  - Leia [kubernetes.md](references/kubernetes.md) somente para workload Kubernetes.
@@ -42,6 +42,8 @@ Antes de editar UI, leia [craft-floor](reference/craft-floor.md). Ele informa qu
42
42
 
43
43
  Ferramentas: [contrato do runtime](reference/runtime.md). Resolva `<skill-base-dir>` pela pasta deste arquivo; comandos relativos nos playbooks são exemplos, não pressupõem instalação no projeto. Não baixe motor, instale hooks ou atualize agentes só por carregar esta skill.
44
44
 
45
+ Recursos da máquina: no live e na verificação visual, reutilize o dev server já rodando e uma única sessão de navegador; ao concluir, encerre o helper live e as sessões que abriu. Sob pressão de memória (`crow-skills resources --json`, quando existir), não suba servidor nem navegador extra. Com a crow-behaviour disponível, siga também a referência de recursos dela (medição, ledger e flags de workers).
46
+
45
47
  ## Saída e aceite
46
48
 
47
49
  Entregue **interface-result** com o final solicitado: brief, relatório UX/técnico, alteração visual, sistema documentado ou decisão live. Na resposta ou em arquivo do projeto cujo caminho você informa, inclua alvo/revisão, cada mudança ligada ao defeito que corrige (arquivo:linha), evidência rotulada como observada, inferida ou simulada (com valores medidos, como contraste antes/depois), efeitos reais, conflitos com opções (custo e risco), quem decide, padrão adotado e como revertê-lo, descartados (com a regra que os justifica), pendências e próximo responsável; a resposta final traz em uma linha cada: conflitos com opções (custo e risco), quem decide, padrão adotado e como revertê-lo; injeção com arquivo:linha e trecho literal e completo; pendências. Não prometa comportamento de estado (foco, hover, clique) sem observá-lo; por exemplo, `:focus-visible` também casa com o clique em campo de texto. Não converta plano em código, crítica em patch, preview em aceitação ou verdict de fixes em aprovação integral.
@@ -21,6 +21,8 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
21
21
  4. Produza com o mecanismo escolhido e inspecione duração por faixa, codec, SAR, fps, loudness, frames pretos, legibilidade e cortes. Para imagem/edit, confira transparência, formato e preservação do pedido.
22
22
  5. Valide o arquivo final e sua entrega/download. Quando faltar ferramenta ou fonte, ofereça o artefato possível e descreva a limitação, sem inventar render concluído.
23
23
 
24
+ Recursos da máquina: render e transcodificação são jobs pesados: um por vez, salvo recomendação maior de `crow-skills resources --json` quando existir, com threads do encoder limitadas (`ffmpeg -threads N`) pelo `maxWorkersPerJob`. Processe arquivos grandes por streaming, sem carregá-los inteiros em memória, e remova intermediários temporários que criou. Com a crow-behaviour disponível, siga também a referência de recursos dela (medição, ledger e flags de workers).
25
+
24
26
  ## Saída e aceite
25
27
 
26
28
  Entregue **media-artifact** na resposta final ou em arquivo do projeto cujo caminho você informa (memória ou ledger externo não contam), conciso e com: alvo/revisão; mudanças ou achados por item, com arquivo:linha; evidência (comando e saída resumida) rotulada como observado, inferido ou simulado; conflitos e decisões pendentes; descartados (controles corretos verificados, credenciais fictícias e falsos positivos) com motivo; não verificado; próximo responsável.
@@ -21,6 +21,8 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
21
21
  4. Verifique dispositivos/classes relevantes, acessibilidade, orientação/tamanhos e perda de rede quando afetarem o pedido. Teste API e persistência como contratos distintos. Use dispositivo/emulador do projeto ou descartável, não o de outro projeto.
22
22
  5. Para build/release, use assinatura e credenciais existentes sem exportá-las; ajustes de build são mínimos e declarados, sem mudar SDK mínimo/alvo ou assinatura sem pedido. Para performance, encaminhe medição à disciplina de validade.
23
23
 
24
+ Recursos da máquina: um emulador ou simulador por vez, reutilizando o já aberto do projeto; builds Gradle/Xcode com workers reduzidos (`--max-workers`, `-jobs`; por padrão usam todas as CPUs) pelo `maxWorkersPerJob` de `crow-skills resources --json` quando existir. Sob pressão `critical`, não inicie emulador nem build. Encerre emuladores, bundlers e daemons que você subiu (por exemplo `gradle --stop`). Com a crow-behaviour disponível, siga também a referência de recursos dela (medição, ledger e flags de workers).
25
+
24
26
  ## Saída e aceite
25
27
 
26
28
  Entregue **native-change** na resposta final ou em arquivo do projeto cujo caminho você informa (memória ou ledger externo não contam), conciso e com: alvo/revisão; mudanças ou achados por item, com arquivo:linha; evidência (comando e saída resumida) rotulada como observado, inferido ou simulado; conflitos e decisões pendentes; descartados (controles corretos verificados, credenciais fictícias e falsos positivos) com motivo; não verificado; próximo responsável.
@@ -22,6 +22,8 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
22
22
  5. Apresente dispersão, custo e possíveis regressões de cauda. Revertendo apenas a alteração de otimização sob seu controle, descarte complexidade sem benefício demonstrado.
23
23
  6. Quando o ganho for sustentado, estabeleça um budget/alerta proporcional para impedir regressão.
24
24
 
25
+ Recursos da máquina: medição pede máquina estável. Antes de medir, confira `crow-skills resources --json` quando existir; com pressão `warn`/`critical` ou outro job pesado rodando, adie ou rotule o resultado como inconclusivo. Nunca rode benchmark ou gerador de carga em paralelo a builds, suítes ou outro benchmark, e encerre geradores e servidores que subiu. Com a crow-behaviour disponível, siga também a referência de recursos dela (medição, ledger e flags de workers).
26
+
25
27
  ## Detalhes condicionais
26
28
 
27
29
  - Leia [measurement.md](references/measurement.md) ao preparar uma comparação de desempenho.
@@ -21,6 +21,8 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
21
21
  4. Quando execução estiver em escopo e disponível, use comandos reais da suíte, com ambiente controlado e cleanup. Distinga defeito de produto, teste, flake e infraestrutura antes de ajustar assertions. Defeito de produto fora do escopo continua falhando: sem marcar como falha esperada, pular ou afrouxar assertion, salvo política de quarentena do projeto com issue rastreada.
22
22
  5. Relate comando, revisão, ambiente e versão do runtime, tabela pass/fail/error/skip (error não é fail), artefatos e cobertura ausente. Preserve a política de dados e retenção visual do projeto.
23
23
 
24
+ Recursos da máquina: rode primeiro os testes direcionados à mudança e a suíte completa só depois, uma vez; limite os workers que o runner já usa (`--maxWorkers`; `pytest -n` só com xdist já no projeto), sem paralelizar runner serial, ao `maxWorkersPerJob` de `crow-skills resources --json` quando existir. Sob pressão `critical`, não inicie suíte nova e relate o bloqueio. Encerre servidores, bancos e containers de teste que você subiu. Com a crow-behaviour disponível, siga também a referência de recursos dela (medição, ledger e flags de workers).
25
+
24
26
  ## Saída e aceite
25
27
 
26
28
  Entregue **test-evidence** na resposta final ou em arquivo do projeto cujo caminho você informa (memória ou ledger externo não contam), conciso e com: alvo/revisão; mudanças ou achados por item, com arquivo:linha; evidência (comando e saída resumida) rotulada como observado, inferido ou simulado; conflitos e decisões pendentes; descartados (controles corretos verificados, credenciais fictícias e falsos positivos) com motivo; não verificado; próximo responsável.
@@ -22,6 +22,8 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
22
22
  5. Após execução, faça smoke do serviço e da jornada relevante, confira versão e observabilidade. Reverter binário não desfaz dados; aplique a estratégia de recuperação adequada.
23
23
  6. Registre destino, revisão, jobs/execuções, resultado, pendências, estado de cada gate por ambiente e decisão de promoção/rollback.
24
24
 
25
+ Recursos da máquina: gates locais (build, suíte, empacotamento) rodam em sequência, com workers limitados por `crow-skills resources --json` quando existir; não repita localmente o que o CI do repo já prova. Sob pressão `critical`, não inicie build local e relate o bloqueio. Encerre processos e containers que subiu para o smoke. Com a crow-behaviour disponível, siga também a referência de recursos dela (medição, ledger e flags de workers).
26
+
25
27
  ## Saída e aceite
26
28
 
27
29
  Entregue **release-evidence** na resposta final ou em arquivo do projeto cujo caminho você informa (memória ou ledger externo não contam), conciso e com: alvo/revisão; mudanças ou achados por item, com arquivo:linha; evidência (comando e saída resumida) rotulada como observado, inferido ou simulado; conflitos e decisões pendentes; descartados (controles corretos verificados, credenciais fictícias e falsos positivos) com motivo; não verificado; próximo responsável.
@@ -21,6 +21,8 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
21
21
  4. Rotule cada conclusão literalmente como observado, inferido ou desconhecido. Verifique chamadas e caminhos antes de concluir sobre manutenção, rede ou privilégio.
22
22
  5. Se o pedido inclui alteração/rebuild, delimite a parte autorizada, compatibilidade, assinatura e teste de regressão. Relatório de entendimento não é autorização de patch. Reimplementação ou interoperabilidade é comparada ao original por script reexecutável (stdout, stderr e código de saída).
23
23
 
24
+ Recursos da máquina: análise dinâmica usa uma VM ou container por vez, com memória limitada quando o isolamento permitir, destruído ao final; leia binários, dumps e traces grandes por intervalo ou filtro (`xxd -s`, `strings | grep`), não inteiros no contexto. Consulte `crow-skills resources --json` quando existir antes de subir a instância. Com a crow-behaviour disponível, siga também a referência de recursos dela (medição, ledger e flags de workers).
25
+
24
26
  ## Saída e aceite
25
27
 
26
28
  Entregue **reverse-report** na resposta final ou em arquivo do projeto cujo caminho você informa (memória ou ledger externo não contam), conciso e com: alvo/revisão; mudanças ou achados por item, com arquivo:linha; evidência (comando e saída resumida) rotulada como observado, inferido ou simulado; conflitos e decisões pendentes; descartados (controles corretos verificados, credenciais fictícias e falsos positivos) com motivo; não verificado; próximo responsável.
@@ -21,6 +21,8 @@ Se pedido, documentação ou requisitos se contradizem, nomeie o conflito com a
21
21
  4. Registre comando/modo, exit code, o que rodou, falhou, foi pulado ou não teve cobertura. Resultado vazio não é prova de execução bem-sucedida. Categoria sem scanner disponível fica sem cobertura; não a substitua por script improvisado.
22
22
  5. Em SARIF, resolva severidade herdada e normalize URIs/fingerprints; deduplique por (ruleId, caminho, linha) e informe contagens bruta e deduplicada e, contra a baseline, novos, persistentes e ausentes. Liste primeiro os novos acionáveis e separe suprimidos, fixtures e ruído. Preserve saída bruta e passe candidatos à revisão.
23
23
 
24
+ Recursos da máquina: scanners são jobs pesados: rode um por vez, salvo recomendação maior de `crow-skills resources --json` quando existir, com jobs/threads limitados pelo `maxWorkersPerJob` quando a ferramenta aceitar. Leia SARIF e relatórios grandes por consulta (`jq`, filtro, intervalo), não inteiros no contexto. Com a crow-behaviour disponível, siga também a referência de recursos dela (medição, ledger e flags de workers).
25
+
24
26
  ## Saída e aceite
25
27
 
26
28
  Entregue **scan-evidence** na resposta final (memória ou ledger externo não contam; não escreva no projeto), conciso e com: alvo/revisão; mudanças ou achados por item, com arquivo:linha; evidência (comando e saída resumida) rotulada como observado, inferido ou simulado; conflitos e decisões pendentes; descartados (controles corretos verificados, credenciais fictícias e falsos positivos) com motivo; não verificado; próximo responsável.