auto-sync: tudo-para-ia-mais-humana 2026-05-02 07:24:14
This commit is contained in:
Binary file not shown.
13
dados/canonical-migration-central-write-status.json
Normal file
13
dados/canonical-migration-central-write-status.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"centralPlatformFolder": "G:\\_codex-git\\nucleo-gestao-operacional\\central-de-ordem-de-servico\\projects\\15_repo_tudo-para-ia-mais-humana-platform",
|
||||
"centralReportError": "PermissionError: [Errno 13] Permission denied: 'G:\\\\_codex-git\\\\nucleo-gestao-operacional\\\\central-de-ordem-de-servico\\\\projects\\\\15_repo_tudo-para-ia-mais-humana-platform\\\\reports\\\\EXECUTADO__canonical-migration-plan.md'",
|
||||
"centralReportOk": false,
|
||||
"centralReportPath": "G:\\_codex-git\\nucleo-gestao-operacional\\central-de-ordem-de-servico\\projects\\15_repo_tudo-para-ia-mais-humana-platform\\reports\\EXECUTADO__canonical-migration-plan.md",
|
||||
"centralSemanticWrite": {
|
||||
"attempted": true,
|
||||
"error": "PermissionError: [Errno 13] Permission denied: 'G:\\\\_codex-git\\\\nucleo-gestao-operacional\\\\central-de-ordem-de-servico\\\\projects\\\\15_repo_tudo-para-ia-mais-humana-platform\\\\reports\\\\EXECUTADO__canonical-migration-plan.md'",
|
||||
"files_count": 1,
|
||||
"ok": false,
|
||||
"sqlite_path": "G:\\_codex-git\\nucleo-gestao-operacional\\central-de-ordem-de-servico\\projects\\15_repo_tudo-para-ia-mais-humana-platform\\controle-semantico.sqlite"
|
||||
}
|
||||
}
|
||||
6440
dados/canonical-migration-plan.json
Normal file
6440
dados/canonical-migration-plan.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -464,7 +464,7 @@
|
||||
"G:\\_codex-git\\tudo-para-ia-mais-humana\\os-orientadoras\\central-materialization-fallback\\gerenciais\\0057_GERENCIAL__governar-migracao-coordenada-do-nome-canonico-platform.md",
|
||||
"G:\\_codex-git\\tudo-para-ia-mais-humana\\os-orientadoras\\central-materialization-fallback\\gerenciais\\0058_GERENCIAL__fechar-decisao-docs-response-ready-ou-catalogonly-formal.md"
|
||||
],
|
||||
"generated_at": "2026-05-02T09:22:50+00:00",
|
||||
"generated_at": "2026-05-02T10:22:58+00:00",
|
||||
"generated_files": [
|
||||
"G:\\_codex-git\\tudo-para-ia-mais-humana\\dados\\central-materialization-report.json",
|
||||
"G:\\_codex-git\\tudo-para-ia-mais-humana\\ecossistema\\CENTRAL-MATERIALIZATION-REPORT.md",
|
||||
@@ -764,7 +764,7 @@
|
||||
],
|
||||
"project_id": "tudo-para-ia-mais-humana-platform",
|
||||
"project_root": "G:\\_codex-git\\tudo-para-ia-mais-humana",
|
||||
"report_id": "central-materialization-916556597461",
|
||||
"report_id": "central-materialization-382892847432",
|
||||
"semantic_write": {
|
||||
"attempted": true,
|
||||
"error": "OperationalError: unable to open database file",
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
"path": "G:\\_codex-git\\nucleo-gestao-operacional\\central-de-ordem-de-servico\\projects\\15_repo_tudo-para-ia-mais-humana-platform\\indexes\\mcp-admin-route-acceptance-index.md"
|
||||
}
|
||||
],
|
||||
"generatedAt": "2026-05-02T08:24:24+00:00",
|
||||
"generatedAt": "2026-05-02T10:23:15+00:00",
|
||||
"ok": false
|
||||
}
|
||||
@@ -1120,571 +1120,11 @@
|
||||
"sourceRecordsHash": "d360c27674acf2dc72bf64f8678f65de79f3c10c7ecbe733c0f2148ecf261dd9",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.explicacao"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-043eb1e6a85bfc8da961f435",
|
||||
"humanNextAction": "homologar rota administrativa acao para compliance/cliente_externo",
|
||||
"operation": "acao",
|
||||
"permissionScope": "mcp.admin.action.request",
|
||||
"platformId": "compliance",
|
||||
"profileId": "cliente_externo",
|
||||
"routeId": "compliance.cliente_externo.acao.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "438d9c7af33d986ec89d61252cbf4ee68a300c692f7e918b51b393f4c2c8283d",
|
||||
"sourceRecordsHash": "043eb1e6a85bfc8da961f4358ce267f7d18fe93b613352f67ef09762c4917ff2",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.acao"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-fccdeeffbefda06bfc324d12",
|
||||
"humanNextAction": "homologar rota administrativa auditoria para compliance/cliente_externo",
|
||||
"operation": "auditoria",
|
||||
"permissionScope": "mcp.admin.audit",
|
||||
"platformId": "compliance",
|
||||
"profileId": "cliente_externo",
|
||||
"routeId": "compliance.cliente_externo.auditoria.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "4a24df0292527acbd75ee6599fc764f346cf58c156cf9f134816f8fdf2e29e40",
|
||||
"sourceRecordsHash": "fccdeeffbefda06bfc324d122be0a52ac1ea52a4b57dd691e336cf9c934d686d",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.auditoria"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-db5b3feefe77274a7ee958dd",
|
||||
"humanNextAction": "homologar rota administrativa consulta para compliance/cliente_externo",
|
||||
"operation": "consulta",
|
||||
"permissionScope": "mcp.admin.readonly",
|
||||
"platformId": "compliance",
|
||||
"profileId": "cliente_externo",
|
||||
"routeId": "compliance.cliente_externo.consulta.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "a797d3c908d83e7ec274c484f2294c005485a9c155f17374d9a760ec7015c4cb",
|
||||
"sourceRecordsHash": "db5b3feefe77274a7ee958dde60a934c9f0e84047f808746962a898396283ef4",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.consulta"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-a7c2e4b1a1a9b7efccef8ef7",
|
||||
"humanNextAction": "homologar rota administrativa diagnostico para compliance/cliente_externo",
|
||||
"operation": "diagnostico",
|
||||
"permissionScope": "mcp.admin.diagnostic",
|
||||
"platformId": "compliance",
|
||||
"profileId": "cliente_externo",
|
||||
"routeId": "compliance.cliente_externo.diagnostico.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "842485b47f1ded5d6dc50f3b3c566c52b1bdac7f2131373edaa8122f56f0b263",
|
||||
"sourceRecordsHash": "a7c2e4b1a1a9b7efccef8ef75df07645fbfe2f61b4f9e3df6e7b6fa67743b123",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.diagnostico"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-0769489680cf26dec1527f6e",
|
||||
"humanNextAction": "homologar rota administrativa explicacao para compliance/cliente_externo",
|
||||
"operation": "explicacao",
|
||||
"permissionScope": "mcp.admin.explain",
|
||||
"platformId": "compliance",
|
||||
"profileId": "cliente_externo",
|
||||
"routeId": "compliance.cliente_externo.explicacao.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "49c9fd99dd696919f71435c00d611b81caa198bed17af5a48eedcf79694fa900",
|
||||
"sourceRecordsHash": "0769489680cf26dec1527f6e2ab4a9287a80312e1aaa843d32db7bd686c6a2db",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.explicacao"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-e1574481a65786a59e8667be",
|
||||
"humanNextAction": "homologar rota administrativa acao para compliance/contador",
|
||||
"operation": "acao",
|
||||
"permissionScope": "mcp.admin.action.request",
|
||||
"platformId": "compliance",
|
||||
"profileId": "contador",
|
||||
"routeId": "compliance.contador.acao.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "76378cdd16d0e2119b5b5813981235f45a5a039ecced2c597b00a5a1a9aacffa",
|
||||
"sourceRecordsHash": "e1574481a65786a59e8667beb156cdb2b44ab9e1a2648d88a1b0c1776e87b827",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.acao"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-dfc305d7e6bc414380927365",
|
||||
"humanNextAction": "homologar rota administrativa auditoria para compliance/contador",
|
||||
"operation": "auditoria",
|
||||
"permissionScope": "mcp.admin.audit",
|
||||
"platformId": "compliance",
|
||||
"profileId": "contador",
|
||||
"routeId": "compliance.contador.auditoria.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "2471e4c9bd650f2b354523f9db8d9fff5216fe64dc7d051b637cd5ae1a31483d",
|
||||
"sourceRecordsHash": "dfc305d7e6bc4143809273658c11e7314b0bec0b21f0faf9e08347efba220448",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.auditoria"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-a781034adf6a863661f74c40",
|
||||
"humanNextAction": "homologar rota administrativa consulta para compliance/contador",
|
||||
"operation": "consulta",
|
||||
"permissionScope": "mcp.admin.readonly",
|
||||
"platformId": "compliance",
|
||||
"profileId": "contador",
|
||||
"routeId": "compliance.contador.consulta.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "df9f8c70a88faa7f2e1e60b2024113a60b074ac7fcb78a9c3bffdd2f28d83bca",
|
||||
"sourceRecordsHash": "a781034adf6a863661f74c40100a8fd5779a0100b7c8b852e6932ea4d354805f",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.consulta"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-3096bca3fbed3d072f4ba9c0",
|
||||
"humanNextAction": "homologar rota administrativa diagnostico para compliance/contador",
|
||||
"operation": "diagnostico",
|
||||
"permissionScope": "mcp.admin.diagnostic",
|
||||
"platformId": "compliance",
|
||||
"profileId": "contador",
|
||||
"routeId": "compliance.contador.diagnostico.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "606c0b708c88c9c427fb7516f9614874a51eb7d57632a15d9dcb44d1075f35ac",
|
||||
"sourceRecordsHash": "3096bca3fbed3d072f4ba9c07b793f8d51e17fc536ea09005fd2d839abcbe965",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.diagnostico"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-4a9d30a7a3d2c99afe6519be",
|
||||
"humanNextAction": "homologar rota administrativa explicacao para compliance/contador",
|
||||
"operation": "explicacao",
|
||||
"permissionScope": "mcp.admin.explain",
|
||||
"platformId": "compliance",
|
||||
"profileId": "contador",
|
||||
"routeId": "compliance.contador.explicacao.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "8b5ba21d027248869344dcd2a57e8a3dd73bc308e5b3a8223988e572de2d2e7e",
|
||||
"sourceRecordsHash": "4a9d30a7a3d2c99afe6519beb4b3d46c21bc7e7bf26b22806c6021b95344a160",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.explicacao"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-d9b19d82ef0a09658c9c29cd",
|
||||
"humanNextAction": "homologar rota administrativa acao para compliance/financeiro",
|
||||
"operation": "acao",
|
||||
"permissionScope": "mcp.admin.action.request",
|
||||
"platformId": "compliance",
|
||||
"profileId": "financeiro",
|
||||
"routeId": "compliance.financeiro.acao.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "57e0105999ad67d092c708017f1103b92bf2d41e6c4b94efedb30ae27a56f7ca",
|
||||
"sourceRecordsHash": "d9b19d82ef0a09658c9c29cdf100b90b9c8972d3d44f067cb7f622cc8f804a5c",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.acao"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-711c0bd1b8ce79facd1a08b9",
|
||||
"humanNextAction": "homologar rota administrativa auditoria para compliance/financeiro",
|
||||
"operation": "auditoria",
|
||||
"permissionScope": "mcp.admin.audit",
|
||||
"platformId": "compliance",
|
||||
"profileId": "financeiro",
|
||||
"routeId": "compliance.financeiro.auditoria.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "8dabea178584cd8eac838c210087fedc91a926395602d432453bc6d7897c749d",
|
||||
"sourceRecordsHash": "711c0bd1b8ce79facd1a08b980ade64387e8c977262e9343624e3b72fcb04dcc",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.auditoria"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-7fbb7dd1323952eeea9a0e1a",
|
||||
"humanNextAction": "homologar rota administrativa consulta para compliance/financeiro",
|
||||
"operation": "consulta",
|
||||
"permissionScope": "mcp.admin.readonly",
|
||||
"platformId": "compliance",
|
||||
"profileId": "financeiro",
|
||||
"routeId": "compliance.financeiro.consulta.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "ee28bde90f33cf3227073f4bf3e490d9e155eb70c3579e8f963cc4ea5ee68d58",
|
||||
"sourceRecordsHash": "7fbb7dd1323952eeea9a0e1aa9976621d861464d814baf4436ef6a9ebc8b4fa7",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.consulta"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-ca5156c0c8582f5c6e2fb561",
|
||||
"humanNextAction": "homologar rota administrativa diagnostico para compliance/financeiro",
|
||||
"operation": "diagnostico",
|
||||
"permissionScope": "mcp.admin.diagnostic",
|
||||
"platformId": "compliance",
|
||||
"profileId": "financeiro",
|
||||
"routeId": "compliance.financeiro.diagnostico.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "b21c4bf0c3ad4722c37ed6c1828bf0776d3dbb5068a401df2f535a431266515b",
|
||||
"sourceRecordsHash": "ca5156c0c8582f5c6e2fb561320d7a70c373abaeee2767a2b1a2332b6b3268d1",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.diagnostico"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-04399664610dafb4342c7fe8",
|
||||
"humanNextAction": "homologar rota administrativa explicacao para compliance/financeiro",
|
||||
"operation": "explicacao",
|
||||
"permissionScope": "mcp.admin.explain",
|
||||
"platformId": "compliance",
|
||||
"profileId": "financeiro",
|
||||
"routeId": "compliance.financeiro.explicacao.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "459fb8cc9a27e565f5af7023075657bbeb3fae176af7ac6371131bb3e3187fa5",
|
||||
"sourceRecordsHash": "04399664610dafb4342c7fe866699c4357a584ea16e889b222f0eabd43a863e4",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.explicacao"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-2c706d2f0f15d65a86425a7e",
|
||||
"humanNextAction": "homologar rota administrativa acao para compliance/gestor_operacional",
|
||||
"operation": "acao",
|
||||
"permissionScope": "mcp.admin.action.request",
|
||||
"platformId": "compliance",
|
||||
"profileId": "gestor_operacional",
|
||||
"routeId": "compliance.gestor_operacional.acao.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "4dc4b3184f00cae60fd5a367e952483b961a4f1ac2be7d0860bc82cb7a0de0b2",
|
||||
"sourceRecordsHash": "2c706d2f0f15d65a86425a7e128d29037cc4dac3c68ccff4f055ff002907475c",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.acao"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-626f043679ceb73668a44c49",
|
||||
"humanNextAction": "homologar rota administrativa auditoria para compliance/gestor_operacional",
|
||||
"operation": "auditoria",
|
||||
"permissionScope": "mcp.admin.audit",
|
||||
"platformId": "compliance",
|
||||
"profileId": "gestor_operacional",
|
||||
"routeId": "compliance.gestor_operacional.auditoria.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "9643383632a567bf814e5e22900230753659ce75eb4da362e1b17c30766b2bb4",
|
||||
"sourceRecordsHash": "626f043679ceb73668a44c494085f6b7bc019ddaabf0176c59cfa439d7c0c902",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.auditoria"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-71e9470868e3cd5cee4dcb5d",
|
||||
"humanNextAction": "homologar rota administrativa consulta para compliance/gestor_operacional",
|
||||
"operation": "consulta",
|
||||
"permissionScope": "mcp.admin.readonly",
|
||||
"platformId": "compliance",
|
||||
"profileId": "gestor_operacional",
|
||||
"routeId": "compliance.gestor_operacional.consulta.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "27092e4c7a47c9f953044fb8be415487afb52c85d44118e5e852936ccbb839d0",
|
||||
"sourceRecordsHash": "71e9470868e3cd5cee4dcb5dca0a9aa91ee95bbc33a366f64172faa3ff1424f7",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.consulta"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-3965499d44e0f059e2dd2754",
|
||||
"humanNextAction": "homologar rota administrativa diagnostico para compliance/gestor_operacional",
|
||||
"operation": "diagnostico",
|
||||
"permissionScope": "mcp.admin.diagnostic",
|
||||
"platformId": "compliance",
|
||||
"profileId": "gestor_operacional",
|
||||
"routeId": "compliance.gestor_operacional.diagnostico.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "0f0c7d15dd0cc66ae69ef3730a045a78d594dd60d618468a9bc569da93c03dbe",
|
||||
"sourceRecordsHash": "3965499d44e0f059e2dd275488a608c41c3b868c046c87cef625d672c36d974b",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.diagnostico"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-b2d18bdce27cf85ebc603fc9",
|
||||
"humanNextAction": "homologar rota administrativa explicacao para compliance/gestor_operacional",
|
||||
"operation": "explicacao",
|
||||
"permissionScope": "mcp.admin.explain",
|
||||
"platformId": "compliance",
|
||||
"profileId": "gestor_operacional",
|
||||
"routeId": "compliance.gestor_operacional.explicacao.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "cf53b062e44bef90594b122ba1f603ed7e19095eb67fa12651cbf78c61c9adcd",
|
||||
"sourceRecordsHash": "b2d18bdce27cf85ebc603fc9cb1b5a74e50ad7d32f3800210fd28e14c027e049",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.explicacao"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-6d4a344f9a12d1c66d4e3ec6",
|
||||
"humanNextAction": "homologar rota administrativa acao para compliance/juridico",
|
||||
"operation": "acao",
|
||||
"permissionScope": "mcp.admin.action.request",
|
||||
"platformId": "compliance",
|
||||
"profileId": "juridico",
|
||||
"routeId": "compliance.juridico.acao.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "eaa561405af97490b772dbdc3748c40415754bea5c5e4c3876bcc05c4948e200",
|
||||
"sourceRecordsHash": "6d4a344f9a12d1c66d4e3ec6b8da61a973cb9bd6918df5aabe41e4b1a775d970",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.acao"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-2985d0c7dda4c233b2fc59bd",
|
||||
"humanNextAction": "homologar rota administrativa auditoria para compliance/juridico",
|
||||
"operation": "auditoria",
|
||||
"permissionScope": "mcp.admin.audit",
|
||||
"platformId": "compliance",
|
||||
"profileId": "juridico",
|
||||
"routeId": "compliance.juridico.auditoria.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "630d3b626e5a65f86d5693a66afed56cb910319c86abf02f6a277eef80692ba2",
|
||||
"sourceRecordsHash": "2985d0c7dda4c233b2fc59bd5decf8e2802837164e4940ae47688b15fe972a0c",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.auditoria"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-e390831e33de80045514040f",
|
||||
"humanNextAction": "homologar rota administrativa consulta para compliance/juridico",
|
||||
"operation": "consulta",
|
||||
"permissionScope": "mcp.admin.readonly",
|
||||
"platformId": "compliance",
|
||||
"profileId": "juridico",
|
||||
"routeId": "compliance.juridico.consulta.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "8410b16e56eee12ed2e25f488fc132c1d76cc807c9f70c791a46740c2afe2f3d",
|
||||
"sourceRecordsHash": "e390831e33de80045514040faf207ce4fd8776582f13d6dfb40b81d2f641ddca",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.consulta"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-c4e66185cdf949f41f90a1ab",
|
||||
"humanNextAction": "homologar rota administrativa diagnostico para compliance/juridico",
|
||||
"operation": "diagnostico",
|
||||
"permissionScope": "mcp.admin.diagnostic",
|
||||
"platformId": "compliance",
|
||||
"profileId": "juridico",
|
||||
"routeId": "compliance.juridico.diagnostico.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "ba75d3dfddc8fcc0b8e2b6d116822ed9b37ead343f76416db844ddebf9a88d02",
|
||||
"sourceRecordsHash": "c4e66185cdf949f41f90a1abbc089be7ecc65c9d8517692efd326feddb6b4317",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.diagnostico"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-fbe864cfa750654d5741a786",
|
||||
"humanNextAction": "homologar rota administrativa explicacao para compliance/juridico",
|
||||
"operation": "explicacao",
|
||||
"permissionScope": "mcp.admin.explain",
|
||||
"platformId": "compliance",
|
||||
"profileId": "juridico",
|
||||
"routeId": "compliance.juridico.explicacao.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "3c1f71411ee7cf8aae746255293fa10ea0cf60d07f987aa8a61376ada8ed3645",
|
||||
"sourceRecordsHash": "fbe864cfa750654d5741a78695b9243f9b9270dd5ed2b048194991e248e36aef",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.explicacao"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-ad8ccf701e72652bcae80479",
|
||||
"humanNextAction": "homologar rota administrativa acao para compliance/planejamento_estrategico",
|
||||
"operation": "acao",
|
||||
"permissionScope": "mcp.admin.action.request",
|
||||
"platformId": "compliance",
|
||||
"profileId": "planejamento_estrategico",
|
||||
"routeId": "compliance.planejamento_estrategico.acao.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "c982b655518732cc50faa276f90f4169e99b084d399a2dabd8f270ac7effcb52",
|
||||
"sourceRecordsHash": "ad8ccf701e72652bcae804799f82e5a9bfc8e8f2603f2c5ecfc4c3a8736b99b4",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.acao"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-1e1b61e5839fae182833c595",
|
||||
"humanNextAction": "homologar rota administrativa auditoria para compliance/planejamento_estrategico",
|
||||
"operation": "auditoria",
|
||||
"permissionScope": "mcp.admin.audit",
|
||||
"platformId": "compliance",
|
||||
"profileId": "planejamento_estrategico",
|
||||
"routeId": "compliance.planejamento_estrategico.auditoria.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "f5da9b8c417c9be3e70f8b6500cccae83ac3caa7e6c7107df310e1cee1ce0ec5",
|
||||
"sourceRecordsHash": "1e1b61e5839fae182833c595af81468c81575a06293b48cbbf7641b32f3dec15",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.auditoria"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-e9e5e308341227e00a81a581",
|
||||
"humanNextAction": "homologar rota administrativa consulta para compliance/planejamento_estrategico",
|
||||
"operation": "consulta",
|
||||
"permissionScope": "mcp.admin.readonly",
|
||||
"platformId": "compliance",
|
||||
"profileId": "planejamento_estrategico",
|
||||
"routeId": "compliance.planejamento_estrategico.consulta.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "66aec318ba43e4b13c8893dfdc6176c1ea0288fab38e1ba4af30f81e56801c7a",
|
||||
"sourceRecordsHash": "e9e5e308341227e00a81a5810fa273ec006945e72543ed1808825f72a81f9b58",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.consulta"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-d219cbd8676c8a88b6927520",
|
||||
"humanNextAction": "homologar rota administrativa diagnostico para compliance/planejamento_estrategico",
|
||||
"operation": "diagnostico",
|
||||
"permissionScope": "mcp.admin.diagnostic",
|
||||
"platformId": "compliance",
|
||||
"profileId": "planejamento_estrategico",
|
||||
"routeId": "compliance.planejamento_estrategico.diagnostico.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "21a7580f3b9f68a456451cd6538a06a4aeb077714f23552674e96a553b96d12d",
|
||||
"sourceRecordsHash": "d219cbd8676c8a88b69275204dfc6a97723af6faab9aba8fb5ca10be43cf46c7",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.diagnostico"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-17931610f091a97b1be26182",
|
||||
"humanNextAction": "homologar rota administrativa explicacao para compliance/planejamento_estrategico",
|
||||
"operation": "explicacao",
|
||||
"permissionScope": "mcp.admin.explain",
|
||||
"platformId": "compliance",
|
||||
"profileId": "planejamento_estrategico",
|
||||
"routeId": "compliance.planejamento_estrategico.explicacao.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "af969ec8d85da56fa50ff88363f33e1578fbec2ec53ed1f2bd71242229175202",
|
||||
"sourceRecordsHash": "17931610f091a97b1be26182342e7e12a0d4608e07469cd9fb4abf46cb144fb7",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.explicacao"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-afb2d9e11859c0d9118a0a0e",
|
||||
"humanNextAction": "homologar rota administrativa acao para compliance/secretaria",
|
||||
"operation": "acao",
|
||||
"permissionScope": "mcp.admin.action.request",
|
||||
"platformId": "compliance",
|
||||
"profileId": "secretaria",
|
||||
"routeId": "compliance.secretaria.acao.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "240c3db34b8a8d9ee81d8dd70f6d46083398021292cd87b8dd3e8b15a6581b75",
|
||||
"sourceRecordsHash": "afb2d9e11859c0d9118a0a0e9f0bc753aa75c1bd4911800c66d9dc855bb17028",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.acao"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-ceff2af0341593dba74f07cf",
|
||||
"humanNextAction": "homologar rota administrativa auditoria para compliance/secretaria",
|
||||
"operation": "auditoria",
|
||||
"permissionScope": "mcp.admin.audit",
|
||||
"platformId": "compliance",
|
||||
"profileId": "secretaria",
|
||||
"routeId": "compliance.secretaria.auditoria.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "9deab34e4f3b4f2746c2abca72f1b6801a3ae11b0d7085b2ef2cb1ee92eee1bf",
|
||||
"sourceRecordsHash": "ceff2af0341593dba74f07cf5da64dfa64a7a0b786111b7641d2419a52866fae",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.auditoria"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-f3d917611ef8bb62c667c747",
|
||||
"humanNextAction": "homologar rota administrativa consulta para compliance/secretaria",
|
||||
"operation": "consulta",
|
||||
"permissionScope": "mcp.admin.readonly",
|
||||
"platformId": "compliance",
|
||||
"profileId": "secretaria",
|
||||
"routeId": "compliance.secretaria.consulta.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "4147bb28d4ead07aa35f4eb3e48ab2fc587b11a42b4660468bf53db3ae32ada0",
|
||||
"sourceRecordsHash": "f3d917611ef8bb62c667c7476bfc227ce1140ac6fbc7c454c6452e3024d631f3",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.consulta"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-2a2120f5e6ac500183f8afec",
|
||||
"humanNextAction": "homologar rota administrativa diagnostico para compliance/secretaria",
|
||||
"operation": "diagnostico",
|
||||
"permissionScope": "mcp.admin.diagnostic",
|
||||
"platformId": "compliance",
|
||||
"profileId": "secretaria",
|
||||
"routeId": "compliance.secretaria.diagnostico.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "fdb58bf8bda585eaee9d5d95223ba35565172a8890d90cba15aaf1353143841b",
|
||||
"sourceRecordsHash": "2a2120f5e6ac500183f8afecd19e3d0e64bd583b3c68090a6b5c4653152500f2",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.diagnostico"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-1a75fbf206a46a3a867c7f40",
|
||||
"humanNextAction": "homologar rota administrativa explicacao para compliance/secretaria",
|
||||
"operation": "explicacao",
|
||||
"permissionScope": "mcp.admin.explain",
|
||||
"platformId": "compliance",
|
||||
"profileId": "secretaria",
|
||||
"routeId": "compliance.secretaria.explicacao.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "36bf8a71338c1d2fc1a601c5d71df1101e3705bc95817412e756debc8cdb5144",
|
||||
"sourceRecordsHash": "1a75fbf206a46a3a867c7f40acb685866b1680601324d35e115c14cd9a7520b0",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.explicacao"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-36499e555d54edeb736f7f8c",
|
||||
"humanNextAction": "homologar rota administrativa acao para compliance/suporte",
|
||||
"operation": "acao",
|
||||
"permissionScope": "mcp.admin.action.request",
|
||||
"platformId": "compliance",
|
||||
"profileId": "suporte",
|
||||
"routeId": "compliance.suporte.acao.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "4f697a5f0129e0ea60fd03b5d942462d836f9c60beeac8b8b1c4b45f667104d1",
|
||||
"sourceRecordsHash": "36499e555d54edeb736f7f8c54d276aadd980cde29b2809b67b9825c029e7072",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.acao"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-b55cf00e3af8f4ec5e2b8325",
|
||||
"humanNextAction": "homologar rota administrativa auditoria para compliance/suporte",
|
||||
"operation": "auditoria",
|
||||
"permissionScope": "mcp.admin.audit",
|
||||
"platformId": "compliance",
|
||||
"profileId": "suporte",
|
||||
"routeId": "compliance.suporte.auditoria.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "04db6ab59588c434420ada8c74869401774b7ebc99436fc30d14fe6769365686",
|
||||
"sourceRecordsHash": "b55cf00e3af8f4ec5e2b832574db8ce9d7e7fd0a34466e458bd36cb812c526a0",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.auditoria"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-298456292b7717b5c5174ec5",
|
||||
"humanNextAction": "homologar rota administrativa consulta para compliance/suporte",
|
||||
"operation": "consulta",
|
||||
"permissionScope": "mcp.admin.readonly",
|
||||
"platformId": "compliance",
|
||||
"profileId": "suporte",
|
||||
"routeId": "compliance.suporte.consulta.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "807701cdddaa5c54c2b35e542afb59b37dc30487aa4a65aba78f54cc5ba59ab1",
|
||||
"sourceRecordsHash": "298456292b7717b5c5174ec5e7f17d3f288da7166dce04d7669681cdbcda181c",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.consulta"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-b67a15a015b3928efc9c4923",
|
||||
"humanNextAction": "homologar rota administrativa diagnostico para compliance/suporte",
|
||||
"operation": "diagnostico",
|
||||
"permissionScope": "mcp.admin.diagnostic",
|
||||
"platformId": "compliance",
|
||||
"profileId": "suporte",
|
||||
"routeId": "compliance.suporte.diagnostico.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "31036b94029c53ad7672843aa537af2045a7bde91936d529d32be0e102731acc",
|
||||
"sourceRecordsHash": "b67a15a015b3928efc9c4923cb3a19b38a6139e99ba9b86b6dac211f2159d0f7",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.diagnostico"
|
||||
},
|
||||
{
|
||||
"evidenceId": "evidence-0583bdb82cfbcaec1bfaf870",
|
||||
"humanNextAction": "homologar rota administrativa explicacao para compliance/suporte",
|
||||
"operation": "explicacao",
|
||||
"permissionScope": "mcp.admin.explain",
|
||||
"platformId": "compliance",
|
||||
"profileId": "suporte",
|
||||
"routeId": "compliance.suporte.explicacao.administration-route",
|
||||
"sameSource": true,
|
||||
"sourcePayloadHash": "b67ba4a2d78969a39a1acb3c1f075bc834b40d38c2da91510f39d5fb354d864f",
|
||||
"sourceRecordsHash": "0583bdb82cfbcaec1bfaf870f78ffbcbadbdaafc2df1ceda7b6724be5beac2ef",
|
||||
"status": "ready",
|
||||
"toolId": "mais_humana.admin.explicacao"
|
||||
}
|
||||
],
|
||||
"controlPlaneId": "tudo-para-ia-mcps-internos-plataform",
|
||||
"evidenceId": "evidence-3e8315d3681d99686af5b998",
|
||||
"generatedAt": "2026-05-02T08:24:24+00:00",
|
||||
"generatedAt": "2026-05-02T10:23:15+00:00",
|
||||
"operations": {
|
||||
"acao": 182,
|
||||
"auditoria": 182,
|
||||
@@ -1698,8 +1138,8 @@
|
||||
"providerId": "mais_humana",
|
||||
"readyCases": 520,
|
||||
"readyRatio": 0.5714285714285714,
|
||||
"reportId": "mcp-admin-route-acceptance-0687936a42e37619",
|
||||
"returnedCases": 120,
|
||||
"reportId": "mcp-admin-route-acceptance-9841af72a6e6588d",
|
||||
"returnedCases": 80,
|
||||
"sourceHash": "f9844f598bfbfb968acea6465fc4b8f7a277b5b071003f3808d1581ce3112363",
|
||||
"status": "blocked",
|
||||
"totalCases": 910
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@
|
||||
"path": "G:\\_codex-git\\nucleo-gestao-operacional\\central-de-ordem-de-servico\\projects\\15_repo_tudo-para-ia-mais-humana-platform\\reports\\executivos\\MCP-PUBLICATION-GATE-MAIS-HUMANA__RODADA015.md"
|
||||
}
|
||||
],
|
||||
"generatedAt": "2026-05-02T09:22:34+00:00",
|
||||
"generatedAt": "2026-05-02T10:23:16+00:00",
|
||||
"ok": false,
|
||||
"policy": "falha de escrita central nao aborta artefatos do projeto real"
|
||||
}
|
||||
@@ -50,7 +50,7 @@
|
||||
],
|
||||
"next_action": "corrigir credencial Git/Schannel e reconciliar ahead/behind sem reset destrutivo",
|
||||
"order_id": "0033_EXECUTIVA__sincronizar-git-mais-humana-mcps-central-com-credenciais",
|
||||
"reason": "fetch falhou por Permission denied em FETCH_HEAD; ls-remote/push falhou por SEC_E_NO_CREDENTIALS; repo mesh bloqueou sync destrutiva",
|
||||
"reason": "fetch failed: SEC_E_NO_CREDENTIALS",
|
||||
"status": "blocked"
|
||||
},
|
||||
{
|
||||
@@ -150,7 +150,7 @@
|
||||
"mais_humana.admin_routes.acceptance"
|
||||
]
|
||||
},
|
||||
"generated_at": "2026-05-02T09:22:34+00:00",
|
||||
"generated_at": "2026-05-02T10:23:16+00:00",
|
||||
"liveReady": true,
|
||||
"live_probes": [
|
||||
{
|
||||
@@ -160,7 +160,7 @@
|
||||
"evidence_id": "evidence-a75a27e0669c49da1db8b615",
|
||||
"http_status": 200,
|
||||
"missing_transit_fields": [],
|
||||
"observed_at": "2026-05-02T09:22:34+00:00",
|
||||
"observed_at": "2026-05-02T10:23:16+00:00",
|
||||
"ok": true,
|
||||
"response_excerpt": {
|
||||
"__truncated__": true,
|
||||
@@ -206,7 +206,7 @@
|
||||
"evidence_id": "evidence-af37a8d489b0038a7a6b5575",
|
||||
"http_status": 200,
|
||||
"missing_transit_fields": [],
|
||||
"observed_at": "2026-05-02T09:22:34+00:00",
|
||||
"observed_at": "2026-05-02T10:23:16+00:00",
|
||||
"ok": true,
|
||||
"response_excerpt": {
|
||||
"__truncated__": true,
|
||||
@@ -252,7 +252,7 @@
|
||||
"evidence_id": "evidence-3f0e3b9f829c7ff912b335d0",
|
||||
"http_status": 200,
|
||||
"missing_transit_fields": [],
|
||||
"observed_at": "2026-05-02T09:22:34+00:00",
|
||||
"observed_at": "2026-05-02T10:23:16+00:00",
|
||||
"ok": true,
|
||||
"response_excerpt": {
|
||||
"__truncated__": true,
|
||||
@@ -298,7 +298,7 @@
|
||||
"evidence_id": "evidence-6be52832c728db2bbbbce461",
|
||||
"http_status": 200,
|
||||
"missing_transit_fields": [],
|
||||
"observed_at": "2026-05-02T09:22:34+00:00",
|
||||
"observed_at": "2026-05-02T10:23:16+00:00",
|
||||
"ok": true,
|
||||
"response_excerpt": {
|
||||
"__truncated__": true,
|
||||
@@ -340,7 +340,7 @@
|
||||
],
|
||||
"localReady": true,
|
||||
"provider_id": "mais_humana",
|
||||
"report_id": "mcp-publication-gate-2026-05-02t0922340000",
|
||||
"report_id": "mcp-publication-gate-2026-05-02t1023160000",
|
||||
"status": "partial",
|
||||
"summary": [
|
||||
"Provider local Mais Humana pronto: True.",
|
||||
@@ -364,7 +364,7 @@
|
||||
"wrangler_whoami": "unknown"
|
||||
},
|
||||
"deploy_dry_run_ok": false,
|
||||
"raw_summary": "not attempted in this runner: router says deploy is manual by user; smoke live only",
|
||||
"raw_summary": "deploy manual informado pelo roteador; validacao live por HTTP; plugin Cloudflare nao usado como via operacional",
|
||||
"version": ""
|
||||
}
|
||||
}
|
||||
234
ecossistema/CANONICAL-MIGRATION-PLAN.md
Normal file
234
ecossistema/CANONICAL-MIGRATION-PLAN.md
Normal file
@@ -0,0 +1,234 @@
|
||||
# Plano de migracao canonica - Mais Humana
|
||||
|
||||
- status: `blocked`
|
||||
- plan_id: `canonical-migration-ef44c4c42f80650a072b`
|
||||
- canonical_project_id: `tudo-para-ia-mais-humana-platform`
|
||||
- current_project_id: `tudo-para-ia-mais-humana`
|
||||
- legacy_alias: `tudo-para-ia-mais-humana-plataform`
|
||||
- central_folder: `15_repo_tudo-para-ia-mais-humana-platform`
|
||||
- decision_source: `015-ROTEADOR-PERMANENTE-DE-ORDEM_DE_SERVICO.MD`
|
||||
- generated_from: `generated_canonical_migration_plan`
|
||||
- controls: `9`
|
||||
- acceptance_cases: `9315`
|
||||
- accepted_cases: `9315`
|
||||
- blocked_cases: `0`
|
||||
|
||||
## Regra institucional
|
||||
|
||||
Nome canonico institucional aprovado como tudo-para-ia-mais-humana-platform; o repositorio local historico tudo-para-ia-mais-humana e o alias tudo-para-ia-mais-humana-plataform permanecem aliases de compatibilidade ate migracao Git/MCP sincronizada, sem duplicar repositorio nem sobrescrever historico.
|
||||
|
||||
## Controles
|
||||
|
||||
### canonical-identity-approved
|
||||
- layer: `identity`
|
||||
- status: `ready`
|
||||
- current_state: `repo materializado como tudo-para-ia-mais-humana; alias historico tudo-para-ia-mais-humana-plataform`
|
||||
- canonical_state: `tudo-para-ia-mais-humana-platform`
|
||||
- blockers: `nenhum`
|
||||
- order_ids: `0035_EXECUTIVA__reconciliar-nome-canonico-real-alias-platform, 0052_GERENCIAL__formalizar-nome-canonico-mais-humana-platform-e-aliases`
|
||||
|
||||
### filesystem-alias-window
|
||||
- layer: `filesystem`
|
||||
- status: `manual_window_required`
|
||||
- current_state: `G:/_codex-git/tudo-para-ia-mais-humana`
|
||||
- canonical_state: `G:/_codex-git/tudo-para-ia-mais-humana-platform`
|
||||
- blockers: `rename fisico depende de janela institucional e comparacao de remotes`
|
||||
- order_ids: `0057_GERENCIAL__governar-migracao-coordenada-do-nome-canonico-platform`
|
||||
|
||||
### git-remote-canonicalization
|
||||
- layer: `git_remote`
|
||||
- status: `blocked`
|
||||
- current_state: `origin historico https://git.ami.app.br/admin/tudo-para-ia-mais-humana.git`
|
||||
- canonical_state: `https://git.ami.app.br/admin/tudo-para-ia-mais-humana-platform.git`
|
||||
- blockers: `SEC_E_NO_CREDENTIALS no Git Windows; renome remoto depende de Gitea/owner`
|
||||
- order_ids: `0038_EXECUTIVA__corrigir-acl-index-lock-e-commitar-artefatos-mcp, 0050_GERENCIAL__decidir-politica-de-sync-automatico-e-credencial-gitea`
|
||||
|
||||
### central-dossier-materialized
|
||||
- layer: `central_dossier`
|
||||
- status: `partial`
|
||||
- current_state: `15_repo_tudo-para-ia-mais-humana-platform`
|
||||
- canonical_state: `15_repo_tudo-para-ia-mais-humana-platform como dossie; project_id canonico tudo-para-ia-mais-humana-platform`
|
||||
- blockers: `central ja possui alteracoes concorrentes nao pertencentes a esta rodada`
|
||||
- order_ids: `0040_EXECUTIVA__materializar-escrita-central-e-sql-semantico-sem-permissionerror`
|
||||
|
||||
### mcp-contract-owner-canonical
|
||||
- layer: `mcp_contract`
|
||||
- status: `ready`
|
||||
- current_state: `provider Mais Humana aceita aliases e tools live`
|
||||
- canonical_state: `ownerPlatformId/canonicalProjectId = tudo-para-ia-mais-humana-platform`
|
||||
- blockers: `nenhum`
|
||||
- order_ids: `0037_EXECUTIVA__homologar-rotas-administrativas-mcp-no-gateway, 0049_GERENCIAL__homologar-mcp-only-administration-routes-como-politica-de-ecossistema`
|
||||
|
||||
### mcp-execute-live-readback
|
||||
- layer: `mcp_execute`
|
||||
- status: `partial`
|
||||
- current_state: `tools Mais Humana respondem no endpoint live quando publicadas`
|
||||
- canonical_state: `https://mcps-gateway.ami-app.workers.dev/v1/execute audita alias e canonico pelo MCPs Internos`
|
||||
- blockers: `deploy live e smoke dependem de runner/deploy manual quando wrangler local falhar`
|
||||
- order_ids: `0039_EXECUTIVA__reexecutar-wrangler-em-runner-homologado-e-registrar-deploy`
|
||||
|
||||
### docs-ui-same-source
|
||||
- layer: `docs_ui`
|
||||
- status: `blocked`
|
||||
- current_state: `Docs pode estar catalogOnly; UI deve renderizar fonte MCP`
|
||||
- canonical_state: `GPT e painel explicam a mesma instancia administrativa canonica`
|
||||
- blockers: `Docs responseReady ou excecao catalogOnly depende de owner`
|
||||
- order_ids: `0053_GERENCIAL__pactuar-docs-catalogonly-ou-response-ready-como-excecao-global`
|
||||
|
||||
### sync-mesh-no-reversal
|
||||
- layer: `sync_mesh`
|
||||
- status: `blocked`
|
||||
- current_state: `fetch/push podem falhar por credencial ou ACL; central tem deltas concorrentes`
|
||||
- canonical_state: `hashes comparados antes de qualquer renome, push ou materializacao remota`
|
||||
- blockers: `SEC_E_NO_CREDENTIALS; FETCH_HEAD/index.lock Permission denied; worktree central divergente`
|
||||
- order_ids: `0038_EXECUTIVA__corrigir-acl-index-lock-e-commitar-artefatos-mcp, 0050_GERENCIAL__decidir-politica-de-sync-automatico-e-credencial-gitea`
|
||||
|
||||
### rollback-and-audit-pack
|
||||
- layer: `rollback`
|
||||
- status: `partial`
|
||||
- current_state: `aliases preservam operacao enquanto remoto/diretorio seguem historicos`
|
||||
- canonical_state: `rollback inclui hashes, remotes, deployment id, ordem de servico e ledger MCP`
|
||||
- blockers: `sem push remoto confirmado nao ha rollback remoto auditavel`
|
||||
- order_ids: `0057_GERENCIAL__governar-migracao-coordenada-do-nome-canonico-platform`
|
||||
|
||||
## Casos MCP de aceitacao
|
||||
|
||||
- `canonical-migration-44c5d04b19fe632cb7fbb839` `tudo-para-ia-business-platform` `canonicalProjectId` -> `tudo-para-ia-business-platform` status `canonical` action `manter valor canonico`
|
||||
- `canonical-migration-a877077358634d737f3618c9` `tudo-para-ia-business-platform` `canonicalProjectId` -> `tudo-para-ia-business-platform` status `canonical` action `manter valor canonico`
|
||||
- `canonical-migration-ac6f2204c9d1c8dc0908f3f0` `tudo-para-ia-business-platform` `canonicalProjectId` -> `tudo-para-ia-business-platform` status `canonical` action `manter valor canonico`
|
||||
- `canonical-migration-38362880aa6c4c1aacd7492f` `tudo-para-ia-business-platform` `canonicalProjectId` -> `tudo-para-ia-business-platform` status `canonical` action `manter valor canonico`
|
||||
- `canonical-migration-c2f07eea5d398ccac7257ace` `tudo-para-ia-business-platform` `canonicalProjectId` -> `tudo-para-ia-business-platform` status `canonical` action `manter valor canonico`
|
||||
- `canonical-migration-602383cfd8d05c019276e137` `tudo-para-ia-business-platform` `canonicalProjectId` -> `tudo-para-ia-business-plataform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-33fce81bd261d2bce85bf48b` `tudo-para-ia-business-platform` `canonicalProjectId` -> `tudo-para-ia-business-plataform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-7eb8a55ae7f0c3a4b681e171` `tudo-para-ia-business-platform` `canonicalProjectId` -> `tudo-para-ia-business-plataform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-0e04706b3fd515957c479481` `tudo-para-ia-business-platform` `canonicalProjectId` -> `tudo-para-ia-business-plataform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-6daca984ea438fc1e0c67121` `tudo-para-ia-business-platform` `canonicalProjectId` -> `tudo-para-ia-business-plataform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-c8fc1a2f3c9a20256715ac92` `tudo-para-ia-business-platform` `canonicalProjectId` -> `01_repo_tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-245877cd8651275528e0867d` `tudo-para-ia-business-platform` `canonicalProjectId` -> `01_repo_tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-b577a9e83cb70c4b30e2b028` `tudo-para-ia-business-platform` `canonicalProjectId` -> `01_repo_tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-10a218ba7482ee68386e0252` `tudo-para-ia-business-platform` `canonicalProjectId` -> `01_repo_tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-e858561342ae3aa880b7e6c3` `tudo-para-ia-business-platform` `canonicalProjectId` -> `01_repo_tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-3bc9e8b743fab1ac47b6c956` `tudo-para-ia-business-platform` `canonicalProjectId` -> `admin/tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-2a5ef8244f8a7b8e7cb9e9ed` `tudo-para-ia-business-platform` `canonicalProjectId` -> `admin/tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-3e8c7a91355191e634e10f8b` `tudo-para-ia-business-platform` `canonicalProjectId` -> `admin/tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-12ca08c041bd3cff89265951` `tudo-para-ia-business-platform` `canonicalProjectId` -> `admin/tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-e760c54c439933c3e5428b6a` `tudo-para-ia-business-platform` `canonicalProjectId` -> `admin/tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-2b03359adeb7d1240dfef262` `tudo-para-ia-business-platform` `canonicalProjectId` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-e479a26e7a68b07b7c7a6992` `tudo-para-ia-business-platform` `canonicalProjectId` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-69429c6b6acf1a714c62b498` `tudo-para-ia-business-platform` `canonicalProjectId` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-dd91e80f97a24d81828e9daa` `tudo-para-ia-business-platform` `canonicalProjectId` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-ac1a94cdf8da0c17131ab5ae` `tudo-para-ia-business-platform` `canonicalProjectId` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-bdcd3fd4cc30b58ae300da2a` `tudo-para-ia-business-platform` `ownerPlatformId` -> `tudo-para-ia-business-platform` status `canonical` action `manter valor canonico`
|
||||
- `canonical-migration-9899db0053e5c42ecefec4ff` `tudo-para-ia-business-platform` `ownerPlatformId` -> `tudo-para-ia-business-platform` status `canonical` action `manter valor canonico`
|
||||
- `canonical-migration-ba04e581cbc2a3b1cc858867` `tudo-para-ia-business-platform` `ownerPlatformId` -> `tudo-para-ia-business-platform` status `canonical` action `manter valor canonico`
|
||||
- `canonical-migration-44d605fc3f2886ad59f299ca` `tudo-para-ia-business-platform` `ownerPlatformId` -> `tudo-para-ia-business-platform` status `canonical` action `manter valor canonico`
|
||||
- `canonical-migration-d0cc43491f4d2bb499463aff` `tudo-para-ia-business-platform` `ownerPlatformId` -> `tudo-para-ia-business-platform` status `canonical` action `manter valor canonico`
|
||||
- `canonical-migration-ff73e9baedfd32d061cf4129` `tudo-para-ia-business-platform` `ownerPlatformId` -> `tudo-para-ia-business-plataform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-30ff1ca3d15f313efe13dac6` `tudo-para-ia-business-platform` `ownerPlatformId` -> `tudo-para-ia-business-plataform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-7aa277c3c937f5eebe3bca63` `tudo-para-ia-business-platform` `ownerPlatformId` -> `tudo-para-ia-business-plataform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-b644e08b4fa0f04ccc962d26` `tudo-para-ia-business-platform` `ownerPlatformId` -> `tudo-para-ia-business-plataform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-aeee734f742f477606a74f3c` `tudo-para-ia-business-platform` `ownerPlatformId` -> `tudo-para-ia-business-plataform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-1b0ab5730783a8906ff96636` `tudo-para-ia-business-platform` `ownerPlatformId` -> `01_repo_tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-e264bf6c00421b8d0308c318` `tudo-para-ia-business-platform` `ownerPlatformId` -> `01_repo_tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-b57345662ec85ed63ef5f168` `tudo-para-ia-business-platform` `ownerPlatformId` -> `01_repo_tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-ae70e1996c0316f026f641e9` `tudo-para-ia-business-platform` `ownerPlatformId` -> `01_repo_tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-8e2ec4d7c97566ce2f8729fe` `tudo-para-ia-business-platform` `ownerPlatformId` -> `01_repo_tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-4f9e3556c99c2d2af864db7b` `tudo-para-ia-business-platform` `ownerPlatformId` -> `admin/tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-547e4fdebfeb9023609f83bb` `tudo-para-ia-business-platform` `ownerPlatformId` -> `admin/tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-d0b8462735e0e16a2c31b885` `tudo-para-ia-business-platform` `ownerPlatformId` -> `admin/tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-2f29b665c5c3661af81a85a2` `tudo-para-ia-business-platform` `ownerPlatformId` -> `admin/tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-975daa71336cce4c61bed690` `tudo-para-ia-business-platform` `ownerPlatformId` -> `admin/tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-a6351160b74403e1e46dde53` `tudo-para-ia-business-platform` `ownerPlatformId` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-84bd339909b785959853b02c` `tudo-para-ia-business-platform` `ownerPlatformId` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-960faf1ade82d94c32b1c9c7` `tudo-para-ia-business-platform` `ownerPlatformId` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-14f10fdbf208d974b105ee0e` `tudo-para-ia-business-platform` `ownerPlatformId` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-61ccfc82e6dd8eb81bed8b87` `tudo-para-ia-business-platform` `ownerPlatformId` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-ae008896ab414770226a3359` `tudo-para-ia-business-platform` `owner_platform_id` -> `tudo-para-ia-business-platform` status `canonical` action `manter valor canonico`
|
||||
- `canonical-migration-22253aff5b02cef3dcea8c9f` `tudo-para-ia-business-platform` `owner_platform_id` -> `tudo-para-ia-business-platform` status `canonical` action `manter valor canonico`
|
||||
- `canonical-migration-d3e32666185ba3ded218e970` `tudo-para-ia-business-platform` `owner_platform_id` -> `tudo-para-ia-business-platform` status `canonical` action `manter valor canonico`
|
||||
- `canonical-migration-3e79f6d315370491024cd55b` `tudo-para-ia-business-platform` `owner_platform_id` -> `tudo-para-ia-business-platform` status `canonical` action `manter valor canonico`
|
||||
- `canonical-migration-b72fb9bc5e3f5b5e1d243e21` `tudo-para-ia-business-platform` `owner_platform_id` -> `tudo-para-ia-business-platform` status `canonical` action `manter valor canonico`
|
||||
- `canonical-migration-a1fc5ac3a1f8bba48db116fe` `tudo-para-ia-business-platform` `owner_platform_id` -> `tudo-para-ia-business-plataform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-518aa6010757eb93d38a3a9a` `tudo-para-ia-business-platform` `owner_platform_id` -> `tudo-para-ia-business-plataform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-eec736e6debf6b254a3d3971` `tudo-para-ia-business-platform` `owner_platform_id` -> `tudo-para-ia-business-plataform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-e1789466668511600c62e7f0` `tudo-para-ia-business-platform` `owner_platform_id` -> `tudo-para-ia-business-plataform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-99be71c20c480989cca2a317` `tudo-para-ia-business-platform` `owner_platform_id` -> `tudo-para-ia-business-plataform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-730cc176feb06669e853502a` `tudo-para-ia-business-platform` `owner_platform_id` -> `01_repo_tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-2c344951d920dd5189f35a2d` `tudo-para-ia-business-platform` `owner_platform_id` -> `01_repo_tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-a94b5d6717173ae44f833b42` `tudo-para-ia-business-platform` `owner_platform_id` -> `01_repo_tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-9cbc6c2e78a8114205bdc122` `tudo-para-ia-business-platform` `owner_platform_id` -> `01_repo_tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-bcdce7eca3b60830d6e24e73` `tudo-para-ia-business-platform` `owner_platform_id` -> `01_repo_tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-b30f240c2b1d1c4e59788627` `tudo-para-ia-business-platform` `owner_platform_id` -> `admin/tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-e9a10192bfa0081596a43f4d` `tudo-para-ia-business-platform` `owner_platform_id` -> `admin/tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-e32fdbd6bcd9f21d4b712eb6` `tudo-para-ia-business-platform` `owner_platform_id` -> `admin/tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-183edf4ee5bca9b630219116` `tudo-para-ia-business-platform` `owner_platform_id` -> `admin/tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-0ed883cc0dd0c22ee14e3c5d` `tudo-para-ia-business-platform` `owner_platform_id` -> `admin/tudo-para-ia-business-platform` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-667f8f2235d3a3c1570fc23a` `tudo-para-ia-business-platform` `owner_platform_id` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-7dfd45958c7734d620158170` `tudo-para-ia-business-platform` `owner_platform_id` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-3340de63fe8b57191939aabd` `tudo-para-ia-business-platform` `owner_platform_id` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-8085a72fe8f8170a553179ab` `tudo-para-ia-business-platform` `owner_platform_id` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-9b888b400a646532a0dc4de4` `tudo-para-ia-business-platform` `owner_platform_id` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `canonical_field_rewrite_required` action `reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir`
|
||||
- `canonical-migration-c867abe631250718eea17ced` `tudo-para-ia-business-platform` `projectId` -> `tudo-para-ia-business-platform` status `canonical` action `usar valor canonico`
|
||||
- `canonical-migration-9580dff8b3717b71e2d27176` `tudo-para-ia-business-platform` `projectId` -> `tudo-para-ia-business-platform` status `canonical` action `usar valor canonico`
|
||||
- `canonical-migration-3fc013240938eccbe4811154` `tudo-para-ia-business-platform` `projectId` -> `tudo-para-ia-business-platform` status `canonical` action `usar valor canonico`
|
||||
- `canonical-migration-9548826039a2da37e89f66a1` `tudo-para-ia-business-platform` `projectId` -> `tudo-para-ia-business-platform` status `canonical` action `usar valor canonico`
|
||||
- `canonical-migration-9a7a632eadc94185f3bb1e65` `tudo-para-ia-business-platform` `projectId` -> `tudo-para-ia-business-platform` status `canonical` action `usar valor canonico`
|
||||
- `canonical-migration-2c24b7b524718a3801b02c72` `tudo-para-ia-business-platform` `projectId` -> `tudo-para-ia-business-plataform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-8377d81725e9c7eb9e795dd7` `tudo-para-ia-business-platform` `projectId` -> `tudo-para-ia-business-plataform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-511b60278c766215b1c4a543` `tudo-para-ia-business-platform` `projectId` -> `tudo-para-ia-business-plataform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-897b576ceb2d5ec5c0369907` `tudo-para-ia-business-platform` `projectId` -> `tudo-para-ia-business-plataform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-ca6a3bf7b1b1f58858ba5b3e` `tudo-para-ia-business-platform` `projectId` -> `tudo-para-ia-business-plataform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-c6350481b5c888a560c1cc8c` `tudo-para-ia-business-platform` `projectId` -> `01_repo_tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-d6a3032f3f4133190103460e` `tudo-para-ia-business-platform` `projectId` -> `01_repo_tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-b45278bd526f444e681b1dc7` `tudo-para-ia-business-platform` `projectId` -> `01_repo_tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-9e65acf5b7004a1a68062f1e` `tudo-para-ia-business-platform` `projectId` -> `01_repo_tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-65f4d2c0e8abadedc09ce508` `tudo-para-ia-business-platform` `projectId` -> `01_repo_tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-0950b88b9cca04731ea58142` `tudo-para-ia-business-platform` `projectId` -> `admin/tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-747f43e1de6b4300be281095` `tudo-para-ia-business-platform` `projectId` -> `admin/tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-7251bcf099505746dc324873` `tudo-para-ia-business-platform` `projectId` -> `admin/tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-2e5470716bea89e8eb83a206` `tudo-para-ia-business-platform` `projectId` -> `admin/tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-761535bfad7c3990ea83041a` `tudo-para-ia-business-platform` `projectId` -> `admin/tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-5e211d8d3f3a332e4da48e5e` `tudo-para-ia-business-platform` `projectId` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-5591ffbdc88e821126be099f` `tudo-para-ia-business-platform` `projectId` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-e21a7376cbbd6a795158f02c` `tudo-para-ia-business-platform` `projectId` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-dbadfecd61374575ed4fff27` `tudo-para-ia-business-platform` `projectId` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-62b35f6f0c0bf172fbada2c1` `tudo-para-ia-business-platform` `projectId` -> `https://git.ami.app.br/admin/tudo-para-ia-business-platform.git` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-2f0ab353e22bc3e1fe6947c5` `tudo-para-ia-business-platform` `project_id` -> `tudo-para-ia-business-platform` status `canonical` action `usar valor canonico`
|
||||
- `canonical-migration-5cba8441cd6e385d1172289a` `tudo-para-ia-business-platform` `project_id` -> `tudo-para-ia-business-platform` status `canonical` action `usar valor canonico`
|
||||
- `canonical-migration-0bc0961201c48d09d0a4311e` `tudo-para-ia-business-platform` `project_id` -> `tudo-para-ia-business-platform` status `canonical` action `usar valor canonico`
|
||||
- `canonical-migration-23a3d21b8b5710c46ada563d` `tudo-para-ia-business-platform` `project_id` -> `tudo-para-ia-business-platform` status `canonical` action `usar valor canonico`
|
||||
- `canonical-migration-85d7bb83ccb64421647c7d82` `tudo-para-ia-business-platform` `project_id` -> `tudo-para-ia-business-platform` status `canonical` action `usar valor canonico`
|
||||
- `canonical-migration-7ba74241973ef4801606c828` `tudo-para-ia-business-platform` `project_id` -> `tudo-para-ia-business-plataform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-dfda6815dfaa44fe8020ca6a` `tudo-para-ia-business-platform` `project_id` -> `tudo-para-ia-business-plataform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-4f3ce2403eed04c31b225d87` `tudo-para-ia-business-platform` `project_id` -> `tudo-para-ia-business-plataform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-95e1d9a21cb23e2b735abc0c` `tudo-para-ia-business-platform` `project_id` -> `tudo-para-ia-business-plataform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-408c3b28f31d4a2b9dea7519` `tudo-para-ia-business-platform` `project_id` -> `tudo-para-ia-business-plataform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-9a04a74b9dfd8befe2afccf4` `tudo-para-ia-business-platform` `project_id` -> `01_repo_tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-88c0c055954e6f9320ea77f6` `tudo-para-ia-business-platform` `project_id` -> `01_repo_tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-a1ed3a3983dc86122c429ebe` `tudo-para-ia-business-platform` `project_id` -> `01_repo_tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-e325bb344cf59f3f2aed54c4` `tudo-para-ia-business-platform` `project_id` -> `01_repo_tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-07427d1df20f0f458dc22a0d` `tudo-para-ia-business-platform` `project_id` -> `01_repo_tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-26cd2b13d425d907696eeef0` `tudo-para-ia-business-platform` `project_id` -> `admin/tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-29f1996dc8ed02956f40bc39` `tudo-para-ia-business-platform` `project_id` -> `admin/tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-8361d2fb1c613e990c399780` `tudo-para-ia-business-platform` `project_id` -> `admin/tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-fbc65144fd256f64b2e45e60` `tudo-para-ia-business-platform` `project_id` -> `admin/tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
- `canonical-migration-d6ec056220b123c398d5afaa` `tudo-para-ia-business-platform` `project_id` -> `admin/tudo-para-ia-business-platform` status `alias_accepted` action `resolver alias para canonical_project_id no MCP e registrar trace/audit`
|
||||
|
||||
## Bloqueios reais
|
||||
|
||||
- rename fisico depende de janela institucional e comparacao de remotes
|
||||
- SEC_E_NO_CREDENTIALS no Git Windows
|
||||
- renome remoto depende de Gitea/owner
|
||||
- central ja possui alteracoes concorrentes nao pertencentes a esta rodada
|
||||
- deploy live e smoke dependem de runner/deploy manual quando wrangler local falhar
|
||||
- Docs responseReady ou excecao catalogOnly depende de owner
|
||||
- SEC_E_NO_CREDENTIALS
|
||||
- FETCH_HEAD/index.lock Permission denied
|
||||
- worktree central divergente
|
||||
- sem push remoto confirmado nao ha rollback remoto auditavel
|
||||
|
||||
## Politica de transito MCP
|
||||
|
||||
- Toda migracao interplataforma deve passar pelo MCPs Internos.
|
||||
- Campos de transito obrigatorios: `origin`, `destination`, `tool`, `payload`, `actor`, `permission`, `result`, `traceId`, `auditId`, `timestamp`.
|
||||
- Escrita direta em repositorio, painel ou plataforma permanece bloqueada quando nao houver traceId/auditId.
|
||||
@@ -1,7 +1,7 @@
|
||||
# EXECUTADO - Central Materialization
|
||||
|
||||
- report_id: `central-materialization-916556597461`
|
||||
- generated_at: `2026-05-02T09:22:50+00:00`
|
||||
- report_id: `central-materialization-382892847432`
|
||||
- generated_at: `2026-05-02T10:22:58+00:00`
|
||||
- status: `failed`
|
||||
- project_id: `tudo-para-ia-mais-humana-platform`
|
||||
- project_root: `G:\_codex-git\tudo-para-ia-mais-humana`
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# MCP Admin Route Acceptance
|
||||
|
||||
- report_id: `mcp-admin-route-acceptance-0687936a42e37619`
|
||||
- generated_at: `2026-05-02T08:24:24+00:00`
|
||||
- report_id: `mcp-admin-route-acceptance-9841af72a6e6588d`
|
||||
- generated_at: `2026-05-02T10:23:15+00:00`
|
||||
- provider_id: `mais_humana`
|
||||
- control_plane_id: `tudo-para-ia-mcps-internos-plataform`
|
||||
- status: `blocked`
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Gate de publicacao MCP Mais Humana
|
||||
|
||||
- report_id: `mcp-publication-gate-2026-05-02t0922340000`
|
||||
- generated_at: `2026-05-02T09:22:34+00:00`
|
||||
- report_id: `mcp-publication-gate-2026-05-02t1023160000`
|
||||
- generated_at: `2026-05-02T10:23:16+00:00`
|
||||
- provider_id: `mais_humana`
|
||||
- current_project_id: `tudo-para-ia-mais-humana`
|
||||
- canonical_project_id: `tudo-para-ia-mais-humana-platform`
|
||||
@@ -101,7 +101,7 @@
|
||||
### 0033_EXECUTIVA__sincronizar-git-mais-humana-mcps-central-com-credenciais
|
||||
|
||||
- status: `blocked`
|
||||
- motivo: fetch falhou por Permission denied em FETCH_HEAD; ls-remote/push falhou por SEC_E_NO_CREDENTIALS; repo mesh bloqueou sync destrutiva
|
||||
- motivo: fetch failed: SEC_E_NO_CREDENTIALS
|
||||
- evidencias: `git_sync_status`
|
||||
- proxima_acao: corrigir credencial Git/Schannel e reconciliar ahead/behind sem reset destrutivo
|
||||
|
||||
|
||||
9316
matrizes/canonical-migration-acceptance-cases.csv
Normal file
9316
matrizes/canonical-migration-acceptance-cases.csv
Normal file
File diff suppressed because it is too large
Load Diff
10
matrizes/canonical-migration-controls.csv
Normal file
10
matrizes/canonical-migration-controls.csv
Normal file
@@ -0,0 +1,10 @@
|
||||
control_id,layer,status,title,blockers,required_evidence,order_ids
|
||||
canonical-identity-approved,identity,ready,Nome canonico aprovado e aliases preservados,,015-ROTEADOR-PERMANENTE-DE-ORDEM_DE_SERVICO.MD | dados/canonical-identity-graph.json,0035_EXECUTIVA__reconciliar-nome-canonico-real-alias-platform | 0052_GERENCIAL__formalizar-nome-canonico-mais-humana-platform-e-aliases
|
||||
filesystem-alias-window,filesystem,manual_window_required,Diretorio fisico so muda em janela coordenada,rename fisico depende de janela institucional e comparacao de remotes,git status limpo antes/depois | hash HEAD antes/depois | ausencia de pasta duplicada,0057_GERENCIAL__governar-migracao-coordenada-do-nome-canonico-platform
|
||||
git-remote-canonicalization,git_remote,blocked,Remote canonico sem sobrescrever remoto historico,SEC_E_NO_CREDENTIALS no Git Windows | renome remoto depende de Gitea/owner,git remote -v | git ls-remote --heads remoto canonico main | push dry-run com credencial valida,0038_EXECUTIVA__corrigir-acl-index-lock-e-commitar-artefatos-mcp | 0050_GERENCIAL__decidir-politica-de-sync-automatico-e-credencial-gitea
|
||||
central-dossier-materialized,central_dossier,partial,Pasta central registra canonico e materializa ordens,central ja possui alteracoes concorrentes nao pertencentes a esta rodada,orders/executivas e orders/gerenciais materializadas | controle-semantico.sqlite atualizado,0040_EXECUTIVA__materializar-escrita-central-e-sql-semantico-sem-permissionerror
|
||||
mcp-contract-owner-canonical,mcp_contract,ready,Contratos MCP usam ownerPlatformId canonico,,dados/mcp-provider-mais-humana.json | dados/mcp-contratos-humanos.json,0037_EXECUTIVA__homologar-rotas-administrativas-mcp-no-gateway | 0049_GERENCIAL__homologar-mcp-only-administration-routes-como-politica-de-ecossistema
|
||||
mcp-execute-live-readback,mcp_execute,partial,Gateway MCP confirma tools e aliases via /v1/execute,deploy live e smoke dependem de runner/deploy manual quando wrangler local falhar,HTTP 200 ok=true por tool | traceId/auditId | source hash,0039_EXECUTIVA__reexecutar-wrangler-em-runner-homologado-e-registrar-deploy
|
||||
docs-ui-same-source,docs_ui,blocked,Docs e UI renderizam a mesma fonte MCP,Docs responseReady ou excecao catalogOnly depende de owner,decisao Docs responseReady/catalogOnly | sameSourceValidation | instancia administrativa MCP,0053_GERENCIAL__pactuar-docs-catalogonly-ou-response-ready-como-excecao-global
|
||||
sync-mesh-no-reversal,sync_mesh,blocked,Sincronizacao preserva a alteracao valida mais recente,SEC_E_NO_CREDENTIALS | FETCH_HEAD/index.lock Permission denied | worktree central divergente,targeted-sync-audit | ahead/behind | hash local/remoto | logs de autosync,0038_EXECUTIVA__corrigir-acl-index-lock-e-commitar-artefatos-mcp | 0050_GERENCIAL__decidir-politica-de-sync-automatico-e-credencial-gitea
|
||||
rollback-and-audit-pack,rollback,partial,Rollback documentado antes da migracao fisica,sem push remoto confirmado nao ha rollback remoto auditavel,ledger MCP | AUDITORIA-GPT | PENDENCIAS-CODEX | deployment id,0057_GERENCIAL__governar-migracao-coordenada-do-nome-canonico-platform
|
||||
|
@@ -79,43 +79,3 @@ compliance.ceo.auditoria.administration-route,compliance,ceo,auditoria,mais_huma
|
||||
compliance.ceo.consulta.administration-route,compliance,ceo,consulta,mais_humana.admin.consulta,mcp.admin.readonly,yes,ready,yes,yes,evidence-992f04a502f6ddd9daf0b97b,
|
||||
compliance.ceo.diagnostico.administration-route,compliance,ceo,diagnostico,mais_humana.admin.diagnostico,mcp.admin.diagnostic,yes,ready,yes,yes,evidence-9738c928212fa58c6b0a53fc,
|
||||
compliance.ceo.explicacao.administration-route,compliance,ceo,explicacao,mais_humana.admin.explicacao,mcp.admin.explain,yes,ready,yes,yes,evidence-d360c27674acf2dc72bf64f8,
|
||||
compliance.cliente_externo.acao.administration-route,compliance,cliente_externo,acao,mais_humana.admin.acao,mcp.admin.action.request,yes,ready,yes,yes,evidence-043eb1e6a85bfc8da961f435,
|
||||
compliance.cliente_externo.auditoria.administration-route,compliance,cliente_externo,auditoria,mais_humana.admin.auditoria,mcp.admin.audit,yes,ready,yes,yes,evidence-fccdeeffbefda06bfc324d12,
|
||||
compliance.cliente_externo.consulta.administration-route,compliance,cliente_externo,consulta,mais_humana.admin.consulta,mcp.admin.readonly,yes,ready,yes,yes,evidence-db5b3feefe77274a7ee958dd,
|
||||
compliance.cliente_externo.diagnostico.administration-route,compliance,cliente_externo,diagnostico,mais_humana.admin.diagnostico,mcp.admin.diagnostic,yes,ready,yes,yes,evidence-a7c2e4b1a1a9b7efccef8ef7,
|
||||
compliance.cliente_externo.explicacao.administration-route,compliance,cliente_externo,explicacao,mais_humana.admin.explicacao,mcp.admin.explain,yes,ready,yes,yes,evidence-0769489680cf26dec1527f6e,
|
||||
compliance.contador.acao.administration-route,compliance,contador,acao,mais_humana.admin.acao,mcp.admin.action.request,yes,ready,yes,yes,evidence-e1574481a65786a59e8667be,
|
||||
compliance.contador.auditoria.administration-route,compliance,contador,auditoria,mais_humana.admin.auditoria,mcp.admin.audit,yes,ready,yes,yes,evidence-dfc305d7e6bc414380927365,
|
||||
compliance.contador.consulta.administration-route,compliance,contador,consulta,mais_humana.admin.consulta,mcp.admin.readonly,yes,ready,yes,yes,evidence-a781034adf6a863661f74c40,
|
||||
compliance.contador.diagnostico.administration-route,compliance,contador,diagnostico,mais_humana.admin.diagnostico,mcp.admin.diagnostic,yes,ready,yes,yes,evidence-3096bca3fbed3d072f4ba9c0,
|
||||
compliance.contador.explicacao.administration-route,compliance,contador,explicacao,mais_humana.admin.explicacao,mcp.admin.explain,yes,ready,yes,yes,evidence-4a9d30a7a3d2c99afe6519be,
|
||||
compliance.financeiro.acao.administration-route,compliance,financeiro,acao,mais_humana.admin.acao,mcp.admin.action.request,yes,ready,yes,yes,evidence-d9b19d82ef0a09658c9c29cd,
|
||||
compliance.financeiro.auditoria.administration-route,compliance,financeiro,auditoria,mais_humana.admin.auditoria,mcp.admin.audit,yes,ready,yes,yes,evidence-711c0bd1b8ce79facd1a08b9,
|
||||
compliance.financeiro.consulta.administration-route,compliance,financeiro,consulta,mais_humana.admin.consulta,mcp.admin.readonly,yes,ready,yes,yes,evidence-7fbb7dd1323952eeea9a0e1a,
|
||||
compliance.financeiro.diagnostico.administration-route,compliance,financeiro,diagnostico,mais_humana.admin.diagnostico,mcp.admin.diagnostic,yes,ready,yes,yes,evidence-ca5156c0c8582f5c6e2fb561,
|
||||
compliance.financeiro.explicacao.administration-route,compliance,financeiro,explicacao,mais_humana.admin.explicacao,mcp.admin.explain,yes,ready,yes,yes,evidence-04399664610dafb4342c7fe8,
|
||||
compliance.gestor_operacional.acao.administration-route,compliance,gestor_operacional,acao,mais_humana.admin.acao,mcp.admin.action.request,yes,ready,yes,yes,evidence-2c706d2f0f15d65a86425a7e,
|
||||
compliance.gestor_operacional.auditoria.administration-route,compliance,gestor_operacional,auditoria,mais_humana.admin.auditoria,mcp.admin.audit,yes,ready,yes,yes,evidence-626f043679ceb73668a44c49,
|
||||
compliance.gestor_operacional.consulta.administration-route,compliance,gestor_operacional,consulta,mais_humana.admin.consulta,mcp.admin.readonly,yes,ready,yes,yes,evidence-71e9470868e3cd5cee4dcb5d,
|
||||
compliance.gestor_operacional.diagnostico.administration-route,compliance,gestor_operacional,diagnostico,mais_humana.admin.diagnostico,mcp.admin.diagnostic,yes,ready,yes,yes,evidence-3965499d44e0f059e2dd2754,
|
||||
compliance.gestor_operacional.explicacao.administration-route,compliance,gestor_operacional,explicacao,mais_humana.admin.explicacao,mcp.admin.explain,yes,ready,yes,yes,evidence-b2d18bdce27cf85ebc603fc9,
|
||||
compliance.juridico.acao.administration-route,compliance,juridico,acao,mais_humana.admin.acao,mcp.admin.action.request,yes,ready,yes,yes,evidence-6d4a344f9a12d1c66d4e3ec6,
|
||||
compliance.juridico.auditoria.administration-route,compliance,juridico,auditoria,mais_humana.admin.auditoria,mcp.admin.audit,yes,ready,yes,yes,evidence-2985d0c7dda4c233b2fc59bd,
|
||||
compliance.juridico.consulta.administration-route,compliance,juridico,consulta,mais_humana.admin.consulta,mcp.admin.readonly,yes,ready,yes,yes,evidence-e390831e33de80045514040f,
|
||||
compliance.juridico.diagnostico.administration-route,compliance,juridico,diagnostico,mais_humana.admin.diagnostico,mcp.admin.diagnostic,yes,ready,yes,yes,evidence-c4e66185cdf949f41f90a1ab,
|
||||
compliance.juridico.explicacao.administration-route,compliance,juridico,explicacao,mais_humana.admin.explicacao,mcp.admin.explain,yes,ready,yes,yes,evidence-fbe864cfa750654d5741a786,
|
||||
compliance.planejamento_estrategico.acao.administration-route,compliance,planejamento_estrategico,acao,mais_humana.admin.acao,mcp.admin.action.request,yes,ready,yes,yes,evidence-ad8ccf701e72652bcae80479,
|
||||
compliance.planejamento_estrategico.auditoria.administration-route,compliance,planejamento_estrategico,auditoria,mais_humana.admin.auditoria,mcp.admin.audit,yes,ready,yes,yes,evidence-1e1b61e5839fae182833c595,
|
||||
compliance.planejamento_estrategico.consulta.administration-route,compliance,planejamento_estrategico,consulta,mais_humana.admin.consulta,mcp.admin.readonly,yes,ready,yes,yes,evidence-e9e5e308341227e00a81a581,
|
||||
compliance.planejamento_estrategico.diagnostico.administration-route,compliance,planejamento_estrategico,diagnostico,mais_humana.admin.diagnostico,mcp.admin.diagnostic,yes,ready,yes,yes,evidence-d219cbd8676c8a88b6927520,
|
||||
compliance.planejamento_estrategico.explicacao.administration-route,compliance,planejamento_estrategico,explicacao,mais_humana.admin.explicacao,mcp.admin.explain,yes,ready,yes,yes,evidence-17931610f091a97b1be26182,
|
||||
compliance.secretaria.acao.administration-route,compliance,secretaria,acao,mais_humana.admin.acao,mcp.admin.action.request,yes,ready,yes,yes,evidence-afb2d9e11859c0d9118a0a0e,
|
||||
compliance.secretaria.auditoria.administration-route,compliance,secretaria,auditoria,mais_humana.admin.auditoria,mcp.admin.audit,yes,ready,yes,yes,evidence-ceff2af0341593dba74f07cf,
|
||||
compliance.secretaria.consulta.administration-route,compliance,secretaria,consulta,mais_humana.admin.consulta,mcp.admin.readonly,yes,ready,yes,yes,evidence-f3d917611ef8bb62c667c747,
|
||||
compliance.secretaria.diagnostico.administration-route,compliance,secretaria,diagnostico,mais_humana.admin.diagnostico,mcp.admin.diagnostic,yes,ready,yes,yes,evidence-2a2120f5e6ac500183f8afec,
|
||||
compliance.secretaria.explicacao.administration-route,compliance,secretaria,explicacao,mais_humana.admin.explicacao,mcp.admin.explain,yes,ready,yes,yes,evidence-1a75fbf206a46a3a867c7f40,
|
||||
compliance.suporte.acao.administration-route,compliance,suporte,acao,mais_humana.admin.acao,mcp.admin.action.request,yes,ready,yes,yes,evidence-36499e555d54edeb736f7f8c,
|
||||
compliance.suporte.auditoria.administration-route,compliance,suporte,auditoria,mais_humana.admin.auditoria,mcp.admin.audit,yes,ready,yes,yes,evidence-b55cf00e3af8f4ec5e2b8325,
|
||||
compliance.suporte.consulta.administration-route,compliance,suporte,consulta,mais_humana.admin.consulta,mcp.admin.readonly,yes,ready,yes,yes,evidence-298456292b7717b5c5174ec5,
|
||||
compliance.suporte.diagnostico.administration-route,compliance,suporte,diagnostico,mais_humana.admin.diagnostico,mcp.admin.diagnostic,yes,ready,yes,yes,evidence-b67a15a015b3928efc9c4923,
|
||||
compliance.suporte.explicacao.administration-route,compliance,suporte,explicacao,mais_humana.admin.explicacao,mcp.admin.explain,yes,ready,yes,yes,evidence-0583bdb82cfbcaec1bfaf870,
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
order_id,status,reason,next_action,evidence_refs
|
||||
0031_EXECUTIVA__publicar-provider-mais-humana-no-mcps-gateway-via-wrangler-homologado,partial,codigo local do provider existe; publicacao live depende de runner Wrangler sem spawn EPERM,homologar runner Node/esbuild/workerd e repetir wrangler deploy --dry-run antes do deploy real,c22d27b86de895b23a8a1f9cd932361cce45297757bb0c74bf88cf955a8cdd6d; wrangler_runner
|
||||
0032_EXECUTIVA__validar-live-tools-mais-humana-v1-execute-com-evidencia,passed,endpoint live foi sondado sem persistir bearer bruto,retestar as tres tools apos deploy do mcps-gateway contendo o provider Mais Humana,evidence-a75a27e0669c49da1db8b615; evidence-af37a8d489b0038a7a6b5575; evidence-3f0e3b9f829c7ff912b335d0; evidence-6be52832c728db2bbbbce461
|
||||
0033_EXECUTIVA__sincronizar-git-mais-humana-mcps-central-com-credenciais,blocked,fetch falhou por Permission denied em FETCH_HEAD; ls-remote/push falhou por SEC_E_NO_CREDENTIALS; repo mesh bloqueou sync destrutiva,corrigir credencial Git/Schannel e reconciliar ahead/behind sem reset destrutivo,git_sync_status
|
||||
0033_EXECUTIVA__sincronizar-git-mais-humana-mcps-central-com-credenciais,blocked,fetch failed: SEC_E_NO_CREDENTIALS,corrigir credencial Git/Schannel e reconciliar ahead/behind sem reset destrutivo,git_sync_status
|
||||
0034_EXECUTIVA__corrigir-acl-escrita-central-e-sql-semantico-plataforma-15,partial,artefatos centrais foram testados pelo gerador de gate; falhas ficam registradas no projeto real,manter escrita automatica central e SQL semantico sob teste em toda rodada,central_write_status
|
||||
0035_EXECUTIVA__reconciliar-nome-canonico-real-alias-platform,passed,politica de alias foi materializada sem renome destrutivo,"executar migracao Git/MCP/documentacao somente por janela coordenada, preservando aliases e hashes",alias_policy
|
||||
0043_GERENCIAL__aprovar-janela-publicacao-provider-mais-humana-com-rollback,partial,"janela pode ser planejada, mas deploy real ainda depende do runner homologado","definir owner, janela, version atual, rollback e criterio de sucesso antes de deploy real",wrangler_runner; c22d27b86de895b23a8a1f9cd932361cce45297757bb0c74bf88cf955a8cdd6d
|
||||
|
||||
|
875
src/mais_humana/canonical_migration.py
Normal file
875
src/mais_humana/canonical_migration.py
Normal file
@@ -0,0 +1,875 @@
|
||||
"""Executable canonical-name migration plan for Mais Humana.
|
||||
|
||||
The router made the institutional name explicit:
|
||||
``tudo-para-ia-mais-humana-platform`` is canonical, while the physical
|
||||
repository can remain materialized as ``tudo-para-ia-mais-humana`` until Git,
|
||||
MCP, Docs, UI, and synchronization windows are coordinated. This module turns
|
||||
that decision into machine-checkable controls and MCP acceptance cases so the
|
||||
platform can migrate without creating a duplicate repository or bypassing the
|
||||
MCP control plane.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import csv
|
||||
import io
|
||||
import json
|
||||
import sqlite3
|
||||
from dataclasses import dataclass
|
||||
from enum import Enum
|
||||
from pathlib import Path
|
||||
from typing import Any, Iterable, Mapping, Sequence
|
||||
|
||||
from .identity_policy import (
|
||||
ACCEPTED_PROJECT_IDS,
|
||||
CANONICAL_COMPATIBILITY_RULE,
|
||||
CANONICAL_DECISION_SOURCE,
|
||||
CANONICAL_DECISION_STATUS,
|
||||
CANONICAL_PROJECT_ID,
|
||||
CENTRAL_FOLDER_NAME,
|
||||
CURRENT_PROJECT_ID,
|
||||
LEGACY_PLATAFORM_ALIAS,
|
||||
MCP_CONTROL_PLANE_ID,
|
||||
MCP_EXECUTE_ENDPOINT,
|
||||
)
|
||||
from .models import GeneratedFile, as_plain_data, merge_unique, utc_now
|
||||
from .repository_mesh import RepositoryTarget, default_repository_targets, stable_digest
|
||||
from .repository_mesh_naming import plataform_to_platform, platform_to_plataform
|
||||
from .storage import connect, upsert_files
|
||||
|
||||
|
||||
class MigrationLayer(str, Enum):
|
||||
"""Migration area controlled by the canonical-name plan."""
|
||||
|
||||
IDENTITY = "identity"
|
||||
FILESYSTEM = "filesystem"
|
||||
GIT_REMOTE = "git_remote"
|
||||
CENTRAL_DOSSIER = "central_dossier"
|
||||
MCP_CONTRACT = "mcp_contract"
|
||||
MCP_EXECUTE = "mcp_execute"
|
||||
DOCS_UI = "docs_ui"
|
||||
SYNC_MESH = "sync_mesh"
|
||||
ROLLBACK = "rollback"
|
||||
|
||||
|
||||
class MigrationStatus(str, Enum):
|
||||
"""Status for one migration control or the whole plan."""
|
||||
|
||||
READY = "ready"
|
||||
PARTIAL = "partial"
|
||||
BLOCKED = "blocked"
|
||||
MANUAL_WINDOW_REQUIRED = "manual_window_required"
|
||||
|
||||
|
||||
class AcceptanceStatus(str, Enum):
|
||||
"""Decision for one identifier found in a migration payload."""
|
||||
|
||||
CANONICAL = "canonical"
|
||||
ALIAS_ACCEPTED = "alias_accepted"
|
||||
CANONICAL_FIELD_REWRITE_REQUIRED = "canonical_field_rewrite_required"
|
||||
REMOTE_ALIAS_ACCEPTED = "remote_alias_accepted"
|
||||
CENTRAL_FOLDER_ACCEPTED = "central_folder_accepted"
|
||||
BLOCKED_UNKNOWN_IDENTIFIER = "blocked_unknown_identifier"
|
||||
|
||||
|
||||
CANONICAL_OWNER_FIELDS: tuple[str, ...] = (
|
||||
"canonicalProjectId",
|
||||
"ownerPlatformId",
|
||||
"owner_platform_id",
|
||||
)
|
||||
|
||||
COMPATIBILITY_FIELDS: tuple[str, ...] = (
|
||||
"projectId",
|
||||
"project_id",
|
||||
"currentProjectId",
|
||||
"current_project_id",
|
||||
"platformId",
|
||||
"platform_id",
|
||||
"origin",
|
||||
"destination",
|
||||
"targetPlatformId",
|
||||
"target_platform_id",
|
||||
"consumerPlatformId",
|
||||
"consumer_platform_id",
|
||||
)
|
||||
|
||||
REMOTE_FIELDS: tuple[str, ...] = (
|
||||
"repoRemote",
|
||||
"remoteOrigin",
|
||||
"remote_origin",
|
||||
"originRemote",
|
||||
)
|
||||
|
||||
CENTRAL_FIELDS: tuple[str, ...] = (
|
||||
"centralFolder",
|
||||
"central_folder",
|
||||
"centralPlatformFolder",
|
||||
"central_platform_folder",
|
||||
)
|
||||
|
||||
MCP_MIGRATION_OPERATIONS: tuple[tuple[str, str], ...] = (
|
||||
("consulta", "mcp.admin.readonly"),
|
||||
("diagnostico", "mcp.admin.diagnostic"),
|
||||
("acao", "mcp.admin.action.request"),
|
||||
("auditoria", "mcp.admin.audit"),
|
||||
("explicacao", "mcp.admin.explain"),
|
||||
)
|
||||
|
||||
MCP_TRANSIT_FIELDS: tuple[str, ...] = (
|
||||
"origin",
|
||||
"destination",
|
||||
"tool",
|
||||
"payload",
|
||||
"actor",
|
||||
"permission",
|
||||
"result",
|
||||
"traceId",
|
||||
"auditId",
|
||||
"timestamp",
|
||||
)
|
||||
|
||||
|
||||
@dataclass(frozen=True, slots=True)
|
||||
class CanonicalMigrationControl:
|
||||
"""One actionable control required to migrate without losing history."""
|
||||
|
||||
control_id: str
|
||||
layer: MigrationLayer
|
||||
title: str
|
||||
current_state: str
|
||||
canonical_state: str
|
||||
status: MigrationStatus
|
||||
required_evidence: tuple[str, ...]
|
||||
blockers: tuple[str, ...]
|
||||
allowed_actions: tuple[str, ...]
|
||||
forbidden_actions: tuple[str, ...]
|
||||
rollback_steps: tuple[str, ...]
|
||||
mcp_transit_fields: tuple[str, ...]
|
||||
order_ids: tuple[str, ...]
|
||||
owner: str = "codex-operational-round"
|
||||
|
||||
@property
|
||||
def ready(self) -> bool:
|
||||
return self.status == MigrationStatus.READY
|
||||
|
||||
def to_dict(self) -> dict[str, Any]:
|
||||
return as_plain_data(self)
|
||||
|
||||
|
||||
@dataclass(frozen=True, slots=True)
|
||||
class CanonicalMigrationAcceptanceCase:
|
||||
"""One MCP acceptance case for a field/candidate/operation tuple."""
|
||||
|
||||
case_id: str
|
||||
target_name: str
|
||||
field_name: str
|
||||
candidate_value: str
|
||||
canonical_value: str
|
||||
operation: str
|
||||
permission_scope: str
|
||||
accepted: bool
|
||||
status: AcceptanceStatus
|
||||
required_action: str
|
||||
reason: str
|
||||
mcp_transit_required: bool
|
||||
direct_repository_write_blocked: bool
|
||||
|
||||
def to_dict(self) -> dict[str, Any]:
|
||||
return as_plain_data(self)
|
||||
|
||||
|
||||
@dataclass(frozen=True, slots=True)
|
||||
class SemanticWriteStatus:
|
||||
"""Compact result of writing generated file functions to SQLite."""
|
||||
|
||||
sqlite_path: str
|
||||
attempted: bool
|
||||
ok: bool
|
||||
files_count: int
|
||||
error: str = ""
|
||||
|
||||
def to_dict(self) -> dict[str, Any]:
|
||||
return as_plain_data(self)
|
||||
|
||||
|
||||
@dataclass(frozen=True, slots=True)
|
||||
class CanonicalMigrationPlan:
|
||||
"""Full canonical-name migration plan and MCP acceptance matrix."""
|
||||
|
||||
plan_id: str
|
||||
generated_at: str
|
||||
canonical_project_id: str
|
||||
current_project_id: str
|
||||
legacy_alias: str
|
||||
central_folder: str
|
||||
decision_status: str
|
||||
decision_source: str
|
||||
compatibility_rule: str
|
||||
mcp_control_plane_id: str
|
||||
mcp_execute_endpoint: str
|
||||
controls: tuple[CanonicalMigrationControl, ...]
|
||||
acceptance_cases: tuple[CanonicalMigrationAcceptanceCase, ...]
|
||||
generated_from: str
|
||||
semantic_write: SemanticWriteStatus | None = None
|
||||
central_semantic_write: SemanticWriteStatus | None = None
|
||||
|
||||
@property
|
||||
def controls_count(self) -> int:
|
||||
return len(self.controls)
|
||||
|
||||
@property
|
||||
def accepted_cases_count(self) -> int:
|
||||
return sum(1 for case in self.acceptance_cases if case.accepted)
|
||||
|
||||
@property
|
||||
def blocked_cases_count(self) -> int:
|
||||
return sum(1 for case in self.acceptance_cases if not case.accepted)
|
||||
|
||||
@property
|
||||
def blockers(self) -> tuple[str, ...]:
|
||||
return merge_unique(blocker for control in self.controls for blocker in control.blockers)
|
||||
|
||||
@property
|
||||
def status(self) -> MigrationStatus:
|
||||
if any(control.status == MigrationStatus.BLOCKED for control in self.controls):
|
||||
return MigrationStatus.BLOCKED
|
||||
if any(control.status == MigrationStatus.MANUAL_WINDOW_REQUIRED for control in self.controls):
|
||||
return MigrationStatus.MANUAL_WINDOW_REQUIRED
|
||||
if any(control.status == MigrationStatus.PARTIAL for control in self.controls):
|
||||
return MigrationStatus.PARTIAL
|
||||
return MigrationStatus.READY
|
||||
|
||||
def to_dict(self) -> dict[str, Any]:
|
||||
data = as_plain_data(self)
|
||||
data["status"] = self.status.value
|
||||
data["controls_count"] = self.controls_count
|
||||
data["accepted_cases_count"] = self.accepted_cases_count
|
||||
data["blocked_cases_count"] = self.blocked_cases_count
|
||||
data["blockers"] = list(self.blockers)
|
||||
return data
|
||||
|
||||
|
||||
def expected_remote_for(repo_name: str) -> str:
|
||||
"""Return the expected Gitea HTTPS remote for a repo name or gitea slug."""
|
||||
|
||||
clean = repo_name.strip().removeprefix("admin/")
|
||||
if clean.startswith("http://") or clean.startswith("https://"):
|
||||
return clean
|
||||
return f"https://git.ami.app.br/admin/{clean}.git"
|
||||
|
||||
|
||||
def target_canonical_name(target: RepositoryTarget) -> str:
|
||||
"""Return the migration canonical name for one repository target."""
|
||||
|
||||
return target.canonical_name or target.expected_local_name
|
||||
|
||||
|
||||
def target_identifier_candidates(target: RepositoryTarget) -> tuple[str, ...]:
|
||||
"""Return all accepted identifiers and locators for a target."""
|
||||
|
||||
canonical = target_canonical_name(target)
|
||||
names = [
|
||||
canonical,
|
||||
target.expected_local_name,
|
||||
target.declared_name,
|
||||
*target.aliases,
|
||||
platform_to_plataform(target.expected_local_name),
|
||||
plataform_to_platform(target.expected_local_name),
|
||||
target.central_folder,
|
||||
f"admin/{canonical}",
|
||||
f"admin/{target.expected_local_name}",
|
||||
target.gitea_repo,
|
||||
expected_remote_for(canonical),
|
||||
expected_remote_for(target.expected_local_name),
|
||||
expected_remote_for(target.gitea_repo),
|
||||
]
|
||||
if target.declared_name == CANONICAL_PROJECT_ID:
|
||||
names.extend(
|
||||
[
|
||||
CURRENT_PROJECT_ID,
|
||||
LEGACY_PLATAFORM_ALIAS,
|
||||
CENTRAL_FOLDER_NAME,
|
||||
f"admin/{CURRENT_PROJECT_ID}",
|
||||
f"admin/{LEGACY_PLATAFORM_ALIAS}",
|
||||
expected_remote_for(CURRENT_PROJECT_ID),
|
||||
expected_remote_for(LEGACY_PLATAFORM_ALIAS),
|
||||
]
|
||||
)
|
||||
return merge_unique(value for value in names if value)
|
||||
|
||||
|
||||
def canonical_remote_values(target: RepositoryTarget) -> tuple[str, ...]:
|
||||
"""Return canonical remote forms for a target."""
|
||||
|
||||
canonical = target_canonical_name(target)
|
||||
return (f"admin/{canonical}", expected_remote_for(canonical))
|
||||
|
||||
|
||||
def classify_candidate(target: RepositoryTarget, field_name: str, candidate: str) -> tuple[bool, AcceptanceStatus, str, str]:
|
||||
"""Classify one field/candidate pair for MCP migration payloads."""
|
||||
|
||||
canonical = target_canonical_name(target)
|
||||
accepted = set(target_identifier_candidates(target))
|
||||
canonical_values = {canonical, f"admin/{canonical}", expected_remote_for(canonical)}
|
||||
central_values = {target.central_folder}
|
||||
remote_values = set(canonical_remote_values(target))
|
||||
remote_values.update({target.gitea_repo, expected_remote_for(target.gitea_repo), expected_remote_for(target.expected_local_name)})
|
||||
|
||||
if candidate not in accepted:
|
||||
return (
|
||||
False,
|
||||
AcceptanceStatus.BLOCKED_UNKNOWN_IDENTIFIER,
|
||||
"bloquear payload ate que o identificador seja mapeado no grafo canonico",
|
||||
"identificador nao pertence ao conjunto aceito de aliases, remotes ou pasta central",
|
||||
)
|
||||
if field_name in CANONICAL_OWNER_FIELDS:
|
||||
if candidate == canonical:
|
||||
return (True, AcceptanceStatus.CANONICAL, "manter valor canonico", "campo canonico ja usa o nome institucional")
|
||||
return (
|
||||
True,
|
||||
AcceptanceStatus.CANONICAL_FIELD_REWRITE_REQUIRED,
|
||||
"reescrever campo canonico para tudo-para-ia-mais-humana-platform antes de persistir",
|
||||
"alias aceito apenas como compatibilidade; campos owner/canonical devem carregar o canonico",
|
||||
)
|
||||
if field_name in REMOTE_FIELDS:
|
||||
if candidate in canonical_values:
|
||||
return (True, AcceptanceStatus.CANONICAL, "manter remote canonico", "remote ja aponta para forma canonica")
|
||||
if candidate in remote_values or candidate in accepted:
|
||||
return (
|
||||
True,
|
||||
AcceptanceStatus.REMOTE_ALIAS_ACCEPTED,
|
||||
"registrar remote alias e migrar apenas em janela coordenada",
|
||||
"remote historico aceito para nao duplicar repositorio nem perder commits",
|
||||
)
|
||||
if field_name in CENTRAL_FIELDS:
|
||||
return (
|
||||
True,
|
||||
AcceptanceStatus.CENTRAL_FOLDER_ACCEPTED,
|
||||
"manter pasta central numerada como dossie gerencial, sem propagar numero ao repo",
|
||||
"pasta central e alias administrativo aceito, nao nome tecnico do projeto",
|
||||
)
|
||||
if candidate == canonical:
|
||||
return (True, AcceptanceStatus.CANONICAL, "usar valor canonico", "identificador ja esta canonico")
|
||||
return (
|
||||
True,
|
||||
AcceptanceStatus.ALIAS_ACCEPTED,
|
||||
"resolver alias para canonical_project_id no MCP e registrar trace/audit",
|
||||
"alias historico aceito somente com rastreabilidade e sem bypass direto",
|
||||
)
|
||||
|
||||
|
||||
def build_migration_acceptance_cases(targets: Sequence[RepositoryTarget] | None = None) -> tuple[CanonicalMigrationAcceptanceCase, ...]:
|
||||
"""Build deterministic MCP acceptance cases for repository-name migration."""
|
||||
|
||||
cases: list[CanonicalMigrationAcceptanceCase] = []
|
||||
fields = (*CANONICAL_OWNER_FIELDS, *COMPATIBILITY_FIELDS, *REMOTE_FIELDS, *CENTRAL_FIELDS)
|
||||
for target in tuple(targets or default_repository_targets()):
|
||||
canonical = target_canonical_name(target)
|
||||
for field_name in fields:
|
||||
for candidate in target_identifier_candidates(target):
|
||||
for operation, permission in MCP_MIGRATION_OPERATIONS:
|
||||
accepted, status, action, reason = classify_candidate(target, field_name, candidate)
|
||||
seed = {
|
||||
"target": target.declared_name,
|
||||
"field": field_name,
|
||||
"candidate": candidate,
|
||||
"operation": operation,
|
||||
"permission": permission,
|
||||
}
|
||||
cases.append(
|
||||
CanonicalMigrationAcceptanceCase(
|
||||
case_id=f"canonical-migration-{stable_digest(seed, 24)}",
|
||||
target_name=target.declared_name,
|
||||
field_name=field_name,
|
||||
candidate_value=candidate,
|
||||
canonical_value=canonical,
|
||||
operation=operation,
|
||||
permission_scope=permission,
|
||||
accepted=accepted,
|
||||
status=status,
|
||||
required_action=action,
|
||||
reason=reason,
|
||||
mcp_transit_required=True,
|
||||
direct_repository_write_blocked=True,
|
||||
)
|
||||
)
|
||||
return tuple(cases)
|
||||
|
||||
|
||||
def build_migration_controls() -> tuple[CanonicalMigrationControl, ...]:
|
||||
"""Build the controls that gate a safe canonical-name migration."""
|
||||
|
||||
forbidden_git = (
|
||||
"git reset --hard",
|
||||
"git checkout -- <arquivo>",
|
||||
"git restore destrutivo",
|
||||
"git clean",
|
||||
"pull/merge nao fast-forward",
|
||||
"renomear pasta criando repositorio duplicado",
|
||||
)
|
||||
return (
|
||||
CanonicalMigrationControl(
|
||||
control_id="canonical-identity-approved",
|
||||
layer=MigrationLayer.IDENTITY,
|
||||
title="Nome canonico aprovado e aliases preservados",
|
||||
current_state=f"repo materializado como {CURRENT_PROJECT_ID}; alias historico {LEGACY_PLATAFORM_ALIAS}",
|
||||
canonical_state=CANONICAL_PROJECT_ID,
|
||||
status=MigrationStatus.READY,
|
||||
required_evidence=(CANONICAL_DECISION_SOURCE, "dados/canonical-identity-graph.json"),
|
||||
blockers=(),
|
||||
allowed_actions=("resolver aliases para canonicalProjectId", "manter aliases em payloads de compatibilidade"),
|
||||
forbidden_actions=("apagar historico de aliases", "trocar ownerPlatformId sem trace/audit"),
|
||||
rollback_steps=("voltar a aceitar CURRENT_PROJECT_ID como alias se consumidor legado falhar",),
|
||||
mcp_transit_fields=MCP_TRANSIT_FIELDS,
|
||||
order_ids=("0035_EXECUTIVA__reconciliar-nome-canonico-real-alias-platform", "0052_GERENCIAL__formalizar-nome-canonico-mais-humana-platform-e-aliases"),
|
||||
),
|
||||
CanonicalMigrationControl(
|
||||
control_id="filesystem-alias-window",
|
||||
layer=MigrationLayer.FILESYSTEM,
|
||||
title="Diretorio fisico so muda em janela coordenada",
|
||||
current_state=f"G:/_codex-git/{CURRENT_PROJECT_ID}",
|
||||
canonical_state=f"G:/_codex-git/{CANONICAL_PROJECT_ID}",
|
||||
status=MigrationStatus.MANUAL_WINDOW_REQUIRED,
|
||||
required_evidence=("git status limpo antes/depois", "hash HEAD antes/depois", "ausencia de pasta duplicada"),
|
||||
blockers=("rename fisico depende de janela institucional e comparacao de remotes",),
|
||||
allowed_actions=("registrar alias de diretorio", "validar que destino canonico nao existe antes de renomear"),
|
||||
forbidden_actions=forbidden_git,
|
||||
rollback_steps=("renomear de volta somente se HEAD e remote forem iguais aos hashes pre-migracao",),
|
||||
mcp_transit_fields=MCP_TRANSIT_FIELDS,
|
||||
order_ids=("0057_GERENCIAL__governar-migracao-coordenada-do-nome-canonico-platform",),
|
||||
),
|
||||
CanonicalMigrationControl(
|
||||
control_id="git-remote-canonicalization",
|
||||
layer=MigrationLayer.GIT_REMOTE,
|
||||
title="Remote canonico sem sobrescrever remoto historico",
|
||||
current_state=f"origin historico https://git.ami.app.br/admin/{CURRENT_PROJECT_ID}.git",
|
||||
canonical_state=f"https://git.ami.app.br/admin/{CANONICAL_PROJECT_ID}.git",
|
||||
status=MigrationStatus.BLOCKED,
|
||||
required_evidence=("git remote -v", "git ls-remote --heads remoto canonico main", "push dry-run com credencial valida"),
|
||||
blockers=("SEC_E_NO_CREDENTIALS no Git Windows", "renome remoto depende de Gitea/owner"),
|
||||
allowed_actions=("mapear remote historico como alias", "bloquear push se ahead/behind divergente"),
|
||||
forbidden_actions=forbidden_git,
|
||||
rollback_steps=("restaurar origin historico se remoto canonico nao resolver o mesmo HEAD",),
|
||||
mcp_transit_fields=MCP_TRANSIT_FIELDS,
|
||||
order_ids=("0038_EXECUTIVA__corrigir-acl-index-lock-e-commitar-artefatos-mcp", "0050_GERENCIAL__decidir-politica-de-sync-automatico-e-credencial-gitea"),
|
||||
),
|
||||
CanonicalMigrationControl(
|
||||
control_id="central-dossier-materialized",
|
||||
layer=MigrationLayer.CENTRAL_DOSSIER,
|
||||
title="Pasta central registra canonico e materializa ordens",
|
||||
current_state=CENTRAL_FOLDER_NAME,
|
||||
canonical_state=f"{CENTRAL_FOLDER_NAME} como dossie; project_id canonico {CANONICAL_PROJECT_ID}",
|
||||
status=MigrationStatus.PARTIAL,
|
||||
required_evidence=("orders/executivas e orders/gerenciais materializadas", "controle-semantico.sqlite atualizado"),
|
||||
blockers=("central ja possui alteracoes concorrentes nao pertencentes a esta rodada",),
|
||||
allowed_actions=("criar arquivos ausentes da plataforma 15", "upsert SQL semantico escopado"),
|
||||
forbidden_actions=("alterar pastas de outras plataformas para resolver esta OS",),
|
||||
rollback_steps=("recriar ordens a partir de os-orientadoras/central-materialization-fallback",),
|
||||
mcp_transit_fields=MCP_TRANSIT_FIELDS,
|
||||
order_ids=("0040_EXECUTIVA__materializar-escrita-central-e-sql-semantico-sem-permissionerror",),
|
||||
),
|
||||
CanonicalMigrationControl(
|
||||
control_id="mcp-contract-owner-canonical",
|
||||
layer=MigrationLayer.MCP_CONTRACT,
|
||||
title="Contratos MCP usam ownerPlatformId canonico",
|
||||
current_state="provider Mais Humana aceita aliases e tools live",
|
||||
canonical_state=f"ownerPlatformId/canonicalProjectId = {CANONICAL_PROJECT_ID}",
|
||||
status=MigrationStatus.READY,
|
||||
required_evidence=("dados/mcp-provider-mais-humana.json", "dados/mcp-contratos-humanos.json"),
|
||||
blockers=(),
|
||||
allowed_actions=("publicar aliasPolicy no provider", "validar sameSource por MCP"),
|
||||
forbidden_actions=("chamada direta de plataforma sem traceId/auditId",),
|
||||
rollback_steps=("manter aliases aceitos no gateway durante rollout",),
|
||||
mcp_transit_fields=MCP_TRANSIT_FIELDS,
|
||||
order_ids=("0037_EXECUTIVA__homologar-rotas-administrativas-mcp-no-gateway", "0049_GERENCIAL__homologar-mcp-only-administration-routes-como-politica-de-ecossistema"),
|
||||
),
|
||||
CanonicalMigrationControl(
|
||||
control_id="mcp-execute-live-readback",
|
||||
layer=MigrationLayer.MCP_EXECUTE,
|
||||
title="Gateway MCP confirma tools e aliases via /v1/execute",
|
||||
current_state="tools Mais Humana respondem no endpoint live quando publicadas",
|
||||
canonical_state=f"{MCP_EXECUTE_ENDPOINT} audita alias e canonico pelo MCPs Internos",
|
||||
status=MigrationStatus.PARTIAL,
|
||||
required_evidence=("HTTP 200 ok=true por tool", "traceId/auditId", "source hash"),
|
||||
blockers=("deploy live e smoke dependem de runner/deploy manual quando wrangler local falhar",),
|
||||
allowed_actions=("smoke HTTP com bearer simulado informado", "registrar resposta redigida"),
|
||||
forbidden_actions=("usar falha do plugin Cloudflare como diagnostico operacional",),
|
||||
rollback_steps=("voltar para ultimo deployment Cloudflare observado por wrangler/manual",),
|
||||
mcp_transit_fields=MCP_TRANSIT_FIELDS,
|
||||
order_ids=("0039_EXECUTIVA__reexecutar-wrangler-em-runner-homologado-e-registrar-deploy",),
|
||||
),
|
||||
CanonicalMigrationControl(
|
||||
control_id="docs-ui-same-source",
|
||||
layer=MigrationLayer.DOCS_UI,
|
||||
title="Docs e UI renderizam a mesma fonte MCP",
|
||||
current_state="Docs pode estar catalogOnly; UI deve renderizar fonte MCP",
|
||||
canonical_state="GPT e painel explicam a mesma instancia administrativa canonica",
|
||||
status=MigrationStatus.BLOCKED,
|
||||
required_evidence=("decisao Docs responseReady/catalogOnly", "sameSourceValidation", "instancia administrativa MCP"),
|
||||
blockers=("Docs responseReady ou excecao catalogOnly depende de owner",),
|
||||
allowed_actions=("registrar excecao formal", "exigir sameSource antes de release UI"),
|
||||
forbidden_actions=("criar fonte paralela de painel fora do MCP",),
|
||||
rollback_steps=("desabilitar renderizacao da fonte nao-MCP ate correcao",),
|
||||
mcp_transit_fields=MCP_TRANSIT_FIELDS,
|
||||
order_ids=("0053_GERENCIAL__pactuar-docs-catalogonly-ou-response-ready-como-excecao-global",),
|
||||
),
|
||||
CanonicalMigrationControl(
|
||||
control_id="sync-mesh-no-reversal",
|
||||
layer=MigrationLayer.SYNC_MESH,
|
||||
title="Sincronizacao preserva a alteracao valida mais recente",
|
||||
current_state="fetch/push podem falhar por credencial ou ACL; central tem deltas concorrentes",
|
||||
canonical_state="hashes comparados antes de qualquer renome, push ou materializacao remota",
|
||||
status=MigrationStatus.BLOCKED,
|
||||
required_evidence=("targeted-sync-audit", "ahead/behind", "hash local/remoto", "logs de autosync"),
|
||||
blockers=("SEC_E_NO_CREDENTIALS", "FETCH_HEAD/index.lock Permission denied", "worktree central divergente"),
|
||||
allowed_actions=("fetch seguro quando credencial existir", "bloquear sincronizacao destrutiva em divergencia"),
|
||||
forbidden_actions=forbidden_git,
|
||||
rollback_steps=("preservar backup de hashes e bloquear autosync ate reconciliacao segura",),
|
||||
mcp_transit_fields=MCP_TRANSIT_FIELDS,
|
||||
order_ids=("0038_EXECUTIVA__corrigir-acl-index-lock-e-commitar-artefatos-mcp", "0050_GERENCIAL__decidir-politica-de-sync-automatico-e-credencial-gitea"),
|
||||
),
|
||||
CanonicalMigrationControl(
|
||||
control_id="rollback-and-audit-pack",
|
||||
layer=MigrationLayer.ROLLBACK,
|
||||
title="Rollback documentado antes da migracao fisica",
|
||||
current_state="aliases preservam operacao enquanto remoto/diretorio seguem historicos",
|
||||
canonical_state="rollback inclui hashes, remotes, deployment id, ordem de servico e ledger MCP",
|
||||
status=MigrationStatus.PARTIAL,
|
||||
required_evidence=("ledger MCP", "AUDITORIA-GPT", "PENDENCIAS-CODEX", "deployment id"),
|
||||
blockers=("sem push remoto confirmado nao ha rollback remoto auditavel",),
|
||||
allowed_actions=("registrar rollback textual e hashes", "manter aliases por janela de deprecacao"),
|
||||
forbidden_actions=("remover alias no mesmo ciclo do rename canonico",),
|
||||
rollback_steps=("reativar alias historico", "restaurar remote anterior", "registrar auditoria de reversao no MCP"),
|
||||
mcp_transit_fields=MCP_TRANSIT_FIELDS,
|
||||
order_ids=("0057_GERENCIAL__governar-migracao-coordenada-do-nome-canonico-platform",),
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
def build_canonical_migration_plan(*, use_generated: bool = True) -> CanonicalMigrationPlan:
|
||||
"""Build the full canonical-name migration plan."""
|
||||
|
||||
cases: tuple[CanonicalMigrationAcceptanceCase, ...]
|
||||
generated_from = "runtime"
|
||||
if use_generated:
|
||||
try:
|
||||
from .generated_canonical_migration_plan import iter_acceptance_cases
|
||||
|
||||
cases = tuple(iter_acceptance_cases())
|
||||
generated_from = "generated_canonical_migration_plan"
|
||||
except (ImportError, AttributeError):
|
||||
cases = build_migration_acceptance_cases()
|
||||
else:
|
||||
cases = build_migration_acceptance_cases()
|
||||
seed = {
|
||||
"canonical": CANONICAL_PROJECT_ID,
|
||||
"current": CURRENT_PROJECT_ID,
|
||||
"alias": LEGACY_PLATAFORM_ALIAS,
|
||||
"cases": len(cases),
|
||||
"controls": [control.control_id for control in build_migration_controls()],
|
||||
}
|
||||
return CanonicalMigrationPlan(
|
||||
plan_id=f"canonical-migration-{stable_digest(seed, 20)}",
|
||||
generated_at=utc_now(),
|
||||
canonical_project_id=CANONICAL_PROJECT_ID,
|
||||
current_project_id=CURRENT_PROJECT_ID,
|
||||
legacy_alias=LEGACY_PLATAFORM_ALIAS,
|
||||
central_folder=CENTRAL_FOLDER_NAME,
|
||||
decision_status=CANONICAL_DECISION_STATUS,
|
||||
decision_source=CANONICAL_DECISION_SOURCE,
|
||||
compatibility_rule=CANONICAL_COMPATIBILITY_RULE,
|
||||
mcp_control_plane_id=MCP_CONTROL_PLANE_ID,
|
||||
mcp_execute_endpoint=MCP_EXECUTE_ENDPOINT,
|
||||
controls=build_migration_controls(),
|
||||
acceptance_cases=cases,
|
||||
generated_from=generated_from,
|
||||
)
|
||||
|
||||
|
||||
def migration_plan_payload(plan: CanonicalMigrationPlan, *, limit_cases: int = 80) -> dict[str, Any]:
|
||||
"""Return compact JSON payload for humans, GPT, and MCP discovery."""
|
||||
|
||||
payload = plan.to_dict()
|
||||
payload["accepted_project_ids"] = list(ACCEPTED_PROJECT_IDS)
|
||||
payload["acceptance_cases"] = [case.to_dict() for case in plan.acceptance_cases[: max(0, limit_cases)]]
|
||||
payload["acceptance_cases_total"] = len(plan.acceptance_cases)
|
||||
return payload
|
||||
|
||||
|
||||
def migration_case_rows(cases: Sequence[CanonicalMigrationAcceptanceCase]) -> list[list[str]]:
|
||||
"""Return CSV rows for the acceptance matrix."""
|
||||
|
||||
rows = [
|
||||
[
|
||||
"case_id",
|
||||
"target_name",
|
||||
"field_name",
|
||||
"candidate_value",
|
||||
"canonical_value",
|
||||
"operation",
|
||||
"permission_scope",
|
||||
"accepted",
|
||||
"status",
|
||||
"required_action",
|
||||
"reason",
|
||||
]
|
||||
]
|
||||
for case in cases:
|
||||
rows.append(
|
||||
[
|
||||
case.case_id,
|
||||
case.target_name,
|
||||
case.field_name,
|
||||
case.candidate_value,
|
||||
case.canonical_value,
|
||||
case.operation,
|
||||
case.permission_scope,
|
||||
"yes" if case.accepted else "no",
|
||||
case.status.value,
|
||||
case.required_action,
|
||||
case.reason,
|
||||
]
|
||||
)
|
||||
return rows
|
||||
|
||||
|
||||
def migration_control_rows(controls: Sequence[CanonicalMigrationControl]) -> list[list[str]]:
|
||||
"""Return CSV rows for migration controls."""
|
||||
|
||||
rows = [["control_id", "layer", "status", "title", "blockers", "required_evidence", "order_ids"]]
|
||||
for control in controls:
|
||||
rows.append(
|
||||
[
|
||||
control.control_id,
|
||||
control.layer.value,
|
||||
control.status.value,
|
||||
control.title,
|
||||
" | ".join(control.blockers),
|
||||
" | ".join(control.required_evidence),
|
||||
" | ".join(control.order_ids),
|
||||
]
|
||||
)
|
||||
return rows
|
||||
|
||||
|
||||
def rows_to_csv(rows: Sequence[Sequence[str]]) -> str:
|
||||
"""Serialize rows to CSV text."""
|
||||
|
||||
buffer = io.StringIO()
|
||||
writer = csv.writer(buffer, lineterminator="\n")
|
||||
writer.writerows(rows)
|
||||
return buffer.getvalue()
|
||||
|
||||
|
||||
def migration_plan_markdown(plan: CanonicalMigrationPlan, *, limit_cases: int = 30) -> str:
|
||||
"""Render a concise human report for the canonical migration plan."""
|
||||
|
||||
lines = [
|
||||
"# Plano de migracao canonica - Mais Humana",
|
||||
"",
|
||||
f"- status: `{plan.status.value}`",
|
||||
f"- plan_id: `{plan.plan_id}`",
|
||||
f"- canonical_project_id: `{plan.canonical_project_id}`",
|
||||
f"- current_project_id: `{plan.current_project_id}`",
|
||||
f"- legacy_alias: `{plan.legacy_alias}`",
|
||||
f"- central_folder: `{plan.central_folder}`",
|
||||
f"- decision_source: `{plan.decision_source}`",
|
||||
f"- generated_from: `{plan.generated_from}`",
|
||||
f"- controls: `{plan.controls_count}`",
|
||||
f"- acceptance_cases: `{len(plan.acceptance_cases)}`",
|
||||
f"- accepted_cases: `{plan.accepted_cases_count}`",
|
||||
f"- blocked_cases: `{plan.blocked_cases_count}`",
|
||||
"",
|
||||
"## Regra institucional",
|
||||
"",
|
||||
plan.compatibility_rule,
|
||||
"",
|
||||
"## Controles",
|
||||
"",
|
||||
]
|
||||
for control in plan.controls:
|
||||
blockers = "; ".join(control.blockers) if control.blockers else "nenhum"
|
||||
lines.extend(
|
||||
[
|
||||
f"### {control.control_id}",
|
||||
f"- layer: `{control.layer.value}`",
|
||||
f"- status: `{control.status.value}`",
|
||||
f"- current_state: `{control.current_state}`",
|
||||
f"- canonical_state: `{control.canonical_state}`",
|
||||
f"- blockers: `{blockers}`",
|
||||
f"- order_ids: `{', '.join(control.order_ids)}`",
|
||||
"",
|
||||
]
|
||||
)
|
||||
lines.extend(["## Casos MCP de aceitacao", ""])
|
||||
for case in plan.acceptance_cases[: max(0, limit_cases)]:
|
||||
lines.append(
|
||||
f"- `{case.case_id}` `{case.target_name}` `{case.field_name}` -> `{case.candidate_value}` "
|
||||
f"status `{case.status.value}` action `{case.required_action}`"
|
||||
)
|
||||
lines.extend(
|
||||
[
|
||||
"",
|
||||
"## Bloqueios reais",
|
||||
"",
|
||||
]
|
||||
)
|
||||
for blocker in plan.blockers or ("nenhum",):
|
||||
lines.append(f"- {blocker}")
|
||||
lines.extend(
|
||||
[
|
||||
"",
|
||||
"## Politica de transito MCP",
|
||||
"",
|
||||
"- Toda migracao interplataforma deve passar pelo MCPs Internos.",
|
||||
"- Campos de transito obrigatorios: " + ", ".join(f"`{field}`" for field in MCP_TRANSIT_FIELDS) + ".",
|
||||
"- Escrita direta em repositorio, painel ou plataforma permanece bloqueada quando nao houver traceId/auditId.",
|
||||
"",
|
||||
]
|
||||
)
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def migration_generated_files(project_root: Path, central_platform_folder: Path | None = None) -> tuple[GeneratedFile, ...]:
|
||||
"""Return semantic file records for generated migration artifacts."""
|
||||
|
||||
relation = "0057_GERENCIAL__governar-migracao-coordenada-do-nome-canonico-platform"
|
||||
specs = [
|
||||
("dados/canonical-migration-plan.json", "Plano JSON de migracao canonica.", "canonical migration plan", "json"),
|
||||
("dados/canonical-migration-central-write-status.json", "Status da escrita central do plano de migracao canonica.", "canonical migration central write status", "json"),
|
||||
("matrizes/canonical-migration-acceptance-cases.csv", "Matriz MCP de aceite de aliases.", "canonical migration cases", "csv"),
|
||||
("matrizes/canonical-migration-controls.csv", "Controles de migracao canonica.", "canonical migration controls", "csv"),
|
||||
("ecossistema/CANONICAL-MIGRATION-PLAN.md", "Relatorio humano da migracao canonica.", "canonical migration report", "markdown"),
|
||||
]
|
||||
records = [
|
||||
GeneratedFile(
|
||||
path=str(project_root / relative),
|
||||
description=description,
|
||||
function=function,
|
||||
file_type=file_type,
|
||||
changed_by="mais_humana.canonical_migration",
|
||||
change_summary="Gerado plano de migracao canonica -platform com aliases rastreaveis e controles MCP.",
|
||||
relation_to_order=relation,
|
||||
)
|
||||
for relative, description, function, file_type in specs
|
||||
]
|
||||
if central_platform_folder is not None:
|
||||
records.append(
|
||||
GeneratedFile(
|
||||
path=str(central_platform_folder / "reports" / "EXECUTADO__canonical-migration-plan.md"),
|
||||
description="Registro central do plano de migracao canonica.",
|
||||
function="canonical migration central report",
|
||||
file_type="markdown",
|
||||
changed_by="mais_humana.canonical_migration",
|
||||
change_summary="Registrada migracao canonica no dossie central da plataforma 15.",
|
||||
relation_to_order=relation,
|
||||
)
|
||||
)
|
||||
return tuple(records)
|
||||
|
||||
|
||||
def write_semantic_records(sqlite_path: Path, files: Iterable[GeneratedFile]) -> SemanticWriteStatus:
|
||||
"""Upsert generated file functions into a semantic SQLite database."""
|
||||
|
||||
records = tuple(files)
|
||||
try:
|
||||
with connect(sqlite_path) as conn:
|
||||
upsert_files(conn, records)
|
||||
conn.commit()
|
||||
return SemanticWriteStatus(str(sqlite_path), True, True, len(records))
|
||||
except (OSError, sqlite3.Error) as exc:
|
||||
return SemanticWriteStatus(str(sqlite_path), True, False, len(records), f"{type(exc).__name__}: {exc}")
|
||||
|
||||
|
||||
def write_canonical_migration_artifacts(
|
||||
plan: CanonicalMigrationPlan,
|
||||
project_root: Path,
|
||||
*,
|
||||
central_platform_folder: Path | None = None,
|
||||
) -> tuple[GeneratedFile, SemanticWriteStatus, SemanticWriteStatus | None]:
|
||||
"""Write project and optional central artifacts for the migration plan."""
|
||||
|
||||
project_root.mkdir(parents=True, exist_ok=True)
|
||||
central_report_path = central_platform_folder / "reports" / "EXECUTADO__canonical-migration-plan.md" if central_platform_folder is not None else None
|
||||
central_file_error = ""
|
||||
central_write: SemanticWriteStatus | None = None
|
||||
central_records: tuple[GeneratedFile, ...] = ()
|
||||
if central_platform_folder is not None:
|
||||
central_records = tuple(
|
||||
record for record in migration_generated_files(project_root, central_platform_folder) if str(central_platform_folder) in record.path
|
||||
)
|
||||
try:
|
||||
assert central_report_path is not None
|
||||
central_report_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
central_report_path.write_text(migration_plan_markdown(plan, limit_cases=60), encoding="utf-8")
|
||||
central_write = write_semantic_records(central_platform_folder / "controle-semantico.sqlite", central_records or migration_generated_files(project_root, central_platform_folder))
|
||||
except OSError as exc:
|
||||
central_file_error = f"{type(exc).__name__}: {exc}"
|
||||
central_write = SemanticWriteStatus(
|
||||
str(central_platform_folder / "controle-semantico.sqlite"),
|
||||
True,
|
||||
False,
|
||||
len(central_records),
|
||||
central_file_error,
|
||||
)
|
||||
targets = [
|
||||
(project_root / "dados" / "canonical-migration-plan.json", json.dumps(migration_plan_payload(plan, limit_cases=400), ensure_ascii=False, indent=2, sort_keys=True)),
|
||||
(
|
||||
project_root / "dados" / "canonical-migration-central-write-status.json",
|
||||
json.dumps(
|
||||
{
|
||||
"centralPlatformFolder": str(central_platform_folder) if central_platform_folder is not None else "",
|
||||
"centralReportPath": str(central_report_path) if central_report_path is not None else "",
|
||||
"centralReportOk": bool(central_platform_folder is not None and not central_file_error),
|
||||
"centralReportError": central_file_error,
|
||||
"centralSemanticWrite": central_write.to_dict() if central_write is not None else None,
|
||||
},
|
||||
ensure_ascii=False,
|
||||
indent=2,
|
||||
sort_keys=True,
|
||||
),
|
||||
),
|
||||
(project_root / "matrizes" / "canonical-migration-acceptance-cases.csv", rows_to_csv(migration_case_rows(plan.acceptance_cases))),
|
||||
(project_root / "matrizes" / "canonical-migration-controls.csv", rows_to_csv(migration_control_rows(plan.controls))),
|
||||
(project_root / "ecossistema" / "CANONICAL-MIGRATION-PLAN.md", migration_plan_markdown(plan, limit_cases=120)),
|
||||
]
|
||||
for path, text in targets:
|
||||
path.parent.mkdir(parents=True, exist_ok=True)
|
||||
path.write_text(text, encoding="utf-8")
|
||||
records = migration_generated_files(project_root, central_platform_folder)
|
||||
project_write = write_semantic_records(project_root / "controle-semantico.sqlite", records)
|
||||
return records, project_write, central_write
|
||||
|
||||
|
||||
def run_canonical_migration_plan(
|
||||
*,
|
||||
project_root: Path,
|
||||
central_platform_folder: Path | None = None,
|
||||
use_generated: bool = True,
|
||||
) -> CanonicalMigrationPlan:
|
||||
"""Build, write, and return the canonical migration plan."""
|
||||
|
||||
plan = build_canonical_migration_plan(use_generated=use_generated)
|
||||
records, project_write, central_write = write_canonical_migration_artifacts(
|
||||
plan,
|
||||
project_root,
|
||||
central_platform_folder=central_platform_folder,
|
||||
)
|
||||
return CanonicalMigrationPlan(
|
||||
plan_id=plan.plan_id,
|
||||
generated_at=plan.generated_at,
|
||||
canonical_project_id=plan.canonical_project_id,
|
||||
current_project_id=plan.current_project_id,
|
||||
legacy_alias=plan.legacy_alias,
|
||||
central_folder=plan.central_folder,
|
||||
decision_status=plan.decision_status,
|
||||
decision_source=plan.decision_source,
|
||||
compatibility_rule=plan.compatibility_rule,
|
||||
mcp_control_plane_id=plan.mcp_control_plane_id,
|
||||
mcp_execute_endpoint=plan.mcp_execute_endpoint,
|
||||
controls=plan.controls,
|
||||
acceptance_cases=plan.acceptance_cases,
|
||||
generated_from=plan.generated_from,
|
||||
semantic_write=project_write,
|
||||
central_semantic_write=central_write,
|
||||
)
|
||||
@@ -10,6 +10,7 @@ from .models import as_plain_data
|
||||
from .central_consolidation import run_consolidated_report
|
||||
from .central_materialization import run_central_materialization
|
||||
from .canonical_identity import identity_graph_payload, run_canonical_identity_graph
|
||||
from .canonical_migration import migration_plan_payload, run_canonical_migration_plan
|
||||
from .matrix import build_global_recommendations, build_matrix, build_platform_reports
|
||||
from .mcp_contract import build_mcp_contract_report, build_mcp_execute_probe, mcp_provider_compact_json, mcp_provider_payload
|
||||
from .mcp_contract import (
|
||||
@@ -153,6 +154,14 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
default="G:/_codex-git/nucleo-gestao-operacional/central-de-ordem-de-servico/projects/15_repo_tudo-para-ia-mais-humana-platform",
|
||||
)
|
||||
canonical_identity.add_argument("--no-generated", action="store_true", help="Build graph from runtime targets instead of generated registry.")
|
||||
canonical_migration = sub.add_parser("canonical-migration-plan", help="Write canonical-name migration controls and MCP acceptance cases.")
|
||||
canonical_migration.add_argument("--project-root", default="G:/_codex-git/tudo-para-ia-mais-humana")
|
||||
canonical_migration.add_argument(
|
||||
"--central-platform-folder",
|
||||
default="G:/_codex-git/nucleo-gestao-operacional/central-de-ordem-de-servico/projects/15_repo_tudo-para-ia-mais-humana-platform",
|
||||
)
|
||||
canonical_migration.add_argument("--no-generated", action="store_true", help="Build acceptance cases from runtime repository targets.")
|
||||
canonical_migration.add_argument("--limit", type=int, default=40)
|
||||
return parser
|
||||
|
||||
|
||||
@@ -609,6 +618,17 @@ def command_canonical_identity(args: argparse.Namespace) -> int:
|
||||
return 0
|
||||
|
||||
|
||||
def command_canonical_migration_plan(args: argparse.Namespace) -> int:
|
||||
central_platform_folder = Path(args.central_platform_folder) if args.central_platform_folder else None
|
||||
plan = run_canonical_migration_plan(
|
||||
project_root=Path(args.project_root),
|
||||
central_platform_folder=central_platform_folder,
|
||||
use_generated=not bool(args.no_generated),
|
||||
)
|
||||
print(json.dumps(migration_plan_payload(plan, limit_cases=int(args.limit)), ensure_ascii=False, indent=2))
|
||||
return 0
|
||||
|
||||
|
||||
def main(argv: list[str] | None = None) -> int:
|
||||
parser = build_parser()
|
||||
args = parser.parse_args(argv)
|
||||
@@ -654,6 +674,8 @@ def main(argv: list[str] | None = None) -> int:
|
||||
return command_central_materialization(args)
|
||||
if args.command == "canonical-identity":
|
||||
return command_canonical_identity(args)
|
||||
if args.command == "canonical-migration-plan":
|
||||
return command_canonical_migration_plan(args)
|
||||
parser.error(f"unknown command: {args.command}")
|
||||
return 2
|
||||
|
||||
|
||||
139750
src/mais_humana/generated_canonical_migration_plan.py
Normal file
139750
src/mais_humana/generated_canonical_migration_plan.py
Normal file
File diff suppressed because it is too large
Load Diff
87
tests/test_canonical_migration.py
Normal file
87
tests/test_canonical_migration.py
Normal file
@@ -0,0 +1,87 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import unittest
|
||||
|
||||
from mais_humana.canonical_migration import (
|
||||
AcceptanceStatus,
|
||||
CANONICAL_PROJECT_ID,
|
||||
CURRENT_PROJECT_ID,
|
||||
build_canonical_migration_plan,
|
||||
build_migration_acceptance_cases,
|
||||
migration_plan_markdown,
|
||||
migration_plan_payload,
|
||||
)
|
||||
from mais_humana.cli import main
|
||||
from mais_humana.storage import table_counts
|
||||
from tests.helpers import make_tmp
|
||||
|
||||
|
||||
class CanonicalMigrationTests(unittest.TestCase):
|
||||
def test_runtime_plan_models_canonical_aliases_and_controls(self) -> None:
|
||||
plan = build_canonical_migration_plan(use_generated=False)
|
||||
|
||||
self.assertEqual(plan.canonical_project_id, CANONICAL_PROJECT_ID)
|
||||
self.assertEqual(plan.current_project_id, CURRENT_PROJECT_ID)
|
||||
self.assertGreaterEqual(plan.controls_count, 8)
|
||||
self.assertGreaterEqual(len(plan.acceptance_cases), 2000)
|
||||
self.assertIn("SEC_E_NO_CREDENTIALS", plan.blockers)
|
||||
self.assertIn("Plano de migracao canonica", migration_plan_markdown(plan, limit_cases=3))
|
||||
|
||||
def test_owner_platform_alias_requires_canonical_rewrite(self) -> None:
|
||||
cases = build_migration_acceptance_cases()
|
||||
matching = [
|
||||
case
|
||||
for case in cases
|
||||
if case.target_name == CANONICAL_PROJECT_ID
|
||||
and case.field_name == "ownerPlatformId"
|
||||
and case.candidate_value == CURRENT_PROJECT_ID
|
||||
]
|
||||
|
||||
self.assertTrue(matching)
|
||||
self.assertTrue(all(case.accepted for case in matching))
|
||||
self.assertTrue(any(case.status == AcceptanceStatus.CANONICAL_FIELD_REWRITE_REQUIRED for case in matching))
|
||||
|
||||
def test_payload_is_compact_but_preserves_totals(self) -> None:
|
||||
plan = build_canonical_migration_plan(use_generated=False)
|
||||
payload = migration_plan_payload(plan, limit_cases=5)
|
||||
|
||||
self.assertEqual(payload["canonical_project_id"], CANONICAL_PROJECT_ID)
|
||||
self.assertEqual(len(payload["acceptance_cases"]), 5)
|
||||
self.assertEqual(payload["acceptance_cases_total"], len(plan.acceptance_cases))
|
||||
self.assertIn(CURRENT_PROJECT_ID, payload["accepted_project_ids"])
|
||||
|
||||
def test_cli_writes_project_central_and_sql_artifacts(self) -> None:
|
||||
root = make_tmp()
|
||||
project = root / "tudo-para-ia-mais-humana"
|
||||
central = root / "central" / "15_repo_tudo-para-ia-mais-humana-platform"
|
||||
|
||||
code = main(
|
||||
[
|
||||
"canonical-migration-plan",
|
||||
"--project-root",
|
||||
str(project),
|
||||
"--central-platform-folder",
|
||||
str(central),
|
||||
"--no-generated",
|
||||
"--limit",
|
||||
"3",
|
||||
]
|
||||
)
|
||||
|
||||
self.assertEqual(code, 0)
|
||||
self.assertTrue((project / "dados" / "canonical-migration-plan.json").exists())
|
||||
self.assertTrue((project / "matrizes" / "canonical-migration-acceptance-cases.csv").exists())
|
||||
self.assertTrue((project / "matrizes" / "canonical-migration-controls.csv").exists())
|
||||
self.assertTrue((project / "ecossistema" / "CANONICAL-MIGRATION-PLAN.md").exists())
|
||||
self.assertTrue((central / "reports" / "EXECUTADO__canonical-migration-plan.md").exists())
|
||||
payload = json.loads((project / "dados" / "canonical-migration-plan.json").read_text(encoding="utf-8"))
|
||||
self.assertEqual(payload["canonical_project_id"], CANONICAL_PROJECT_ID)
|
||||
self.assertGreaterEqual(payload["acceptance_cases_total"], 2000)
|
||||
self.assertGreaterEqual(table_counts(project / "controle-semantico.sqlite").get("files", 0), 4)
|
||||
self.assertGreaterEqual(table_counts(central / "controle-semantico.sqlite").get("files", 0), 1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
117
tools/generate_canonical_migration_plan.py
Normal file
117
tools/generate_canonical_migration_plan.py
Normal file
@@ -0,0 +1,117 @@
|
||||
"""Generate importable canonical migration acceptance cases.
|
||||
|
||||
The generated module keeps the canonical-name migration matrix available to
|
||||
tests and MCP payload generation without rescanning repository declarations on
|
||||
each command. Regenerate after changing repository targets, identifier fields,
|
||||
or the canonical naming policy.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
from typing import Iterable
|
||||
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
SRC = ROOT / "src"
|
||||
OUTPUT = SRC / "mais_humana" / "generated_canonical_migration_plan.py"
|
||||
|
||||
|
||||
def ensure_import_path() -> None:
|
||||
import sys
|
||||
|
||||
src = str(SRC)
|
||||
if src not in sys.path:
|
||||
sys.path.insert(0, src)
|
||||
|
||||
|
||||
def q(value: object) -> str:
|
||||
return repr(str(value))
|
||||
|
||||
|
||||
def bool_literal(value: bool) -> str:
|
||||
return "True" if value else "False"
|
||||
|
||||
|
||||
def tuple_literal(values: Iterable[object], *, indent: int = 8) -> str:
|
||||
cleaned = [str(value) for value in values if str(value).strip()]
|
||||
if not cleaned:
|
||||
return "()"
|
||||
if len(cleaned) <= 8:
|
||||
return "(" + ", ".join(q(value) for value in cleaned) + ("," if len(cleaned) == 1 else "") + ")"
|
||||
pad = " " * indent
|
||||
lines = ["("]
|
||||
for value in cleaned:
|
||||
lines.append(f"{pad}{q(value)},")
|
||||
lines.append(" " * (indent - 4) + ")")
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def case_block(case: object) -> str:
|
||||
return "\n".join(
|
||||
[
|
||||
" CanonicalMigrationAcceptanceCase(",
|
||||
f" case_id={q(getattr(case, 'case_id'))},",
|
||||
f" target_name={q(getattr(case, 'target_name'))},",
|
||||
f" field_name={q(getattr(case, 'field_name'))},",
|
||||
f" candidate_value={q(getattr(case, 'candidate_value'))},",
|
||||
f" canonical_value={q(getattr(case, 'canonical_value'))},",
|
||||
f" operation={q(getattr(case, 'operation'))},",
|
||||
f" permission_scope={q(getattr(case, 'permission_scope'))},",
|
||||
f" accepted={bool_literal(getattr(case, 'accepted'))},",
|
||||
f" status=AcceptanceStatus.{getattr(case, 'status').name},",
|
||||
f" required_action={q(getattr(case, 'required_action'))},",
|
||||
f" reason={q(getattr(case, 'reason'))},",
|
||||
f" mcp_transit_required={bool_literal(getattr(case, 'mcp_transit_required'))},",
|
||||
f" direct_repository_write_blocked={bool_literal(getattr(case, 'direct_repository_write_blocked'))},",
|
||||
" ),",
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
def main() -> int:
|
||||
ensure_import_path()
|
||||
from mais_humana.canonical_migration import build_migration_acceptance_cases
|
||||
|
||||
cases = build_migration_acceptance_cases()
|
||||
lines = [
|
||||
'"""Generated canonical migration plan for Mais Humana.',
|
||||
"",
|
||||
"Do not edit this file by hand. Regenerate it with:",
|
||||
"",
|
||||
" python tools/generate_canonical_migration_plan.py",
|
||||
"",
|
||||
"The registry is source code so it can be imported, tested, packaged,",
|
||||
"hashed, and exposed through MCP without rescanning repository targets.",
|
||||
'"""',
|
||||
"",
|
||||
"from __future__ import annotations",
|
||||
"",
|
||||
"from .canonical_migration import (",
|
||||
" AcceptanceStatus,",
|
||||
" CanonicalMigrationAcceptanceCase,",
|
||||
")",
|
||||
"",
|
||||
f"GENERATED_ACCEPTANCE_CASES_COUNT = {len(cases)}",
|
||||
"",
|
||||
"ACCEPTANCE_CASES = (",
|
||||
]
|
||||
lines.extend(case_block(case) for case in cases)
|
||||
lines.extend(
|
||||
[
|
||||
")",
|
||||
"",
|
||||
"",
|
||||
"def iter_acceptance_cases():",
|
||||
" return ACCEPTANCE_CASES",
|
||||
"",
|
||||
]
|
||||
)
|
||||
OUTPUT.write_text("\n".join(lines), encoding="utf-8")
|
||||
print(f"generated {OUTPUT} cases={len(cases)} lines={len(lines)}")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
|
||||
Reference in New Issue
Block a user