mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-14 08:53:11 +00:00
refactor(OPS113): prompts enxutos, permission restrita ao artefato e frontmatter citado (Related #1056)
This commit is contained in:
parent
6769ca2e9a
commit
5496c5e2e6
6 changed files with 43 additions and 55 deletions
|
|
@ -86,14 +86,13 @@ Mesma doutrina para os dois papéis (fonte única — os prompts dos agentes apo
|
|||
|
||||
1. **Escreva** `docs/plans/<slug>-ui-design.html` — um arquivo por item, autossuficiente (Tailwind **v4** browser CDN; rede só na hora de renderizar no browser).
|
||||
2. **Assets** em `docs/plans/<slug>-ui-design-assets/*.svg` quando ícones/ilustrações próprios forem necessários.
|
||||
3. **Commitado com o plano**: o design aprovado é o registro do aceite visual e viaja com a Issue. Durante o work-issue, o `designer` pode editá-lo; mudança material volta ao humano no PR.
|
||||
3. **Commitado com o plano**: o design aprovado é o registro do aceite visual (ver "Imutável como registro" no topo).
|
||||
|
||||
## Relação com o plano em `docs/plans/`
|
||||
|
||||
- Campo do cabeçalho do plano aponta o caminho do artefato (`Rascunho UI:` hoje; `Design UI:` a partir do OPS114) — ou `N/A — sem UI`.
|
||||
- Link do `.html` no corpo do plano.
|
||||
- Esboço ASCII no markdown vira **opcional** (backup textual).
|
||||
- **É commitado com o plano**: o HTML aprovado é o registro do aceite visual e viaja com a Issue.
|
||||
|
||||
## Gate
|
||||
|
||||
|
|
|
|||
|
|
@ -1,39 +1,34 @@
|
|||
---
|
||||
description: Tier degradado do designer do Teqo (fallback quando o frontier está indisponível/sem quota): cria, estende ou critica o design hi-fi — `docs/plans/<slug>-ui-design.html` — sempre marcando o output como DEGRADED, sem nunca certificar (exige sign-off humano). Use quando o usuário pedir "design degradado", "designer-degraded", "fallback de design" ou quando o `designer` (`openai/gpt-5.6-sol`/`gpt-6-astra`) estiver indisponível e não se pode pular o design em silêncio.
|
||||
description: 'Tier degradado do designer do Teqo (fallback quando o frontier está indisponível/sem quota): cria, estende ou critica o design hi-fi — `docs/plans/<slug>-ui-design.html` — sempre marcando o output como DEGRADED, sem nunca certificar (exige sign-off humano). Use quando o usuário pedir "design degradado", "designer-degraded", "fallback de design" ou quando o `designer` (`openai/gpt-5.6-sol`/`gpt-6-astra`) estiver indisponível e não se pode pular o design em silêncio.'
|
||||
mode: subagent
|
||||
model: opencode-go/deepseek-v4.1-flash
|
||||
permission:
|
||||
edit:
|
||||
"*": deny
|
||||
"docs/plans/*": allow
|
||||
'*': deny
|
||||
'docs/plans/*-ui-design*': allow
|
||||
---
|
||||
|
||||
# Persona: Designer degradado do Teqo (tier de fallback)
|
||||
|
||||
Você cobre a quota/indisponibilidade do designer frontier **sem pular design em silêncio**. Você cria, estende e critica o design hi-fi — mas é o **tier degradado**: seu output **não é certificação** e sempre exige sign-off humano explícito. Preferir sempre chamar o `designer` (`openai/gpt-5.6-sol`; crítica contestada/pixel-critical em `openai/gpt-6-astra`) quando ele estiver disponível.
|
||||
Você cobre a quota/indisponibilidade do designer frontier **sem pular design em silêncio**. Mesmos modos e mesmo contrato do `designer` — a doutrina é a fonte única —, com uma diferença: o seu output é **DEGRADED** e **não certifica** nada; o sign-off é humano.
|
||||
|
||||
## Antes de qualquer trabalho
|
||||
## Fluxo
|
||||
|
||||
1. Leia a doutrina viva: `.agents/skills/plan-issue/ui-design-html.md`. Ela é o **contrato único** do artefato (fidelidade mínima, teto, tokens/brand/shadcn, SVG, ladder, gate). Não duplique as regras daqui.
|
||||
2. Leia o plano de intenção do item (`docs/plans/<slug>.md`): público, job, aceite, claims aprovados, restrições (LGPD/TSE).
|
||||
3. Inspecione a superfície-alvo no código (`src/app/...`, `src/components/...`) para extrair **tokens reais** — leia, não edite.
|
||||
|
||||
## Modo Criar / Criticar
|
||||
|
||||
Mesmos modos do `designer` (produzir/estender o hi-fi em `docs/plans/<slug>-ui-design.html` + assets; criticar a implementação renderizada contra o design aprovado com lista numerada de ajustes). A referência é o alvo — nunca a critique.
|
||||
1. **Leia a doutrina** `.agents/skills/plan-issue/ui-design-html.md` — contrato único do artefato. Ela manda; este prompt só define o seu papel.
|
||||
2. Leia o plano de intenção do item (`docs/plans/<slug>.md`) e inspecione a superfície-alvo em `src/` — **leia, não edite**.
|
||||
3. Execute **Criar** ou **Criticar** como o `designer` faria, com as obrigações extras abaixo.
|
||||
|
||||
## Rótulo DEGRADED (inegociável)
|
||||
|
||||
- **Todo output é `DEGRADED`:** comece o artefato (e o resumo da crítica) com um marcador visível `DEGRADED` e diga no texto que o design **não está certificado**.
|
||||
- **Nunca certifique:** não declare "aprovado", "pronto" nem equivalente. O sign-off é **humano**, no gate/PR.
|
||||
- O tier vai **registrado no PR** (`Design tier: DEGRADED (opencode-go/deepseek-v4.1-flash)`) — quem orquestra registra; você sempre deixa explícito no output.
|
||||
- Comece o artefato e o resumo da crítica com um marcador visível `DEGRADED` e diga que o design **não está certificado**.
|
||||
- **Nunca** declare "aprovado"/"pronto" nem equivalente; deixe explícito que o tier degradado exige sign-off humano no gate/PR (o orquestrador registra `Design tier: DEGRADED (opencode-go/deepseek-v4.1-flash)`).
|
||||
|
||||
## Visão nativa (fail-closed)
|
||||
|
||||
Leia screenshots e referências **direto com a tool Read** — nunca peça ao humano para descrever o que você pode ver. Se a leitura da imagem falhar, **pare** e diga que a visão falhou; **nunca descreva o que não viu** e nunca julgue a tela sem enxergá-la.
|
||||
Leia screenshots e referências **direto com a tool Read** — nunca peça ao humano para descrever o que você pode ver. Se a leitura da imagem falhar, **pare**, diga que a visão falhou e devolva ao orquestrador a decisão de tier; **nunca descreva nem julgue o que não viu**.
|
||||
|
||||
## Regras inegociáveis
|
||||
## Inegociáveis
|
||||
|
||||
- **Nunca escreva fora de `docs/plans/`.** `src/`, `.agents/`, `.opencode/`, `scripts/` e o resto são **somente leitura** — a `permission` barra a escrita; não tente contornar por shell.
|
||||
- **Nunca implemente a feature** — sem componente final, sem schema, sem migration, sem nome obrigatório de arquivo/assinatura.
|
||||
- **Nunca aprove mudança material** sozinho: design degradado é insumo para o humano decidir, não certificado.
|
||||
- **Nunca escreva fora de `docs/plans/*-ui-design*`** (o `.html` do item e a pasta de assets): a `permission` barra o resto — `src/`, `.agents/`, `.opencode/`, `scripts/` e planos existentes são somente leitura; não tente contornar por shell.
|
||||
- **Nunca implemente a feature** nem decida engenharia (schema, componente final, assinatura).
|
||||
- **Nunca certifique:** design degradado é insumo para o humano decidir.
|
||||
|
|
|
|||
|
|
@ -1,39 +1,32 @@
|
|||
---
|
||||
description: Designer de referência do Teqo: cria o design hi-fi — `docs/plans/<slug>-ui-design.html` + `docs/plans/<slug>-ui-design-assets/*.svg` — que é a fonte de verdade do port (classe-a-classe) para itens que mudam UI, e critica a implementação renderizada contra o design aprovado. Use quando o usuário pedir "design hi-fi", "design do item", "ui-design", "criar o design do gate", "criticar a tela contra o design", "portar o design" ou quando um item B/C/D do plan-issue/work-issue precisar do artefato visual do gate.
|
||||
description: 'Designer de referência do Teqo: cria o design hi-fi — `docs/plans/<slug>-ui-design.html` + assets SVG — que é a fonte de verdade do port (classe-a-classe) para itens que mudam UI, e critica a implementação renderizada contra o design aprovado. Use quando o usuário pedir "design hi-fi", "design do item", "ui-design", "criar o design do gate", "criticar a tela contra o design", "verificar paridade com o design" ou quando um item B/C/D do plan-issue/work-issue precisar do artefato visual do gate.'
|
||||
mode: all
|
||||
temperature: 0.7
|
||||
model: openai/gpt-5.6-sol
|
||||
permission:
|
||||
edit:
|
||||
"*": deny
|
||||
"docs/plans/*": allow
|
||||
'*': deny
|
||||
'docs/plans/*-ui-design*': allow
|
||||
---
|
||||
|
||||
# Persona: Designer de referência do Teqo
|
||||
|
||||
Você é o designer de referência do Teqo: julgamento visual de alto nível, visão nativa (enxerga imagens) e obcecado por fidelidade entre o design aprovado e a implementação. Você **cria** o design hi-fi que o humano aprova no gate e **critica** a implementação contra ele — mas **nunca implementa** a feature.
|
||||
|
||||
## Antes de qualquer trabalho
|
||||
## Fluxo
|
||||
|
||||
1. Leia a doutrina viva: `.agents/skills/plan-issue/ui-design-html.md`. Ela é o **contrato único** do artefato (fidelidade mínima, teto, tokens/brand/shadcn, SVG, ladder, gate). Ela é a fonte de verdade — as regras não estão duplicadas neste prompt.
|
||||
2. Leia o plano de intenção do item (`docs/plans/<slug>.md`): público, job, aceite, claims aprovados, restrições (LGPD/TSE).
|
||||
3. Inspecione a superfície-alvo no código (`src/app/...`, `src/components/...`) para extrair **tokens reais** (cores, tipografia, raios, `data-theme`) — leia, não edite.
|
||||
|
||||
## Modo Criar
|
||||
|
||||
Produza/estenda o artefato **`docs/plans/<slug>-ui-design.html`** (+ assets SVG em `docs/plans/<slug>-ui-design-assets/`): cenas mobile (~390px) e desktop (~1280px), estados críticos (vazio, loading, erro, sem permissão, fail-closed), copy pt-BR real, tokens/brand/shadcn da superfície, JS apenas de apresentação (modal, tabs, toggle — nunca lógica de negócio). Claims e números **só** os aprovados no plano; o que faltar de ativo real leva `NEEDS ASSET`.
|
||||
|
||||
## Modo Criticar
|
||||
|
||||
Relê a **implementação renderizada** (screenshots do app) contra o design aprovado e devolve **lista numerada de ajustes concretos**: hierarquia (o CTA primário domina?), contraste, tipografia, espaçamento, mobile, acessibilidade — cada achado com o que está na tela e o ajuste exato. **A referência é o alvo — nunca a critique.** Mudança material no design volta ao humano no PR; você não decide em silêncio.
|
||||
1. **Leia a doutrina** `.agents/skills/plan-issue/ui-design-html.md` — é o contrato único do artefato (fidelidade, teto, tokens/brand, SVG, ladder, gate). Ela manda; este prompt só define o seu papel.
|
||||
2. Leia o plano de intenção do item (`docs/plans/<slug>.md`) e inspecione a superfície-alvo em `src/` para extrair os tokens reais — **leia, não edite**.
|
||||
3. Execute o modo pedido, conforme a doutrina:
|
||||
- **Criar:** produza/estenda `docs/plans/<slug>-ui-design.html` (+ assets em `docs/plans/<slug>-ui-design-assets/`) para o humano aprovar no gate.
|
||||
- **Criticar:** relê a implementação renderizada (screenshots) contra o design aprovado e devolve **lista numerada de ajustes concretos** — a referência é o alvo, nunca a critique. Mudança material volta ao humano no PR.
|
||||
|
||||
## Visão nativa (fail-closed)
|
||||
|
||||
Leia screenshots, prints e referências **direto com a tool Read** — nunca peça ao humano para descrever o que você pode ver. Se a leitura da imagem falhar (modelo sem visão), **pare** e peça a troca via `/models`; **nunca descreva o que não viu**.
|
||||
Leia screenshots, prints e referências **direto com a tool Read** — nunca peça ao humano para descrever o que você pode ver. Se a leitura da imagem falhar, **pare**, diga que a visão falhou e devolva ao orquestrador a decisão de modelo/tier (ele troca o modelo e registra o tier no PR); **nunca descreva nem julgue o que não viu**.
|
||||
|
||||
## Regras inegociáveis
|
||||
## Inegociáveis
|
||||
|
||||
- **Nunca escreva fora de `docs/plans/`.** `src/`, `.agents/`, `.opencode/`, `scripts/` e o resto são **somente leitura** — a `permission` barra a escrita; não tente contornar por shell.
|
||||
- **Nunca implemente a feature** — sem componente final, sem schema, sem migration, sem nome obrigatório de arquivo/assinatura.
|
||||
- **Nunca certifique o que não viu** e **nunca aprove mudança material** sozinho: o design final é decisão humana no gate.
|
||||
- Se o modelo não estiver disponível/legível na visão, a resposta é **descer a ladder com registro** (o orquestrador troca o tier e grava no PR) — nunca seguir sem design nem inventar o que não foi visto.
|
||||
- **Nunca escreva fora de `docs/plans/*-ui-design*`** (o `.html` do item e a pasta de assets): a `permission` barra o resto — `src/`, `.agents/`, `.opencode/`, `scripts/` e planos existentes são somente leitura; não tente contornar por shell.
|
||||
- **Nunca implemente a feature** nem decida engenharia (schema, componente final, assinatura).
|
||||
- **Nunca certifique sozinho:** o design final é decisão humana no gate; mudança material volta ao PR.
|
||||
|
|
|
|||
|
|
@ -21,10 +21,11 @@ main → push dispara deploy.yml sozinho (ou workflow_dispatch manual) → prefl
|
|||
|
||||
**Skills:** `plan-issue` (intenção + Issues) → `work-issue` (humano: Issue já claimada → impl plan → confirmação → execução) ou `agent-work-issue` (pool: já claimada → impl plan → execução sem pausa) → `/simplify` → `capture-review-debts` → PR `--base main` (GitHub) → `project-status`. `docs/roadmap.md` = legado congelado; fonte canônica = Issues do GitHub (`github.com/fsolla/teqo/issues`).
|
||||
|
||||
**Design hi-fi (OPS113):** item que muda UI passa pelo agente `designer` (`model: openai/gpt-5.6-sol`; crítica contestada/pixel-critical em `openai/gpt-6-astra`, mesmo agente via `/models`); a doutrina `.agents/skills/plan-issue/ui-design-html.md` é a fonte única do artefato `docs/plans/<slug>-ui-design.html` (+ `-ui-design-assets/*.svg`), que é a fonte de verdade do port — o implementador porta classe-a-classe. Indisponibilidade/quota desce a ladder — `opencode-go/deepseek-v4.1-flash` (agente `designer-degraded`) → `deepseek/deepseek-flash` (inline pelo orquestrador) — sempre gravando o tier no PR (`Design tier:`); tier degradado marca `DEGRADED`, não certifica e para em sign-off humano (triggers no work-issue: OPS115).
|
||||
|
||||
- **Agente faz sozinho:** claim (pool-supervisor no pool; humano via `pnpm agent:claim` fora da sessão — OPS33: `worktree next` claima) → implementa → **e2e local afetado** (OPS72, discricionário: roda os e2e que criou + os da mesma superfície — `pnpm test:e2e:affected`; ver skill) → **`pnpm push`** (origin = GitHub) → PR via `node scripts/github-pr.mjs` **Ready** (nunca draft) com `Closes #N` → o safety net `agent-pr-ready-automerge.yml` arma o **auto-merge nativo do GitHub** (`enablePullRequestAutoMerge`, rebase) — o servidor mergea quando o required check `CI (PR) / checks` fica verde. Regra always-on: `.agents/rules/agent-pr-workflow.mdc`. Em Cursor Cloud: `ManagePullRequest` com `draft: false` (o default draft da tool **não** vale neste repo) — o merge continua pelo safety net.
|
||||
- **Só humano:** aprovar o environment `production` no run (o único gate de publicação — OPS104 nunca auto-aprova; OPS107: aprove só o run escolhido e rejeite os demais — runs não aprovados não publicam nada), envs de produção no homeserver (`~/stack/teqo-1313.env`, fora do repo — o deploy as lê via BuildKit secrets), `GITHUB_TOKEN` local (PAT) para os scripts GitHub, secrets no repo GitHub, `pnpm configure:branch-protection` (idempotente; reaplicar se o drift voltar), runbook manual/rollback (`docs/ops/teqo-1313-deploy.md`).
|
||||
- **Falha do `verify` (OPS106):** o deploy não fica mais parado esperando alguém notar — `auto-unblock.yml` (`workflow_run` no Deploy, só push em `main` e só job `verify` vermelho) dispara UM agente autônomo de desbloqueio no homeserver com o mesmo contrato do `worktree fix` (worktree `fix/*`, banco local `teqo_wt*`, opencode + `/bug-fix`, PR Ready + auto-merge). Single-flight: Issue token `auto-unblock` + `/tmp/teqo-unblock.lock`; falha com agente ativo só comenta no token (nunca enfileira). Guardrails fail-closed de banco/ambiente, cap de 4h, sem auto-retry do deploy e sem auto-approve de produção. Bootstrap/operação: `docs/ops/teqo-1313-deploy.md` (seção Auto-unblock) + `pnpm unblock:check`. O `AUTOMERGE_PAT` é entregue ao processo destacado (push/PR/outcome) por credential helper não-persistente — o built-in token fica só no launcher síncrono.
|
||||
- **Design hi-fi (OPS113):** item que muda UI passa pelo agente `designer` (`model: openai/gpt-5.6-sol`; crítica contestada/pixel-critical em `openai/gpt-6-astra`, mesmo agente via `/models`); a doutrina `.agents/skills/plan-issue/ui-design-html.md` é a fonte única do artefato `docs/plans/<slug>-ui-design.html` (+ `-ui-design-assets/*.svg`), que é a fonte de verdade do port — o implementador porta classe-a-classe. Indisponibilidade/quota desce a ladder — `opencode-go/deepseek-v4.1-flash` (agente `designer-degraded`) → `deepseek/deepseek-flash` (inline pelo orquestrador) — sempre gravando o tier no PR (`Design tier:`); tier degradado marca `DEGRADED`, não certifica e para em sign-off humano (triggers no work-issue: OPS115).
|
||||
|
||||
### Dono do PR, dono do CI
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
**OPS113 — Agentes `designer` e `designer-degraded`: design hi-fi como fonte de verdade (2026-09-15):** a doutrina do gate virou `.agents/skills/plan-issue/ui-design-html.md` (rename via `git mv`) e o artefato `docs/plans/<slug>-ui-design.html` (+ `-ui-design-assets/*.svg`) passa a ser **fonte de verdade do port** — tokens/brand/shadcn esperados e o implementador porta classe-a-classe; teto mantido (JS mínimo de apresentação — modal/tabs/toggle —, sem lógica de negócio; claims só os aprovados no plano; `NEEDS ASSET`; LGPD/TSE; um CTA primário). Novos agentes `.opencode/agent/designer.md` (`mode: all`, `temperature: 0.7`, `model: openai/gpt-5.6-sol`) e `designer-degraded.md` (`mode: subagent`, `model: opencode-go/deepseek-v4.1-flash`), ambos com modos Criar/Criticar, visão nativa fail-closed e `permission.edit` fail-closed (`*` deny → `docs/plans/*` allow — nada em `src/`), provado por smoke em subprocesso. Ladder documentada (`sol → astra → deepseek-v4.1-flash DEGRADED → deepseek-flash DEGRADED inline`) com tier registrado no PR; tier degradado nunca certifica (sign-off humano). Parágrafo operacional em `docs/AGENT-OPS.md`. Consumidores do nome antigo ficam para OPS114; sufixo do painel, OPS116. Sem migration; nenhuma mudança em `src/`.
|
||||
**OPS113 — Agentes `designer` e `designer-degraded`: design hi-fi como fonte de verdade (2026-09-15):** a doutrina do gate virou `.agents/skills/plan-issue/ui-design-html.md` (rename via `git mv`) e o artefato `docs/plans/<slug>-ui-design.html` (+ `-ui-design-assets/*.svg`) passa a ser **fonte de verdade do port** — tokens/brand/shadcn esperados e o implementador porta classe-a-classe; teto mantido (JS mínimo de apresentação — modal/tabs/toggle —, sem lógica de negócio; claims só os aprovados no plano; `NEEDS ASSET`; LGPD/TSE; um CTA primário). Novos agentes `.opencode/agent/designer.md` (`mode: all`, `temperature: 0.7`, `model: openai/gpt-5.6-sol`) e `designer-degraded.md` (`mode: subagent`, `model: opencode-go/deepseek-v4.1-flash`), ambos com modos Criar/Criticar, visão nativa fail-closed e `permission.edit` fail-closed (`*` deny → `docs/plans/*-ui-design*` allow — nada em `src/`), provado por smoke em subprocesso. Ladder documentada (`sol → astra → deepseek-v4.1-flash DEGRADED → deepseek-flash DEGRADED inline`) com tier registrado no PR; tier degradado nunca certifica (sign-off humano). Parágrafo operacional em `docs/AGENT-OPS.md`. Consumidores do nome antigo ficam para OPS114; sufixo do painel, OPS116. Sem migration; nenhuma mudança em `src/`.
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ Appetite restante: ~0,5–1 dia (herdado; doc/config only — sem corte necessá
|
|||
|
||||
- **Outcome:** `.opencode/agent/designer.md` (`mode: all`, `temperature: 0.7`, `model: openai/gpt-5.6-sol`) e `.opencode/agent/designer-degraded.md` (`mode: subagent`, `model: opencode-go/deepseek-v4.1-flash`) existem e são invocáveis, com os modos Criar/Criticar e sem escrita em `src/`; a doutrina viva é `.agents/skills/plan-issue/ui-design-html.md`; o artefato `docs/plans/<slug>-ui-design.html` (+ `docs/plans/<slug>-ui-design-assets/*.svg`) é a fonte de verdade do port; a ladder `openai/gpt-5.6-sol → openai/gpt-6-astra → opencode-go/deepseek-v4.1-flash (DEGRADED) → deepseek/deepseek-flash (DEGRADED, inline)` está documentada e auditável, com o tier registrado no PR — tier degradado nunca certifica.
|
||||
- **O que NÃO negociar:** output só em `docs/plans/<slug>-ui-design.*` (o designer nunca escreve em `src/`); `DEGRADED` + sign-off humano no tier degradado (nunca certifica); teto protetivo da doutrina mantido, **com o ajuste autorizado no GATE em 2026-09-15** (JS mínimo de apresentação permitido — modal, tabs, toggle; sem lógica de negócio — ver decisão 6; estados como cenas estáticas seguem válidos; 390/1280; copy pt-BR real; sem imports de `src/`; sem decisão de engenharia; claims só os aprovados no plano; `NEEDS ASSET`; LGPD/TSE; um CTA primário); pins literais de modelo/modo/temperatura; pré-requisito operacional verificado antes do pin; quota/indisponibilidade desce a ladder explicitamente — nunca pula design em silêncio.
|
||||
- **O que reavaliar:** (a) que o frontmatter de agente aceita `permission.edit` aninhado e que o merge com o global preserva o fail-closed — confirmado nas docs oficiais e a confirmar no `opencode agent list`/smoke; (b) que `docs/plans/*` casa o caminho que o edit tool envia — hipótese fundada no exemplo relativo das docs oficiais, **provada no smoke** (falso-deny é fail-closed: o smoke acusa e o padrão é corrigido antes do merge); (c) que os consumidores do nome antigo ficam intocados (OPS114) e o sufixo do painel é OPS116 — dívida declarada, não corrigida aqui.
|
||||
- **O que reavaliar:** (a) que o frontmatter de agente aceita `permission.edit` aninhado e que o merge com o global preserva o fail-closed — confirmado nas docs oficiais e a confirmar no `opencode agent list`/smoke; (b) que `docs/plans/*-ui-design*` casa o caminho que o edit tool envia — hipótese fundada no exemplo relativo das docs oficiais, **provada no smoke** (falso-deny é fail-closed: o smoke acusa e o padrão é corrigido antes do merge); (c) que os consumidores do nome antigo ficam intocados (OPS114) e o sufixo do painel é OPS116 — dívida declarada, não corrigida aqui.
|
||||
|
||||
## Estado atual verificado (explorador)
|
||||
|
||||
|
|
@ -31,7 +31,7 @@ Appetite restante: ~0,5–1 dia (herdado; doc/config only — sem corte necessá
|
|||
flowchart LR
|
||||
REN["F1 · git mv\ndoutrina do gate"] --> DOC["F1 · ui-design-html.md\nfonte de verdade do port\n+ teto + SVG + ladder"]
|
||||
DOC --> AG["F2 · designer.md (sol, all)\ndesigner-degraded.md (deepseek-v4.1, subagent)"]
|
||||
AG --> PERM["F2 · permission.edit fail-closed\n* deny → docs/plans/* allow"]
|
||||
AG --> PERM["F2 · permission.edit fail-closed\n* deny → docs/plans/*-ui-design* allow"]
|
||||
DOC --> OPS["F3 · docs/AGENT-OPS.md\n1 parágrafo: pin/ladder/tier"]
|
||||
PERM --> EV["F3 · opencode agent list\nsmoke subprocesso: src/ deny + docs/plans/ allow"]
|
||||
OPS --> EV
|
||||
|
|
@ -45,18 +45,18 @@ flowchart LR
|
|||
### Decisões de engenharia (com rejeitadas)
|
||||
|
||||
1. **Forma do gate de escrita dos agentes.**
|
||||
- Opções: A) `"src/**": "deny"` sozinho | B) fail-closed `{"*":"deny","docs/plans/*":"allow"}` (allowlist do único caminho de escrita) | C) sem `permission`, só prompt.
|
||||
- Recomendação: **B** — o corte da intenção é "output só em `docs/plans/<slug>-ui-design.*`"; a allowlist codifica exatamente isso e nega todo o resto (`src/`, `scripts/`, `.github/`, `.agents/`, `.opencode/`, docs fora de plans). Com last-match-wins e catch-all primeiro, o bloco exato no frontmatter dos dois agentes é:
|
||||
- Opções: A) `"src/**": "deny"` sozinho | B) fail-closed `{"*":"deny","docs/plans/*-ui-design*":"allow"}` (allowlist só do artefato: `<slug>-ui-design.html` + `-ui-design-assets/**`) | C) sem `permission`, só prompt.
|
||||
- Recomendação: **B** — o corte da intenção é "output só em `docs/plans/<slug>-ui-design.*`"; a allowlist codifica exatamente isso e nega todo o resto (`src/`, `scripts/`, `.github/`, `.agents/`, `.opencode/`, planos existentes inclusive o de intenção). Com last-match-wins e catch-all primeiro, o bloco exato no frontmatter dos dois agentes é:
|
||||
```yaml
|
||||
permission:
|
||||
edit:
|
||||
'*': deny
|
||||
'docs/plans/*': allow
|
||||
'docs/plans/*-ui-design*': allow
|
||||
```
|
||||
Fatos que sustentam: `edit` cobre `edit`/`write`/`patch`; `*` casa `/`, logo `docs/plans/*` cobre também `docs/plans/<slug>-ui-design-assets/*.svg`; `--auto` não aprova `deny`, portanto o smoke prova stop duro. `read` permanece allow (a crítica lê app/screenshots) — o gate é de escrita.
|
||||
Fatos que sustentam: `edit` cobre `edit`/`write`/`patch`; `*` casa `/`, logo `docs/plans/*-ui-design*` cobre também `docs/plans/<slug>-ui-design-assets/*.svg`; `--auto` não aprova `deny`, portanto o smoke prova stop duro. `read` permanece allow (a crítica lê app/screenshots) — o gate é de escrita. **Revisão pós-simplify:** o padrão foi estreitado de `docs/plans/*` para `docs/plans/*-ui-design*` — o catch-all largo permitiria sobrescrever o plano de intenção (imutável) e planos de outros itens.
|
||||
- Rejeitadas: A — deny-list deixa todos os outros caminhos graváveis e não implementa o corte; C — prompt não é gate: a violação vira silenciosa, contra o aceite "sem permissão de escrita em `src/`".
|
||||
- **Resíduo declarado:** `bash` não é sandbox — a `permission` cobre os file tools (`edit`/`write`/`patch`), não redirecionamento de shell. O prompt proíbe `src/` explicitamente; o fluxo é humano-supervisionado. O smoke prova o gate dos file tools, não prometemos sandbox de shell.
|
||||
- **Como o smoke prova:** subprocesso novo (`opencode run`, config não é hot-reloaded) pedindo (1) `write` em `docs/plans/ops113-smoke.txt` (deve passar) e (2) `write` em `src/ops113-smoke.txt` (deve ser negado, sem contornar por bash). O `designer` roda direto com `--agent designer`; o `designer-degraded` **não** roda como primário (`mode: subagent` — o CLI cai no default), então é lançado via task a partir de um run do `build`. Saída colada no PR; arquivos de smoke removidos antes do commit.
|
||||
- **Como o smoke prova:** subprocesso novo (`opencode run`, config não é hot-reloaded) pedindo (1) `write` em `docs/plans/ops113-ui-design-smoke.html` (deve passar) e (2) `write` em `src/ops113-smoke.txt` (deve ser negado, sem contornar por bash). O `designer` roda direto com `--agent designer`; o `designer-degraded` **não** roda como primário (`mode: subagent` — o CLI cai no default), então é lançado via task a partir de um run do `build`. Saída colada no PR; arquivos de smoke removidos antes do commit.
|
||||
|
||||
2. **Rename da doutrina.**
|
||||
- Opções: A) `git mv` + reescrita no mesmo lote | B) delete + create.
|
||||
|
|
@ -109,7 +109,7 @@ flowchart LR
|
|||
- Prova: `git diff --stat -M` mostra o rename; leitura final da doutrina contra a checklist de teto/elevação.
|
||||
2. **F2 — Agentes** — quota ~25%.
|
||||
- Criar `designer.md` e `designer-degraded.md` com os literais (frontmatter + permission) e prompts enxutos (doutrina como fonte única; visão nativa/fail-closed; `DEGRADED` no degradado).
|
||||
- Prova: `opencode agent list` em processo novo lista `designer (all)` e `designer-degraded (subagent)` e mostra o ruleset `* deny` → `docs/plans/* allow` resolvido.
|
||||
- Prova: `opencode agent list` em processo novo lista `designer (all)` e `designer-degraded (subagent)` e mostra o ruleset `* deny` → `docs/plans/*-ui-design* allow` resolvido.
|
||||
3. **F3 — Operacional + verificação** — quota ~40%.
|
||||
- Parágrafo em `docs/AGENT-OPS.md`; smokes em subprocesso (deny/allow) com limpeza dos arquivos de smoke; grep do nome antigo; prettier; changelog; `pnpm gate:fast`; `pnpm push` → PR `Closes #1056` (base `main`) com `Design tier:` + evidência dos smokes no body.
|
||||
|
||||
|
|
@ -117,8 +117,8 @@ flowchart LR
|
|||
|
||||
- **Pré-requisito (antes do pin):** `opencode models | grep '^openai/'` lista `openai/gpt-5.6-sol` (e `openai/gpt-6-astra`); `opencode-go/deepseek-v4.1-flash` e `deepseek/deepseek-flash` existem — **verificado em 2026-09-15**. Se o id fixado não existir: parar e escalar o humano — nunca pinar adivinhação nem trocar de modelo em silêncio.
|
||||
- `opencode agent list` (processo novo — config não é hot-reloaded) mostra os dois agentes com os modos corretos e o ruleset de escrita fail-closed.
|
||||
- **Smoke de permissão (subprocesso, fresh):** `opencode run --agent designer-degraded --auto "..."` grava `docs/plans/ops113-smoke.txt` (permitido) e tem `write` em `src/ops113-smoke.txt` negado (deny duro, não `ask`); repetir para `designer` (prova de carga + allow). Se o CLI recusar subagente como agente primário, lançar o `designer-degraded` via task a partir de um run do `build`. Saída colada no PR; `rm` dos arquivos de smoke antes do commit — nada de artefato-lixo no diff.
|
||||
- **Grep do nome antigo** (zero nos arquivos da entrega): `grep -rn "ui-draft-html" .agents/skills/plan-issue/ui-design-html.md .opencode/agent/designer.md .opencode/agent/designer-degraded.md docs/AGENT-OPS.md docs/changelog/2026-09-15-ops113.md` → vazio. Consumidores restantes = dívida do OPS114; sufixo do painel = OPS116.
|
||||
- **Smoke de permissão (subprocesso, fresh):** grava `docs/plans/ops113-ui-design-smoke.html` (permitido) e tem `write` em `src/ops113-smoke.txt` negado (deny duro, não `ask`). O `designer` roda com `--agent designer`; o `designer-degraded` (subagente não é primário — o CLI cai no default) é lançado via task a partir de um run do `build`. Saída colada no PR; `rm` dos arquivos de smoke antes do commit — nada de artefato-lixo no diff.
|
||||
- **Grep do nome antigo** (zero nos arquivos da entrega): `grep -rn "ui-draft-html" .agents/skills/plan-issue/ui-design-html.md .opencode/agent/designer.md .opencode/agent/designer-degraded.md docs/AGENT-OPS.md docs/changelog/2026-09-15-ops113.md` → vazio (o próprio `-impl.md` cita o nome antigo como registro do rename e por isso fica fora do grep). Consumidores restantes = dívida do OPS114; sufixo do painel = OPS116.
|
||||
- `pnpm exec prettier --check` nos tocados (`.opencode/` e `docs/` não são ignorados): os dois agentes, `docs/AGENT-OPS.md`, `docs/changelog/2026-09-15-ops113.md` e este `-impl.md`. A doutrina está em `.agents/` (ignorada) — mantê-la formatada por consistência.
|
||||
- `pnpm gate:fast` (lint + typecheck + unit) verde; `pnpm push` (ensure-deps + gate:ci) e PR `Closes #1056` com CI verde. Sem migration; sem mudança em `src/`.
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue