@shiftleftpt/sbd-toe-mcp 0.20.0-beta.42 → 0.20.0-beta.44

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 (32) hide show
  1. package/consumed-bundle.json +8 -8
  2. package/data/entities/proportionality.json +2 -2
  3. package/data/entities/sdlc_integration.json +190 -13
  4. package/data/publish/indexes/canonical_chunks.jsonl +4907 -4907
  5. package/data/publish/indexes/publication_manifest.json +6 -4
  6. package/data/publish/ontology/sbdtoe-ontology.yaml +91 -5
  7. package/data/publish/runtime/artifact_requirements.json +334 -1
  8. package/data/publish/runtime/assignments.json +243 -25
  9. package/data/publish/runtime/controls.json +7 -1
  10. package/data/publish/runtime/decision_involvements.json +2216 -0
  11. package/data/publish/runtime/deterministic_manifest.json +13 -2
  12. package/data/publish/runtime/phases.json +26 -4
  13. package/data/publish/runtime/roles.json +14 -0
  14. package/data/publish/runtime/user_stories.json +12 -6
  15. package/data/publish/runtime/v1/v1_manifest.json +1 -1
  16. package/data/publish/semantic/ctrl_acore_alignment.jsonl +1 -1
  17. package/data/publish/semantic/macro_processes.jsonl +1 -1
  18. package/data/publish/semantic/mp_edges.jsonl +1 -1
  19. package/data/reports/run_manifest.json +4 -4
  20. package/dist/serving/traversal-assertions.d.ts +65 -0
  21. package/dist/serving/traversal-assertions.js +135 -0
  22. package/dist/serving/traversal-assertions.js.map +1 -0
  23. package/dist/tools/get-chapter-capability.js +46 -9
  24. package/dist/tools/get-chapter-capability.js.map +1 -1
  25. package/dist/tools/get-guide-by-role.js +101 -0
  26. package/dist/tools/get-guide-by-role.js.map +1 -1
  27. package/dist/tools/ontology-loader.d.ts +28 -0
  28. package/dist/tools/ontology-loader.js +22 -0
  29. package/dist/tools/ontology-loader.js.map +1 -1
  30. package/dist/tools/structured-tools.js +7 -4
  31. package/dist/tools/structured-tools.js.map +1 -1
  32. package/package.json +1 -1
@@ -36,7 +36,7 @@
36
36
  "source_artifact": "data/entities/practices.json"
37
37
  },
38
38
  {
39
- "count": 1296,
39
+ "count": 1305,
40
40
  "entity_type": "PracticeAssignment",
41
41
  "file": "assignments.json",
42
42
  "name": "assignments",
@@ -121,6 +121,17 @@
121
121
  ],
122
122
  "source_artifact": "data/entities/artifact_requirements.json"
123
123
  },
124
+ {
125
+ "count": 163,
126
+ "entity_type": "DecisionInvolvement",
127
+ "file": "decision_involvements.json",
128
+ "name": "decision_involvements",
129
+ "profiles": [
130
+ "consult",
131
+ "guide"
132
+ ],
133
+ "source_artifact": "data/entities/decision_involvements.json"
134
+ },
124
135
  {
125
136
  "count": 305,
126
137
  "entity_type": "RequirementControlLink",
@@ -255,5 +266,5 @@
255
266
  ]
256
267
  }
257
268
  },
258
- "version": "manual-v1.8.1+sbdtoe-ontology-v2.6"
269
+ "version": "manual-v1.8.1+sbdtoe-ontology-v2.7"
259
270
  }
@@ -112,6 +112,7 @@
112
112
  "staging"
113
113
  ],
114
114
  "bundle_ids": [
115
+ "01-classificacao-aplicacoes",
115
116
  "02-requisitos-seguranca",
116
117
  "05-dependencias-sbom-sca",
117
118
  "07-cicd-seguro",
@@ -162,6 +163,7 @@
162
163
  "operacoes"
163
164
  ],
164
165
  "bundle_ids": [
166
+ "01-classificacao-aplicacoes",
165
167
  "02-requisitos-seguranca",
166
168
  "03-threat-modeling",
167
169
  "04-arquitetura-segura",
@@ -214,10 +216,9 @@
214
216
  }
215
217
  ],
