gatewaysdk 0.3.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- gatewaysdk/__init__.py +540 -0
- gatewaysdk/adapter/__init__.py +15 -0
- gatewaysdk/adapter/base.py +94 -0
- gatewaysdk/adapter/messages.py +270 -0
- gatewaysdk/adapter/triplet.py +1026 -0
- gatewaysdk/algorithm/__init__.py +39 -0
- gatewaysdk/algorithm/apo/__init__.py +5 -0
- gatewaysdk/algorithm/apo/apo.py +898 -0
- gatewaysdk/algorithm/apo/prompts/apply_edit_variant01.poml +22 -0
- gatewaysdk/algorithm/apo/prompts/apply_edit_variant02.poml +18 -0
- gatewaysdk/algorithm/apo/prompts/text_gradient_variant01.poml +18 -0
- gatewaysdk/algorithm/apo/prompts/text_gradient_variant02.poml +16 -0
- gatewaysdk/algorithm/apo/prompts/text_gradient_variant03.poml +107 -0
- gatewaysdk/algorithm/base.py +262 -0
- gatewaysdk/algorithm/decorator.py +264 -0
- gatewaysdk/algorithm/evals/__init__.py +7 -0
- gatewaysdk/algorithm/evals/evals.py +217 -0
- gatewaysdk/algorithm/fast.py +250 -0
- gatewaysdk/algorithm/gepa/__init__.py +61 -0
- gatewaysdk/algorithm/gepa/adapter.py +495 -0
- gatewaysdk/algorithm/gepa/gepa.py +570 -0
- gatewaysdk/algorithm/gepa/lib/__init__.py +18 -0
- gatewaysdk/algorithm/gepa/lib/adapters/README.md +12 -0
- gatewaysdk/algorithm/gepa/lib/adapters/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/adapters/anymaths_adapter/README.md +341 -0
- gatewaysdk/algorithm/gepa/lib/adapters/anymaths_adapter/__init__.py +1 -0
- gatewaysdk/algorithm/gepa/lib/adapters/anymaths_adapter/anymaths_adapter.py +174 -0
- gatewaysdk/algorithm/gepa/lib/adapters/anymaths_adapter/requirements.txt +1 -0
- gatewaysdk/algorithm/gepa/lib/adapters/default_adapter/README.md +0 -0
- gatewaysdk/algorithm/gepa/lib/adapters/default_adapter/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/adapters/default_adapter/default_adapter.py +209 -0
- gatewaysdk/algorithm/gepa/lib/adapters/dspy_adapter/README.md +7 -0
- gatewaysdk/algorithm/gepa/lib/adapters/dspy_adapter/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/adapters/dspy_adapter/dspy_adapter.py +307 -0
- gatewaysdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/README.md +99 -0
- gatewaysdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/dspy_program_proposal_signature.py +137 -0
- gatewaysdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/full_program_adapter.py +268 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/GEPA_RAG.md +621 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/__init__.py +56 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/evaluation_metrics.py +226 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/generic_rag_adapter.py +496 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/rag_pipeline.py +238 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_store_interface.py +212 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/__init__.py +2 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/chroma_store.py +196 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/lancedb_store.py +422 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/milvus_store.py +409 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/qdrant_store.py +368 -0
- gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/weaviate_store.py +418 -0
- gatewaysdk/algorithm/gepa/lib/adapters/mcp_adapter/README.md +552 -0
- gatewaysdk/algorithm/gepa/lib/adapters/mcp_adapter/__init__.py +37 -0
- gatewaysdk/algorithm/gepa/lib/adapters/mcp_adapter/mcp_adapter.py +699 -0
- gatewaysdk/algorithm/gepa/lib/adapters/mcp_adapter/mcp_client.py +364 -0
- gatewaysdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/README.md +9 -0
- gatewaysdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/terminal_bench_adapter.py +217 -0
- gatewaysdk/algorithm/gepa/lib/api.py +382 -0
- gatewaysdk/algorithm/gepa/lib/core/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/core/adapter.py +180 -0
- gatewaysdk/algorithm/gepa/lib/core/data_loader.py +74 -0
- gatewaysdk/algorithm/gepa/lib/core/engine.py +379 -0
- gatewaysdk/algorithm/gepa/lib/core/result.py +233 -0
- gatewaysdk/algorithm/gepa/lib/core/state.py +636 -0
- gatewaysdk/algorithm/gepa/lib/examples/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/examples/aime.py +24 -0
- gatewaysdk/algorithm/gepa/lib/examples/anymaths-bench/eval_default.py +111 -0
- gatewaysdk/algorithm/gepa/lib/examples/anymaths-bench/prompt-templates/instruction_prompt.txt +9 -0
- gatewaysdk/algorithm/gepa/lib/examples/anymaths-bench/prompt-templates/optimal_prompt.txt +24 -0
- gatewaysdk/algorithm/gepa/lib/examples/anymaths-bench/train_anymaths.py +177 -0
- gatewaysdk/algorithm/gepa/lib/examples/dspy_full_program_evolution/arc_agi.ipynb +25705 -0
- gatewaysdk/algorithm/gepa/lib/examples/dspy_full_program_evolution/example.ipynb +348 -0
- gatewaysdk/algorithm/gepa/lib/examples/mcp_adapter/__init__.py +4 -0
- gatewaysdk/algorithm/gepa/lib/examples/mcp_adapter/mcp_optimization_example.py +456 -0
- gatewaysdk/algorithm/gepa/lib/examples/rag_adapter/RAG_GUIDE.md +613 -0
- gatewaysdk/algorithm/gepa/lib/examples/rag_adapter/__init__.py +9 -0
- gatewaysdk/algorithm/gepa/lib/examples/rag_adapter/rag_optimization.py +820 -0
- gatewaysdk/algorithm/gepa/lib/examples/rag_adapter/requirements-rag.txt +29 -0
- gatewaysdk/algorithm/gepa/lib/examples/terminal-bench/prompt-templates/instruction_prompt.txt +16 -0
- gatewaysdk/algorithm/gepa/lib/examples/terminal-bench/prompt-templates/terminus.txt +9 -0
- gatewaysdk/algorithm/gepa/lib/examples/terminal-bench/train_terminus.py +161 -0
- gatewaysdk/algorithm/gepa/lib/gepa_utils.py +117 -0
- gatewaysdk/algorithm/gepa/lib/logging/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/logging/experiment_tracker.py +187 -0
- gatewaysdk/algorithm/gepa/lib/logging/logger.py +75 -0
- gatewaysdk/algorithm/gepa/lib/logging/utils.py +103 -0
- gatewaysdk/algorithm/gepa/lib/proposer/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/proposer/base.py +31 -0
- gatewaysdk/algorithm/gepa/lib/proposer/merge.py +357 -0
- gatewaysdk/algorithm/gepa/lib/proposer/reflective_mutation/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/proposer/reflective_mutation/base.py +49 -0
- gatewaysdk/algorithm/gepa/lib/proposer/reflective_mutation/reflective_mutation.py +176 -0
- gatewaysdk/algorithm/gepa/lib/py.typed +0 -0
- gatewaysdk/algorithm/gepa/lib/strategies/__init__.py +0 -0
- gatewaysdk/algorithm/gepa/lib/strategies/batch_sampler.py +77 -0
- gatewaysdk/algorithm/gepa/lib/strategies/candidate_selector.py +50 -0
- gatewaysdk/algorithm/gepa/lib/strategies/component_selector.py +36 -0
- gatewaysdk/algorithm/gepa/lib/strategies/eval_policy.py +64 -0
- gatewaysdk/algorithm/gepa/lib/strategies/instruction_proposal.py +126 -0
- gatewaysdk/algorithm/gepa/lib/utils/__init__.py +10 -0
- gatewaysdk/algorithm/gepa/lib/utils/stop_condition.py +196 -0
- gatewaysdk/algorithm/gepa/tracing.py +105 -0
- gatewaysdk/algorithm/utils.py +177 -0
- gatewaysdk/algorithm/verl/__init__.py +5 -0
- gatewaysdk/algorithm/verl/interface.py +202 -0
- gatewaysdk/automations.py +111 -0
- gatewaysdk/benchmark_hub/README.md +88 -0
- gatewaysdk/benchmark_hub/__init__.py +119 -0
- gatewaysdk/benchmark_hub/_archive.py +189 -0
- gatewaysdk/benchmark_hub/_tar.py +6 -0
- gatewaysdk/benchmark_hub/client.py +992 -0
- gatewaysdk/benchmark_hub/dispatch_shard.py +34 -0
- gatewaysdk/benchmark_hub/eval_config.py +20 -0
- gatewaysdk/benchmark_hub/evals.py +351 -0
- gatewaysdk/benchmark_hub/harbor_adapter.py +673 -0
- gatewaysdk/benchmark_hub/path_utils.py +81 -0
- gatewaysdk/benchmark_hub/save_utils.py +101 -0
- gatewaysdk/benchmark_hub/verifiers_adapter.py +327 -0
- gatewaysdk/benchmark_hub/versioning.py +72 -0
- gatewaysdk/build.py +515 -0
- gatewaysdk/cli/__init__.py +58 -0
- gatewaysdk/cli/agent_runner.py +132 -0
- gatewaysdk/cli/http_client.py +115 -0
- gatewaysdk/cli/platform.py +4086 -0
- gatewaysdk/cli/prometheus.py +115 -0
- gatewaysdk/cli/release_gate.py +215 -0
- gatewaysdk/cli/store.py +131 -0
- gatewaysdk/cli/vllm.py +29 -0
- gatewaysdk/client.py +406 -0
- gatewaysdk/config.py +348 -0
- gatewaysdk/connectors/__init__.py +25 -0
- gatewaysdk/connectors/client.py +203 -0
- gatewaysdk/connectors/skill.py +25 -0
- gatewaysdk/connectors/template.py +106 -0
- gatewaysdk/context.py +606 -0
- gatewaysdk/emitter/__init__.py +43 -0
- gatewaysdk/emitter/annotation.py +370 -0
- gatewaysdk/emitter/exception.py +54 -0
- gatewaysdk/emitter/message.py +61 -0
- gatewaysdk/emitter/object.py +117 -0
- gatewaysdk/emitter/reward.py +320 -0
- gatewaysdk/env_var.py +156 -0
- gatewaysdk/environment/__init__.py +108 -0
- gatewaysdk/environment/_bundle.py +281 -0
- gatewaysdk/environment/_harbor.py +276 -0
- gatewaysdk/environment/_materialize.py +97 -0
- gatewaysdk/environment/_tar.py +33 -0
- gatewaysdk/environment/_world.py +346 -0
- gatewaysdk/environment/core.py +527 -0
- gatewaysdk/environment/errors.py +58 -0
- gatewaysdk/environment/runtime.py +150 -0
- gatewaysdk/environment/schema/__init__.py +35 -0
- gatewaysdk/environment/schema/__main__.py +225 -0
- gatewaysdk/environment/schema/_slack_fidelity.py +116 -0
- gatewaysdk/environment/schema/_slack_scenario.py +183 -0
- gatewaysdk/environment/schema/api.py +1628 -0
- gatewaysdk/environment/schema/batch.py +755 -0
- gatewaysdk/environment/schema/compiler.py +615 -0
- gatewaysdk/environment/schema/conform.py +428 -0
- gatewaysdk/environment/schema/connector.py +777 -0
- gatewaysdk/environment/schema/connectors/apple-business-manager/handlers.py +17 -0
- gatewaysdk/environment/schema/connectors/apple-business-manager/parity.json +28 -0
- gatewaysdk/environment/schema/connectors/apple-business-manager/provenance.json +233 -0
- gatewaysdk/environment/schema/connectors/apple-business-manager/scope.toml +112 -0
- gatewaysdk/environment/schema/connectors/apple-business-manager/world.json +1380 -0
- gatewaysdk/environment/schema/connectors/base.json +28 -0
- gatewaysdk/environment/schema/connectors/custom/handlers.py +18 -0
- gatewaysdk/environment/schema/connectors/custom/world.json +123 -0
- gatewaysdk/environment/schema/connectors/github/handlers.py +81 -0
- gatewaysdk/environment/schema/connectors/github/parity.json +37 -0
- gatewaysdk/environment/schema/connectors/github/provenance.json +134 -0
- gatewaysdk/environment/schema/connectors/github/scope.toml +158 -0
- gatewaysdk/environment/schema/connectors/github/world.json +5869 -0
- gatewaysdk/environment/schema/connectors/google-calendar/handlers.py +23 -0
- gatewaysdk/environment/schema/connectors/google-calendar/world.json +209 -0
- gatewaysdk/environment/schema/connectors/google-drive/handlers.py +18 -0
- gatewaysdk/environment/schema/connectors/google-drive/world.json +286 -0
- gatewaysdk/environment/schema/connectors/jamf/handlers.py +34 -0
- gatewaysdk/environment/schema/connectors/jamf/parity.json +49 -0
- gatewaysdk/environment/schema/connectors/jamf/provenance.json +181 -0
- gatewaysdk/environment/schema/connectors/jamf/scope.toml +128 -0
- gatewaysdk/environment/schema/connectors/jamf/world.json +2218 -0
- gatewaysdk/environment/schema/connectors/jira/handlers.py +28 -0
- gatewaysdk/environment/schema/connectors/jira/world.json +389 -0
- gatewaysdk/environment/schema/connectors/kandji/handlers.py +38 -0
- gatewaysdk/environment/schema/connectors/kandji/parity.json +29 -0
- gatewaysdk/environment/schema/connectors/kandji/provenance.json +152 -0
- gatewaysdk/environment/schema/connectors/kandji/scope.toml +120 -0
- gatewaysdk/environment/schema/connectors/kandji/world.json +765 -0
- gatewaysdk/environment/schema/connectors/linear/handlers.py +20 -0
- gatewaysdk/environment/schema/connectors/linear/world.json +363 -0
- gatewaysdk/environment/schema/connectors/microsoft-teams/fidelity.json +45 -0
- gatewaysdk/environment/schema/connectors/microsoft-teams/handlers.py +1 -0
- gatewaysdk/environment/schema/connectors/microsoft-teams/provenance.json +851 -0
- gatewaysdk/environment/schema/connectors/microsoft-teams/scope.md +231 -0
- gatewaysdk/environment/schema/connectors/microsoft-teams/teams-types.json +1710 -0
- gatewaysdk/environment/schema/connectors/microsoft-teams/world.json +858 -0
- gatewaysdk/environment/schema/connectors/netsuite/handlers.py +32 -0
- gatewaysdk/environment/schema/connectors/netsuite/parity.json +50 -0
- gatewaysdk/environment/schema/connectors/netsuite/provenance.json +137 -0
- gatewaysdk/environment/schema/connectors/netsuite/scope.toml +78 -0
- gatewaysdk/environment/schema/connectors/netsuite/world.json +16243 -0
- gatewaysdk/environment/schema/connectors/salesforce/handlers.py +806 -0
- gatewaysdk/environment/schema/connectors/salesforce/parity.json +46 -0
- gatewaysdk/environment/schema/connectors/salesforce/provenance.json +143 -0
- gatewaysdk/environment/schema/connectors/salesforce/scope.toml +174 -0
- gatewaysdk/environment/schema/connectors/salesforce/world.json +4695 -0
- gatewaysdk/environment/schema/connectors/slack/MODEL.md +236 -0
- gatewaysdk/environment/schema/connectors/slack/capabilities.json +1039 -0
- gatewaysdk/environment/schema/connectors/slack/handlers.py +762 -0
- gatewaysdk/environment/schema/connectors/slack/parity.json +65 -0
- gatewaysdk/environment/schema/connectors/slack/provenance.json +294 -0
- gatewaysdk/environment/schema/connectors/slack/scope.toml +44 -0
- gatewaysdk/environment/schema/connectors/slack/world.json +4993 -0
- gatewaysdk/environment/schema/connectors/workday/handlers.py +75 -0
- gatewaysdk/environment/schema/connectors/workday/parity.json +36 -0
- gatewaysdk/environment/schema/connectors/workday/provenance.json +179 -0
- gatewaysdk/environment/schema/connectors/workday/scope.toml +180 -0
- gatewaysdk/environment/schema/connectors/workday/world.json +806 -0
- gatewaysdk/environment/schema/data.py +593 -0
- gatewaysdk/environment/schema/extract.py +263 -0
- gatewaysdk/environment/schema/host.py +2437 -0
- gatewaysdk/environment/schema/host_surfaces.py +275 -0
- gatewaysdk/environment/schema/platform.py +1272 -0
- gatewaysdk/environment/schema/scaffold.py +250 -0
- gatewaysdk/environment/schema/skill.py +118 -0
- gatewaysdk/environment/schema/skills/agents/connector-template-author.md +202 -0
- gatewaysdk/environment/schema/skills/connector-schema-authoring/CONNECTORS.md +331 -0
- gatewaysdk/environment/schema/skills/connector-schema-authoring/CONVENTIONS.md +100 -0
- gatewaysdk/environment/schema/skills/connector-schema-authoring/SKILL.md +313 -0
- gatewaysdk/environment/schema/skills/world-data-ingestion/ROWS.md +223 -0
- gatewaysdk/environment/schema/skills/world-data-ingestion/SKILL.md +293 -0
- gatewaysdk/environment/schema/skills/worlds-getting-started/SKILL.md +390 -0
- gatewaysdk/environment/schema/slack.py +757 -0
- gatewaysdk/environment/schema/snapshot.py +479 -0
- gatewaysdk/environment/schema/store.py +904 -0
- gatewaysdk/environment/schema/tasks.py +525 -0
- gatewaysdk/environment/schema/tools_world.py +322 -0
- gatewaysdk/environment/schema/validation.py +577 -0
- gatewaysdk/environment/schema/worker.py +78 -0
- gatewaysdk/environment/schema/workers.py +500 -0
- gatewaysdk/environment/schema/world_tests.py +336 -0
- gatewaysdk/environments/__init__.py +24 -0
- gatewaysdk/environments/client.py +486 -0
- gatewaysdk/environments/types.py +318 -0
- gatewaysdk/execution/__init__.py +15 -0
- gatewaysdk/execution/base.py +64 -0
- gatewaysdk/execution/client_server.py +443 -0
- gatewaysdk/execution/events.py +69 -0
- gatewaysdk/execution/inter_process.py +16 -0
- gatewaysdk/execution/shared_memory.py +282 -0
- gatewaysdk/experiments/__init__.py +90 -0
- gatewaysdk/experiments/assignment.py +177 -0
- gatewaysdk/experiments/client.py +877 -0
- gatewaysdk/experiments/exposure.py +222 -0
- gatewaysdk/experiments/types.py +81 -0
- gatewaysdk/importers/__init__.py +49 -0
- gatewaysdk/importers/_normalize.py +91 -0
- gatewaysdk/importers/builder.py +173 -0
- gatewaysdk/importers/client.py +95 -0
- gatewaysdk/importers/langsmith.py +196 -0
- gatewaysdk/importers/recipes.py +249 -0
- gatewaysdk/instrumentation/__init__.py +300 -0
- gatewaysdk/instrumentation/agentops.py +314 -0
- gatewaysdk/instrumentation/agentops_langchain.py +45 -0
- gatewaysdk/instrumentation/base.py +119 -0
- gatewaysdk/instrumentation/litellm.py +83 -0
- gatewaysdk/instrumentation/registry.py +273 -0
- gatewaysdk/instrumentation/vllm.py +81 -0
- gatewaysdk/instrumentation/weave.py +500 -0
- gatewaysdk/integrations/__init__.py +15 -0
- gatewaysdk/integrations/gateway/__init__.py +11 -0
- gatewaysdk/integrations/gateway/client.py +171 -0
- gatewaysdk/integrations/tool_access.py +549 -0
- gatewaysdk/litagent/__init__.py +11 -0
- gatewaysdk/litagent/decorator.py +536 -0
- gatewaysdk/litagent/litagent.py +252 -0
- gatewaysdk/llm_proxy.py +1742 -0
- gatewaysdk/logging.py +370 -0
- gatewaysdk/memory.py +278 -0
- gatewaysdk/personas.py +186 -0
- gatewaysdk/platform/__init__.py +17 -0
- gatewaysdk/platform/builder.py +221 -0
- gatewaysdk/platform/compatibility.py +67 -0
- gatewaysdk/platform/manifest.py +185 -0
- gatewaysdk/platform/orchestrator.py +901 -0
- gatewaysdk/platform/registry.py +122 -0
- gatewaysdk/platform/worker.py +864 -0
- gatewaysdk/replay/__init__.py +1032 -0
- gatewaysdk/replay/pytest.py +56 -0
- gatewaysdk/reward.py +7 -0
- gatewaysdk/run.py +1781 -0
- gatewaysdk/runner/__init__.py +11 -0
- gatewaysdk/runner/agent.py +878 -0
- gatewaysdk/runner/base.py +182 -0
- gatewaysdk/runner/legacy.py +309 -0
- gatewaysdk/security.py +700 -0
- gatewaysdk/semconv.py +170 -0
- gatewaysdk/server.py +399 -0
- gatewaysdk/sessions.py +282 -0
- gatewaysdk/store/__init__.py +45 -0
- gatewaysdk/store/base.py +908 -0
- gatewaysdk/store/client_server.py +2093 -0
- gatewaysdk/store/collection/__init__.py +30 -0
- gatewaysdk/store/collection/base.py +587 -0
- gatewaysdk/store/collection/memory.py +970 -0
- gatewaysdk/store/collection/mongo.py +1412 -0
- gatewaysdk/store/collection_based.py +1823 -0
- gatewaysdk/store/gateway.py +983 -0
- gatewaysdk/store/gateway_listener.py +465 -0
- gatewaysdk/store/listener.py +58 -0
- gatewaysdk/store/memory.py +396 -0
- gatewaysdk/store/mongo.py +165 -0
- gatewaysdk/store/redis_stream.py +517 -0
- gatewaysdk/store/sqlite.py +3 -0
- gatewaysdk/store/threading.py +370 -0
- gatewaysdk/store/utils.py +142 -0
- gatewaysdk/tracer/__init__.py +14 -0
- gatewaysdk/tracer/base.py +286 -0
- gatewaysdk/tracer/dummy.py +106 -0
- gatewaysdk/tracer/otel.py +559 -0
- gatewaysdk/tracing/__init__.py +110 -0
- gatewaysdk/tracing/api.py +808 -0
- gatewaysdk/tracing/attributes.py +9 -0
- gatewaysdk/tracing/context.py +272 -0
- gatewaysdk/tracing/exporters/__init__.py +10 -0
- gatewaysdk/tracing/exporters/gateway.py +228 -0
- gatewaysdk/tracing/identity.py +288 -0
- gatewaysdk/tracing/init.py +620 -0
- gatewaysdk/tracing/instrumentors/__init__.py +15 -0
- gatewaysdk/tracing/instrumentors/claude_agent_sdk.py +766 -0
- gatewaysdk/tracing/instrumentors/instrumentation_principles.md +294 -0
- gatewaysdk/tracing/instrumentors/registry.py +352 -0
- gatewaysdk/tracing/mapping.py +729 -0
- gatewaysdk/tracing/processors.py +393 -0
- gatewaysdk/tracing/push.py +617 -0
- gatewaysdk/tracing/push_models.py +247 -0
- gatewaysdk/tracing/semconv.py +294 -0
- gatewaysdk/tracing/span_builder.py +356 -0
- gatewaysdk/trainer/__init__.py +6 -0
- gatewaysdk/trainer/init_utils.py +263 -0
- gatewaysdk/trainer/legacy.py +359 -0
- gatewaysdk/trainer/registry.py +12 -0
- gatewaysdk/trainer/trainer.py +638 -0
- gatewaysdk/types/__init__.py +63 -0
- gatewaysdk/types/core.py +556 -0
- gatewaysdk/types/resources.py +204 -0
- gatewaysdk/types/tracer.py +515 -0
- gatewaysdk/types/tracing.py +162 -0
- gatewaysdk/users.py +251 -0
- gatewaysdk/utils/__init__.py +1 -0
- gatewaysdk/utils/id.py +18 -0
- gatewaysdk/utils/metrics.py +1025 -0
- gatewaysdk/utils/otel.py +550 -0
- gatewaysdk/utils/otlp.py +556 -0
- gatewaysdk/utils/redact.py +22 -0
- gatewaysdk/utils/server_launcher.py +1045 -0
- gatewaysdk/utils/system_snapshot.py +90 -0
- gatewaysdk/verl/__init__.py +8 -0
- gatewaysdk/verl/__main__.py +6 -0
- gatewaysdk/verl/async_server.py +46 -0
- gatewaysdk/verl/config.yaml +27 -0
- gatewaysdk/verl/daemon.py +1154 -0
- gatewaysdk/verl/dataset.py +44 -0
- gatewaysdk/verl/entrypoint.py +248 -0
- gatewaysdk/verl/trainer.py +549 -0
- gatewaysdk/world_browser.py +748 -0
- gatewaysdk/world_data.py +453 -0
- gatewaysdk/world_sessions.py +978 -0
- gatewaysdk/world_tasks.py +285 -0
- gatewaysdk/world_tools.py +115 -0
- gatewaysdk/worlds.py +639 -0
- gatewaysdk-0.3.2.dist-info/METADATA +236 -0
- gatewaysdk-0.3.2.dist-info/RECORD +376 -0
- gatewaysdk-0.3.2.dist-info/WHEEL +4 -0
- gatewaysdk-0.3.2.dist-info/entry_points.txt +5 -0
- gatewaysdk-0.3.2.dist-info/licenses/LICENSE +19 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# Microsoft Teams collaboration contract — scope and mapping
|
|
2
|
+
|
|
3
|
+
Decision recorded **2026-09-07, before authoring the final model**. Domain
|
|
4
|
+
`urn:gateway:connector:microsoft-teams`, version `1.0.0`; `gateway-world/1`.
|
|
5
|
+
Shape: **base**. Assessment: **provisional subset**, researched against Microsoft
|
|
6
|
+
Graph v1.0, tested with synthetic data. No tenant overlay is necessary for this
|
|
7
|
+
bounded collaboration model. No live-response validation or tool behavior is claimed.
|
|
8
|
+
|
|
9
|
+
This file owns the coverage and mapper policies. Source identities and hashes
|
|
10
|
+
live in `provenance.json`; actual structural/synthetic checks and skipped live
|
|
11
|
+
validation live in `fidelity.json`. No captured vendor goldens, replay score, or
|
|
12
|
+
`mimic` claim is supplied. `world.json` and `teams-types.json` enforce the model;
|
|
13
|
+
the scope, provenance, and fidelity files add no executable assertions.
|
|
14
|
+
|
|
15
|
+
## Identity and scope matrix
|
|
16
|
+
|
|
17
|
+
`C` below is `contextTenantId`, a required ingestion partition from the authorized
|
|
18
|
+
capture tenant. It is **not resource ownership**. Vendor `tenantId` remains separate
|
|
19
|
+
and can identify a host/creator/user/remote tenant. Every key component is a
|
|
20
|
+
nonempty opaque string. No names, emails, labels, user IDs, or resource IDs have
|
|
21
|
+
additional global uniqueness constraints.
|
|
22
|
+
|
|
23
|
+
| Entity (`teams_` prefix) | Primary key after C | Graph v1.0 authority | Included state and nested types | Relationships / cardinality |
|
|
24
|
+
| --- | --- | --- | --- | --- |
|
|
25
|
+
| teams | id | team | id, classification, classSettings, createdDateTime, description, displayName, funSettings, guestSettings, internalId, isArchived, memberSettings, messagingSettings, specialization, summary, tenantId, visibility, webUrl | 1:N channels, team members, tags; primaryChannel retained as external contextual reference |
|
|
26
|
+
| channels | teamId, id | channel | All documented stored structural fields: createdDateTime, description, displayName, email, isArchived, isFavoriteByDefault, layoutType, membershipType, migrationMode, originalCreatedDateTime, summary, tenantId, webUrl | Exactly one captured **host** team; 1:N members, root messages, sharing records |
|
|
27
|
+
| incoming_channels | teamId, channelUrl | team-list-incomingchannels | Exact returned @odata.id as channelUrl; structured channel projection | Exactly one captured **receiving** team. Referenced host/channel can be outside capture; no fabricated host team |
|
|
28
|
+
| shared_channel_teams | teamId, channelId, tenantId, id | sharedWithChannelTeamInfo | Remote team id, tenantId, displayName, isHostTeam; allowedMembers visibility | Exactly one captured channel; referenced remote team external. Remote tenantId required here to scope overlapping team IDs |
|
|
29
|
+
| chats | id | chat | chatType, createdDateTime, isHiddenForAllMembers, lastUpdatedDateTime, migrationMode, onlineMeetingInfo, originalCreatedDateTime, tenantId, topic, webUrl; structured lastMessagePreview | 1:N members/messages/views. Meeting/calendar links external |
|
|
30
|
+
| chat_views | chatId, viewerTenantId, viewerId | chat.viewpoint, chatViewpoint | viewpoint (isHidden, lastMessageReadDateTime), including explicit null | Exactly one captured chat; viewer is an external identity supplied by delegated request context |
|
|
31
|
+
| team_members | teamId, id | conversationMember + concrete subtypes | displayName, roles, visibleHistoryStartDateTime; typed memberIdentity; originalSourceMembershipUrl annotation | Exactly one team; membership id is **not userId**; external user identity |
|
|
32
|
+
| channel_members | teamId, channelId, id | channel members/allMembers | Same membership representation; originalSourceMembershipUrl preserves indirect-source attribution | Exactly one channel; never infer membership in host team, especially for shared channels |
|
|
33
|
+
| chat_members | chatId, id | chat members | Same membership representation, including history visibility | Exactly one chat; roster-size and access rules deferred |
|
|
34
|
+
| channel_messages | teamId, channelId, id | chatMessage, channel-list-messages | body, sender, mentions, reactions, attachments, eventDetail, history, policyViolation, timestamps, etag, importance, locale, messageType, subject, summary, webUrl, channelIdentity; replyToId/chatId absent or null | Exactly one channel; 1:N replies and hosted references |
|
|
35
|
+
| channel_replies | teamId, channelId, replyToId, id | chatMessage-list-replies | Same message payload; required replyToId from enclosing root context | Exactly one root message in the **same** channel/team/C; no reply-to-reply chain |
|
|
36
|
+
| chat_messages | chatId, id | chatMessage, chat-list-messages | Same message payload; replyToId/channelIdentity absent or null; summary absent or null | Exactly one chat. No invented chat threading semantics |
|
|
37
|
+
| channel_hosted_contents | teamId, channelId, messageId, id | chatMessageHostedContent | Persisted hosted-content id; contentType when known | Exactly one root message; no file object or binary payload |
|
|
38
|
+
| reply_hosted_contents | teamId, channelId, replyToId, messageId, id | chatMessageHostedContent | Same | Exactly one scoped reply |
|
|
39
|
+
| chat_hosted_contents | chatId, messageId, id | chatMessageHostedContent | Same | Exactly one chat message |
|
|
40
|
+
| tags | teamId, id | teamworkTag | description, displayName, memberCount, tagType | Exactly one team; 1:N tag members |
|
|
41
|
+
| tag_members | teamId, tagId, id | teamworkTagMember | displayName, tenantId, userId | Exactly one tag; user is external, no local directory prerequisite |
|
|
42
|
+
|
|
43
|
+
All actual foreign keys target the complete parent primary key with restrictive
|
|
44
|
+
deletion. A coherent batch may insert children before parents. Deleting a parent
|
|
45
|
+
requires explicit deletion of every dependent in the same transaction. The model
|
|
46
|
+
has no cascading deletes, upserts, placeholder parents, or placeholder users.
|
|
47
|
+
|
|
48
|
+
Separate message tables avoid nullable/discriminator key components and retain
|
|
49
|
+
Graph's documented chat/channel/**reply-to-message** identity scopes. Even a root
|
|
50
|
+
and its reply may share a vendor id. A shared table with a bare id or nullable
|
|
51
|
+
parent would erase those distinctions. Hosted-content IDs inherit every parent
|
|
52
|
+
component; evidence identity never replaces these keys.
|
|
53
|
+
|
|
54
|
+
Incoming channels are observations of an external reference, keyed by the exact
|
|
55
|
+
Graph @odata.id URL within the receiving team, not a second authoritative hosted
|
|
56
|
+
channel. Do not parse opaque Teams webUrl values or make their display URLs into
|
|
57
|
+
keys. Resolving an incoming reference into captured hosted channel state requires
|
|
58
|
+
verified host context and its real parent record. Cross-tenant @odata.id transport
|
|
59
|
+
quirks described by Microsoft remain future connector work.
|
|
60
|
+
|
|
61
|
+
## Projection, requiredness, nullability, and visibility
|
|
62
|
+
|
|
63
|
+
This is a **keyed projection contract**, not a Graph create-request contract.
|
|
64
|
+
Only primary/foreign-key context and nested variant discriminators are required.
|
|
65
|
+
All other supported properties may be absent (`$select`, permission differences,
|
|
66
|
+
resource shape, or missing expansion). A Graph non-nullable property rejects null
|
|
67
|
+
**when present**; nullable fields retain null. This allows id-only projections,
|
|
68
|
+
not id-less records, and never invents values from Graph create defaults.
|
|
69
|
+
|
|
70
|
+
Scalar nullability follows pinned production CSDL unless a documented discrepancy
|
|
71
|
+
is recorded below. Collection properties are arrays, with item nullability from
|
|
72
|
+
CSDL; they are not nullable collections. Missing, [], null items, empty strings,
|
|
73
|
+
false, zero and explicit scalar null survive without coercion. Navigation
|
|
74
|
+
collections are separated into entities and observation metadata; a Graph null
|
|
75
|
+
navigation representation is recorded as such, never converted to [].
|
|
76
|
+
|
|
77
|
+
Optional `relationshipCoverage` is a closed map of declared navigation names to
|
|
78
|
+
`{status, nextLink?, count?}`. Status is `notRequested`, `partial`, `complete`, or
|
|
79
|
+
`null`. Missing metadata means unknown. `complete` describes the requested view
|
|
80
|
+
under its filter and authorization, never omniscient state. Retain next links;
|
|
81
|
+
expanded replies can be independently paged. A complete *batch* does not prune.
|
|
82
|
+
The contract checks metadata shape, **not its truth or agreement with row counts**.
|
|
83
|
+
Absent collections must never become an implicit complete/empty assertion.
|
|
84
|
+
|
|
85
|
+
`apply_batch.update` shallow-merges fields; nested properties replace whole nested
|
|
86
|
+
values. A partial later capture must not erase uncaptured state. A future mapper
|
|
87
|
+
must explicitly merge nested projections or supply a verified replacement, retain
|
|
88
|
+
field/evidence lineage, and refrain from interpreting missing fields as deletion.
|
|
89
|
+
|
|
90
|
+
## Nested payloads and normalization
|
|
91
|
+
|
|
92
|
+
- Graph camelCase names and string IDs are retained. Entity-root `@odata.type`,
|
|
93
|
+
`@odata.id`, and `@odata.etag` become `odataType`, `odataId`, and `odataEtag`.
|
|
94
|
+
Nested payloads keep literal annotations where declared. Collection envelope
|
|
95
|
+
@odata.context and continuations remain capture evidence/coverage metadata.
|
|
96
|
+
- Graph inheritance is flattened into direct closed entity objects. Membership
|
|
97
|
+
subtype-specific fields move into `memberIdentity`, a closed discriminated union
|
|
98
|
+
with `type` equal to the Graph short type name. Strip only the optional leading
|
|
99
|
+
`#microsoft.graph.` / `microsoft.graph.` from an observed membership @odata.type.
|
|
100
|
+
Do not infer subtype from email, userId, or displayName. If not observed, retain
|
|
101
|
+
the keyed common projection and defer subtype fields until verified.
|
|
102
|
+
- Supported member variants: aadUserConversationMember (email, tenantId, userId),
|
|
103
|
+
anonymousGuestConversationMember (anonymousGuestId),
|
|
104
|
+
azureCommunicationServicesUserConversationMember (azureCommunicationServicesId),
|
|
105
|
+
microsoftAccountUserConversationMember (userId), phoneUserConversationMember
|
|
106
|
+
(phoneNumber), skypeForBusinessUserConversationMember (tenantId, userId), and
|
|
107
|
+
skypeUserConversationMember (skypeId). No identities are fabricated for guests,
|
|
108
|
+
external users, anonymous users, applications, or departed members.
|
|
109
|
+
- `roles` is a string collection, not a closed enum. [] is an ordinary member;
|
|
110
|
+
owner/guest are qualifiers. Preserve combinations and future qualifiers.
|
|
111
|
+
Do not derive authorization or infer that every external owner administers the
|
|
112
|
+
resource. The common resource page's misleading id description does not justify
|
|
113
|
+
replacing the opaque membership id with userId.
|
|
114
|
+
- Identity sets preserve user, application, device, and documented supporting
|
|
115
|
+
identity variants. Identity details, tenantId, userIdentityType,
|
|
116
|
+
applicationIdentityType, conversationIdentityType, and tag targets are structured.
|
|
117
|
+
External identity IDs are not foreign keys to an invented Entra directory.
|
|
118
|
+
- Bodies retain `{contentType, content}` (HTML/text), not Slack-like text.
|
|
119
|
+
Mentions retain numeric id, mentionText and structured target. Reactions retain
|
|
120
|
+
user, timestamp, type, displayName and custom-content URL. Reaction type is an
|
|
121
|
+
open string (including emoji and custom), **not** a six-value closed enum.
|
|
122
|
+
- Attachments retain all seven documented properties. `content` remains the
|
|
123
|
+
Graph **string**, including serialized card/forwarded-message JSON, rather than
|
|
124
|
+
reparsing it into an arbitrary object. contentType remains open to Bot Framework
|
|
125
|
+
media types. Attachments are not driveItem/file records. content/contentUrl
|
|
126
|
+
exclusivity is enforced by a nested union allowing either or neither non-null.
|
|
127
|
+
- Known eventMessageDetail subtypes retain structured event payloads and identity
|
|
128
|
+
sets. Call/recording/transcript fields are references/metadata only, not meeting
|
|
129
|
+
infrastructure. Edm.Duration stays a string; Gateway cannot validate duration
|
|
130
|
+
syntax. Unknown concrete event or identity types/fields reject for review;
|
|
131
|
+
raw evidence must be retained for a future explicit contract revision.
|
|
132
|
+
- Timestamps use Gateway's RFC3339 date-time profile, including fractions and
|
|
133
|
+
offsets; URLs/GUIDs/durations remain strings, with no invented format checker.
|
|
134
|
+
IDs have no inherited Slack length cap. Counts and mention indices are nonnegative. Integer fields use Int32 bounds where
|
|
135
|
+
Microsoft says Int32; no decimal/64-bit numeric values outside Gateway's safe
|
|
136
|
+
integer range are introduced.
|
|
137
|
+
- Flags enums (message actions and DLP flags) become arrays of distinct known
|
|
138
|
+
strings, split from Graph comma-separated flags. A scalar null remains null;
|
|
139
|
+
`none`/`actionUndefined` remains its named value, not an invented empty array.
|
|
140
|
+
Member spelling follows CSDL wire values. No unknown string is silently changed
|
|
141
|
+
to unknownFutureValue. Evolvable enum sentinels are preserved when returned;
|
|
142
|
+
new named values require a researched version update. This does not authorize
|
|
143
|
+
sending sentinel values in Graph create/update operations.
|
|
144
|
+
|
|
145
|
+
## Exclusions and adjacent-resource decisions
|
|
146
|
+
|
|
147
|
+
| Family / field | Decision and implication |
|
|
148
|
+
| --- | --- |
|
|
149
|
+
| Team firstChannelName and team/channel creation-mode annotations | Create/migration operation inputs, not durable GET/list state; excluded. Read-only fields above remain ingestible. |
|
|
150
|
+
| Identity thumbnails; identitySet.conversationIdentityType | Thumbnails belong to Drive imagery and are excluded. The generic identitySet page describes the sibling conversationIdentityType as an identity object while CSDL omits it; this ambiguous dynamic field is excluded. The documented Teams conversation.conversationIdentityType enum is included. |
|
|
151
|
+
| FilesFolderReference extra driveItem properties; parentReference.sharepointIds; folder.view | File/reference projection only: opaque driveId/siteId/item ids, names, URLs, paths and childCount. SharePoint REST compatibility identifiers, folder presentation and workload facets are excluded. |
|
|
152
|
+
| Team group, photo, schedule, template, operations, permissionGrants | Full group/Entra, images, Shifts, template lifecycle, async workflows and permission enforcement excluded. Team id is the associated group id; no group row required. |
|
|
153
|
+
| Channel filesFolder | External SharePoint/Drive reference only (id, name, webUrl, parentReference, folder shape subset), no file content/library implementation. |
|
|
154
|
+
| Team primaryChannel | Structured external channel reference; projection may be available without a fully captured channel row. |
|
|
155
|
+
| Channel allMembers / sharedWithTeams.allowedMembers | Direct and indirect membership records preserved; allowedMembers list represented by visibility only in this milestone. No derived/expanded effective ACL calculation. |
|
|
156
|
+
| Chat viewpoint | Split into viewer-scoped chat_views; never overwrite a shared chat with whichever caller was last captured. |
|
|
157
|
+
| Chat pinnedMessages / targetedMessages | Excluded; pin/unpin events may be retained without claiming a complete pin inventory or targeted-message delivery. |
|
|
158
|
+
| Tabs and installed/enabled apps | Inventories/configuration/consents excluded. Message attachment teamsAppId and tab/app event references preserved. Chat/team collaboration does not require fake app or tab rows. |
|
|
159
|
+
| Tags/tag memberships | Included for collaboration mentions. Scheduled tag type retained as documented reference state; Shifts creation/behavior excluded. |
|
|
160
|
+
| Hosted content contentBytes / temporaryId | Binary request payload and transient upload identifier excluded. Stable IDs and contentType when independently known are retained; retrieval bytes belong in evidence/storage, not a file workload. |
|
|
161
|
+
| Open extensions, arbitrary dynamic properties, beta-only fields | Excluded from closed model; reject and retain evidence for review. Team classification remains an open string; no required Entra overlay. |
|
|
162
|
+
| Outlook, Planner, OneDrive/SharePoint, telephony, recordings, meetings | No workload entities/operations. Necessary URLs, IDs, event metadata and organizer identities remain external references. |
|
|
163
|
+
|
|
164
|
+
## Evidence discrepancies and chosen interpretation
|
|
165
|
+
|
|
166
|
+
1. **Membership id**: common resource tables call it a user ID; endpoint guidance
|
|
167
|
+
says membership IDs are opaque, and concrete-member docs distinguish id from
|
|
168
|
+
userId. Keep the membership record id scoped by its parent.
|
|
169
|
+
2. **Open identity types**: production CSDL lists only inherited id/displayName
|
|
170
|
+
(and minimal identitySet slots), while Microsoft documents tenantId and richer
|
|
171
|
+
Teams variants as dynamic/open properties. Explicitly author those documented
|
|
172
|
+
fields; do not permit arbitrary JSON everywhere.
|
|
173
|
+
3. **Team classSettings** is in the v1.0 resource docs but absent from production
|
|
174
|
+
team CSDL; include the documented v1.0 type/setting. **scheduled** teamworkTagType
|
|
175
|
+
is documented in v1.0 but absent from pinned metadata; include it, without
|
|
176
|
+
implementing Shifts. **unknownFutureValue** message importance is in production
|
|
177
|
+
CSDL but omitted from its property table; accept the CSDL sentinel.
|
|
178
|
+
4. **phoneUserConversationMember** is in production v1.0 CSDL but has no resource
|
|
179
|
+
page at the pinned docs revision (404). Include the metadata-backed phoneNumber
|
|
180
|
+
variant, recording this evidence limit; do not label it beta or live-validated.
|
|
181
|
+
5. **DLP enum spelling/flags**: prose capitalizes names and describes flag behavior;
|
|
182
|
+
CSDL defines lowercase wire names and IsFlags. Normalize to arrays of those
|
|
183
|
+
exact members; contradictory permission flags remain mapper validation work.
|
|
184
|
+
6. **Expanded reply page size**: channel-list-messages describes both 200 and 1,000
|
|
185
|
+
replies in different sections. Do not enforce either size; follow returned
|
|
186
|
+
replies@odata.nextLink and record partial visibility until pagination ends.
|
|
187
|
+
7. Nullable=false means value nullability, not unconditional field presence under
|
|
188
|
+
partial projection. Keys are deliberately stricter ingestion prerequisites.
|
|
189
|
+
Collection Nullable applies to items, not whether a collection itself is null
|
|
190
|
+
(OASIS CSDL XML 4.01 §7.2.1); navigation nulls are retained in observation metadata.
|
|
191
|
+
|
|
192
|
+
## Enforcement boundary and future mapper obligations
|
|
193
|
+
|
|
194
|
+
Before persisting, a mapper must establish authorized C, actual vendor id, and
|
|
195
|
+
all parent context from the request path/verified expansion. Channel teamId is the
|
|
196
|
+
**host**, never an incoming-channel receiving team. Reply replyToId comes from the
|
|
197
|
+
root route and must agree with a provided body value. Chat chatId and tag teamId
|
|
198
|
+
are similarly supplied when omitted. Verify redundant channelIdentity/tenant/id
|
|
199
|
+
claims against route context; the dialect cannot compare arbitrary nested fields.
|
|
200
|
+
Shared-team edges without a known tenantId and all other keyless projections stay
|
|
201
|
+
in evidence until identity is resolved. Never invent a concatenated vendor ID.
|
|
202
|
+
|
|
203
|
+
Map only supported properties and record exclusions in the capture/mapping report;
|
|
204
|
+
unknown or malformed payloads must not be silently accepted or discarded. Separate
|
|
205
|
+
navigation entities from their parent's structural properties, with explicit
|
|
206
|
+
visibility. Do not infer current roster from sender identity, historical role
|
|
207
|
+
events, tag counts, or partial captures. Standard/private/shared and group/1:1/
|
|
208
|
+
meeting cardinality/access rules, mentions matching HTML, event/type consistency,
|
|
209
|
+
chronological timestamps, tenant consistency, URL/duration/base64 syntax, summary
|
|
210
|
+
counts, and vendor permission/operation rules are **not enforced** by this contract.
|
|
211
|
+
|
|
212
|
+
DeletedDateTime preserves message deletion state and body redaction/projections;
|
|
213
|
+
it does not delete local rows. Explicit provider deletions require explicit
|
|
214
|
+
mutations and dependent deletes. Role changes and edits are authored updates,
|
|
215
|
+
not simulated vendor operations; `readOnly`, `writeOnly`, and defaults have no
|
|
216
|
+
mutation authorization or automatic-value behavior.
|
|
217
|
+
|
|
218
|
+
Persist only through `apply_batch` or schema-gated `ingest`. Batches require the
|
|
219
|
+
exact compiled `target = {id, version, hash}`, stable mapping id/version, ordered
|
|
220
|
+
explicit insert/update/delete mutations, and stable per-record `source.record`.
|
|
221
|
+
`source.evidence` uses `{reference, digest}` with SHA-256 **lowercase hex**
|
|
222
|
+
of the verified source bytes. Capture ArtifactReference digests use **base64** of
|
|
223
|
+
the same 32 bytes: decode/verify then encode hex, never hash the base64 text.
|
|
224
|
+
Evidence references identify observations, not entity primary keys. An exact
|
|
225
|
+
canonical batch retry returns `already_applied` with zero mutations; altered
|
|
226
|
+
content or mutation order under that ID rejects with `idempotency_conflict`.
|
|
227
|
+
`ingest` provides an atomic audit with per-key rather than per-mutation provenance;
|
|
228
|
+
reusing a committed session ID rejects, and raw sessions are not replayable.
|
|
229
|
+
Complete coverage never implies deletion. Invalid batches or SQL sessions roll
|
|
230
|
+
back state, lineage and retry identity. Expiring evidence may be unavailable even
|
|
231
|
+
though durable lineage survives; recapture is future work.
|