stealthos-cli 0.1.0-alpha.3 → 0.1.0-alpha.5
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/ai/CONTRACT.md +110 -0
- package/ai/INDEX.md +203 -0
- package/ai/README.md +434 -0
- package/ai/ROUTER.md +288 -0
- package/ai/agents/README.md +103 -0
- package/ai/agents/architect.md +59 -0
- package/ai/agents/backend-engineer.md +62 -0
- package/ai/agents/founder.md +45 -0
- package/ai/agents/frontend-engineer.md +61 -0
- package/ai/agents/product-manager.md +56 -0
- package/ai/agents/qa-engineer.md +53 -0
- package/ai/agents/researcher.md +74 -0
- package/ai/agents/reviewer.md +73 -0
- package/ai/agents/security-engineer.md +59 -0
- package/ai/agents/sre-engineer.md +70 -0
- package/ai/agents/tech-lead.md +70 -0
- package/ai/architecture/README.md +35 -0
- package/ai/architecture/components.md +24 -0
- package/ai/architecture/containers.md +30 -0
- package/ai/architecture/event-flows.md +36 -0
- package/ai/architecture/sequence-diagrams.md +38 -0
- package/ai/architecture/system-context.md +46 -0
- package/ai/architecture/threat-modeling.md +40 -0
- package/ai/blueprints/README.md +67 -0
- package/ai/blueprints/_schema.json +40 -0
- package/ai/blueprints/ai-platform.json +28 -0
- package/ai/blueprints/crm.json +22 -0
- package/ai/blueprints/game.json +25 -0
- package/ai/blueprints/mobile.json +24 -0
- package/ai/blueprints/realtime.json +22 -0
- package/ai/blueprints/saas.json +25 -0
- package/ai/blueprints/telemetry.json +30 -0
- package/ai/blueprints/web.json +23 -0
- package/ai/bootstrap/discovery-questions.md +117 -0
- package/ai/bootstrap/dispatcher.md +85 -0
- package/ai/bootstrap/existing-project.md +191 -0
- package/ai/bootstrap/new-project.md +127 -0
- package/ai/bootstrap/tech-mapping.md +164 -0
- package/ai/clients/README.md +114 -0
- package/ai/clients/antigravity.md +125 -0
- package/ai/clients/claude-code.md +65 -0
- package/ai/clients/cline.md +69 -0
- package/ai/clients/codex-aider-cli.md +82 -0
- package/ai/clients/continue.md +67 -0
- package/ai/clients/copilot.md +49 -0
- package/ai/clients/cursor.md +81 -0
- package/ai/clients/snippets/mcp-absolute-paths.json +9 -0
- package/ai/clients/snippets/mcp-http.json +7 -0
- package/ai/clients/snippets/mcp-stdio.json +9 -0
- package/ai/clients/trae.md +69 -0
- package/ai/clients/windsurf.md +71 -0
- package/ai/core/pipeline/execution-engine.md +157 -0
- package/ai/engineering/README.md +32 -0
- package/ai/engineering/observability/incident-response.md +82 -0
- package/ai/evals/protocol-tests.md +150 -0
- package/ai/evolution/agent-evolution.md +161 -0
- package/ai/evolution/improvements.md +91 -0
- package/ai/evolution/learnings.md +49 -0
- package/ai/evolution/patterns-discovered.md +48 -0
- package/ai/execution/README.md +33 -0
- package/ai/execution/backlog.md +27 -0
- package/ai/execution/milestones.md +26 -0
- package/ai/execution/roadmap.md +30 -0
- package/ai/execution/sprint.md +42 -0
- package/ai/governance/README.md +34 -0
- package/ai/governance/architecture-principles.md +99 -0
- package/ai/governance/definition-of-done.md +88 -0
- package/ai/governance/definition-of-ready.md +69 -0
- package/ai/governance/engineering-principles.md +70 -0
- package/ai/governance/quality-gates.md +85 -0
- package/ai/governance/security-policies.md +84 -0
- package/ai/hooks/enforce-audit.ps1 +41 -0
- package/ai/hooks/enforce-audit.sh +39 -0
- package/ai/hooks/guard-edit.ps1 +182 -0
- package/ai/hooks/guard-edit.sh +161 -0
- package/ai/hooks/inject-os-reminder.ps1 +40 -0
- package/ai/hooks/inject-os-reminder.sh +16 -0
- package/ai/manifest.json +238 -0
- package/ai/memory/_detected-stack.json +33 -0
- package/ai/memory/_summary.md +49 -0
- package/ai/memory/archive/.gitkeep +3 -0
- package/ai/memory/completed-tasks.md +156 -0
- package/ai/memory/decisions.md +257 -0
- package/ai/memory/errors-and-solutions.md +41 -0
- package/ai/memory/known-issues.md +40 -0
- package/ai/memory/pending-tasks.md +37 -0
- package/ai/memory/project-context.md +67 -0
- package/ai/operating-system/architecture.md +54 -0
- package/ai/operating-system/coding-standards.md +84 -0
- package/ai/operating-system/folder-structure.md +126 -0
- package/ai/operating-system/performance-rules.md +86 -0
- package/ai/operating-system/quality-control.md +81 -0
- package/ai/operating-system/security-rules.md +91 -0
- package/ai/operating-system/workflow.md +86 -0
- package/ai/product/README.md +24 -0
- package/ai/product/business-rules.md +26 -0
- package/ai/product/personas.md +29 -0
- package/ai/product/user-journeys.md +30 -0
- package/ai/product/vision.md +35 -0
- package/ai/rules/behavior.md +45 -0
- package/ai/rules/do.md +47 -0
- package/ai/rules/dont.md +46 -0
- package/ai/rules/execution-flow.md +125 -0
- package/ai/rules/structural-constraints.md +59 -0
- package/ai/rules/structure-canon.md +116 -0
- package/ai/runtime.md +179 -0
- package/ai/scripts/detect-stack.ps1 +166 -0
- package/ai/scripts/detect-stack.sh +172 -0
- package/ai/scripts/init-ai-os.ps1 +215 -0
- package/ai/scripts/init-ai-os.sh +99 -0
- package/ai/scripts/lint-os.ps1 +99 -0
- package/ai/scripts/lint-os.sh +85 -0
- package/ai/scripts/start-os.ps1 +151 -0
- package/ai/scripts/start-os.sh +141 -0
- package/ai/server/README.md +105 -0
- package/ai/server/aios-server.mjs +2134 -0
- package/ai/server/package-lock.json +802 -0
- package/ai/server/package.json +31 -0
- package/ai/server/src/analyzer/graph-builder.ts +92 -0
- package/ai/server/src/analyzer/index.ts +191 -0
- package/ai/server/src/analyzer/module-mapper.ts +171 -0
- package/ai/server/src/analyzer/smell-detector.ts +54 -0
- package/ai/server/src/analyzer/stack-detector.ts +70 -0
- package/ai/server/src/index.ts +16 -0
- package/ai/server/src/packager/context-builder.ts +217 -0
- package/ai/server/src/packager/index.ts +3 -0
- package/ai/server/src/packager/memory-injector.ts +128 -0
- package/ai/server/src/packager/module-summarizer.ts +60 -0
- package/ai/server/src/packager/token-estimator.ts +26 -0
- package/ai/server/src/snapshot/index.ts +3 -0
- package/ai/server/src/snapshot/snapshot-creator.ts +206 -0
- package/ai/server/src/snapshot/snapshot-diff.ts +86 -0
- package/ai/server/src/snapshot/snapshot-restore.ts +14 -0
- package/ai/server/src/types.ts +94 -0
- package/ai/server/tsconfig.json +26 -0
- package/ai/skills/architecture-design.md +82 -0
- package/ai/skills/backend-engineering.md +57 -0
- package/ai/skills/database-design.md +76 -0
- package/ai/skills/frontend-engineering.md +63 -0
- package/ai/skills/performance.md +73 -0
- package/ai/skills/scalability.md +84 -0
- package/ai/skills/security.md +71 -0
- package/ai/skills/testing.md +77 -0
- package/ai/specs/ADR/ADR-0002-typescript-runtime.md +103 -0
- package/ai/specs/ADR/ADR-0004-runtime-orchestrator.md +94 -0
- package/ai/specs/ADR/ADR-0005-workflow-engine.md +105 -0
- package/ai/specs/ADR/ADR-0006-runtime-state.md +104 -0
- package/ai/specs/ADR/ADR-0007-state-compiler-drift-context-layers-artifact-index.md +82 -0
- package/ai/specs/ADR/ADR-0008-intent-runtime-discovery-branching.md +93 -0
- package/ai/specs/ADR/ADR-0009-confidence-system-maturity-tracking.md +113 -0
- package/ai/specs/ADR/ADR-0010-structural-architecture-standards.md +121 -0
- package/ai/specs/ADR/ADR-0011-mcp-prompts.md +86 -0
- package/ai/specs/ADR/ADR-0012-stealthos-hybrid-architecture.md +174 -0
- package/ai/specs/ADR/_TEMPLATE.md +60 -0
- package/ai/specs/BRD/_TEMPLATE.md +50 -0
- package/ai/specs/PRD/_TEMPLATE.md +72 -0
- package/ai/specs/README.md +43 -0
- package/ai/specs/RFC/RFC-0001-runtime-orchestrator.md +149 -0
- package/ai/specs/RFC/RFC-0002-runtime-orchestrator-extended.md +134 -0
- package/ai/specs/RFC/_TEMPLATE.md +61 -0
- package/ai/specs/RUNBOOKS/_TEMPLATE.md +68 -0
- package/ai/specs/SDD/_TEMPLATE.md +104 -0
- package/ai/specs/TASKS/_TEMPLATE.md +52 -0
- package/ai/tools/debugging.md +64 -0
- package/ai/tools/dependency-analysis.md +46 -0
- package/ai/tools/internet-research.md +42 -0
- package/ai/tools/mcp-discovery.md +44 -0
- package/ai/workflows/_schema.json +81 -0
- package/ai/workflows/init.json +148 -0
- package/ai/workflows/sync.json +71 -0
- package/ai/workflows/work.json +91 -0
- package/package.json +42 -36
- package/scripts/bundle-ai.mjs +58 -0
- package/src/cli.mjs +83 -79
- package/src/commands/install.mjs +35 -11
- package/src/commands/run.mjs +117 -0
- package/src/lib/resolve-source.mjs +27 -10
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0.0
|
|
3
|
+
updated: 2026-05-14
|
|
4
|
+
tier: conditional
|
|
5
|
+
tokens: ~700
|
|
6
|
+
load: security
|
|
7
|
+
triggers: segurança, security, auth, senha, token, xss, csrf, sql injection, vulnerab, lgpd, gdpr
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Skill: Security
|
|
11
|
+
|
|
12
|
+
## Princípios
|
|
13
|
+
|
|
14
|
+
- **Defense in depth.** Múltiplas camadas; nunca confiar em uma só.
|
|
15
|
+
- **Least privilege.** Token/role mínimo necessário, expirando o mais cedo possível.
|
|
16
|
+
- **Validate at boundaries.** Input do usuário, retorno de APIs externas, leituras de DB.
|
|
17
|
+
- **Secrets never in code.** Sempre via cofre (Vault, KMS, env injection em runtime).
|
|
18
|
+
|
|
19
|
+
## OWASP Top 10 — Checklist
|
|
20
|
+
|
|
21
|
+
- [ ] **Injection** (SQL, NoSQL, command, LDAP): parametrize sempre.
|
|
22
|
+
- [ ] **Broken auth**: hashes fortes (argon2/bcrypt), MFA, rate limit em login.
|
|
23
|
+
- [ ] **Sensitive data exposure**: HTTPS, criptografia em repouso, mascaramento em logs.
|
|
24
|
+
- [ ] **XXE**: desabilitar entidades externas em parsers XML.
|
|
25
|
+
- [ ] **Broken access control**: checagem por recurso, não só por role.
|
|
26
|
+
- [ ] **Security misconfig**: defaults seguros, headers (CSP, HSTS, X-Frame-Options).
|
|
27
|
+
- [ ] **XSS**: escape por contexto (HTML, JS, attr, URL).
|
|
28
|
+
- [ ] **Deserialization**: nunca desserializar input não confiável sem validação.
|
|
29
|
+
- [ ] **Vulnerable deps**: auditoria contínua (`npm audit`, Dependabot, Snyk).
|
|
30
|
+
- [ ] **Logging & monitoring**: log de eventos de segurança, alerta em anomalias.
|
|
31
|
+
|
|
32
|
+
## Autenticação
|
|
33
|
+
|
|
34
|
+
- Senhas: argon2id ou bcrypt (cost >= 12).
|
|
35
|
+
- Tokens: JWT só com expiração curta + refresh; ou session opaca server-side.
|
|
36
|
+
- MFA via TOTP > SMS.
|
|
37
|
+
- Reset de senha: token de uso único, expiração < 1h.
|
|
38
|
+
|
|
39
|
+
## Autorização
|
|
40
|
+
|
|
41
|
+
- RBAC > ACL ad-hoc.
|
|
42
|
+
- Verificar permissão em CADA endpoint, não confiar em UI esconder botão.
|
|
43
|
+
- Avoid IDOR: verificar ownership do recurso, não só ID.
|
|
44
|
+
|
|
45
|
+
## Segredos
|
|
46
|
+
|
|
47
|
+
- Nunca em código, nunca em commit, nunca em log.
|
|
48
|
+
- Rotação automática quando possível.
|
|
49
|
+
- Diferentes por ambiente (dev/staging/prod).
|
|
50
|
+
- `.env` no `.gitignore`; `.env.example` versionado sem valores.
|
|
51
|
+
|
|
52
|
+
## Headers HTTP
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
|
|
56
|
+
Content-Security-Policy: default-src 'self'; ...
|
|
57
|
+
X-Content-Type-Options: nosniff
|
|
58
|
+
X-Frame-Options: DENY
|
|
59
|
+
Referrer-Policy: strict-origin-when-cross-origin
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Logs e PII
|
|
63
|
+
|
|
64
|
+
- Não logar: senhas, tokens, PII completa, cartões.
|
|
65
|
+
- Mascarar ao logar (`user_***@domain`).
|
|
66
|
+
- LGPD/GDPR: minimização, propósito, prazo, direito ao apagamento.
|
|
67
|
+
|
|
68
|
+
## Registro
|
|
69
|
+
|
|
70
|
+
Vulnerabilidade encontrada → `memory/decisions.md` com severidade + correção + data.
|
|
71
|
+
Se virou padrão → `evolution/patterns-discovered.md`.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0.0
|
|
3
|
+
updated: 2026-05-14
|
|
4
|
+
tier: conditional
|
|
5
|
+
tokens: ~550
|
|
6
|
+
load: testing
|
|
7
|
+
triggers: teste, test, tdd, unit, e2e, integration, mock, cobertura
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Skill: Testing
|
|
11
|
+
|
|
12
|
+
## Princípios
|
|
13
|
+
|
|
14
|
+
- **Teste comportamento, não implementação.** Refatorar não deve quebrar testes.
|
|
15
|
+
- **Pirâmide.** Muito unit, médio integração, pouco E2E.
|
|
16
|
+
- **Determinístico.** Sem flaky. Se flaky, corrigir ou remover — nunca retry cego.
|
|
17
|
+
- **Rápido.** Suite unit < 30s. Se demorar, isolar lentos.
|
|
18
|
+
|
|
19
|
+
## Tipos
|
|
20
|
+
|
|
21
|
+
| Tipo | Cobre | Custo | Velocidade |
|
|
22
|
+
|---|---|---|---|
|
|
23
|
+
| Unit | função/módulo puro | baixo | ms |
|
|
24
|
+
| Integration | múltiplos módulos + I/O real | médio | s |
|
|
25
|
+
| E2E | usuário → sistema completo | alto | s a min |
|
|
26
|
+
| Contract | borda entre serviços | médio | ms |
|
|
27
|
+
| Property-based | invariantes em N inputs aleatórios | médio | s |
|
|
28
|
+
|
|
29
|
+
## O que testar
|
|
30
|
+
|
|
31
|
+
- **Sempre**: regra de negócio, transformação de dados, branching condicional.
|
|
32
|
+
- **Frequentemente**: integração com DB/API externa (com mock controlado).
|
|
33
|
+
- **Estrategicamente**: fluxo crítico ponta-a-ponta (login, checkout, etc.).
|
|
34
|
+
- **Não obsessivamente**: getters/setters triviais, código de framework.
|
|
35
|
+
|
|
36
|
+
## AAA / Given-When-Then
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
// Arrange / Given
|
|
40
|
+
const order = buildOrder({ items: 3, discount: 0.1 });
|
|
41
|
+
|
|
42
|
+
// Act / When
|
|
43
|
+
const total = calculateTotal(order);
|
|
44
|
+
|
|
45
|
+
// Assert / Then
|
|
46
|
+
expect(total).toBe(270);
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Mocks — quando usar
|
|
50
|
+
|
|
51
|
+
- I/O externo lento ou caro (rede, disco, API paga).
|
|
52
|
+
- Tempo (`Date.now`, timers).
|
|
53
|
+
- Aleatoriedade.
|
|
54
|
+
|
|
55
|
+
## Mocks — quando NÃO usar
|
|
56
|
+
|
|
57
|
+
- Banco em testes de integração (use container real ou in-memory equivalente).
|
|
58
|
+
- Lógica que você está testando — se está mockando o sujeito do teste, está testando o mock.
|
|
59
|
+
|
|
60
|
+
## Test data
|
|
61
|
+
|
|
62
|
+
- Builders / factories > literais espalhados.
|
|
63
|
+
- Fixtures versionadas para dados complexos.
|
|
64
|
+
- Limpar estado entre testes (transação rollback em DB, reset em memória).
|
|
65
|
+
|
|
66
|
+
## CI
|
|
67
|
+
|
|
68
|
+
- Toda PR roda lint + type + unit + integration.
|
|
69
|
+
- E2E em pipeline separado, possivelmente em scheduled (não em todo push).
|
|
70
|
+
- Flaky test detectado → quarentena + issue, nunca silenciar com retry.
|
|
71
|
+
|
|
72
|
+
## Anti-padrões
|
|
73
|
+
|
|
74
|
+
- Teste que só passa em ordem específica.
|
|
75
|
+
- Teste com `sleep(N)` arbitrário em vez de espera explícita por condição.
|
|
76
|
+
- Teste que duplica a implementação ("assert que a função foi chamada com X").
|
|
77
|
+
- Cobertura como métrica final (90% de cobertura testando nada útil é pior que 50% testando o crítico).
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-0002
|
|
3
|
+
title: Adoção de TypeScript + dependências controladas para Runtime v0.1
|
|
4
|
+
status: accepted
|
|
5
|
+
date: 2026-05-15
|
|
6
|
+
deciders: igor.araujoedv@gmail.com (Founder)
|
|
7
|
+
supersedes: null
|
|
8
|
+
superseded_by: null
|
|
9
|
+
related: [`.ai/server/package.json`, `.ai/server/tsconfig.json`, `.ai/server/aios-server.mjs`]
|
|
10
|
+
tags: [runtime, build, dependencies, breaking-policy]
|
|
11
|
+
note_on_numbering: "ADR-0001 foi reservado em IMP-001 (guard-edit hook) sem arquivo real escrito. Este é o primeiro ADR formalmente registrado."
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# ADR-0002 — TypeScript + ts-morph + commander para Runtime v0.1
|
|
15
|
+
|
|
16
|
+
## Contexto
|
|
17
|
+
|
|
18
|
+
O AI Operating System (v4.0.0) entregou estrutura passiva sólida: 91+ arquivos markdown + MCP daemon Node.js (`aios-server.mjs`) com 12 tools de lookup/leitura. Toda a "inteligência" estava em **documentos**, não em **código executável**.
|
|
19
|
+
|
|
20
|
+
Pesquisa do Founder identificou três componentes de alto ROI ausentes (referenciados como "AI-DOS v0.1 — Núcleo"):
|
|
21
|
+
|
|
22
|
+
1. **Context Packager** — comprime o projeto em representação semântica (YAML-blocks) em vez de servir arquivos brutos ao LLM. Reduz drasticamente custo de tokens e alucinação.
|
|
23
|
+
2. **Project State Engine** — mapa factual e queryable: módulos, imports/exports, grafo de dependências, code smells.
|
|
24
|
+
3. **Snapshot System** — captura estado (state.json + hashes + memória relevante) pré/pós mudança.
|
|
25
|
+
|
|
26
|
+
Implementar esses três motores sem AST parsing decente é inviável: regex-based module discovery em TS/JS produz alucinação inaceitável (imports dinâmicos, re-exports, barrel files, type-only imports são todos casos onde regex falha). Análise estrutural confiável exige parser real.
|
|
27
|
+
|
|
28
|
+
## Decisão
|
|
29
|
+
|
|
30
|
+
Adotar **TypeScript** + um conjunto pequeno e auditado de dependências para o Runtime v0.1:
|
|
31
|
+
|
|
32
|
+
| Dependência | Categoria | Justificativa |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| `ts-morph` ^22.0.0 | runtime | API tipada sobre o compilador TypeScript. Trata corretamente imports, re-exports, decorators, generics. Mantido pelo autor do tsmorph (David Sherret). |
|
|
35
|
+
| `commander` ^12.1.0 | runtime | CLI tipada para futuros entrypoints. Substitui `process.argv.slice(2)` manual no `aios-server.mjs`. |
|
|
36
|
+
| `typescript` ^5.4.0 | dev | Compilador. |
|
|
37
|
+
| `esbuild` ^0.21.0 | dev | Bundler que produz **um único `.mjs`** em `dist/index.mjs`, sem `node_modules` em runtime. |
|
|
38
|
+
| `@types/node` ^20.12.0 | dev | Tipos do Node. |
|
|
39
|
+
|
|
40
|
+
O runtime compilado (`dist/index.mjs`) é importado pelo `aios-server.mjs` (que **continua sendo um `.mjs` puro**, sem build próprio). Isso mantém o entrypoint MCP simples enquanto permite que a lógica complexa seja escrita em TypeScript tipado.
|
|
41
|
+
|
|
42
|
+
## Alternativas consideradas
|
|
43
|
+
|
|
44
|
+
### A. Manter zero-deps (`.mjs` puro)
|
|
45
|
+
- **Prós**: zero supply-chain surface, sem build, sem `npm install`, alinhado ao princípio "memória reduz alucinação, regras reduzem deriva".
|
|
46
|
+
- **Contras**: AST parsing decente é praticamente impossível em Node nativo. Implementar nosso próprio parser TS seria reinventar 10 anos de tsc. Resultado seria *menos confiável*, contrariando o motivo de adotar AST em primeiro lugar.
|
|
47
|
+
- **Rejeitada** porque o custo de não ter AST decente é maior que o custo das deps.
|
|
48
|
+
|
|
49
|
+
### B. TypeScript + ts-morph SEM bundler
|
|
50
|
+
- **Prós**: setup mais simples.
|
|
51
|
+
- **Contras**: `node_modules/` em produção (>500 arquivos). Risco de divergência entre dev e prod. Mais difícil de auditar.
|
|
52
|
+
- **Rejeitada** em favor do bundle `dist/index.mjs` único.
|
|
53
|
+
|
|
54
|
+
### C. SQLite (better-sqlite3) para storage
|
|
55
|
+
- Considerada mas **rejeitada para v0.1**. JSON sidecar + Markdown atende. SQLite só se justifica quando queries complexas (ranking, joins, full-text) ficarem necessárias.
|
|
56
|
+
|
|
57
|
+
## Consequências
|
|
58
|
+
|
|
59
|
+
### Positivas
|
|
60
|
+
- AST parsing confiável (ts-morph faz o que o tsc faz).
|
|
61
|
+
- TypeScript em desenvolvimento → menos bugs por type-error.
|
|
62
|
+
- CLI tipada → entrypoints futuros (`/spec`, `/task`, `/dialog`) ficam baratos.
|
|
63
|
+
- Bundle único `dist/index.mjs` mantém runtime simples (zero `node_modules` em produção quando build é feito).
|
|
64
|
+
- `aios-server.mjs` **continua zero-deps no runtime** (importa `dist/index.mjs` que é self-contained).
|
|
65
|
+
|
|
66
|
+
### Negativas
|
|
67
|
+
- Quebra a regra **"NUNCA instalar dependência nova sem justificar e pedir confirmação"** do CLAUDE.md global. Mitigado por:
|
|
68
|
+
- Esta ADR é o registro formal.
|
|
69
|
+
- User aprovou explicitamente via AskUserQuestion (2026-05-15).
|
|
70
|
+
- Deps são pequenas, populares, mantidas. Auditáveis em <30min cada.
|
|
71
|
+
- Requer `npm install` + `npm run build` antes do primeiro uso do runtime v0.1.
|
|
72
|
+
- `start-os.{ps1,sh}` precisa detectar ausência de Node/npm e dar mensagem clara.
|
|
73
|
+
|
|
74
|
+
### Neutras
|
|
75
|
+
- Versionamento: `dist/` é gerado (gitignored). `package-lock.json` versionado para reprodutibilidade.
|
|
76
|
+
|
|
77
|
+
## Mitigações
|
|
78
|
+
|
|
79
|
+
| Risco | Mitigação |
|
|
80
|
+
|---|---|
|
|
81
|
+
| Supply chain attack em deps | Lockfile versionado; `npm audit` no CI futuro; pinning de versões major. |
|
|
82
|
+
| Build quebrado em dev novo | `start-os` detecta ausência de `dist/` e executa `npm install && npm run build` automaticamente; mensagem clara se Node não está instalado. |
|
|
83
|
+
| TypeScript version drift | Versão pinada em `^5.4.0`; bumps requerem nova ADR ou minor (não major). |
|
|
84
|
+
| `aios-server.mjs` virar dependent | Mantido `.mjs` puro com `import` opcional de `dist/index.mjs`. Se import falhar, daemon continua funcionando com as 12 tools antigas (graceful degradation). |
|
|
85
|
+
|
|
86
|
+
## Status
|
|
87
|
+
|
|
88
|
+
**Aceito em 2026-05-15.** Implementação na branch atual.
|
|
89
|
+
|
|
90
|
+
## Validação
|
|
91
|
+
|
|
92
|
+
- [x] User aprovou stack via AskUserQuestion
|
|
93
|
+
- [ ] `npm install && npm run build` produz `dist/index.mjs` válido
|
|
94
|
+
- [ ] `aios-server.mjs` carrega `dist/index.mjs` sem erro
|
|
95
|
+
- [ ] As 12 tools antigas continuam funcionando após a integração
|
|
96
|
+
- [ ] As 5 tools novas (`aios_analyze_project`, `aios_build_context_package`, `aios_snapshot`, `aios_snapshot_list`, `aios_snapshot_diff`) estão expostas
|
|
97
|
+
|
|
98
|
+
(checkmarks restantes serão preenchidos ao concluir a Verification end-to-end do plano)
|
|
99
|
+
|
|
100
|
+
## Notas
|
|
101
|
+
|
|
102
|
+
- Próxima ADR esperada: **ADR-0003** quando v0.2 introduzir embeddings/SQLite (se necessário).
|
|
103
|
+
- Esta decisão NÃO autoriza adicionar deps fora desta lista sem nova ADR.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-0004
|
|
3
|
+
slug: runtime-orchestrator
|
|
4
|
+
status: accepted
|
|
5
|
+
date: 2026-05-16
|
|
6
|
+
deciders: [user, tech-lead]
|
|
7
|
+
related:
|
|
8
|
+
- RFC-0001 (proposta consolidada)
|
|
9
|
+
- ADR-0002 (typescript-runtime — base)
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# ADR-0004 — Runtime Orchestrator com 3 commands consolidados
|
|
13
|
+
|
|
14
|
+
## Contexto
|
|
15
|
+
|
|
16
|
+
Sob ADR-0002, o `.ai/server/` expõe 17 tools MCP primitivas; sob a estrutura atual, `.claude/commands/` tem 8 slash commands granulares (`/analyze`, `/audit`, `/compact-memory`, `/context`, `/load-os`, `/os-status`, `/promote-learning`, `/snapshot`).
|
|
17
|
+
|
|
18
|
+
Em sessão 2026-05-16, ao habilitar o servidor MCP no Antigravity (Gemini), constatou-se que a LLM recebe **lista plana de 17 tools sem indicação de sequência ou dependência**. Risco: LLM erra ordem, esquece steps obrigatórios, repete chamadas, escolhe tool errada. Sintoma esperado: degradação cumulativa com cada nova capacidade.
|
|
19
|
+
|
|
20
|
+
Análise externa apresentada pelo usuário e refinada em RFC-0001 propõe substituir a superfície granular por **3 commands consolidados** que executam **workflows determinísticos** sobre as 17 primitivas.
|
|
21
|
+
|
|
22
|
+
## Decisão
|
|
23
|
+
|
|
24
|
+
**Decidimos adotar o Runtime Orchestrator descrito em RFC-0001**, em 4 fases incrementais, cada uma com seu próprio ADR de execução:
|
|
25
|
+
|
|
26
|
+
1. **Fase 1** (ADR-0005): Workflow Engine MVP. Aposentar os 8 commands antigos. Criar `/init`, `/sync`, `/work`.
|
|
27
|
+
2. **Fase 2** (ADR-0006): Runtime State em `.ai/runtime/state.json`.
|
|
28
|
+
3. **Fase 3** (ADR-0007): Context Layers explícitas + Artifact Index.
|
|
29
|
+
4. **Fase 4** (ADR-0008): Intent Runtime para `/work` (gap analysis, clarification, plan/approve).
|
|
30
|
+
|
|
31
|
+
Cada fase é entregável independente e pode ser validada antes da próxima.
|
|
32
|
+
|
|
33
|
+
## Consequências
|
|
34
|
+
|
|
35
|
+
### Positivas
|
|
36
|
+
- LLM recebe **3 entrypoints semânticos** em vez de 17 primitivas planas → menor risco de ordem errada / step esquecido.
|
|
37
|
+
- Workflows são **declarativos e auditáveis** (JSON em `.ai/workflows/`). Pode-se rastrear cada execução.
|
|
38
|
+
- Composição passa a ser **first-class**: nova capacidade complexa vira novo workflow, não nova tool.
|
|
39
|
+
- Onboarding de IDEs cross-platform fica mais simples (documentar 3 commands).
|
|
40
|
+
|
|
41
|
+
### Negativas / Trade-offs aceitos
|
|
42
|
+
- **Muscle memory**: quem usa `/analyze`, `/context`, etc. precisa migrar para `/sync` ou `/work`. Documentação faz mapeamento.
|
|
43
|
+
- **Indireção adicional**: chamar `/sync` em vez de `aios_snapshot` direto adiciona um hop de leitura+parse de JSON. Aceitável dado que rodamos local.
|
|
44
|
+
- **JSON em vez de YAML**: workflows ficam mais verbosos, mas zero-deps no Node (sem adicionar parser).
|
|
45
|
+
- **Substituição de variáveis** `${input.X}` introduz mini-template engine; mantido propositalmente trivial (sem condicionais/loops) para não virar DSL.
|
|
46
|
+
|
|
47
|
+
### Neutras
|
|
48
|
+
- 17 tools primitivas continuam expostas — workflow é uma camada acima, não substitui.
|
|
49
|
+
- ADR-0002 (Runtime v0.1) permanece base válida.
|
|
50
|
+
|
|
51
|
+
## Alternativas consideradas
|
|
52
|
+
|
|
53
|
+
### Alternativa A — Status quo
|
|
54
|
+
- Pros: zero custo agora.
|
|
55
|
+
- Cons: dívida cresce; LLM cada vez mais erra ordem; difícil portar para mais IDEs.
|
|
56
|
+
- **Descartada**: sinal claro de degradação.
|
|
57
|
+
|
|
58
|
+
### Alternativa B — Adicionar 3 commands consolidados E manter os 8 antigos
|
|
59
|
+
- Pros: zero quebra de muscle memory.
|
|
60
|
+
- Cons: superfície vai de 8 para 11; ambiguidade sobre quando usar granular vs composto.
|
|
61
|
+
- **Descartada pelo usuário** (sessão 2026-05-16): preferiu superfície limpa, aceitou custo de migração.
|
|
62
|
+
|
|
63
|
+
### Alternativa C — Workflow Engine em outra linguagem (Python, Rust)
|
|
64
|
+
- Pros: ecossistema de ferramentas mais maduro.
|
|
65
|
+
- Cons: violaria zero-deps de ADR-0002 (Node puro); exige novo runtime.
|
|
66
|
+
- **Descartada**: incompatível com decisão prévia.
|
|
67
|
+
|
|
68
|
+
## Critérios de decisão
|
|
69
|
+
|
|
70
|
+
| Critério | Peso | Status Quo | Alt B (10 cmds) | **Esta decisão (3 cmds)** |
|
|
71
|
+
|---|---|---|---|---|
|
|
72
|
+
| Superfície semântica simples | Alto | Baixo (8) | Médio (11) | **Alto (3)** |
|
|
73
|
+
| Determinismo de sequência | Alto | Baixo | Médio | **Alto** |
|
|
74
|
+
| Zero-deps preservado | Alto | Alto | Alto | **Alto** |
|
|
75
|
+
| Custo de migração | Médio | Zero | Baixo | **Médio (~40 arquivos)** |
|
|
76
|
+
| Auditabilidade | Alto | Baixo | Médio | **Alto** |
|
|
77
|
+
|
|
78
|
+
## Impacto futuro
|
|
79
|
+
|
|
80
|
+
Se essa decisão se mostrar errada (sinais: workflows ficam muito rígidos, LLMs modernos preferem chamar primitivas direto, comunidade adota outra convenção):
|
|
81
|
+
- **Reverter Fase 1** é caro (8 commands precisam ser recriados; docs cross-IDE atualizadas).
|
|
82
|
+
- **Reverter Fases 2-4** é mais barato (são adições; podem ser desligadas sem quebrar Fase 1).
|
|
83
|
+
- Mitigação: cada fase tem ADR próprio, então podemos parar entre fases se sinal negativo aparecer.
|
|
84
|
+
|
|
85
|
+
## Referências
|
|
86
|
+
|
|
87
|
+
- RFC-0001 (proposta detalhada, plano de migração, riscos)
|
|
88
|
+
- ADR-0002 (TypeScript Runtime — base sobre a qual o orquestrador opera)
|
|
89
|
+
- Sessão 2026-05-16: AskUserQuestion confirmou "Fases 1+2+3+4" e "substituir tudo pelos 3 novos"
|
|
90
|
+
- Análise externa apresentada pelo usuário (síntese sobre AI Engineering Runtime vs MCP puro)
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
> **Lembrete**: este ADR cobre a decisão consolidada. Cada fase tem ADR próprio (0005, 0006, 0007, 0008) com detalhes técnicos da implementação. Espelho em `.ai/memory/decisions.md`.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-0005
|
|
3
|
+
slug: workflow-engine
|
|
4
|
+
status: accepted
|
|
5
|
+
date: 2026-05-16
|
|
6
|
+
deciders: [user, tech-lead]
|
|
7
|
+
related:
|
|
8
|
+
- ADR-0004 (decisão consolidada Runtime Orchestrator)
|
|
9
|
+
- RFC-0001 (proposta detalhada)
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# ADR-0005 — Workflow Engine MVP (Fase 1)
|
|
13
|
+
|
|
14
|
+
## Contexto
|
|
15
|
+
|
|
16
|
+
Sob ADR-0004, decidimos implementar o Runtime Orchestrator em 4 fases. Este ADR cobre **Fase 1**: substituir os 8 slash commands granulares por 3 commands consolidados que executam workflows determinísticos sobre as 17 tools primitivas existentes.
|
|
17
|
+
|
|
18
|
+
## Decisão
|
|
19
|
+
|
|
20
|
+
**Implementamos um Workflow Engine MVP** com 5 componentes:
|
|
21
|
+
|
|
22
|
+
1. **Workflow descriptors** em `.ai/workflows/<id>.json`:
|
|
23
|
+
- Schema declarado em `.ai/workflows/_schema.json` (JSON Schema draft-07).
|
|
24
|
+
- Campos obrigatórios: `id`, `version`, `description`, `steps[]`.
|
|
25
|
+
- Cada step: `id`, `tool` (uma das 17 primitivas `aios_*`), `args` (opcional), `on_error` (`abort` | `continue`, default `abort`).
|
|
26
|
+
- Args suportam substituição de variáveis `${input.X}`, `${timestamp}`, com fallback literal `'string'`.
|
|
27
|
+
|
|
28
|
+
2. **Tool MCP `aios_run_workflow(name, input)`** no `.ai/server/aios-server.mjs`:
|
|
29
|
+
- Carrega `.ai/workflows/<name>.json` (validando regex `^[a-z][a-z0-9_-]{0,32}$` para evitar path traversal).
|
|
30
|
+
- Executa steps em sequência, capturando duração e preview do resultado (truncado em 400 chars).
|
|
31
|
+
- Retorna relatório JSON: `{ workflow, version, started_at, finished_at, status, steps: [...] }`.
|
|
32
|
+
- `on_error: continue` permite step falhar sem abortar o workflow.
|
|
33
|
+
|
|
34
|
+
3. **Tool MCP `aios_list_workflows()`** para listar workflows disponíveis.
|
|
35
|
+
|
|
36
|
+
4. **3 workflows iniciais**:
|
|
37
|
+
- `.ai/workflows/init.json` — detect_stack → analyze_project → build_context_package → snapshot baseline → load CORE
|
|
38
|
+
- `.ai/workflows/sync.json` — detect_stack → analyze_project → rebuild context → lint → snapshot incremental
|
|
39
|
+
- `.ai/workflows/work.json` (MVP) — classify_task → route_query → load CORE → search_memory → focused context
|
|
40
|
+
|
|
41
|
+
5. **3 slash commands** em `.claude/commands/`:
|
|
42
|
+
- `/init`, `/sync`, `/work` — cada um chama `aios_run_workflow` com o nome respectivo.
|
|
43
|
+
- **Os 8 commands antigos foram deletados** (`/analyze`, `/audit`, `/compact-memory`, `/context`, `/load-os`, `/os-status`, `/promote-learning`, `/snapshot`).
|
|
44
|
+
|
|
45
|
+
## Consequências
|
|
46
|
+
|
|
47
|
+
### Positivas
|
|
48
|
+
- Superfície de slash commands: 8 → 3 (redução de 62%).
|
|
49
|
+
- Sequência de tools deixa de ser improvisada pela LLM — workflows são determinísticos.
|
|
50
|
+
- Workflows são **declarativos** (JSON) e auditáveis — facil debugar qual step falhou.
|
|
51
|
+
- Composição vira first-class: nova capacidade complexa é novo workflow JSON, não nova tool.
|
|
52
|
+
- Zero novas dependências (JSON parser é built-in no Node).
|
|
53
|
+
|
|
54
|
+
### Negativas / Trade-offs aceitos
|
|
55
|
+
- Muscle memory: quem usa `/analyze`, `/context`, etc. precisa migrar para `/sync` ou `/work`.
|
|
56
|
+
- `aios_run_workflow` adiciona um hop de indireção (parse JSON + iterate steps). Aceitável em uso local.
|
|
57
|
+
- Substituição de variável `${...}` introduz mini-template engine; mantido propositalmente trivial (sem condicionais/loops) para não virar DSL.
|
|
58
|
+
- JSON é mais verboso que YAML, mas evita nova dep.
|
|
59
|
+
|
|
60
|
+
### Neutras
|
|
61
|
+
- 17 tools primitivas continuam expostas — workflows são uma camada acima.
|
|
62
|
+
- Slash command `/init` colide nominalmente com built-in `init` (Initialize CLAUDE.md) do Claude Code. Custom commands em `.claude/commands/` têm precedência para slash commands; para Skill tool a desambiguação é manual. Documentado em `.claude/commands/init.md`.
|
|
63
|
+
|
|
64
|
+
## Alternativas consideradas
|
|
65
|
+
|
|
66
|
+
### Alternativa A — YAML em vez de JSON
|
|
67
|
+
- Pros: mais legível para humanos.
|
|
68
|
+
- Cons: exige dep (js-yaml ou similar), violando zero-deps de ADR-0002.
|
|
69
|
+
- **Descartada**.
|
|
70
|
+
|
|
71
|
+
### Alternativa B — Workflow engine externo (Temporal, n8n)
|
|
72
|
+
- Pros: feature-rich, durável, observable.
|
|
73
|
+
- Cons: dep externa pesada, overkill para uso local single-user.
|
|
74
|
+
- **Descartada**.
|
|
75
|
+
|
|
76
|
+
### Alternativa C — DSL própria (com condicionais, loops)
|
|
77
|
+
- Pros: mais expressivo.
|
|
78
|
+
- Cons: vira projeto paralelo de manter; risco de "in-house programming language".
|
|
79
|
+
- **Descartada**: manter steps lineares; condicionais ficam para Fase 4 (Intent Runtime).
|
|
80
|
+
|
|
81
|
+
## Critérios de decisão
|
|
82
|
+
|
|
83
|
+
| Critério | Peso | Alt A (YAML) | Alt B (Temporal) | **Esta (JSON nativo)** |
|
|
84
|
+
|---|---|---|---|---|
|
|
85
|
+
| Zero-deps | Alto | Baixo | Baixo | **Alto** |
|
|
86
|
+
| Simplicidade implementação | Alto | Médio | Baixo | **Alto** |
|
|
87
|
+
| Expressividade | Médio | Médio | Alto | **Médio** |
|
|
88
|
+
| Tempo até MVP | Alto | Médio | Baixo | **Alto** |
|
|
89
|
+
|
|
90
|
+
## Impacto futuro
|
|
91
|
+
|
|
92
|
+
- Fase 2 (Runtime State) vai adicionar `${state.X}` à substituição de variáveis.
|
|
93
|
+
- Fase 4 (Intent Runtime) vai estender com pause-for-input e conditional branches — exige cuidado para não virar DSL completo.
|
|
94
|
+
- Se workflow JSON ficar muito grande, considerar split por arquivo (`init/steps.json` + `init/meta.json`).
|
|
95
|
+
|
|
96
|
+
## Referências
|
|
97
|
+
|
|
98
|
+
- ADR-0004 (decisão consolidada)
|
|
99
|
+
- RFC-0001 (proposta detalhada)
|
|
100
|
+
- `.ai/workflows/_schema.json` (validação)
|
|
101
|
+
- `.ai/server/aios-server.mjs` (implementação)
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
> Espelho em `.ai/memory/decisions.md`. Próxima fase: ADR-0006 (Runtime State).
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-0006
|
|
3
|
+
slug: runtime-state
|
|
4
|
+
status: accepted
|
|
5
|
+
date: 2026-05-16
|
|
6
|
+
deciders: [user, tech-lead]
|
|
7
|
+
related:
|
|
8
|
+
- RFC-0002 (extensão consolidada)
|
|
9
|
+
- ADR-0005 (Fase 1 — Workflow Engine MVP)
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# ADR-0006 — Runtime State + Lifecycle + Context TTL + Execution Contracts + Safety Rule (Fase 2)
|
|
13
|
+
|
|
14
|
+
## Contexto
|
|
15
|
+
|
|
16
|
+
Sob ADR-0005 (Fase 1), o Workflow Engine executa workflows sem persistir estado entre sessões: cada `/sync` ou `/work` começa "do zero". A análise externa de 2026-05-16 destacou que isso impede **continuidade operacional** — LLM não sabe em que fase do projeto está, qual o foco atual, quais decisões foram tomadas recentemente.
|
|
17
|
+
|
|
18
|
+
Esta ADR cobre **Fase 2** do RFC-0002.
|
|
19
|
+
|
|
20
|
+
## Decisão
|
|
21
|
+
|
|
22
|
+
**Decidimos persistir o estado operacional em `.ai/runtime/state.json`** com 5 componentes:
|
|
23
|
+
|
|
24
|
+
1. **Identity** — nome do projeto, maturity (empty/minimal/partial/mature), stack.
|
|
25
|
+
2. **Lifecycle** — `phase` (discovery/planning/implementation/stabilization/production) + `mode` (readonly/analysis/execution/validation).
|
|
26
|
+
3. **Persistent context** — refs a decisões arquiteturais + rules (não rotaciona).
|
|
27
|
+
4. **Rotating context** — TTL configurável (default 30 dias): active_focus, recent_errors, open_questions. Entries com `expires_at`; tools podem prunar.
|
|
28
|
+
5. **Workflow history** — últimas N execuções de workflows com timestamp, status, guarantees met/unmet.
|
|
29
|
+
|
|
30
|
+
**4 tools MCP novas**: `aios_state_get`, `aios_state_set`, `aios_state_advance`, `aios_state_reset`.
|
|
31
|
+
|
|
32
|
+
**Workflow schema estendido** com 2 campos opcionais:
|
|
33
|
+
- `guarantees: [string]` — lista de invariantes auditáveis. Engine valida cumprimento após execução; relatório inclui `unmet_guarantees: []`.
|
|
34
|
+
- `safety: { project_files_readonly: boolean }` — declarativo; futuro: engine pode bloquear steps que tentem editar fora de `.ai/` quando flag ativa.
|
|
35
|
+
|
|
36
|
+
**Substituição de variáveis em workflows** ganha `${state.X}` (ex: `${state.lifecycle.phase}`).
|
|
37
|
+
|
|
38
|
+
Mapeamento `guarantee → tools provedoras` é fixo no servidor:
|
|
39
|
+
```
|
|
40
|
+
snapshot_created → aios_snapshot
|
|
41
|
+
state_updated → aios_state_set, aios_state_advance, aios_state_reset
|
|
42
|
+
context_compiled → aios_build_context_package
|
|
43
|
+
lint_clean → aios_lint
|
|
44
|
+
stack_detected → aios_detect_stack
|
|
45
|
+
project_analyzed → aios_analyze_project
|
|
46
|
+
core_loaded → aios_get_core_bundle
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Workflows `init`/`sync`/`work` atualizados:
|
|
50
|
+
- `init`: guarantees todas + state advance para `discovery`.
|
|
51
|
+
- `sync`: guarantees stack+analyzed+context+lint+snapshot+state_updated.
|
|
52
|
+
- `work`: guarantees core_loaded+context_compiled (sem state advance — work é repetível).
|
|
53
|
+
|
|
54
|
+
## Consequências
|
|
55
|
+
|
|
56
|
+
### Positivas
|
|
57
|
+
- LLM tem fonte única de verdade sobre estado operacional (`/work` pode consultar `aios_state_get({path: "lifecycle.phase"})` em vez de inferir).
|
|
58
|
+
- Workflow guarantees criam contrato auditável (relatório mostra se algum invariante falhou).
|
|
59
|
+
- Context TTL evita acúmulo infinito de `recent_errors`/`open_questions`.
|
|
60
|
+
- Base preparada para Fase 3 (State Compiler vai ler do state.json) e Fase 5 (Confidence vive sob state).
|
|
61
|
+
|
|
62
|
+
### Negativas / Trade-offs aceitos
|
|
63
|
+
- `.ai/runtime/state.json` é mais um arquivo a manter sincronizado. Mitigação: workflows escrevem nele automaticamente.
|
|
64
|
+
- Guarantees mapeamento hardcoded no servidor; nova guarantee exige edit de código (não declarável só no workflow JSON). Aceitável: lista pequena, estável.
|
|
65
|
+
- `${state.X}` introduz acoplamento workflows ↔ state schema. Schema versionado.
|
|
66
|
+
|
|
67
|
+
### Neutras
|
|
68
|
+
- Manifest atualizado para incluir `.ai/runtime/state.schema.json` e `.ai/runtime/state.json` como required.
|
|
69
|
+
- Diretório `.ai/runtime/` já existia (PID file); agora ganha state.
|
|
70
|
+
|
|
71
|
+
## Alternativas consideradas
|
|
72
|
+
|
|
73
|
+
### Alternativa A — Estado em memory/_summary.md (markdown narrativo)
|
|
74
|
+
- Pros: humanamente legível.
|
|
75
|
+
- Cons: não-estruturado; LLM precisa parsear; falsos negativos em busca.
|
|
76
|
+
- **Descartada**: precisamos de schema validável.
|
|
77
|
+
|
|
78
|
+
### Alternativa B — SQLite em `.ai/runtime/state.db`
|
|
79
|
+
- Pros: queries ricas, transações.
|
|
80
|
+
- Cons: viola zero-deps (better-sqlite3 ou similar); overkill para single-writer.
|
|
81
|
+
- **Descartada**.
|
|
82
|
+
|
|
83
|
+
### Alternativa C — Guarantees como JSON Schema validação do output
|
|
84
|
+
- Pros: declarativo total.
|
|
85
|
+
- Cons: cada tool teria que produzir output conformante; refactor grande.
|
|
86
|
+
- **Descartada**: mapeamento tool→guarantee é simples e suficiente.
|
|
87
|
+
|
|
88
|
+
## Impacto futuro
|
|
89
|
+
|
|
90
|
+
- Fase 3 (State Compiler) vai produzir `runtime-context.json` consolidando `state.json` + outras fontes.
|
|
91
|
+
- Fase 4 (Intent Runtime) vai usar `state.lifecycle.phase` para adaptar comportamento do `/work`.
|
|
92
|
+
- Fase 5 (Confidence) vai estender schema do state com bloco `confidence: {}`.
|
|
93
|
+
- Se schema do state.json se mostrar limitante: nova versão major + migration ADR.
|
|
94
|
+
|
|
95
|
+
## Referências
|
|
96
|
+
|
|
97
|
+
- RFC-0002 (proposta consolidada Fases 2-5)
|
|
98
|
+
- ADR-0005 (Fase 1 — base sobre a qual estendemos)
|
|
99
|
+
- `.ai/runtime/state.schema.json` (validação)
|
|
100
|
+
- `.ai/server/aios-server.mjs` (implementação)
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
> Espelho em `.ai/memory/decisions.md`. Próxima fase: ADR-0007 (State Compiler + Drift + Context Layers + Artifact Index).
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ADR-0007
|
|
3
|
+
slug: state-compiler-drift-context-layers-artifact-index
|
|
4
|
+
status: accepted
|
|
5
|
+
date: 2026-05-16
|
|
6
|
+
deciders: [user, tech-lead]
|
|
7
|
+
related:
|
|
8
|
+
- RFC-0002 (extensão consolidada)
|
|
9
|
+
- ADR-0006 (Fase 2 — Runtime State)
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# ADR-0007 — State Compiler + Drift Detection + Context Layers + Artifact Index (Fase 3)
|
|
13
|
+
|
|
14
|
+
## Contexto
|
|
15
|
+
|
|
16
|
+
Sob ADR-0006 (Fase 2), o sistema persiste estado operacional. Mas o `/work` ainda relê CORE + memory + context a cada execução (~5k tokens). A análise externa propõe um **Project State Compiler** que produz um pacote operacional único e otimizado, consumido por `/work`.
|
|
17
|
+
|
|
18
|
+
Esta ADR cobre **Fase 3** do RFC-0002.
|
|
19
|
+
|
|
20
|
+
## Decisão
|
|
21
|
+
|
|
22
|
+
**Decidimos implementar 4 capacidades novas**:
|
|
23
|
+
|
|
24
|
+
1. **State Compiler** — tool `aios_compile_runtime_context()` produz `.ai/runtime/runtime-context.json` consolidando state.json + project-state.json + últimas N decisions + top-M módulos por relevância + memory rotating. **Target: ≤ 4000 tokens** (compressão semântica, não dump). Cache invalidado por hash do project-state.
|
|
25
|
+
|
|
26
|
+
2. **Drift Detection** — tool `aios_detect_drift({ since_snapshot? })` compara arquivos atuais vs último snapshot (ou snapshot informado): retorna `{ code_changes_without_spec_update, specs_updated_no_code_change, orphan_modules }`. Sem AST profundo (Fase 4 pode aprofundar) — usa hash + mtime + presença de SDD/ADR referenciando o módulo.
|
|
27
|
+
|
|
28
|
+
3. **Context Layers explícitas** — tool `aios_get_context(layer, focus?)` atalho para devolver:
|
|
29
|
+
- `core` → `aios_get_core_bundle()`
|
|
30
|
+
- `working` → state + project-state resumido + memory rotating + últimas 3 decisions
|
|
31
|
+
- `deep` → working + full project-state + memory full + all decisions
|
|
32
|
+
|
|
33
|
+
4. **Artifact Index** — tool `aios_artifact_list({ type?, status? })` retorna catálogo de specs/snapshots/packages/ADRs. Mantém `.ai/artifacts/index.json` opcionalmente (auto-gerado por `aios_compile_runtime_context`).
|
|
34
|
+
|
|
35
|
+
Workflow `sync` ganha 2 steps finais: `compile_runtime_context` + `detect_drift` (drift como info, não bloqueante).
|
|
36
|
+
Workflow `work` v2.1 ganha step inicial `load_runtime_context` opcional (preferido a `load_core` quando context recente existe).
|
|
37
|
+
|
|
38
|
+
## Consequências
|
|
39
|
+
|
|
40
|
+
### Positivas
|
|
41
|
+
- `/work` pode carregar **um único arquivo** (`runtime-context.json` ~4k tokens) em vez de CORE + memory + context separados (~5k).
|
|
42
|
+
- Drift detection alerta divergências antes que virem inconsistência crônica.
|
|
43
|
+
- `aios_get_context(layer)` simplifica chamada — LLM não precisa saber quais tools compor.
|
|
44
|
+
- Artifact index torna inventário consultável (útil para `/work` decidir se precisa de spec específico).
|
|
45
|
+
|
|
46
|
+
### Negativas / Trade-offs aceitos
|
|
47
|
+
- Cache do runtime-context invalida facilmente (qualquer change em project-state). Aceitável: recompilar é barato (~1s para projetos médios).
|
|
48
|
+
- Drift detection sem AST profundo pode gerar falsos positivos (arquivo mudou mas spec atualizada não detectada). Mitigação: severity tier `info` por default.
|
|
49
|
+
- Runtime context é JSON estruturado, não markdown narrativo — menos legível para humano. Mitigação: opcional `aios_compile_runtime_context({ format: "markdown" })` futuro.
|
|
50
|
+
|
|
51
|
+
### Neutras
|
|
52
|
+
- `.ai/runtime/runtime-context.json` é arquivo gerado; gitignore opcional.
|
|
53
|
+
- `.ai/artifacts/index.json` é arquivo gerado; gitignore opcional.
|
|
54
|
+
|
|
55
|
+
## Alternativas consideradas
|
|
56
|
+
|
|
57
|
+
### A — Sempre recompilar sob demanda (sem cache em disco)
|
|
58
|
+
- Pros: nunca stale.
|
|
59
|
+
- Cons: latência por chamada; perde benefício de "single file leitor".
|
|
60
|
+
- **Descartada**: cache em disco é mais eficiente; invalidação é rápida.
|
|
61
|
+
|
|
62
|
+
### B — Drift detection via AST diff completo
|
|
63
|
+
- Pros: precisão alta.
|
|
64
|
+
- Cons: lento; reusaria ts-morph; complexidade grande.
|
|
65
|
+
- **Descartada na Fase 3**: hash+mtime+ref-check é suficiente como MVP; Fase 4+ pode aprofundar.
|
|
66
|
+
|
|
67
|
+
### C — Artifact Index gerado por crawler separado
|
|
68
|
+
- Pros: roda em background.
|
|
69
|
+
- Cons: mais um processo a coordenar.
|
|
70
|
+
- **Descartada**: index gerado in-process pelo compile_runtime_context.
|
|
71
|
+
|
|
72
|
+
## Impacto futuro
|
|
73
|
+
|
|
74
|
+
- Fase 4 (Intent Runtime) vai consumir `runtime-context.json` no início do `/work`.
|
|
75
|
+
- Fase 5 (Confidence) vai adicionar bloco `confidence` ao compiled context.
|
|
76
|
+
- Se runtime-context exceder 4000 tokens repetidamente: revisar algoritmo de compressão; pode precisar de tiered context (core/working/deep no próprio arquivo).
|
|
77
|
+
|
|
78
|
+
## Referências
|
|
79
|
+
|
|
80
|
+
- RFC-0002 (Fase 3 detalhada)
|
|
81
|
+
- ADR-0006 (state.json — fonte de identity/lifecycle/rotating)
|
|
82
|
+
- `.ai/server/aios-server.mjs` (implementação)
|