216
218
  "phases_unassigned": {
217
- "assignment_count": 219,
218
- "chapter_count": 8,
219
+ "assignment_count": 195,
220
+ "chapter_count": 7,
219
221
  "chapters": [
220
- "01-classificacao-aplicacoes",
221
222
  "02-requisitos-seguranca",
222
223
  "03-threat-modeling",
223
224
  "05-dependencias-sbom-sca",
@@ -231,5 +232,26 @@
231
232
  "profiles": [
232
233
  "guide"
233
234
  ],
234
- "source_artifact": "data/entities/sdlc_phases_canonical_s6.json"
235
+ "source_artifact": "data/entities/sdlc_phases_canonical_s6.json",
236
+ "traversal_assertion": {
237
+ "does_not_assert": "contenção; cobertura do cap. 00 (piso); equivalência fase↔capítulo",
238
+ "source": "practice_assignments autorados",
239
+ "verb": "opera-na-fase"
240
+ },
241
+ "unmapped_phase_labels": {
242
+ "Alteração": 1,
243
+ "Build/Promoção": 1,
244
+ "CI/CD / Pré-release": 1,
245
+ "CI/CD / Staging": 1,
246
+ "Catalogação": 1,
247
+ "Definição": 1,
248
+ "Design/Refactor": 1,
249
+ "Dev/CI": 2,
250
+ "Execução": 1,
251
+ "Implementação": 1,
252
+ "Integração": 1,
253
+ "Início/Revisão": 1,
254
+ "Staging / Pré-release": 1,
255
+ "Sunsetting": 1
256
+ }
235
257
  }
@@ -134,5 +134,19 @@
134
134
  "profiles": [
135
135
  "guide"
136
136
  ],
137
+ "referenced_roles": {
138
+ "items": [
139
+ {
140
+ "absence_ref": "ABS-011",
141
+ "anchors": [
142
+ "13-formacao-onboarding/aplicacao-lifecycle.md:47 (US-01: «Como RH/PeopleOps, quero garantir formação obrigatória de onboarding em SbD…» — PROTAGONISTA de US autorada)",
143
+ "02-requisitos-seguranca/addon/02-lista-requisitos-base.md (mapeamento por domínio: responsável típico do cap. 13 inclui PeopleOps)"
144
+ ],
145
+ "canonical": false,
146
+ "label": "RH/PeopleOps",
147
+ "referenced_role_id": "rh-peopleops"
148
+ }
149
+ ]
150
+ },
137
151
  "source_artifact": "data/entities/canonical_roles_s5.json"
138
152
  }
@@ -31,13 +31,14 @@
31
31
  "Ferramenta, versão, data documentados",
32
32
  "Referência: [addon-11: Validação Assistida por Ferramentas](/sbd-toe/sbd-manual/classificacao-aplicacoes/addon/validacao-assistida-ferramentas)"
33
33
  ],
34
- "confidence": 0.85,
34
+ "confidence": 0.95,
35
35
  "context": null,
36
36
  "document_path": "010-sbd-manual/01-classificacao-aplicacoes/aplicacao-lifecycle.md",
37
37
  "evidence": [
38
38
  "user story heading detected: US-01 - Classificação inicial da aplicação",
39
39
  ":::userstory block extracted",
40
40
  "proportionality table extracted",
41
+ "sdlc integration table extracted",
41
42
  "artifact list extracted"
42
43
  ],
43
44
  "goal": "classificar a aplicação com base nos eixos Exposição, Dados e Impacto (E+D+I)",
@@ -75,13 +76,14 @@
75
76
  "Exceções documentadas, aprovadas por AppSec Engineer com justificação técnica",
76
77
  "AppSec Engineer valida mapeamento antes de entrada em backlog"
77
78
  ],
78
- "confidence": 0.85,
79
+ "confidence": 0.95,
79
80
  "context": null,
80
81
  "document_path": "010-sbd-manual/01-classificacao-aplicacoes/aplicacao-lifecycle.md",
81
82
  "evidence": [
82
83
  "user story heading detected: US-02 - Aplicação da matriz de controlo",
83
84
  ":::userstory block extracted",
84
85
  "proportionality table extracted",
86
+ "sdlc integration table extracted",
85
87
  "artifact list extracted"
86
88
  ],
87
89
  "goal": "aplicar a matriz de controlos e mapear cada requisito para REQ-XXX do Capítulo 02",
@@ -127,13 +129,14 @@
127
129
  "Se nível alterou: trilho de escalação documentado",
128
130
  "Referência: [addon-11: Validação Assistida por Ferramentas](/sbd-toe/sbd-manual/classificacao-aplicacoes/addon/validacao-assistida-ferramentas)"
129
131
  ],
130
- "confidence": 0.85,
132
+ "confidence": 0.95,
131
133
  "context": null,
132
134
  "document_path": "010-sbd-manual/01-classificacao-aplicacoes/aplicacao-lifecycle.md",
