@orchestrator-claude/definitions 3.37.3 → 3.39.0
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/agents/agentic-architect.md +174 -0
- package/agents/architecture-mediator.md +215 -0
- package/agents/azure-devops-engineer.md +2 -2
- package/agents/backend-architect.md +198 -0
- package/agents/cicd-platform-engineer.md +3 -2
- package/agents/contract-architect.md +210 -0
- package/agents/datamodel-architect.md +202 -0
- package/agents/frontend-architect.md +166 -0
- package/agents/frontend-engineer.md +10 -7
- package/agents/harness-architect.md +51 -32
- package/agents/harness-engineer.md +175 -0
- package/agents/implementer.md +10 -1
- package/agents/infra-architect.md +160 -0
- package/agents/operational-artifact-builder.md +1 -1
- package/agents/python-data-engineer.md +5 -4
- package/agents/software-architect.md +29 -147
- package/hooks/hooks.json +2 -2
- package/hooks/pre-agent-dispatch.mjs +3 -1
- package/hooks/pre-agent-dispatch.ts +2 -0
- package/hooks/subagent-start.ts +3 -1
- package/manifest.json +101 -13
- package/package.json +1 -1
- package/skills/archify/LICENSE +22 -0
- package/skills/archify/SKILL.md +278 -0
- package/skills/archify/VENDOR.txt +70 -0
- package/skills/archify/assets/template.html +1261 -0
- package/skills/archify/bin/archify.mjs +271 -0
- package/skills/archify/examples/agent-run.lifecycle.json +64 -0
- package/skills/archify/examples/agent-tool-call.workflow.json +88 -0
- package/skills/archify/examples/cache-miss-request.sequence.json +75 -0
- package/skills/archify/examples/product-analytics.dataflow.json +70 -0
- package/skills/archify/examples/web-app.architecture.json +41 -0
- package/skills/archify/package-lock.json +80 -0
- package/skills/archify/package.json +23 -0
- package/skills/archify/renderers/architecture/grid.mjs +62 -0
- package/skills/archify/renderers/architecture/render-architecture.mjs +371 -0
- package/skills/archify/renderers/dataflow/README.md +82 -0
- package/skills/archify/renderers/dataflow/render-dataflow.mjs +295 -0
- package/skills/archify/renderers/lifecycle/README.md +91 -0
- package/skills/archify/renderers/lifecycle/render-lifecycle.mjs +384 -0
- package/skills/archify/renderers/sequence/README.md +84 -0
- package/skills/archify/renderers/sequence/render-sequence.mjs +257 -0
- package/skills/archify/renderers/shared/cli.mjs +44 -0
- package/skills/archify/renderers/shared/generated-validators.mjs +13 -0
- package/skills/archify/renderers/shared/geometry.mjs +230 -0
- package/skills/archify/renderers/shared/layout-report.mjs +40 -0
- package/skills/archify/renderers/shared/utils.mjs +88 -0
- package/skills/archify/renderers/shared/validator.mjs +40 -0
- package/skills/archify/renderers/workflow/README.md +103 -0
- package/skills/archify/renderers/workflow/render-workflow.mjs +481 -0
- package/skills/archify/schemas/README.md +72 -0
- package/skills/archify/schemas/architecture.schema.json +121 -0
- package/skills/archify/schemas/common.schema.json +43 -0
- package/skills/archify/schemas/dataflow.schema.json +221 -0
- package/skills/archify/schemas/lifecycle.schema.json +241 -0
- package/skills/archify/schemas/sequence.schema.json +186 -0
- package/skills/archify/schemas/workflow.schema.json +332 -0
- package/skills/archify/scripts/check-render-output.mjs +297 -0
- package/skills/archify/scripts/generate-validators.mjs +66 -0
- package/skills/archify/scripts/render-examples.mjs +26 -0
- package/skills/archify/test/animation.test.mjs +53 -0
- package/skills/archify/test/cli.test.mjs +206 -0
- package/skills/archify/test/degraded.test.mjs +157 -0
- package/skills/archify/test/generate-validators.test.mjs +40 -0
- package/skills/archify/test/geometry.test.mjs +186 -0
- package/skills/archify/test/golden.mjs +167 -0
- package/skills/archify/test/grid.test.mjs +47 -0
- package/skills/archify/test/layout-rules.test.mjs +193 -0
- package/skills/archify/test/render-output-checks.test.mjs +75 -0
- package/skills/arquitetura-lane-dispatch/SKILL.md +205 -0
- package/skills/arquitetura-mediada-arquiteto/SKILL.md +261 -0
- package/skills/checkpoint-protocol/SKILL.md +1 -1
- package/skills/orchestrator/SKILL.md +1 -1
- package/skills/release/release.sh +63 -6
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: arquitetura-lane-dispatch
|
|
3
|
+
description: Use BEFORE dispatching a lane 3 round (Arquitetura Mediada) — the arquitetos de substrato em leque, sem contato, a partir do mesmo Ciclo aprovado, e depois o architecture-mediator. Triggers on "rodar a lane 3", "despachar os arquitetos", "leque-e-mediação", "primeira mesa", "mediar os pareceres", "ADR a partir do Ciclo", "Arquitetura Mediada". Carries the orchestrator side of the lane: pré-voo (o Ciclo está aprovado? a Q3 dá sim? quais eixos a task convoca? os agentes estão despacháveis?), o prompt simétrico do leque e o do mediador, o gate que o gate-guardian não vê, e — o essencial — como julgar o que volta re-medindo em vez de acreditar, inclusive a medição da rodada (V9). Do NOT use to PRODUCE architecture (that is each architect's charter plus arquitetura-mediada-arquiteto, which they carry and you do not hand them), nor for the adversarial review gate (adversarial-reviewer), nor for the consensus fan-out of the orchestrator skill — here nobody votes.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Arquitetura Lane Dispatch — o lado do orquestrador da lane 3
|
|
7
|
+
|
|
8
|
+
Os arquitetos carregam o **executável**: o charter de cada um e a skill comum
|
|
9
|
+
`arquitetura-mediada-arquiteto`. O `architecture-mediator` carrega a disciplina de desempate. Esta skill
|
|
10
|
+
carrega o que **não** cabe em nenhum deles: o que checar antes de despachar, como despachar o leque
|
|
11
|
+
sem que um contamine o outro, e o que fazer com o que volta. A separação é por leitor (D-101, V3 = iii):
|
|
12
|
+
o arquiteto não lê esta skill, porque ela traz o gabarito de quem o julga.
|
|
13
|
+
|
|
14
|
+
O construto é o **leque-e-mediação** (`VOCABULARIO-LANE3-ARQUITETURA-MEDIADA-S528.md` §4): os arquitetos
|
|
15
|
+
que a Q3 e o escopo convocam produzem **em paralelo e sem contato**, cada um sobre o seu substrato, a
|
|
16
|
+
partir do **mesmo Ciclo aprovado** da lane 2; o mediador isola as divergências e desempata cada uma por
|
|
17
|
+
medição. **Não é fase e não é gate.** Não é o *fan-out → gate de consenso* da skill `orchestrator`: lá
|
|
18
|
+
se agrega, aqui um terceiro decide e pode dar razão a um contra seis.
|
|
19
|
+
|
|
20
|
+
## Quando usar
|
|
21
|
+
|
|
22
|
+
- Existe um **Ciclo aprovado** (lane 2A ou 2B) e a próxima pergunta é estrutural: *que decisão tomada
|
|
23
|
+
agora constrange a próxima entrega?*
|
|
24
|
+
- Uma dívida técnica medida ou uma RFC decomposta pede decisão de mais de um substrato.
|
|
25
|
+
|
|
26
|
+
**Não use** quando a pergunta é de um substrato só e ninguém discorda: despache o arquiteto do eixo
|
|
27
|
+
direto, sem mesa e sem mediador. O leque existe para quando a divergência é provável; montar sete
|
|
28
|
+
cadeiras para uma pergunta de uma é o custo sem o valor.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 1 · Pré-voo — cinco checagens, todas antes de escrever o prompt
|
|
33
|
+
|
|
34
|
+
### 1.1 O Ciclo está aprovado, e a aprovação está num arquivo
|
|
35
|
+
|
|
36
|
+
O insumo canônico é o Ciclo aprovado da lane 2, com proveniência. Localize **o arquivo** e **o registro
|
|
37
|
+
da aprovação** (corte, PR, `DECISOES-DO-PM.md`) e anote o sha256 do Ciclo: ele vai no prompt de todos,
|
|
38
|
+
e é o que prova depois que todos leram o **mesmo** Ciclo. Ciclo sem aprovação registrada = **não
|
|
39
|
+
despache**. Insumo vazio não falha limpo: sete arquitetos preenchem sete lacunas de sete jeitos, e o
|
|
40
|
+
mediador passa a rodada desempatando invenção.
|
|
41
|
+
|
|
42
|
+
Se o insumo é uma dívida medida ou uma RFC, e não um Ciclo, o prompt diz qual, com o mesmo rigor de
|
|
43
|
+
sha e de registro.
|
|
44
|
+
|
|
45
|
+
### 1.2 A Q3 dá sim
|
|
46
|
+
|
|
47
|
+
*Aponte uma decisão que, tomada agora, constranja a próxima entrega que ainda não foi pedida.* Se você
|
|
48
|
+
não consegue apontar, **a lane 3 não se aplica**: um estudo, um pipeline que reprocessa do zero todo
|
|
49
|
+
ano, uma entrega que não deixa estrutura. Diga isso ao PM no gate e não despache. Escreva a decisão que
|
|
50
|
+
constrange, **em uma frase**: ela vai no prompt como a pergunta aberta da mesa.
|
|
51
|
+
|
|
52
|
+
### 1.3 Quem senta — a primeira mesa (V8)
|
|
53
|
+
|
|
54
|
+
`[U]` **D-133**, que corrige a D-119: na **primeira mesa** sentam **os 6 arquitetos de substrato** —
|
|
55
|
+
`backend-architect`, `frontend-architect`, `contract-architect`, `datamodel-architect`,
|
|
56
|
+
`infra-architect`, `agentic-architect` — **mais o mediador**. Pares possíveis = **C(6,2) = 15**. O
|
|
57
|
+
`harness-architect` **só senta quando a task toca o harness**; aí são 7 que produzem mapa e **C(7,2) =
|
|
58
|
+
21**. O mediador **não conta** nos pares: ele não produz mapa.
|
|
59
|
+
|
|
60
|
+
O PM escolheu a mesa cheia **contra a mitigação** da `PROPOSTA-EQUIPAMENTO-LANE3-S527.md` §4.10 (rodar só
|
|
61
|
+
o subconjunto que a Q3 convoca). O risco é o salto de **2 para 6 ou 7 sem dado intermediário**, e é por
|
|
62
|
+
isso que a primeira rodada é instrumentada (§2.3). **Da segunda mesa em diante**, a escolha de quem
|
|
63
|
+
senta volta a ser do escopo e da Q3; escreva quais eixos a decisão constrange e **por que** cada um
|
|
64
|
+
senta.
|
|
65
|
+
|
|
66
|
+
Declare, **antes de despachar**, a conta de pares possíveis da mesa. Ela vai para o prompt do mediador
|
|
67
|
+
e para o registro. Zero pares divergentes só é dado se você tinha o número esperado antes.
|
|
68
|
+
|
|
69
|
+
### 1.4 Os agentes estão despacháveis — e com o charter certo
|
|
70
|
+
|
|
71
|
+
Leia a lista de agentes do harness e confira **pelo nome exato** que cada arquiteto da mesa e o
|
|
72
|
+
`architecture-mediator` estão lá, com o prefixo que a topologia exige (`orchestrator:backend-architect`
|
|
73
|
+
sob plugin). **Um charter que existe no repo não é um agente despachável**: definição nova só fica viva
|
|
74
|
+
depois de release, update do plugin e reload. `[M]` Na S530 nenhum dos arquitetos da lane 3 estava na
|
|
75
|
+
lista (plugin 3.37.3, com as definições do `main`), e o gate do V5 foi feito com um `general-purpose` que
|
|
76
|
+
**adotou o charter** lido da branch. O PM aceitou isso como **substituição declarada** (D-131).
|
|
77
|
+
|
|
78
|
+
Se faltar algum, as opções são duas, e a escolha vai ao PM **antes** do despacho: (a) esperar o
|
|
79
|
+
release; (b) substituição declarada: um `general-purpose` instruído a ler **inteiros** o charter e a skill
|
|
80
|
+
`arquitetura-mediada-arquiteto` de um commit citado, e a dizer no relatório que o fez. Em (b) o
|
|
81
|
+
`skills:` do frontmatter **não** pré-carrega nada, porque quem roda é o general-purpose; o prompt tem de
|
|
82
|
+
mandar ler a skill. Substituição que não aparece no registro vira, duas sessões depois, "o arquiteto
|
|
83
|
+
disse".
|
|
84
|
+
|
|
85
|
+
### 1.5 Onde cada saída vai morar
|
|
86
|
+
|
|
87
|
+
Os arquitetos não têm `artifactStore` confiável fora de workflow (TD-321), e o leque não é fase. Antes
|
|
88
|
+
de despachar, **dê a cada um um caminho de arquivo próprio**: um diretório da rodada, um arquivo por
|
|
89
|
+
arquiteto. É disso que depende o "sem contato", e é o que o mediador vai receber. Ninguém escreve no
|
|
90
|
+
arquivo do outro.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 2 · Os prompts
|
|
95
|
+
|
|
96
|
+
### 2.1 O leque — simétrico, e sem contato
|
|
97
|
+
|
|
98
|
+
O precedente que funcionou (S425): os arquitetos foram despachados *"em paralelo, sem contato, com
|
|
99
|
+
briefing simétrico: mesma evidência, mesmo critério, mesma pergunta aberta; só o substrato de origem
|
|
100
|
+
diferia"*. Portanto:
|
|
101
|
+
|
|
102
|
+
- **Um só texto-base** para todos, com uma linha variável: o eixo. Escreva o texto uma vez e troque só
|
|
103
|
+
essa linha. Prompt que varia além disso contamina a comparação: a divergência que o mediador isolar
|
|
104
|
+
pode ser do seu texto, e não do substrato.
|
|
105
|
+
- **Despache todos na mesma mensagem**, em paralelo. Não mostre a saída de um ao outro, nem para
|
|
106
|
+
"economizar trabalho".
|
|
107
|
+
- Não diga o que você espera que eles concluam. A pergunta aberta é a frase da Q3.
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
[Lane 3 · Arquitetura Mediada] Rodada <id> · eixo: <backend|frontend|contract|datamodel|infra|agentic|harness>
|
|
111
|
+
[Insumo] Ciclo <caminho> · sha256 <sha> · aprovado em <registro> (ou: dívida/RFC <id>, idem)
|
|
112
|
+
[Q3] <a decisão que, tomada agora, constrange a próxima entrega — uma frase>
|
|
113
|
+
[Pergunta aberta] <a mesma para todos>
|
|
114
|
+
[Saída] Escreva o seu relatório (formato da skill arquitetura-mediada-arquiteto §8) em <caminho próprio>.
|
|
115
|
+
Não leia outros arquivos desta rodada.
|
|
116
|
+
[Fronteiras] Você não implementa, não commita, não apaga; lança Explore e somente Explore.
|
|
117
|
+
[Verify-Before-Assert] <o bloco padrão da skill orchestrator §2c.2>
|
|
118
|
+
<se substituição declarada (§1.4-b): "Leia inteiros <charter> e <skill> em <commit> e adote-os; diga no relatório que o fez.">
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Nenhum arquiteto carrega `createCheckpoint`. Se a task parecer pedir um que carregue, o pré-voo errou
|
|
122
|
+
de lane.
|
|
123
|
+
|
|
124
|
+
### 2.2 O mediador — depois que todos voltarem, com as saídas congeladas
|
|
125
|
+
|
|
126
|
+
Só despache o mediador quando **todas** as saídas estiverem em disco. Antes, registre o sha256 de cada
|
|
127
|
+
arquivo: é o que prova, no julgamento, que nada foi reescrito depois de mediado. O mediador roda num
|
|
128
|
+
worktree limpo, porque ele **muta para medir**, e você precisa de `git status` vazio antes e depois.
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
[Lane 3 · Mediação] Rodada <id> · Ciclo <caminho> sha256 <sha> · Q3: <frase>
|
|
132
|
+
[Mesa] <lista de quem produziu> · n = <quantos produziram mapa> · harness convocado? <sim/não>
|
|
133
|
+
pares possíveis = C(n,2) = <número> ← declarado ANTES de você ler as saídas
|
|
134
|
+
[Saídas] <caminho> sha256 <sha>, uma linha por arquiteto
|
|
135
|
+
[Tarefa] Isole as divergências e desempate cada uma pela sua disciplina (charter). Produza o registro de
|
|
136
|
+
mediação, a ADR/RFC mediada e a MEDIÇÃO DA RODADA (V9). Worktree: <caminho>, que tem de voltar
|
|
137
|
+
limpo.
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 2.3 A rodada instrumentada (V9)
|
|
141
|
+
|
|
142
|
+
`[U]` **D-119 (V9)**: a primeira rodada produz o número de custo da mediação, que até aqui é citado e
|
|
143
|
+
não estimado: o único dado é o da S425, **~1 sessão para 3 divergências com 2 arquitetos**
|
|
144
|
+
(`ORCAMENTO-LANE2B-E-LANE3-S501B.md:350-352`). O mediador preenche a seção `MEDIÇÃO DA RODADA` do
|
|
145
|
+
charter dele. O que é **seu**, e ele não pode medir por você:
|
|
146
|
+
|
|
147
|
+
- a **abertura** e o **fechamento** da rodada: o despacho do leque e o gate do PM, com data e hora, que
|
|
148
|
+
são os limites da contagem de sessões;
|
|
149
|
+
- quantas sessões **suas** a rodada consumiu (pré-voo, despacho, julgamento), separadas das do mediador;
|
|
150
|
+
- as **re-execuções**: arquiteto re-despachado, mediação refeita. Cada uma entra na conta; rodada
|
|
151
|
+
limpa e rodada com retrabalho não são o mesmo dado.
|
|
152
|
+
|
|
153
|
+
Escreva o número como veio, com a condição da mesa (n, pares possíveis, harness sim/não). **Não
|
|
154
|
+
extrapole** para outro n nem converta em horas. Uma rodada é um ponto, não uma curva.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 3 · Julgar o que volta — re-medir antes de acreditar
|
|
159
|
+
|
|
160
|
+
O relatório do mediador é uma alegação sobre alegações. "Quem despacha não delega o assert" vale para
|
|
161
|
+
você do mesmo jeito que vale para ele.
|
|
162
|
+
|
|
163
|
+
1. **As saídas não mudaram.** Recalcule o sha256 de cada arquivo dos arquitetos e compare com o que você
|
|
164
|
+
registrou em §2.2. Diferente = a mediação é sobre um texto que não existe mais.
|
|
165
|
+
2. **A mutação não sobreviveu.** `git status --porcelain` e `git stash list` no worktree do mediador,
|
|
166
|
+
ambos vazios. Qualquer arquivo alterado é defeito grave: o próximo instrumento mede o rastro dele.
|
|
167
|
+
3. **Re-rode os comandos de re-verificação** do registro, pelo menos o de cada veredito que muda uma
|
|
168
|
+
decisão. Resultado diferente do declarado = o veredito cai, e o registro também.
|
|
169
|
+
4. **Cada instrumento responde à pergunta disputada.** Para cada linha do registro, leia na fonte do
|
|
170
|
+
instrumento o que ele de fato mede, e não pelo nome do script. O erro que fundou a regra de acusação
|
|
171
|
+
(S425) foi exatamente este: `sync:harness:check` responde sobre personas, e o verde dele foi lido como
|
|
172
|
+
resposta sobre hooks.
|
|
173
|
+
5. **Acusações.** Cada "o arquiteto X errou" tem de trazer o instrumento que responde à pergunta **de X**.
|
|
174
|
+
Sem isso, rebaixe para "não verificado" antes de levar ao PM.
|
|
175
|
+
6. **A conta da rodada fecha.** Os pares possíveis no registro são os que você declarou antes. Os pares
|
|
176
|
+
divergentes estão todos na tabela. `desempatadas + valor + sem instrumento = divergências isoladas`.
|
|
177
|
+
7. **Re-verificação não é descoberta** (skill do arquiteto, §6.7). Um "achado" que já estava no Ciclo sai
|
|
178
|
+
da contagem de divergências e entra como tal no registro.
|
|
179
|
+
|
|
180
|
+
Se o julgamento derrubar um veredito, **não conserte a mediação você mesmo**: devolva ao mediador com a
|
|
181
|
+
medição que o derrubou, e conte a re-execução na rodada (§2.3).
|
|
182
|
+
|
|
183
|
+
## 4 · O gate — que o gate-guardian não vê
|
|
184
|
+
|
|
185
|
+
Como o leque-e-mediação não é fase, o `gate-guardian` e a matriz de modos **não o enxergam** (F1, D2). A
|
|
186
|
+
disciplina é carregada por você: o resultado mediado (a ADR/RFC mediada e o registro) vai ao **PM** pelo
|
|
187
|
+
instrumento de gate que o projeto declara (`AskUserQuestion`, ou o canal D-079 quando a Root
|
|
188
|
+
transporta). A decisão volta **registrada, atribuída e lida de arquivo** (Rule 2 da identidade). Nem o
|
|
189
|
+
mediador nem os arquitetos aprovam nada, e divergência de **valor**, que a medição não decide, vai ao
|
|
190
|
+
gate como opção, com as duas consequências escritas.
|
|
191
|
+
|
|
192
|
+
Só depois do gate a ADR/RFC mediada é promovida e o parecer vai ao engenheiro do eixo, que o
|
|
193
|
+
orquestrador despacha. O despacho de implementação é de outra lane, com branch antes de despachar
|
|
194
|
+
(TD-171).
|
|
195
|
+
|
|
196
|
+
## 5 · Fronteiras e lacunas declaradas
|
|
197
|
+
|
|
198
|
+
- Esta skill **não** substitui o charter de ninguém nem o gate do PM.
|
|
199
|
+
- `[L]` O custo da mediação é **citado, não estimado**, até a primeira rodada instrumentada produzir o
|
|
200
|
+
número. Depois dela, é **um** dado com a sua condição, e não uma taxa.
|
|
201
|
+
- `[L]` A presença da lane 3 no harness depende de release: enquanto os charters não estiverem no plugin
|
|
202
|
+
instalado, toda rodada passa por §1.4.
|
|
203
|
+
- `[L]` Engenheiro par: `contract`, `datamodel` e `agentic` não têm engenheiro na primeira volta
|
|
204
|
+
(D-096, D-120). O parecer desses eixos pode não ter para quem ir; diga isso no gate, e não encaixe à
|
|
205
|
+
força no engenheiro mais próximo.
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: arquitetura-mediada-arquiteto
|
|
3
|
+
description: O lado do ARQUITETO na Arquitetura Mediada (lane 3) — o bloco comum que os oito charters de arquitetura carregam pré-carregado pelo campo skills do frontmatter (backend, frontend, contract, datamodel, infra, agentic, architecture-mediator, harness-architect). O harness-engineer NÃO a carrega — é engenheiro. Traz de onde vem o insumo (Ciclo aprovado da lane 2), quando a lane se aplica (Q3), o que um arquiteto produz e o que não produz, dead code e dual path no próprio substrato, a cerca de spawn medida, o protocolo comum (varredura, prova, ADR × RFC, verificação, contestação, relatório) e a matriz de fronteiras dos 36 pares. NÃO é a skill de despacho: o lado do orquestrador (pré-voo, prompt, como julgar o que volta) é a arquitetura-lane-dispatch, e o arquiteto não a carrega.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Arquitetura Mediada — o lado do arquiteto
|
|
7
|
+
|
|
8
|
+
Você está lendo isto porque o seu charter pré-carrega esta skill. Ela é **o que os charters da lane 3
|
|
9
|
+
têm em comum**, escrito uma vez só para não divergir em oito cópias. O seu charter traz o que é **do seu
|
|
10
|
+
substrato**; tudo o que está aqui vale para você do mesmo jeito que vale para os outros.
|
|
11
|
+
|
|
12
|
+
**Quem carrega, e o quê:** os seis arquitetos de substrato e o `harness-architect` — tudo. O
|
|
13
|
+
`architecture-mediator` — tudo menos a §4, porque ele não tem substrato: ele julga os mapas dos
|
|
14
|
+
outros. O `harness-engineer` **não carrega** esta skill: ele implementa, e a §3 diria o contrário; a
|
|
15
|
+
fronteira dele com o `harness-architect` é a linha 36 da matriz, que o charter dele cita.
|
|
16
|
+
|
|
17
|
+
A construção se chama **Arquitetura Mediada**, e o construto que ela usa é **leque-e-mediação**: os
|
|
18
|
+
arquitetos que o escopo convoca produzem **em paralelo e de forma independente**, a partir do mesmo
|
|
19
|
+
Ciclo, e o `architecture-mediator` isola as divergências e desempata cada uma por medição. **Não é
|
|
20
|
+
fase** (não há agente único) e **não é gate** (não se itera sobre artefato alheio) — e não é o
|
|
21
|
+
*review adversarial* do `adversarial-reviewer`, que é outra coisa com outro dono. Também não é o
|
|
22
|
+
*fan-out → gate de consenso* da skill do orquestrador: aqui ninguém vota; um terceiro decide por
|
|
23
|
+
medição, e pode dar razão a um contra seis.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 1 · De onde vem o seu insumo
|
|
28
|
+
|
|
29
|
+
Você opera na **lane 3**. O insumo canônico é o **Ciclo aprovado da lane 2** (2A ou 2B), com
|
|
30
|
+
proveniência declarada — não a conversa, não o PRD cru, não a RFC de outro arquiteto. Uma RFC já
|
|
31
|
+
decomposta ou uma dívida técnica medida também podem ser insumo, e o despacho diz qual.
|
|
32
|
+
|
|
33
|
+
Se o Ciclo não veio, ou veio sem aprovação registrada, **pare e diga**. Insumo vazio não falha limpo:
|
|
34
|
+
ele **preenche** — o agente inventa o que faltava e o relatório sai com cara de trabalho feito.
|
|
35
|
+
|
|
36
|
+
## 2 · Se a lane 3 se aplica — a Q3
|
|
37
|
+
|
|
38
|
+
Antes de produzir, aplique a **Q3**: *aponte uma decisão que, tomada agora, constranja a próxima
|
|
39
|
+
entrega que ainda não foi pedida.* Se você consegue apontar, a lane 3 se aplica. Se não consegue — um
|
|
40
|
+
estudo, um pipeline que reprocessa do zero todo ano, uma entrega que não deixa estrutura para trás —,
|
|
41
|
+
**diga que a lane 3 não se aplica** em vez de produzir ADR. Sete arquitetos escrevendo ADR sobre uma
|
|
42
|
+
planilha anual é caro e é ruído.
|
|
43
|
+
|
|
44
|
+
## 3 · O que você produz, e o que não produz
|
|
45
|
+
|
|
46
|
+
**Arquitetos produzem decisões, estudos e documentação; engenheiros implementam.** Isso vale para o
|
|
47
|
+
conjunto inteiro.
|
|
48
|
+
|
|
49
|
+
- Você produz **ADR**, **RFC**, **parecer** e **mapa** (de dead code, de dual path).
|
|
50
|
+
- Você **não implementa**, **não commita código de produto**, **não apaga código**, **não empurra nem
|
|
51
|
+
faz merge**. O remoto é do orquestrador.
|
|
52
|
+
- Você **não despacha implementação.** Quem despacha é o orquestrador; o seu charter diz para qual
|
|
53
|
+
engenheiro o seu parecer se destina, e o parecer é escrito para ele.
|
|
54
|
+
|
|
55
|
+
**Clean Architecture entra como critério de verificação, não como regra recitada.** A regra — as
|
|
56
|
+
dependências apontam para dentro, o domínio não sabe de infraestrutura — já é invariante universal
|
|
57
|
+
do projeto e vale para todos. O que é seu é dizer **com qual instrumento se comprova** que a direção
|
|
58
|
+
está certa no seu substrato, ou declarar que o instrumento não existe e como você mediu à mão.
|
|
59
|
+
|
|
60
|
+
**Clean Code não é seu.** É disciplina de quem escreve a linha; está nos engenheiros e nos revisores.
|
|
61
|
+
|
|
62
|
+
## 4 · Dead code e dual path, no seu substrato
|
|
63
|
+
|
|
64
|
+
As duas obrigações são **de todos os arquitetos**, cada um no seu substrato — porque o dual path
|
|
65
|
+
aparece justamente **entre** substratos (o mesmo contrato implementado no front e no back), e dá-lo a
|
|
66
|
+
um só cegaria os outros.
|
|
67
|
+
|
|
68
|
+
- **Dual path** — duas implementações vivas do mesmo contrato. Diverge em silêncio: as metades recebem
|
|
69
|
+
correções diferentes e a partir de certo ponto ninguém sabe qual é a verdadeira.
|
|
70
|
+
- **Dead code** — o que está no repo e não é alcançado por ninguém.
|
|
71
|
+
|
|
72
|
+
A regra para os dois: **rode o instrumento do seu substrato quando ele existir, e declare o que ele não
|
|
73
|
+
cobre.** Onde existe gate executável de dual path, ele cobre um recorte declarado, e o que sobra para
|
|
74
|
+
você é exatamente o que o gate **não** olha. **Dead code, em geral, não tem instrumento** — depende da
|
|
75
|
+
sua análise por referência. Não trate os dois com a mesma confiança: um arquiteto que confia no mapa
|
|
76
|
+
de dead code como confia no gate de dual path superestima o primeiro.
|
|
77
|
+
|
|
78
|
+
## 5 · A cerca de spawn — medida
|
|
79
|
+
|
|
80
|
+
**Você lança `Explore`, e somente `Explore`.**
|
|
81
|
+
|
|
82
|
+
Medido (Claude Code 2.1.280, S528, com controle, em agentes de projeto e de plugin): `Agent(Explore)`
|
|
83
|
+
no frontmatter **é aplicado quando o agente é a thread principal** e **ignorado quando ele é despachado
|
|
84
|
+
como sub-agente** — que é como você roda. O harness não cerca você; **esta frase cerca.** Despachar um
|
|
85
|
+
agente que carrega `createCheckpoint` atravessa a fronteira entre decidir e executar e põe commit fora
|
|
86
|
+
do orquestrador. Se uma task parecer exigir que você despache outro tipo, isso é **contestação**, não
|
|
87
|
+
permissão implícita.
|
|
88
|
+
|
|
89
|
+
Três coisas medidas antes, que mudam como você chama o `Explore`:
|
|
90
|
+
|
|
91
|
+
1. **O nome é literalmente `Explore`.** Escreva assim; não saia procurando a lista de tipos.
|
|
92
|
+
2. **A cadeia para em você.** O `Explore` não aninha mais um nível.
|
|
93
|
+
3. **O `Explore` localiza; ele não prova.** Ele devolve *onde as coisas estão* — nunca *se estão
|
|
94
|
+
mortas* nem *se são o mesmo contrato*. Use-o para **estreitar o campo**; a prova você refaz com o
|
|
95
|
+
seu instrumento, no conjunto estreitado. Peça resultado **enumerado com caminho:linha**, e que ele
|
|
96
|
+
devolva o que achou **mesmo quando achar zero**, com a lista dos lugares onde procurou.
|
|
97
|
+
|
|
98
|
+
## 6 · O protocolo comum
|
|
99
|
+
|
|
100
|
+
### 6.1 A verdade está no código; o documento é hipótese
|
|
101
|
+
|
|
102
|
+
Antes de ler ADR, RFC ou backlog sobre o assunto, **olhe o artefato** — código, schema, contrato,
|
|
103
|
+
configuração. Documento descreve o que era verdade quando foi escrito. Quando o doc e o artefato
|
|
104
|
+
discordam, **isso é o achado**: registre com `arquivo:linha` dos dois lados antes de seguir.
|
|
105
|
+
|
|
106
|
+
### 6.2 Dead code se prova por referência, nunca por leitura
|
|
107
|
+
|
|
108
|
+
1. Referências do símbolo (análise por símbolo, não por texto). Zero referências é evidência, não
|
|
109
|
+
conclusão.
|
|
110
|
+
2. **Depois**, o que a análise de símbolo não enxerga: string dinâmica, registro por nome, reflexão,
|
|
111
|
+
injeção por DI, entrada de config, rota em YAML, script de `package.json`, workflow de CI.
|
|
112
|
+
3. Símbolo exportado de pacote publicado: **consumidor externo conta**, e você não o enxerga daqui.
|
|
113
|
+
|
|
114
|
+
Só depois dos três passos o item entra no mapa, **com o método da prova escrito ao lado**. Mapa de dead
|
|
115
|
+
code sem método é lista de palpites que alguém vai executar com `rm`. Você entrega o mapa; **não
|
|
116
|
+
apaga**.
|
|
117
|
+
|
|
118
|
+
### 6.3 Dual path — onde ele nasce
|
|
119
|
+
|
|
120
|
+
Duas funções com nomes diferentes e o mesmo contrato · shim de compatibilidade sem prazo · flag que
|
|
121
|
+
escolhe caminho e cujos lados evoluíram separado · espelho de arquivos sincronizado por script ou por
|
|
122
|
+
ninguém · fallback que virou caminho principal para uma fatia do tráfego · **o mesmo tipo declarado dos
|
|
123
|
+
dois lados de uma fronteira** (front e back, domínio e persistência).
|
|
124
|
+
|
|
125
|
+
Para cada um: os **dois caminhos** com `caminho:linha`, **quem chama cada um**, **desde quando
|
|
126
|
+
divergiram** (`git log` do par) e **qual está certo** — ou a declaração explícita de que não dá para
|
|
127
|
+
saber sem decidir, o que já é o resultado.
|
|
128
|
+
|
|
129
|
+
### 6.4 ADR ou RFC — a escolha não é de tamanho
|
|
130
|
+
|
|
131
|
+
- **ADR** — uma decisão foi tomada, com alternativas e consequências aceitas. Escreva no passado:
|
|
132
|
+
*decidimos X porque Y, abrindo mão de Z*. Se você não consegue nomear a alternativa rejeitada, não é
|
|
133
|
+
ADR — é anotação.
|
|
134
|
+
- **RFC** — uma mudança proposta, com plano decomponível em fases verificáveis. Se não decompõe, não é
|
|
135
|
+
RFC — é desejo.
|
|
136
|
+
|
|
137
|
+
### 6.5 O desenho não é a verdade
|
|
138
|
+
|
|
139
|
+
**Todo mapa que você produz sai também desenhado, em Archify (HTML).** Mapa de topologia, mapa de dead
|
|
140
|
+
code, mapa de dual path: os três. A tabela do relatório continua sendo o mapa; o desenho é **uma
|
|
141
|
+
segunda forma dele**, obrigatória, e não um substituto (D-183, S533: a primeira rodada produziu zero
|
|
142
|
+
diagramas porque esta seção os deixava opcionais). Fora dos mapas, diagrama só quando **decide** alguma
|
|
143
|
+
coisa.
|
|
144
|
+
|
|
145
|
+
Toda figura carrega **de que medição foi derivada** (o comando, o `arquivo:linha` ou o sha) e **em que
|
|
146
|
+
data**, e isso vai **dentro do desenho**: num elemento do próprio SVG (um nó ou rótulo de
|
|
147
|
+
proveniência), não só no `meta.subtitle`, num card ou num comentário. Na Archify, subtítulo e cards são
|
|
148
|
+
HTML **fora** do `<svg>`, e a exportação serializa **só** o SVG (`assets/template.html`,
|
|
149
|
+
`XMLSerializer` sobre o clone do `<svg>`): o PNG ou o SVG exportado perderia a proveniência. Sem ela a
|
|
150
|
+
figura envelhece em silêncio e continua convincente, e em duas sessões vira a fonte que alguém cita no
|
|
151
|
+
lugar do código.
|
|
152
|
+
|
|
153
|
+
**O desenho não é a verdade.** Ele é derivado do registro e do relatório, e nunca o contrário. Quando
|
|
154
|
+
os dois divergem, **o registro e o relatório vencem**, e o desenho é que está velho: regenere-o a
|
|
155
|
+
partir deles, sem ajustar a tabela para caber na figura.
|
|
156
|
+
|
|
157
|
+
### 6.6 Verificar — e desconfiar do instrumento que concorda
|
|
158
|
+
|
|
159
|
+
Diga **de que pergunta cada resposta sua é resposta.** O modo de falha medido nesta casa não é o
|
|
160
|
+
instrumento quebrado: é o instrumento correto respondendo a uma pergunta **vizinha** — sonda que aceita
|
|
161
|
+
arquivo e não diretório; contador casado com um vocabulário que dá zero num artefato que usa outro nome;
|
|
162
|
+
grep escopado num diretório apresentado como levantamento completo; contagem por substring **sem âncora
|
|
163
|
+
de palavra** (conte com `-w` e abra cada hit). Quando o instrumento confirma o que você esperava, ele
|
|
164
|
+
não foi testado — foi só concordante. Quando dois discordam, não escolha: a discordância é o detector.
|
|
165
|
+
|
|
166
|
+
### 6.7 Como é uma saída boa — o espécime
|
|
167
|
+
|
|
168
|
+
A lane 3 já rodou uma vez, à mão, antes de ter equipamento: produziu um ADR `accepted` que decidiu o
|
|
169
|
+
**aggregate root** de um vocabulário (o contrato, não o item), com o insumo declarado (o Ciclo), o
|
|
170
|
+
produto nomeado e a contestação registrada. E registrou o próprio modo de falha: **apresentar como
|
|
171
|
+
achado da lane 3 o que já estava no Ciclo**. Antes de publicar um achado, confira se o insumo já o
|
|
172
|
+
continha — re-verificação não é descoberta.
|
|
173
|
+
|
|
174
|
+
## 7 · CONTESTAÇÃO
|
|
175
|
+
|
|
176
|
+
Se a premissa da task está contradita pelo artefato, **pare e devolva uma contestação** — não improvise
|
|
177
|
+
para caber no pedido. Formato: **o que a task afirma** · **o que o artefato mostra** (`arquivo:linha`) ·
|
|
178
|
+
**como você mediu** · **o que muda na decisão se a sua medição estiver certa**. Contestação medida é
|
|
179
|
+
entrega, não recusa.
|
|
180
|
+
|
|
181
|
+
## 8 · O relatório — a parte comum
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
VEREDITO: <ADR | RFC | parecer | mapa | contestação | "lane 3 não se aplica (Q3)">
|
|
185
|
+
|
|
186
|
+
INSUMO
|
|
187
|
+
- Ciclo: <id, aprovação registrada onde> · Q3: <a decisão que constrange, ou por que não há>
|
|
188
|
+
|
|
189
|
+
O QUE FOI MEDIDO
|
|
190
|
+
- <afirmação> — <arquivo:linha> — <como provou> — <de que pergunta isto é resposta>
|
|
191
|
+
|
|
192
|
+
DEAD CODE (se houve varredura)
|
|
193
|
+
| símbolo | arquivo:linha | referências | verificado contra dinâmico? | risco de remoção |
|
|
194
|
+
|
|
195
|
+
DUAL PATH (se houve varredura)
|
|
196
|
+
| contrato | caminho A | caminho B | quem chama A | quem chama B | divergiram desde | qual está certo |
|
|
197
|
+
|
|
198
|
+
MAPAS ARCHIFY (um por mapa acima: topologia, dead code, dual path — §6.5)
|
|
199
|
+
| mapa | caminho do .html | sha256 do .html | medição de origem (dentro do desenho) | data |
|
|
200
|
+
|
|
201
|
+
<as seções do seu substrato — o seu charter diz quais>
|
|
202
|
+
|
|
203
|
+
DECISÃO PROPOSTA
|
|
204
|
+
<o que decidir, a alternativa rejeitada, a consequência aceita, e para qual engenheiro o parecer vai>
|
|
205
|
+
|
|
206
|
+
FRONTEIRAS TOCADAS
|
|
207
|
+
<pares da matriz (§9) em que esta task encostou, e o que você deixou para o outro lado>
|
|
208
|
+
|
|
209
|
+
O QUE EU NÃO CONSEGUI VERIFICAR
|
|
210
|
+
<explícito — e por quê. Esta seção nunca vem vazia por conveniência.>
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## 9 · A matriz de fronteiras — nove papéis, 36 pares
|
|
216
|
+
|
|
217
|
+
Siglas: **Ba** `backend-architect` · **Fr** `frontend-architect` · **Co** `contract-architect` ·
|
|
218
|
+
**Dm** `datamodel-architect` · **In** `infra-architect` · **Ag** `agentic-architect` · **Me**
|
|
219
|
+
`architecture-mediator` · **Ha** `harness-architect` · **He** `harness-engineer`.
|
|
220
|
+
|
|
221
|
+
Quando a task encostar numa fronteira, a linha do par diz de quem é. **Na dúvida, diga qual é a dúvida
|
|
222
|
+
e devolva — não decida a fronteira sozinho no meio da task.** Fronteira disputada vai ao Me.
|
|
223
|
+
|
|
224
|
+
| # | par | fronteira |
|
|
225
|
+
|---|---|---|
|
|
226
|
+
| 1 | Ba–Fr | O modelo canônico do domínio é do Ba; o Fr **especializa declarando**, nunca implicitamente. Especialização não declarada é dual path de domínio, acusado pelos dois. |
|
|
227
|
+
| 2 | Ba–Co | O contrato (API e wire) é do Co; o que está atrás dele (casos de uso, invariantes) é do Ba. O tipo que atravessa a fronteira é do Co. |
|
|
228
|
+
| 3 | Ba–Dm | Modelo de **domínio** (entidades, agregados, invariantes) é do Ba; modelo de **persistência** (schema, índices, migração) é do Dm. O mapeamento entre eles é declarado por escrito — é o par com maior chance de dual path silencioso. |
|
|
229
|
+
| 4 | Ba–In | Estrutura do código é do Ba; onde e como ele roda (runtime, rede, IaC) é do In. A configuração que o código lê é contrato declarado pelo In. |
|
|
230
|
+
| 5 | Ba–Ag | Se o comportamento depende de **modelo em runtime** no produto, é do Ag; o domínio que o agente consome ou altera continua do Ba. |
|
|
231
|
+
| 6 | Ba–Me | O Me não decide substrato; desempata divergências em que o Ba é parte. |
|
|
232
|
+
| 7 | Ba–Ha | Produto entregue × tooling que a casa opera: se o comportamento depende de hook, skill, definição de agente ou distribuição, é do Ha. Onde produto e harness coincidem (o próprio orquestrador), o critério decide caso a caso e a dúvida vai ao Me. |
|
|
233
|
+
| 8 | Ba–He | Sem contato: o He implementa **harness**; o par de implementação do Ba é outro. |
|
|
234
|
+
| 9 | Fr–Co | O Fr consome o contrato do Co; **não redefine** o tipo no front. Tipo espelhado entre front e back é o dual path mais comum que existe. |
|
|
235
|
+
| 10 | Fr–Dm | Contato raro: estado de tela e offline é do Fr; se a persistência local virar modelo de dados (schema e migração no cliente), o Dm é consultado. |
|
|
236
|
+
| 11 | Fr–In | Hosting, CDN e deploy do front são do In; a estrutura do front é do Fr. |
|
|
237
|
+
| 12 | Fr–Ag | A tela de interação com um agente do produto é do Fr; o comportamento do agente é do Ag. |
|
|
238
|
+
| 13 | Fr–Me | Como 6. |
|
|
239
|
+
| 14 | Fr–Ha | Sem contato: design system e catálogo de componentes são do produto, não do harness. |
|
|
240
|
+
| 15 | Fr–He | Sem contato: o par de implementação do Fr é outro. |
|
|
241
|
+
| 16 | Co–Dm | O contrato **não expõe** o schema do banco; o Dm não publica contrato. Coluna de banco vazando para DTO é defeito dos dois. |
|
|
242
|
+
| 17 | Co–In | Política de borda (gateway, rate limit, auth na borda) é do In; a forma do contrato é do Co. |
|
|
243
|
+
| 18 | Co–Ag | O contrato de tool/API que um agente do produto chama tem forma do Co e uso do Ag. |
|
|
244
|
+
| 19 | Co–Ha | Contrato cujo consumidor é agente **da casa** (tools MCP do harness, JSON de hook) é do Ha; contrato do produto é do Co. |
|
|
245
|
+
| 20 | Co–He | Sem contato: o Co não tem engenheiro par na primeira volta, e o He é só do harness. |
|
|
246
|
+
| 21 | Dm–In | Provisionamento do banco (instância, backup, rede, réplica) é do In; o schema é do Dm. |
|
|
247
|
+
| 22 | Dm–Ag | Dados de memória/contexto do agente do produto (vetores, histórico): o modelo dos dados é do Dm, o uso é do Ag. |
|
|
248
|
+
| 23 | Dm–Ha | Os stores do harness (estado de workflow, artefatos) — mesmo caso do par 7: decide o critério, e a dúvida vai ao Me. |
|
|
249
|
+
| 24 | Dm–He | Sem contato: o Dm não tem engenheiro par na primeira volta. |
|
|
250
|
+
| 25 | In–Ag | Endpoint, quota, custo e latência de modelo (provisionamento) são do In; escolha de modelo e orquestração são do Ag. |
|
|
251
|
+
| 26 | In–Ha | Infra do **produto** é do In; a arquitetura de distribuição do **plugin** é do Ha. O pipeline de release da casa é tooling. |
|
|
252
|
+
| 27 | In–He | O He executa release e update do harness; o In não toca esse caminho. |
|
|
253
|
+
| 28 | Ag–Ha | O par mais fácil de confundir: **Ag** = sistema agêntico embarcado no produto entregue (invocado por usuário final, pago por chamada); **Ha** = agentes, hooks e skills que a casa opera. |
|
|
254
|
+
| 29 | Ag–He | Sem contato: o Ag não tem engenheiro par na primeira volta. |
|
|
255
|
+
| 30 | Ag–Me | Como 6. |
|
|
256
|
+
| 31 | Co–Me | Como 6. |
|
|
257
|
+
| 32 | Dm–Me | Como 6. |
|
|
258
|
+
| 33 | In–Me | Como 6. |
|
|
259
|
+
| 34 | Me–Ha | O Ha senta na mesa quando o escopo convoca harness; o Me medeia do mesmo jeito, e não herda do Ha a autoridade sobre harness. |
|
|
260
|
+
| 35 | Me–He | O He não senta na mesa: é engenheiro. O Me não despacha implementação. |
|
|
261
|
+
| 36 | Ha–He | O Ha **orça** (o fato de o custo existir e sua ordem de grandeza); o He é dono do **procedimento** (varrer, bumpar, regenerar, release, update). O Ha cita o He, não copia. |
|
|
@@ -6,7 +6,7 @@ description: When and how to create workflow checkpoints. Use after completing t
|
|
|
6
6
|
## Checkpoint Creation Protocol
|
|
7
7
|
|
|
8
8
|
### Who follows this (TD-171)
|
|
9
|
-
This protocol applies to the `implementer` **and all engineer-type committing agents** — any agent whose tool list holds `mcp__orchestrator-tools__createCheckpoint`: as of
|
|
9
|
+
This protocol applies to the `implementer` **and all engineer-type committing agents** — any agent whose tool list holds `mcp__orchestrator-tools__createCheckpoint`: as of S531 that is the 9 agents `implementer`, `azure-devops-engineer`, `presentation-engineer`, `operational-artifact-builder`, `cicd-platform-engineer`, `python-data-engineer`, `frontend-engineer`, `ciclo-engineer`, `harness-engineer` (`ciclo-engineer` and `harness-engineer` added in S531, D-137/D-153). **Keep in sync** with `COMMITTING_AGENTS` in the `pre-agent-dispatch` hook, `/orchestrator` SKILL §2c.1 and the identity's MUST 5 — four hand-written lists of the same set. Engineer-types commit critical artifacts **outside `src/`** (IaC, pipelines, ETL, decks), so they need per-change git revertability too — "only `src/` commits matter" is wrong. **That revertability comes from their own local commits, not from `createCheckpoint`** (see "Checkpoint vs git" below — corrected S444).
|
|
10
10
|
|
|
11
11
|
### Checkpoint vs git (read first)
|
|
12
12
|
|
|
@@ -101,7 +101,7 @@ Sub-agents MUST persist artifacts to MinIO via `artifactStore` (universal rule,
|
|
|
101
101
|
|
|
102
102
|
#### 2c.1 Checkpoint + Commit Policy dispatch addenda (TD-S188-002 + TD-S192-003)
|
|
103
103
|
|
|
104
|
-
**Scope (TD-S192-003 amendment; set re-verified TD-171/S290):** this block applies to **any agent whose tool list includes `mcp__orchestrator-tools__createCheckpoint`**. As of **
|
|
104
|
+
**Scope (TD-S192-003 amendment; set re-verified TD-171/S290):** this block applies to **any agent whose tool list includes `mcp__orchestrator-tools__createCheckpoint`**. As of **S531 the ground-truth set (the `tools:` line of `packages/definitions/agents/*.md` holding `createCheckpoint`) is the 9 agents**: `implementer`, `azure-devops-engineer`, `presentation-engineer`, `operational-artifact-builder`, `cicd-platform-engineer`, `python-data-engineer`, `frontend-engineer`, `ciclo-engineer`, `harness-engineer`. (`ciclo-engineer` and `harness-engineer` were added in S531 — D-137/D-153; the first had carried the tool, unlisted, since before the lane 3.) (The earlier S195 list was stale — it named `methodology-researcher`, which no longer holds the tool, and omitted `cicd-platform-engineer` / `python-data-engineer` / `frontend-engineer`, added later.) **Keep this set in sync with `COMMITTING_AGENTS` in `packages/definitions/hooks/pre-agent-dispatch.ts`** (and its mirrors, propagated by `npm run sync:hooks`), with the identity's MUST 5 and with `/checkpoint-protocol` (the branch-before-dispatch hook, §2c.0) — both derive from the same `createCheckpoint`-holder ground truth; when an agent gains/loses `createCheckpoint`, update both. **Match this set ignoring any plugin prefix** (`orchestrator:implementer` ≡ `implementer`) — the hook already does so via `normalizeAgentName()` (S398); membership is a property of the agent, not of the topology that names it. The earlier version of this section was implementer-only; subsequent sessions (S192 PME phase 2, S194 bug_fix, S195 lint sweep) confirmed the same `createCheckpoint=git-commit` conflation appears across other agents that hold the tool — making the rule agent-agnostic from S195 forward.
|
|
105
105
|
|
|
106
106
|
When dispatching any of those agents, the generic template above is **insufficient**. The S188 implement phase originally surfaced the ambiguity: the implementer interpreted `createCheckpoint` as requiring a git commit beforehand, producing 4 unsolicited commits per dispatch (commit prefix also leaked from BACKLOG context: `feat(s186)` instead of `feat(s188)`). Empirical evidence preserved across sessions:
|
|
107
107
|
|
|
@@ -361,6 +361,53 @@ run_build() {
|
|
|
361
361
|
log_success "Build completed - dist/ updated with latest templates"
|
|
362
362
|
}
|
|
363
363
|
|
|
364
|
+
# Put the committed hook bundles back after run_build (S532, D-175).
|
|
365
|
+
# The local build rewrites every packages/definitions/hooks/*.mjs — only the esbuild
|
|
366
|
+
# source-path comments change ("// packages/definitions/hooks/x.ts" -> "// hooks/x.ts"),
|
|
367
|
+
# even with a real node_modules. The .mjs are NOT staged by commit_version_bump, but
|
|
368
|
+
# regenerate_definitions_manifest hashes them, so without this step the bumped manifest
|
|
369
|
+
# carries sha256 of bytes that are not in the repo (v3.37.3 shipped 0/15 hook checksums
|
|
370
|
+
# matching). validate_working_tree guarantees HEAD is the state being released.
|
|
371
|
+
restore_committed_hook_bundles() {
|
|
372
|
+
echo "♻️ Restoring committed hook bundles (hooks/*.mjs) after build..."
|
|
373
|
+
|
|
374
|
+
if [ "$DRY_RUN" = true ]; then
|
|
375
|
+
echo " [dry-run] Would run: git checkout HEAD -- packages/definitions/hooks/*.mjs"
|
|
376
|
+
return
|
|
377
|
+
fi
|
|
378
|
+
|
|
379
|
+
local bundles
|
|
380
|
+
bundles=$(git ls-files 'packages/definitions/hooks/*.mjs')
|
|
381
|
+
if [ -z "$bundles" ]; then
|
|
382
|
+
log_error "No committed hook bundles found under packages/definitions/hooks/"
|
|
383
|
+
exit 1
|
|
384
|
+
fi
|
|
385
|
+
|
|
386
|
+
# shellcheck disable=SC2086
|
|
387
|
+
git checkout HEAD -- $bundles
|
|
388
|
+
|
|
389
|
+
log_success "Hook bundles restored to HEAD ($(echo "$bundles" | wc -l | tr -d ' ') files)"
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
# Guard: every hook checksum in the regenerated manifest must be the sha256 of the
|
|
393
|
+
# .mjs blob committed at HEAD — the bytes the release actually ships. Aborts before
|
|
394
|
+
# commit_version_bump if any diverges (TD-330: CI rebuilds the .mjs before testing,
|
|
395
|
+
# so it never judges the committed ones; this is the only check on them).
|
|
396
|
+
verify_manifest_hook_checksums() {
|
|
397
|
+
node -e '
|
|
398
|
+
const { execFileSync } = require("node:child_process");
|
|
399
|
+
const { createHash } = require("node:crypto");
|
|
400
|
+
const hooks = require("./packages/definitions/manifest.json").definitions.hooks;
|
|
401
|
+
const bad = hooks.filter((h) => {
|
|
402
|
+
const blob = execFileSync("git", ["show", `HEAD:packages/definitions/${h.file}`]);
|
|
403
|
+
return `sha256:${createHash("sha256").update(blob).digest("hex")}` !== h.checksum;
|
|
404
|
+
});
|
|
405
|
+
console.log(`${hooks.length - bad.length}/${hooks.length}`);
|
|
406
|
+
for (const h of bad) console.error(` checksum != HEAD blob: ${h.file}`);
|
|
407
|
+
process.exit(bad.length === 0 && hooks.length > 0 ? 0 : 1);
|
|
408
|
+
'
|
|
409
|
+
}
|
|
410
|
+
|
|
364
411
|
# Regenerate packages/definitions/manifest.json AFTER the version bump (TD-193).
|
|
365
412
|
# run_build already regenerates the manifest, but it runs BEFORE update_all_versions,
|
|
366
413
|
# so at that point the manifest still carries the OLD version. generate-manifest sources
|
|
@@ -389,6 +436,13 @@ regenerate_definitions_manifest() {
|
|
|
389
436
|
exit 1
|
|
390
437
|
fi
|
|
391
438
|
|
|
439
|
+
local hook_match
|
|
440
|
+
if ! hook_match=$(verify_manifest_hook_checksums); then
|
|
441
|
+
log_error "Manifest hook checksums do not match the committed hooks/*.mjs ($hook_match)"
|
|
442
|
+
exit 1
|
|
443
|
+
fi
|
|
444
|
+
log_success "Manifest hook checksums match committed bundles ($hook_match)"
|
|
445
|
+
|
|
392
446
|
log_success "Manifest regenerated and version-synced to $manifest_version"
|
|
393
447
|
}
|
|
394
448
|
|
|
@@ -510,12 +564,14 @@ main() {
|
|
|
510
564
|
echo ""
|
|
511
565
|
echo "Actions:"
|
|
512
566
|
echo " 1. Build project (update dist/ with latest templates)"
|
|
513
|
-
echo " 2.
|
|
514
|
-
echo " 3.
|
|
515
|
-
echo " 4.
|
|
516
|
-
echo "
|
|
517
|
-
echo "
|
|
518
|
-
echo "
|
|
567
|
+
echo " 2. Restore committed hook bundles (hooks/*.mjs) the build rewrote"
|
|
568
|
+
echo " 3. Update version in all files"
|
|
569
|
+
echo " 4. Regenerate definitions manifest from bumped version (TD-193)"
|
|
570
|
+
echo " and assert its hook checksums match the committed .mjs"
|
|
571
|
+
echo " 5. Commit version bump"
|
|
572
|
+
echo " 6. Create git tag $tag"
|
|
573
|
+
echo " 7. Push main + tag to origin"
|
|
574
|
+
echo " 8. CI/CD pipeline will publish npm + Docker"
|
|
519
575
|
echo ""
|
|
520
576
|
|
|
521
577
|
if [ "$FORCE" = false ] && [ "$DRY_RUN" = false ]; then
|
|
@@ -529,6 +585,7 @@ main() {
|
|
|
529
585
|
|
|
530
586
|
# Execute release steps
|
|
531
587
|
run_build
|
|
588
|
+
restore_committed_hook_bundles
|
|
532
589
|
update_all_versions "$new_version"
|
|
533
590
|
regenerate_definitions_manifest
|
|
534
591
|
commit_version_bump "$new_version"
|