serverless-data-mesh 1.2.0__tar.gz → 1.3.0__tar.gz
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.
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/CHANGELOG.md +14 -0
- serverless_data_mesh-1.3.0/NOTICE +14 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/PKG-INFO +8 -3
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/PYPI.md +5 -1
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/README.md +127 -69
- serverless_data_mesh-1.3.0/VERSION +1 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/architecture.md +25 -17
- serverless_data_mesh-1.3.0/docs/aws-production-deploy.md +184 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/blog-the-vaquar-pattern.md +15 -13
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/data-mesh-end-to-end.md +13 -11
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/data-mesh-patterns.md +6 -5
- serverless_data_mesh-1.3.0/docs/deployment.md +65 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/due-diligence-architecture-claims.md +15 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/getting-started.md +1 -1
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/how-to-start.md +2 -2
- serverless_data_mesh-1.3.0/docs/images/durable-lambda-compute-model.png +0 -0
- serverless_data_mesh-1.3.0/docs/images/lambda-execution-flow.png +0 -0
- serverless_data_mesh-1.3.0/docs/images/pvdm-fail-closed-vs-traditional.png +0 -0
- serverless_data_mesh-1.3.0/docs/images/pvdm-lifecycle-readme.png +0 -0
- serverless_data_mesh-1.3.0/docs/lambda-managed-instances.md +65 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/terraform-guide.md +12 -9
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/vaquar-pattern.md +41 -12
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/why-serverless-data-mesh.md +9 -9
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/domain_writer/handler.py +8 -1
- serverless_data_mesh-1.3.0/examples/domain_writer/io.py +72 -0
- serverless_data_mesh-1.3.0/examples/durable-compute/README.md +53 -0
- serverless_data_mesh-1.3.0/examples/durable-compute/terraform.tfvars.example +20 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/README.md +16 -7
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/dev/main.tf +19 -3
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/dev/terraform.tfvars.example +3 -1
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/medallion/main.tf +39 -3
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/medallion/outputs.tf +13 -2
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/medallion/terraform.tfvars.example +8 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/medallion/variables.tf +36 -4
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/multi-account/producer/main.tf +18 -3
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/multi-account/producer/terraform.tfvars.example +5 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/prod/main.tf +69 -20
- serverless_data_mesh-1.3.0/infrastructure/terraform/environments/prod/outputs.tf +76 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/prod/terraform.tfvars.example +17 -6
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/prod/variables.tf +49 -6
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/iam/main.tf +36 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/iam/variables.tf +12 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/lambda/main.tf +13 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/lambda/outputs.tf +7 -2
- serverless_data_mesh-1.3.0/infrastructure/terraform/modules/lambda/variables.tf +136 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/lambda-fleet/main.tf +13 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/monitoring/dashboard.tf +2 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/monitoring/main.tf +61 -1
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/monitoring/outputs.tf +2 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/monitoring/variables.tf +18 -0
- serverless_data_mesh-1.3.0/infrastructure/terraform/modules/sns/main.tf +27 -0
- serverless_data_mesh-1.3.0/infrastructure/terraform/modules/sns/outputs.tf +13 -0
- serverless_data_mesh-1.3.0/infrastructure/terraform/modules/sns/variables.tf +40 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/stepfunctions/variables.tf +4 -3
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/pyproject.toml +2 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/attestation/pvdma.py +2 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/contract.py +1 -1
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/emit.py +6 -2
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/medallion_emit.py +3 -1
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/dashboard/trust.py +5 -2
- serverless_data_mesh-1.3.0/src/serverless_data_mesh/execution_timeouts.py +161 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/local/runtime.py +62 -6
- serverless_data_mesh-1.3.0/src/serverless_data_mesh/observability/__init__.py +19 -0
- serverless_data_mesh-1.3.0/src/serverless_data_mesh/observability/sns_notify.py +121 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/orchestration/coordinator.py +65 -2
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/orchestration/durable_steps.py +46 -2
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/orchestration/state.py +6 -0
- serverless_data_mesh-1.3.0/src/serverless_data_mesh/pvdm_copyright.py +40 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/ui/data.py +8 -3
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/ui/static/app.css +9 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/ui/static/app.js +2 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/ui/static/index.html +6 -1
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/verification/__init__.py +26 -0
- serverless_data_mesh-1.3.0/src/serverless_data_mesh/verification/commit_gate.py +258 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/verification/fallback.py +31 -0
- serverless_data_mesh-1.3.0/src/serverless_data_mesh/verification/nonce_ledger.py +98 -0
- serverless_data_mesh-1.3.0/src/serverless_data_mesh/verification/pvdm_primitives.py +252 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/verification/vrp.py +31 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/conftest.py +7 -0
- serverless_data_mesh-1.3.0/tests/unit/test_commit_gate.py +185 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_coverage_new_modules.py +3 -0
- serverless_data_mesh-1.3.0/tests/unit/test_execution_timeouts.py +137 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_metrics.py +19 -0
- serverless_data_mesh-1.3.0/tests/unit/test_sns_notify.py +100 -0
- serverless_data_mesh-1.2.0/VERSION +0 -1
- serverless_data_mesh-1.2.0/docs/deployment.md +0 -42
- serverless_data_mesh-1.2.0/docs/images/durable-lambda-compute-model.png +0 -0
- serverless_data_mesh-1.2.0/docs/images/lambda-execution-flow.png +0 -0
- serverless_data_mesh-1.2.0/examples/domain_writer/io.py +0 -33
- serverless_data_mesh-1.2.0/examples/durable-compute/README.md +0 -81
- serverless_data_mesh-1.2.0/examples/durable-compute/terraform.tfvars.example +0 -11
- serverless_data_mesh-1.2.0/infrastructure/terraform/environments/prod/outputs.tf +0 -61
- serverless_data_mesh-1.2.0/infrastructure/terraform/modules/lambda/variables.tf +0 -90
- serverless_data_mesh-1.2.0/src/serverless_data_mesh/observability/__init__.py +0 -5
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/.gitignore +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/LICENSE +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/README.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/results/2026-06-baseline.json +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/run_aws_benchmark.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/run_benchmark.sh +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/run_cost_estimate.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/run_local_benchmark.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/workloads/100k_rows.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/workloads/10m_rows.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/workloads/1m_rows.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/demo-walkthrough.html +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/domain-contracts.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/first-mesh-on-aws.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/glue-connector.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/medallion-one-yaml-mesh.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/pipeline-creation-flow.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/pipeline-generated-artifacts.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/portfolio-stack-veridata-sparkrules.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/serverless-data-mesh-hero.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/sparkrules-pipeline-position.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/three-account-data-mesh.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-01-install-demo.gif +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-01-install-demo.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-02-new-mesh.gif +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-02-new-mesh.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-03-apply.gif +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-03-apply.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-04-ui.gif +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-04-ui.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-05-deploy.gif +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-05-deploy.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-06-observe.gif +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-06-observe.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/tutorial-overview.gif +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/vaquar-pattern-blog-hero.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/vaquar-pattern-e2e-journey.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/vaquar-pattern-invariant.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/vaquar-pattern-proprietary-pvdm.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/veridata-vrp-chunk-proof.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/why-sdm-four-phase-connectivity.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/why-sdm-hero-connectivity.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/why-sdm-trust-gap.png +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/mesh-trust-dashboard.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/metadata-driven-pipeline.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/observability-production.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/portable-multi-cloud.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/pypi.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/roadmap-pvdm-a-agentic.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/sparkrules-connector.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/visual-tutorial.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/contracts/payments.mesh.pipeline.yaml +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/domain_writer/README.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/domain_writer/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/domain_writer/rules_io.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/domain_writer/spark_io.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/domain_writer/workload.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/medallion-e2e/README.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/medallion-e2e/northstar.mesh.yaml +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/multi-domain-orders-payments/README.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/multi-domain-orders-payments/coordinator_config.yaml +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/multi-domain-orders-payments/test_atomicity.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/README.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/compile_all.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/contracts/customers.mesh.pipeline.yaml +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/contracts/inventory.mesh.pipeline.yaml +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/contracts/orders.mesh.pipeline.yaml +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/contracts/payments.mesh.pipeline.yaml +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/contracts/shipping.mesh.pipeline.yaml +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/mesh-registry.yaml +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/mesh-transactions/daily-close.yaml +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/spark/orders_readers.example.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/tutorials/README.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/tutorials/verification_gate_demo.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/tutorials/walkthrough.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/grafana/mesh-trust-dashboard.json +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/sam/README.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/sam/template.yaml +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/medallion/providers.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/medallion/versions.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/multi-account/README.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/multi-account/publisher/main.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/multi-account/publisher/terraform.tfvars.example +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/multi-account/steward/main.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/multi-account/steward/terraform.tfvars.example +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/prod/providers.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/prod/versions.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/eventbridge/main.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/eventbridge/outputs.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/eventbridge/variables.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/eventbridge/versions.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/governance/main.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/governance/versions.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/iam/outputs.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/iam/versions.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/lambda/versions.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/lambda-fleet/outputs.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/medallion-mesh/main.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/medallion-mesh/outputs.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/messaging/main.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/messaging/outputs.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/messaging/variables.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/messaging/versions.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/monitoring/versions.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/stepfunctions/main.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/stepfunctions/outputs.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/stepfunctions/state_machine.asl.json.tpl +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/stepfunctions/versions.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/storage/main.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/storage/outputs.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/storage/variables.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/storage/versions.tf +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/scripts/package_lambda.ps1 +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/scripts/package_lambda.sh +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/integrations/backstage/README.md +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/schemas/sdm-v1-dataproductpipeline.json +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/schemas/sdm-v1-medallionmesh.json +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/attestation/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/catalog/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/catalog/glue_connector.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/catalog/glue_rest.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/catalog_export/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/catalog_export/backstage.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/cli.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/from_init.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/loader.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/medallion.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/medallion_validate.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/runtime.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/validate.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/wizard.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/config.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/dashboard/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/dashboard/cloudwatch.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/deploy/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/deploy/runner.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/exceptions.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/governance/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/governance/consumer_sla.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/lineage/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/lineage/openlineage.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/local/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/metrics/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/metrics/mesh_trust.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/observability/structured.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/orchestration/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/orchestration/canary.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/orchestration/reprocess.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/portable/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/portable/cloud.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/py.typed +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/readers/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/readers/s3_bronze.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/readers/upstream_parquet.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/rules/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/rules/gate.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/rules/sparkrules_connector.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/scaffold/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/scaffold/init_domain.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/templates/medallion-starter.mesh.yaml +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/templates/single-pipeline.mesh.yaml +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/types/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/types/workload.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/ui/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/ui/server.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/verification/backend.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/verification/kms_sign.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/eval/test_consumer_safety.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/__init__.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_attestation_kms.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_auto_repair_demo.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_canary.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_catalog.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_catalog_export.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_cli_scaffold.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_compile.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_config.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_consumer_sla.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_deploy.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_example_workload.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_fallback_verifier.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_local_runtime.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_medallion.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_observability.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_openlineage.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_reference_readers.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_reprocess.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_schemas.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_sparkrules_connector.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_types.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_ui_server.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_verification.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_version.py +0 -0
- {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_wizard.py +0 -0
|
@@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [1.3.0] - 2026-09-19
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **Lambda Managed Instances (LMI) opt-in**: segments up to **90 minutes** for async/ESM via `enable_lambda_managed_instances` + capacity provider ARN
|
|
12
|
+
- **`execution_timeouts` module** with unit tests validating on-demand (≤15 min) vs LMI (≤90 min), SFN sync cap, IceGuard rollback scaling, and durable budget coherence
|
|
13
|
+
- **Docs**: `docs/lambda-managed-instances.md` — industry-standard 15–90 min segments with IceGuard/VRP Iceberg safety
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- Terraform lambda module / prod / medallion / multi-account: timeout ceiling **900 or 5400** by capacity mode; SFN invoke wait capped at sync 15 min
|
|
18
|
+
- README / architecture / terraform guides: dual clocks + LMI; IceGuard prevents corrupt Iceberg publication
|
|
19
|
+
- PyPI download badges: use live **pypistats** monthly/weekly counts (shields `pypi/dm` and pe.py static badges were unreliable)
|
|
20
|
+
|
|
7
21
|
## [1.2.0] - 2026-07-21
|
|
8
22
|
|
|
9
23
|
### Added
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Vaquar Pattern (PVDM)
|
|
2
|
+
Copyright © 2024–2026 Vaquar Khan. All rights reserved.
|
|
3
|
+
|
|
4
|
+
PVDM (Physical · Verify · Durable · Metadata) and the Vaquar Pattern are
|
|
5
|
+
proprietary architectural methods of Vaquar Khan. The method name, operational
|
|
6
|
+
acronym, and publication invariant (commit_metadata ⟹ VRP = PASS) may not be
|
|
7
|
+
rebranded or claimed as an independent invention without attribution to the
|
|
8
|
+
inventor.
|
|
9
|
+
|
|
10
|
+
This repository's reference implementation (serverless-data-mesh) is licensed
|
|
11
|
+
under the Apache License 2.0. Use of the open-source code does not transfer
|
|
12
|
+
ownership of the proprietary method.
|
|
13
|
+
|
|
14
|
+
See docs/vaquar-pattern.md for the canonical method specification.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: serverless-data-mesh
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.0
|
|
4
4
|
Summary: Federated data mesh framework for proof-gated, exactly-once Iceberg data product publication on AWS Lambda.
|
|
5
5
|
Project-URL: Homepage, https://github.com/vaquarkhan/aws-serverless-datamesh-framework
|
|
6
6
|
Project-URL: Documentation, https://github.com/vaquarkhan/aws-serverless-datamesh-framework#readme
|
|
@@ -10,6 +10,7 @@ Project-URL: PyPI, https://pypi.org/project/serverless-data-mesh/
|
|
|
10
10
|
Author: Serverless Data Mesh Contributors
|
|
11
11
|
License-Expression: Apache-2.0
|
|
12
12
|
License-File: LICENSE
|
|
13
|
+
License-File: NOTICE
|
|
13
14
|
Keywords: aws,bronze-silver-gold,data-as-a-product,data-mesh,domain-oriented,durable-execution,etl,federated-data-mesh,federated-governance,iceberg,iceguard,lakehouse,lambda,medallion,metadata-driven,pyiceberg,rule-engine,serverless,sparkrules,vaquar-pattern,veridata-recon
|
|
14
15
|
Classifier: Development Status :: 5 - Production/Stable
|
|
15
16
|
Classifier: Intended Audience :: Developers
|
|
@@ -62,6 +63,8 @@ An open Python framework for **domain-oriented**, **federated data mesh** teams
|
|
|
62
63
|
|
|
63
64
|
Introduces the **[Vaquar Pattern](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/blob/main/docs/vaquar-pattern.md)** (PVDM): Physical → Verify → Durable → Metadata. Invariant: `commit_metadata ⟹ VRP = PASS`.
|
|
64
65
|
|
|
66
|
+
**Paper:** [arXiv:2608.14643](https://arxiv.org/abs/2608.14643) · **Reference gate:** [Proof-gated-publication-PVDM](https://github.com/vaquarkhan/Proof-gated-publication-PVDM)
|
|
67
|
+
|
|
65
68
|
## Install
|
|
66
69
|
|
|
67
70
|
```bash
|
|
@@ -83,7 +86,7 @@ pip install "serverless-data-mesh[dev]" # pytest, ruff, pre-commit
|
|
|
83
86
|
|---------|--------|
|
|
84
87
|
| Silent data loss on backfill | VRP `FAIL` blocks Iceberg snapshot |
|
|
85
88
|
| "Job succeeded" is not proof | Cryptographic multiset proof per chunk |
|
|
86
|
-
| Lambda 15-minute limit | Durable
|
|
89
|
+
| Lambda 15-minute limit | Durable + IceGuard (any total runtime); optional LMI segments up to 90 min async |
|
|
87
90
|
| Retry duplicates data | IceGuard rollback + `workload_id` checkpoints |
|
|
88
91
|
| Central ETL bottleneck | Per-domain Lambda writer + transaction boundary |
|
|
89
92
|
| Federated blast radius | Producer · Steward · Publisher accounts |
|
|
@@ -136,6 +139,8 @@ outcome = coordinator.run_workload(workload)
|
|
|
136
139
|
## Documentation
|
|
137
140
|
|
|
138
141
|
- [GitHub README](https://github.com/vaquarkhan/aws-serverless-datamesh-framework#readme)
|
|
142
|
+
- [PVDM paper (arXiv:2608.14643)](https://arxiv.org/abs/2608.14643)
|
|
143
|
+
- [PVDM reference gate](https://github.com/vaquarkhan/Proof-gated-publication-PVDM)
|
|
139
144
|
- [Vaquar Pattern](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/blob/main/docs/vaquar-pattern.md)
|
|
140
145
|
- [Getting started](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/blob/main/docs/getting-started.md)
|
|
141
146
|
- [PyPI guide](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/blob/main/docs/pypi.md)
|
|
@@ -10,6 +10,8 @@ An open Python framework for **domain-oriented**, **federated data mesh** teams
|
|
|
10
10
|
|
|
11
11
|
Introduces the **[Vaquar Pattern](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/blob/main/docs/vaquar-pattern.md)** (PVDM): Physical → Verify → Durable → Metadata. Invariant: `commit_metadata ⟹ VRP = PASS`.
|
|
12
12
|
|
|
13
|
+
**Paper:** [arXiv:2608.14643](https://arxiv.org/abs/2608.14643) · **Reference gate:** [Proof-gated-publication-PVDM](https://github.com/vaquarkhan/Proof-gated-publication-PVDM)
|
|
14
|
+
|
|
13
15
|
## Install
|
|
14
16
|
|
|
15
17
|
```bash
|
|
@@ -31,7 +33,7 @@ pip install "serverless-data-mesh[dev]" # pytest, ruff, pre-commit
|
|
|
31
33
|
|---------|--------|
|
|
32
34
|
| Silent data loss on backfill | VRP `FAIL` blocks Iceberg snapshot |
|
|
33
35
|
| "Job succeeded" is not proof | Cryptographic multiset proof per chunk |
|
|
34
|
-
| Lambda 15-minute limit | Durable
|
|
36
|
+
| Lambda 15-minute limit | Durable + IceGuard (any total runtime); optional LMI segments up to 90 min async |
|
|
35
37
|
| Retry duplicates data | IceGuard rollback + `workload_id` checkpoints |
|
|
36
38
|
| Central ETL bottleneck | Per-domain Lambda writer + transaction boundary |
|
|
37
39
|
| Federated blast radius | Producer · Steward · Publisher accounts |
|
|
@@ -84,6 +86,8 @@ outcome = coordinator.run_workload(workload)
|
|
|
84
86
|
## Documentation
|
|
85
87
|
|
|
86
88
|
- [GitHub README](https://github.com/vaquarkhan/aws-serverless-datamesh-framework#readme)
|
|
89
|
+
- [PVDM paper (arXiv:2608.14643)](https://arxiv.org/abs/2608.14643)
|
|
90
|
+
- [PVDM reference gate](https://github.com/vaquarkhan/Proof-gated-publication-PVDM)
|
|
87
91
|
- [Vaquar Pattern](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/blob/main/docs/vaquar-pattern.md)
|
|
88
92
|
- [Getting started](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/blob/main/docs/getting-started.md)
|
|
89
93
|
- [PyPI guide](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/blob/main/docs/pypi.md)
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
3
|
# Serverless Data Mesh
|
|
4
4
|
|
|
5
5
|
**Governed, exactly-once lakehouse writes on AWS Lambda - with cryptographic proof, not just green job logs.**
|
|
6
6
|
|
|
7
7
|
[](https://www.python.org/downloads/)
|
|
8
|
-
[](https://pypi.org/project/serverless-data-mesh/)
|
|
8
|
+
[](https://pypi.org/project/serverless-data-mesh/)
|
|
9
|
+
[](https://pypistats.org/packages/serverless-data-mesh)
|
|
10
|
+
[](https://pypistats.org/packages/serverless-data-mesh)
|
|
11
|
+
[](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/pkgs/container/serverless-data-mesh)
|
|
9
12
|
[](LICENSE)
|
|
10
13
|
[](https://docs.aws.amazon.com/lambda/)
|
|
11
14
|
[](https://iceberg.apache.org/)
|
|
@@ -16,17 +19,17 @@
|
|
|
16
19
|
|
|
17
20
|
An open Python framework for **federated data mesh** lakehouse publication on AWS:<br/>
|
|
18
21
|
**domain-oriented ownership**, **data as a product**, and **self-serve write infrastructure** for cross-domain teams.<br/>
|
|
19
|
-
**Producer** domains publish governed **data products**
|
|
22
|
+
**Producer** domains publish governed **data products** - **Steward** notaries enforce **federated computational governance** - **Publisher** zones expose consumer-ready **Iceberg data products** to the mesh.
|
|
20
23
|
|
|
21
|
-
[**PyPI**](https://pypi.org/project/serverless-data-mesh/) · [**
|
|
24
|
+
[**PyPI**](https://pypi.org/project/serverless-data-mesh/) · [**Docker (GHCR)**](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/pkgs/container/serverless-data-mesh) · [**Walkthrough**](#how-to-start---walkthrough-gifs--benefits) · [**GIF gallery**](docs/visual-tutorial.md) · [**Vaquar Pattern**](docs/vaquar-pattern.md) · [**Paper (arXiv)**](https://arxiv.org/abs/2608.14643) · [**Deploy**](docs/aws-production-deploy.md)
|
|
22
25
|
|
|
23
26
|
</div>
|
|
24
27
|
|
|
25
28
|
---
|
|
26
29
|
|
|
27
|
-
## How to start
|
|
30
|
+
## How to start - walkthrough (GIFs + benefits)
|
|
28
31
|
|
|
29
|
-
Read this section in the README
|
|
32
|
+
Read this section in the README - no extra docs required.
|
|
30
33
|
**Interactive auto-play demo:** after `ui --open`, open [http://127.0.0.1:8765/walkthrough](http://127.0.0.1:8765/walkthrough) · or open [docs/demo-walkthrough.html](docs/demo-walkthrough.html)
|
|
31
34
|
|
|
32
35
|
**Also useful:**
|
|
@@ -44,7 +47,7 @@ Read this section in the README — no extra docs required.
|
|
|
44
47
|
```bash
|
|
45
48
|
pip install serverless-data-mesh
|
|
46
49
|
|
|
47
|
-
# Optional: 60s proof (no AWS)
|
|
50
|
+
# Optional: 60s proof (no AWS) - clean commit, corrupt blocked
|
|
48
51
|
serverless-data-mesh demo
|
|
49
52
|
|
|
50
53
|
# Generate sample mesh + open control center
|
|
@@ -70,7 +73,7 @@ serverless-data-mesh ui --path examples/medallion-e2e/generated --open
|
|
|
70
73
|
<img src="docs/images/tutorial/tutorial-overview.gif" alt="Step-by-step demo overview GIF" width="720" />
|
|
71
74
|
</p>
|
|
72
75
|
|
|
73
|
-
### Step 1
|
|
76
|
+
### Step 1 - Install & prove the gate
|
|
74
77
|
|
|
75
78
|
<p align="center">
|
|
76
79
|
<img src="docs/images/tutorial/step-01-install-demo.gif" alt="Step 1: install and demo" width="720" />
|
|
@@ -84,10 +87,10 @@ serverless-data-mesh demo
|
|
|
84
87
|
| | |
|
|
85
88
|
|--|--|
|
|
86
89
|
| **You do** | Install, then run `demo` once |
|
|
87
|
-
| **You get** | Clean write **commits**; corrupt write is **blocked**
|
|
90
|
+
| **You get** | Clean write **commits**; corrupt write is **blocked** - in <60s, **no AWS** |
|
|
88
91
|
| **Benefit** | Proof that “pipeline succeeded” ≠ trustworthy data |
|
|
89
92
|
|
|
90
|
-
### Step 2
|
|
93
|
+
### Step 2 - Create mesh YAML
|
|
91
94
|
|
|
92
95
|
<p align="center">
|
|
93
96
|
<img src="docs/images/tutorial/step-02-new-mesh.gif" alt="Step 2: create mesh YAML" width="720" />
|
|
@@ -102,9 +105,9 @@ serverless-data-mesh new --template medallion --output my-mesh
|
|
|
102
105
|
|--|--|
|
|
103
106
|
| **You do** | Scaffold (or edit) a medallion / northstar contract |
|
|
104
107
|
| **You get** | A domain-owned `mesh.yaml` |
|
|
105
|
-
| **Benefit** | Domain teams own the contract
|
|
108
|
+
| **Benefit** | Domain teams own the contract - not a central Glue ticket queue |
|
|
106
109
|
|
|
107
|
-
### Step 3
|
|
110
|
+
### Step 3 - Apply (compile pipelines)
|
|
108
111
|
|
|
109
112
|
<p align="center">
|
|
110
113
|
<img src="docs/images/tutorial/step-03-apply.gif" alt="Step 3: apply and compile" width="720" />
|
|
@@ -122,7 +125,7 @@ serverless-data-mesh apply \
|
|
|
122
125
|
| **You get** | Handlers, Step Functions ASL, VRP config, layer Lambda manifest |
|
|
123
126
|
| **Benefit** | One YAML → many proof-gated pipelines (bronze / silver / gold) |
|
|
124
127
|
|
|
125
|
-
### Step 4
|
|
128
|
+
### Step 4 - Start the control center UI
|
|
126
129
|
|
|
127
130
|
<p align="center">
|
|
128
131
|
<img src="docs/images/tutorial/step-04-ui.gif" alt="Step 4: open control UI" width="720" />
|
|
@@ -140,7 +143,7 @@ serverless-data-mesh ui --path my-mesh/generated --open
|
|
|
140
143
|
| **You get** | KPIs, pipelines, trust, PVDM, durable clocks, Tutorial tab |
|
|
141
144
|
| **Benefit** | Review readiness **before** you spend AWS money |
|
|
142
145
|
|
|
143
|
-
### Step 5
|
|
146
|
+
### Step 5 - Deploy Durable Lambda (AWS)
|
|
144
147
|
|
|
145
148
|
<p align="center">
|
|
146
149
|
<img src="docs/images/tutorial/step-05-deploy.gif" alt="Step 5: package and deploy" width="720" />
|
|
@@ -149,17 +152,17 @@ serverless-data-mesh ui --path my-mesh/generated --open
|
|
|
149
152
|
```bash
|
|
150
153
|
./infrastructure/terraform/scripts/package_lambda.sh
|
|
151
154
|
cd infrastructure/terraform/environments/prod
|
|
152
|
-
# dual clocks
|
|
155
|
+
# dual clocks - see examples/durable-compute/terraform.tfvars.example
|
|
153
156
|
terraform apply
|
|
154
157
|
```
|
|
155
158
|
|
|
156
159
|
| | |
|
|
157
160
|
|--|--|
|
|
158
161
|
| **You do** | Package the Lambda zip + `terraform apply` ([durable-compute example](examples/durable-compute/)) |
|
|
159
|
-
| **You get** | Durable Lambda on Firecracker, on-demand scale-to-zero, dual clocks (
|
|
160
|
-
| **Benefit** |
|
|
162
|
+
| **You get** | Durable Lambda on Firecracker, on-demand scale-to-zero, dual clocks (segment + workload) |
|
|
163
|
+
| **Benefit** | Backfills longer than 15 minutes without idle EMR/Glue clusters |
|
|
161
164
|
|
|
162
|
-
### Step 6
|
|
165
|
+
### Step 6 - Observe & attest
|
|
163
166
|
|
|
164
167
|
<p align="center">
|
|
165
168
|
<img src="docs/images/tutorial/step-06-observe.gif" alt="Step 6: observe and attest" width="720" />
|
|
@@ -174,7 +177,7 @@ serverless-data-mesh dashboard --open
|
|
|
174
177
|
|--|--|
|
|
175
178
|
| **You do** | Run attestation demo and/or trust dashboard |
|
|
176
179
|
| **You get** | VRP proofs + PVDM-A decision records + CloudWatch trust metrics |
|
|
177
|
-
| **Benefit** | Auditable publication
|
|
180
|
+
| **Benefit** | Auditable publication - consumers only see snapshots after **VRP PASS** |
|
|
178
181
|
|
|
179
182
|
### Quick links (same as the walkthrough footer)
|
|
180
183
|
|
|
@@ -182,20 +185,32 @@ serverless-data-mesh dashboard --open
|
|
|
182
185
|
- **Control center:** `serverless-data-mesh ui --path examples/medallion-e2e/generated --open`
|
|
183
186
|
- **Durable Lambda clocks:** [examples/durable-compute/](examples/durable-compute/)
|
|
184
187
|
|
|
185
|
-
### Docker (
|
|
188
|
+
### Docker (GHCR - published image)
|
|
189
|
+
|
|
190
|
+
Official image (release `v1.3.0` publishes via GitHub Actions to GHCR):
|
|
186
191
|
|
|
187
192
|
```bash
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
docker run --rm -p 8765:8765 ghcr.io/vaquarkhan/serverless-data-mesh:1.
|
|
191
|
-
#
|
|
193
|
+
docker pull ghcr.io/vaquarkhan/serverless-data-mesh:1.3.0
|
|
194
|
+
# or: ghcr.io/vaquarkhan/serverless-data-mesh:latest
|
|
195
|
+
docker run --rm -p 8765:8765 ghcr.io/vaquarkhan/serverless-data-mesh:1.3.0
|
|
196
|
+
# open http://127.0.0.1:8765/
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Package page: [ghcr.io/vaquarkhan/serverless-data-mesh](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/pkgs/container/serverless-data-mesh)
|
|
192
200
|
|
|
193
|
-
|
|
201
|
+
```bash
|
|
202
|
+
# Build locally instead
|
|
194
203
|
docker build -t serverless-data-mesh:local .
|
|
195
204
|
docker run --rm -p 8765:8765 serverless-data-mesh:local
|
|
196
205
|
```
|
|
197
206
|
|
|
198
|
-
|
|
207
|
+
### Install & download stats
|
|
208
|
+
|
|
209
|
+
| Channel | Command / link |
|
|
210
|
+
|---------|----------------|
|
|
211
|
+
| **PyPI** | `pip install serverless-data-mesh==1.3.0` · [project](https://pypi.org/project/serverless-data-mesh/) · [monthly stats](https://pypistats.org/packages/serverless-data-mesh) · [total downloads](https://pepy.tech/projects/serverless-data-mesh) |
|
|
212
|
+
| **Docker** | `docker pull ghcr.io/vaquarkhan/serverless-data-mesh:latest` |
|
|
213
|
+
| **GitHub Release** | [v1.3.0](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/releases/tag/v1.3.0) |
|
|
199
214
|
|
|
200
215
|
---
|
|
201
216
|
|
|
@@ -234,7 +249,7 @@ Most data mesh programs reorganize teams but leave the **write path** centralize
|
|
|
234
249
|
|------|-------------------|-------------------------------|
|
|
235
250
|
| **Silent data loss** | Partition row counts drift; discovered days later | VRP `FAIL` blocks Iceberg snapshot; consumers never see bad data |
|
|
236
251
|
| **"Job succeeded" ≠ correct** | Glue exit code 0 with 6 missing rows | Multiset cryptographic proof per chunk |
|
|
237
|
-
| **Lambda 15-min limit** | "Use EMR/Glue for real backfills" | Durable
|
|
252
|
+
| **Lambda 15-min limit** | "Use EMR/Glue for real backfills" | Durable + IceGuard (any total runtime); optional LMI segments up to **90 min** async |
|
|
238
253
|
| **Retry duplicates data** | Re-invoke creates duplicate Parquet | IceGuard rollback + `workload_id` checkpoints |
|
|
239
254
|
| **Platform bottleneck** | Every domain waits on central ETL | Each domain owns a Lambda writer + declared contract |
|
|
240
255
|
| **No audit evidence** | Sample rows and debate | Immutable VRP proofs in Steward S3; offline `verify_proof` |
|
|
@@ -247,12 +262,28 @@ Most data mesh programs reorganize teams but leave the **write path** centralize
|
|
|
247
262
|
|
|
248
263
|
## The solution: Vaquar Pattern
|
|
249
264
|
|
|
250
|
-
This framework is the **reference implementation** of the **[Vaquar Pattern](docs/vaquar-pattern.md)**
|
|
265
|
+
This framework is the **reference implementation** of the **[Vaquar Pattern](docs/vaquar-pattern.md)** - a proprietary architectural method invented by **Vaquar Khan** for proof-gated serverless lakehouse publication.
|
|
266
|
+
|
|
267
|
+
<p align="center">
|
|
268
|
+
<img src="docs/images/pvdm-lifecycle-readme.png" alt="PVDM lifecycle: Physical, Verify, Durable, Metadata with fail-closed VRP FAIL branch" width="920" />
|
|
269
|
+
</p>
|
|
270
|
+
|
|
271
|
+
<p align="center">
|
|
272
|
+
<img src="docs/images/pvdm-fail-closed-vs-traditional.png" alt="Traditional exit-code publish vs PVDM fail-closed gate: corrupt data never reaches consumers" width="920" />
|
|
273
|
+
</p>
|
|
251
274
|
|
|
252
275
|
<p align="center">
|
|
253
|
-
<img src="docs/images/vaquar-pattern-proprietary-pvdm.png" alt="The Vaquar Pattern PVDM: proprietary method by Vaquar Khan
|
|
276
|
+
<img src="docs/images/vaquar-pattern-proprietary-pvdm.png" alt="The Vaquar Pattern PVDM: proprietary method by Vaquar Khan - Physical Verify Durable Metadata" width="920" />
|
|
254
277
|
</p>
|
|
255
278
|
|
|
279
|
+
**Read the paper & reference gate**
|
|
280
|
+
|
|
281
|
+
| | |
|
|
282
|
+
|--|--|
|
|
283
|
+
| **arXiv preprint** | [arXiv:2608.14643](https://arxiv.org/abs/2608.14643) — *Proof-Gated Publication: Verify-Before-Commit Content Integrity for Serverless Data-Mesh Lakehouses* |
|
|
284
|
+
| **Reference gate + adversarial suite** | [github.com/vaquarkhan/Proof-gated-publication-PVDM](https://github.com/vaquarkhan/Proof-gated-publication-PVDM) (stdlib gate, 30/30 suite, Spark/Iceberg benchmarks) |
|
|
285
|
+
| **This repo** | Production AWS mapping (IceGuard · veridata-recon · Durable SDK · Glue/Iceberg) |
|
|
286
|
+
|
|
256
287
|
> **Proof-Gated Serverless Lakehouse Publication (PVDM)**
|
|
257
288
|
> Physical → Verify → Durable → Metadata
|
|
258
289
|
> Invariant: `commit_metadata ⟹ VRP = PASS`
|
|
@@ -262,31 +293,38 @@ This framework is the **reference implementation** of the **[Vaquar Pattern](doc
|
|
|
262
293
|
| **Method name** | Vaquar Pattern |
|
|
263
294
|
| **Operational acronym** | **PVDM** (Physical · Verify · Durable · Metadata) |
|
|
264
295
|
| **Inventor** | Vaquar Khan |
|
|
296
|
+
| **Copyright** | © 2024–2026 Vaquar Khan - proprietary method (name + invariants) |
|
|
265
297
|
| **Status** | Proprietary method · open reference implementation (Apache-2.0) |
|
|
266
|
-
| **Cite** | [docs/vaquar-pattern.md](docs/vaquar-pattern.md) |
|
|
298
|
+
| **Cite** | [arXiv:2608.14643](https://arxiv.org/abs/2608.14643) · [docs/vaquar-pattern.md](docs/vaquar-pattern.md) · [NOTICE](NOTICE) |
|
|
267
299
|
|
|
268
300
|
<p align="center">
|
|
269
301
|
<img src="docs/images/why-sdm-four-phase-connectivity.png" alt="Vaquar Pattern four phases: Physical, Verify, Durable, Metadata with cross-account flows" width="920" />
|
|
270
302
|
</p>
|
|
271
303
|
|
|
304
|
+
<p align="center">
|
|
305
|
+
<img src="docs/images/vaquar-pattern-invariant.png" alt="Vaquar Pattern invariant: metadata commit only when VRP equals PASS" width="920" />
|
|
306
|
+
</p>
|
|
307
|
+
|
|
272
308
|
| Phase | Component | Outcome | Implemented? |
|
|
273
309
|
|-------|-----------|---------|--------------|
|
|
274
|
-
| **Physical** | IceGuard SafeWriter | Parquet in Publisher S3; checkpoints in Steward S3 | **Yes**
|
|
275
|
-
| **Verify** | veridata-recon | VRP proof stored; `validate_then_commit` gate | **Yes**
|
|
276
|
-
| **Durable** | AWS Durable SDK + Step Functions | 15-min segments
|
|
277
|
-
| **Metadata** | GlueCatalogConnector | Iceberg snapshot **only after** VRP PASS | **Yes**
|
|
310
|
+
| **Physical** | IceGuard SafeWriter | Parquet in Publisher S3; checkpoints in Steward S3 | **Yes** - `IceGuardDurableCoordinator` + IceGuard watchdog |
|
|
311
|
+
| **Verify** | veridata-recon + keyed Steward binding | VRP proof stored; `validate_then_commit` + Metadata TOCTOU gate | **Yes** - PASS blocks FAIL before metadata |
|
|
312
|
+
| **Durable** | AWS Durable SDK + Step Functions | 15-min segments chained to any configured total | **Yes** - `@durable_execution` + SFN resume |
|
|
313
|
+
| **Metadata** | GlueCatalogConnector | Iceberg snapshot **only after** VRP PASS | **Yes** - proof-gated commit |
|
|
278
314
|
|
|
279
315
|
Optional (not a fifth PVDM phase): SparkRules DRL / rules gate before Physical; PVDM-A decision attestation after Verify.
|
|
280
316
|
|
|
281
317
|
What makes this new vs Outbox, Saga, Medallion, and Glue bookmarks: **Iceberg publication is gated on cryptographic multiset proof**, not executor success.
|
|
282
318
|
|
|
319
|
+
**See it live:** [How to start (GIF walkthrough)](#how-to-start---walkthrough-gifs--benefits) · `serverless-data-mesh demo` · UI `/walkthrough`
|
|
320
|
+
**Paper:** [arXiv:2608.14643](https://arxiv.org/abs/2608.14643) · **Reference gate:** [Proof-gated-publication-PVDM](https://github.com/vaquarkhan/Proof-gated-publication-PVDM)
|
|
283
321
|
**Pattern spec:** [docs/vaquar-pattern.md](docs/vaquar-pattern.md) · **Full blog:** [docs/blog-the-vaquar-pattern.md](docs/blog-the-vaquar-pattern.md) · **Compute model:** [examples/durable-compute/](examples/durable-compute/)
|
|
284
322
|
|
|
285
323
|
---
|
|
286
324
|
|
|
287
325
|
## Durable Lambda compute model
|
|
288
326
|
|
|
289
|
-
**No idle EMR/Glue clusters
|
|
327
|
+
**No idle EMR/Glue clusters.** Domain writers run on **AWS Lambda** with **Durable Execution**, Firecracker isolation, **15–90 minute segments** (on-demand or [Managed Instances](https://aws.amazon.com/blogs/compute/announcing-90-minute-function-timeout-on-aws-lambda-managed-instances/)), and IceGuard so incomplete writes never corrupt Iceberg.
|
|
290
328
|
|
|
291
329
|
<p align="center">
|
|
292
330
|
<img src="docs/images/durable-lambda-compute-model.png" alt="Durable Lambda compute: Firecracker microVM, on-demand Lambda, dual clocks for per-invoke and durable budget" width="920" />
|
|
@@ -296,36 +334,42 @@ What makes this new vs Outbox, Saga, Medallion, and Glue bookmarks: **Iceberg pu
|
|
|
296
334
|
|------------|-------------|-------------------------|
|
|
297
335
|
| **Durable Lambda** | `@durable_execution` + Terraform `durable_config` | Glue ETL as the write path |
|
|
298
336
|
| **MicroVM isolation** | AWS Lambda on **Firecracker** microVMs (AWS-managed) | Custom Firecracker / self-managed microVMs |
|
|
299
|
-
| **On-demand compute** | **On-demand Lambda**
|
|
300
|
-
| **
|
|
337
|
+
| **On-demand compute** | **On-demand Lambda** (default, scale to zero) | Unmanaged EC2 / ASG fleets |
|
|
338
|
+
| **Managed Instances (opt-in)** | LMI capacity provider + timeout up to **90 min** async | Claiming sync invokes exceed 15 min |
|
|
339
|
+
| **Iceberg safety** | IceGuard rollback + VRP before metadata | “Job SUCCEEDED” as proof of integrity |
|
|
301
340
|
|
|
302
341
|
### Dual clocks (Terraform-tunable)
|
|
303
342
|
|
|
304
343
|
| Knob | tfvars / variable | Meaning | Limits |
|
|
305
344
|
|------|-------------------|---------|--------|
|
|
306
|
-
| **Container clock** | `lambda_timeout_seconds` | One Lambda invocation |
|
|
307
|
-
| **
|
|
345
|
+
| **Container clock** | `lambda_timeout_seconds` | One Lambda invocation | **15 min** on-demand · **up to 90 min** with LMI (async/ESM) |
|
|
346
|
+
| **Capacity mode** | `enable_lambda_managed_instances` | Attach LMI capacity provider | Opt-in; needs capacity provider ARN |
|
|
347
|
+
| **Workload clock** | `durable_execution_timeout_seconds` | Total durable budget across segments | **Any duration** you set (AWS up to ~1 year) |
|
|
308
348
|
| **IceGuard lead time** | `iceguard_rollback_threshold_ms` | Rollback before hard kill | Auto or explicit ms |
|
|
309
|
-
| **SFN resume** | `max_resume_attempts`, `resume_wait_seconds` | Re-invoke after `rolled_back` |
|
|
349
|
+
| **SFN resume** | `max_resume_attempts`, `resume_wait_seconds` | Re-invoke after `rolled_back` | Sync SFN invoke still ≤15 min |
|
|
310
350
|
|
|
311
351
|
```hcl
|
|
312
352
|
# infrastructure/terraform/environments/prod/terraform.tfvars (example)
|
|
313
353
|
enable_durable_execution = true
|
|
314
|
-
lambda_timeout_seconds = 900
|
|
315
|
-
|
|
354
|
+
lambda_timeout_seconds = 900 # 15 min on-demand (default)
|
|
355
|
+
# Optional industry-standard longer segments (async/ESM on LMI):
|
|
356
|
+
# enable_lambda_managed_instances = true
|
|
357
|
+
# lambda_managed_instances_capacity_provider_arn = "arn:aws:lambda:..."
|
|
358
|
+
# lambda_timeout_seconds = 5400 # up to 90 min
|
|
359
|
+
durable_execution_timeout_seconds = 10800 # set to your backfill wall-clock
|
|
316
360
|
lambda_memory_mb = 4096
|
|
317
|
-
iceguard_rollback_threshold_ms = 30000
|
|
361
|
+
iceguard_rollback_threshold_ms = 30000 # yield before hard timeout → no corrupt Iceberg
|
|
318
362
|
```
|
|
319
363
|
|
|
320
|
-
Long backfills = **many durable segments** (each ≤ `lambda_timeout_seconds`), not one forever-running process. IceGuard rolls back incomplete chunks; Durable SDK replays completed steps; Step Functions resumes on `rolled_back
|
|
364
|
+
Long backfills = **many durable segments** (each ≤ `lambda_timeout_seconds`), not one forever-running process. IceGuard rolls back incomplete chunks; Durable SDK replays completed steps; Step Functions resumes on `rolled_back`; metadata commits only after VRP PASS.
|
|
321
365
|
|
|
322
|
-
→ [Durable compute example](examples/durable-compute/README.md) · [Architecture](docs/architecture.md#durable-lambda-compute-model)
|
|
366
|
+
→ [Durable compute example](examples/durable-compute/README.md) · [LMI 15–90 min guide](docs/lambda-managed-instances.md) · [Architecture](docs/architecture.md#durable-lambda-compute-model)
|
|
323
367
|
|
|
324
368
|
---
|
|
325
369
|
|
|
326
370
|
## Verification & business rules
|
|
327
371
|
|
|
328
|
-
The Vaquar Pattern’s **Verify** phase is powered by [veridata-recon](https://pypi.org/project/veridata-recon/) on PyPI. Optional [SparkRules](https://pypi.org/project/sparkrules/) DRL runs **before** physical writes and VRP
|
|
372
|
+
The Vaquar Pattern’s **Verify** phase is powered by [veridata-recon](https://pypi.org/project/veridata-recon/) on PyPI. Optional [SparkRules](https://pypi.org/project/sparkrules/) DRL runs **before** physical writes and VRP - on Lambda, not Glue ETL.
|
|
329
373
|
|
|
330
374
|
### veridata-recon: VRP per chunk
|
|
331
375
|
|
|
@@ -348,7 +392,7 @@ proof = VRPProofGenerator().generate(source_rows, sink_rows, identity_fields=["p
|
|
|
348
392
|
validate_then_commit(proof) # raises if verdict != PASS
|
|
349
393
|
```
|
|
350
394
|
|
|
351
|
-
**Attacks blocked:** drop, duplicate, mutation, schema drift
|
|
395
|
+
**Attacks blocked:** drop, duplicate, mutation, schema drift - see the [consumer safety benchmark](eval/validate_then_commit_benchmark.py) (`make benchmark`).
|
|
352
396
|
|
|
353
397
|
→ [Vaquar Pattern invariant (image)](docs/blog-the-vaquar-pattern.md#4-the-vaquar-invariant) · [Observability: VRP metrics & S3 proofs](docs/observability-production.md)
|
|
354
398
|
|
|
@@ -362,12 +406,12 @@ Domain teams declare rules in YAML (`spark_rules_enabled: true`) or load Steward
|
|
|
362
406
|
|
|
363
407
|
| Mode | Install | When to use |
|
|
364
408
|
|------|---------|-------------|
|
|
365
|
-
| **Pure Python** | `pip install "serverless-data-mesh[rules]"` | Default
|
|
409
|
+
| **Pure Python** | `pip install "serverless-data-mesh[rules]"` | Default - sub-ms per fact, small Lambda zip |
|
|
366
410
|
| **PySpark on Lambda** | `pip install "serverless-data-mesh[spark]"` | Large partitions, same DRL at scale |
|
|
367
411
|
| **Steward governance** | `SPARKRULES_DRL_S3_URI=s3://steward-rules/...` | Central rule packs + `RuleFireSummary` audit lineage |
|
|
368
412
|
|
|
369
413
|
```yaml
|
|
370
|
-
# mesh.yaml excerpt
|
|
414
|
+
# mesh.yaml excerpt - compiler emits SparkRules hook in readers.py
|
|
371
415
|
runtime:
|
|
372
416
|
engine: pyarrow
|
|
373
417
|
package_extras: rules
|
|
@@ -409,7 +453,7 @@ enriched, audit = connector.apply_chunk(source_records)
|
|
|
409
453
|
<td width="50%" valign="top">
|
|
410
454
|
|
|
411
455
|
### Serverless at scale
|
|
412
|
-
- 15-min Lambda segments
|
|
456
|
+
- 15-min Lambda segments chained to a configurable total runtime (overcomes the AWS per-invoke limit)
|
|
413
457
|
- IceGuard watchdog rollback before hard timeout
|
|
414
458
|
- Durable step replay: no duplicate committed chunks
|
|
415
459
|
- Terraform-tunable `lambda_timeout_seconds`
|
|
@@ -448,7 +492,7 @@ enriched, audit = connector.apply_chunk(source_records)
|
|
|
448
492
|
|
|
449
493
|
## Create pipelines from YAML
|
|
450
494
|
|
|
451
|
-
**Metadata-driven pipeline creation**
|
|
495
|
+
**Metadata-driven pipeline creation** - define your mesh in YAML; the compiler generates proof-gated Lambda pipelines, Step Functions orchestrators, VRP config, consumer SLAs, and Terraform manifests. Domain teams only implement `readers.py` (source/sink I/O).
|
|
452
496
|
|
|
453
497
|
<p align="center">
|
|
454
498
|
<img src="docs/images/pipeline-creation-flow.png" alt="Metadata-driven pipeline creation: Write YAML, compile with serverless-data-mesh apply, deploy to AWS" width="920" />
|
|
@@ -509,7 +553,7 @@ serverless-data-mesh compile \
|
|
|
509
553
|
--output domains/
|
|
510
554
|
```
|
|
511
555
|
|
|
512
|
-
→ [Metadata-driven pipeline guide](docs/metadata-driven-pipeline.md) · [5-min AWS deploy](docs/first-mesh-on-aws.md) · [Medallion
|
|
556
|
+
→ [Metadata-driven pipeline guide](docs/metadata-driven-pipeline.md) · [5-min AWS deploy](docs/first-mesh-on-aws.md) · [Medallion example](examples/medallion-e2e/README.md)
|
|
513
557
|
|
|
514
558
|
---
|
|
515
559
|
|
|
@@ -556,7 +600,7 @@ serverless-data-mesh compile \
|
|
|
556
600
|
Event / Step Functions
|
|
557
601
|
│
|
|
558
602
|
▼
|
|
559
|
-
Lambda :live (15-min segments
|
|
603
|
+
Lambda :live (15-min segments; total budget = durable_execution_timeout_seconds)
|
|
560
604
|
│
|
|
561
605
|
├── Read source → domain-specific reader
|
|
562
606
|
├── SparkRules → optional DRL filter
|
|
@@ -579,7 +623,7 @@ Lambda :live (15-min segments, up to 90+ min total)
|
|
|
579
623
|
|
|
580
624
|
### Try in 60 seconds (no AWS)
|
|
581
625
|
|
|
582
|
-
Works on **Windows, Mac, and Linux**
|
|
626
|
+
Works on **Windows, Mac, and Linux** - pure-Python verifier fallback when Rust wheels unavailable.
|
|
583
627
|
|
|
584
628
|
```bash
|
|
585
629
|
pip install serverless-data-mesh
|
|
@@ -588,12 +632,12 @@ serverless-data-mesh demo
|
|
|
588
632
|
|
|
589
633
|
### Install from PyPI
|
|
590
634
|
|
|
591
|
-
**Package:** [`serverless-data-mesh`](https://pypi.org/project/serverless-data-mesh/) · **Requires Python 3.12+** · **Latest:** [1.
|
|
635
|
+
**Package:** [`serverless-data-mesh`](https://pypi.org/project/serverless-data-mesh/) · **Requires Python 3.12+** · **Latest:** [1.3.0](https://pypi.org/project/serverless-data-mesh/1.3.0/)
|
|
592
636
|
|
|
593
637
|
| | Link |
|
|
594
638
|
|---|------|
|
|
595
639
|
| **PyPI project** | https://pypi.org/project/serverless-data-mesh/ |
|
|
596
|
-
| **Download files (1.
|
|
640
|
+
| **Download files (1.3.0)** | https://pypi.org/project/serverless-data-mesh/1.3.0/#files |
|
|
597
641
|
| **5-min AWS guide** | [docs/first-mesh-on-aws.md](docs/first-mesh-on-aws.md) |
|
|
598
642
|
|
|
599
643
|
**Recommended install (pip):**
|
|
@@ -603,7 +647,7 @@ serverless-data-mesh demo
|
|
|
603
647
|
pip install serverless-data-mesh
|
|
604
648
|
|
|
605
649
|
# Pin a version (recommended for production)
|
|
606
|
-
pip install serverless-data-mesh==1.
|
|
650
|
+
pip install serverless-data-mesh==1.3.0
|
|
607
651
|
|
|
608
652
|
# Upgrade
|
|
609
653
|
pip install -U serverless-data-mesh
|
|
@@ -732,18 +776,24 @@ outcome = coordinator.run_workload(workload)
|
|
|
732
776
|
|
|
733
777
|
## Deploy to AWS
|
|
734
778
|
|
|
779
|
+
**Prod-grade checklist (SNS confirm + alarms + smoke):** [docs/aws-production-deploy.md](docs/aws-production-deploy.md)
|
|
780
|
+
|
|
735
781
|
```bash
|
|
736
782
|
./infrastructure/terraform/scripts/package_lambda.sh
|
|
737
783
|
cd infrastructure/terraform/environments/prod
|
|
784
|
+
cp terraform.tfvars.example terraform.tfvars
|
|
785
|
+
# set unique buckets + ops_alert_emails, then:
|
|
738
786
|
terraform init && terraform apply
|
|
787
|
+
# Confirm the SNS subscription email before go-live
|
|
739
788
|
```
|
|
740
789
|
|
|
741
790
|
| Path | Use when |
|
|
742
791
|
|------|----------|
|
|
743
|
-
| **[
|
|
792
|
+
| **[AWS production deploy](docs/aws-production-deploy.md)** | SNS, SFN alarms, DLQ IAM, smoke scripts, runbook |
|
|
793
|
+
| **[Terraform (production)](infrastructure/terraform/README.md)** | Step Functions, DLQ, SNS, monitoring, dual clocks |
|
|
744
794
|
| [Multi-account mesh](infrastructure/terraform/environments/multi-account/README.md) | Producer / Steward / Publisher across AWS accounts |
|
|
745
795
|
| [SAM alternative](infrastructure/sam/README.md) | SAM-native teams |
|
|
746
|
-
| [Deployment guide](docs/deployment.md) |
|
|
796
|
+
| [Deployment guide](docs/deployment.md) | Env vars / IAM summary |
|
|
747
797
|
|
|
748
798
|
→ [Terraform step-by-step](docs/terraform-guide.md)
|
|
749
799
|
|
|
@@ -754,19 +804,22 @@ terraform init && terraform apply
|
|
|
754
804
|
| Document | What you will learn |
|
|
755
805
|
|----------|---------------------|
|
|
756
806
|
| **[Metadata-driven pipelines](docs/metadata-driven-pipeline.md)** | **Complete guide: YAML schema, bronze/silver/gold, compile, deploy** |
|
|
807
|
+
| **[Vaquar Pattern (proprietary method)](docs/vaquar-pattern.md)** | Formal PVDM spec - cite this; inventor attribution |
|
|
808
|
+
| **[PVDM paper (arXiv:2608.14643)](https://arxiv.org/abs/2608.14643)** | Proof-gated publication preprint (methods + evaluation) |
|
|
809
|
+
| **[PVDM reference gate](https://github.com/vaquarkhan/Proof-gated-publication-PVDM)** | Stdlib gate + 30-case adversarial suite + Spark benchmarks |
|
|
757
810
|
| **[Visual tutorial (GIFs)](docs/visual-tutorial.md)** | Step-by-step animated walkthrough + control UI Tutorial tab |
|
|
758
|
-
| **[
|
|
759
|
-
| **[
|
|
811
|
+
| **[Durable compute example](examples/durable-compute/README.md)** | 15–90 min segments, Durable, IceGuard, tfvars |
|
|
812
|
+
| **[Lambda Managed Instances](docs/lambda-managed-instances.md)** | Opt-in LMI up to 90 min async; Iceberg safety |
|
|
760
813
|
| **[Observability (production)](docs/observability-production.md)** | Structured logs, VRP S3 proofs, CloudWatch dashboard, DLQ smoke tests |
|
|
761
|
-
| **[Medallion
|
|
814
|
+
| **[Medallion example](examples/medallion-e2e/README.md)** | One YAML → 6 pipelines + orchestrators |
|
|
762
815
|
| **[Retail flat ETL example](examples/retail-mesh/README.md)** | 5 domain pipelines, PySpark on Lambda |
|
|
763
|
-
| **[Vaquar Pattern blog](docs/blog-the-vaquar-pattern.md)** |
|
|
816
|
+
| **[Vaquar Pattern blog](docs/blog-the-vaquar-pattern.md)** | Full article: images, journey, adoption playbook |
|
|
764
817
|
| **[Vaquar Pattern spec](docs/vaquar-pattern.md)** | Formal spec - cite this in architecture docs |
|
|
765
818
|
| **[Why Serverless Data Mesh](docs/why-serverless-data-mesh.md)** | Blog: industry problem, connectivity, portfolio stack |
|
|
766
819
|
| **[Data mesh patterns](docs/data-mesh-patterns.md)** | 13 named patterns + concept coverage matrix |
|
|
767
|
-
| **[
|
|
820
|
+
| **[Multi-account deploy guide](docs/data-mesh-end-to-end.md)** | Three-account journey, IAM, deploy order |
|
|
768
821
|
| [Getting started](docs/getting-started.md) | Hands-on tutorial for domain engineers |
|
|
769
|
-
| [Architecture](docs/architecture.md) | Components, failure modes,
|
|
822
|
+
| [Architecture](docs/architecture.md) | Components, failure modes, configurable durable execution |
|
|
770
823
|
| **[Due diligence: claims vs repo](docs/due-diligence-architecture-claims.md)** | What is shipped vs overstated vs roadmap (PVDM-A / MCP) |
|
|
771
824
|
| [PVDM-A / Agentic roadmap](docs/roadmap-pvdm-a-agentic.md) | Decision attestation + MCP plan (not shipped yet) |
|
|
772
825
|
| [Glue connector](docs/glue-connector.md) | Lambda + Spark vs Glue ETL |
|
|
@@ -782,10 +835,11 @@ terraform init && terraform apply
|
|
|
782
835
|
serverless-data-mesh/
|
|
783
836
|
├── docs/
|
|
784
837
|
│ ├── metadata-driven-pipeline.md # Complete YAML → pipeline guide (medallion)
|
|
785
|
-
│ ├── blog-the-vaquar-pattern.md # Full Vaquar Pattern blog (images
|
|
838
|
+
│ ├── blog-the-vaquar-pattern.md # Full Vaquar Pattern blog (images)
|
|
786
839
|
│ ├── vaquar-pattern.md # Formal pattern spec (cite this)
|
|
787
840
|
│ ├── why-serverless-data-mesh.md # Blog article with diagrams
|
|
788
841
|
│ ├── data-mesh-end-to-end.md # Three-account deploy guide
|
|
842
|
+
│ ├── aws-production-deploy.md # SNS, alarms, smoke, runbook
|
|
789
843
|
│ ├── data-mesh-patterns.md # Pattern catalog + coverage matrix
|
|
790
844
|
│ ├── observability-production.md # VRP logs, metrics, S3 proofs, DLQ
|
|
791
845
|
│ └── images/ # Architecture and product diagrams
|
|
@@ -838,16 +892,20 @@ make pre-commit # Local quality gates
|
|
|
838
892
|
|
|
839
893
|
## License
|
|
840
894
|
|
|
841
|
-
Apache-2.0. See [LICENSE](LICENSE).
|
|
895
|
+
Apache-2.0 for the reference implementation code. See [LICENSE](LICENSE).
|
|
896
|
+
|
|
897
|
+
**PVDM / Vaquar Pattern** is a **proprietary method** of **Vaquar Khan** (© 2024–2026). See [NOTICE](NOTICE) and [docs/vaquar-pattern.md](docs/vaquar-pattern.md).
|
|
898
|
+
|
|
899
|
+
**Paper:** [arXiv:2608.14643](https://arxiv.org/abs/2608.14643) · **Reference gate + suite:** [Proof-gated-publication-PVDM](https://github.com/vaquarkhan/Proof-gated-publication-PVDM)
|
|
842
900
|
|
|
843
901
|
---
|
|
844
902
|
|
|
845
903
|
<div align="center">
|
|
846
904
|
|
|
847
|
-
**Serverless Data Mesh** · [PyPI](https://pypi.org/project/serverless-data-mesh/) · [Vaquar Pattern blog](docs/blog-the-vaquar-pattern.md) · [GitHub](https://github.com/vaquarkhan/aws-serverless-datamesh-framework)
|
|
905
|
+
**Serverless Data Mesh** · [PyPI](https://pypi.org/project/serverless-data-mesh/) · [Paper](https://arxiv.org/abs/2608.14643) · [Vaquar Pattern blog](docs/blog-the-vaquar-pattern.md) · [GitHub](https://github.com/vaquarkhan/aws-serverless-datamesh-framework)
|
|
848
906
|
|
|
849
907
|
*Domain teams own the write path. The mesh proves correctness before consumers see a snapshot.*
|
|
850
908
|
|
|
851
|
-
*Vaquar Pattern (PVDM)
|
|
909
|
+
*Vaquar Pattern (PVDM) - © 2024–2026 Vaquar Khan · proprietary method · reference implementation Apache-2.0 · see [NOTICE](NOTICE)*
|
|
852
910
|
|
|
853
911
|
</div>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.3.0
|