133
135
  "evidence": [
134
136
  "user story heading detected: US-03 - Revisão por alteração relevante (event-based)",
135
137
  ":::userstory block extracted",
136
138
  "proportionality table extracted",
139
+ "sdlc integration table extracted",
137
140
  "artifact list extracted"
138
141
  ],
139
142
  "goal": "rever a classificação de criticidade sempre que houver alterações relevantes",
@@ -171,13 +174,14 @@
171
174
  "Em L3: aprovação adicional por Gestão Executiva/CISO",
172
175
  "Entrada em ferramenta GRC com audit trail"
173
176
  ],
174
- "confidence": 0.85,
177
+ "confidence": 0.95,
175
178
  "context": null,
176
179
  "document_path": "010-sbd-manual/01-classificacao-aplicacoes/aplicacao-lifecycle.md",
177
180
  "evidence": [
178
181
  "user story heading detected: US-04 - Análise de risco residual",
179
182
  ":::userstory block extracted",
180
183
  "proportionality table extracted",
184
+ "sdlc integration table extracted",
181
185
  "artifact list extracted"
182
186
  ],
183
187
  "goal": "registar o risco residual após aplicar os controlos definidos",
@@ -215,13 +219,14 @@
215
219
  "Nenhuma exceção não-aprovada pendente",
216
220
  "Rastreamento: cada controlo ↔ evidência documentado"
217
221
  ],
218
- "confidence": 0.85,
222
+ "confidence": 0.95,
219
223
  "context": null,
220
224
  "document_path": "010-sbd-manual/01-classificacao-aplicacoes/aplicacao-lifecycle.md",
221
225
  "evidence": [
222
226
  "user story heading detected: US-05 - Validação antes do go-live",
223
227
  ":::userstory block extracted",
224
228
  "proportionality table extracted",
229
+ "sdlc integration table extracted",
225
230
  "artifact list extracted"
226
231
  ],
227
232
  "goal": "validar que os requisitos aplicáveis por nível de risco estão cumpridos antes da entrada em produção",
@@ -267,13 +272,14 @@
267
272
  "Validação por Arquitetos + especialistas de domínio concluída",
268
273
  "Referência: [addon-11: Validação Assistida por Ferramentas](/sbd-toe/sbd-manual/classificacao-aplicacoes/addon/validacao-assistida-ferramentas)"
269
274
  ],
270
- "confidence": 0.85,
275
+ "confidence": 0.95,
271
276
  "context": null,
272
277
  "document_path": "010-sbd-manual/01-classificacao-aplicacoes/aplicacao-lifecycle.md",
273
278
  "evidence": [
274
279
  "user story heading detected: US-06 - Mapeamento de ameaças por nível de risco",
275
280
  ":::userstory block extracted",
276
281
  "proportionality table extracted",
282
+ "sdlc integration table extracted",
277
283
  "artifact list extracted"
278
284
  ],
279
285
  "goal": "verificar se as ameaças esperadas para o nível de criticidade estão cobertas por controlos aplicados ou exceções rastreáveis",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "artifact_type": "v1_runtime_surface_manifest",
