Files
wanderandClaude Fable 5.1 a4b1374fad Linha de OS: tabela linhas-os.yaml como fallback quando o SD.md não declara
Decisão de 2026-09-04, revendo a de 2026-09-03 (sem de-para): o .md continua
mandando, e a tabela contrato/linhas-os.yaml (OS Mãe × linha × item) só entra
quando o entregável não declara `linha_os`. Linha declarada vai como está e não
é conferida contra a tabela; existência/item/status seguem sendo do banco.

- caminhos.LINHAS_OS; regras_sd: Canonico(itens, linhas_os), carregar_linhas_os
  (arquivo ausente = fallback desligado), preparar_linhas_os (valida: formato,
  linha repetida, dois `padrao`, `padrao` não booleano) e linha_da_tabela.
- exporta_sd: ausente → padrão do item; 2+ candidatas sem padrão → pendência
  nomeando-as; item fora da tabela → pendência. CLI informa quantas linhas
  vieram da tabela.
- app: sessao.adotar_linhas_da_tabela grava a linha no frontmatter da sessão
  com comentário de origem, para o Salvar SD.md deixar a SD autodeclarada;
  a tela marca `tabela` e mostra a data da tabela.
- testes: SD18, SD27, SD31–36 passam a exportar de saída; SD10 só PO+objetivo;
  casos sintéticos para tabela ausente, ambígua, sem o item e malformada.
- deploy: linhas-os.yaml vive em clientes/ (gitignored) — vai por scp ao volume.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-04 20:22:15 -03:00

57 lines
2.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Caminhos canônicos do repositório — o único lugar que sabe onde a árvore está.
Mudança de estrutura é mudança aqui, e em mais lugar nenhum. A lição veio da
reorganização V0: eram 103 referências de caminho espalhadas por scripts,
Makefile e harness, e mover uma pasta quebrava tudo entre a mudança e a
reescrita.
"""
from pathlib import Path
RAIZ = Path(__file__).resolve().parent.parent
CLIENTE = RAIZ / "clientes" / "ses-mg"
CONTRATO = CLIENTE / "contrato"
GOVERNANCA = CLIENTE / "governanca"
PROJETOS = CLIENTE / "projetos"
ENTRADA = CLIENTE / "_entrada"
RELATORIOS = CLIENTE / "relatorios"
COMUNICACOES = CLIENTE / "comunicacoes"
METODOS = RAIZ / "metodos"
# _derivados/ é resultado, nunca fonte: gitignored, regenerável por make derivar.
DERIVADOS = RAIZ / "_derivados"
ITENS = CONTRATO / "itens.yaml"
# Fallback de linha de OS (OS Mãe × linha × item). OPCIONAL: ausente, o
# exportador exige `linha_os` declarado no SD.md, como antes de 2026-09-04.
LINHAS_OS = CONTRATO / "linhas-os.yaml"
# Visões GERADAS a partir das SDs (inversão da V0, 13/08/2026). Quem lê
# portfólio, carteira ou catálogo lê o resultado de `make derivar` — os
# mantidos à mão estão congelados em governanca/levantamentos/.
PORTFOLIO = DERIVADOS / "portfolio.yaml"
CARTEIRA = DERIVADOS / "carteira.yaml"
CATALOGO = DERIVADOS / "catalogo.md"
NUMERACAO = GOVERNANCA / "numeracao.yaml"
TRANSVERSAL = GOVERNANCA / "transversal.yaml"
TEMPLATE_SD = PROJETOS / "_template" / "SD.md"
# Modelo Word do material de leitura prévia (`make leitura-previa`): layout da
# nota técnica com logo no cabeçalho. Vive em metodos/modelos/ — cópia neutra;
# a original é evidência da P5·SD24 e evidência não é dependência de script.
MODELO_NOTA_TECNICA = METODOS / "modelos" / "nota-tecnica.docx"
# Projeção financeira: gerada em _derivados/, congelada datada em comunicacoes/.
PROJECAO_HTML = DERIVADOS / "projecao-executiva.html"
APRESENTACOES = COMUNICACOES / "apresentacoes"
def sds_reais():
"""Todos os SD.md sob projetos/*/sds/.
O template vive em projetos/_template/, fora de qualquer */sds/* — é o que
o mantém fora desta varredura por construção, em todos os consumidores de
uma vez. Era ele contaminando a varredura de faturamento na árvore antiga.
"""
return sorted(PROJETOS.glob("*/sds/*/SD.md"))