atlas-workflow 0.9.0 → 0.9.2
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.
- package/README.md +2 -2
- package/VERSION +1 -1
- package/build/cli/atlas-init.mjs +12 -14
- package/build/tests/classify-findings.test.mjs +20 -0
- package/build/tests/etapa3.test.mjs +161 -0
- package/build/tests/test_classify_findings.py +79 -0
- package/hosts/opencode/.opencode/agents/atlas-findings-repair.md +4 -0
- package/hosts/opencode/.opencode/agents/atlas-task-validator.md +18 -1
- package/hosts/opencode/.opencode/atlas/VERSION +1 -1
- package/hosts/opencode/.opencode/atlas/orchestrator/README.md +7 -5
- package/hosts/opencode/.opencode/atlas/orchestrator/commands/workflow.md +1 -1
- package/hosts/opencode/.opencode/atlas/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +22 -17
- package/hosts/opencode/.opencode/atlas/packages/mcp-server/README.md +1 -1
- package/hosts/opencode/.opencode/atlas/packages/mcp-server/package.json +1 -1
- package/hosts/opencode/.opencode/atlas/packages/mcp-server/server.js +446 -14
- package/hosts/opencode/.opencode/atlas/packages/templates/BACKLOG_MESTRE_TEMPLATE.md +14 -3
- package/hosts/opencode/.opencode/atlas/packages/templates/PRD_TEMPLATE.md +2 -1
- package/hosts/opencode/.opencode/atlas/packages/templates/STATE_FILE_SCHEMA.md +25 -1
- package/hosts/opencode/.opencode/skills/_shared/references/stack-profiles.md +36 -0
- package/hosts/opencode/.opencode/skills/_shared/scripts/document_quality.mjs +252 -0
- package/hosts/opencode/.opencode/skills/atlas-backlog-generator/SKILL.md +7 -2
- package/hosts/opencode/.opencode/skills/atlas-direct-execute/SKILL.md +6 -2
- package/hosts/opencode/.opencode/skills/atlas-findings-repair/SKILL.md +11 -1
- package/hosts/opencode/.opencode/skills/atlas-plan-execute/SKILL.md +16 -2
- package/hosts/opencode/.opencode/skills/atlas-plan-handoff/SKILL.md +6 -4
- package/hosts/opencode/.opencode/skills/atlas-prd-interview/SKILL.md +7 -2
- package/hosts/opencode/.opencode/skills/atlas-slice-review/SKILL.md +37 -2
- package/hosts/opencode/.opencode/skills/atlas-slice-review/references/scenario-lenses.md +8 -0
- package/hosts/opencode/.opencode/skills/atlas-slice-review/scripts/classify_findings.mjs +60 -0
- package/hosts/opencode/.opencode/skills/atlas-slice-review/scripts/classify_findings.py +9 -41
- package/hosts/opencode/.opencode/skills/atlas-sprint-prd-generator/SKILL.md +7 -4
- package/hosts/opencode/.opencode/skills/atlas-task-validator/SKILL.md +29 -14
- package/hosts/opencode/.opencode/skills/atlas-workflow-orchestrator/SKILL.md +22 -17
- package/hosts/pi/.pi/agents/atlas-direct-execute.md +6 -2
- package/hosts/pi/.pi/agents/atlas-findings-repair.md +15 -1
- package/hosts/pi/.pi/agents/atlas-plan-execute.md +16 -2
- package/hosts/pi/.pi/agents/atlas-slice-review.md +37 -2
- package/hosts/pi/.pi/agents/atlas-task-validator.md +18 -1
- package/hosts/pi/atlas/VERSION +1 -1
- package/hosts/pi/atlas/orchestrator/README.md +7 -5
- package/hosts/pi/atlas/orchestrator/commands/workflow.md +1 -1
- package/hosts/pi/atlas/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +22 -17
- package/hosts/pi/atlas/packages/mcp-server/README.md +1 -1
- package/hosts/pi/atlas/packages/mcp-server/package.json +1 -1
- package/hosts/pi/atlas/packages/mcp-server/server.js +446 -14
- package/hosts/pi/atlas/packages/templates/BACKLOG_MESTRE_TEMPLATE.md +14 -3
- package/hosts/pi/atlas/packages/templates/PRD_TEMPLATE.md +2 -1
- package/hosts/pi/atlas/packages/templates/STATE_FILE_SCHEMA.md +25 -1
- package/hosts/pi/skills/_shared/references/stack-profiles.md +36 -0
- package/hosts/pi/skills/_shared/scripts/document_quality.mjs +252 -0
- package/hosts/pi/skills/atlas-backlog-generator/SKILL.md +7 -2
- package/hosts/pi/skills/atlas-direct-execute/SKILL.md +6 -2
- package/hosts/pi/skills/atlas-findings-repair/SKILL.md +11 -1
- package/hosts/pi/skills/atlas-plan-execute/SKILL.md +16 -2
- package/hosts/pi/skills/atlas-plan-handoff/SKILL.md +6 -4
- package/hosts/pi/skills/atlas-prd-interview/SKILL.md +7 -2
- package/hosts/pi/skills/atlas-slice-review/SKILL.md +37 -2
- package/hosts/pi/skills/atlas-slice-review/references/scenario-lenses.md +8 -0
- package/hosts/pi/skills/atlas-slice-review/scripts/classify_findings.mjs +60 -0
- package/hosts/pi/skills/atlas-slice-review/scripts/classify_findings.py +9 -41
- package/hosts/pi/skills/atlas-sprint-prd-generator/SKILL.md +7 -4
- package/hosts/pi/skills/atlas-task-validator/SKILL.md +29 -14
- package/hosts/pi/skills/atlas-workflow-orchestrator/SKILL.md +22 -17
- package/package.json +1 -1
- package/plugins/atlas-workflow-orchestrator/.codex/agents/atlas-findings-repair.toml +1 -1
- package/plugins/atlas-workflow-orchestrator/.codex/agents/atlas-task-validator.toml +1 -1
- package/plugins/atlas-workflow-orchestrator/.codex-plugin/plugin.json +1 -1
- package/plugins/atlas-workflow-orchestrator/VERSION +1 -1
- package/plugins/atlas-workflow-orchestrator/agents/atlas-findings-repair.md +4 -0
- package/plugins/atlas-workflow-orchestrator/agents/atlas-task-validator.md +18 -1
- package/plugins/atlas-workflow-orchestrator/orchestrator/README.md +7 -5
- package/plugins/atlas-workflow-orchestrator/orchestrator/commands/workflow.md +1 -1
- package/plugins/atlas-workflow-orchestrator/orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +22 -17
- package/plugins/atlas-workflow-orchestrator/packages/mcp-server/README.md +1 -1
- package/plugins/atlas-workflow-orchestrator/packages/mcp-server/package.json +1 -1
- package/plugins/atlas-workflow-orchestrator/packages/mcp-server/server.js +446 -14
- package/plugins/atlas-workflow-orchestrator/packages/skills/_shared/references/stack-profiles.md +36 -0
- package/plugins/atlas-workflow-orchestrator/packages/skills/_shared/scripts/document_quality.mjs +252 -0
- package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-backlog-generator/SKILL.md +7 -2
- package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-direct-execute/SKILL.md +6 -2
- package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-findings-repair/SKILL.md +11 -1
- package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-plan-execute/SKILL.md +16 -2
- package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-plan-handoff/SKILL.md +6 -4
- package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-prd-interview/SKILL.md +7 -2
- package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-slice-review/SKILL.md +37 -2
- package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-slice-review/references/scenario-lenses.md +8 -0
- package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-slice-review/scripts/classify_findings.mjs +60 -0
- package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-slice-review/scripts/classify_findings.py +9 -41
- package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-sprint-prd-generator/SKILL.md +7 -4
- package/plugins/atlas-workflow-orchestrator/packages/skills/atlas-task-validator/SKILL.md +29 -14
- package/plugins/atlas-workflow-orchestrator/packages/templates/BACKLOG_MESTRE_TEMPLATE.md +14 -3
- package/plugins/atlas-workflow-orchestrator/packages/templates/PRD_TEMPLATE.md +2 -1
- package/plugins/atlas-workflow-orchestrator/packages/templates/STATE_FILE_SCHEMA.md +25 -1
- package/plugins/atlas-workflow-orchestrator/skills/_shared/references/stack-profiles.md +36 -0
- package/plugins/atlas-workflow-orchestrator/skills/_shared/scripts/document_quality.mjs +252 -0
- package/plugins/atlas-workflow-orchestrator/skills/atlas-backlog-generator/SKILL.md +7 -2
- package/plugins/atlas-workflow-orchestrator/skills/atlas-direct-execute/SKILL.md +6 -2
- package/plugins/atlas-workflow-orchestrator/skills/atlas-findings-repair/SKILL.md +11 -1
- package/plugins/atlas-workflow-orchestrator/skills/atlas-plan-execute/SKILL.md +16 -2
- package/plugins/atlas-workflow-orchestrator/skills/atlas-plan-handoff/SKILL.md +6 -4
- package/plugins/atlas-workflow-orchestrator/skills/atlas-prd-interview/SKILL.md +7 -2
- package/plugins/atlas-workflow-orchestrator/skills/atlas-slice-review/SKILL.md +37 -2
- package/plugins/atlas-workflow-orchestrator/skills/atlas-slice-review/references/scenario-lenses.md +8 -0
- package/plugins/atlas-workflow-orchestrator/skills/atlas-slice-review/scripts/classify_findings.mjs +60 -0
- package/plugins/atlas-workflow-orchestrator/skills/atlas-slice-review/scripts/classify_findings.py +9 -41
- package/plugins/atlas-workflow-orchestrator/skills/atlas-sprint-prd-generator/SKILL.md +7 -4
- package/plugins/atlas-workflow-orchestrator/skills/atlas-task-validator/SKILL.md +29 -14
- package/plugins/atlas-workflow-orchestrator/skills/atlas-workflow-orchestrator/SKILL.md +22 -17
- package/plugins/atlas-workflow-orchestrator/templates/BACKLOG_MESTRE_TEMPLATE.md +14 -3
- package/plugins/atlas-workflow-orchestrator/templates/PRD_TEMPLATE.md +2 -1
- package/plugins/atlas-workflow-orchestrator/templates/STATE_FILE_SCHEMA.md +25 -1
|
@@ -34,6 +34,14 @@ Use these lenses to find hidden bugs in the executed slice. Apply only the relev
|
|
|
34
34
|
- Is retry or re-entry behavior still coherent after this slice?
|
|
35
35
|
- Did generated files, localization keys, imports, routes, RPC signatures, or schemas match the verified repo convention?
|
|
36
36
|
|
|
37
|
+
## Mecânica da mudança
|
|
38
|
+
|
|
39
|
+
- Qual invariante cada guard, validação, cleanup, error path ou teste removido/substituído protegia, e onde ele foi restabelecido?
|
|
40
|
+
- Callers e callees alterados ainda concordam sobre pré-condições, shapes de retorno, erros, timing e ordem?
|
|
41
|
+
- A mudança corrige o componente proprietário do invariante ou adiciona um caso especial local frágil?
|
|
42
|
+
- Algum novo problema de reuse, simplificação ou eficiência tem custo comportamental, operacional ou de manutenção concreto?
|
|
43
|
+
- As instruções aplicáveis do repo expõem uma violação exata, atribuível a uma linha e com impacto concreto?
|
|
44
|
+
|
|
37
45
|
## Security and safety
|
|
38
46
|
|
|
39
47
|
- Did the slice weaken permission, ownership, or visibility checks?
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import { pathToFileURL } from 'node:url';
|
|
4
|
+
|
|
5
|
+
export const SEVERITY_ORDER = Object.freeze({ P0: 0, P1: 1, P2: 2, P3: 3 });
|
|
6
|
+
export const REQUIRED_TEXT_FIELDS = Object.freeze([
|
|
7
|
+
'task_id', 'title', 'file', 'failure_mode', 'evidence', 'recommendation', 'fix_validation',
|
|
8
|
+
]);
|
|
9
|
+
|
|
10
|
+
export function normalizeFinding(finding, index) {
|
|
11
|
+
if (!finding || typeof finding !== 'object' || Array.isArray(finding)) {
|
|
12
|
+
throw new Error(`Finding ${index} must be a JSON object`);
|
|
13
|
+
}
|
|
14
|
+
if (!(finding.severity in SEVERITY_ORDER)) {
|
|
15
|
+
throw new Error(`Finding ${index} has invalid severity: ${JSON.stringify(finding.severity)}`);
|
|
16
|
+
}
|
|
17
|
+
const missing = REQUIRED_TEXT_FIELDS.filter(
|
|
18
|
+
(field) => typeof finding[field] !== 'string' || !finding[field].trim(),
|
|
19
|
+
);
|
|
20
|
+
if (missing.length) throw new Error(`Finding ${index} missing required fields: ${missing.join(', ')}`);
|
|
21
|
+
if (!Number.isInteger(finding.line) || finding.line < 1) {
|
|
22
|
+
throw new Error(`Finding ${index} has invalid line: ${JSON.stringify(finding.line)}`);
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
severity: finding.severity,
|
|
26
|
+
task_id: finding.task_id,
|
|
27
|
+
title: finding.title,
|
|
28
|
+
file: finding.file,
|
|
29
|
+
line: finding.line,
|
|
30
|
+
summary: typeof finding.summary === 'string' ? finding.summary : '',
|
|
31
|
+
failure_mode: finding.failure_mode,
|
|
32
|
+
evidence: finding.evidence,
|
|
33
|
+
recommendation: finding.recommendation,
|
|
34
|
+
fix_validation: finding.fix_validation,
|
|
35
|
+
diff_attributed: finding.diff_attributed !== false,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function classifyFindings(payload) {
|
|
40
|
+
if (!Array.isArray(payload)) throw new Error('Findings input must be a JSON array');
|
|
41
|
+
return payload.map(normalizeFinding).sort((a, b) => (
|
|
42
|
+
SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity]
|
|
43
|
+
|| a.task_id.localeCompare(b.task_id)
|
|
44
|
+
|| a.file.localeCompare(b.file)
|
|
45
|
+
|| a.line - b.line
|
|
46
|
+
));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function run(argv = process.argv.slice(2)) {
|
|
50
|
+
if (argv.length !== 1) throw new Error('Usage: node classify_findings.mjs <findings.json>');
|
|
51
|
+
const payload = JSON.parse(fs.readFileSync(argv[0], 'utf8'));
|
|
52
|
+
process.stdout.write(`${JSON.stringify(classifyFindings(payload), null, 2)}\n`);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (import.meta.url === pathToFileURL(process.argv[1] ?? '').href) {
|
|
56
|
+
try { run(); } catch (error) {
|
|
57
|
+
process.stderr.write(`${error.message}\n`);
|
|
58
|
+
process.exitCode = 1;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -1,56 +1,24 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
2
|
+
"""Wrapper legado: delega ao gate Node canônico por uma release."""
|
|
3
3
|
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
6
|
-
import argparse
|
|
7
|
-
import json
|
|
8
6
|
import pathlib
|
|
7
|
+
import subprocess
|
|
9
8
|
import sys
|
|
10
|
-
from typing import Any
|
|
11
|
-
|
|
12
|
-
SEVERITY_ORDER = {"P0": 0, "P1": 1, "P2": 2, "P3": 3}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def load_findings(path: pathlib.Path) -> list[dict[str, Any]]:
|
|
16
|
-
payload = json.loads(path.read_text(encoding="utf-8"))
|
|
17
|
-
if not isinstance(payload, list):
|
|
18
|
-
raise ValueError("Findings input must be a JSON array")
|
|
19
|
-
return payload
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def normalize_finding(finding: dict[str, Any]) -> dict[str, Any]:
|
|
23
|
-
severity = finding.get("severity", "P2")
|
|
24
|
-
if severity not in SEVERITY_ORDER:
|
|
25
|
-
severity = "P2"
|
|
26
|
-
return {
|
|
27
|
-
"severity": severity,
|
|
28
|
-
"task_id": finding.get("task_id", ""),
|
|
29
|
-
"title": finding.get("title", ""),
|
|
30
|
-
"file": finding.get("file", ""),
|
|
31
|
-
"line": finding.get("line"),
|
|
32
|
-
"summary": finding.get("summary", ""),
|
|
33
|
-
"evidence": finding.get("evidence", ""),
|
|
34
|
-
"diff_attributed": bool(finding.get("diff_attributed", True)),
|
|
35
|
-
}
|
|
36
9
|
|
|
37
10
|
|
|
38
11
|
def main() -> int:
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
12
|
+
if len(sys.argv) != 2:
|
|
13
|
+
sys.stderr.write("Usage: python classify_findings.py <findings.json>\n")
|
|
14
|
+
return 1
|
|
15
|
+
script = pathlib.Path(__file__).with_name("classify_findings.mjs")
|
|
43
16
|
try:
|
|
44
|
-
|
|
45
|
-
except
|
|
46
|
-
sys.stderr.write(
|
|
17
|
+
return subprocess.run(["node", str(script), sys.argv[1]], check=False).returncode
|
|
18
|
+
except FileNotFoundError:
|
|
19
|
+
sys.stderr.write("Node.js ausente: requisito runtime do Atlas\n")
|
|
47
20
|
return 1
|
|
48
21
|
|
|
49
|
-
normalized.sort(key=lambda item: (SEVERITY_ORDER[item["severity"]], item["task_id"], item["file"], item["line"] or 0))
|
|
50
|
-
json.dump(normalized, sys.stdout, indent=2)
|
|
51
|
-
sys.stdout.write("\n")
|
|
52
|
-
return 0
|
|
53
|
-
|
|
54
22
|
|
|
55
23
|
if __name__ == "__main__":
|
|
56
24
|
raise SystemExit(main())
|
|
@@ -16,6 +16,7 @@ Todo PRD gerado por esta skill deve declarar explicitamente a cadeia de execuç
|
|
|
16
16
|
* Sprint ID: `S<NN>` (`S01`, `S02`, etc.).
|
|
17
17
|
* Opcional: app/projeto alvo quando houver mais de uma fonte de backlog/roadmap.
|
|
18
18
|
* Opcional: path de saída.
|
|
19
|
+
* Opcional: path explícito do backlog autoritativo. Quando fornecido, vence qualquer descoberta.
|
|
19
20
|
|
|
20
21
|
*Se faltar o Sprint ID, peça antes de gerar.*
|
|
21
22
|
|
|
@@ -23,10 +24,11 @@ Todo PRD gerado por esta skill deve declarar explicitamente a cadeia de execuç
|
|
|
23
24
|
|
|
24
25
|
## Workflow Obrigatório
|
|
25
26
|
|
|
26
|
-
1. **Localizar Insumos:** Descubra a raiz do repo com `git rev-parse --show-toplevel`. Localize o template canônico em `<raiz-do-plugin>/packages/templates/PRD_TEMPLATE.md`. Localize
|
|
27
|
-
2. **
|
|
28
|
-
3. **
|
|
29
|
-
4. **
|
|
27
|
+
1. **Localizar Insumos:** Descubra a raiz do repo com `git rev-parse --show-toplevel`. Localize o template canônico em `<raiz-do-plugin>/packages/templates/PRD_TEMPLATE.md`. Localize backlogs candidatos (`**/BACKLOG_MESTRE*.md`) sem escolher por heurística silenciosa.
|
|
28
|
+
2. **Fechar autoridade:** use `../_shared/scripts/document_quality.mjs#resolveSprintAuthority` com precedência fixa: path explícito → backlog canônico referenciado pelo artefato/input → único candidato contendo o Sprint ID. Zero match bloqueia. Múltiplos matches sem autoridade, mesmo com conteúdo parecido, bloqueiam com paths conflitantes e `next_action` para informar o path.
|
|
29
|
+
3. **Extração da Sprint:** leia somente a fonte autoritativa. Extraia fase-fonte, objetivo, dependências e filename do PRD; registre no PRD o path + anchor exato da linha/seção do backlog.
|
|
30
|
+
4. **Inspecionar Código:** Busque no codebase por contratos reais que influenciam a feature e registre anchors estáveis (`path:símbolo` ou `path:linha`) nas referências; não copie implementação para o PRD.
|
|
31
|
+
5. **Redação/atualização:** siga `PRD_TEMPLATE.md`. Ao atualizar, preserve IDs `D*`, decisões fechadas, anchors e histórico; novos IDs são append-only. Mudança deliberada em D* exige decisão explícita e registro histórico.
|
|
30
32
|
|
|
31
33
|
### Resolução Canônica de Templates
|
|
32
34
|
|
|
@@ -57,6 +59,7 @@ Todo PRD criado ou atualizado por esta skill deve incluir, perto do topo e sem s
|
|
|
57
59
|
|
|
58
60
|
* **Status final:** `Aprovado para implementação`. Setar **automaticamente** ao finalizar a geração — é o status que o gate TC do orquestrador exige (`required_status=Aprovado para implementação`) para o PRD avançar no pipeline. Não deixar `Draft` (trava o gate e força correção manual). O sinal de determinismo que sustenta o avanço é o `atlas_scan_prd` (varredura de ambiguidade) + entrevista quando houver padrões bloqueantes — não o campo Status, que é marcador documental.
|
|
59
61
|
* **Data:** ISO `YYYY-MM-DD` (hoje).
|
|
62
|
+
* **Autoridade:** `Relacionado`/`Referências` inclui backlog autoritativo + anchor da sprint e anchors de código/contrato usados.
|
|
60
63
|
* **Escopo:** Lista fechada de capacidades funcionais.
|
|
61
64
|
* **UX:** Cobrir caminhos de `loading`, `empty`, `error`, `success` e `permission` sob a perspectiva do usuário.
|
|
62
65
|
* **Critérios de Aceite:** Binários e observáveis, divididos conforme `PRD_TEMPLATE.md` em: **Produto**, **UX**, **Dados** e **Regressão de produto**.
|
|
@@ -34,9 +34,16 @@ Read the JSON file at `.atlas/state/<run_id>/<slice>.json` using the schema in `
|
|
|
34
34
|
3. **Executed task ids** — `tasks`.
|
|
35
35
|
4. **Boundary refs** — `boundary_refs`.
|
|
36
36
|
5. **Explicit cold-review note** — you did not observe implementation; read current code only.
|
|
37
|
+
6. **Deterministic boundary** — `base_sha`, `head_sha`, `contract_kind`, and all evidence/probe arrays.
|
|
38
|
+
7. **Working-tree delta** — compare `worktree_baseline`/`worktree_final` and current tree; unchanged preexisting dirt stays outside, later mutations must be evidenced.
|
|
39
|
+
8. **Repair correlation** — on attempt 2, correlate every target finding id with `repair_evidence` in the same state path.
|
|
37
40
|
|
|
38
41
|
Do not accept inline contract, copied diff, or pasted task lists as the validation boundary. If `state_path` is missing, unreadable, or lacks any required field, return JSON with `verdict: "fail"` and one P1 finding for `Input insuficiente: <missing item>`.
|
|
39
42
|
|
|
43
|
+
Compatibilidade: state legado mínimo sem `contract_kind` só é aceito quando `executor_skill=atlas-plan-execute`; nesse caso o plano continua autoritativo. State de `atlas-direct-execute` exige extensão completa e `obligations` não vazio.
|
|
44
|
+
|
|
45
|
+
Antes de validar código, compare `base_sha...head_sha`, `HEAD`, snapshot final atual e delta `worktree_baseline→worktree_final` com `files_changed`/evidências. Não infira base pelo nome da branch. Divergência gera `boundary_violations` e finding P1 estruturado.
|
|
46
|
+
|
|
40
47
|
---
|
|
41
48
|
|
|
42
49
|
## Resolução Canônica de Templates
|
|
@@ -79,23 +86,24 @@ Do not accept inline contract, copied diff, or pasted task lists as the validati
|
|
|
79
86
|
3. **For each relevant Section 6 Contract:** verify signature, behavior, and returned shape where applicable.
|
|
80
87
|
4. **For each relevant Section 8 checklist item:** mark it pass or fail with evidence.
|
|
81
88
|
5. **Perform cross-task checks** for shared state, missing required args, route order, partial failure handling, and UI/backend permission mismatch.
|
|
82
|
-
6. **
|
|
89
|
+
6. **Aplique baseline + perfis ativos** abaixo. Resolva os perfis por manifests/comandos reais conforme `../_shared/references/stack-profiles.md`; não invente critérios fora do plano, baseline e perfis ativos.
|
|
83
90
|
7. **Do not patch files or propose diffs.** Suggested fix must fit in 1-2 lines of text.
|
|
84
91
|
|
|
85
92
|
---
|
|
86
93
|
|
|
87
|
-
##
|
|
94
|
+
## Baseline universal + perfis
|
|
95
|
+
|
|
96
|
+
Fonte compartilhada: `../_shared/references/stack-profiles.md`. Execute `detectStackProfiles(project_root, declared_commands, boundary_paths)` de `../_shared/scripts/document_quality.mjs`; aplique cada entrada de `boundaries` somente aos arquivos daquele package.
|
|
97
|
+
|
|
98
|
+
Sempre aplique baseline universal: segurança/permissões, boundary/contratos, erros/falhas parciais, concorrência/reentrada, cleanup/estado stale, integridade de dados/input e checks realmente declarados.
|
|
99
|
+
|
|
100
|
+
Ative regras específicas somente quando o perfil retornar `true`:
|
|
88
101
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
* **Backend and UI gate match:** Sensitive mutations require server-side enforcement. UI gating alone is insufficient (Page reads `canManage` from Store).
|
|
95
|
-
* **Route registration:** Literal routes are registered before parameterized routes (`/:id`, `/:id/edit`) under the same prefix.
|
|
96
|
-
* **Localization:** New localization keys must exist in every required locale file; generated l10n is clean.
|
|
97
|
-
* **Analyzer:** `flutter analyze` (or stack equivalent) returns zero issues for touched files in boundary.
|
|
98
|
-
* **Casts and nullability:** Remote payload casts use safe defensive patterns; nulos in collections treated with `?? []`.
|
|
102
|
+
- `flutter_dart`: lifecycle Flutter, rotas/args, null-safety/casts, l10n, analyze/test; GetX somente se dependência/import/regra real confirmar GetX.
|
|
103
|
+
- `node_typescript`: handles/promises, validação runtime, ESM/CJS/exports/tipos e scripts Node reais.
|
|
104
|
+
- `python`: context managers/cleanup, exceções/async, typing/parsing e ferramentas Python declaradas.
|
|
105
|
+
|
|
106
|
+
Monorepo pode ativar múltiplos perfis, sempre restritos ao boundary correspondente. Fixture Node sem sinal Flutter não recebe regra Flutter/GetX.
|
|
99
107
|
|
|
100
108
|
---
|
|
101
109
|
|
|
@@ -110,10 +118,15 @@ Return strict JSON as the final output. Do not wrap it in Markdown and do not pr
|
|
|
110
118
|
"verdict": "pass | fail | pass_with_observations",
|
|
111
119
|
"findings": [
|
|
112
120
|
{
|
|
121
|
+
"id": "F-001",
|
|
113
122
|
"severity": "P0|P1|P2|P3",
|
|
114
123
|
"file": "string",
|
|
115
|
-
"line":
|
|
116
|
-
"
|
|
124
|
+
"line": 1,
|
|
125
|
+
"failure_mode": "string",
|
|
126
|
+
"evidence": "string",
|
|
127
|
+
"recommendation": "string",
|
|
128
|
+
"fix_validation": "string",
|
|
129
|
+
"msg": "string (deprecated; derivado por uma release)"
|
|
117
130
|
}
|
|
118
131
|
],
|
|
119
132
|
"observations": [
|
|
@@ -134,6 +147,8 @@ Return strict JSON as the final output. Do not wrap it in Markdown and do not pr
|
|
|
134
147
|
|
|
135
148
|
`dispatch_token` must equal `validator_recovery.expected_dispatch_token`. `findings`, `observations`, and `boundary_violations` must always be arrays. Use empty arrays when there are no items.
|
|
136
149
|
|
|
150
|
+
IDs são únicos, obrigatórios no formato `F-NNN` e estáveis nos dois ciclos. Severity é estritamente `P0|P1|P2|P3`. No segundo ciclo, confirme por ID que `repair_evidence` registra arquivos, checks e `status: resolved`; finding não correlacionado permanece P1. O MCP rejeita shape incompleto e `pass`/`pass_with_observations` quando há P0/P1.
|
|
151
|
+
|
|
137
152
|
**Proof-of-work (`challenge_response`).** If `validator_recovery.challenge` is not `null`, it carries `{ file, algo: "sha256" }` — a boundary file you must have read access to. Compute the sha256 of that file's raw bytes (`shasum -a 256 "<challenge.file>"`) and return the hex (first token) in `challenge_response`. If `challenge` is `null`, return `null`. Never fabricate the hash: the orchestrator recomputes it from disk and blocks the slice (`challenge_failed`) on mismatch. This is a *mechanical* attestation that the verdict touched real boundary bytes — it closes the laziest bypass (claiming `pass` with no read at all); it does **not** by itself prove you read and understood the code (hashing a file does not require loading its content). Reading the boundary remains your obligation. It is not a non-forgeable isolation proof either (the MCP shares one stdio caller). Challenge failures are bounded per attempt: past the cap the slot closes terminally (`challenge_exhausted`), which usually signals path resolution diverging from the consumer root.
|
|
138
153
|
|
|
139
154
|
---
|
|
@@ -21,7 +21,7 @@ Orquestra pipelines de desenvolvimento de features no projeto Atlas, automatizan
|
|
|
21
21
|
Três modos **canônicos de execução** — `full`, `direct`, `execute` (PRD §5 D1) — mais o modo `interview-only`, que permanece **separado** (entrevista sem execução; PRD D2, não é colapsado em `full`).
|
|
22
22
|
|
|
23
23
|
- **`full`** — pipeline completo: PRD → validação → entrevista (se necessário) → **plano (artefato obrigatório)** → executor → review (opcional)
|
|
24
|
-
- **`direct`** — pipeline enxuto: PRD → validação → entrevista (se necessário) →
|
|
24
|
+
- **`direct`** — pipeline enxuto: PRD → validação → entrevista (se necessário) → `atlas-direct-execute` → review (opcional). **Não produz plano de handoff** — a diferença real para `full` é exatamente essa.
|
|
25
25
|
- **`execute`** — recebe um **`PLAN_*.md` pronto** e o executa **sem gerar plano** (PRD D1). Entrada = caminho de plano; reverifica o artefato + conformidade de template e despacha `plan_execute` direto. Não regera nem replaneja: ajustes de plano pedem `full`. `atlas_assert_after_plan` (gate pós-plano do `full`) **não se aplica** em `execute` — o plano já é o input; o equivalente é a reverificação na entrada (PRD D13). **Não há alias `plan`**: usar `plan` como modo é ambíguo com planejamento documental e deve ser rejeitado como modo inválido.
|
|
26
26
|
- **`interview-only`** — entrevista direta (ex: brainstorm, resolução de decisões). Entrevista **sem execução**: não usa `guarantee_level` no fluxo (não há execução de código a garantir). Permanece modo separado (PRD D2).
|
|
27
27
|
|
|
@@ -51,7 +51,7 @@ Três modos **canônicos de execução** — `full`, `direct`, `execute` (PRD §
|
|
|
51
51
|
→ Gera PRD de indicação, força entrevista, plano, executor
|
|
52
52
|
|
|
53
53
|
/workflow interview-only brainstorm "que tal dark mode?"
|
|
54
|
-
→
|
|
54
|
+
→ Cria draft mínimo pelo template canônico, valida o path e entrevista esse PRD; sem execução
|
|
55
55
|
|
|
56
56
|
/workflow execute plan "/path/to/PLAN_S05_login.md"
|
|
57
57
|
→ Reverifica o plano (artifact + TC), executa direto via plan_execute + validador frio. Não gera plano.
|
|
@@ -102,7 +102,7 @@ Executar **antes** de iniciar o pipeline. Se qualquer item falhar, **parar e rep
|
|
|
102
102
|
Ação: instalar/ativar o plugin ou corrigir o pacote atlas-* disponível no host
|
|
103
103
|
```
|
|
104
104
|
**PROIBIDO o fallback "implementação direta" / "contratos equivalentes inline".** Não existe caminho onde o orquestrador faz plano ou código no próprio fio. Emulação inline e fallback direto são a falha-raiz que esta skill proíbe — se não há sub-agent, **para**. (Gate G7.)
|
|
105
|
-
8. **Rejeitar conflito de modo:** se o pedido tiver `full`/`direct` junto com "sem patch", "sem editar código", "planejamento apenas", "handoff only" ou equivalente, **pare antes de gerar artefatos**. `full
|
|
105
|
+
8. **Rejeitar conflito de modo:** se o pedido tiver `full`/`direct` junto com "sem patch", "sem editar código", "planejamento apenas", "handoff only" ou equivalente, **pare antes de gerar artefatos**. `full` executa `atlas-plan-execute`; `direct` executa `atlas-direct-execute`; não existe interpretação plan-only implícita.
|
|
106
106
|
9. **Declarar o plano de execução** (1 bloco curto): `run_id`, modo, **ids exatos de cada sub-agent**, sequência de fases, artefatos esperados e tools MCP que sustentarão cada gate. Só então iniciar a Fase 1.
|
|
107
107
|
|
|
108
108
|
---
|
|
@@ -120,7 +120,7 @@ O pipeline é **fire-and-continue**: uma vez iniciado, o orquestrador avança fa
|
|
|
120
120
|
|
|
121
121
|
**Após entrevista**: reexecuta os gates afetados (`atlas_verify_artifact`/`atlas_scan_prd`/TC) e **retoma o pipeline (plano→execução) automaticamente**, sem nova confirmação.
|
|
122
122
|
|
|
123
|
-
A única interação legítima com o usuário é **dentro de uma fase** — o `
|
|
123
|
+
A única interação legítima com o usuário é **dentro de uma fase** — o mecanismo estruturado `question_prompt` devolvido por `atlas_capabilities`, usado pela entrevista para resolver ambiguidade de produto. Resolver ambiguidade ≠ pedir permissão pra avançar. Terminada a fase, respostas são persistidas no PRD, gates são reexecutados e o pipeline segue sozinho.
|
|
124
124
|
|
|
125
125
|
## Papel do orquestrador (fronteira de determinismo pela mutação de código)
|
|
126
126
|
|
|
@@ -129,7 +129,7 @@ O orquestrador **coordena a execução**, não implementa código — maestro qu
|
|
|
129
129
|
- **ANTES do plano validado — autoria documental livre no fio principal.** Pode autorar PRD, entrevistar e escrever `PLAN_*.md` direto; fases documentais não exigem sub-agent (documento não muta o produto). **Ao finalizar um PRD inline, estampar `| Status | Aprovado para implementação |`** — é o `required_status` do gate TC; sem isso o PRD sai `Draft` e trava o TC em rodadas de correção.
|
|
130
130
|
- **DEPOIS do plano validado (`atlas_verify_artifact` + TC `passed`) — mãos atadas fortes.** Não edita mais PRD/plano/código nem roda comando mutante; só coordena (despachar sub-agent, ler artefato pra verificar gate, ecoar banner, montar output).
|
|
131
131
|
|
|
132
|
-
Execução de código é **sempre** sub-agent `
|
|
132
|
+
Execução de código é **sempre** sub-agent executor do modo (`atlas-plan-execute` em `full`/`execute`; `atlas-direct-execute` em `direct`), mantendo `phase: plan_execute`, + validador frio `task_validator` (Gate G9/G7). Dispatch blocking: despacha → espera retorno → verifica gate → próxima fase. Nunca dois sub-agents simultâneos.
|
|
133
133
|
|
|
134
134
|
### Verbo de dispatch é host-agnóstico (não assuma "Agent tool")
|
|
135
135
|
|
|
@@ -180,9 +180,9 @@ Regras inegociáveis. Violação = parar, não contornar.
|
|
|
180
180
|
|
|
181
181
|
## Fluxo de execução
|
|
182
182
|
|
|
183
|
-
### [EXEC] — passo comum de execução + validação
|
|
183
|
+
### [EXEC] — passo comum de execução + validação
|
|
184
184
|
|
|
185
|
-
`atlas_lock_dispatch(action=start, phase=plan_execute)
|
|
185
|
+
`atlas_lock_dispatch(action=start, phase=plan_execute)` em todos os modos; despachar como sub-agent blocking o `routing.executor_skill` devolvido pelo preflight: `atlas-plan-execute` em `full`/`execute`, `atlas-direct-execute` em `direct`. O executor emite checkpoints G12; sem retorno/progresso, chamar `atlas_lock_dispatch(action=status, phase=plan_execute)` e tratar `executor_bootstrap_timeout`/`executor_progress_timeout` como `stalled`/retry — nunca como execução em andamento. O executor retorna `validator_handoff_required` com `state_path`; o MCP só abre o slot após o checkpoint `state_path_created` para esse mesmo `state_path`. Validação sempre **sibling**: `atlas_lock_validator(action=start)`, despachar **um** `task_validator`, exigir no output o `dispatch_token` do slot e fechar com `validator_run_id` + `dispatch_token`. Em `fail`: `repair_start`, despachar `atlas-findings-repair` com `{state_path, findings, validator_attempt, repair_run_id, repair_budget: 1}`, exigir atualização do mesmo `state_path`, fechar com `repair_run_id` e rodar o **2º e último** validator. `passed`/`passed_with_observations` são terminais aprovados; status diferente bloqueia review e output completed.
|
|
186
186
|
|
|
187
187
|
### Full mode
|
|
188
188
|
|
|
@@ -225,8 +225,9 @@ Entrada: um **`PLAN_*.md` pronto**. Artefatos esperados: (plano já existe) →
|
|
|
225
225
|
|
|
226
226
|
### Interview-only mode
|
|
227
227
|
|
|
228
|
-
1.
|
|
229
|
-
2.
|
|
228
|
+
1. Se a entrada já for PRD válido, usar seu path. Se for `brainstorm`, criar primeiro um draft mínimo em disco com `packages/templates/PRD_TEMPLATE.md`, preservando as 6 seções canônicas e registrando o brainstorm em contexto/objetivo.
|
|
229
|
+
2. Verificar o draft com `atlas_verify_artifact` e `atlas_verify_template_conformance(artifact_type=prd)`; path ausente/inválido bloqueia.
|
|
230
|
+
3. Invocar `prd_interview` no fio principal com `prd_path` válido; persistir respostas no mesmo artefato e reverificar.
|
|
230
231
|
|
|
231
232
|
> `interview-only` é entrevista **sem execução**: não há fase `plan_execute` nem `guarantee_level` no fluxo (nada de código a garantir). A autoria do esboço é documental e livre.
|
|
232
233
|
|
|
@@ -245,9 +246,10 @@ O scan é **determinístico** e roda **dentro do MCP** (`atlas_scan_prd`): a lis
|
|
|
245
246
|
Detalhe do caminho que a "Princípio de continuação automática" exige para decisão pendente de **qualquer fonte** (scan/entrevista/validação de plano/`PERGUNTAS_EM_ABERTO.md`/`DISCUSSAO_*.md`/backlog — a fonte não muda o tratamento):
|
|
246
247
|
|
|
247
248
|
1. **Garantir o PRD primeiro.** Em `full`/`direct`, se o PRD não existe, **gerar o PRD draft** com as decisões marcadas. A entrevista é **PRD-scoped**: roda **sobre** o PRD, nunca antes. Detectar decisão não antecipa nem pula a geração do PRD.
|
|
248
|
-
2. **Disparar `atlas-prd-interview`** sobre o PRD — resolve via `
|
|
249
|
-
3. **
|
|
250
|
-
4. **
|
|
249
|
+
2. **Disparar `atlas-prd-interview`** sobre o PRD — resolve via `atlas_capabilities.question_prompt`, sem hardcode de host.
|
|
250
|
+
3. **Persistir após cada rodada** no mesmo PRD, reindexar §3–§6 e não repetir D* fechada.
|
|
251
|
+
4. **Propagar** ao PRD/plano/DEC/registro de origem.
|
|
252
|
+
5. **Reexecutar** os gates afetados (`atlas_verify_artifact`/`atlas_scan_prd`/TC) e **continuar** automaticamente.
|
|
251
253
|
|
|
252
254
|
Marcar TBD e adiar só se o usuário pedir **explicitamente** — nunca por iniciativa do orquestrador.
|
|
253
255
|
|
|
@@ -326,13 +328,16 @@ Se `full` gerou `PLAN_*.md` mas não despachou `plan_execute`, o cabeçalho deve
|
|
|
326
328
|
|
|
327
329
|
## Skills envolvidas
|
|
328
330
|
|
|
331
|
+
`atlas-backlog-generator` aparece apenas para descoberta do catálogo: é **explicit-only** e nunca integra `full`/`direct`/`execute`/`interview-only`. A cadeia automática começa em PRD/input já fornecido.
|
|
332
|
+
|
|
329
333
|
| Skill | Entrada | Saída (artefato) |
|
|
330
334
|
|-------|---------|------------------|
|
|
331
|
-
| `atlas-backlog-generator` |
|
|
335
|
+
| `atlas-backlog-generator` (**explicit-only**) | pedido explícito de backlog | `BACKLOG_MESTRE_*.md` |
|
|
332
336
|
| `atlas-sprint-prd-generator` | sprint_id/indicação | `PRD_*.md`, decisions_found |
|
|
333
337
|
| `atlas-prd-interview` | prd_path, ambiguities | `PRD_*.md` atualizado, decisions |
|
|
334
338
|
| `atlas-plan-handoff` | prd_path | `PLAN_*.md` |
|
|
335
|
-
| `atlas-plan-execute` | plan_path (full /
|
|
339
|
+
| `atlas-plan-execute` | plan_path (`full` / `execute`) | diff de código, evidência, `state_path` |
|
|
340
|
+
| `atlas-direct-execute` | prd_path/spec/task (`direct`) | diff de código, evidência, `state_path` |
|
|
336
341
|
| `atlas-slice-review` | diff/output | review_feedback |
|
|
337
342
|
|
|
338
343
|
**Sub-agent frio (Gate G4):** `atlas-task-validator` é verificado no pré-flight pelo orquestrador e sempre roda isolado como **sub-agent irmão (sibling)**, em todos os hosts: despachado pelo orquestrador a partir do `state_path` retornado pelo executor. A topologia é sempre sibling — o executor nunca despacha o validador.
|
|
@@ -356,11 +361,11 @@ Se o MCP não responder ou reportar drift, o pacote está inválido: abortar no
|
|
|
356
361
|
```
|
|
357
362
|
orquestrador
|
|
358
363
|
├─ MCP ping + preflight → atlas_ping + atlas_preflight (G10)
|
|
359
|
-
├─ PRD →
|
|
364
|
+
├─ PRD → autoria documental no pai → atlas_verify_artifact (G1)
|
|
360
365
|
├─ scan → atlas_scan_prd (G5) + TC → entrevista se bloqueado ou --interview
|
|
361
|
-
├─ PLANO →
|
|
366
|
+
├─ PLANO → autoria documental no pai → atlas_verify_artifact + atlas_verify_template_conformance
|
|
362
367
|
├─ G11 → atlas_assert_after_plan → próxima ação obrigatória = plan_execute
|
|
363
|
-
├─ EXECUÇÃO → atlas_lock_dispatch + sub-agent
|
|
368
|
+
├─ EXECUÇÃO → atlas_lock_dispatch + sub-agent atlas-plan-execute
|
|
364
369
|
├─ VALIDAÇÃO → lock_validator + task-validator irmão
|
|
365
370
|
│ └─ fail → findings-repair (budget 1, mesmo state_path) → validator final
|
|
366
371
|
└─ REVIEW → atlas_lock_dispatch + sub-agent slice_review (se --review)
|
package/package.json
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
name = "atlas-findings-repair"
|
|
2
2
|
description = "Reparador enxuto da família Atlas. Despachado pelo orquestrador apenas após `atlas-task-validator` retornar `fail` em topologia sibling. Corrige findings P0/P1/P2 dentro do boundary da slice sem carregar `atlas-plan-execute`/`atlas-direct-execute` e sem despachar novo validator."
|
|
3
|
-
developer_instructions = "# Atlas Findings Repair (sub-agent)\n\n<!-- MANUTENÇÃO (cross-host): shim portável. O contrato real vive em\n packages/skills/atlas-findings-repair/SKILL.md. Codex/opencode/pi geram\n registros nativos a partir deste arquivo por build/gen-host-agent.mjs. -->\n\nSub-agent de reparo bounded despachado pelo orquestrador `atlas-workflow-orchestrator`.\n\n## Primeira ação obrigatória\n\nCarregue a skill completa `atlas-findings-repair` e siga-a integralmente:\n\n- **Claude Code:** invoque a tool `Skill` com `atlas-findings-repair`.\n- **Outros hosts:** use o mecanismo nativo de skills do host para carregar `atlas-findings-repair`.\n\nProibido “agir como executor” a partir deste resumo. Se não conseguir carregar a skill, aborte com erro explícito; não substitua por `atlas-plan-execute` nem `atlas-direct-execute`.\n\n## Input\n\nO orquestrador passa obrigatoriamente `state_path`, findings estruturados, `validator_attempt`, `repair_run_id` e `repair_budget: 1`. Use `atlas_run_state` como fonte primária do estado da run.\n\n## Limites\n\n- Corrigir apenas findings P0/P1/P2 da slice atual\n- Não despachar validator nem outro subagente\n- Não replanejar\n- Não ampliar escopo\n- Atualizar o `state_path` original em lugar; não trocar o boundary para outro arquivo\n- Ao terminar, devolver `repair_complete` ou `blocked`"
|
|
3
|
+
developer_instructions = "# Atlas Findings Repair (sub-agent)\n\n<!-- MANUTENÇÃO (cross-host): shim portável. O contrato real vive em\n packages/skills/atlas-findings-repair/SKILL.md. Codex/opencode/pi geram\n registros nativos a partir deste arquivo por build/gen-host-agent.mjs. -->\n\nSub-agent de reparo bounded despachado pelo orquestrador `atlas-workflow-orchestrator`.\n\n## Primeira ação obrigatória\n\nCarregue a skill completa `atlas-findings-repair` e siga-a integralmente:\n\n- **Claude Code:** invoque a tool `Skill` com `atlas-findings-repair`.\n- **Outros hosts:** use o mecanismo nativo de skills do host para carregar `atlas-findings-repair`.\n\nProibido “agir como executor” a partir deste resumo. Se não conseguir carregar a skill, aborte com erro explícito; não substitua por `atlas-plan-execute` nem `atlas-direct-execute`.\n\n## Input\n\nO orquestrador passa obrigatoriamente `state_path`, findings estruturados, `validator_attempt`, `repair_run_id` e `repair_budget: 1`. Use `atlas_run_state` como fonte primária do estado da run.\n\n## Limites\n\n- Corrigir apenas findings P0/P1/P2 da slice atual\n- Não despachar validator nem outro subagente\n- Não replanejar\n- Não ampliar escopo\n- Atualizar o `state_path` original em lugar; não trocar o boundary para outro arquivo\n- Consumir IDs/recommendations estruturadas; persistir correlação em `repair_evidence`\n- Preservar `worktree_baseline`, recapturar `worktree_final` e incluir exatamente todo arquivo tocado em `files_changed`; recomputar `head_sha` e `diff_stat`\n- Aceitar somente IDs recebidos; cada arquivo tocado deve estar atribuído a um finding recebido, sem IDs/arquivos extras ou duplicados\n- Devolver `repairs[]` com `finding_id`, arquivos, checks e status\n- Ao terminar, devolver `repair_complete` ou `blocked`"
|
|
@@ -2,4 +2,4 @@ name = "atlas-task-validator"
|
|
|
2
2
|
description = "Validador frio de slice executada por atlas-plan-execute ou atlas-direct-execute. Invocado como subagente obrigatório antes do relatório final de uma slice. Recebe apenas state_path, lê o boundary da slice e o plano, compara código real vs contrato e retorna findings P0/P1/P2/P3 estruturados com veredito JSON determinístico. Não corrige código. Não propõe diff."
|
|
3
3
|
model = "gpt-5.4"
|
|
4
4
|
model_reasoning_effort = "high"
|
|
5
|
-
developer_instructions = "# Atlas Task Validator\n\n<!-- MANUTENÇÃO (cross-host): este corpo é o system prompt canônico do validator.\n Claude usa agents/<name>.md; Codex/opencode/pi geram registros nativos a partir\n deste arquivo. packages/skills/atlas-task-validator/SKILL.md documenta o contrato\n e o guard mantém o veredito/severidades sincronizados. -->\n\nSubagente de validação fria. Despachado pelo **orquestrador** como folha irmã (sibling) isolada, a partir do `state_path` que o executor escreve e retorna (`validator_handoff_required`), depois que todas as tasks de uma slice foram implementadas e localmente gateadas. Nunca é invocado pelo executor.\n\nObjetivo: passagem de validação fria e estruturada da slice entregue contra o contrato do plano. Você não observou a implementação — leia apenas o código atual.\n\n---\n\n## Invocation Contract\n\nVocê recebe **um único input base**: `state_path`.\n\nLeia o JSON em `.atlas/state/<run_id>/<slice>.json` usando o schema em `packages/templates/STATE_FILE_SCHEMA.md`. Desse arquivo, carregue:\n\n1. **Slice boundary** — `files_changed` + `diff_stat`.\n2. **Plan path** — `plan_path`, depois leia Section 2 (Invariantes de execução), Section 6 (Contratos técnicos) e Section 8 (Validação e checklist).\n3. **Executed task ids** — `tasks`.\n4. **Boundary refs** — `boundary_refs`.\n\nNão aceite contrato inline, diff colado ou listas de tasks coladas como boundary de validação. Se `state_path` estiver ausente, ilegível, ou faltar qualquer campo obrigatório, retorne JSON com `verdict: \"fail\"` e um finding P1 `Input insuficiente: <missing item>`.\n\n## State persistence\n\nUse `atlas_run_state` como fonte primária de metadados da run e estado de gate. O JSON em `state_path` é a projeção do boundary da slice para validação, não substituto do estado MCP. Se `atlas_run_state` estiver indisponível quando necessário para confirmar estado da run, retorne `verdict: \"fail\"` com finding P1 em vez de inferir status.\n\nAntes de validar, derive o `run_id` do `state_path`, chame `atlas_run_state(action=get)` e confirme:\n\n- `validator_recovery.status == \"running\"`\n- `validator_recovery.expected_state_path == state_path`\n- `validator_recovery.expected_dispatch_token` é inteiro\n\nCopie esse token sem alteração para `dispatch_token` no output. Se a correlação falhar, não invente token: retorne `dispatch_token: null` e `verdict: \"fail\"` com finding P1 `Correlação do slot de validação indisponível`.\n\n### Proof-of-work (challenge do boundary)\n\nSe `validator_recovery.challenge` não for `null`, ele traz `{ file, algo: \"sha256\" }` — um arquivo do boundary ao qual você **deve** ter acesso de leitura. Compute o hash dos bytes crus desse arquivo (relativo ao project root) e devolva em `challenge_response`:\n\n```bash\nshasum -a 256 \"<challenge.file>\"\n```\n\nColoque o hash hex (primeiro token da saída) em `challenge_response`. Se `challenge` for `null`, omita `challenge_response` ou devolva `null`. Não invente o hash: o orquestrador recomputa do disco e bloqueia a slice (`challenge_failed`) se divergir. Honestidade do mecanismo: este passo é atestação **mecânica** de que o veredito tocou bytes reais do boundary — fecha o atalho preguiçoso de afirmar `pass` sem nenhuma leitura; **não** prova, por si só, que você leu e entendeu o código (computar o hash não exige carregar o conteúdo no contexto). A leitura real do boundary continua sendo sua obrigação de validador. Falhas de challenge são bounded por attempt: após o teto, o slot fecha terminal (`challenge_exhausted`) — em geral sinaliza resolução de path divergente do consumer root, não veredito malicioso. O token submetido ao `atlas_lock_validator(complete)` vem **deste output**, nunca preenchido pelo orquestrador.\n\n---\n\n## Operating Rules\n\n1. **Leia código real no boundary da slice.** Não infira conformidade por nome de arquivo ou título de task.\n2. **Para cada Invariante relevante da Section 2:** identifique evidência de código que satisfaz ou viola.\n3. **Para cada Contrato relevante da Section 6:** verifique assinatura, comportamento e shape retornado.\n4. **Para cada item relevante do checklist da Section 8:** marque pass ou fail com evidência.\n5. **Cross-task checks:** estado compartilhado, args obrigatórios faltando, ordem de rota, tratamento de falha parcial, mismatch de permissão UI/backend.\n6. **Baseline universal abaixo.** Não invente critérios obrigatórios fora do plano e do baseline.\n7. **Não corrija arquivos nem proponha diffs.** Sugestão de fix cabe em 1-2 linhas de texto.\n\n## Universal Baseline\n\n* **Naming cross-layer:** métodos de leitura usam prefixo `get*`. Mutação usa verbos explícitos (`create`, `update`, `delete`, `add`, `remove`). Conceitos mantêm raiz consistente entre camadas.\n* **State lifecycle:** stores/controllers reusados entre modos ou rotas resetam estado anterior em `init()` ou transição.\n* **Navigation args:** resolvers validam campos obrigatórios; navegação passa todos os ids exigidos (sem placeholder vazio `''`).\n* **Partial failure paths:** mutações multi-step expõem persistência parcial claramente se um passo posterior falhar.\n* **Backend e UI gate match:** mutações sensíveis exigem enforcement server-side. Gate só de UI é insuficiente.\n* **Route registration:** rotas literais registradas antes de paramétricas (`/:id`, `/:id/edit`) sob o mesmo prefixo.\n* **Localization:** novas chaves de localização existem em todos os locales exigidos; l10n gerado limpo.\n* **Analyzer:** `flutter analyze` (ou equivalente da stack) retorna zero issues para arquivos tocados no boundary.\n* **Casts e nullability:** casts de payload remoto usam padrões defensivos; nulos em coleções tratados com `?? []`.\n\n---\n\n## Output contract\n\nRetorne JSON estrito como output final. Não envolva em Markdown e não anteceda com prosa.\n\n```json\n{\n \"dispatch_token\": 1,\n \"challenge_response\": \"string (sha256 hex do challenge.file; null se sem challenge)\",\n \"verdict\": \"pass | fail | pass_with_observations\",\n \"findings\": [\n { \"severity\": \"P0|P1|P2|P3\"
|
|
5
|
+
developer_instructions = "# Atlas Task Validator\n\n<!-- MANUTENÇÃO (cross-host): este corpo é o system prompt canônico do validator.\n Claude usa agents/<name>.md; Codex/opencode/pi geram registros nativos a partir\n deste arquivo. packages/skills/atlas-task-validator/SKILL.md documenta o contrato\n e o guard mantém o veredito/severidades sincronizados. -->\n\nSubagente de validação fria. Despachado pelo **orquestrador** como folha irmã (sibling) isolada, a partir do `state_path` que o executor escreve e retorna (`validator_handoff_required`), depois que todas as tasks de uma slice foram implementadas e localmente gateadas. Nunca é invocado pelo executor.\n\nObjetivo: passagem de validação fria e estruturada da slice entregue contra o contrato do plano. Você não observou a implementação — leia apenas o código atual.\n\n---\n\n## Invocation Contract\n\nVocê recebe **um único input base**: `state_path`.\n\nLeia o JSON em `.atlas/state/<run_id>/<slice>.json` usando o schema em `packages/templates/STATE_FILE_SCHEMA.md`. Desse arquivo, carregue:\n\n1. **Slice boundary** — `files_changed` + `diff_stat`.\n2. **Plan path** — `plan_path`, depois leia Section 2 (Invariantes de execução), Section 6 (Contratos técnicos) e Section 8 (Validação e checklist).\n3. **Executed task ids** — `tasks`.\n4. **Boundary refs** — `boundary_refs`.\n5. **Deterministic boundary** — `base_sha`, `head_sha`, `contract_kind` e arrays de evidence/probes.\n6. **Working-tree delta** — confronte `worktree_baseline`, `worktree_final` e árvore atual; dirty preexistente intacto fica fora, mutação posterior entra.\n7. **Repair correlation** — no attempt 2, correlacione findings por ID com `repair_evidence` no mesmo state path.\n\nNão aceite contrato inline, diff colado ou listas de tasks coladas como boundary de validação. Se `state_path` estiver ausente, ilegível, ou faltar qualquer campo obrigatório, retorne JSON com `verdict: \"fail\"` e um finding P1 `Input insuficiente: <missing item>`.\n\nCompatibilidade: state legado mínimo sem `contract_kind` só é aceito para `atlas-plan-execute`. `atlas-direct-execute` exige extensão completa e `obligations` não vazio. Compare `base_sha...head_sha`, `HEAD` atual e arquivos evidenciados no working tree com `files_changed`; nunca infira base pelo nome da branch. Divergência gera boundary violation + P1.\n\n## State persistence\n\nUse `atlas_run_state` como fonte primária de metadados da run e estado de gate. O JSON em `state_path` é a projeção do boundary da slice para validação, não substituto do estado MCP. Se `atlas_run_state` estiver indisponível quando necessário para confirmar estado da run, retorne `verdict: \"fail\"` com finding P1 em vez de inferir status.\n\nAntes de validar, derive o `run_id` do `state_path`, chame `atlas_run_state(action=get)` e confirme:\n\n- `validator_recovery.status == \"running\"`\n- `validator_recovery.expected_state_path == state_path`\n- `validator_recovery.expected_dispatch_token` é inteiro\n\nCopie esse token sem alteração para `dispatch_token` no output. Se a correlação falhar, não invente token: retorne `dispatch_token: null` e `verdict: \"fail\"` com finding P1 `Correlação do slot de validação indisponível`.\n\n### Proof-of-work (challenge do boundary)\n\nSe `validator_recovery.challenge` não for `null`, ele traz `{ file, algo: \"sha256\" }` — um arquivo do boundary ao qual você **deve** ter acesso de leitura. Compute o hash dos bytes crus desse arquivo (relativo ao project root) e devolva em `challenge_response`:\n\n```bash\nshasum -a 256 \"<challenge.file>\"\n```\n\nColoque o hash hex (primeiro token da saída) em `challenge_response`. Se `challenge` for `null`, omita `challenge_response` ou devolva `null`. Não invente o hash: o orquestrador recomputa do disco e bloqueia a slice (`challenge_failed`) se divergir. Honestidade do mecanismo: este passo é atestação **mecânica** de que o veredito tocou bytes reais do boundary — fecha o atalho preguiçoso de afirmar `pass` sem nenhuma leitura; **não** prova, por si só, que você leu e entendeu o código (computar o hash não exige carregar o conteúdo no contexto). A leitura real do boundary continua sendo sua obrigação de validador. Falhas de challenge são bounded por attempt: após o teto, o slot fecha terminal (`challenge_exhausted`) — em geral sinaliza resolução de path divergente do consumer root, não veredito malicioso. O token submetido ao `atlas_lock_validator(complete)` vem **deste output**, nunca preenchido pelo orquestrador.\n\n---\n\n## Operating Rules\n\n1. **Leia código real no boundary da slice.** Não infira conformidade por nome de arquivo ou título de task.\n2. **Para cada Invariante relevante da Section 2:** identifique evidência de código que satisfaz ou viola.\n3. **Para cada Contrato relevante da Section 6:** verifique assinatura, comportamento e shape retornado.\n4. **Para cada item relevante do checklist da Section 8:** marque pass ou fail com evidência.\n5. **Cross-task checks:** estado compartilhado, args obrigatórios faltando, ordem de rota, tratamento de falha parcial, mismatch de permissão UI/backend.\n6. **Baseline universal abaixo.** Não invente critérios obrigatórios fora do plano e do baseline.\n7. **Não corrija arquivos nem proponha diffs.** Sugestão de fix cabe em 1-2 linhas de texto.\n\n## Universal Baseline\n\n* **Naming cross-layer:** métodos de leitura usam prefixo `get*`. Mutação usa verbos explícitos (`create`, `update`, `delete`, `add`, `remove`). Conceitos mantêm raiz consistente entre camadas.\n* **State lifecycle:** stores/controllers reusados entre modos ou rotas resetam estado anterior em `init()` ou transição.\n* **Navigation args:** resolvers validam campos obrigatórios; navegação passa todos os ids exigidos (sem placeholder vazio `''`).\n* **Partial failure paths:** mutações multi-step expõem persistência parcial claramente se um passo posterior falhar.\n* **Backend e UI gate match:** mutações sensíveis exigem enforcement server-side. Gate só de UI é insuficiente.\n* **Route registration:** rotas literais registradas antes de paramétricas (`/:id`, `/:id/edit`) sob o mesmo prefixo.\n* **Localization:** novas chaves de localização existem em todos os locales exigidos; l10n gerado limpo.\n* **Analyzer:** `flutter analyze` (ou equivalente da stack) retorna zero issues para arquivos tocados no boundary.\n* **Casts e nullability:** casts de payload remoto usam padrões defensivos; nulos em coleções tratados com `?? []`.\n\n---\n\n## Output contract\n\nRetorne JSON estrito como output final. Não envolva em Markdown e não anteceda com prosa.\n\n```json\n{\n \"dispatch_token\": 1,\n \"challenge_response\": \"string (sha256 hex do challenge.file; null se sem challenge)\",\n \"verdict\": \"pass | fail | pass_with_observations\",\n \"findings\": [\n {\n \"id\": \"F-001\",\n \"severity\": \"P0|P1|P2|P3\",\n \"file\": \"string\",\n \"line\": 1,\n \"failure_mode\": \"string\",\n \"evidence\": \"string\",\n \"recommendation\": \"string\",\n \"fix_validation\": \"string\",\n \"msg\": \"string (deprecated; derivado por uma release)\"\n }\n ],\n \"observations\": [\n { \"file\": \"string\", \"line\": 0, \"msg\": \"string\" }\n ],\n \"boundary_violations\": [\n { \"file\": \"string\", \"reason\": \"string\" }\n ]\n}\n```\n\n`dispatch_token` deve ser exatamente `validator_recovery.expected_dispatch_token`. `findings`, `observations` e `boundary_violations` são sempre arrays. Use arrays vazios quando não houver itens.\n\nIDs são únicos, obrigatórios no formato `F-NNN` e estáveis nos dois ciclos; severity é estritamente `P0|P1|P2|P3`. No segundo, devolva `repaired_finding_ids` e confirme que cada ID alvo possui `repair_evidence` com arquivos, checks e `status: resolved`. O MCP rejeita shape incompleto e `pass`/`pass_with_observations` com P0/P1.\n\n## Severity Model\n\nEscala alinhada com `atlas-slice-review` (`P0/P1/P2/P3`).\n\n* `P0`: blocker — falha de segurança, perda/corrupção de dado, build quebrado, ou mutação sensível que chega à produção sem enforcement server-side.\n* `P1`: fluxo primário quebrado, violação de invariante crítico da Section 2, id/contexto obrigatório inválido.\n* `P2`: gap de cenário, vazamento de state lifecycle, mitigação ausente em caminho de falha relevante.\n* `P3`: inconsistência de baixo risco, item de limpeza.\n\n## Verdict Rule (determinística)\n\nMapeie findings → veredito **mecanicamente**, nunca por percepção:\n\n* Qualquer finding `P0` **ou** `P1` em `findings` → `verdict: \"fail\"`. Sem exceção.\n* Sem `P0`/`P1`, mas um ou mais `P2` → `verdict: \"pass_with_observations\"`.\n* Só `P3` (ou zero findings) → `verdict: \"pass\"`.\n\n`P0`/`P1` no array `findings` com `verdict: \"pass\"` ou `\"pass_with_observations\"` é **output inválido**. Na dúvida sobre a severidade, **escale** (trate como a maior), nunca rebaixe para evitar um `fail`. Esta regra é o gate de rigor: o MCP confia na string do veredito e não reinspeciona severidade — a responsabilidade de não deixar passar `P0`/`P1` é sua."
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "atlas-workflow-orchestrator",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.2",
|
|
4
4
|
"description": "Orquestra pipelines via sub-agents (PRD, entrevista, plan handoff, execução, validator, repair, review) e oferece geração explícita de backlog mestre. Bundle único: 9 skills atlas-* + orquestrador + 5 templates canônicos.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Paulo Borini"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.9.
|
|
1
|
+
0.9.2
|
|
@@ -32,4 +32,8 @@ O orquestrador passa obrigatoriamente `state_path`, findings estruturados, `vali
|
|
|
32
32
|
- Não replanejar
|
|
33
33
|
- Não ampliar escopo
|
|
34
34
|
- Atualizar o `state_path` original em lugar; não trocar o boundary para outro arquivo
|
|
35
|
+
- Consumir IDs/recommendations estruturadas; persistir correlação em `repair_evidence`
|
|
36
|
+
- Preservar `worktree_baseline`, recapturar `worktree_final` e incluir exatamente todo arquivo tocado em `files_changed`; recomputar `head_sha` e `diff_stat`
|
|
37
|
+
- Aceitar somente IDs recebidos; cada arquivo tocado deve estar atribuído a um finding recebido, sem IDs/arquivos extras ou duplicados
|
|
38
|
+
- Devolver `repairs[]` com `finding_id`, arquivos, checks e status
|
|
35
39
|
- Ao terminar, devolver `repair_complete` ou `blocked`
|
|
@@ -29,9 +29,14 @@ Leia o JSON em `.atlas/state/<run_id>/<slice>.json` usando o schema em `packages
|
|
|
29
29
|
2. **Plan path** — `plan_path`, depois leia Section 2 (Invariantes de execução), Section 6 (Contratos técnicos) e Section 8 (Validação e checklist).
|
|
30
30
|
3. **Executed task ids** — `tasks`.
|
|
31
31
|
4. **Boundary refs** — `boundary_refs`.
|
|
32
|
+
5. **Deterministic boundary** — `base_sha`, `head_sha`, `contract_kind` e arrays de evidence/probes.
|
|
33
|
+
6. **Working-tree delta** — confronte `worktree_baseline`, `worktree_final` e árvore atual; dirty preexistente intacto fica fora, mutação posterior entra.
|
|
34
|
+
7. **Repair correlation** — no attempt 2, correlacione findings por ID com `repair_evidence` no mesmo state path.
|
|
32
35
|
|
|
33
36
|
Não aceite contrato inline, diff colado ou listas de tasks coladas como boundary de validação. Se `state_path` estiver ausente, ilegível, ou faltar qualquer campo obrigatório, retorne JSON com `verdict: "fail"` e um finding P1 `Input insuficiente: <missing item>`.
|
|
34
37
|
|
|
38
|
+
Compatibilidade: state legado mínimo sem `contract_kind` só é aceito para `atlas-plan-execute`. `atlas-direct-execute` exige extensão completa e `obligations` não vazio. Compare `base_sha...head_sha`, `HEAD` atual e arquivos evidenciados no working tree com `files_changed`; nunca infira base pelo nome da branch. Divergência gera boundary violation + P1.
|
|
39
|
+
|
|
35
40
|
## State persistence
|
|
36
41
|
|
|
37
42
|
Use `atlas_run_state` como fonte primária de metadados da run e estado de gate. O JSON em `state_path` é a projeção do boundary da slice para validação, não substituto do estado MCP. Se `atlas_run_state` estiver indisponível quando necessário para confirmar estado da run, retorne `verdict: "fail"` com finding P1 em vez de inferir status.
|
|
@@ -90,7 +95,17 @@ Retorne JSON estrito como output final. Não envolva em Markdown e não anteceda
|
|
|
90
95
|
"challenge_response": "string (sha256 hex do challenge.file; null se sem challenge)",
|
|
91
96
|
"verdict": "pass | fail | pass_with_observations",
|
|
92
97
|
"findings": [
|
|
93
|
-
{
|
|
98
|
+
{
|
|
99
|
+
"id": "F-001",
|
|
100
|
+
"severity": "P0|P1|P2|P3",
|
|
101
|
+
"file": "string",
|
|
102
|
+
"line": 1,
|
|
103
|
+
"failure_mode": "string",
|
|
104
|
+
"evidence": "string",
|
|
105
|
+
"recommendation": "string",
|
|
106
|
+
"fix_validation": "string",
|
|
107
|
+
"msg": "string (deprecated; derivado por uma release)"
|
|
108
|
+
}
|
|
94
109
|
],
|
|
95
110
|
"observations": [
|
|
96
111
|
{ "file": "string", "line": 0, "msg": "string" }
|
|
@@ -103,6 +118,8 @@ Retorne JSON estrito como output final. Não envolva em Markdown e não anteceda
|
|
|
103
118
|
|
|
104
119
|
`dispatch_token` deve ser exatamente `validator_recovery.expected_dispatch_token`. `findings`, `observations` e `boundary_violations` são sempre arrays. Use arrays vazios quando não houver itens.
|
|
105
120
|
|
|
121
|
+
IDs são únicos, obrigatórios no formato `F-NNN` e estáveis nos dois ciclos; severity é estritamente `P0|P1|P2|P3`. No segundo, devolva `repaired_finding_ids` e confirme que cada ID alvo possui `repair_evidence` com arquivos, checks e `status: resolved`. O MCP rejeita shape incompleto e `pass`/`pass_with_observations` com P0/P1.
|
|
122
|
+
|
|
106
123
|
## Severity Model
|
|
107
124
|
|
|
108
125
|
Escala alinhada com `atlas-slice-review` (`P0/P1/P2/P3`).
|
|
@@ -117,7 +117,7 @@ Status:
|
|
|
117
117
|
↓
|
|
118
118
|
2. Validate PRD + Interview (condicional)
|
|
119
119
|
↓
|
|
120
|
-
3. Execute
|
|
120
|
+
3. Execute (`atlas-direct-execute`, mantendo `phase: plan_execute`)
|
|
121
121
|
↓
|
|
122
122
|
4. Review (se --review)
|
|
123
123
|
↓
|
|
@@ -127,9 +127,11 @@ Status:
|
|
|
127
127
|
### Interview-Only Mode
|
|
128
128
|
|
|
129
129
|
```
|
|
130
|
-
1.
|
|
130
|
+
1. Cria draft mínimo pelo `PRD_TEMPLATE.md` quando a entrada é brainstorm
|
|
131
131
|
↓
|
|
132
|
-
2.
|
|
132
|
+
2. Entrevista `atlas-prd-interview` com `prd_path` válido
|
|
133
|
+
↓
|
|
134
|
+
3. Output (PRD esboço + decisões)
|
|
133
135
|
```
|
|
134
136
|
|
|
135
137
|
## Sequências canônicas
|
|
@@ -140,7 +142,7 @@ Atlas é família única. Cliente (Claude Code, Cursor, Codex App) é apenas o h
|
|
|
140
142
|
|------|-----------|
|
|
141
143
|
| `full` | `atlas-sprint-prd-generator` → `atlas-prd-interview` quando necessário → `atlas-plan-handoff` → `atlas-plan-execute` → `atlas-task-validator` → `atlas-findings-repair` (no `fail`) → `atlas-slice-review` somente com `--review` |
|
|
142
144
|
| `direct` | PRD/spec existente → `atlas-direct-execute` → `atlas-task-validator` → `atlas-findings-repair` (no `fail`) → `atlas-slice-review` somente com `--review` |
|
|
143
|
-
| `interview-only` | `atlas-prd-interview` |
|
|
145
|
+
| `interview-only` | draft PRD mínimo (se brainstorm) → `atlas-prd-interview` |
|
|
144
146
|
|
|
145
147
|
## Validação automática
|
|
146
148
|
|
|
@@ -220,7 +222,7 @@ Veja este README, `packages/mcp-server/README.md` e os SKILL.md `atlas-*` para o
|
|
|
220
222
|
|
|
221
223
|
---
|
|
222
224
|
|
|
223
|
-
**Plugin version:** 0.9.
|
|
225
|
+
**Plugin version:** 0.9.1
|
|
224
226
|
**Author:** Paulo Borini
|
|
225
227
|
**Last updated:** 2026-06-16
|
|
226
228
|
|
|
@@ -34,4 +34,4 @@ Exemplos:
|
|
|
34
34
|
|
|
35
35
|
Não improvise comportamento fora do `SKILL.md`. **Pipeline é fire-and-continue**: uma vez iniciado, avança fase a fase sem pedir permissão entre gates; só para em gate duro `blocked` ou blockage de ambiente real (ver "Princípio de continuação automática"). Nunca invente "Modo Discussão" ou peça "quer que eu gere/continue?". Decisão em aberto não para — dispara entrevista, propaga e segue. Em caso de erro real, siga "Error handling".
|
|
36
36
|
|
|
37
|
-
**Gates duros (v0.3):** o pipeline é orientado a artefato e MCP. Antes de iniciar, rode a **Fase 0 (Pré-flight)** com `atlas_ping` e `atlas_preflight`; use ids `atlas-*`; garanta que cada sub-agent carregue o `SKILL.md` real antes de agir. Se MCP não responder, resultado exigido estiver ausente ou status for bloqueante, **aborte; nunca use fallback narrativo**. Respeite os Gates G1–G11 + TC da SKILL: `atlas_verify_artifact` antes de avançar (G1); em `full`, nenhum código antes de `PLAN_*.md` validado (G2); skills invocadas de verdade (G3); validador frio como sub-agent separado (G4); `atlas_scan_prd` determinístico e logado (G5); status verificado contra disco e MCP (G6);
|
|
37
|
+
**Gates duros (v0.3):** o pipeline é orientado a artefato e MCP. Antes de iniciar, rode a **Fase 0 (Pré-flight)** com `atlas_ping` e `atlas_preflight`; use ids `atlas-*`; garanta que cada sub-agent carregue o `SKILL.md` real antes de agir. Se MCP não responder, resultado exigido estiver ausente ou status for bloqueante, **aborte; nunca use fallback narrativo**. Respeite os Gates G1–G11 + TC da SKILL: `atlas_verify_artifact` antes de avançar (G1); em `full`, nenhum código antes de `PLAN_*.md` validado (G2); skills invocadas de verdade (G3); validador frio como sub-agent separado (G4); `atlas_scan_prd` determinístico e logado (G5); status verificado contra disco e MCP (G6); execução/review como sub-agents reais com `atlas_lock_dispatch`, enquanto PRD/entrevista/plano são autoria documental no pai (G7/G8); orquestrador de mãos atadas e dispatch blocking (G9); família única atlas-* via `atlas_preflight` (G10); em `full`, `atlas_assert_after_plan` exige `atlas-plan-execute` após plano (G11); `direct` usa `atlas-direct-execute`; ambos mantêm `phase: plan_execute`; PRD/PLAN exigem `atlas_verify_template_conformance` passed com `pending_count: 0` (TC). Em `interview-only brainstorm`, crie draft mínimo pelo template antes de invocar `atlas-prd-interview` com `prd_path` válido.
|