3
3
  "build": {
4
- "generated_at": "2026-09-07T13:37:20.178067+00:00",
4
+ "generated_at": "2026-09-08T11:34:32.300946+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.",
@@ -1,4 +1,4 @@
1
- {"confidence": {"exact": 0.95, "partial": 0.85, "related": 0.7}, "counts": {"aco_covered": 66, "aco_related_only": 9, "acp_with_supports_edge": 69, "alignments": 102, "emitted_base": 102, "emitted_derived_acp": 164, "exact": 52, "partial": 21, "related": 29}, "coverage_rule": "um CO conta como coberto se tiver >=1 alinhamento exact ou partial; related não cobre", "curation": {"curator": "archon-2026-09-03", "ratified_by": "programme-lead", "ratified_on": "2026-09-03", "source": "agentic/briefs/2026-09-03-archon-walkthrough-ctrl-acore-alinhamento.md"}, "derivation": {"acm": null, "acp": "cada ACP herda os alinhamentos dos ACO em supports_objectives (69/69 têm a aresta); derivação determinística, não curada"}, "epistemic_status": {"asserts": "model_correspondence", "composed_traceability": "coverage_compensated", "does_not_assert": "content_authorship"}, "layer": "ctrl_acore_alignment", "note": "ACM nunca emitidos (deferido F-W1); não-alinhados declarados aqui — nunca silêncio. Composto REQ->CTRL->ACO->ES é cobertura compensada, não autoria.", "pins": {"appsec_core_tag": "ontology-v1.1-fair-baseline", "sbdtoe_ontology_tag": "sbdtoe-ontology-v2.4"}, "record_type": "layer_manifest", "schema_version": "1.0", "source_models": {"acore": {"commit": "84fe8bf", "entities": {"control_objectives": 75, "mechanisms": 58, "practices": 69}, "ontology": "appsec-core", "tag": "ontology-v1.1-fair-baseline", "version": "V1.1"}, "ctrl": {"entities": 20, "ontology": "sbdtoe-ontology", "tag": "sbdtoe-ontology-v2.3", "version": "2.3"}}, "taxonomy": {"exact": "o CTRL e o CO afirmam o mesmo objecto de controlo; correspondência 1:1 no essencial", "partial": "sobreposição material sem cobertura total (CO repartido por vários CTRL, ou CTRL que excede o CO)", "related": "adjacência semântica que suporta rastreabilidade composta sem afirmar cobertura; inclui os CO de coerência de slice (*-007)"}, "unaligned": {"acm": [{"ids_count": 58, "reason": "a superfície V1 servida não materializa a aresta ACM→CO (supports/implements vazio nos components-drafts); deferido até F-W1 (materializar mecanismo→objectivo no V1) e então derivar como as ACP"}], "aco": [], "aco_related_only": [{"ids": ["ACO-IAT-007", "ACO-ATB-007", "ACO-TSV-007", "ACO-TMR-007", "ACO-SPC-007", "ACO-IVF-007", "ACO-ITS-007", "ACO-RPR-007", "ACO-SLG-007"], "reason": "CO de coerência de slice — agregam CO específicos já alinhados; cobertura chega pelos constituintes"}], "ctrl": [{"id": "CTRL-governance-capacitacao-e-onboarding-de-seguranca-f84db7abdf", "reason": "AppSec Core V1 não modela capacitação/formação — domínio organizacional fora do âmbito do Core"}, {"id": "CTRL-governance-governacao-organizacional-ownership-e-conformidade-761d416ead", "reason": "o Core V1 exclui governação organizacional/maturidade por desenho (module_split: só semântica AppSec reutilizável)"}, {"id": "CTRL-code-integrity-ambiente-e-tooling-de-desenvolvimento-governados-77015fa38a", "reason": "sem slice de ambiente/tooling de desenvolvimento no Core V1; candidato a ACR-watch se surgir pressão multi-fonte"}]}, "unaligned_absence_typing": {"acm": {"absence_id": "ABS-008", "absence_type": "deferred", "debt_of": "ontology_model", "decided_on": "2026-09-03", "owner": "Archon", "statement": "Alinhamento dos 58 ACM (acore_alignment.unaligned.acm)", "trigger": "F-W1 — materializar a aresta ACM→CO na superfície V1 e derivar como as ACP"}, "ctrl": {"absence_id": "ABS-009", "absence_type": "out_of_scope", "decided_by": "programme-lead", "decided_on": "2026-09-03", "evidence": "âmbito do Core V1 por desenho (gate do walkthrough)", "statement": "CTRL sem contraparte AppSec Core (CAP, C4, C3 — acore_alignment.unaligned.ctrl)"}, "source": "declared_absences (v2.6; índice central prevalece)"}}
1
+ {"confidence": {"exact": 0.95, "partial": 0.85, "related": 0.7}, "counts": {"aco_covered": 66, "aco_related_only": 9, "acp_with_supports_edge": 69, "alignments": 102, "emitted_base": 102, "emitted_derived_acp": 164, "exact": 52, "partial": 21, "related": 29}, "coverage_rule": "um CO conta como coberto se tiver >=1 alinhamento exact ou partial; related não cobre", "curation": {"curator": "archon-2026-09-03", "ratified_by": "programme-lead", "ratified_on": "2026-09-03", "source": "agentic/briefs/2026-09-03-archon-walkthrough-ctrl-acore-alinhamento.md"}, "derivation": {"acm": null, "acp": "cada ACP herda os alinhamentos dos ACO em supports_objectives (69/69 têm a aresta); derivação determinística, não curada"}, "epistemic_status": {"asserts": "model_correspondence", "composed_traceability": "coverage_compensated", "does_not_assert": "content_authorship"}, "layer": "ctrl_acore_alignment", "note": "ACM nunca emitidos (deferido F-W1); não-alinhados declarados aqui — nunca silêncio. Composto REQ->CTRL->ACO->ES é cobertura compensada, não autoria.", "pins": {"appsec_core_tag": "ontology-v1.1-fair-baseline", "sbdtoe_ontology_tag": "sbdtoe-ontology-v2.4"}, "record_type": "layer_manifest", "schema_version": "1.0", "source_models": {"acore": {"commit": "84fe8bf", "entities": {"control_objectives": 75, "mechanisms": 58, "practices": 69}, "ontology": "appsec-core", "tag": "ontology-v1.1-fair-baseline", "version": "V1.1"}, "ctrl": {"entities": 20, "ontology": "sbdtoe-ontology", "tag": "sbdtoe-ontology-v2.3", "version": "2.3"}}, "taxonomy": {"exact": "o CTRL e o CO afirmam o mesmo objecto de controlo; correspondência 1:1 no essencial", "partial": "sobreposição material sem cobertura total (CO repartido por vários CTRL, ou CTRL que excede o CO)", "related": "adjacência semântica que suporta rastreabilidade composta sem afirmar cobertura; inclui os CO de coerência de slice (*-007)"}, "traversal_assertion": {"does_not_assert": "autoria de conteúdo; cobertura por related", "source": "curadoria ratificada (102, tipada exact/partial/related)", "verb": "corresponde-a"}, "unaligned": {"acm": [{"ids_count": 58, "reason": "a superfície V1 servida não materializa a aresta ACM→CO (supports/implements vazio nos components-drafts); deferido até F-W1 (materializar mecanismo→objectivo no V1) e então derivar como as ACP"}], "aco": [], "aco_related_only": [{"ids": ["ACO-IAT-007", "ACO-ATB-007", "ACO-TSV-007", "ACO-TMR-007", "ACO-SPC-007", "ACO-IVF-007", "ACO-ITS-007", "ACO-RPR-007", "ACO-SLG-007"], "reason": "CO de coerência de slice — agregam CO específicos já alinhados; cobertura chega pelos constituintes"}], "ctrl": [{"id": "CTRL-governance-capacitacao-e-onboarding-de-seguranca-f84db7abdf", "reason": "AppSec Core V1 não modela capacitação/formação — domínio organizacional fora do âmbito do Core"}, {"id": "CTRL-governance-governacao-organizacional-ownership-e-conformidade-761d416ead", "reason": "o Core V1 exclui governação organizacional/maturidade por desenho (module_split: só semântica AppSec reutilizável)"}, {"id": "CTRL-code-integrity-ambiente-e-tooling-de-desenvolvimento-governados-77015fa38a", "reason": "sem slice de ambiente/tooling de desenvolvimento no Core V1; candidato a ACR-watch se surgir pressão multi-fonte"}]}, "unaligned_absence_typing": {"acm": {"absence_id": "ABS-008", "absence_type": "deferred", "debt_of": "ontology_model", "decided_on": "2026-09-03", "owner": "Archon", "statement": "Alinhamento dos 58 ACM (acore_alignment.unaligned.acm)", "trigger": "F-W1 — materializar a aresta ACM→CO na superfície V1 e derivar como as ACP"}, "ctrl": {"absence_id": "ABS-009", "absence_type": "out_of_scope", "decided_by": "programme-lead", "decided_on": "2026-09-03", "evidence": "âmbito do Core V1 por desenho (gate do walkthrough)", "statement": "CTRL sem contraparte AppSec Core (CAP, C4, C3 — acore_alignment.unaligned.ctrl)"}, "source": "declared_absences (v2.6; índice central prevalece)"}}
2
2
  {"alignment_type": "partial", "confidence": 0.85, "curation": {"curator": "archon-2026-09-03", "ratified_by": "programme-lead", "ratified_on": "2026-09-03", "source": "agentic/briefs/2026-09-03-archon-walkthrough-ctrl-acore-alinhamento.md"}, "link_id": "CTRL-code-integrity-desenvolvimento-seguro-e-validacao-de-codigo-63dedd7460|aligns_with|ACO-ITS-003", "rationale": "validação de pares autorizados origem/destino (INT-006) — o CO junta os dois", "record_type": "alignment", "source_id": "CTRL-code-integrity-desenvolvimento-seguro-e-validacao-de-codigo-63dedd7460", "source_type": "Control", "target_id": "ACO-ITS-003", "target_type": "AppSecCoreControlObjective"}
3
3
  {"alignment_type": "exact", "confidence": 0.95, "curation": {"curator": "archon-2026-09-03", "ratified_by": "programme-lead", "ratified_on": "2026-09-03", "source": "agentic/briefs/2026-09-03-archon-walkthrough-ctrl-acore-alinhamento.md"}, "link_id": "CTRL-code-integrity-desenvolvimento-seguro-e-validacao-de-codigo-63dedd7460|aligns_with|ACO-IVF-001", "rationale": "validação de contrato de input nas entradas (VAL-001)", "record_type": "alignment", "source_id": "CTRL-code-integrity-desenvolvimento-seguro-e-validacao-de-codigo-63dedd7460", "source_type": "Control", "target_id": "ACO-IVF-001", "target_type": "AppSecCoreControlObjective"}
4
4
  {"alignment_type": "exact", "confidence": 0.95, "curation": {"curator": "archon-2026-09-03", "ratified_by": "programme-lead", "ratified_on": "2026-09-03", "source": "agentic/briefs/2026-09-03-archon-walkthrough-ctrl-acore-alinhamento.md"}, "link_id": "CTRL-code-integrity-desenvolvimento-seguro-e-validacao-de-codigo-63dedd7460|aligns_with|ACO-IVF-002", "rationale": "schema, tipos e allowlists (VAL-002/003)", "record_type": "alignment", "source_id": "CTRL-code-integrity-desenvolvimento-seguro-e-validacao-de-codigo-63dedd7460", "source_type": "Control", "target_id": "ACO-IVF-002", "target_type": "AppSecCoreControlObjective"}
@@ -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": "ea6b396b9caa", "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"}, "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": "ea6b396b9caa", "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": "ea6b396b9caa", "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"}, "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": "ea6b396b9caa", "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"}
@@ -2,13 +2,13 @@
2
2
  "branch": "HEAD",
3
3
  "commit_sha": "ea6b396b9caa77beddf1096b56250fe073796e8f",
4
4
  "corpus_root": "manuals_src/docs/sbd-toe",
5
- "generated_at": "2026-09-07T13:36:41Z",
5
+ "generated_at": "2026-09-08T11:33:16Z",
6
6
  "llm_backend": "mock",
7
7
  "llm_model": "mock-heuristic",
8
8
  "manual": {
9
9
  "branch": "HEAD",
10
10
  "commit": "ea6b396b9caa77beddf1096b56250fe073796e8f",
11
- "generated_at": "2026-09-07T13:36:41Z",
11
+ "generated_at": "2026-09-08T11:33:16Z",
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",
@@ -17,13 +17,13 @@
17
17
  },
18
18
  "project_root": ".",
19
19
  "repo_url": "git@github.com:SbD-ToE/sbd-toe-manual.git",
20
- "run_id": "20260907T133641Z",
20
+ "run_id": "20260908T113316Z",
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
26
  "channel": "dev-build",
27
- "version": "kg-v1-manual-v1.8.1-aligned-2026-09-07"
27
+ "version": "kg-v1-manual-v1.8.1-aligned-2026-09-08-v2.7-r2"
28
28
  }
