Skip to content

feat(squad): usuário como membro da squad — chat ao vivo (Fase 1a) - #43

Merged
danzeroum merged 1 commit into
mainfrom
claude/buildtovalue-fase-1-chat
Jul 7, 2026
Merged

feat(squad): usuário como membro da squad — chat ao vivo (Fase 1a)#43
danzeroum merged 1 commit into
mainfrom
claude/buildtovalue-fase-1-chat

Conversation

@danzeroum

Copy link
Copy Markdown
Owner

Resumo

Transforma o humano de aprovador-de-gate em membro participante da squad, com um chat ao vivo ao lado da esteira. Primeira fase do roadmap de evolução Forge→BuildToValue (handoff completo em docs/handoff/desenvolvimento/HANDOFF-BUILDTOVALUE.md, PR de docs à parte).

O que muda

  • Contrato (aditivo): nova ChatMessage (author/author_role/text/in_reply_to) na variante 9 do oneof payload de SquadEvent (schemas/proto/squad.proto). Stubs Python regenerados. Protos evoluem só aditivamente — sem breaking.
  • Rust (crates/forge-cli): SquadHub.push_user_message injeta a fala do usuário na tarefa viva (ecoa como ChatMessage HUMAN no stream + enfileira na inbox); novo POST /api/squad/:id/message (responde 202 sem corpo — mesmo cuidado do bug de 202/.json() corrigido na Onda 15); render do chat no CLI squad.rs.
  • Python (forge-squad): o orquestrador dá voz aos agentes (_emit_chat, texto derivado do conteúdo real da proposta — nada fabricado) e narra o consenso; server.py mapeia o kind chatChatMessage.
  • Web: postSquadMessage + tipo SquadChatMessage; painel de conversa na tela Squad (bolhas HUMAN à direita, agentes/SYSTEM à esquerda) + input.

Escopo / decisões

  • Esta é a Fase 1a (chat visível + canal de entrada). A Fase 1b (a fala do usuário vira Proposal de peso máximo dentro do consenso, via novo CoreService.AwaitUserTurn) é mais invasiva no contrato gRPC Core e fica para PR seguinte — registrada em pendencias.md.
  • Respeita o ADR 0021: max_autonomy_level segue ignorado; autonomia continua descritiva.

Verificação

Rodado localmente, tudo verde:

  • cargo build --workspace · cargo clippy -p forge-cli (0 warnings) · cargo fmt --all --check
  • cargo test -p forge-cli — novos: push_user_message_ecoa_chat_no_stream_e_enfileira, push_user_message_em_tarefa_inexistente_devolve_err
  • uv run pytest packages/forge-squad — 125 passed; novos/atualizados: test_chat_message_atravessa_o_mapeamento_proto, test_event_sink_emite_eventos_ao_vivo_na_ordem
  • web: tsc -b, oxlint, vitest run (20 passed) verdes

🤖 Generated with Claude Code


Generated by Claude Code

Transforma o humano de aprovador-de-gate em MEMBRO participante da squad,
com um chat ao vivo ao lado da esteira.

Contrato (aditivo, ADR de contrato preservado):
- squad.proto: nova ChatMessage (author/author_role/text/in_reply_to) na
  variante 9 do oneof payload de SquadEvent. Stubs Python regenerados.

Rust (crates/forge-cli):
- SquadHub.push_user_message: injeta a fala do usuário na tarefa viva —
  ecoa como ChatMessage(HUMAN) no stream e enfileira na inbox (base para a
  Fase 1b consumir como turno real do membro humano).
- POST /api/squad/:id/message (202 sem corpo, mesmo cuidado do bug de 202
  da Onda 15); renderização do chat no CLI squad.rs.

Python (forge-squad):
- orchestrator dá VOZ aos agentes: _emit_chat narra cada proposta (texto
  derivado do conteúdo REAL, nada fabricado) e o consenso; server.py mapeia
  o kind "chat" para ChatMessage.

Web:
- postSquadMessage + tipo SquadChatMessage; painel de conversa na tela Squad
  (bolhas HUMAN à direita, agentes/SYSTEM à esquerda) + input de mensagem.

Testes: Rust (push_user_message_*), Python (test_chat_message_atravessa_o_
mapeamento_proto, test_event_sink_* atualizado), web (tsc/lint/vitest verdes).
Fase 1b (AwaitUserTurn — a fala vira Proposal dentro do consenso) fica para
PR seguinte; registrada em pendencias.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ep37vHQeEet5LynX35nY2G
@danzeroum
danzeroum merged commit 3e45acf into main Jul 7, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants