agent-quality-police 0.3.0 → 0.4.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-quality-police",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Strict governance framework for coding agents that blocks testing and typing bypasses.",
5
5
  "author": {
6
6
  "name": "Davy Massoneto",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-quality-police",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Strict governance framework for coding agents that blocks testing and typing bypasses.",
5
5
  "author": {
6
6
  "name": "Davy Massoneto",
package/AGENTS.md CHANGED
@@ -13,6 +13,7 @@
13
13
  2. Leia [quality-definition](docs/policy/quality-definition.md) quando a tarefa precisar de contexto de política do repositório.
14
14
  3. Leia [workflow](docs/policy/workflow.md) quando o repositório definir um.
15
15
  4. Carregue o menor conjunto de skills exigido a partir de `skills/` antes de propor edits ou escrever código.
16
+ 5. Para mudanças de código, o agent principal coordena; a execução deve passar por `implementer`.
16
17
 
17
18
  ## Roteamento de Skills
18
19
 
@@ -35,6 +36,7 @@
35
36
  - Contratos públicos devem manter uma forma estável de topo; não retorne uniões como `T[] | { data: T[]; total: number }`.
36
37
  - Arquivos de responsabilidade única são exigidos: uma classe por arquivo sem funções de topo irmãs, ou múltiplas funções exportadas apenas quando o nome do arquivo nomeia uma responsabilidade compartilhada.
37
38
  - Nomes genéricos como `helpers.ts`, `utils.ts`, `common.ts` ou `shared.ts` são falhas automáticas quando escondem a razão para mudar.
39
+ - Quando houver mudança de código, a execução deve passar pelo `implementer`; edição direta pelo agent principal é bloqueio.
38
40
  - Não invente arquivos, APIs, imports, chaves de config ou comportamento de biblioteca; verifique com ferramenta primeiro.
39
41
  - Quando incerto, pare e pergunte ao usuário em vez de adivinhar.
40
42
  - Cite a fonte (`arquivo:linha`, URL oficial ou quote literal do usuário) para cada escolha não trivial de implementação.
@@ -42,10 +44,12 @@
42
44
 
43
45
  ## Fluxo de Revisão
44
46
 
47
+ - Para mudanças de código, execute a implementação via `implementer`; o agent principal coordena, não substitui esse papel.
45
48
  - Para mudanças de código, invoque explicitamente os auditores exigidos antes da aprovação final.
46
49
  - Para mudanças de código, não finalize até que os auditores exigidos tenham rodado e seus resultados tenham sido revisados.
47
50
  - Não substitua invocação de agent de auditoria nominal por autorreview inline.
51
+ - Antes de commit, push, merge request, release ou aprovação, valide os receipts exigidos em `.aqp/receipts/`.
48
52
  - Para tipagem, config, mocks, helpers ou diffs suspeitos, rode `bypass-auditor`.
49
53
  - Para mudanças de comportamento ou bug fixes, rode `tdd-warden` e `bypass-auditor`.
50
54
  - Para aprovação final, release ou decisão de merge, rode `pr-gatekeeper` após os demais auditores exigidos.
51
- - Se uma skill ou auditor exigido não puder rodar no runtime atual, pare e reporte `BLOCKED`.
55
+ - Se `implementer`, algum auditor exigido, ou a validação de receipts não puder rodar no runtime atual, pare e reporte `BLOCKED`.
package/CLAUDE.md CHANGED
@@ -13,6 +13,7 @@
13
13
  2. Leia [quality-definition](docs/policy/quality-definition.md) quando a tarefa precisar de contexto de política do repositório.
14
14
  3. Leia [workflow](docs/policy/workflow.md) quando o repositório definir um.
15
15
  4. Carregue o menor conjunto de skills exigido a partir de `skills/` antes de propor edits ou escrever código.
16
+ 5. Para mudanças de código, o agent principal coordena; a execução deve passar por `implementer`.
16
17
 
17
18
  ## Roteamento de Skills
18
19
 
@@ -35,6 +36,7 @@
35
36
  - Contratos públicos devem manter uma forma estável de topo; não retorne uniões como `T[] | { data: T[]; total: number }`.
36
37
  - Arquivos de responsabilidade única são exigidos: uma classe por arquivo sem funções de topo irmãs, ou múltiplas funções exportadas apenas quando o nome do arquivo nomeia uma responsabilidade compartilhada.
37
38
  - Nomes genéricos como `helpers.ts`, `utils.ts`, `common.ts` ou `shared.ts` são falhas automáticas quando escondem a razão para mudar.
39
+ - Quando houver mudança de código, a execução deve passar pelo `implementer`; edição direta pelo agent principal é bloqueio.
38
40
  - Não invente arquivos, APIs, imports, chaves de config ou comportamento de biblioteca; verifique com ferramenta primeiro.
39
41
  - Quando incerto, pare e pergunte ao usuário em vez de adivinhar.
40
42
  - Cite a fonte (`arquivo:linha`, URL oficial ou quote literal do usuário) para cada escolha não trivial de implementação.
@@ -42,10 +44,12 @@
42
44
 
43
45
  ## Fluxo de Revisão
44
46
 
47
+ - Para mudanças de código, execute a implementação via `implementer`; o agent principal coordena, não substitui esse papel.
45
48
  - Para mudanças de código, invoque explicitamente os auditores exigidos antes da aprovação final.
46
49
  - Para mudanças de código, não finalize até que os auditores exigidos tenham rodado e seus resultados tenham sido revisados.
47
50
  - Não substitua invocação de agent de auditoria nominal por autorreview inline.
51
+ - Antes de commit, push, merge request, release ou aprovação, valide os receipts exigidos em `.aqp/receipts/`.
48
52
  - Para tipagem, config, mocks, helpers ou diffs suspeitos, rode `bypass-auditor`.
49
53
  - Para mudanças de comportamento ou bug fixes, rode `tdd-warden` e `bypass-auditor`.
50
54
  - Para aprovação final, release ou decisão de merge, rode `pr-gatekeeper` após os demais auditores exigidos.
51
- - Se uma skill ou auditor exigido não puder rodar no runtime atual, pare e reporte `BLOCKED`.
55
+ - Se `implementer`, algum auditor exigido, ou a validação de receipts não puder rodar no runtime atual, pare e reporte `BLOCKED`.
package/bin/aqp.mjs CHANGED
@@ -6,6 +6,7 @@ import readline from "node:readline/promises";
6
6
  import { fileURLToPath } from "node:url";
7
7
 
8
8
  import { installGlobal, supportedTargets } from "../lib/install.mjs";
9
+ import { validateRequiredReceipts } from "../lib/receipts.mjs";
9
10
  import { formatInstallResult } from "../lib/cli-output.mjs";
10
11
 
11
12
  function usage() {
@@ -13,7 +14,8 @@ function usage() {
13
14
  [
14
15
  "Usage:",
15
16
  " aqp install",
16
- " aqp install --targets claude,codex,opencode [--manage-global-root claude,codex] [--home <dir>] [--json]"
17
+ " aqp install --targets claude,codex,opencode [--manage-global-root claude,codex] [--home <dir>] [--json]",
18
+ " aqp validate-receipts --repo <dir> --required implementer,bypass-auditor,tdd-warden,pr-gatekeeper [--json]"
17
19
  ].join("\n")
18
20
  );
19
21
  }
@@ -63,6 +65,54 @@ async function main(argv) {
63
65
  return 0;
64
66
  }
65
67
 
68
+ if (command === "validate-receipts") {
69
+ let repoRoot;
70
+ let requiredAgents;
71
+ let useJson = false;
72
+
73
+ for (let index = 0; index < rest.length; index += 1) {
74
+ const current = rest[index];
75
+ if (current === "--repo") {
76
+ repoRoot = rest[index + 1];
77
+ index += 1;
78
+ continue;
79
+ }
80
+ if (current === "--required") {
81
+ requiredAgents = parseCommaList(rest[index + 1]);
82
+ index += 1;
83
+ continue;
84
+ }
85
+ if (current === "--json") {
86
+ useJson = true;
87
+ continue;
88
+ }
89
+ throw new Error(`Unknown argument: ${current}`);
90
+ }
91
+
92
+ if (!repoRoot || !requiredAgents || requiredAgents.length === 0) {
93
+ usage();
94
+ return 1;
95
+ }
96
+
97
+ const result = await validateRequiredReceipts(path.resolve(repoRoot), requiredAgents);
98
+ if (useJson) {
99
+ console.log(JSON.stringify(result, null, 2));
100
+ } else if (result.valid) {
101
+ console.log("receipts-ok");
102
+ } else {
103
+ if (result.missing.length > 0) {
104
+ console.log(`Missing receipts: ${result.missing.join(", ")}`);
105
+ }
106
+ for (const entry of result.invalid) {
107
+ console.log(`Invalid receipt: ${entry.agent}`);
108
+ for (const error of entry.errors) {
109
+ console.log(`- ${error}`);
110
+ }
111
+ }
112
+ }
113
+ return result.valid ? 0 : 1;
114
+ }
115
+
66
116
  if (command !== "install") {
67
117
  usage();
68
118
  return 1;
@@ -4,6 +4,8 @@
4
4
 
5
5
  Qualidade neste framework não é "o build passou". Qualidade significa que a mudança é provada em comportamento, tem tipagem honesta, escopo estreito, organização em que cada arquivo tem uma razão para mudar, e é revisável sem trabalho de investigação.
6
6
 
7
+ Quando o runtime suporta agents nominais e enforcement local, qualidade também exige trilho operacional: mudança de código executada pelo papel de execução correto, gates auditáveis e receipts rastreáveis antes de commit, push, merge request, release ou aprovação.
8
+
7
9
  Qualidade também exige grounding: cada afirmação e decisão precisa estar ancorada em instrução explícita do usuário, em código ou documentação do repositório, ou em documentação oficial consultada no momento da tarefa. Dados de treinamento não são fonte de verdade.
8
10
 
9
11
  ## Teste Válido
@@ -106,6 +108,8 @@ Rejeitar imediatamente quando um diff introduz qualquer um dos itens abaixo, a m
106
108
  - branching que altera semântica de runtime sem justificativa de produto ou domínio
107
109
  - qualquer código cuja correção dependa de inferência não verificada (comportamento de biblioteca, formato de API, layout de arquivo, intenção do usuário) sem citação
108
110
  - qualquer afirmação sobre o repositório, biblioteca ou usuário apresentada sem citação, resultado de ferramenta ou quote literal
111
+ - mudança de código executada fora do `implementer` quando o runtime suporta agent nominal para execução
112
+ - aprovação, commit, push, merge request ou release sem validação dos receipts exigidos em `.aqp/receipts/` quando o runtime suporta receipts
109
113
 
110
114
  ## Refactor Seguro
111
115
 
@@ -0,0 +1,48 @@
1
+ # Contrato de Receipts
2
+
3
+ Receipts são artefatos locais que provam que um papel nominal do framework realmente rodou.
4
+
5
+ ## Localização
6
+
7
+ - Diretório padrão: `.aqp/receipts/`
8
+ - Um arquivo JSON por agent nominal
9
+
10
+ ## Arquivos Esperados
11
+
12
+ - `.aqp/receipts/implementer.json`
13
+ - `.aqp/receipts/bypass-auditor.json`
14
+ - `.aqp/receipts/tdd-warden.json`
15
+ - `.aqp/receipts/pr-gatekeeper.json`
16
+
17
+ ## Forma Mínima
18
+
19
+ ```json
20
+ {
21
+ "schemaVersion": 1,
22
+ "agent": "implementer",
23
+ "verdict": "COMPLETED",
24
+ "task": "short task summary",
25
+ "timestamp": "2026-04-21T12:34:56.000Z"
26
+ }
27
+ ```
28
+
29
+ ## Campos Obrigatórios
30
+
31
+ - `schemaVersion`: inteiro; atualmente `1`
32
+ - `agent`: nome nominal do agent que executou o passo
33
+ - `verdict`: resultado final daquele agent
34
+ - `task`: resumo curto da tarefa auditada ou implementada
35
+ - `timestamp`: timestamp ISO 8601
36
+
37
+ ## Verdicts Aceitos por Agent
38
+
39
+ - `implementer` → `COMPLETED`
40
+ - `bypass-auditor` → `PASS`
41
+ - `tdd-warden` → `PASS`
42
+ - `pr-gatekeeper` → `APPROVED`
43
+
44
+ ## Regra de Falha Fechada
45
+
46
+ - Se um receipt exigido está ausente, o gate falha.
47
+ - Se o receipt existe mas não bate com o agent ou com o verdict esperado, o gate falha.
48
+ - Se o runtime não consegue emitir o receipt exigido, o workflow deve parar em `BLOCKED`.
@@ -11,6 +11,7 @@ Fontes oficiais consultadas: `https://developers.openai.com/codex/guides/agents-
11
11
  - Subagents em `.claude/agents/<nome>.md`. Skills em `.claude/skills/<skill-name>/SKILL.md` (project), `~/.claude/skills/...` (personal) ou `<plugin>/skills/...` (plugin). Custom commands vivem em `.claude/commands/` e estão sendo unificados com skills.
12
12
  - Suporta ferramentas estruturadas como `Read`, `Grep`, `Glob`, `WebFetch`, `Task`, `Skill` e integrações MCP. Nomes exatos de ferramentas variam por versão; confirme antes de chamar.
13
13
  - Memória persistente `~/.claude/projects/<project>/memory/MEMORY.md` (auto memory) precisa ser tratada como cache verificável, não como fonte de verdade.
14
+ - Claude Code suporta hooks de subagent e `PreToolUse`, o que permite enforcement mais forte de runtime para bloquear operações sem receipt ou fora do papel esperado.
14
15
 
15
16
  ## Codex
16
17
 
@@ -26,6 +27,7 @@ Fontes oficiais consultadas: `https://developers.openai.com/codex/guides/agents-
26
27
  - Diretrizes vagas como "não alucine" são inúteis. Apenas regras concretas e verificáveis (por exemplo, "verifique com `Read` antes de afirmar que o arquivo existe") são aplicáveis.
27
28
  - Nunca divida a mesma regra em arquivos divergentes entre Claude Code e Codex. Regras canônicas vivem em `framework/rules/` e `docs/policy/`. Ambos os runtimes consomem a mesma projeção gerada.
28
29
  - Os arquivos `framework/rules/claude-code-specific.md` e `framework/rules/codex-specific.md` contêm apenas diferenças de runtime (discovery, ferramentas, limites). Política comportamental fica nos demais rules.
30
+ - Se um runtime não suporta o enforcement operacional exigido pelo projeto, o comportamento correto é `BLOCKED`, não fallback silencioso para confiança textual.
29
31
 
30
32
  ## Projeções Geradas
31
33
 
@@ -5,6 +5,7 @@
5
5
  - `framework/entrypoints/`: fonte canônica para prompts gerados e entrypoints do pacote
6
6
  - `docs/policy/quality-definition.md`: significado canônico de qualidade
7
7
  - `docs/policy/workflow.md`: sequência canônica de execução
8
+ - `docs/policy/receipt-contract.md`: contrato canônico dos receipts operacionais
8
9
  - `docs/policy/runtime-notes.md`: notas canônicas de diferenças entre runtimes (Claude Code e Codex)
9
10
  - `framework/rules/`: regras canônicas sempre ativas
10
11
  - `framework/skills/`: fonte canônica das skills
@@ -7,13 +7,15 @@
7
7
  3. Leia `AGENTS.md` e `docs/policy/quality-definition.md`.
8
8
  4. Carregue a skill ou o conjunto de skills relevante.
9
9
  5. Defina o comportamento a ser provado.
10
- 6. Escreva ou ajuste o teste que falha primeiro, quando testes forem viáveis.
11
- 7. Implemente o mínimo de código necessário para passar.
12
- 8. Refatore sem alterar o comportamento provado.
13
- 9. Rode os agents de auditoria apropriados.
14
- 10. Valide o repositório antes de commit ou publicação.
10
+ 6. Se a tarefa exige mudança de código, o agent principal coordena; a execução deve passar pelo `implementer`.
11
+ 7. Escreva ou ajuste o teste que falha primeiro, quando testes forem viáveis.
12
+ 8. Implemente o mínimo de código necessário para passar.
13
+ 9. Refatore sem alterar o comportamento provado.
14
+ 10. Rode os agents de auditoria apropriados.
15
+ 11. Valide os receipts exigidos em `.aqp/receipts/` antes de commit, push, merge request, release ou publicação.
16
+ 12. Valide o repositório antes de commit ou publicação.
15
17
 
16
- Autorreview inline não satisfaz requisito de auditoria. Quando um agent de auditoria é exigido, invoque o agent nominal. Se o agent exigido não puder rodar, reporte `BLOCKED` em vez de declarar conclusão.
18
+ Autorreview inline não satisfaz requisito de auditoria. Quando um agent de auditoria é exigido, invoque o agent nominal. Se o `implementer`, algum auditor exigido, ou a validação de receipts não puder rodar, reporte `BLOCKED` em vez de declarar conclusão.
17
19
 
18
20
  ## Regra de Grounding
19
21
 
@@ -24,10 +26,18 @@ Autorreview inline não satisfaz requisito de auditoria. Quando um agent de audi
24
26
 
25
27
  ## Pareamento Obrigatório de Auditoria
26
28
 
29
+ - Mudança de código: execute via `implementer`.
27
30
  - Mudança de TypeScript ou heavy em config: rode `bypass-auditor`.
28
31
  - Novo comportamento ou correção de bug com testes: rode `tdd-warden` e `bypass-auditor`.
29
32
  - Decisão final de merge ou publicação: rode `pr-gatekeeper`.
30
33
 
34
+ ## Contrato de Receipts
35
+
36
+ - Receipts vivem em `.aqp/receipts/`.
37
+ - Cada gate nominal exigido deve deixar um receipt JSON correspondente antes de commit, push, merge request, release ou aprovação.
38
+ - Mínimo esperado por agent: `implementer`, `bypass-auditor`, `tdd-warden`, `pr-gatekeeper`.
39
+ - Se o runtime ainda não consegue materializar o receipt exigido, a tarefa fica `BLOCKED` em vez de seguir por confiança textual.
40
+
31
41
  ## Manutenção do Repositório
32
42
 
33
43
  - Edite primeiro as fontes canônicas de política e skill.
package/lib/install.mjs CHANGED
@@ -215,7 +215,8 @@ function globalPolicySections() {
215
215
  "1. Confirme literalmente o pedido do usuário; se ambíguo, pergunte antes de começar.",
216
216
  "2. Leia [quality-definition]({{quality_definition_path}}) quando a tarefa precisar de contexto de política do repositório.",
217
217
  "3. Leia [workflow]({{workflow_path}}) quando o repositório definir um.",
218
- "4. Carregue o menor conjunto de skills exigido a partir de `{{primary_skill_root}}` antes de propor edits ou escrever código."
218
+ "4. Carregue o menor conjunto de skills exigido a partir de `{{primary_skill_root}}` antes de propor edits ou escrever código.",
219
+ "5. Para mudanças de código, o agent principal coordena; a execução deve passar por `implementer`."
219
220
  ].join("\n"),
220
221
  skillRoutingBody: [
221
222
  "- Use [grounding-first]({{grounding_first_skill_path}}) sempre que a tarefa exigir afirmação factual sobre repositório, biblioteca ou intenção do usuário.",
@@ -236,19 +237,22 @@ function globalPolicySections() {
236
237
  "- Contratos públicos devem manter uma forma estável de topo; não retorne uniões como `T[] | { data: T[]; total: number }`.",
237
238
  "- Arquivos de responsabilidade única são exigidos: uma classe por arquivo sem funções de topo irmãs, ou múltiplas funções exportadas apenas quando o nome do arquivo nomeia uma responsabilidade compartilhada.",
238
239
  "- Nomes genéricos como `helpers.ts`, `utils.ts`, `common.ts` ou `shared.ts` são falhas automáticas quando escondem a razão para mudar.",
240
+ "- Quando houver mudança de código, a execução deve passar pelo `implementer`; edição direta pelo agent principal é bloqueio.",
239
241
  "- Não invente arquivos, APIs, imports, chaves de config ou comportamento de biblioteca; verifique com ferramenta primeiro.",
240
242
  "- Quando incerto, pare e pergunte ao usuário em vez de adivinhar.",
241
243
  "- Cite a fonte (`arquivo:linha`, URL oficial ou quote literal do usuário) para cada escolha não trivial de implementação.",
242
244
  "- Prefira tipos nomeados e modelos explícitos em vez de atalhos estruturais inline."
243
245
  ].join("\n"),
244
246
  reviewFlowBody: [
247
+ "- Para mudanças de código, execute a implementação via `implementer`; o agent principal coordena, não substitui esse papel.",
245
248
  "- Para mudanças de código, invoque explicitamente os auditores exigidos antes da aprovação final.",
246
249
  "- Para mudanças de código, não finalize até que os auditores exigidos tenham rodado e seus resultados tenham sido revisados.",
247
250
  "- Não substitua invocação de agent de auditoria nominal por autorreview inline.",
251
+ "- Antes de commit, push, merge request, release ou aprovação, valide os receipts exigidos em `.aqp/receipts/`.",
248
252
  "- Para tipagem, config, mocks, helpers ou diffs suspeitos, rode `bypass-auditor`.",
249
253
  "- Para mudanças de comportamento ou bug fixes, rode `tdd-warden` e `bypass-auditor`.",
250
254
  "- Para aprovação final, release ou decisão de merge, rode `pr-gatekeeper` após os demais auditores exigidos.",
251
- "- Se uma skill ou auditor exigido não puder rodar no runtime atual, pare e reporte `BLOCKED`."
255
+ "- Se `implementer`, algum auditor exigido, ou a validação de receipts não puder rodar no runtime atual, pare e reporte `BLOCKED`."
252
256
  ].join("\n")
253
257
  };
254
258
  }
@@ -0,0 +1,84 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+
4
+ export const RECEIPT_DIRECTORY = path.join(".aqp", "receipts");
5
+
6
+ export const REQUIRED_VERDICTS = {
7
+ "implementer": "COMPLETED",
8
+ "bypass-auditor": "PASS",
9
+ "tdd-warden": "PASS",
10
+ "pr-gatekeeper": "APPROVED"
11
+ };
12
+
13
+ function isObject(value) {
14
+ return value !== null && typeof value === "object" && !Array.isArray(value);
15
+ }
16
+
17
+ function receiptPath(repoRoot, agent) {
18
+ return path.join(repoRoot, RECEIPT_DIRECTORY, `${agent}.json`);
19
+ }
20
+
21
+ export async function loadReceipt(repoRoot, agent) {
22
+ const raw = await readFile(receiptPath(repoRoot, agent), "utf8");
23
+ return JSON.parse(raw);
24
+ }
25
+
26
+ export function validateReceipt(agent, receipt) {
27
+ if (!isObject(receipt)) {
28
+ return ["Receipt must be a JSON object."];
29
+ }
30
+
31
+ const errors = [];
32
+ if (receipt.schemaVersion !== 1) {
33
+ errors.push("schemaVersion must be 1.");
34
+ }
35
+ if (receipt.agent !== agent) {
36
+ errors.push(`agent must equal ${agent}.`);
37
+ }
38
+ if (typeof receipt.task !== "string" || receipt.task.trim().length === 0) {
39
+ errors.push("task must be a non-empty string.");
40
+ }
41
+ if (typeof receipt.timestamp !== "string" || Number.isNaN(Date.parse(receipt.timestamp))) {
42
+ errors.push("timestamp must be a valid ISO 8601 string.");
43
+ }
44
+
45
+ const requiredVerdict = REQUIRED_VERDICTS[agent];
46
+ if (!requiredVerdict) {
47
+ errors.push(`Unknown agent: ${agent}.`);
48
+ } else if (receipt.verdict !== requiredVerdict) {
49
+ errors.push(`verdict must equal ${requiredVerdict}.`);
50
+ }
51
+
52
+ return errors;
53
+ }
54
+
55
+ export async function validateRequiredReceipts(repoRoot, requiredAgents) {
56
+ const missing = [];
57
+ const invalid = [];
58
+
59
+ for (const agent of requiredAgents) {
60
+ try {
61
+ const receipt = await loadReceipt(repoRoot, agent);
62
+ const errors = validateReceipt(agent, receipt);
63
+ if (errors.length > 0) {
64
+ invalid.push({ agent, errors });
65
+ }
66
+ } catch (error) {
67
+ if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") {
68
+ missing.push(agent);
69
+ continue;
70
+ }
71
+ if (error instanceof SyntaxError) {
72
+ invalid.push({ agent, errors: ["Receipt is not valid JSON."] });
73
+ continue;
74
+ }
75
+ throw error;
76
+ }
77
+ }
78
+
79
+ return {
80
+ valid: missing.length === 0 && invalid.length === 0,
81
+ missing,
82
+ invalid
83
+ };
84
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-quality-police",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Strict governance framework for coding agents that blocks testing and typing bypasses.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,9 +1,11 @@
1
1
  # Revisão e Portas
2
2
 
3
+ - Mudança de código deve ser executada pelo `implementer`; o agent principal coordena e não substitui esse papel.
3
4
  - Rode `tdd-warden` para verificação de comportamento e TDD quando testes mudaram ou deveriam ter mudado.
4
5
  - Rode `bypass-auditor` para qualquer superfície de revisão de TypeScript, lint, config, mock, helper ou suspeita.
5
6
  - Rode `pr-gatekeeper` antes de publicar ou declarar aprovação.
6
7
  - Autorreview inline não substitui invocação dos agents de auditoria nominais.
8
+ - Antes de commit, push, merge request, release ou aprovação, valide os receipts exigidos em `.aqp/receipts/`.
7
9
  - Se um agent de auditoria exigido não puder rodar, reporte `BLOCKED` em vez de declarar conclusão.
8
10
  - Saídas de auditor devem ser concretas, curtas, baseadas em evidência e severas.
9
11
  - Um revisor que não consegue provar segurança deve rejeitar a mudança.