Sintoma
Toda abertura de sessão Claude Code num projeto do Cohort imprime 4 linhas de aviso antes de
qualquer interação — em macOS e Windows. O texto diz que as regras Write(path) do
.claude/settings.json não são avaliadas: apenas Edit(path) casa com as ferramentas de escrita.
É a primeira coisa que o aluno vê ao abrir um pane.
Permission allow rule (.claude/settings.json): Write(workspace/output/**) is not matched by file
permission checks — only Edit(path) rules are. Use Edit(workspace/output/**) instead (Edit rules
cover all file-editing tools).
(idem para Write(.sinkra/state/**), Write(.sinkra/extraction/**) e, em deny, Write(.claude/**))
Ambiente
- OS: macOS 13.7.8 (x86_64) + Windows (mesmo aviso, reportado por aluno) · Cockpit: v0.11.1.0 ·
Claude Code: 2.1.235 · Antivírus: nenhum além do nativo
- Bundle:
.claude/settings.json, merge_strategies: deep-merge-json, presente no MANIFEST como
bundle/.claude/settings.json (self_contained: true)
- sinkra-os (loader npm): 3.8.0
O que o diagnóstico encontrou
1. As 3 regras de allow são duplicatas mortas. O bundle já entrega o par Edit(...)
equivalente logo acima de cada Write(...). Remover as Write não muda comportamento nenhum —
só cala o aviso. [ALTA]
2. A regra de deny nunca valeu. Write(.claude/**) está em permissions.deny — ou seja, o
bundle acredita proteger .claude/, e não protege. Nunca protegeu, na versão atual do Claude
Code. O aviso estava anunciando isso e passou despercebido. [ALTA]
3. Converter Write(.claude/**) → Edit(.claude/**) é a correção ERRADA. Se essa proibição
passar a valer de verdade, quebra dois caminhos do próprio framework:
-
/sinkra-create-skill (Forja) — o stage-runner sinkra-creator-gerar tem como boundary
declarado "escreve SÓ .claude/skills/ + .sinkra/forge/". Com o deny ativo, a Forja não
materializa skill nenhuma.
-
/cohort-bootstrap — reescreve .claude/ inteiro por definição.
A correção segura é remover a linha (ela já é inerte hoje, então remover é no-op de
comportamento), ou substituí-la por um deny estreito que não cubra .claude/skills/**. [ALTA]
4. O aluno não consegue consertar isso sozinho de forma durável. Em
sinkra-os@3.8.0/lib/merge-engine.js, deepMergeJson resolve kind por
rp.endsWith('settings.json') → 'settings' (linha 260), e nesse ramo faz:
const MANAGED = ['permissions', 'hooks', '_sinkra_managed'];
result = { ...student };
for (const k of MANAGED) if (k in bundleJson) result[k] = bundleJson[k];
permissions é bundle-wins, sobrescrita integral — não é união. Logo, qualquer correção que o
aluno (ou nós) faça no .claude/settings.json do projeto é apagada no próximo
sinkra-os install/update, e o aviso volta. O único conserto durável é no bundle. [ALTA]
5. Segunda fonte do mesmo defeito, e desatualizada. O template usado pelo /cohort-bootstrap
(.claude/skills/cohort-bootstrap/templates/.claude/settings.json) tem as mesmas 3 regras mortas
e além disso está em regime antigo: SINKRA_VERSION: "v4" e libera .aiox/** em vez de
.sinkra/**. Ou seja, re-scaffoldar hoje entrega permissões que não correspondem às pastas que o
V5 realmente usa. [ALTA]
Passos para reproduzir
- Instalar/atualizar um projeto do Cohort pelo bundle (
sinkra-os install).
- Abrir qualquer sessão Claude Code (2.1.x) na raiz do projeto — pane do Cockpit ou terminal.
- As 4 linhas de aviso aparecem antes do primeiro turno. Em toda janela nova, sempre.
- Editar o
.claude/settings.json para remover as regras Write(...) → aviso some.
- Rodar
sinkra-os install de novo → permissions é sobrescrita pelo bundle → aviso volta.
Correção sugerida (no bundle)
bundle/.claude/settings.json:
- remover as 3 linhas
Write(...) de allow (os pares Edit(...) já existem)
- remover a linha
Write(.claude/**) de deny — não convertê-la para Edit(...) (ver item 3)
- separar
Bash(node:*,npm:*) em Bash(node:*) + Bash(npm:*) — vírgula dentro de uma regra só
não é a sintaxe documentada [MÉDIA — não emite aviso, mas é suspeito de não casar]
E aplicar a mesma correção ao template do cohort-bootstrap, junto com o refresh v4→v5
(.aiox/** → .sinkra/**).
Classificação [Confiança: ALTA]
bug — do bundle sinkra-os, não do Cockpit. Duas consequências independentes: ruído em 100%
das aberturas de sessão de 100% dos alunos (o primeiro contato com o produto), e uma regra de
governança que o framework acredita ter e não tem. Não é auto-corrigível pelo aluno por causa do
bundle-wins em permissions.
Labels sugeridas: bug, os:both, severity:minor
(não tenho permissão de triage no repo para aplicá-las na criação)
Sintoma
Toda abertura de sessão Claude Code num projeto do Cohort imprime 4 linhas de aviso antes de
qualquer interação — em macOS e Windows. O texto diz que as regras
Write(path)do.claude/settings.jsonnão são avaliadas: apenasEdit(path)casa com as ferramentas de escrita.É a primeira coisa que o aluno vê ao abrir um pane.
(idem para
Write(.sinkra/state/**),Write(.sinkra/extraction/**)e, emdeny,Write(.claude/**))Ambiente
Claude Code: 2.1.235 · Antivírus: nenhum além do nativo
.claude/settings.json,merge_strategies: deep-merge-json, presente no MANIFEST comobundle/.claude/settings.json(self_contained: true)O que o diagnóstico encontrou
1. As 3 regras de
allowsão duplicatas mortas. O bundle já entrega o parEdit(...)equivalente logo acima de cada
Write(...). Remover asWritenão muda comportamento nenhum —só cala o aviso. [ALTA]
2. A regra de
denynunca valeu.Write(.claude/**)está empermissions.deny— ou seja, obundle acredita proteger
.claude/, e não protege. Nunca protegeu, na versão atual do ClaudeCode. O aviso estava anunciando isso e passou despercebido. [ALTA]
3. Converter
Write(.claude/**)→Edit(.claude/**)é a correção ERRADA. Se essa proibiçãopassar a valer de verdade, quebra dois caminhos do próprio framework:
/sinkra-create-skill(Forja) — o stage-runnersinkra-creator-gerartem como boundarydeclarado "escreve SÓ
.claude/skills/+.sinkra/forge/". Com o deny ativo, a Forja nãomaterializa skill nenhuma.
/cohort-bootstrap— reescreve.claude/inteiro por definição.A correção segura é remover a linha (ela já é inerte hoje, então remover é no-op de
comportamento), ou substituí-la por um deny estreito que não cubra
.claude/skills/**. [ALTA]4. O aluno não consegue consertar isso sozinho de forma durável. Em
sinkra-os@3.8.0/lib/merge-engine.js,deepMergeJsonresolvekindporrp.endsWith('settings.json')→'settings'(linha 260), e nesse ramo faz:permissionsé bundle-wins, sobrescrita integral — não é união. Logo, qualquer correção que oaluno (ou nós) faça no
.claude/settings.jsondo projeto é apagada no próximosinkra-os install/update, e o aviso volta. O único conserto durável é no bundle. [ALTA]5. Segunda fonte do mesmo defeito, e desatualizada. O template usado pelo
/cohort-bootstrap(
.claude/skills/cohort-bootstrap/templates/.claude/settings.json) tem as mesmas 3 regras mortase além disso está em regime antigo:
SINKRA_VERSION: "v4"e libera.aiox/**em vez de.sinkra/**. Ou seja, re-scaffoldar hoje entrega permissões que não correspondem às pastas que oV5 realmente usa. [ALTA]
Passos para reproduzir
sinkra-os install)..claude/settings.jsonpara remover as regrasWrite(...)→ aviso some.sinkra-os installde novo →permissionsé sobrescrita pelo bundle → aviso volta.Correção sugerida (no bundle)
bundle/.claude/settings.json:Write(...)deallow(os paresEdit(...)já existem)Write(.claude/**)dedeny— não convertê-la paraEdit(...)(ver item 3)Bash(node:*,npm:*)emBash(node:*)+Bash(npm:*)— vírgula dentro de uma regra sónão é a sintaxe documentada [MÉDIA — não emite aviso, mas é suspeito de não casar]
E aplicar a mesma correção ao template do
cohort-bootstrap, junto com o refresh v4→v5(
.aiox/**→.sinkra/**).Classificação [Confiança: ALTA]
bug — do bundle
sinkra-os, não do Cockpit. Duas consequências independentes: ruído em 100%das aberturas de sessão de 100% dos alunos (o primeiro contato com o produto), e uma regra de
governança que o framework acredita ter e não tem. Não é auto-corrigível pelo aluno por causa do
bundle-wins em
permissions.Labels sugeridas:
bug,os:both,severity:minor(não tenho permissão de triage no repo para aplicá-las na criação)