Sintoma
Bootstrap do LAG (init → project → import → import-stories) num projeto real (monorepo: workspace Rust em <workspace>/ com 15 crates + frontend Next.js + docs) produz um grafo onde a camada de dependências fica quase vazia e a camada de stories fica 100% vazia — e o caminho "óbvio" de contornar cria um segundo banco silencioso. Três defeitos verificados ao vivo, com repro exata.
Ambiente
- OS: Windows 11 Pro (26200) · Cockpit v0.11.1 ·
aiox-core lag schema v5
- Projeto: monorepo git,
Cargo.toml do workspace em <workspace>/ (não na raiz), stories em layout flat docs/stories/*.md
Achado A — raiz derivada do cwd fragmenta o banco silenciosamente
lag import (e a família [root] default: cwd) resolve a raiz do projeto pelo diretório corrente, não pelo toplevel do git. Rodar lag import de dentro de <workspace>/ criou um segundo lag.db em <workspace>/.aiox/lag/ — sem aviso, sem erro. Num monorepo, cada subdiretório onde alguém rodar um verbo vira um grafo separado, e o usuário acredita estar alimentando um só.
Repro: cd <repo>/<workspace> && aiox-core lag import → ls <workspace>/.aiox/lag/ mostra o banco novo.
Sugestão: resolver a raiz via git rev-parse --show-toplevel (ou walk-up até um .aiox/ existente), e/ou avisar explicitamente ao criar um banco novo fora da raiz do git.
Achado B — discovery_scope: root_only deixa o coração do monorepo fora do grafo
Os importers de manifest só procuram na raiz. Resultado no projeto real: importer-js-package-json achou o package.json da raiz (4 nós), mas importer-rust-cargo-toml reportou manifest_found: false — o workspace de 15 crates (o produto em si) não entra no grafo de dependências. Combinado com o Achado A, o usuário fica sem saída: ou perde o workspace, ou fragmenta o banco.
Repro: aiox-core lag import na raiz de um repo com Cargo.toml só em subdiretório → manifest_found: false.
Sugestão: discovery recursiva (com denylist de node_modules/target) ou flag de escopo explícita que escreva no banco da raiz.
Achado C — flag desconhecida é engolida e o verbo executa (--help roda o import)
aiox-core lag import --help executou o import em vez de imprimir o uso. Em verbo de leitura é inócuo; o LAG tem gc apply (arquivamento com aprovação humana) — flag desconhecida executando o verbo é a mesma família da #76 (conductor loop --help) e vira acidente em verbo destrutivo.
Repro: aiox-core lag import --help → executa e retorna o JSON do import.
Sugestão: rejeitar flags desconhecidas com exit≠0 + suportar --help por verbo (o lag sem verbo já imprime um uso excelente — é só rotear).
Achado menor (documentação) — import-stories só suporta o layout canônico
import-stories procura docs/epics/*/stories/*.md; projetos com layout flat (docs/stories/*.md) recebem stories_scanned: 0 sem indicação do porquê. Não é pedido de suporte ao layout flat — só que o output diga o path esperado quando encontrar zero, para o usuário não achar que o grafo está quebrado.
Classificação [Confiança: ALTA — os 3 principais reproduzidos ao vivo, na sequência, no mesmo host]
Bug (A, C) + melhoria (B, menor) — o LAG funciona como projetado em repo de raiz única; em monorepo os Achados A+B o tornam quase inoperante, e o C é risco latente de segurança operacional.
Sintoma
Bootstrap do LAG (
init→project→import→import-stories) num projeto real (monorepo: workspace Rust em<workspace>/com 15 crates + frontend Next.js + docs) produz um grafo onde a camada de dependências fica quase vazia e a camada de stories fica 100% vazia — e o caminho "óbvio" de contornar cria um segundo banco silencioso. Três defeitos verificados ao vivo, com repro exata.Ambiente
aiox-core lagschema v5Cargo.tomldo workspace em<workspace>/(não na raiz), stories em layout flatdocs/stories/*.mdAchado A — raiz derivada do cwd fragmenta o banco silenciosamente
lag import(e a família[root] default: cwd) resolve a raiz do projeto pelo diretório corrente, não pelo toplevel do git. Rodarlag importde dentro de<workspace>/criou um segundolag.dbem<workspace>/.aiox/lag/— sem aviso, sem erro. Num monorepo, cada subdiretório onde alguém rodar um verbo vira um grafo separado, e o usuário acredita estar alimentando um só.Repro:
cd <repo>/<workspace> && aiox-core lag import→ls <workspace>/.aiox/lag/mostra o banco novo.Sugestão: resolver a raiz via
git rev-parse --show-toplevel(ou walk-up até um.aiox/existente), e/ou avisar explicitamente ao criar um banco novo fora da raiz do git.Achado B —
discovery_scope: root_onlydeixa o coração do monorepo fora do grafoOs importers de manifest só procuram na raiz. Resultado no projeto real:
importer-js-package-jsonachou opackage.jsonda raiz (4 nós), masimporter-rust-cargo-tomlreportoumanifest_found: false— o workspace de 15 crates (o produto em si) não entra no grafo de dependências. Combinado com o Achado A, o usuário fica sem saída: ou perde o workspace, ou fragmenta o banco.Repro:
aiox-core lag importna raiz de um repo comCargo.tomlsó em subdiretório →manifest_found: false.Sugestão: discovery recursiva (com denylist de
node_modules/target) ou flag de escopo explícita que escreva no banco da raiz.Achado C — flag desconhecida é engolida e o verbo executa (
--helproda o import)aiox-core lag import --helpexecutou o import em vez de imprimir o uso. Em verbo de leitura é inócuo; o LAG temgc apply(arquivamento com aprovação humana) — flag desconhecida executando o verbo é a mesma família da #76 (conductor loop --help) e vira acidente em verbo destrutivo.Repro:
aiox-core lag import --help→ executa e retorna o JSON do import.Sugestão: rejeitar flags desconhecidas com exit≠0 + suportar
--helppor verbo (olagsem verbo já imprime um uso excelente — é só rotear).Achado menor (documentação) —
import-storiessó suporta o layout canônicoimport-storiesprocuradocs/epics/*/stories/*.md; projetos com layout flat (docs/stories/*.md) recebemstories_scanned: 0sem indicação do porquê. Não é pedido de suporte ao layout flat — só que o output diga o path esperado quando encontrar zero, para o usuário não achar que o grafo está quebrado.Classificação [Confiança: ALTA — os 3 principais reproduzidos ao vivo, na sequência, no mesmo host]
Bug (A, C) + melhoria (B, menor) — o LAG funciona como projetado em repo de raiz única; em monorepo os Achados A+B o tornam quase inoperante, e o C é risco latente de segurança operacional.