@shiftleftpt/sbd-toe-mcp 0.20.0-beta.47 → 0.20.0-beta.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/consumed-bundle.json +14 -13
  2. package/data/entities/proportionality.json +3 -3
  3. package/data/entities/sdlc_integration.json +2192 -176
  4. package/data/publish/indexes/canonical_chunks.jsonl +4907 -4907
  5. package/data/publish/indexes/chunk_entity_mentions.jsonl +64 -4
  6. package/data/publish/indexes/chunk_relation_hints.jsonl +5 -0
  7. package/data/publish/indexes/cross_layer_referrals.jsonl +12 -0
  8. package/data/publish/indexes/mcp_chunks.jsonl +175 -175
  9. package/data/publish/indexes/publication_manifest.json +11 -11
  10. package/data/publish/ontology/declared-absences-ledger.yaml +15 -0
  11. package/data/publish/ontology/sbdtoe-ontology.yaml +55 -4
  12. package/data/publish/overlay/framework_overlay_index.json +10 -0
  13. package/data/publish/overlay/overlay_mappings.jsonl +12 -0
  14. package/data/publish/runtime/artifact_requirements.json +22 -3
  15. package/data/publish/runtime/artifacts.json +9 -4
  16. package/data/publish/runtime/assignments.json +8138 -5688
  17. package/data/publish/runtime/controls.json +2 -1
  18. package/data/publish/runtime/decision_involvements.json +349 -41
  19. package/data/publish/runtime/deterministic_manifest.json +6 -6
  20. package/data/publish/runtime/evidence_patterns.json +53 -2
  21. package/data/publish/runtime/phases.json +10 -7
  22. package/data/publish/runtime/requirement_control_links.json +40 -2
  23. package/data/publish/runtime/requirements.json +20 -1
  24. package/data/publish/runtime/roles.json +40 -0
  25. package/data/publish/runtime/user_stories.json +100 -49
  26. package/data/publish/runtime/v1/manual_maturity_progression.jsonl +336 -336
  27. package/data/publish/runtime/v1/manual_rastreabilidade.jsonl +1105 -1105
  28. package/data/publish/runtime/v1/manual_threat_mitigation.jsonl +523 -523
  29. package/data/publish/runtime/v1/v1_manifest.json +5 -5
  30. package/data/publish/semantic/antipattern_authored_links.jsonl +31 -0
  31. package/data/publish/semantic/macro_processes.jsonl +1 -1
  32. package/data/publish/semantic/mp_edges.jsonl +1 -1
  33. package/data/publish/semantic/requirement_source_coverage.jsonl +2 -1
  34. package/data/reports/run_manifest.json +9 -9
  35. package/dist/serving/authored-antipattern-links.d.ts +20 -0
  36. package/dist/serving/authored-antipattern-links.js +109 -0
  37. package/dist/serving/authored-antipattern-links.js.map +1 -0
  38. package/dist/serving/declared-absences.d.ts +32 -1
  39. package/dist/serving/declared-absences.js +60 -9
  40. package/dist/serving/declared-absences.js.map +1 -1
  41. package/dist/tools/explain-topic.js +14 -0
  42. package/dist/tools/explain-topic.js.map +1 -1
  43. package/dist/tools/get-guide-by-role.js +28 -7
  44. package/dist/tools/get-guide-by-role.js.map +1 -1
  45. package/dist/tools/ontology-loader.d.ts +4 -0
  46. package/dist/tools/ontology-loader.js +7 -0
  47. package/dist/tools/ontology-loader.js.map +1 -1
  48. package/package.json +3 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "artifact_type": "v1_runtime_surface_manifest",
3
3
  "build": {
4
- "generated_at": "2026-09-08T17:29:47.636244+00:00",
4
+ "generated_at": "2026-09-09T23:01:19.600250+00:00",
5
5
  "generator": "sbdtoe_indexing.workflows.build_v1_runtime_surface"
6
6
  },
7
7
  "drift_note": "Counts sourced from slice contracts (authoritative actual). Declared sum from consolidated index. Drift concentrated in working_contract slices (notably ASC-09 RPR); upstream V1 enumeration incomplete in some slices. Flagged for Archon visibility via Step 8 delivery handover.",
@@ -37,15 +37,15 @@
37
37
  },
38
38
  "manual_maturity_progression": {
39
39
  "path": "v1/manual_maturity_progression.jsonl",
40
- "sha256": "fe9fbe0ec7e72c5f6803ea909202d47ad7c696b5876f6bad211950c05d4b4d62"
40
+ "sha256": "6fedec3111ba85cbb322f67d652bddf9d090172df17511cb9a97333d87a90f2b"
41
41
  },
42
42
  "manual_rastreabilidade": {
43
43
  "path": "v1/manual_rastreabilidade.jsonl",
44
- "sha256": "fcb4eaa55cf5e16c9f3d14e427f7b1d34fcfe6e25cd82436e6352421fda81b4c"
44
+ "sha256": "657a2e6750c07d4e57af74d39d9d473e112a944bb3bf39716ea0a32c58e646f6"
45
45
  },
46
46
  "manual_threat_mitigation": {
47
47
  "path": "v1/manual_threat_mitigation.jsonl",
48
- "sha256": "296e1a91f51ee824f37f8f6a7d494c299defad3c701d14804f2bd6ce7251eed7"
48
+ "sha256": "9b32e6cc6c6d45baa26dccc052ebfbfe41f0ddb7cd7f85928ed8d5cd38dac4a6"
49
49
  },
50
50
  "mechanisms": {
51
51
  "path": "v1/mechanisms.json",
@@ -102,7 +102,7 @@
102
102
  "expected_iter3_commit_sha": "71b9c029",
103
103
  "expected_run2_commit_sha": "455124a1",
104
104
  "format_note": "run-2 5-section structure (Manual ontology V2 entities + Core-mapped + Manual-only + Out-of-AppSec + Future-work). Substrate refs surface in ES grounding column inline (`<Source>: <ref1>, <ref2>; ... ; + N more sources`). §26 methodology label per Core-mapped row (Explícito/Semântico/Parcial/Reparação/Gap/Scope boundary). Manual V2 entities indexed per chapter.",
105
- "manual_commit_sha": "89ac3ba8f03002054033636b9a685729c1e0a590",
105
+ "manual_commit_sha": "0576e914d4c933ddc1af25cb2c5570dd2afcf60f",
106
106
  "manual_iter_anchor": "run-2"
107
107
  },
