# Evidências de Segurança e Testes — SDDL-2

**Data:** 2026-06-24
**Branch:** SDDL-2

## 1. shell: true em execa

```
grep -r "shell:\s*true" bot/src/ --include="*.ts"
```

Resultado: ocorrência encontrada SOMENTE em comentário de documentação
(`bot/src/commands/create.ts:6:// S-06: execa sem shell:true, env restrito`).
Nenhuma ocorrência em código executável.

## 2. process.env propagado em execa

```
grep -r "env:\s*process\.env" bot/src/ --include="*.ts"
```

Resultado: **nenhuma ocorrência**. Conformidade com S-06.

## 3. Tokens hardcoded

```
grep -rE "(xoxb|xapp|ATATT|sk-ant)" bot/src/ --include="*.ts"
grep -rE "(xoxb|xapp|ATATT|sk-ant)" src/ --include="*.rs"
```

Resultado TypeScript: ocorrências apenas nos arquivos de teste
(`bot/src/__tests__/bot.test.ts`) como strings de teste para a função `redactSecrets`.
Nenhum token em código de produção.

Resultado Rust: ocorrências em:
- `src/main.rs` — strings de exemplo em template YAML gerado pelo comando `sdd init` (placeholder de documentação, nunca valores reais)
- `src/runtime/trace.rs` — padrões de detecção em lista de prefixos suspeitos
- `src/runtime/redaction.rs` — regex de redação e strings em testes unitários de redação

Todos os casos são regex/detecção/exemplo, nunca tokens hardcoded funcionais. Conformidade com S-04.

## 4. .gitignore

```
grep -E "sdd-bot\.config\.yaml|\.sdd/bot/sdd-bot\.db" .gitignore
```

Resultado:
```
44:sdd-bot.config.yaml
45:.sdd/bot/sdd-bot.db
```

Ambas as entradas presentes. Conformidade com S-03/S-05.

## 5. cargo test

```
cargo test
```

Resultado:
```
test result: ok. 56 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.19s
```

56 testes Rust passando, 0 falhas.

## 6. npm run build

```
cd bot && npm run build
```

Resultado: compilação TypeScript concluída sem erros ou warnings.

## 7. assertOwner nos handlers

```
grep -n "assertOwner" bot/src/commands/update.ts bot/src/commands/aproved.ts bot/src/commands/view.ts
```

Resultado:
```
update.ts:45:  // 4. S-02: assertOwner OBRIGATÓRIO
update.ts:47:    cardRepository.assertOwner(cardId, userId)
aproved.ts:32:  // 2. S-02: assertOwner OBRIGATÓRIO
aproved.ts:34:    cardRepository.assertOwner(cardId, userId)
view.ts:31:  // 2. S-02: assertOwner OBRIGATÓRIO antes de leitura sensível
view.ts:33:    cardRepository.assertOwner(cardId, userId)
```

Presença confirmada nos três handlers. Conformidade com CA-04/S-02.

## 8. Testes TypeScript (TASK-13)

```
cd bot && npm test
```

Resultado:
```
PASS src/__tests__/channelKey.test.ts
PASS src/__tests__/bot.test.ts
PASS src/__tests__/cardRepository.test.ts

Test Suites: 3 passed, 3 total
Tests:       16 passed, 16 total
Snapshots:   0 total
Time:        3.856s
```

Cobertura por critério:
- CA-02: `extractProjectKey` detecta ausência de key e extrai de tópico e purpose — 4 testes
- CA-04: `assertOwner` lança `AccessDeniedError` para userId diferente — 1 teste
- CA-06: `listByUser` exclui aprovados e soft-deleted — 2 testes
- CA-07: `upsertStage` é idempotente — 1 teste
- S-04: `redactSecrets` mascara tokens xoxb, xapp, Basic — 4 testes
- Adicionais: `CardNotFoundError`, retorno de card correto, ordem de stages — 4 testes

## 9. Testes Rust gate (TASK-14)

```
cargo test domain::orchestrator::block_gate
```

Resultado:
```
running 9 tests
test domain::orchestrator::block_gate::tests::aprovado_nao_bloqueia ... ok
test domain::orchestrator::block_gate::tests::bloqueado_com_espacos_bloqueia ... ok
test domain::orchestrator::block_gate::tests::bloqueado_maiusculo_nao_bloqueia ... ok
test domain::orchestrator::block_gate::tests::bloqueado_minusculo_bloqueia ... ok
test domain::orchestrator::block_gate::tests::none_nao_bloqueia ... ok
test domain::orchestrator::block_gate::tests::bloqueado_mixed_case_nao_bloqueia ... ok
test domain::orchestrator::block_gate::tests::texto_parcial_nao_bloqueia ... ok
test domain::orchestrator::block_gate::tests::vazio_nao_bloqueia ... ok
test domain::orchestrator::block_gate::tests::sem_config_jira_nao_bloqueia ... ok

test result: ok. 9 passed; 0 failed; 0 ignored
```

9 testes passando (8 unitários de `is_blocked_marker` + 1 de integração `ensure_not_blocked`
sem config Jira).

## Veredicto

**PASS**

Todos os critérios críticos foram atendidos:
- 16 testes TypeScript passando (CA-02, CA-04, CA-06, CA-07, S-04)
- 9 testes Rust block_gate passando (AD-5, CP-2)
- 56 testes Rust totais passando
- `npm run build` sem erros
- Nenhum `shell: true` em código executável (S-06)
- Nenhum `env: process.env` em execa (S-06)
- Tokens hardcoded ausentes em código de produção (S-04)
- `.gitignore` protege config e banco (S-03/S-05)
- `assertOwner` presente em todos os handlers mutadores e de leitura sensível (CA-04/S-02)