29
29
  }
@@ -0,0 +1,65 @@
1
+ export interface TraversalAssertion {
2
+ /** O VERBO que a travessia afirma. */
3
+ verb: string;
4
+ /** A fonte autorada de que deriva. */
5
+ source: string;
6
+ /** O que a travessia NÃO afirma — a peça que tem de chegar ao consumidor. */
7
+ does_not_assert: string;
8
+ note?: string;
9
+ }
10
+ export declare function _resetTraversalAssertionsCacheForTests(): void;
11
+ export declare function traversalAssertionIds(): string[];
12
+ export interface AssertionBand {
13
+ verb: string;
14
+ source: string;
15
+ does_not_assert: string;
16
+ note?: string;
17
+ published: boolean;
18
+ rule?: string;
19
+ }
20
+ /**
21
+ * A banda que acompanha uma travessia servida. `published: false` quando a ontologia deste
22
+ * pino não a publica — o consumidor fica a saber que a travessia é servida SEM asserção
23
+ * declarada, em vez de a receber como se fosse garantida.
24
+ */
25
+ export declare function assertionFor(id: string): AssertionBand;
26
+ /**
27
+ * 0.20.0-beta.43 (v2.7) — PAPÉIS REFERENCIADOS-NÃO-CANÓNICOS.
28
+ *
29
+ * O Manual nomeia papéis que NÃO estão no vocabulário canónico — RH/PeopleOps é protagonista
30
+ * de uma user story autorada do cap. 13 e não é um dos 13. Servi-lo como 14.º canónico seria
31
+ * inventar vocabulário; não o servir de todo seria dizer que não existe. Serve-se como o que
32
+ * é: referenciado, com as ÂNCORAS que o provam, e explicitamente fora da contagem canónica.
33
+ */
34
+ export interface ReferencedRole {
35
+ referenced_role_id: string;
36
+ label: string;
37
+ canonical: boolean;
38
+ anchors: string[];
39
+ absence_ref?: string;
40
+ }
41
+ export declare function referencedRoles(): ReferencedRole[];
42
+ /** O papel referenciado que corresponde a um valor pedido, se houver. */
43
+ export declare function referencedRoleFor(value: string): ReferencedRole | undefined;
44
+ /**
45
+ * 0.20.0-beta.43 — O MANIFESTO DO PINO PROMETE, O PINO NÃO ENVIA.
46
+ *
47
+ * O `deterministic_manifest.json` deste pino declara entidades com nome, contagem e ficheiro.
48
+ * Se um desses ficheiros não vier no bundle, a superfície que o serviria **não pode existir**
49
+ * — e o consumidor tem de o saber por quem lhe responde, não por dedução. É a promessa
50
+ * nunca-silêncio aplicada ao PRÓPRIO PINO: a b.38 fechou-a no nosso pacote, e a mesma classe
51
+ * vale para o substrato que consumimos.
52
+ *
53
+ * O servidor NÃO vai buscar o ficheiro fora do artefacto pinado, mesmo que ele exista na
54
+ * árvore de origem: a proveniência é verificada por digest contra o artefacto, e servir de
55
+ * fora dele seria servir o que ninguém verificou.
56
+ */
57
+ export interface ManifestGap {
58
+ entity_type: string;
59
+ name: string;
60
+ file: string;
61
+ declared_count: number;
62
+ }
63
+ export declare function manifestGaps(): ManifestGap[];
64
+ /** A banda para uma entidade que o manifesto declara e o pino não traz. */
65
+ export declare function manifestGapBand(name: string): Record<string, unknown> | undefined;
@@ -0,0 +1,135 @@
1
+ /**
2
+ * 0.20.0-beta.43 — AS ASSERÇÕES DE TRAVESSIA, servidas ao CONSUMIDOR.
3
+ *
4
+ * PORQUÊ. A ontologia v2.7 publica, para cada travessia derivada, o que ela afirma e — o que
5
+ * interessa — **o que NÃO afirma**. A regra tem quatro partes e a terceira é a que dá sentido
6
+ * a esta vaga: *«(iii) o que NÃO afirma (asserções negativas obrigatórias)»*.
7
+ *
8
+ * **Uma asserção negativa que fica no envelope não protege ninguém.** Foi exactamente o que
9
+ * faltou na b.40: a vista de capacidade separou definidores de citadores — correcto — e
10
+ * chamou `own` ao lado definidor. O verbo publicado é `produced_or_operated_by`, e a fonte
11
+ * diz explicitamente que **não afirma posse**. A palavra «posse» entrou no vocabulário
12
+ * servido por não haver nada que a impedisse; agora há, e não volta.
13
+ *
14
+ * Servido VERBATIM da ontologia: verbo, fonte autorada e a lista do que não se afirma. Se a
15
+ * ontologia deixar de publicar uma travessia que uma superfície serve, a banda di-lo em vez
16
+ * de a inventar — a promessa nunca-silêncio aplicada à própria maquinaria de declaração.
17
+ */
18
+ import { readFileSync, existsSync } from "node:fs";
19
+ import { parse as parseYaml } from "yaml";
20
+ import { resolveAppPath } from "../config.js";
21
+ const ONTOLOGY_PATH = "data/publish/ontology/sbdtoe-ontology.yaml";
22
+ let cache;
23
+ export function _resetTraversalAssertionsCacheForTests() {
24
+ cache = undefined;
25
+ }
26
+ function load() {
27
+ if (cache !== undefined)
28
+ return cache;
29
+ const path = resolveAppPath(ONTOLOGY_PATH);
30
+ if (!existsSync(path)) {
31
+ cache = { assertions: {}, rule: undefined };
32
+ return cache;
33
+ }
34
+ const doc = parseYaml(readFileSync(path, "utf-8"));
35
+ const sp = doc["segmentation_principle"];
36
+ const raw = (sp?.["traversal_assertions"] ?? {});
37
+ const assertions = {};
38
+ for (const [id, value] of Object.entries(raw)) {
39
+ if (value === null || typeof value !== "object")
40
+ continue;
41
+ const v = value;
42
+ if (typeof v["verb"] !== "string" || typeof v["does_not_assert"] !== "string")
43
+ continue;
44
+ assertions[id] = {
45
+ verb: v["verb"],
46
+ source: typeof v["source"] === "string" ? v["source"] : "",
47
+ does_not_assert: v["does_not_assert"],
48
+ ...(typeof v["note"] === "string" ? { note: v["note"] } : {})
49
+ };
50
+ }
51
+ const rule = sp?.["traversal_assertion_rule"]?.statement;
52
+ cache = { assertions, rule: typeof rule === "string" ? rule : undefined };
53
+ return cache;
54
+ }
55
+ export function traversalAssertionIds() {
56
+ return Object.keys(load().assertions).sort();
57
+ }
58
+ /**
59
+ * A banda que acompanha uma travessia servida. `published: false` quando a ontologia deste
60
+ * pino não a publica — o consumidor fica a saber que a travessia é servida SEM asserção
61
+ * declarada, em vez de a receber como se fosse garantida.
62
+ */
63
+ export function assertionFor(id) {
64
+ const { assertions, rule } = load();
65
+ const a = assertions[id];
66
+ if (a === undefined)
67
+ return {
68
+ verb: "não publicado",
69
+ source: "",
70
+ does_not_assert: "a ontologia deste pino NÃO publica asserção para esta travessia — o servidor não a inventa. " +
71
+ "Lê o que se segue como junção derivada sem contrato declarado.",
72
+ published: false
73
+ };
74
+ return { ...a, published: true, ...(rule !== undefined ? { rule } : {}) };
75
+ }
76
+ export function referencedRoles() {
77
+ const path = resolveAppPath(ONTOLOGY_PATH);
78
+ if (!existsSync(path))
79
+ return [];
80
+ const doc = parseYaml(readFileSync(path, "utf-8"));
81
+ const raw = doc["referenced_roles"]?.items;
82
+ if (!Array.isArray(raw))
83
+ return [];
84
+ return raw.filter((r) => typeof r?.referenced_role_id === "string" && r.canonical === false);
85
+ }
86
+ /** O papel referenciado que corresponde a um valor pedido, se houver. */
87
+ export function referencedRoleFor(value) {
88
+ const norm = (x) => x.toLowerCase().replace(/[^a-z0-9]+/g, "");
89
+ const n = norm(value);
90
+ return referencedRoles().find((r) => norm(r.referenced_role_id) === n || norm(r.label) === n);
91
+ }
92
+ export function manifestGaps() {
93
+ const manifestPath = resolveAppPath("data/publish/runtime/deterministic_manifest.json");
94
+ if (!existsSync(manifestPath))
95
+ return [];
96
+ const doc = JSON.parse(readFileSync(manifestPath, "utf-8"));
97
+ const lists = Object.values(doc).filter((v) => Array.isArray(v));
98
+ const out = [];
99
+ for (const list of lists)
100
+ for (const entry of list) {
101
+ if (entry === null || typeof entry !== "object")
102
+ continue;
103
+ const file = entry["file"];
104
+ const name = entry["name"];
105
+ if (typeof file !== "string" || typeof name !== "string")
106
+ continue;
107
+ if (existsSync(resolveAppPath(`data/publish/runtime/${file}`)))
108
+ continue;
109
+ out.push({
110
+ entity_type: typeof entry["entity_type"] === "string" ? entry["entity_type"] : name,
111
+ name,
112
+ file,
113
+ declared_count: typeof entry["count"] === "number" ? entry["count"] : -1
114
+ });
115
+ }
116
+ return out;
117
+ }
118
+ /** A banda para uma entidade que o manifesto declara e o pino não traz. */
119
+ export function manifestGapBand(name) {
120
+ const gap = manifestGaps().find((g) => g.name === name);
121
+ if (gap === undefined)
122
+ return undefined;
123
+ return {
124
+ entity_type: gap.entity_type,
125
+ declared_in_manifest: gap.declared_count,
126
+ file: gap.file,
127
+ shipped: false,
128
+ note: `O manifesto deste pino declara **${gap.declared_count} registos de \`${gap.entity_type}\`** no ficheiro ` +
129
+ `\`${gap.file}\`, e **o bundle não traz esse ficheiro**. A superfície que os serviria não existe aqui — ` +
130
+ "não porque o conteúdo não exista, mas porque não foi empacotado. O servidor **não vai buscá-lo fora do " +
131
+ "artefacto pinado**: a proveniência é verificada por digest, e servir de fora seria servir o que ninguém " +
132
+ "verificou. Achado de EMPACOTAMENTO a montante, reportado ao programa."
133
+ };
134
+ }
135
+ //# sourceMappingURL=traversal-assertions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traversal-assertions.js","sourceRoot":"","sources":["../../src/serving/traversal-assertions.ts"],"names":[],"mappings":"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"}