108
108
  "manual_threat_mitigation": {
@@ -0,0 +1,31 @@
1
+ {"counts": {"authored_absence_blocks": 9, "authored_absence_requirement": 4, "authored_absence_threat": 6, "blocks": 30, "matched_current_catalog": 5, "materializes_links": 24, "unmatched_current_catalog": 25, "unresolved_requirement_ids": 0, "unresolved_threat_ids": 0, "violates_links": 26}, "epistemic": "AUTORIA (marcador **Relaciona.** do Manual v1.14.0) — camada distinta da pontuada (antipattern_*_links scored, que se mantém). O casamento com as 26 entidades antipadrão actuais é DECLARADO por bloco; a reconciliação dos conjuntos é triagem própria, posterior (dispatch do Orchestrator).", "grammar": {"materializa": "antipadrão→ameaça (autorada)", "sem_x_ligavel": "AUSÊNCIA AUTORADA do lado declarado — o Author recusa ligação fraca (instrução do lead); nunca ilegível", "viola": "antipadrão→requisito (autorada)"}, "layer": "antipattern_authored_links", "profiles": ["consult", "guide"], "record_type": "layer_manifest"}
2
+ {"anchor": "03-threat-modeling/addon/02-riscos-processo-threat-modeling.md:110", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `THR-007`; materializa `MT-045`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-045"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Resultados plausíveis mas incorretos", "subject_slug": "resultados-plausiveis-mas-incorretos", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["THR-007"]}
3
+ {"anchor": "03-threat-modeling/addon/02-riscos-processo-threat-modeling.md:33", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `THR-003`; materializa `MT-039`.", "matched_antipattern_id": "sem:antipattern:omissao-estrutural-de-ameacas", "matches_current_catalog": true, "materializes": ["MT-039"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Omissão estrutural de ameaças", "subject_slug": "omissao-estrutural-de-ameacas", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["THR-003"]}
4
+ {"anchor": "03-threat-modeling/addon/02-riscos-processo-threat-modeling.md:48", "authored_absence": {"requirement": true, "threat": false}, "clause": "Sem requisito ligável no catálogo actual; materializa `MT-043`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-043"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Enviesamento de perspetiva", "subject_slug": "enviesamento-de-perspetiva", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": []}
5
+ {"anchor": "03-threat-modeling/addon/02-riscos-processo-threat-modeling.md:68", "authored_absence": {"requirement": false, "threat": true}, "clause": "Viola `THR-004`; sem ameaça ligável no catálogo actual.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": [], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Confusão entre análise intermédia e decisão formal", "subject_slug": "confusao-entre-analise-intermedia-e-decisao-formal", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["THR-004"]}
6
+ {"anchor": "03-threat-modeling/addon/02-riscos-processo-threat-modeling.md:82", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `THR-006`; materializa `MT-049`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-049"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Dependência acrítica de modelos prévios", "subject_slug": "dependencia-acritica-de-modelos-previos", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["THR-006"]}
7
+ {"anchor": "03-threat-modeling/addon/02-riscos-processo-threat-modeling.md:95", "authored_absence": {"requirement": true, "threat": true}, "clause": "Sem requisito nem ameaça ligáveis no catálogo actual.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": [], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Uso não controlado de informação sensível", "subject_slug": "uso-nao-controlado-de-informacao-sensivel", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": []}
8
+ {"anchor": "04-arquitetura-segura/addon/08-riscos-processo-arquitetura.md:109", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `ARC-007`; materializa `MT-064`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-064"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Reutilização acrítica de arquiteturas anteriores", "subject_slug": "reutilizacao-acritica-de-arquiteturas-anteriores", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["ARC-007"]}
9
+ {"anchor": "04-arquitetura-segura/addon/08-riscos-processo-arquitetura.md:122", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `ARC-013`; materializa `MT-069`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-069"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Divergência entre arquitetura documentada e arquitetura real", "subject_slug": "divergencia-entre-arquitetura-documentada-e-arquitetura-real", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["ARC-013"]}
10
+ {"anchor": "04-arquitetura-segura/addon/08-riscos-processo-arquitetura.md:30", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `ARC-004`; materializa `MT-065`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-065"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Arquitetura como desenho vs arquitetura como decisão", "subject_slug": "arquitetura-como-desenho-vs-arquitetura-como-decisao", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["ARC-004"]}
11
+ {"anchor": "04-arquitetura-segura/addon/08-riscos-processo-arquitetura.md:43", "authored_absence": {"requirement": false, "threat": true}, "clause": "Viola `ARC-004`; sem ameaça ligável no catálogo actual.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": [], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Decisões arquiteturais sem responsável explícito", "subject_slug": "decisoes-arquiteturais-sem-responsavel-explicito", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["ARC-004"]}
12
+ {"anchor": "04-arquitetura-segura/addon/08-riscos-processo-arquitetura.md:58", "authored_absence": {"requirement": false, "threat": true}, "clause": "Viola `ARC-004`; sem ameaça ligável no catálogo actual.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": [], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Dependências externas tratadas como infraestrutura neutra", "subject_slug": "dependencias-externas-tratadas-como-infraestrutura-neutra", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["ARC-004"]}
13
+ {"anchor": "04-arquitetura-segura/addon/08-riscos-processo-arquitetura.md:77", "authored_absence": {"requirement": false, "threat": true}, "clause": "Viola `ARC-008`; sem ameaça ligável no catálogo actual.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": [], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Fluxos de dados implícitos não modelados", "subject_slug": "fluxos-de-dados-implicitos-nao-modelados", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["ARC-008"]}
14
+ {"anchor": "04-arquitetura-segura/addon/08-riscos-processo-arquitetura.md:96", "authored_absence": {"requirement": true, "threat": false}, "clause": "Sem requisito ligável no catálogo actual; materializa `MT-062`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-062"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Componentes opacos ou não determinísticos", "subject_slug": "componentes-opacos-ou-nao-deterministicos", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": []}
15
+ {"anchor": "04-arquitetura-segura/intro.md:110", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `ARC-010`; materializa `MT-059`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-059"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "3 Caveats ou limitações da prescrição", "subject_slug": "3-caveats-ou-limitacoes-da-prescricao", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["ARC-010"]}
16
+ {"anchor": "04-arquitetura-segura/intro.md:111", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `ARC-005`; materializa `MT-046`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-046"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "3 Caveats ou limitações da prescrição", "subject_slug": "3-caveats-ou-limitacoes-da-prescricao", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["ARC-005"]}
17
+ {"anchor": "04-arquitetura-segura/intro.md:112", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `CLA-007`; materializa `MT-066`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-066"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "3 Caveats ou limitações da prescrição", "subject_slug": "3-caveats-ou-limitacoes-da-prescricao", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["CLA-007"]}
18
+ {"anchor": "07-cicd-seguro/addon/10-riscos-processo-cicd.md:108", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `CIC-001`; materializa `MT-130`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-130"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Evidência mínima exigida", "subject_slug": "evidencia-minima-exigida", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["CIC-001"]}
19
+ {"anchor": "07-cicd-seguro/addon/10-riscos-processo-cicd.md:148", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `CIC-004`; materializa `MT-126`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-126"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Evidência mínima exigida", "subject_slug": "evidencia-minima-exigida", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["CIC-004"]}
20
+ {"anchor": "07-cicd-seguro/addon/10-riscos-processo-cicd.md:188", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `CIC-005`; materializa `MT-129`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-129"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Evidência mínima exigida", "subject_slug": "evidencia-minima-exigida", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["CIC-005"]}
21
+ {"anchor": "07-cicd-seguro/addon/10-riscos-processo-cicd.md:233", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `CIC-003`; materializa `MT-120`, `MT-131`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-120"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Evidência mínima exigida", "subject_slug": "evidencia-minima-exigida", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["CIC-003"]}
22
+ {"anchor": "07-cicd-seguro/addon/10-riscos-processo-cicd.md:269", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `CIC-011`; materializa `MT-128`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-128"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Evidência mínima exigida", "subject_slug": "evidencia-minima-exigida", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["CIC-011"]}
23
+ {"anchor": "09-containers-imagens/addon/09-risco-processo-imagens.md:103", "authored_absence": {"requirement": true, "threat": false}, "clause": "Sem requisito ligável no catálogo actual; materializa `MT-149`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-149"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "2 Ilusão de segurança por automação bem-sucedida", "subject_slug": "2-ilusao-de-seguranca-por-automacao-bem-sucedida", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": []}
24
+ {"anchor": "09-containers-imagens/addon/09-risco-processo-imagens.md:130", "authored_absence": {"requirement": false, "threat": true}, "clause": "Viola `CIC-004`; sem ameaça ligável no catálogo actual.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": [], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "3 Promoção automática entre ambientes", "subject_slug": "3-promocao-automatica-entre-ambientes", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["CIC-004"]}
25
+ {"anchor": "09-containers-imagens/addon/09-risco-processo-imagens.md:156", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `CNT-009`; materializa `MT-162`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-162"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "4 Proveniência verificada confiança concedida", "subject_slug": "4-proveniencia-verificada-confianca-concedida", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["CNT-009"]}
26
+ {"anchor": "09-containers-imagens/addon/09-risco-processo-imagens.md:183", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `CIC-005`; materializa `MT-155`, `MT-164`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-155"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "5 Ausência de rastreabilidade decisional", "subject_slug": "5-ausencia-de-rastreabilidade-decisional", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["CIC-005"]}
27
+ {"anchor": "09-containers-imagens/addon/09-risco-processo-imagens.md:75", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `CIC-011`; materializa `MT-128`.", "matched_antipattern_id": null, "matches_current_catalog": false, "materializes": ["MT-128"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "1 Confusão entre sinal automático e decisão", "subject_slug": "1-confusao-entre-sinal-automatico-e-decisao", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["CIC-011"]}
28
+ {"anchor": "12-monitorizacao-operacoes/intro.md:178", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `OPS-005`; materializa `MT-201`.", "matched_antipattern_id": "sem:antipattern:demasiados-alertas", "matches_current_catalog": true, "materializes": ["MT-201"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Demasiados alertas", "subject_slug": "demasiados-alertas", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["OPS-005"]}
29
+ {"anchor": "12-monitorizacao-operacoes/intro.md:179", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `OPS-001`; materializa `MT-202`.", "matched_antipattern_id": "sem:antipattern:logs-nao-estruturados", "matches_current_catalog": true, "materializes": ["MT-202"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Logs não estruturados", "subject_slug": "logs-nao-estruturados", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["OPS-001"]}
30
+ {"anchor": "12-monitorizacao-operacoes/intro.md:180", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `OPS-007`; materializa `MT-205`.", "matched_antipattern_id": "sem:antipattern:falta-de-integracao-com-irp", "matches_current_catalog": true, "materializes": ["MT-205"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Falta de integração com IRP", "subject_slug": "falta-de-integracao-com-irp", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["OPS-007"]}
31
+ {"anchor": "12-monitorizacao-operacoes/intro.md:181", "authored_absence": {"requirement": false, "threat": false}, "clause": "Viola `OPS-003`; materializa `MT-198`.", "matched_antipattern_id": "sem:antipattern:retencao-insuficiente", "matches_current_catalog": true, "materializes": ["MT-198"], "profiles": ["consult", "guide"], "record_type": "relaciona_block", "source_mode": "authored", "subject": "Retenção insuficiente", "subject_slug": "retencao-insuficiente", "unresolved_requirement_ids": [], "unresolved_threat_ids": [], "violates": ["OPS-003"]}
@@ -1,4 +1,4 @@
1
- {"adoption_order_rule": "ordem topológica do subconjunto dependency (feedback excluído por definição): MP-01 → {MP-02 ∥ MP-04} → MP-03 → MP-05; MP-02 e MP-04 são incomparáveis na fonte (declarado, não inferido).", "counts": {"consumption_records": 23, "dependency_pairs": 9, "feedback_pairs": 9, "ft_textual_refs": 11, "inter_mp_typed_pairs": 18, "macro_processes": 5, "path_edges": 22, "textual_path_endpoints": 7, "textual_refs_passed_through": 22}, "curation": {"adenda": "três segmentações + lacuna de fases (2026-09-06)", "curator": "archon-2026-09-06", "ratified_by": "programme-lead", "ratified_on": "2026-09-06", "source": "agentic/briefs/2026-09-06-archon-proposta-macro-processos.md"}, "edge_typing_rule": "consumo que aparece nas «Entradas» do MP consumidor ⇒ dependency; consumo que aparece nos «Gatilhos» do consumidor ou nas realimentações declaradas (fecho, laço, realimentar, «nos seus gatilhos») ⇒ feedback. Cada aresta vive em outputs[].consumed_by com o artefacto (via) e refs.", "erratum_vs_gate_map": "o mapa ratificado dizia 17 pares; na emissão a aplicação da regra ratificada à fonte encontrou a 18.ª — MP2→MP4 («threat model … consumido por MP4: risco aceite entra na cadeia de autoridade», CLA-007), tipada feedback porque não figura nas Entradas de MP4; declarada aqui, nunca silenciada.", "layer": "macro_processes", "measurement_refs_absence": {"absence_id": "ABS-010", "absence_type": "deferred", "debt_of": "ontology_model", "decided_on": "2026-08-30", "owner": "Archon", "statement": "Estrutura de medição F-01..F-04 / T-01..T-06 não modelada", "trigger": "ciclo do desenho de assurance"}, "model_note": "MacroProcess, KnowledgeBundle (capítulo) e SDLCPhase são TRÊS SEGMENTAÇÕES do mesmo substrato — agregações/percursos diferentes de olhar para o processo de desenvolvimento segundo SbD — e não níveis de uma hierarquia nem partições umas das outras; nenhuma relação entre as três se tipa como contenção. `MP → capítulos` é «percurso publicado», e é só isso. Os rótulos MP1–MP5 são ontology-owned (MP-0N); não são IDs de requisito.", "pins": {"manual_commit": "89ac3ba8f030", "sbdtoe_ontology_tag": "sbdtoe-ontology-v2.5"}, "profiles": ["consult", "guide"], "record_type": "layer_manifest", "ref_conventions": "refs com padrão [A-Z]{3}-\\d{3} / REQ-AGN-\\d{3} são Requirement ids validados; [A-Z]{3}-K\\d{2} são metric_id validados; US-nn@cc refere a user story nn do capítulo cc (validação na materialização, Codex); F-0n e T-0n são a estrutura de medição transversal do cap. 14 — refs textuais declaradas não-modeladas (lacuna para o ciclo de assurance); restantes refs são âncoras editoriais textuais.", "schema_version": "1.0", "sdlc_phase_traversal": {"absence": {"absence_id": "ABS-001", "absence_type": "out_of_scope", "decided_by": "programme-lead", "decided_on": "2026-09-07", "evidence": "«não há esse walkthrough possível. Um MP pode passar várias fases e as fases podem cruzar vários MPs» — relação N:M e parcial nos dois sentidos; o Manual publica percursos ao grão capítulo («fase» ocorre 1× no capítulo, na frase que nega a equivalência)", "note": "a derivação a partir de capítulos/assignments continua PROIBIDA (mantém macro_processes.sdlc_phase_traversal, cujo rótulo local unpublished_gap fica superseded por esta tipagem)", "statement": "Travessia MacroProcess ↔ SDLCPhase"}, "absence_source": "declared_absences (índice central prevalece; v2.6)", "decided_by": "programme-lead 2026-09-06 (adenda à ratificação)", "reason": "a travessia MP↔fase existe mas é PARCIAL e NÃO PUBLICADA: um MP atravessa várias fases e não necessariamente na íntegra; uma fase pode conter partes de vários MP. O Manual publica por MP o percurso de CAPÍTULOS, nunca um percurso de fases («fase» ocorre uma única vez no capítulo, na frase que nega a equivalência). Lacuna declarada — NÃO derivar a travessia a partir de capítulos/assignments.", "status": "unpublished_gap"}, "traversal_assertions": {"mp_consumes_from": {"does_not_assert": "ordem linear única; equivalência dependency↔feedback", "source": "outputs[].consumed_by verbatim + regra Entradas/Gatilhos", "verb": "consome"}, "mp_traverses_bundle": {"does_not_assert": "contenção; ordem entre capítulos fora do percurso", "source": "percursos publicados (macro-processos.md)", "verb": "atravessa"}}, "validation": {"complete_instances": "5/5", "dependency_dag": "{MP-01} -> {MP-02 ∥ MP-04} -> {MP-03} -> {MP-05}", "mp02_mp04_incomparable": true, "refs_resolved": true}}
1
+ {"adoption_order_rule": "ordem topológica do subconjunto dependency (feedback excluído por definição): MP-01 → {MP-02 ∥ MP-04} → MP-03 → MP-05; MP-02 e MP-04 são incomparáveis na fonte (declarado, não inferido).", "counts": {"consumption_records": 23, "dependency_pairs": 9, "feedback_pairs": 9, "ft_textual_refs": 11, "inter_mp_typed_pairs": 18, "macro_processes": 5, "path_edges": 22, "textual_path_endpoints": 7, "textual_refs_passed_through": 22}, "curation": {"adenda": "três segmentações + lacuna de fases (2026-09-06)", "curator": "archon-2026-09-06", "ratified_by": "programme-lead", "ratified_on": "2026-09-06", "source": "agentic/briefs/2026-09-06-archon-proposta-macro-processos.md"}, "edge_typing_rule": "consumo que aparece nas «Entradas» do MP consumidor ⇒ dependency; consumo que aparece nos «Gatilhos» do consumidor ou nas realimentações declaradas (fecho, laço, realimentar, «nos seus gatilhos») ⇒ feedback. Cada aresta vive em outputs[].consumed_by com o artefacto (via) e refs.", "erratum_vs_gate_map": "o mapa ratificado dizia 17 pares; na emissão a aplicação da regra ratificada à fonte encontrou a 18.ª — MP2→MP4 («threat model … consumido por MP4: risco aceite entra na cadeia de autoridade», CLA-007), tipada feedback porque não figura nas Entradas de MP4; declarada aqui, nunca silenciada.", "layer": "macro_processes", "measurement_refs_absence": {"absence_id": "ABS-010", "absence_type": "deferred", "debt_of": "ontology_model", "decided_on": "2026-08-30", "owner": "Archon", "statement": "Estrutura de medição F-01..F-04 / T-01..T-06 não modelada", "trigger": "ciclo do desenho de assurance"}, "model_note": "MacroProcess, KnowledgeBundle (capítulo) e SDLCPhase são TRÊS SEGMENTAÇÕES do mesmo substrato — agregações/percursos diferentes de olhar para o processo de desenvolvimento segundo SbD — e não níveis de uma hierarquia nem partições umas das outras; nenhuma relação entre as três se tipa como contenção. `MP → capítulos` é «percurso publicado», e é só isso. Os rótulos MP1–MP5 são ontology-owned (MP-0N); não são IDs de requisito.", "pins": {"manual_commit": "0576e914d4c9", "sbdtoe_ontology_tag": "sbdtoe-ontology-v2.5"}, "profiles": ["consult", "guide"], "record_type": "layer_manifest", "ref_conventions": "refs com padrão [A-Z]{3}-\\d{3} / REQ-AGN-\\d{3} são Requirement ids validados; [A-Z]{3}-K\\d{2} são metric_id validados; US-nn@cc refere a user story nn do capítulo cc (validação na materialização, Codex); F-0n e T-0n são a estrutura de medição transversal do cap. 14 — refs textuais declaradas não-modeladas (lacuna para o ciclo de assurance); restantes refs são âncoras editoriais textuais.", "schema_version": "1.0", "sdlc_phase_traversal": {"absence": {"absence_id": "ABS-001", "absence_type": "out_of_scope", "decided_by": "programme-lead", "decided_on": "2026-09-07", "evidence": "«não há esse walkthrough possível. Um MP pode passar várias fases e as fases podem cruzar vários MPs» — relação N:M e parcial nos dois sentidos; o Manual publica percursos ao grão capítulo («fase» ocorre 1× no capítulo, na frase que nega a equivalência)", "note": "a derivação a partir de capítulos/assignments continua PROIBIDA (mantém macro_processes.sdlc_phase_traversal, cujo rótulo local unpublished_gap fica superseded por esta tipagem)", "statement": "Travessia MacroProcess ↔ SDLCPhase"}, "absence_source": "declared_absences (índice central prevalece; v2.6)", "decided_by": "programme-lead 2026-09-06 (adenda à ratificação)", "reason": "a travessia MP↔fase existe mas é PARCIAL e NÃO PUBLICADA: um MP atravessa várias fases e não necessariamente na íntegra; uma fase pode conter partes de vários MP. O Manual publica por MP o percurso de CAPÍTULOS, nunca um percurso de fases («fase» ocorre uma única vez no capítulo, na frase que nega a equivalência). Lacuna declarada — NÃO derivar a travessia a partir de capítulos/assignments.", "status": "unpublished_gap"}, "traversal_assertions": {"mp_consumes_from": {"does_not_assert": "ordem linear única; equivalência dependency↔feedback", "source": "outputs[].consumed_by verbatim + regra Entradas/Gatilhos", "verb": "consome"}, "mp_traverses_bundle": {"does_not_assert": "contenção; ordem entre capítulos fora do percurso", "source": "percursos publicados (macro-processos.md)", "verb": "atravessa"}}, "validation": {"complete_instances": "5/5", "dependency_dag": "{MP-01} -> {MP-02 ∥ MP-04} -> {MP-03} -> {MP-05}", "mp02_mp04_incomparable": true, "refs_resolved": true}}
2
2
  {"activities": [{"order": 1, "refs": ["CLA-001", "US-01@01"], "text": "Classificar pelos três eixos e obter o nível"}, {"order": 2, "refs": ["CLA-002", "CLA-008", "US-15@01"], "text": "Aprovar proporcionalmente e registar no inventário"}, {"order": 3, "refs": ["CLA-003", "US-02@01"], "text": "Aplicar a matriz de controlos ao nível"}, {"order": 4, "refs": ["REQ-003", "US-01@02"], "text": "Selecionar requisitos no backlog com SEC-Lx-* e registar a decisão"}, {"order": 5, "refs": ["matriz transversal (cap. 10)"], "text": "Propagar a aplicabilidade aos capítulos técnicos"}, {"order": 6, "refs": ["US-12@02"], "text": "Validar no pipeline tags e ligação a REQ-XXX"}, {"order": 7, "refs": ["CLA-004", "CLA-005", "CLA-006", "US-03@01", "US-02@02"], "text": "Reavaliar por gatilho ou ciclo, com registo"}, {"order": 8, "refs": ["GOV-006", "GOV-007"], "text": "Estender a fornecedores cláusulas e validação proporcionais"}], "ai_agentic_extension": {"refs": ["REQ-AGN-001", "REQ-AGN-002", "REQ-AGN-003", "REQ-AGN-004", "US-19@13"], "text": "Classificar e depois selecionar, com o eixo adicional A0–A4; o nível A seleciona REQ-AGN-001..004 e os requisitos AI dos capítulos; formação por perfil e nível"}, "continuity": "Aplicabilidade", "control_points": [{"refs": ["CLA-002"], "text": "Aprovação da classificação pela entidade proporcional"}, {"refs": ["US-12@02"], "text": "Verificação de tags no PR"}, {"refs": ["US-05@01"], "text": "Validação antes do go-live"}, {"refs": ["CLA-006"], "text": "Prazo de reavaliação (30 dias)"}, {"refs": ["F-01", "F-02"], "text": "Completude do denominador: F-02 = F-01"}], "expected_evidence": [{"refs": ["US-01@01"], "text": "Documento de classificação versionado + matriz aplicada"}, {"refs": ["CLA-008"], "text": "Inventário central completo"}, {"refs": ["US-04@02"], "text": "Backlog com tags SEC-Lx-* e relatórios exportáveis"}, {"refs": ["US-03@01"], "text": "Registo de revisão com trigger e justificação"}], "foundation_refs": ["F-01", "F-02"], "indicators": ["CLA-K01", "CLA-K03", "CLA-K04", "RQS-K01", "RQS-K06"], "inputs": [{"refs": [], "text": "Eixos E/D/I e limiares L1–L3 (modelo de classificação)"}, {"refs": ["CLA-008"], "text": "Inventário central de aplicações"}, {"refs": [], "text": "Matriz de controlos por nível de risco"}, {"refs": [], "text": "Catálogos com colunas L1/L2/L3 (caps. 02–14) + baseline (Fundamentos)"}], "invariant": "Um perfil de segurança registado seleciona requisitos, gates, profundidade de revisão, evidência e formação.", "label": "MP1", "mp_id": "MP-01", "name_en": "CLASSIFY → SELECT", "name_pt": "Classificar → Selecionar", "outputs": [{"consumed_by": [{"kind": "dependency", "mp": "MP-02", "refs": ["THR-001"], "via": "threat modeling formal aplica-se a L2+"}, {"kind": "dependency", "mp": "MP-03", "refs": [], "via": "gates e profundidade de verificação por nível"}, {"kind": "dependency", "mp": "MP-04", "refs": ["GOV-003"], "via": "alçadas de aprovação por nível"}, {"kind": "dependency", "mp": "MP-05", "refs": ["F-02"], "via": "inventário classificado é o denominador F-02 de todos os KPIs"}], "text": "Perfil de segurança registado (classificação aprovada + inventário + seleção de requisitos)"}], "owner_role": "appsec-engineer", "participant_roles": ["developer", "scrum-master", "arquitetos-software", "product-owner", "gestao-executiva", "grc-compliance", "qa"], "path_edges": [{"from": "01-classificacao-aplicacoes", "kind": "fluxo", "to": ["02-requisitos-seguranca"], "via_refs": ["CLA-001", "CLA-002"]}, {"from": "02-requisitos-seguranca", "kind": "fluxo", "note": "backlog SEC-Lx-* propaga aplicabilidade aos capítulos técnicos", "to": ["05-dependencias-sbom-sca", "06-desenvolvimento-seguro", "07-cicd-seguro", "08-iac-infraestrutura", "09-containers-imagens", "10-testes-seguranca", "11-deploy-seguro", "12-monitorizacao-operacoes", "13-formacao-onboarding"], "via_refs": ["REQ-003", "US-04@02", "US-12@02"]}, {"from": "00-fundamentos", "kind": "piso", "note": "independente do nível; a seleção acrescenta, nunca subtrai", "to": "todas as aplicações", "via_refs": ["baseline (oito obrigações mínimas)"]}, {"from": "01-classificacao-aplicacoes", "kind": "ramo", "note": "ramo de aquisição — fornecedores e terceiros", "to": ["14-governanca-contratacao"], "via_refs": ["GOV-006", "GOV-007"]}], "profiles": ["consult", "guide"], "proportionality_l1_l3": {"L1": "piso das oito obrigações + matriz de nível baixo; aprovação pelo responsável técnico; revisão anual", "L2": "classificação validada por AppSec (CLA-K04); revisão por alteração obrigatória", "L3": "aprovação Gestão Executiva/CISO; revisão trimestral"}, "provenance": {"anchor": "#mp1-classificar-selecionar", "manual_pin": "v1.8.0 f78dfe734a83b01fa9283c2df5a3eb0ba9528001", "source": "SbD-ToE-Manual: 010-sbd-manual/00-fundamentos/macro-processos.md"}, "question": "O que se aplica aqui?", "record_type": "macro_process", "scope_subjects": [{"refs": ["CLA-001", "CLA-008"], "subject": "application"}, {"refs": ["GOV-007"], "subject": "supplier"}, {"refs": ["A0–A4 por agente e contexto"], "subject": "ai_agent"}], "traverses_bundles": ["00-fundamentos", "01-classificacao-aplicacoes", "02-requisitos-seguranca", "05-dependencias-sbom-sca", "06-desenvolvimento-seguro", "07-cicd-seguro", "08-iac-infraestrutura", "09-containers-imagens", "10-testes-seguranca", "11-deploy-seguro", "12-monitorizacao-operacoes", "13-formacao-onboarding", "14-governanca-contratacao"], "triggers": [{"refs": ["US-01@01"], "text": "Aplicação nova ou início de projeto"}, {"refs": ["CLA-006", "CLA-004"], "text": "Alteração significativa, reavaliação ≤ 30 dias"}, {"refs": ["CLA-005"], "text": "Ciclo periódico por nível (L1 anual, L2 semestral, L3 trimestral)"}, {"refs": ["REQ-005", "US-02@02"], "text": "Alteração relevante de requisitos; pode disparar novo threat modeling"}, {"refs": [], "text": "Introdução/modificação de automação ou apoio à decisão (incl. IA); regra de reforço da matriz"}]}
3
3
  {"activities": [{"order": 1, "refs": ["THR-002", "THR-003", "US-01@03"], "text": "Modelar ameaças (STRIDE baseline; LINDDUN dados pessoais; PASTA alto risco) sobre DFDs"}, {"order": 2, "refs": ["THR-004", "THR-005", "US-09@03"], "text": "Dispor cada ameaça com owner e aprovar o modelo"}, {"order": 3, "refs": ["ARC-005", "US-04@04"], "text": "Sincronizar com a arquitetura (ADR; rastreabilidade decisão↔ameaça↔controlo↔requisito)"}, {"order": 4, "refs": ["THR-007", "US-03@04"], "text": "Rever independentemente antes do go-live (L2+)"}, {"order": 5, "refs": ["US-05@02", "TST-001", "TST-007"], "text": "Definir critérios de validação e estratégia/cobertura de testes"}, {"order": 6, "refs": ["DEV-003", "TST-002", "TST-005"], "text": "Verificar com o oráculo adequado (SAST gate; DAST staging; regressão)"}, {"order": 7, "refs": ["US-09@02", "REQ-006"], "text": "Fechar sobre o requisito (REQ-XXX → evidência; matriz)"}, {"order": 8, "refs": ["US-07@10", "US-12@04", "ARC-012"], "text": "Decidir o release com aceitação explícita de risco residual; gate arquitetural"}, {"order": 9, "refs": ["processo canónico de exceções (cap. 14)"], "text": "Excecionar desvios arquiteturais em ADR com aceitação de risco"}], "ai_agentic_extension": {"refs": ["THR-008", "US-11@03", "US-12@03", "ARC-014"], "text": "Threat model estendido a componentes AI/ML e agentes com tool-use; padrões arquitetónicos dedicados"}, "continuity": "Intenção", "control_points": [{"refs": ["US-09@03"], "text": "Aprovação formal do threat model"}, {"refs": ["US-05@03"], "text": "Gate de consistência no CI/CD (alerta L2, bloqueante L3)"}, {"refs": ["THR-007"], "text": "Revisão independente antes do go-live (L2+)"}, {"refs": ["US-12@04", "ARC-012"], "text": "Gate arquitetural antes do go-live (checklist assinada em L3)"}, {"refs": ["US-07@10"], "text": "Critérios de release (L2 bloqueia High/Critical; L3 nenhum crítico sem exceção)"}], "expected_evidence": [{"refs": ["US-09@03"], "text": "Threat model versionado com aprovação"}, {"refs": ["US-04@04", "US-09@04"], "text": "ADR e ficha de solução alinhadas"}, {"refs": ["REQ-006", "THR-005"], "text": "Matriz requisito↔ameaça↔teste"}, {"refs": ["US-09@02"], "text": "Resultado e evidência por REQ-XXX"}, {"refs": ["TST-004", "US-12@04"], "text": "Relatórios de teste ligados ao build; checklist de arquitetura"}], "indicators": ["THR-K02", "THR-K05", "ARC-K02", "RQS-K03", "RQS-K05", "TST-K04"], "inputs": [{"refs": ["REQ-003"], "text": "Requisitos selecionados com SEC-Lx-* (MP1)"}, {"refs": ["THR-002", "ARC-001"], "text": "DFDs com trust boundaries; zonas de confiança"}, {"refs": [], "text": "Catálogo de ameaças mitigadas (MT-NNN)"}, {"refs": ["US-13@04", "TST-001"], "text": "Catálogo de padrões de arquitetura + estratégia de testes"}], "invariant": "Ameaças, decisões de arquitetura e testes fecham sobre o mesmo resultado declarado.", "label": "MP2", "mp_id": "MP-02", "name_en": "DESIGN → ASSURE", "name_pt": "Desenhar → Assegurar", "notes": ["ARC-015 (agente como principal) pertence à continuidade de autoridade — tratado em MP4 (declaração da própria fonte)"], "outputs": [{"consumed_by": [{"kind": "dependency", "mp": "MP-03", "refs": [], "via": "gates de promoção"}, {"kind": "feedback", "mp": "MP-04", "refs": ["CLA-007"], "via": "risco aceite entra na cadeia de autoridade (não é Entrada declarada de MP4; entra pelo circuito de exceção/aceitação)"}], "text": "Threat model aprovado e versionado com decisões"}, {"consumed_by": [{"kind": "dependency", "mp": "MP-03", "refs": ["TST-004"], "via": "promoção só com evidência"}, {"kind": "dependency", "mp": "MP-05", "refs": ["RQS-K03", "THR-K02"], "via": "indicadores"}], "text": "Evidência de verificação ligada ao build"}, {"consumed_by": [{"kind": "dependency", "mp": "MP-05", "refs": ["REQ-006"], "via": "medição e auditoria"}], "text": "Matriz requisito → ameaça → teste"}], "owner_role": "appsec-engineer", "participant_roles": ["arquitetos-software", "developer", "qa", "product-owner", "scrum-master", "gestao-executiva", "devops-sre"], "path_edges": [{"from": "02-requisitos-seguranca", "kind": "fluxo", "to": ["03-threat-modeling"], "via_refs": ["REQ-003", "REQ-005"]}, {"from": "03-threat-modeling", "kind": "fluxo", "to": ["04-arquitetura-segura"], "via_refs": ["THR-004", "THR-005", "THR-002"]}, {"from": "04-arquitetura-segura", "kind": "fluxo", "to": ["10-testes-seguranca"], "via_refs": ["ARC-005", "US-02@04", "TST-001"]}, {"from": "10-testes-seguranca", "kind": "fecho", "to": ["02-requisitos-seguranca"], "via_refs": ["TST-004", "REQ-006", "US-09@02"]}], "profiles": ["consult", "guide"], "proportionality_l1_l3": {"L1": "zonas de confiança (ARC-001), SAST como gate (DEV-003), validação funcional (REQ-001)", "L2": "threat modeling formal + rastreabilidade requisito→ameaça→teste", "L3": "revisão formal reforçada; ARC-012; critérios de release estritos"}, "provenance": {"anchor": "#mp2-desenhar-assegurar", "manual_pin": "v1.8.0 f78dfe734a83b01fa9283c2df5a3eb0ba9528001", "source": "SbD-ToE-Manual: 010-sbd-manual/00-fundamentos/macro-processos.md"}, "question": "O que foi desenhado e implementado satisfaz a intenção de segurança?", "record_type": "macro_process", "scope_subjects": [{"refs": ["L2+ (THR-*, maioria dos TST-*)"], "subject": "application"}, {"refs": ["THR-006", "US-06@04", "US-11@04"], "subject": "significant_architectural_change"}, {"refs": ["THR-008", "ARC-014"], "subject": "ai_ml_component"}], "traverses_bundles": ["02-requisitos-seguranca", "03-threat-modeling", "04-arquitetura-segura", "10-testes-seguranca"], "triggers": [{"refs": ["THR-001", "THR-007"], "text": "Nova aplicação L2+ antes do go-live"}, {"refs": ["THR-006", "US-03@03", "US-11@04"], "text": "Alteração arquitetural significativa (threat model ≤ 30 dias)"}, {"refs": ["REQ-005"], "text": "Alteração relevante de requisito"}, {"refs": ["TST-006"], "text": "Vulnerabilidade corrigida → teste de regressão"}, {"refs": ["US-05@03"], "text": "Pipeline com alteração relevante sem threat model atualizado (gate de consistência)"}]}
4
4
  {"activities": [{"order": 1, "refs": ["DEP-001", "DEP-002", "DEP-003", "DEP-004"], "text": "Inventariar e verificar dependências por build (SBOM, SCA, versões fixas)"}, {"order": 2, "refs": ["DEV-002", "DEV-003", "CIC-003", "IAC-011"], "text": "Construir com gates de integração (linters, SAST, secrets scanning)"}, {"order": 3, "refs": ["CIC-001", "CIC-002", "CIC-006"], "text": "Executar o pipeline como código, triggers restritos, runners isolados"}, {"order": 4, "refs": ["CIC-007", "CNT-007", "CNT-008"], "text": "Assinar e registar proveniência de artefacto e imagem"}, {"order": 5, "refs": ["IAC-003", "IAC-007", "CNT-009"], "text": "Policy-as-code e admission control"}, {"order": 6, "refs": ["DPL-002", "DPL-003", "DPL-001", "US-15@07", "US-16@11"], "text": "Promover só com proveniência verificada, gates passados e aprovação humana"}, {"order": 7, "refs": ["DPL-004", "US-17@11", "DPL-007"], "text": "Registar o deploy com rastreabilidade end-to-end; validar em staging"}, {"order": 8, "refs": ["OPS-001", "OPS-002", "OPS-004", "OPS-005", "OPS-015"], "text": "Observar em runtime (logging estruturado, eventos, alertas, drift)"}, {"order": 9, "refs": ["DEP-010", "DPL-005", "US-15@11"], "text": "Fechar o laço de vulnerabilidade e incidente (SBOM→CVE→correção; rollback testado)"}], "ai_agentic_extension": {"refs": ["DEP-011", "DEP-012", "US-14@05", "US-19@07", "DPL-010", "DPL-011", "OPS-011", "OPS-012", "OPS-013", "OPS-014"], "text": "Identidade do que executa inclui modelo/versão, prompts/skill files, tools/MCP e mandate; AI BOM; pesos como ativo crítico; eval suite como gate; telemetria dedicada. O mandate é matéria de MP4; MP3 garante que o que corre é o que o mandate referencia"}, "continuity": "Proveniência / execução", "control_points": [{"refs": ["DEP-002", "CIC-004"], "text": "Gate SCA com bloqueio + gates de pipeline bloqueantes"}, {"refs": ["CIC-007", "CNT-007", "DPL-002"], "text": "Verificação de assinatura/proveniência antes de promoção"}, {"refs": ["CNT-009", "IAC-007"], "text": "Admission control + plan aprovado antes de apply"}, {"refs": ["DPL-001", "CIC-004", "CIC-K02"], "text": "Aprovação humana para ações irreversíveis; bypass só com aprovação registada"}, {"refs": ["DPL-008", "OPS-004"], "text": "Janela de observação pós-deploy; falha de ingestão de logs é sinal"}], "expected_evidence": [{"refs": ["DEP-001", "DEP-002", "DEP-010"], "text": "SBOM ligado ao build; relatório SCA; SBOM→CVE→ação"}, {"refs": ["CIC-005", "CIC-007"], "text": "Execução de pipeline identificável; artefacto com commit SHA e run ID"}, {"refs": ["CNT-007", "CNT-008", "CNT-009"], "text": "SBOM e assinatura por imagem; logs de admissão"}, {"refs": ["DPL-004"], "text": "Registo de deploy completo"}, {"refs": ["OPS-001", "OPS-003"], "text": "Logs estruturados persistidos e retidos"}], "indicators": ["DEP-K01", "CIC-K03", "CNT-K03", "DPL-K06", "DEP-K02", "IAC-K02"], "inputs": [{"refs": ["DEV-004", "DEV-001"], "text": "Código revisto + guidelines por stack"}, {"refs": ["DEP-005", "DEP-006", "CNT-001", "IAC-005"], "text": "Dependências e imagens de origem aprovada; IaC versionado"}, {"refs": [], "text": "Gates por nível (MP1); threat model e evidência (MP2); aprovação de deploy (MP4)"}], "invariant": "A evidência de dependências, pipeline, artefacto, deployment e runtime descreve a mesma versão lançada.", "label": "MP3", "mp_id": "MP-03", "name_en": "BUILD → RUN", "name_pt": "Construir → Executar", "outputs": [{"consumed_by": [{"kind": "dependency", "mp": "MP-05", "refs": ["DPL-K06"], "via": "indicador de evidência de deploy"}], "text": "Release rastreável (pipeline ID, hash, commit, aprovador, gates)"}, {"consumed_by": [{"kind": "dependency", "mp": "MP-05", "refs": ["OPS-010"], "via": "MTTD/MTTR"}, {"kind": "feedback", "mp": "MP-02", "refs": ["TST-006"], "via": "vulnerabilidade corrigida origina teste de regressão (gatilho de MP2)"}], "text": "Telemetria de runtime"}, {"consumed_by": [{"kind": "feedback", "mp": "MP-04", "refs": ["páginas de exceções caps. 05–12"], "via": "quando exigem exceção (gatilho de MP4)"}], "text": "Findings e desvios"}], "owner_role": "devops-sre", "participant_roles": ["developer", "appsec-engineer", "operacoes", "product-owner", "grc-compliance", "gestao-executiva"], "path_edges": [{"from": "05-dependencias-sbom-sca", "kind": "fluxo", "to": ["07-cicd-seguro"], "via_refs": ["DEP-001", "DEP-002"]}, {"from": "06-desenvolvimento-seguro", "kind": "fluxo", "to": ["07-cicd-seguro"], "via_refs": ["DEV-006", "DEV-003"]}, {"from": "07-cicd-seguro", "kind": "fluxo", "to": ["09-containers-imagens"], "via_refs": ["CIC-007", "CIC-005"]}, {"from": "09-containers-imagens", "kind": "fluxo", "to": ["11-deploy-seguro"], "via_refs": ["CNT-009", "DPL-002"]}, {"from": "08-iac-infraestrutura", "kind": "ramo", "to": ["11-deploy-seguro"], "via_refs": ["IAC-007", "IAC-004"]}, {"from": "11-deploy-seguro", "kind": "fluxo", "to": ["12-monitorizacao-operacoes"], "via_refs": ["DPL-004"]}, {"from": "12-monitorizacao-operacoes", "kind": "laço", "to": ["05-dependencias-sbom-sca"], "via_refs": ["DEP-010", "DEP-007", "DPL-005"]}], "profiles": ["consult", "guide"], "proportionality_l1_l3": {"L1": "SBOM, SCA com bloqueio, versões fixas, gates, aprovação formal de deploy, rollback testado, logging estruturado", "L2": "assinatura e proveniência", "L3": "reforços das colunas L3 dos catálogos"}, "provenance": {"anchor": "#mp3-construir-executar", "manual_pin": "v1.8.0 f78dfe734a83b01fa9283c2df5a3eb0ba9528001", "source": "SbD-ToE-Manual: 010-sbd-manual/00-fundamentos/macro-processos.md"}, "question": "O que está a correr e de onde veio?", "record_type": "macro_process", "scope_subjects": [{"refs": ["build → artefacto → imagem → deploy → runtime"], "subject": "released_version"}, {"refs": ["CIC-001"], "subject": "pipeline_as_code"}, {"refs": ["cap. 08"], "subject": "declared_infrastructure"}, {"refs": ["em operação"], "subject": "ai_agent"}], "traverses_bundles": ["05-dependencias-sbom-sca", "06-desenvolvimento-seguro", "07-cicd-seguro", "08-iac-infraestrutura", "09-containers-imagens", "11-deploy-seguro", "12-monitorizacao-operacoes"], "triggers": [{"refs": ["DEP-001", "DEV-003", "CIC-004", "DPL-003"], "text": "Cada build, cada PR, cada promoção"}, {"refs": ["DEP-007", "TST-003", "CNT-010"], "text": "CVE nova (SLA por severidade); atualização de imagem base"}, {"refs": ["IAC-012", "US-14@11"], "text": "Drift IaC/real ou drift operacional pós-deploy"}, {"refs": ["DPL-004", "US-09@07"], "text": "Incidente em produção (reconstituir até ao commit)"}, {"refs": ["DPL-010", "DPL-011"], "text": "Mudança de modelo, skill files ou system prompts (agentes)"}]}
@@ -1,4 +1,4 @@
1
- {"adoption_order_levels": [["MP-01"], ["MP-02", "MP-04"], ["MP-03"], ["MP-05"]], "adoption_order_rule": "ordem topológica do subconjunto dependency (feedback excluído por definição): MP-01 → {MP-02 ∥ MP-04} → MP-03 → MP-05; MP-02 e MP-04 são incomparáveis na fonte (declarado, não inferido).", "counts": {"consumption_records": 23, "dependency_pairs": 9, "feedback_pairs": 9, "inter_mp_typed_pairs": 18, "macro_processes": 5, "path_edges": 22}, "curation": {"adenda": "três segmentações + lacuna de fases (2026-09-06)", "curator": "archon-2026-09-06", "ratified_by": "programme-lead", "ratified_on": "2026-09-06", "source": "agentic/briefs/2026-09-06-archon-proposta-macro-processos.md"}, "edge_typing_rule": "consumo que aparece nas «Entradas» do MP consumidor ⇒ dependency; consumo que aparece nos «Gatilhos» do consumidor ou nas realimentações declaradas (fecho, laço, realimentar, «nos seus gatilhos») ⇒ feedback. Cada aresta vive em outputs[].consumed_by com o artefacto (via) e refs.", "erratum_vs_gate_map": "o mapa ratificado dizia 17 pares; na emissão a aplicação da regra ratificada à fonte encontrou a 18.ª — MP2→MP4 («threat model … consumido por MP4: risco aceite entra na cadeia de autoridade», CLA-007), tipada feedback porque não figura nas Entradas de MP4; declarada aqui, nunca silenciada.", "layer": "mp_edges", "model_note": "MacroProcess, KnowledgeBundle (capítulo) e SDLCPhase são TRÊS SEGMENTAÇÕES do mesmo substrato — agregações/percursos diferentes de olhar para o processo de desenvolvimento segundo SbD — e não níveis de uma hierarquia nem partições umas das outras; nenhuma relação entre as três se tipa como contenção. `MP → capítulos` é «percurso publicado», e é só isso. Os rótulos MP1–MP5 são ontology-owned (MP-0N); não são IDs de requisito.", "pins": {"manual_commit": "89ac3ba8f030", "sbdtoe_ontology_tag": "sbdtoe-ontology-v2.5"}, "profiles": ["consult", "guide"], "record_type": "layer_manifest", "ref_conventions": "refs com padrão [A-Z]{3}-\\d{3} / REQ-AGN-\\d{3} são Requirement ids validados; [A-Z]{3}-K\\d{2} são metric_id validados; US-nn@cc refere a user story nn do capítulo cc (validação na materialização, Codex); F-0n e T-0n são a estrutura de medição transversal do cap. 14 — refs textuais declaradas não-modeladas (lacuna para o ciclo de assurance); restantes refs são âncoras editoriais textuais.", "schema_version": "1.0", "sdlc_phase_traversal": {"absence": {"absence_id": "ABS-001", "absence_type": "out_of_scope", "decided_by": "programme-lead", "decided_on": "2026-09-07", "evidence": "«não há esse walkthrough possível. Um MP pode passar várias fases e as fases podem cruzar vários MPs» — relação N:M e parcial nos dois sentidos; o Manual publica percursos ao grão capítulo («fase» ocorre 1× no capítulo, na frase que nega a equivalência)", "note": "a derivação a partir de capítulos/assignments continua PROIBIDA (mantém macro_processes.sdlc_phase_traversal, cujo rótulo local unpublished_gap fica superseded por esta tipagem)", "statement": "Travessia MacroProcess ↔ SDLCPhase"}, "absence_source": "declared_absences (índice central prevalece; v2.6)", "decided_by": "programme-lead 2026-09-06 (adenda à ratificação)", "reason": "a travessia MP↔fase existe mas é PARCIAL e NÃO PUBLICADA: um MP atravessa várias fases e não necessariamente na íntegra; uma fase pode conter partes de vários MP. O Manual publica por MP o percurso de CAPÍTULOS, nunca um percurso de fases («fase» ocorre uma única vez no capítulo, na frase que nega a equivalência). Lacuna declarada — NÃO derivar a travessia a partir de capítulos/assignments.", "status": "unpublished_gap"}, "traversal_assertions": {"mp_consumes_from": {"does_not_assert": "ordem linear única; equivalência dependency↔feedback", "source": "outputs[].consumed_by verbatim + regra Entradas/Gatilhos", "verb": "consome"}, "mp_traverses_bundle": {"does_not_assert": "contenção; ordem entre capítulos fora do percurso", "source": "percursos publicados (macro-processos.md)", "verb": "atravessa"}}, "typed_pairs": [{"from_mp": "MP-01", "kind": "dependency", "to_mp": "MP-02"}, {"from_mp": "MP-01", "kind": "dependency", "to_mp": "MP-03"}, {"from_mp": "MP-01", "kind": "dependency", "to_mp": "MP-04"}, {"from_mp": "MP-01", "kind": "dependency", "to_mp": "MP-05"}, {"from_mp": "MP-02", "kind": "dependency", "to_mp": "MP-03"}, {"from_mp": "MP-02", "kind": "feedback", "to_mp": "MP-04"}, {"from_mp": "MP-02", "kind": "dependency", "to_mp": "MP-05"}, {"from_mp": "MP-03", "kind": "feedback", "to_mp": "MP-02"}, {"from_mp": "MP-03", "kind": "feedback", "to_mp": "MP-04"}, {"from_mp": "MP-03", "kind": "dependency", "to_mp": "MP-05"}, {"from_mp": "MP-04", "kind": "feedback", "to_mp": "MP-01"}, {"from_mp": "MP-04", "kind": "feedback", "to_mp": "MP-02"}, {"from_mp": "MP-04", "kind": "dependency", "to_mp": "MP-03"}, {"from_mp": "MP-04", "kind": "dependency", "to_mp": "MP-05"}, {"from_mp": "MP-05", "kind": "feedback", "to_mp": "MP-01"}, {"from_mp": "MP-05", "kind": "feedback", "to_mp": "MP-02"}, {"from_mp": "MP-05", "kind": "feedback", "to_mp": "MP-03"}, {"from_mp": "MP-05", "kind": "feedback", "to_mp": "MP-04"}]}
1
+ {"adoption_order_levels": [["MP-01"], ["MP-02", "MP-04"], ["MP-03"], ["MP-05"]], "adoption_order_rule": "ordem topológica do subconjunto dependency (feedback excluído por definição): MP-01 → {MP-02 ∥ MP-04} → MP-03 → MP-05; MP-02 e MP-04 são incomparáveis na fonte (declarado, não inferido).", "counts": {"consumption_records": 23, "dependency_pairs": 9, "feedback_pairs": 9, "inter_mp_typed_pairs": 18, "macro_processes": 5, "path_edges": 22}, "curation": {"adenda": "três segmentações + lacuna de fases (2026-09-06)", "curator": "archon-2026-09-06", "ratified_by": "programme-lead", "ratified_on": "2026-09-06", "source": "agentic/briefs/2026-09-06-archon-proposta-macro-processos.md"}, "edge_typing_rule": "consumo que aparece nas «Entradas» do MP consumidor ⇒ dependency; consumo que aparece nos «Gatilhos» do consumidor ou nas realimentações declaradas (fecho, laço, realimentar, «nos seus gatilhos») ⇒ feedback. Cada aresta vive em outputs[].consumed_by com o artefacto (via) e refs.", "erratum_vs_gate_map": "o mapa ratificado dizia 17 pares; na emissão a aplicação da regra ratificada à fonte encontrou a 18.ª — MP2→MP4 («threat model … consumido por MP4: risco aceite entra na cadeia de autoridade», CLA-007), tipada feedback porque não figura nas Entradas de MP4; declarada aqui, nunca silenciada.", "layer": "mp_edges", "model_note": "MacroProcess, KnowledgeBundle (capítulo) e SDLCPhase são TRÊS SEGMENTAÇÕES do mesmo substrato — agregações/percursos diferentes de olhar para o processo de desenvolvimento segundo SbD — e não níveis de uma hierarquia nem partições umas das outras; nenhuma relação entre as três se tipa como contenção. `MP → capítulos` é «percurso publicado», e é só isso. Os rótulos MP1–MP5 são ontology-owned (MP-0N); não são IDs de requisito.", "pins": {"manual_commit": "0576e914d4c9", "sbdtoe_ontology_tag": "sbdtoe-ontology-v2.5"}, "profiles": ["consult", "guide"], "record_type": "layer_manifest", "ref_conventions": "refs com padrão [A-Z]{3}-\\d{3} / REQ-AGN-\\d{3} são Requirement ids validados; [A-Z]{3}-K\\d{2} são metric_id validados; US-nn@cc refere a user story nn do capítulo cc (validação na materialização, Codex); F-0n e T-0n são a estrutura de medição transversal do cap. 14 — refs textuais declaradas não-modeladas (lacuna para o ciclo de assurance); restantes refs são âncoras editoriais textuais.", "schema_version": "1.0", "sdlc_phase_traversal": {"absence": {"absence_id": "ABS-001", "absence_type": "out_of_scope", "decided_by": "programme-lead", "decided_on": "2026-09-07", "evidence": "«não há esse walkthrough possível. Um MP pode passar várias fases e as fases podem cruzar vários MPs» — relação N:M e parcial nos dois sentidos; o Manual publica percursos ao grão capítulo («fase» ocorre 1× no capítulo, na frase que nega a equivalência)", "note": "a derivação a partir de capítulos/assignments continua PROIBIDA (mantém macro_processes.sdlc_phase_traversal, cujo rótulo local unpublished_gap fica superseded por esta tipagem)", "statement": "Travessia MacroProcess ↔ SDLCPhase"}, "absence_source": "declared_absences (índice central prevalece; v2.6)", "decided_by": "programme-lead 2026-09-06 (adenda à ratificação)", "reason": "a travessia MP↔fase existe mas é PARCIAL e NÃO PUBLICADA: um MP atravessa várias fases e não necessariamente na íntegra; uma fase pode conter partes de vários MP. O Manual publica por MP o percurso de CAPÍTULOS, nunca um percurso de fases («fase» ocorre uma única vez no capítulo, na frase que nega a equivalência). Lacuna declarada — NÃO derivar a travessia a partir de capítulos/assignments.", "status": "unpublished_gap"}, "traversal_assertions": {"mp_consumes_from": {"does_not_assert": "ordem linear única; equivalência dependency↔feedback", "source": "outputs[].consumed_by verbatim + regra Entradas/Gatilhos", "verb": "consome"}, "mp_traverses_bundle": {"does_not_assert": "contenção; ordem entre capítulos fora do percurso", "source": "percursos publicados (macro-processos.md)", "verb": "atravessa"}}, "typed_pairs": [{"from_mp": "MP-01", "kind": "dependency", "to_mp": "MP-02"}, {"from_mp": "MP-01", "kind": "dependency", "to_mp": "MP-03"}, {"from_mp": "MP-01", "kind": "dependency", "to_mp": "MP-04"}, {"from_mp": "MP-01", "kind": "dependency", "to_mp": "MP-05"}, {"from_mp": "MP-02", "kind": "dependency", "to_mp": "MP-03"}, {"from_mp": "MP-02", "kind": "feedback", "to_mp": "MP-04"}, {"from_mp": "MP-02", "kind": "dependency", "to_mp": "MP-05"}, {"from_mp": "MP-03", "kind": "feedback", "to_mp": "MP-02"}, {"from_mp": "MP-03", "kind": "feedback", "to_mp": "MP-04"}, {"from_mp": "MP-03", "kind": "dependency", "to_mp": "MP-05"}, {"from_mp": "MP-04", "kind": "feedback", "to_mp": "MP-01"}, {"from_mp": "MP-04", "kind": "feedback", "to_mp": "MP-02"}, {"from_mp": "MP-04", "kind": "dependency", "to_mp": "MP-03"}, {"from_mp": "MP-04", "kind": "dependency", "to_mp": "MP-05"}, {"from_mp": "MP-05", "kind": "feedback", "to_mp": "MP-01"}, {"from_mp": "MP-05", "kind": "feedback", "to_mp": "MP-02"}, {"from_mp": "MP-05", "kind": "feedback", "to_mp": "MP-03"}, {"from_mp": "MP-05", "kind": "feedback", "to_mp": "MP-04"}]}
2
2
  {"from_mp": "MP-01", "kind": "dependency", "output_text": "Perfil de segurança registado (classificação aprovada + inventário + seleção de requisitos)", "profiles": ["consult", "guide"], "record_type": "inter_mp_consumption", "refs": ["THR-001"], "to_mp": "MP-02", "via": "threat modeling formal aplica-se a L2+"}
3
3
  {"from_mp": "MP-01", "kind": "dependency", "output_text": "Perfil de segurança registado (classificação aprovada + inventário + seleção de requisitos)", "profiles": ["consult", "guide"], "record_type": "inter_mp_consumption", "refs": [], "to_mp": "MP-03", "via": "gates e profundidade de verificação por nível"}
4
4
  {"from_mp": "MP-01", "kind": "dependency", "output_text": "Perfil de segurança registado (classificação aprovada + inventário + seleção de requisitos)", "profiles": ["consult", "guide"], "record_type": "inter_mp_consumption", "refs": ["GOV-003"], "to_mp": "MP-04", "via": "alçadas de aprovação por nível"}
@@ -1,4 +1,4 @@
1
- {"counts": {"requirements": 273, "with_compensated_coverage": 254, "with_direct_anchors": 17, "without_any_source_declared": 19}, "coverage_rule": "um CO conta como coberto se tiver >=1 alinhamento exact ou partial; related não cobre", "epistemic_note": "directas = autoria do Manual (marcador **Fontes**); compensadas = correspondência entre modelos via camada CTRL<->ACore + aterragens ES des-truncadas — nunca autoria. Cada salto carrega tipo e confiança; cada afirmação carrega a sua cadeia.", "inputs": {"alignment_controls": 17, "landing_entities": 202, "requirement_control_links": 305}, "layer": "requirement_source_coverage", "record_type": "layer_manifest"}
1
+ {"counts": {"requirements": 274, "with_compensated_coverage": 255, "with_direct_anchors": 17, "without_any_source_declared": 19}, "coverage_rule": "um CO conta como coberto se tiver >=1 alinhamento exact ou partial; related não cobre", "epistemic_note": "directas = autoria do Manual (marcador **Fontes**); compensadas = correspondência entre modelos via camada CTRL<->ACore + aterragens ES des-truncadas — nunca autoria. Cada salto carrega tipo e confiança; cada afirmação carrega a sua cadeia.", "inputs": {"alignment_controls": 17, "landing_entities": 202, "requirement_control_links": 306}, "layer": "requirement_source_coverage", "record_type": "layer_manifest"}
2
2
  {"category": "ACC", "compensated": {"chains": [{"alignments": [{"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 97, "resolved_source_count": 13, "status": "resolved", "v1_entity_id": "ACO-IAT-001"}, "target_id": "ACO-IAT-001"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 211, "resolved_source_count": 16, "status": "resolved", "v1_entity_id": "ACO-IAT-002"}, "target_id": "ACO-IAT-002"}, {"alignment_type": "partial", "confidence": 0.85, "covers": true, "landing": {"resolved_ref_count": 24, "resolved_source_count": 7, "status": "resolved", "v1_entity_id": "ACO-IAT-003"}, "target_id": "ACO-IAT-003"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 46, "resolved_source_count": 7, "status": "resolved", "v1_entity_id": "ACO-IAT-004"}, "target_id": "ACO-IAT-004"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 19, "resolved_source_count": 4, "status": "resolved", "v1_entity_id": "ACO-IAT-005"}, "target_id": "ACO-IAT-005"}, {"alignment_type": "related", "confidence": 0.7, "covers": false, "landing": {"resolved_ref_count": 155, "resolved_source_count": 17, "status": "resolved", "v1_entity_id": "ACO-IAT-006"}, "target_id": "ACO-IAT-006"}, {"alignment_type": "related", "confidence": 0.7, "covers": false, "landing": {"resolved_ref_count": 53, "resolved_source_count": 8, "status": "resolved", "v1_entity_id": "ACO-IAT-007"}, "target_id": "ACO-IAT-007"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 71, "resolved_source_count": 10, "status": "resolved", "v1_entity_id": "ACO-ITS-001"}, "target_id": "ACO-ITS-001"}], "control_confidence": 0.92, "control_id": "CTRL-identity-identidade-autenticacao-e-sessoes-aplicacionais-c9d3f51e82", "control_justification": ["catalogue_rule"]}], "coverage_rule": "um CO conta como coberto se tiver >=1 alinhamento exact ou partial; related não cobre", "covered": true, "label": "coverage_compensated"}, "direct": {"provenance": null, "source_anchors": [], "status": "none_authored"}, "record_type": "requirement_coverage", "requirement_id": "ACC-001"}
3
3
  {"category": "ACC", "compensated": {"chains": [{"alignments": [{"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 97, "resolved_source_count": 13, "status": "resolved", "v1_entity_id": "ACO-IAT-001"}, "target_id": "ACO-IAT-001"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 211, "resolved_source_count": 16, "status": "resolved", "v1_entity_id": "ACO-IAT-002"}, "target_id": "ACO-IAT-002"}, {"alignment_type": "partial", "confidence": 0.85, "covers": true, "landing": {"resolved_ref_count": 24, "resolved_source_count": 7, "status": "resolved", "v1_entity_id": "ACO-IAT-003"}, "target_id": "ACO-IAT-003"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 46, "resolved_source_count": 7, "status": "resolved", "v1_entity_id": "ACO-IAT-004"}, "target_id": "ACO-IAT-004"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 19, "resolved_source_count": 4, "status": "resolved", "v1_entity_id": "ACO-IAT-005"}, "target_id": "ACO-IAT-005"}, {"alignment_type": "related", "confidence": 0.7, "covers": false, "landing": {"resolved_ref_count": 155, "resolved_source_count": 17, "status": "resolved", "v1_entity_id": "ACO-IAT-006"}, "target_id": "ACO-IAT-006"}, {"alignment_type": "related", "confidence": 0.7, "covers": false, "landing": {"resolved_ref_count": 53, "resolved_source_count": 8, "status": "resolved", "v1_entity_id": "ACO-IAT-007"}, "target_id": "ACO-IAT-007"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 71, "resolved_source_count": 10, "status": "resolved", "v1_entity_id": "ACO-ITS-001"}, "target_id": "ACO-ITS-001"}], "control_confidence": 0.92, "control_id": "CTRL-identity-identidade-autenticacao-e-sessoes-aplicacionais-c9d3f51e82", "control_justification": ["catalogue_rule"]}], "coverage_rule": "um CO conta como coberto se tiver >=1 alinhamento exact ou partial; related não cobre", "covered": true, "label": "coverage_compensated"}, "direct": {"provenance": null, "source_anchors": [], "status": "none_authored"}, "record_type": "requirement_coverage", "requirement_id": "ACC-002"}
4
4
  {"category": "ACC", "compensated": {"chains": [{"alignments": [{"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 97, "resolved_source_count": 13, "status": "resolved", "v1_entity_id": "ACO-IAT-001"}, "target_id": "ACO-IAT-001"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 211, "resolved_source_count": 16, "status": "resolved", "v1_entity_id": "ACO-IAT-002"}, "target_id": "ACO-IAT-002"}, {"alignment_type": "partial", "confidence": 0.85, "covers": true, "landing": {"resolved_ref_count": 24, "resolved_source_count": 7, "status": "resolved", "v1_entity_id": "ACO-IAT-003"}, "target_id": "ACO-IAT-003"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 46, "resolved_source_count": 7, "status": "resolved", "v1_entity_id": "ACO-IAT-004"}, "target_id": "ACO-IAT-004"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 19, "resolved_source_count": 4, "status": "resolved", "v1_entity_id": "ACO-IAT-005"}, "target_id": "ACO-IAT-005"}, {"alignment_type": "related", "confidence": 0.7, "covers": false, "landing": {"resolved_ref_count": 155, "resolved_source_count": 17, "status": "resolved", "v1_entity_id": "ACO-IAT-006"}, "target_id": "ACO-IAT-006"}, {"alignment_type": "related", "confidence": 0.7, "covers": false, "landing": {"resolved_ref_count": 53, "resolved_source_count": 8, "status": "resolved", "v1_entity_id": "ACO-IAT-007"}, "target_id": "ACO-IAT-007"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 71, "resolved_source_count": 10, "status": "resolved", "v1_entity_id": "ACO-ITS-001"}, "target_id": "ACO-ITS-001"}], "control_confidence": 0.92, "control_id": "CTRL-identity-identidade-autenticacao-e-sessoes-aplicacionais-c9d3f51e82", "control_justification": ["catalogue_rule"]}], "coverage_rule": "um CO conta como coberto se tiver >=1 alinhamento exact ou partial; related não cobre", "covered": true, "label": "coverage_compensated"}, "direct": {"provenance": null, "source_anchors": [], "status": "none_authored"}, "record_type": "requirement_coverage", "requirement_id": "ACC-003"}
@@ -58,6 +58,7 @@
58
58
  {"category": "CIC", "compensated": {"chains": [{"alignments": [{"alignment_type": "related", "confidence": 0.7, "covers": false, "landing": {"resolved_ref_count": 49, "resolved_source_count": 7, "status": "resolved", "v1_entity_id": "ACO-RPR-001"}, "target_id": "ACO-RPR-001"}, {"alignment_type": "related", "confidence": 0.7, "covers": false, "landing": {"resolved_ref_count": 30, "resolved_source_count": 9, "status": "resolved", "v1_entity_id": "ACO-RPR-002"}, "target_id": "ACO-RPR-002"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 81, "resolved_source_count": 14, "status": "resolved", "v1_entity_id": "ACO-SCBI-004"}, "target_id": "ACO-SCBI-004"}, {"alignment_type": "partial", "confidence": 0.85, "covers": true, "landing": {"resolved_ref_count": 41, "resolved_source_count": 8, "status": "resolved", "v1_entity_id": "ACO-SCBI-005"}, "target_id": "ACO-SCBI-005"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 33, "resolved_source_count": 10, "status": "resolved", "v1_entity_id": "ACO-SCBI-006"}, "target_id": "ACO-SCBI-006"}], "control_confidence": 0.87, "control_id": "CTRL-code-integrity-integridade-e-governacao-de-pipelines-d5b14eeef2", "control_justification": ["bundle_grounding", "chapter_grounding", "domain_mapping"]}], "coverage_rule": "um CO conta como coberto se tiver >=1 alinhamento exact ou partial; related não cobre", "covered": true, "label": "coverage_compensated"}, "direct": {"provenance": null, "source_anchors": [], "status": "none_authored"}, "record_type": "requirement_coverage", "requirement_id": "CIC-008"}
59
59
  {"category": "CIC", "compensated": {"chains": [{"alignments": [{"alignment_type": "related", "confidence": 0.7, "covers": false, "landing": {"resolved_ref_count": 49, "resolved_source_count": 7, "status": "resolved", "v1_entity_id": "ACO-RPR-001"}, "target_id": "ACO-RPR-001"}, {"alignment_type": "related", "confidence": 0.7, "covers": false, "landing": {"resolved_ref_count": 30, "resolved_source_count": 9, "status": "resolved", "v1_entity_id": "ACO-RPR-002"}, "target_id": "ACO-RPR-002"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 81, "resolved_source_count": 14, "status": "resolved", "v1_entity_id": "ACO-SCBI-004"}, "target_id": "ACO-SCBI-004"}, {"alignment_type": "partial", "confidence": 0.85, "covers": true, "landing": {"resolved_ref_count": 41, "resolved_source_count": 8, "status": "resolved", "v1_entity_id": "ACO-SCBI-005"}, "target_id": "ACO-SCBI-005"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 33, "resolved_source_count": 10, "status": "resolved", "v1_entity_id": "ACO-SCBI-006"}, "target_id": "ACO-SCBI-006"}], "control_confidence": 0.87, "control_id": "CTRL-code-integrity-integridade-e-governacao-de-pipelines-d5b14eeef2", "control_justification": ["bundle_grounding", "chapter_grounding", "domain_mapping"]}], "coverage_rule": "um CO conta como coberto se tiver >=1 alinhamento exact ou partial; related não cobre", "covered": true, "label": "coverage_compensated"}, "direct": {"provenance": null, "source_anchors": [], "status": "none_authored"}, "record_type": "requirement_coverage", "requirement_id": "CIC-009"}
60
60
  {"category": "CIC", "compensated": {"chains": [{"alignments": [{"alignment_type": "related", "confidence": 0.7, "covers": false, "landing": {"resolved_ref_count": 49, "resolved_source_count": 7, "status": "resolved", "v1_entity_id": "ACO-RPR-001"}, "target_id": "ACO-RPR-001"}, {"alignment_type": "related", "confidence": 0.7, "covers": false, "landing": {"resolved_ref_count": 30, "resolved_source_count": 9, "status": "resolved", "v1_entity_id": "ACO-RPR-002"}, "target_id": "ACO-RPR-002"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 81, "resolved_source_count": 14, "status": "resolved", "v1_entity_id": "ACO-SCBI-004"}, "target_id": "ACO-SCBI-004"}, {"alignment_type": "partial", "confidence": 0.85, "covers": true, "landing": {"resolved_ref_count": 41, "resolved_source_count": 8, "status": "resolved", "v1_entity_id": "ACO-SCBI-005"}, "target_id": "ACO-SCBI-005"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 33, "resolved_source_count": 10, "status": "resolved", "v1_entity_id": "ACO-SCBI-006"}, "target_id": "ACO-SCBI-006"}], "control_confidence": 0.9129, "control_id": "CTRL-code-integrity-integridade-e-governacao-de-pipelines-d5b14eeef2", "control_justification": ["bundle_grounding", "chapter_grounding", "domain_mapping", "lexical_alignment"]}], "coverage_rule": "um CO conta como coberto se tiver >=1 alinhamento exact ou partial; related não cobre", "covered": true, "label": "coverage_compensated"}, "direct": {"provenance": null, "source_anchors": [], "status": "none_authored"}, "record_type": "requirement_coverage", "requirement_id": "CIC-010"}
61
+ {"category": "CIC", "compensated": {"chains": [{"alignments": [{"alignment_type": "related", "confidence": 0.7, "covers": false, "landing": {"resolved_ref_count": 49, "resolved_source_count": 7, "status": "resolved", "v1_entity_id": "ACO-RPR-001"}, "target_id": "ACO-RPR-001"}, {"alignment_type": "related", "confidence": 0.7, "covers": false, "landing": {"resolved_ref_count": 30, "resolved_source_count": 9, "status": "resolved", "v1_entity_id": "ACO-RPR-002"}, "target_id": "ACO-RPR-002"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 81, "resolved_source_count": 14, "status": "resolved", "v1_entity_id": "ACO-SCBI-004"}, "target_id": "ACO-SCBI-004"}, {"alignment_type": "partial", "confidence": 0.85, "covers": true, "landing": {"resolved_ref_count": 41, "resolved_source_count": 8, "status": "resolved", "v1_entity_id": "ACO-SCBI-005"}, "target_id": "ACO-SCBI-005"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 33, "resolved_source_count": 10, "status": "resolved", "v1_entity_id": "ACO-SCBI-006"}, "target_id": "ACO-SCBI-006"}], "control_confidence": 0.87, "control_id": "CTRL-code-integrity-integridade-e-governacao-de-pipelines-d5b14eeef2", "control_justification": ["bundle_grounding", "chapter_grounding", "domain_mapping"]}], "coverage_rule": "um CO conta como coberto se tiver >=1 alinhamento exact ou partial; related não cobre", "covered": true, "label": "coverage_compensated"}, "direct": {"provenance": null, "source_anchors": [], "status": "none_authored"}, "record_type": "requirement_coverage", "requirement_id": "CIC-011"}
61
62
  {"category": "CLA", "compensated": {"chains": [{"alignments": [{"alignment_type": "related", "confidence": 0.7, "covers": false, "landing": {"resolved_ref_count": 18, "resolved_source_count": 3, "status": "resolved", "v1_entity_id": "ACO-TMR-004"}, "target_id": "ACO-TMR-004"}, {"alignment_type": "partial", "confidence": 0.85, "covers": true, "landing": {"resolved_ref_count": 222, "resolved_source_count": 21, "status": "resolved", "v1_entity_id": "ACO-TMR-005"}, "target_id": "ACO-TMR-005"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 284, "resolved_source_count": 17, "status": "resolved", "v1_entity_id": "ACO-TMR-008"}, "target_id": "ACO-TMR-008"}], "control_confidence": 0.98, "control_id": "CTRL-governance-classificacao-e-governacao-por-risco-97aceecf29", "control_justification": ["bundle_grounding", "chapter_grounding", "domain_mapping", "single_control_bundle"]}], "coverage_rule": "um CO conta como coberto se tiver >=1 alinhamento exact ou partial; related não cobre", "covered": true, "label": "coverage_compensated"}, "direct": {"provenance": null, "source_anchors": [], "status": "none_authored"}, "record_type": "requirement_coverage", "requirement_id": "CLA-001"}
62
63
  {"category": "CLA", "compensated": {"chains": [{"alignments": [{"alignment_type": "related", "confidence": 0.7, "covers": false, "landing": {"resolved_ref_count": 18, "resolved_source_count": 3, "status": "resolved", "v1_entity_id": "ACO-TMR-004"}, "target_id": "ACO-TMR-004"}, {"alignment_type": "partial", "confidence": 0.85, "covers": true, "landing": {"resolved_ref_count": 222, "resolved_source_count": 21, "status": "resolved", "v1_entity_id": "ACO-TMR-005"}, "target_id": "ACO-TMR-005"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 284, "resolved_source_count": 17, "status": "resolved", "v1_entity_id": "ACO-TMR-008"}, "target_id": "ACO-TMR-008"}], "control_confidence": 0.98, "control_id": "CTRL-governance-classificacao-e-governacao-por-risco-97aceecf29", "control_justification": ["bundle_grounding", "chapter_grounding", "domain_mapping", "single_control_bundle"]}], "coverage_rule": "um CO conta como coberto se tiver >=1 alinhamento exact ou partial; related não cobre", "covered": true, "label": "coverage_compensated"}, "direct": {"provenance": null, "source_anchors": [], "status": "none_authored"}, "record_type": "requirement_coverage", "requirement_id": "CLA-002"}
63
64
  {"category": "CLA", "compensated": {"chains": [{"alignments": [{"alignment_type": "related", "confidence": 0.7, "covers": false, "landing": {"resolved_ref_count": 18, "resolved_source_count": 3, "status": "resolved", "v1_entity_id": "ACO-TMR-004"}, "target_id": "ACO-TMR-004"}, {"alignment_type": "partial", "confidence": 0.85, "covers": true, "landing": {"resolved_ref_count": 222, "resolved_source_count": 21, "status": "resolved", "v1_entity_id": "ACO-TMR-005"}, "target_id": "ACO-TMR-005"}, {"alignment_type": "exact", "confidence": 0.95, "covers": true, "landing": {"resolved_ref_count": 284, "resolved_source_count": 17, "status": "resolved", "v1_entity_id": "ACO-TMR-008"}, "target_id": "ACO-TMR-008"}], "control_confidence": 0.98, "control_id": "CTRL-governance-classificacao-e-governacao-por-risco-97aceecf29", "control_justification": ["bundle_grounding", "chapter_grounding", "domain_mapping", "single_control_bundle"]}], "coverage_rule": "um CO conta como coberto se tiver >=1 alinhamento exact ou partial; related não cobre", "covered": true, "label": "coverage_compensated"}, "direct": {"provenance": null, "source_anchors": [], "status": "none_authored"}, "record_type": "requirement_coverage", "requirement_id": "CLA-003"}
@@ -1,29 +1,29 @@
1
1
  {
2
2
  "branch": "HEAD",
3
- "commit_sha": "89ac3ba8f03002054033636b9a685729c1e0a590",
3
+ "commit_sha": "0576e914d4c933ddc1af25cb2c5570dd2afcf60f",
4
4
  "corpus_root": "manuals_src/docs/sbd-toe",
5
- "generated_at": "2026-09-08T17:29:06Z",
5
+ "generated_at": "2026-09-09T23:00:38Z",
6
6
  "llm_backend": "mock",
7
7
  "llm_model": "mock-heuristic",
8
8
  "manual": {
9
9
  "branch": "HEAD",
10
- "commit": "89ac3ba8f03002054033636b9a685729c1e0a590",
11
- "generated_at": "2026-09-08T17:29:06Z",
10
+ "commit": "0576e914d4c933ddc1af25cb2c5570dd2afcf60f",
11
+ "generated_at": "2026-09-09T23:00:38Z",
12
12
  "provenance": "derived-from-git",
13
13
  "repo": "SbD-ToE/sbd-toe-manual",
14
14
  "repo_url": "git@github.com:SbD-ToE/sbd-toe-manual.git",
15
- "tag": "v1.9.0",
16
- "version": "1.9.0"
15
+ "tag": "v1.14.0",
16
+ "version": "1.14.0"
17
17
  },
18
18
  "project_root": ".",
19
19
  "repo_url": "git@github.com:SbD-ToE/sbd-toe-manual.git",
20
- "run_id": "20260908T172906Z",
20
+ "run_id": "20260909T230038Z",
21
21
  "source_repo_dir": "data/source/SbD-ToE-Manual",
22
22
  "sync_mode": "reuse",
23
23
  "tool_version": "0.1.0",
24
24
  "version": "0.1.0",
25
25
  "release": {
26
- "channel": "dev-build",
27
- "version": "kg-v1-manual-v1.9.0-aligned-2026-09-08-v2.8"
26
+ "channel": "stable",
27
+ "version": "v1.12.0"
28
28
  }
29
29
  }
@@ -0,0 +1,20 @@
1
+ export interface AuthoredLinkBlock {
2
+ record_type: string;
3
+ subject: string;
4
+ subject_slug: string;
5
+ anchor: string;
6
+ clause: string;
7
+ violates: string[];
8
+ materializes: string[];
9
+ matches_current_catalog: boolean;
10
+ matched_antipattern_id: string | null;
11
+ authored_absence: Record<string, boolean>;
12
+ source_mode: string;
13
+ }
14
+ export declare function _resetAuthoredLinksCacheForTests(): void;
15
+ export declare function authoredLinkBlocks(): AuthoredLinkBlock[];
16
+ /**
17
+ * A banda para um âmbito de capítulos. Devolve `undefined` quando o pino não traz a camada —
18
+ * a ausência do ficheiro não é a ausência de ligações.
19
+ */
20
+ export declare function authoredLinksBand(chapters: readonly string[]): Record<string, unknown> | undefined;
@@ -0,0 +1,109 @@
1
+ /**
2
+ * 0.20.0-beta.48 (KG v1.12.0) — AS LIGAÇÕES AUTORADAS DOS ANTIPADRÕES.
3
+ *
4
+ * O Manual v1.14.0 anota, bloco a bloco, o que cada antipadrão VIOLA e o que MATERIALIZA —
5
+ * 26 + 24 = **50 ligações autoradas, com zero ids por resolver**. Até aqui a superfície de
6
+ * CONSULT só tinha a camada PONTUADA (7 arestas derivadas por scoring) e a banda dizia, com
7
+ * razão, que o servidor «não afirma este tópico, não tem ligação publicada que o diga».
8
+ * Agora tem — mas é uma camada DISTINTA, não uma substituição.
9
+ *
10
+ * O QUE NÃO SE FAZ AQUI, e é o ponto: **5 dos 30 blocos casam com as 26 entidades publicadas
11
+ * e 25 não.** O descasamento está declarado bloco a bloco na fonte (`matches_current_catalog`)
12
+ * e **não se alinha nem se esconde** — é o achado, e a reconciliação dos conjuntos é decisão
13
+ * de modelo que está no Archon (Q-AP1/2/3). Servir os 25 como se tivessem entidade seria
14
+ * inventar o casamento que a triagem existe para decidir.
15
+ *
16
+ * E 9 blocos declaram AUSÊNCIA AUTORADA — «sem requisito ligável no catálogo actual». São
17
+ * recusas deliberadas de ligar fraco, por instrução do lead: servem-se como ausência
18
+ * **autorada**, nunca como falha de extracção.
19
+ */
20
+ import { readFileSync, existsSync } from "node:fs";
21
+ import { resolveAppPath } from "../config.js";
22
+ const PATH = "data/publish/semantic/antipattern_authored_links.jsonl";
23
+ let cache;
24
+ export function _resetAuthoredLinksCacheForTests() {
25
+ cache = undefined;
26
+ }
27
+ function load() {
28
+ if (cache !== undefined)
29
+ return cache;
30
+ const path = resolveAppPath(PATH);
31
+ if (!existsSync(path)) {
32
+ cache = { header: undefined, blocks: [] };
33
+ return cache;
34
+ }
35
+ const rows = readFileSync(path, "utf-8")
36
+ .split("\n")
37
+ .map((l) => l.trim())
38
+ .filter((l) => l.length > 0)
39
+ .map((l) => JSON.parse(l));
40
+ const blocks = rows.filter((r) => r["record_type"] === "relaciona_block");
41
+ const header = rows.find((r) => r["record_type"] !== "relaciona_block");
42
+ cache = { header, blocks };
43
+ return cache;
44
+ }
45
+ export function authoredLinkBlocks() {
46
+ return load().blocks;
47
+ }
48
+ /**
49
+ * A banda para um âmbito de capítulos. Devolve `undefined` quando o pino não traz a camada —
50
+ * a ausência do ficheiro não é a ausência de ligações.
51
+ */
52
+ export function authoredLinksBand(chapters) {
53
+ const { blocks, header } = load();
54
+ if (blocks.length === 0)
55
+ return undefined;
56
+ const inScope = chapters.length === 0
57
+ ? blocks
58
+ : blocks.filter((b) => chapters.some((c) => b.anchor.startsWith(c)));
59
+ const links = inScope.reduce((n, b) => n + (b.violates?.length ?? 0) + (b.materializes?.length ?? 0), 0);
60
+ const unmatched = inScope.filter((b) => !b.matches_current_catalog);
61
+ const absences = inScope.filter((b) => Object.values(b.authored_absence ?? {}).some(Boolean));
62
+ const counts = (header?.["counts"] ?? {});
63
+ return {
64
+ layer: "authored",
65
+ source_mode: "authored",
66
+ note: "Ligações que o MANUAL anota (marcador «Relaciona.»): o que cada antipadrão **viola** e o que " +
67
+ "**materializa**, com âncora ficheiro:linha. Camada DISTINTA da pontuada, que se mantém ao lado — " +
68
+ "esta afirma AUTORIA, aquela afirma correspondência derivada por scoring. Não se somam.",
69
+ blocks: inScope.length,
70
+ links,
71
+ ...(header?.["epistemic"] !== undefined ? { source_declares: header["epistemic"] } : {}),
72
+ catalog_match: {
73
+ matched: inScope.length - unmatched.length,
74
+ unmatched: unmatched.length,
75
+ published_totals: {
76
+ blocks: counts["blocks"],
77
+ matched_current_catalog: counts["matched_current_catalog"],
78
+ unmatched_current_catalog: counts["unmatched_current_catalog"]
79
+ },
80
+ note: "**O descasamento é o achado, não um defeito a esconder.** Os blocos que não casam com as " +
81
+ "entidades de antipadrão publicadas ficam SEM entidade: as 26 actuais nascem de menções " +
82
+ "pontuadas, e as unidades que o Manual anota são outras. **O servidor não alinha os conjuntos** " +
83
+ "— qual deles É a entidade AntiPattern é decisão de modelo, em triagem. Lê estas ligações pela " +
84
+ "sua âncora, não como propriedades das entidades publicadas."
85
+ },
86
+ ...(absences.length > 0
87
+ ? {
88
+ authored_absences: {
89
+ count: absences.length,
90
+ note: "Blocos em que o autor declara explicitamente **não haver requisito/ameaça ligável no " +
91
+ "catálogo actual**. É recusa DELIBERADA de ligar fraco, não falha de extracção — e foi " +
92
+ "de uma destas declarações de escassez que nasceu o `CIC-011`.",
93
+ values: absences.map((b) => ({ subject: b.subject, anchor: b.anchor, authored_absence: b.authored_absence }))
94
+ }
95
+ }
96
+ : {}),
97
+ values: inScope.slice(0, 20).map((b) => ({
98
+ subject: b.subject,
99
+ anchor: b.anchor,
100
+ clause: b.clause,
101
+ violates: b.violates ?? [],
102
+ materializes: b.materializes ?? [],
103
+ has_published_entity: b.matches_current_catalog === true,
104
+ ...(b.matched_antipattern_id !== null ? { antipattern_id: b.matched_antipattern_id } : {})
105
+ })),
106
+ ...(inScope.length > 20 ? { truncated: { returned: 20, total: inScope.length } } : {})
107
+ };
108
+ }
109
+ //# sourceMappingURL=authored-antipattern-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authored-antipattern-links.js","sourceRoot":"","sources":["../../src/serving/authored-antipattern-links.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,IAAI,GAAG,wDAAwD,CAAC;AAoBtE,IAAI,KAAwB,CAAC;AAE7B,MAAM,UAAU,gCAAgC;IAC9C,KAAK,GAAG,SAAS,CAAC;AACpB,CAAC;AAED,SAAS,IAAI;IACX,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,KAAK,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC;SACrC,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SACnC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAA4B,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,iBAAiB,CAAmC,CAAC;IACrI,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,iBAAiB,CAAC,CAAC;IACjG,KAAK,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,EAAE,CAAC,MAAM,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAA2B;IAC3D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;IAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,OAAO,GACX,QAAQ,CAAC,MAAM,KAAK,CAAC;QACnB,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzG,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9F,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAA2B,CAAC;IACpE,OAAO;QACL,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,UAAU;QACvB,IAAI,EACF,+FAA+F;YAC/F,mGAAmG;YACnG,wFAAwF;QAC1F,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK;QACL,GAAG,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxF,aAAa,EAAE;YACb,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM;YAC1C,SAAS,EAAE,SAAS,CAAC,MAAM;YAC3B,gBAAgB,EAAE;gBAChB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC;gBACxB,uBAAuB,EAAE,MAAM,CAAC,yBAAyB,CAAC;gBAC1D,yBAAyB,EAAE,MAAM,CAAC,2BAA2B,CAAC;aAC/D;YACD,IAAI,EACF,2FAA2F;gBAC3F,yFAAyF;gBACzF,iGAAiG;gBACjG,gGAAgG;gBAChG,6DAA6D;SAChE;QACD,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YACrB,CAAC,CAAC;gBACE,iBAAiB,EAAE;oBACjB,KAAK,EAAE,QAAQ,CAAC,MAAM;oBACtB,IAAI,EACF,uFAAuF;wBACvF,wFAAwF;wBACxF,+DAA+D;oBACjE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;iBAC9G;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE;YAC1B,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,EAAE;YAClC,oBAAoB,EAAE,CAAC,CAAC,uBAAuB,KAAK,IAAI;YACxD,GAAG,CAAC,CAAC,CAAC,sBAAsB,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3F,CAAC,CAAC;QACH,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvF,CAAC;AACJ,CAAC"}
@@ -1,4 +1,22 @@
1
1
  export type AbsenceType = "gap" | "out_of_scope" | "deferred" | "elsewhere";
2
+ /**
3
+ * 0.20.0-beta.48 (KG v1.12.0) — os ESTADOS, que vivem no LEDGER e não no índice.
4
+ *
5
+ * `withdrawn` NÃO é `closed`: closed é «a condição cumpriu-se»; withdrawn é «a PREMISSA do
6
+ * registo era errada — nada faltava e nada se corrige». Servi-lo como fechado diria que
7
+ * houve uma dívida que se pagou, quando nunca houve dívida.
8
+ */
9
+ export type AbsenceStatus = "open" | "closed" | "withdrawn" | "reopened";
10
+ /** Uma transição registada no ledger append-only. */
11
+ export interface LedgerTransition {
12
+ absence_id: string;
13
+ transition: AbsenceStatus;
14
+ date?: string;
15
+ grounds?: string;
16
+ evidence?: string;
17
+ verified_by?: string;
18
+ registered_by?: string;
19
+ }
2
20
  export interface DeclaredAbsence {
3
21
  absence_id: string;
4
22
  statement: string;
@@ -20,6 +38,8 @@ export interface DeclaredAbsence {
20
38
  export interface AbsenceModel {
21
39
  criterion?: string;
22
40
  closure_rule?: string;
41
+ status_ledger?: string;
42
+ transitions?: Record<string, string>;
23
43
  values?: Record<string, string>;
24
44
  debt_of?: string[];
25
45
  note?: string;
@@ -42,9 +62,20 @@ export interface AbsenceBand {
42
62
  * que esta banda fazia até aqui: lia o `absence_type` e ignorava o `status`. Um consumidor
43
63
  * que agisse sobre isso ia trabalhar sobre uma dívida já paga.
44
64
  */
45
- status: "open" | "closed";
65
+ status: AbsenceStatus;
46
66
  is_debt: boolean;
47
67
  is_boundary: boolean;
68
+ /**
69
+ * 0.20.0-beta.48 — de ONDE veio o estado. O ledger prevalece sobre o índice para `status`;
70
+ * quando divergem, a banda mostra as duas coisas, porque achatar a divergência esconderia
71
+ * o mecanismo que a produz (o índice só absorve transições quando corta versão).
72
+ */
73
+ status_source?: "ledger" | "index";
74
+ ledger_transition?: LedgerTransition | undefined;
75
+ index_disagrees?: {
76
+ index_status: string;
77
+ note: string;
78
+ } | undefined;
48
79
  closed_on?: string;
49
80
  closed_evidence?: string;
50
81
  closed_registered_by?: string;