auto-sync: tudo-para-ia-mais-humana 2026-05-02 04:45:08

This commit is contained in:
2026-05-02 04:45:08 -03:00
parent fd68fb7b8e
commit d7e15d6f3d
8 changed files with 127 additions and 39 deletions

View File

@@ -17,14 +17,14 @@ from enum import Enum
from pathlib import Path from pathlib import Path
from typing import Any, Mapping, Sequence from typing import Any, Mapping, Sequence
from .identity_policy import CANONICAL_COMPATIBILITY_RULE, CANONICAL_PROJECT_ID, CENTRAL_FOLDER_NAME, CURRENT_PROJECT_ID
from .models import GeneratedFile, OrderStatus, OrderType, ServiceOrder, as_plain_data, merge_unique, utc_now from .models import GeneratedFile, OrderStatus, OrderType, ServiceOrder, as_plain_data, merge_unique, utc_now
from .orders import order_markdown from .orders import order_markdown
from .storage import connect, upsert_files, upsert_orders from .storage import connect, upsert_files, upsert_orders
PROJECT_ID = "tudo-para-ia-mais-humana" PROJECT_ID = CANONICAL_PROJECT_ID
REAL_REPO = "tudo-para-ia-mais-humana" REAL_REPO = CURRENT_PROJECT_ID
CENTRAL_FOLDER_NAME = "15_repo_tudo-para-ia-mais-humana-platform"
class MaterializationStatus(str, Enum): class MaterializationStatus(str, Enum):
@@ -336,14 +336,14 @@ def active_managerial_order_specs() -> tuple[MaterializedOrderSpec, ...]:
_mgr( _mgr(
"0052_GERENCIAL__formalizar-nome-canonico-mais-humana-platform-e-aliases", "0052_GERENCIAL__formalizar-nome-canonico-mais-humana-platform-e-aliases",
"Formalizar nome canonico Mais Humana platform e aliases", "Formalizar nome canonico Mais Humana platform e aliases",
"Decidir a relacao entre repo real sem sufixo, alias administrativo -platform e alias historico -plataform.", "Registrar a relacao entre canonico -platform, repo local sem sufixo e alias historico -plataform.",
"O projeto real local e remoto encontrado e tudo-para-ia-mais-humana, enquanto a pasta central usa -platform.", "A decisao institucional registrada no roteador aprovou tudo-para-ia-mais-humana-platform como nome canonico.",
"Nome canonico, aliases, politica de migracao e janela segura documentados sem duplicar repositorio.", "Nome canonico aprovado, aliases preservados e migracao futura limitada a janela coordenada sem duplicar repositorio.",
("README.md", "dados/mcp-publication-gate-mais-humana.json"), ("README.md", "dados/mcp-publication-gate-mais-humana.json"),
("verificar remote", "verificar ownerPlatformId", "verificar referencias centrais"), ("verificar remote", "verificar ownerPlatformId", "verificar referencias centrais"),
("decisao institucional registrada", "aliases preservados ou migrados", "sem repositorio duplicado"), ("decisao institucional registrada", "aliases preservados", "sem repositorio duplicado"),
role=OrderLifecycleRole.ACTIVE_INPUT, role=OrderLifecycleRole.ACTIVE_INPUT,
status=OrderStatus.BLOCKED, status=OrderStatus.COMPLETED,
), ),
_mgr( _mgr(
"0053_GERENCIAL__pactuar-docs-catalogonly-ou-response-ready-como-excecao-global", "0053_GERENCIAL__pactuar-docs-catalogonly-ou-response-ready-como-excecao-global",
@@ -644,7 +644,7 @@ def _active_queue_markdown(report: CentralMaterializationReport) -> str:
def _state_markdown(report: CentralMaterializationReport) -> str: def _state_markdown(report: CentralMaterializationReport) -> str:
lines = [ lines = [
"# Estado atual reconciliado - tudo-para-ia-mais-humana", "# Estado atual reconciliado - tudo-para-ia-mais-humana-platform",
"", "",
"## Atualizacao central materialization - 2026-05-02", "## Atualizacao central materialization - 2026-05-02",
"", "",
@@ -655,7 +655,9 @@ def _state_markdown(report: CentralMaterializationReport) -> str:
f"- project_root: `{report.project_root}`", f"- project_root: `{report.project_root}`",
f"- central_platform_folder: `{report.central_platform_folder}`", f"- central_platform_folder: `{report.central_platform_folder}`",
"", "",
"A rodada materializou ordens citadas pela fila, gerou o catalogo de aceitacao das rotas administrativas MCP-only e preservou como pendencias apenas credencial Git, runner/deploy, ACL local, decisao canonica e Docs.", "A rodada materializou ordens citadas pela fila, gerou o catalogo de aceitacao das rotas administrativas MCP-only, registrou a decisao canonica e preservou como pendencias apenas credencial Git, runner/deploy, ACL local e Docs.",
"",
f"Politica canonica: {CANONICAL_COMPATIBILITY_RULE}",
"", "",
"## Saida ativa efetiva", "## Saida ativa efetiva",
"", "",
@@ -672,7 +674,7 @@ def _state_markdown(report: CentralMaterializationReport) -> str:
def _orders_index_markdown(report: CentralMaterializationReport) -> str: def _orders_index_markdown(report: CentralMaterializationReport) -> str:
lines = [ lines = [
"# Indice de ordens - tudo-para-ia-mais-humana", "# Indice de ordens - tudo-para-ia-mais-humana-platform",
"", "",
"## Rodada 015 - materializacao central", "## Rodada 015 - materializacao central",
"", "",

View File

@@ -22,6 +22,14 @@ from enum import Enum
from pathlib import Path from pathlib import Path
from typing import Any, Iterable, Mapping, Sequence from typing import Any, Iterable, Mapping, Sequence
from .identity_policy import (
CANONICAL_PROJECT_ID,
CURRENT_PROJECT_ID,
LEGACY_PROJECT_IDS,
MCP_CONTROL_PLANE_ID,
MCP_EXECUTE_ENDPOINT,
UI_SUPPORT_PLATFORM_ID,
)
from .models import PlatformHumanReport, as_plain_data, merge_unique, slugify, utc_now from .models import PlatformHumanReport, as_plain_data, merge_unique, slugify, utc_now
@@ -98,15 +106,6 @@ MCP_TRANSIT_FIELDS: tuple[str, ...] = (
) )
CANONICAL_PROJECT_ID = "tudo-para-ia-mais-humana-platform"
CURRENT_PROJECT_ID = "tudo-para-ia-mais-humana"
LEGACY_PROJECT_IDS: tuple[str, ...] = (
"tudo-para-ia-mais-humana",
"tudo-para-ia-mais-humana-plataform",
)
MCP_CONTROL_PLANE_ID = "tudo-para-ia-mcps-internos-plataform"
UI_SUPPORT_PLATFORM_ID = "tudo-para-ia-ui-platform"
MCP_EXECUTE_ENDPOINT = "https://mcps-gateway.ami-app.workers.dev/v1/execute"
RULEBOOK_SOURCE_TOOL_ID = "mais_humana.rulebook.compact" RULEBOOK_SOURCE_TOOL_ID = "mais_humana.rulebook.compact"

View File

@@ -0,0 +1,81 @@
"""Canonical identity policy for the Mais Humana platform.
The institutional decision is explicit: the platform's canonical name is
``tudo-para-ia-mais-humana-platform``. The physical repository may still be
materialized as the historical no-suffix folder while synchronization and Gitea
renames are coordinated, so the policy keeps compatibility aliases visible
instead of treating them as competing sources of truth.
"""
from __future__ import annotations
from dataclasses import dataclass
from typing import Any
from .models import as_plain_data, merge_unique
CANONICAL_PROJECT_ID = "tudo-para-ia-mais-humana-platform"
CURRENT_PROJECT_ID = "tudo-para-ia-mais-humana"
LEGACY_PLATAFORM_ALIAS = "tudo-para-ia-mais-humana-plataform"
CENTRAL_FOLDER_NAME = "15_repo_tudo-para-ia-mais-humana-platform"
CANONICAL_DECISION_STATUS = "approved"
CANONICAL_DECISION_SOURCE = "015-ROTEADOR-PERMANENTE-DE-ORDEM_DE_SERVICO.MD"
MCP_CONTROL_PLANE_ID = "tudo-para-ia-mcps-internos-plataform"
UI_SUPPORT_PLATFORM_ID = "tudo-para-ia-ui-platform"
MCP_EXECUTE_ENDPOINT = "https://mcps-gateway.ami-app.workers.dev/v1/execute"
LEGACY_PROJECT_IDS: tuple[str, ...] = (
CURRENT_PROJECT_ID,
LEGACY_PLATAFORM_ALIAS,
)
ACCEPTED_PROJECT_IDS: tuple[str, ...] = merge_unique(
(CANONICAL_PROJECT_ID, *LEGACY_PROJECT_IDS)
)
CANONICAL_COMPATIBILITY_RULE = (
"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."
)
@dataclass(frozen=True, slots=True)
class CanonicalIdentityPolicy:
"""Serializable policy consumed by MCP contracts, reports, and gates."""
canonical_project_id: str = CANONICAL_PROJECT_ID
current_project_id: str = CURRENT_PROJECT_ID
legacy_project_ids: tuple[str, ...] = LEGACY_PROJECT_IDS
accepted_project_ids: tuple[str, ...] = ACCEPTED_PROJECT_IDS
decision_status: str = CANONICAL_DECISION_STATUS
decision_source: str = CANONICAL_DECISION_SOURCE
central_folder_name: str = CENTRAL_FOLDER_NAME
control_plane_id: str = MCP_CONTROL_PLANE_ID
compatibility_rule: str = CANONICAL_COMPATIBILITY_RULE
def to_dict(self) -> dict[str, Any]:
return as_plain_data(self)
def canonical_identity_policy() -> CanonicalIdentityPolicy:
"""Return the immutable identity policy for this round."""
return CanonicalIdentityPolicy()
def canonicalize_project_id(project_id: str) -> str:
"""Map known historical ids to the approved canonical project id."""
normalized = str(project_id).strip()
if normalized in ACCEPTED_PROJECT_IDS:
return CANONICAL_PROJECT_ID
return normalized
def is_accepted_project_id(project_id: str) -> bool:
"""Return whether an id is canonical or an approved compatibility alias."""
return canonicalize_project_id(project_id) == CANONICAL_PROJECT_ID

View File

@@ -34,6 +34,11 @@ from .mcp_contract import (
PROVIDER_TOOL_ID, PROVIDER_TOOL_ID,
stable_hash, stable_hash,
) )
from .identity_policy import (
CANONICAL_COMPATIBILITY_RULE,
CANONICAL_DECISION_STATUS,
LEGACY_PROJECT_IDS,
)
from .models import GeneratedFile, as_plain_data, merge_unique, slugify, utc_now from .models import GeneratedFile, as_plain_data, merge_unique, slugify, utc_now
from .redaction import redact_sensitive_text from .redaction import redact_sensitive_text
@@ -504,7 +509,7 @@ def build_alias_policy(
*, *,
central_platform_folder: Path | None = None, central_platform_folder: Path | None = None,
repo_remote: str = "", repo_remote: str = "",
decision_status: str = "pending_institutional_decision", decision_status: str = CANONICAL_DECISION_STATUS,
) -> AliasPolicyEvidence: ) -> AliasPolicyEvidence:
"""Build the canonical-name policy without renaming files or remotes.""" """Build the canonical-name policy without renaming files or remotes."""
@@ -519,15 +524,12 @@ def build_alias_policy(
current_project_id=CURRENT_PROJECT_ID, current_project_id=CURRENT_PROJECT_ID,
canonical_project_id=CANONICAL_PROJECT_ID, canonical_project_id=CANONICAL_PROJECT_ID,
owner_platform_id=DEFAULT_OWNER_PLATFORM_ID, owner_platform_id=DEFAULT_OWNER_PLATFORM_ID,
legacy_aliases=(DEFAULT_OWNER_PLATFORM_ID, LEGACY_ALIAS_PLATFORM_ID), legacy_aliases=tuple(LEGACY_PROJECT_IDS),
central_folder=central_folder, central_folder=central_folder,
repo_remote=repo_remote, repo_remote=repo_remote,
decision_status=decision_status, decision_status=decision_status,
migration_safe_now=migration_safe_now, migration_safe_now=migration_safe_now,
compatibility_rule=( compatibility_rule=CANONICAL_COMPATIBILITY_RULE,
"Preserve current project id and central -platform alias until an explicit "
"institutional decision authorizes a synchronized Git/MCP/documentation rename."
),
blockers=tuple(blockers), blockers=tuple(blockers),
) )
@@ -596,7 +598,7 @@ def decide_publication_orders(
alias.status, alias.status,
"politica de alias foi materializada sem renome destrutivo", "politica de alias foi materializada sem renome destrutivo",
("alias_policy",), ("alias_policy",),
"aguardar decisao institucional antes de renomear remote, pasta central, ownerPlatformId ou referencias historicas", "executar migracao Git/MCP/documentacao somente por janela coordenada, preservando aliases e hashes",
), ),
_decision( _decision(
"0043_GERENCIAL__aprovar-janela-publicacao-provider-mais-humana-com-rollback", "0043_GERENCIAL__aprovar-janela-publicacao-provider-mais-humana-com-rollback",
@@ -629,9 +631,9 @@ def decide_publication_orders(
_decision( _decision(
"0047_GERENCIAL__decidir-nome-canonico-e-politica-alias-mais-humana", "0047_GERENCIAL__decidir-nome-canonico-e-politica-alias-mais-humana",
alias.status, alias.status,
"nome atual, nome canonico recomendado e aliases estao documentados", "decisao institucional aprovada: canonico -platform com aliases historicos preservados",
("alias_policy",), ("alias_policy",),
"registrar decisao formal: preservar alias ou executar migracao coordenada", "manter politica de compatibilidade e abrir apenas execucao tecnica de migracao coordenada",
), ),
) )
@@ -687,7 +689,7 @@ def build_publication_gate_report(
f"Wrangler autenticado: {wrangler.authenticated}; deploy dry-run OK: {wrangler.deploy_dry_run_ok}.", f"Wrangler autenticado: {wrangler.authenticated}; deploy dry-run OK: {wrangler.deploy_dry_run_ok}.",
f"Tools live prontas: {sum(1 for item in probes if item.live_ready)}/{len(probes)}.", f"Tools live prontas: {sum(1 for item in probes if item.live_ready)}/{len(probes)}.",
f"Probes live com envelope MCP completo: {sum(1 for item in probes if not item.missing_transit_fields)}/{len(probes)}.", f"Probes live com envelope MCP completo: {sum(1 for item in probes if not item.missing_transit_fields)}/{len(probes)}.",
f"Nome atual: {CURRENT_PROJECT_ID}; canonico recomendado: {CANONICAL_PROJECT_ID}; ownerPlatformId MCP: {DEFAULT_OWNER_PLATFORM_ID}.", f"Nome atual materializado: {CURRENT_PROJECT_ID}; canonico aprovado: {CANONICAL_PROJECT_ID}; ownerPlatformId MCP: {DEFAULT_OWNER_PLATFORM_ID}.",
f"Decisoes de OS avaliadas: {len(decisions)}.", f"Decisoes de OS avaliadas: {len(decisions)}.",
) )
return McpPublicationGateReport( return McpPublicationGateReport(

View File

@@ -31,6 +31,7 @@ from enum import Enum
from pathlib import Path from pathlib import Path
from typing import Any, Callable, Iterable, Mapping, MutableMapping, Sequence from typing import Any, Callable, Iterable, Mapping, MutableMapping, Sequence
from .identity_policy import CANONICAL_PROJECT_ID, CURRENT_PROJECT_ID, LEGACY_PLATAFORM_ALIAS
from .models import GeneratedFile, as_plain_data, merge_unique, slugify, utc_now from .models import GeneratedFile, as_plain_data, merge_unique, slugify, utc_now
@@ -565,14 +566,16 @@ def default_repository_targets() -> tuple[RepositoryTarget, ...]:
central_folder="09_repo_tudo-para-ia-intelligence-platform", central_folder="09_repo_tudo-para-ia-intelligence-platform",
), ),
RepositoryTarget( RepositoryTarget(
declared_name="tudo-para-ia-mais-humana-platform", declared_name=CANONICAL_PROJECT_ID,
expected_local_name="tudo-para-ia-mais-humana", expected_local_name=CANONICAL_PROJECT_ID,
gitea_repo="admin/tudo-para-ia-mais-humana", gitea_repo=f"admin/{CANONICAL_PROJECT_ID}",
central_folder="15_repo_tudo-para-ia-mais-humana-platform", central_folder="15_repo_tudo-para-ia-mais-humana-platform",
aliases=("tudo-para-ia-mais-humana-plataform",), aliases=(CURRENT_PROJECT_ID, LEGACY_PLATAFORM_ALIAS),
canonical_name="tudo-para-ia-mais-humana-platform", canonical_name=CANONICAL_PROJECT_ID,
requires_nominal_reconciliation=True, requires_nominal_reconciliation=True,
notes=("nome canonico administrativo declarado como -platform; repo local/remoto materializado segue sem sufixo ate decisao Gitea",), notes=(
"decisao institucional aprovou -platform como canonico; repo local/remoto historico sem sufixo permanece alias ate migracao coordenada",
),
), ),
RepositoryTarget( RepositoryTarget(
declared_name="tudo-para-ia-mcps-internos-plataform", declared_name="tudo-para-ia-mcps-internos-plataform",

View File

@@ -50,7 +50,7 @@ class CentralMaterializationTests(unittest.TestCase):
code = main(["central-materialization", "--project-root", str(project), "--central-platform-folder", str(central)]) code = main(["central-materialization", "--project-root", str(project), "--central-platform-folder", str(central)])
self.assertEqual(code, 0) self.assertEqual(code, 0)
payload = json.loads((central / "dados" / "central-materialization-report.json").read_text(encoding="utf-8")) payload = json.loads((central / "dados" / "central-materialization-report.json").read_text(encoding="utf-8"))
self.assertEqual(payload["project_id"], "tudo-para-ia-mais-humana") self.assertEqual(payload["project_id"], "tudo-para-ia-mais-humana-platform")
self.assertEqual(len(payload["active_input_orders"]), 10) self.assertEqual(len(payload["active_input_orders"]), 10)
self.assertEqual(len(payload["next_output_orders"]), 10) self.assertEqual(len(payload["next_output_orders"]), 10)

View File

@@ -142,7 +142,7 @@ class McpPublicationGateTests(unittest.TestCase):
) )
self.assertEqual( self.assertEqual(
by_id["0047_GERENCIAL__decidir-nome-canonico-e-politica-alias-mais-humana"].status, by_id["0047_GERENCIAL__decidir-nome-canonico-e-politica-alias-mais-humana"].status,
GateStatus.BLOCKED, GateStatus.PASSED,
) )
def test_publication_gate_report_serializes_markdown_and_csv(self) -> None: def test_publication_gate_report_serializes_markdown_and_csv(self) -> None:

View File

@@ -111,7 +111,8 @@ class RepositoryMeshTests(unittest.TestCase):
targets = default_repository_targets() targets = default_repository_targets()
names = {item.declared_name: item for item in targets} names = {item.declared_name: item for item in targets}
self.assertIn("tudo-para-ia-mais-humana-platform", names) self.assertIn("tudo-para-ia-mais-humana-platform", names)
self.assertEqual(names["tudo-para-ia-mais-humana-platform"].expected_local_name, "tudo-para-ia-mais-humana") self.assertEqual(names["tudo-para-ia-mais-humana-platform"].expected_local_name, "tudo-para-ia-mais-humana-platform")
self.assertIn("tudo-para-ia-mais-humana", names["tudo-para-ia-mais-humana-platform"].aliases)
self.assertIn("tudo-para-ia-mais-humana-plataform", names["tudo-para-ia-mais-humana-platform"].aliases) self.assertIn("tudo-para-ia-mais-humana-plataform", names["tudo-para-ia-mais-humana-platform"].aliases)
self.assertTrue(names["tudo-para-ia-mais-humana-platform"].requires_nominal_reconciliation) self.assertTrue(names["tudo-para-ia-mais-humana-platform"].requires_nominal_reconciliation)
self.assertIn("tudo-para-ia-integracoes-platform", names) self.assertIn("tudo-para-ia-integracoes-platform", names)