Skip to content

sinkra-os: bundle entrega 4 regras de permissão mortas Write(path) — aviso em toda abertura de sessão, e o deny de .claude/** nunca valeu #71

Description

@lk1407

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

  1. Instalar/atualizar um projeto do Cohort pelo bundle (sinkra-os install).
  2. Abrir qualquer sessão Claude Code (2.1.x) na raiz do projeto — pane do Cockpit ou terminal.
  3. As 4 linhas de aviso aparecem antes do primeiro turno. Em toda janela nova, sempre.
  4. Editar o .claude/settings.json para remover as regras Write(...) → aviso some.
  5. 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 denynã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)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions