Mineração de Sessões Claude Orientada por EvidênciasLição 2/8
Fronteira de evidência

Inventário sem abrir o arquivo

Percorra toda a árvore, classifique arquivos elegíveis e exclua symlinks sem ler um único registro.

U1 REAL: PROVENEXEMPLO SINTÉTICO · /demo-claude/
Árvore sintética do arquivo com arquivos incluídos e symlink excluído/demo-claude/raizalpha.jsonlprimarysubagents/agent-01.jsonlsubagentsubagents/journal.jsonlsubagent na U1misc/orphan.jsonlotherlinked.jsonl → alpha.jsonlexcluído
Árvore sintética do arquivo com arquivos incluídos e symlink excluído.
Ao final, você consegue
  • Classificar cada caminho da árvore sintética.
  • Explicar por que `lstat` é uma decisão de segurança.
  • Distinguir entrada ignorada de inventário com falha.
1

Modelo central

A U1 percorre diretórios recursivamente, mantém apenas arquivos regulares `.jsonl` e atribui uma de três classes. Arquivos na raiz são primary; qualquer caminho elegível abaixo de um segmento `subagents/` é subagent; arquivos aninhados residuais são other. Todo o resto é ignorado por política, não esquecido por acidente.

Modelo mental: É um registrador de museu contando caixas lacradas por sala, etiqueta, peso e data de modificação — sem abrir nenhuma caixa.

`lstat` observa um symlink como symlink; não percorre o destino. Nomes de diretório e entradas finais são ordenados com comparador textual explícito. Agregados reportam arquivos, bytes exatos e intervalos de mtime do filesystem com limites nulos para classes vazias.

2

Tabela de fronteiras

PerguntaFronteira observadaDonoVeredito
alpha.jsonlJSONL regular na raizprimaryIncluir
subagents/agent-01.jsonlAninhado abaixo de subagentssubagentIncluir
misc/orphan.jsonlJSONL aninhado residualotherIncluir
linked.jsonlSymlinkNenhumaExcluir
Fonte local primáriapackages/sessions/src/claude-inventory.ts
if (metadata.kind === 'directory') walk(path);
if (metadata.kind !== 'file' || !name.endsWith('.jsonl')) continue;
entries.sort((a, b) => compareText(a.relativePath, b.relativePath));
primary: JSONL elegível diretamente na raiz.primary
JSONL elegível diretamente na raiz.
subagent: Caminho elegível contendo um segmento `subagents`.subagent
Caminho elegível contendo um segmento `subagents`.
other: JSONL aninhado elegível fora de subagents.other
JSONL aninhado elegível fora de subagents.
lstat: Observar o objeto do caminho sem seguir um symlink.lstat
Observar o objeto do caminho sem seguir um symlink.
3

Laboratório sintético

Classifique um caminho sintético.

4

Recuperação e feedback

Preveja antes de revelar

Como `subagents/journal.jsonl` é classificado na U1?

Como `subagent`. A classe explícita journal aparece apenas na U2.

Cartões de recuperação

Cartões de recuperaçãoprimaryAtive para virar
primaryJSONL elegível diretamente na raiz.
Cartões de recuperaçãosubagentAtive para virar
subagentCaminho elegível contendo um segmento `subagents`.
Cartões de recuperaçãootherAtive para virar
otherJSONL aninhado elegível fora de subagents.
Cartões de recuperaçãolstatAtive para virar
lstatObservar o objeto do caminho sem seguir um symlink.

Teste seu modelo

O que um diretório vazio válido retorna?

Vazio é um resultado verdadeiro; raiz ausente ou não diretório falha.
5

Ledger de evidências

Contrato · PROVENSCOPE + código-fonte
Implementação · PROVENcódigo + testes focados
Fronteira compilada · PROVENrecibo U1 registrado
Sonda independente · PROVENcontagens/bytes U1 coincidem

Autoridade: docs/fable-session-mining/LOOP-LOG.md. Testes nunca promovem um recibo real ausente.