As leis que valem em TODO pacote: Result fail-closed, plano determinístico, append-only + dedupe, dry-run por default, dupla trava de gasto, symlinks que ninguém segue e contagens que ninguém digita. Se você opera o Alembic, isto aqui é reflexo, não consulta.
Baseline do spec: pnpm -r typecheck && pnpm -r build && node scripts/safe-test.mjs pnpm -w test — 200 arquivos *.test.ts, 1.834 testes verdes (pré-#159). Âncoras de código citadas em cada explicação.
Invariante não é estilo: é o que continua verdade quando você não está olhando. No Alembic são sete e todas apontam para o mesmo lado — na dúvida, o sistema NÃO age: não lança, não gasta, não escreve, não duplica, não inventa número.
Pense como… a fiação de um prédio: o disjuntor (fail-closed) desarma ANTES do incêndio, e ninguém "confia" que o eletricista lembrou — a régua desarma sozinha. Onde quebra: disjuntor desarmado avisa com escuro; aqui, alguns desarmes terminam com exit 0 — por isso o quiz.
# o baseline que prova a casa em pé (SEMPRE via safe-test) pnpm -r typecheck && pnpm -r build && node scripts/safe-test.mjs pnpm -w test # leia os invariantes na fonte sed -n '1,40p' packages/contracts/src/result.ts # Result fail-closed grep -n "isDirectory" packages/hermes/src/skills/skill-store.ts # :89 — não segue symlink grep -rn "dryRun ?? true" packages/marketing-factory/src/ads.ts # :173 — preview por default
Placar cumulativo no fim do bloco. Cada explicação cita a âncora — se discordar de um gabarito, vá à âncora, não à memória.
Qual é o contrato de erro do código de biblioteca no monorepo?
Result<T, Error> from @alembic/contracts; avoid throwing in library code". Nos adapters, runWithGuards converte qualquer exceção em failure tipado antes de subir — o chamador nunca vê throw. Âncora: packages/contracts + packages/adapters (spine de guards).O que acontece com um alembic.plan.ts que chama Date.now()?
Date.now() num plan e rode alembic run --goal GOAL.md --plan alembic.plan.ts --yes; o run falha com erro de não-determinismo (é o item "Non-determinism error" do troubleshooting canônico).Você roda alembic import <sessões> --write duas vezes. O que a segunda rodada escreve?
packages/hermes/src/memory/transcript-import.ts:74 — `${prefix}-${agent}-${session.id}-${index}`), então re-importar não duplica. O mesmo vale para o embed-index (dedupe-by-chunk_id) e para os records de distill.Qual é o comportamento DEFAULT de employee run, import e marketing video?
employee run imprime o prompt que SERIA enviado; import lista o que SERIA escrito; marketing video imprime só o custo estimado. --online gateia a chamada, --write gateia a escrita, --approve --yes gateiam o gasto — nunca um default destrava outro.Na marketing factory, o que UMA flag sozinha (--approve OU --yes) compra?
packages/marketing-factory/src/ads.ts:173 (dryRun = opts.dryRun ?? true) e :245 (if (dryRun || !opts.approve) → caminho $0). Uma flag NUNCA gasta — é o mesmo desenho do MCP de marketing (dryRun:false E approve:true).Por que uma skill de plugin symlinkada sob a base NÃO entra no import --skills?
packages/hermes/src/skills/skill-store.ts:89 — if (!entry.isDirectory) continue;. Um symlink não é diretório para o FsPort, então só <name>/SKILL.md REAIS são importados. O walkCorpus da ingestão tem o mesmo comportamento — symlink nunca é seguido.Os docs dizem 32 comandos; o USAGE exporta 33. Qual é a correção canônica?
scripts/derive-counts.mjs (PR #158) → a PRIMEIRA execução pegou drift vivo (docs 32; real 33 comandos / 47 formas). Contagem à mão NUNCA — a verdade de hoje é 33/47 porque foi derivada, não digitada.Qual é o jeito canônico de rodar a suíte inteira sem deixar órfãos tinypool?
safe-test.mjs mata o GRUPO de processos e faz sweep. Por isso o baseline do spec é pnpm -r typecheck && pnpm -r build && node scripts/safe-test.mjs pnpm -w test — decore com o safe-test dentro.pnpm --filter @alembic/novo test sai verde em milissegundos. O que você confere primeiro?
vitest.config.ts próprio (com setupFiles em caminho absoluto) pode "passar" sem executar teste algum — exit 0, zero testes. Confira o CONTADOR de testes na saída, nunca só a cor. A suíte real hoje: 200 arquivos de teste, 1.834 verdes.Após checkout de branch que ADICIONA dep workspace, tsc falha com Cannot find module @alembic/X — mas o vitest passa. Qual é o movimento?
pnpm install. Depois, pnpm -r build para os dependentes enxergarem os .d.ts novos. CI é imune (instala do zero); sua máquina não. Verde do vitest aqui é o falso amigo.