wendkeep 0.78.0 → 0.79.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/CHANGELOG.md +41 -0
- package/README.en.md +57 -2
- package/README.md +57 -2
- package/docs/en/commands/changes-and-verification.md +66 -1
- package/docs/en/commands/operating-profiles.md +49 -5
- package/docs/en/commands/verify.md +45 -0
- package/docs/en/commands/worktrees.md +39 -4
- package/docs/pt-BR/commands/changes-and-verification.md +65 -1
- package/docs/pt-BR/commands/operating-profiles.md +51 -5
- package/docs/pt-BR/commands/verify.md +45 -0
- package/docs/pt-BR/commands/worktrees.md +38 -3
- package/hooks/active-context-store.mjs +530 -2
- package/hooks/change-core.mjs +201 -122
- package/hooks/obsidian-common.mjs +175 -9
- package/hooks/spec-core.mjs +93 -29
- package/package.json +2 -2
- package/schema/wendkeep.provenance-receipt-v2.schema.json +66 -0
- package/src/archive-operation-lock.mjs +235 -0
- package/src/change.mjs +1780 -79
- package/src/delivery.mjs +724 -67
- package/src/memory.mjs +2 -1
- package/src/provenance-gate.mjs +575 -0
- package/src/provenance-sources.mjs +547 -0
- package/src/receipt-ledger.mjs +841 -0
- package/src/release-provenance.mjs +48 -0
- package/src/worktree-cleanup.mjs +1733 -118
- package/src/worktree.mjs +94 -5
|
@@ -59,7 +59,7 @@ npx wendkeep flow finish <id> [--session <id>]
|
|
|
59
59
|
npx wendkeep flow promote <id> [--change-slug <slug>] [--session <id>]
|
|
60
60
|
npx wendkeep delivery start [id] --allow <capability> [--source-change <slug>] [--source-commit <sha>] [--session <id>]
|
|
61
61
|
npx wendkeep delivery status [id] [--session <id>]
|
|
62
|
-
npx wendkeep delivery finish [id] [--target <
|
|
62
|
+
npx wendkeep delivery finish [id] [--target <remote>/<branch>] [--ci-url <url>] [--version <x.y.z>] [--npm-integrity <sha512>] [--release-url <url>] [--session <id>]
|
|
63
63
|
npx wendkeep delivery abandon [id] --reason <texto> [--session <id>]
|
|
64
64
|
```
|
|
65
65
|
|
|
@@ -179,13 +179,38 @@ harness nativo da LLM.
|
|
|
179
179
|
`contract_impact` e `operation_risk` são dimensões independentes. `delivery start` captura repo,
|
|
180
180
|
branch/worktree, SHA, change de origem e capabilities em `.brain/runtime/deliveries/`; não cria
|
|
181
181
|
pasta em `08-Mudanças`, delta, spec ou ADR.
|
|
182
|
-
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
delivery
|
|
182
|
+
- Para as capabilities `git:merge` e `git:push`, `delivery finish` exige `--target
|
|
183
|
+
<remote>/<branch>` (por exemplo, `--target origin/main`). `delivery start` vincula o remote
|
|
184
|
+
`origin` ao `repository` esperado; `finish` resolve o destino com `git ls-remote` e bloqueia a
|
|
185
|
+
delivery antes dos adapters de proveniência se o target não puder ser resolvido ou o binding
|
|
186
|
+
divergir.
|
|
187
|
+
- `delivery finish` exige working tree limpa e rederiva source/target. Merge/push prova
|
|
188
|
+
ancestralidade; tag prova package/version e tag no target; `publish` consulta CI, NPM e GitHub
|
|
189
|
+
Release ligados ao mesmo commit, versão, integrity e notas. No modo offline, uma claim fica
|
|
190
|
+
`reported` e não vira `verified`; a conclusão bloqueia sem gravar receipt. Novos receipts formam
|
|
191
|
+
`.brain/runtime/delivery-receipts-v2.jsonl`, com hash chain e checkpoint; o v1 é somente
|
|
192
|
+
`legacy-unbound`. `WENDKEEP_PROVENANCE_GATE_BLOCKED` traz o recovery. Se código/config precisar
|
|
193
|
+
mudar, `WENDKEEP_DELIVERY_IMPLEMENTATION_REQUIRED` devolve o trabalho a implementation.
|
|
194
|
+
O gate usa a mesma taxonomia `verified`, `reported`, `legacy-unbound`, `stale`, `conflict` e
|
|
195
|
+
`unproven`. Os erros do ledger são `WENDKEEP_RECEIPT_LEDGER_BUSY`,
|
|
196
|
+
`WENDKEEP_RECEIPT_LEDGER_CONFLICT`, `WENDKEEP_RECEIPT_LEDGER_CORRUPT` e
|
|
197
|
+
`WENDKEEP_RECEIPT_LEDGER_TRUNCATED`; consulte `state`, `reasonCodes`, `diagnostics` e
|
|
198
|
+
`repair.command` sanitizados em `--json`, execute o recovery indicado e recapture a prova, sem editar
|
|
199
|
+
ledger/checkpoint ou expor stderr, tokens, URLs privadas e paths do Vault.
|
|
186
200
|
- Em Vault multi-contexto, `active_contexts[].delivery_id` é a autoridade. `--session <id>` escolhe
|
|
187
201
|
explicitamente a work session; sem ela, somente um active context inequívoco da worktree pode ser
|
|
188
202
|
usado. Status, finish e abandon implícitos consultam esse binding, não um ponteiro global.
|
|
203
|
+
- Falhas de `delivery`, tanto em texto quanto em `delivery --json`, expõem o mesmo diagnóstico
|
|
204
|
+
PROV-8: `code` estável, `operation`, `state`, primeiro `blocker`, `expected`/`observed`
|
|
205
|
+
sanitizados e `recovery` objetivo. Stderr do Git, tokens, URLs privadas e caminhos privados não
|
|
206
|
+
são propagados.
|
|
207
|
+
- Receipts `delivery.completed` e `delivery.abandoned` vinculam `repository_id`, o `repository`
|
|
208
|
+
público no formato `owner/repo`, `worktree_id`, `work_session_id`, `change_slug` e `branch`.
|
|
209
|
+
O path privado da worktree nunca entra no receipt. Na finalização contextual, o receipt entra no
|
|
210
|
+
ledger e o `state` durável é gravado antes de limpar `active_contexts[].delivery_id`. Um retry
|
|
211
|
+
converge para o mesmo receipt quando o binding já está limpo ou ainda vinculado. Em
|
|
212
|
+
`delivery abandon`, o motivo livre vira `reason_digest`; o texto bruto não entra no ledger nem no
|
|
213
|
+
estado.
|
|
189
214
|
- `CURRENT_DELIVERY` é somente uma projeção derivada: contém o ID quando existe um único contexto
|
|
190
215
|
ativo inequívoco com delivery e fica vazio com zero ou múltiplos contextos.
|
|
191
216
|
`WENDKEEP_DELIVERY_CONTEXT_MISMATCH` indica que o ID explícito pertence a outro contexto; nenhum
|
|
@@ -274,6 +299,27 @@ continuam disponíveis e executam seus próprios contratos. Um FLOW concluído d
|
|
|
274
299
|
consultável; um FLOW promovido passa a seguir o lifecycle normal de change. Uma delivery concluída
|
|
275
300
|
deixa receipt sem gerar ADR; GUIDE compacto arquiva o resultado sem spec/design/ADR artificiais.
|
|
276
301
|
|
|
302
|
+
Para archive em GOVERN/ASSURE, o `directory lock` usa marker específico do token e lease: a
|
|
303
|
+
aquisição prepara um diretório irmão `.pending` e publica por rename atômico, sem hardlink, com no
|
|
304
|
+
máximo 3 tentativas de topologia. Owner vivo retorna `WENDKEEP_ARCHIVE_BUSY`, owner morto pode ser
|
|
305
|
+
reapado com segurança, marker inválido retorna `WENDKEEP_ARCHIVE_LOCK_UNAVAILABLE` e perda de
|
|
306
|
+
ownership retorna `WENDKEEP_ARCHIVE_LOCK_OWNERSHIP_LOST`. O journal `archive-transaction.json`
|
|
307
|
+
percorre `prepared` → `isolated` → `copied` → `sealed` → `published` → `promotion-prepared` →
|
|
308
|
+
`promotion-applied` → `completed` ou `recovery-required`; um journal pending bloqueia novo archive
|
|
309
|
+
do mesmo slug antes do gate.
|
|
310
|
+
`original` fica retido em collision/falha pós-publicação e `published-recovery-required` exige
|
|
311
|
+
inspeção. `operation_id` e `transaction_phase` aparecem apenas sanitizados. Use
|
|
312
|
+
`wendkeep change archive recover <operation-id> --change <slug> [--spec-action rollback|resume] [--json]`:
|
|
313
|
+
sem `--spec-action`, inspeção somente-leitura, fail-closed e idempotente, sem promoção, deleção ou
|
|
314
|
+
reconciliação inventada; `rollback` restaura before-images e `resume` converge after-images de
|
|
315
|
+
`promotion-prepared`, retendo o journal. Quando há operation ID, `repair.command` aponta para esse
|
|
316
|
+
recovery; não trate `command:null` como fluxo normal.
|
|
317
|
+
|
|
318
|
+
A promoção multi-spec é atômica, com before-images/digests, rollback dos alvos antes/depois da
|
|
319
|
+
escrita e retry somente após reconciliação e nova verificação. O finalizer pós-release valida os
|
|
320
|
+
digests do original e do destino publicado, mas o `completed` journal mantém o `original` retido;
|
|
321
|
+
sem cleanup destrutivo automático.
|
|
322
|
+
|
|
277
323
|
## Erros comuns e diagnóstico
|
|
278
324
|
|
|
279
325
|
- Perfil desconhecido: use exatamente `OFF`, `FLOW`, `GUIDE`, `GOVERN` ou `ASSURE`.
|
|
@@ -91,6 +91,44 @@ no verdict.
|
|
|
91
91
|
Evidência v1 continua legível como `legacy-unbound`, nunca como autoridade equivalente. Rode
|
|
92
92
|
`wendkeep change status <slug>` para ver `bound`, `stale` ou `context-mismatch`.
|
|
93
93
|
|
|
94
|
+
O gate de proveniência normaliza a visão legada numa taxonomia única: `verified` quando toda prova
|
|
95
|
+
obrigatória está fresca e vinculada; `reported` para claim registrada sem observação autoritativa;
|
|
96
|
+
`legacy-unbound` para v1; `stale` para um snapshot anterior; `conflict` para identidade/conteúdo
|
|
97
|
+
incompatível; e `unproven` para prova ausente ou insuficiente. A precedência é `conflict` > `stale`
|
|
98
|
+
> `legacy-unbound` > `unproven` > `reported` > `verified`, e somente `verified` fecha o gate.
|
|
99
|
+
|
|
100
|
+
Para o archive pós-fix, o passe final é `wendkeep verify --deep --change <slug>`. Ele deve deixar
|
|
101
|
+
package e verdict completos e canônicos, ligados ao mesmo checkout, change, tarefas, spec e
|
|
102
|
+
sensores. O archive grava o receipt de autorização antes da mutação no ledger separado
|
|
103
|
+
`change-archive-receipts-v2`. Sua saída `change archive --json` é serializável e expõe `state`,
|
|
104
|
+
`reason_codes`, `diagnostics` e `repair`; corrupção ou truncamento de ledger bloqueia fechado.
|
|
105
|
+
`--force` não bypassa proveniência ou integridade. O recovery exato é repetir
|
|
106
|
+
`wendkeep verify --deep --change <slug>` depois de estabilizar o contexto.
|
|
107
|
+
|
|
108
|
+
O archive usa um `directory lock` com marker específico do token e lease. A aquisição prepara um
|
|
109
|
+
diretório irmão `.pending` e publica-o por rename atômico, sem hardlink, com no máximo 3 tentativas
|
|
110
|
+
de topologia. Owner vivo produz `WENDKEEP_ARCHIVE_BUSY`; owner morto só é reapado com observação
|
|
111
|
+
segura; marker/estrutura inválida produz `WENDKEEP_ARCHIVE_LOCK_UNAVAILABLE`; perda de ownership
|
|
112
|
+
produz `WENDKEEP_ARCHIVE_LOCK_OWNERSHIP_LOST`. O manifest `archive-transaction.json` registra
|
|
113
|
+
`prepared` → `isolated` → `copied` → `sealed` → `published` → `promotion-prepared` →
|
|
114
|
+
`promotion-applied` → `completed` ou `recovery-required`. Um journal pending bloqueia novo archive
|
|
115
|
+
do mesmo slug antes do gate. Em
|
|
116
|
+
collision ou falha pós-publicação, `original` é retido e o estado
|
|
117
|
+
`published-recovery-required` bloqueia retry destrutivo. `operation_id` e `transaction_phase` são
|
|
118
|
+
campos sanitizados. Inspecione com
|
|
119
|
+
`wendkeep change archive recover <operation-id> --change <slug> [--spec-action rollback|resume] [--json]`:
|
|
120
|
+
sem `--spec-action`, é somente-leitura, fail-closed e idempotente, sem promoção, deleção ou
|
|
121
|
+
reconciliação inventada. `rollback` restaura before-images e `resume` converge after-images de uma
|
|
122
|
+
promoção `promotion-prepared`, mantendo o journal para reconciliação. Quando há operation ID,
|
|
123
|
+
`repair.command` aponta para `wendkeep change archive recover <operation-id> --change <slug>`; não
|
|
124
|
+
trate `command:null` como fluxo normal.
|
|
125
|
+
|
|
126
|
+
A promoção multi-spec é uma unidade atômica: captura before-images/digests de todos os capabilities,
|
|
127
|
+
faz rollback de todos os alvos (incluindo estado/README) em falha antes ou depois da escrita e só
|
|
128
|
+
permite retry após reconciliação do journal e nova verificação. O finalizador pós-release valida os
|
|
129
|
+
digests do original e do destino, mas o `completed` journal mantém o `original` retido; sem cleanup
|
|
130
|
+
destrutivo automático. Falha mantém `published-recovery-required`.
|
|
131
|
+
|
|
94
132
|
## Erros comuns e diagnóstico
|
|
95
133
|
|
|
96
134
|
- `no change`: isso é exit 2 e estado ocioso válido; crie/use uma change ou não rode verify.
|
|
@@ -103,6 +141,13 @@ Evidência v1 continua legível como `legacy-unbound`, nunca como autoridade equ
|
|
|
103
141
|
checkout e repita. A evidência anterior não foi substituída.
|
|
104
142
|
- `legacy-unbound`, `stale` ou `context-mismatch`: volte à worktree/sessão correta, recupere o
|
|
105
143
|
contexto se necessário e rode `verify` + `verify --deep` novamente.
|
|
144
|
+
- `WENDKEEP_PROVENANCE_GATE_BLOCKED`: leia `state`, `reasonCodes` e `repair`; não reutilize uma
|
|
145
|
+
prova de outra branch/worktree/sessão. Rode o comando indicado e recapture o envelope.
|
|
146
|
+
- Os erros `WENDKEEP_RECEIPT_LEDGER_BUSY`, `WENDKEEP_RECEIPT_LEDGER_CONFLICT`,
|
|
147
|
+
`WENDKEEP_RECEIPT_LEDGER_CORRUPT` e `WENDKEEP_RECEIPT_LEDGER_TRUNCATED` exigem preservar o
|
|
148
|
+
ledger/checkpoint e executar o recovery objetivo em `repair.command` (ou
|
|
149
|
+
`npx --no-install wendkeep verify --deep --json` para uma prova fresca); a saída textual/JSON
|
|
150
|
+
permanece sanitizada e não contém stderr bruto, tokens, URLs privadas ou paths do Vault.
|
|
106
151
|
- Mutantes sobreviventes: fortaleça o teste discriminante; após três rodadas, revise manualmente.
|
|
107
152
|
|
|
108
153
|
## Próximos passos
|
|
@@ -58,6 +58,31 @@ interrompido/failed e uma recuperação objetiva.
|
|
|
58
58
|
head comprovado; divergência ou rede indisponível bloqueia. Branch já ausente é sucesso idempotente.
|
|
59
59
|
`--open-main` abre a worktree principal somente depois da conclusão.
|
|
60
60
|
|
|
61
|
+
### Cleanup pós-fix: retomada crash-safe
|
|
62
|
+
|
|
63
|
+
A operação de cleanup é **crash-safe** e retomável antes do receipt, depois do receipt e antes do
|
|
64
|
+
finalize, e depois do finalize: um crash em qualquer fronteira preserva operation/state e permite
|
|
65
|
+
repetir a mesma prova sem duplicar remoção ou receipt. O subject de cada operação inclui todos os
|
|
66
|
+
active contexts, actor, pr, head e merge. O PR canônico é a autoridade resolvida pelo adapter
|
|
67
|
+
GitHub; texto fornecido pelo chamador não substitui essa autoridade.
|
|
68
|
+
|
|
69
|
+
O HEAD é rederivado antes do finalize, a partir do checkout, e comparado ao head/merge comprovado. O reason
|
|
70
|
+
fica sanitizado e recebe digest para auditoria, sem armazenar path privado, token ou stderr.
|
|
71
|
+
Checkpoint ausente ou inválido é WENDKEEP_RECEIPT_LEDGER_TRUNCATED. Receipt v1 continua
|
|
72
|
+
legacy-unbound e nunca autoriza cleanup.
|
|
73
|
+
|
|
74
|
+
Texto e --json expõem sempre operation, state, blocker, recovery e os códigos estáveis
|
|
75
|
+
WENDKEEP_WORKTREE_CLEANUP_BUSY, WENDKEEP_RECEIPT_LEDGER_CORRUPT e
|
|
76
|
+
WENDKEEP_RECEIPT_LEDGER_TRUNCATED; a recuperação retoma a reserva ou indica o reparo objetivo.
|
|
77
|
+
|
|
78
|
+
O gate comum classifica a operação de cleanup e bloqueia antes da mutação, inclusive em finish,
|
|
79
|
+
remove e cleanup --apply. Depois do append, o receipt é classificado pelo mesmo gate antes do
|
|
80
|
+
finalize; falha de proveniência não finaliza nem marca sucesso. Um estado cleaned sem receipt v2
|
|
81
|
+
fica bloqueado como unproven; um receipt v1 não autoriza e permanece legacy-unbound.
|
|
82
|
+
|
|
83
|
+
Texto e --json de bloqueio mantêm o diagnóstico equivalente e sanitizado: code, operation, state,
|
|
84
|
+
blocker, expected, observed, recovery, reason_codes, diagnostics e repair.
|
|
85
|
+
|
|
61
86
|
## Cleanup, remove e prune
|
|
62
87
|
|
|
63
88
|
`cleanup --merged` e `prune` são dry-run por padrão. `--dry-run` apenas torna essa intenção
|
|
@@ -70,9 +95,19 @@ mas mantém todo o preflight e preserva as branches local e remota.
|
|
|
70
95
|
|
|
71
96
|
O registry fica no Git common-dir, em `wendkeep/worktrees-v1.json`, sob lock multiprocesso. Ele
|
|
72
97
|
guarda identidade do repositório/worktree, binding canônico, PR e estado transitório de cleanup;
|
|
73
|
-
`.wendkeep.json` permanece inalterado.
|
|
74
|
-
`wendkeep/worktree-cleanup-receipts-
|
|
75
|
-
|
|
98
|
+
`.wendkeep.json` permanece inalterado. Novos receipts ficam em
|
|
99
|
+
`wendkeep/worktree-cleanup-receipts-v2.jsonl`: cada linha inclui `previous_hash` e `receipt_hash`, e
|
|
100
|
+
um checkpoint separado fixa a sequência/hash/tamanho validado. O v1 permanece legível como
|
|
101
|
+
`legacy-unbound`, sem append ou reescrita silenciosa. `WENDKEEP_RECEIPT_LEDGER_CORRUPT` indica
|
|
102
|
+
adulteração/JSON parcial; `WENDKEEP_RECEIPT_LEDGER_TRUNCATED` indica cauda removida. Ambos bloqueiam
|
|
103
|
+
antes da remoção e exigem diagnosticar o store, nunca inventar receipt. `.worktrees/` entra no
|
|
104
|
+
ignore versionado e no exclude privado; JSON de `list`/`status` não expõe path/conteúdo do Vault.
|
|
105
|
+
O gate de cleanup usa `verified`, `reported`, `legacy-unbound`, `stale`, `conflict` e `unproven`;
|
|
106
|
+
`WENDKEEP_PROVENANCE_GATE_BLOCKED` e os códigos `WENDKEEP_RECEIPT_LEDGER_BUSY`,
|
|
107
|
+
`WENDKEEP_RECEIPT_LEDGER_CONFLICT`, `WENDKEEP_RECEIPT_LEDGER_CORRUPT` e
|
|
108
|
+
`WENDKEEP_RECEIPT_LEDGER_TRUNCATED` falham fechados. O recovery objetivo lê o JSON sanitizado de
|
|
109
|
+
`worktree status <slug> --json`, executa `repair.command` quando presente e recaptura a prova; não
|
|
110
|
+
edite ledger/checkpoint nem exponha stderr, tokens, URLs privadas ou paths do Vault.
|
|
76
111
|
|
|
77
112
|
`create` é idempotente quando slug, path e branch já correspondem. Colisões falham fechadas.
|
|
78
113
|
Falhas depois da reserva ficam como `failed`; rode `worktree status <slug>` e siga `recovery`.
|