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.
Files changed (292) hide show
  1. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/CHANGELOG.md +14 -0
  2. serverless_data_mesh-1.3.0/NOTICE +14 -0
  3. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/PKG-INFO +8 -3
  4. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/PYPI.md +5 -1
  5. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/README.md +127 -69
  6. serverless_data_mesh-1.3.0/VERSION +1 -0
  7. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/architecture.md +25 -17
  8. serverless_data_mesh-1.3.0/docs/aws-production-deploy.md +184 -0
  9. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/blog-the-vaquar-pattern.md +15 -13
  10. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/data-mesh-end-to-end.md +13 -11
  11. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/data-mesh-patterns.md +6 -5
  12. serverless_data_mesh-1.3.0/docs/deployment.md +65 -0
  13. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/due-diligence-architecture-claims.md +15 -0
  14. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/getting-started.md +1 -1
  15. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/how-to-start.md +2 -2
  16. serverless_data_mesh-1.3.0/docs/images/durable-lambda-compute-model.png +0 -0
  17. serverless_data_mesh-1.3.0/docs/images/lambda-execution-flow.png +0 -0
  18. serverless_data_mesh-1.3.0/docs/images/pvdm-fail-closed-vs-traditional.png +0 -0
  19. serverless_data_mesh-1.3.0/docs/images/pvdm-lifecycle-readme.png +0 -0
  20. serverless_data_mesh-1.3.0/docs/lambda-managed-instances.md +65 -0
  21. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/terraform-guide.md +12 -9
  22. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/vaquar-pattern.md +41 -12
  23. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/why-serverless-data-mesh.md +9 -9
  24. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/domain_writer/handler.py +8 -1
  25. serverless_data_mesh-1.3.0/examples/domain_writer/io.py +72 -0
  26. serverless_data_mesh-1.3.0/examples/durable-compute/README.md +53 -0
  27. serverless_data_mesh-1.3.0/examples/durable-compute/terraform.tfvars.example +20 -0
  28. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/README.md +16 -7
  29. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/dev/main.tf +19 -3
  30. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/dev/terraform.tfvars.example +3 -1
  31. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/medallion/main.tf +39 -3
  32. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/medallion/outputs.tf +13 -2
  33. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/medallion/terraform.tfvars.example +8 -0
  34. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/medallion/variables.tf +36 -4
  35. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/multi-account/producer/main.tf +18 -3
  36. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/multi-account/producer/terraform.tfvars.example +5 -0
  37. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/prod/main.tf +69 -20
  38. serverless_data_mesh-1.3.0/infrastructure/terraform/environments/prod/outputs.tf +76 -0
  39. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/prod/terraform.tfvars.example +17 -6
  40. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/prod/variables.tf +49 -6
  41. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/iam/main.tf +36 -0
  42. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/iam/variables.tf +12 -0
  43. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/lambda/main.tf +13 -0
  44. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/lambda/outputs.tf +7 -2
  45. serverless_data_mesh-1.3.0/infrastructure/terraform/modules/lambda/variables.tf +136 -0
  46. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/lambda-fleet/main.tf +13 -0
  47. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/monitoring/dashboard.tf +2 -0
  48. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/monitoring/main.tf +61 -1
  49. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/monitoring/outputs.tf +2 -0
  50. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/monitoring/variables.tf +18 -0
  51. serverless_data_mesh-1.3.0/infrastructure/terraform/modules/sns/main.tf +27 -0
  52. serverless_data_mesh-1.3.0/infrastructure/terraform/modules/sns/outputs.tf +13 -0
  53. serverless_data_mesh-1.3.0/infrastructure/terraform/modules/sns/variables.tf +40 -0
  54. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/stepfunctions/variables.tf +4 -3
  55. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/pyproject.toml +2 -0
  56. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/attestation/pvdma.py +2 -0
  57. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/contract.py +1 -1
  58. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/emit.py +6 -2
  59. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/medallion_emit.py +3 -1
  60. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/dashboard/trust.py +5 -2
  61. serverless_data_mesh-1.3.0/src/serverless_data_mesh/execution_timeouts.py +161 -0
  62. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/local/runtime.py +62 -6
  63. serverless_data_mesh-1.3.0/src/serverless_data_mesh/observability/__init__.py +19 -0
  64. serverless_data_mesh-1.3.0/src/serverless_data_mesh/observability/sns_notify.py +121 -0
  65. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/orchestration/coordinator.py +65 -2
  66. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/orchestration/durable_steps.py +46 -2
  67. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/orchestration/state.py +6 -0
  68. serverless_data_mesh-1.3.0/src/serverless_data_mesh/pvdm_copyright.py +40 -0
  69. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/ui/data.py +8 -3
  70. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/ui/static/app.css +9 -0
  71. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/ui/static/app.js +2 -0
  72. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/ui/static/index.html +6 -1
  73. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/verification/__init__.py +26 -0
  74. serverless_data_mesh-1.3.0/src/serverless_data_mesh/verification/commit_gate.py +258 -0
  75. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/verification/fallback.py +31 -0
  76. serverless_data_mesh-1.3.0/src/serverless_data_mesh/verification/nonce_ledger.py +98 -0
  77. serverless_data_mesh-1.3.0/src/serverless_data_mesh/verification/pvdm_primitives.py +252 -0
  78. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/verification/vrp.py +31 -0
  79. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/conftest.py +7 -0
  80. serverless_data_mesh-1.3.0/tests/unit/test_commit_gate.py +185 -0
  81. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_coverage_new_modules.py +3 -0
  82. serverless_data_mesh-1.3.0/tests/unit/test_execution_timeouts.py +137 -0
  83. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_metrics.py +19 -0
  84. serverless_data_mesh-1.3.0/tests/unit/test_sns_notify.py +100 -0
  85. serverless_data_mesh-1.2.0/VERSION +0 -1
  86. serverless_data_mesh-1.2.0/docs/deployment.md +0 -42
  87. serverless_data_mesh-1.2.0/docs/images/durable-lambda-compute-model.png +0 -0
  88. serverless_data_mesh-1.2.0/docs/images/lambda-execution-flow.png +0 -0
  89. serverless_data_mesh-1.2.0/examples/domain_writer/io.py +0 -33
  90. serverless_data_mesh-1.2.0/examples/durable-compute/README.md +0 -81
  91. serverless_data_mesh-1.2.0/examples/durable-compute/terraform.tfvars.example +0 -11
  92. serverless_data_mesh-1.2.0/infrastructure/terraform/environments/prod/outputs.tf +0 -61
  93. serverless_data_mesh-1.2.0/infrastructure/terraform/modules/lambda/variables.tf +0 -90
  94. serverless_data_mesh-1.2.0/src/serverless_data_mesh/observability/__init__.py +0 -5
  95. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/.gitignore +0 -0
  96. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/LICENSE +0 -0
  97. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/README.md +0 -0
  98. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/results/2026-06-baseline.json +0 -0
  99. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/run_aws_benchmark.py +0 -0
  100. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/run_benchmark.sh +0 -0
  101. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/run_cost_estimate.py +0 -0
  102. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/run_local_benchmark.py +0 -0
  103. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/workloads/100k_rows.py +0 -0
  104. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/workloads/10m_rows.py +0 -0
  105. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/benchmarks/workloads/1m_rows.py +0 -0
  106. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/demo-walkthrough.html +0 -0
  107. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/domain-contracts.md +0 -0
  108. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/first-mesh-on-aws.md +0 -0
  109. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/glue-connector.md +0 -0
  110. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/medallion-one-yaml-mesh.png +0 -0
  111. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/pipeline-creation-flow.png +0 -0
  112. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/pipeline-generated-artifacts.png +0 -0
  113. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/portfolio-stack-veridata-sparkrules.png +0 -0
  114. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/serverless-data-mesh-hero.png +0 -0
  115. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/sparkrules-pipeline-position.png +0 -0
  116. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/three-account-data-mesh.png +0 -0
  117. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-01-install-demo.gif +0 -0
  118. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-01-install-demo.png +0 -0
  119. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-02-new-mesh.gif +0 -0
  120. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-02-new-mesh.png +0 -0
  121. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-03-apply.gif +0 -0
  122. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-03-apply.png +0 -0
  123. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-04-ui.gif +0 -0
  124. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-04-ui.png +0 -0
  125. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-05-deploy.gif +0 -0
  126. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-05-deploy.png +0 -0
  127. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-06-observe.gif +0 -0
  128. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/step-06-observe.png +0 -0
  129. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/tutorial/tutorial-overview.gif +0 -0
  130. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/vaquar-pattern-blog-hero.png +0 -0
  131. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/vaquar-pattern-e2e-journey.png +0 -0
  132. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/vaquar-pattern-invariant.png +0 -0
  133. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/vaquar-pattern-proprietary-pvdm.png +0 -0
  134. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/veridata-vrp-chunk-proof.png +0 -0
  135. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/why-sdm-four-phase-connectivity.png +0 -0
  136. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/why-sdm-hero-connectivity.png +0 -0
  137. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/images/why-sdm-trust-gap.png +0 -0
  138. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/mesh-trust-dashboard.md +0 -0
  139. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/metadata-driven-pipeline.md +0 -0
  140. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/observability-production.md +0 -0
  141. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/portable-multi-cloud.md +0 -0
  142. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/pypi.md +0 -0
  143. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/roadmap-pvdm-a-agentic.md +0 -0
  144. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/sparkrules-connector.md +0 -0
  145. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/docs/visual-tutorial.md +0 -0
  146. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/__init__.py +0 -0
  147. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/contracts/payments.mesh.pipeline.yaml +0 -0
  148. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/domain_writer/README.md +0 -0
  149. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/domain_writer/__init__.py +0 -0
  150. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/domain_writer/rules_io.py +0 -0
  151. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/domain_writer/spark_io.py +0 -0
  152. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/domain_writer/workload.py +0 -0
  153. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/medallion-e2e/README.md +0 -0
  154. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/medallion-e2e/northstar.mesh.yaml +0 -0
  155. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/multi-domain-orders-payments/README.md +0 -0
  156. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/multi-domain-orders-payments/coordinator_config.yaml +0 -0
  157. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/multi-domain-orders-payments/test_atomicity.py +0 -0
  158. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/README.md +0 -0
  159. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/compile_all.py +0 -0
  160. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/contracts/customers.mesh.pipeline.yaml +0 -0
  161. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/contracts/inventory.mesh.pipeline.yaml +0 -0
  162. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/contracts/orders.mesh.pipeline.yaml +0 -0
  163. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/contracts/payments.mesh.pipeline.yaml +0 -0
  164. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/contracts/shipping.mesh.pipeline.yaml +0 -0
  165. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/mesh-registry.yaml +0 -0
  166. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/mesh-transactions/daily-close.yaml +0 -0
  167. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/retail-mesh/spark/orders_readers.example.py +0 -0
  168. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/tutorials/README.md +0 -0
  169. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/tutorials/verification_gate_demo.py +0 -0
  170. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/examples/tutorials/walkthrough.py +0 -0
  171. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/grafana/mesh-trust-dashboard.json +0 -0
  172. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/sam/README.md +0 -0
  173. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/sam/template.yaml +0 -0
  174. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/medallion/providers.tf +0 -0
  175. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/medallion/versions.tf +0 -0
  176. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/multi-account/README.md +0 -0
  177. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/multi-account/publisher/main.tf +0 -0
  178. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/multi-account/publisher/terraform.tfvars.example +0 -0
  179. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/multi-account/steward/main.tf +0 -0
  180. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/multi-account/steward/terraform.tfvars.example +0 -0
  181. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/prod/providers.tf +0 -0
  182. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/environments/prod/versions.tf +0 -0
  183. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/eventbridge/main.tf +0 -0
  184. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/eventbridge/outputs.tf +0 -0
  185. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/eventbridge/variables.tf +0 -0
  186. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/eventbridge/versions.tf +0 -0
  187. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/governance/main.tf +0 -0
  188. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/governance/versions.tf +0 -0
  189. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/iam/outputs.tf +0 -0
  190. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/iam/versions.tf +0 -0
  191. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/lambda/versions.tf +0 -0
  192. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/lambda-fleet/outputs.tf +0 -0
  193. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/medallion-mesh/main.tf +0 -0
  194. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/medallion-mesh/outputs.tf +0 -0
  195. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/messaging/main.tf +0 -0
  196. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/messaging/outputs.tf +0 -0
  197. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/messaging/variables.tf +0 -0
  198. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/messaging/versions.tf +0 -0
  199. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/monitoring/versions.tf +0 -0
  200. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/stepfunctions/main.tf +0 -0
  201. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/stepfunctions/outputs.tf +0 -0
  202. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/stepfunctions/state_machine.asl.json.tpl +0 -0
  203. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/stepfunctions/versions.tf +0 -0
  204. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/storage/main.tf +0 -0
  205. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/storage/outputs.tf +0 -0
  206. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/storage/variables.tf +0 -0
  207. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/modules/storage/versions.tf +0 -0
  208. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/scripts/package_lambda.ps1 +0 -0
  209. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/infrastructure/terraform/scripts/package_lambda.sh +0 -0
  210. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/integrations/backstage/README.md +0 -0
  211. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/schemas/sdm-v1-dataproductpipeline.json +0 -0
  212. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/schemas/sdm-v1-medallionmesh.json +0 -0
  213. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/__init__.py +0 -0
  214. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/attestation/__init__.py +0 -0
  215. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/catalog/__init__.py +0 -0
  216. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/catalog/glue_connector.py +0 -0
  217. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/catalog/glue_rest.py +0 -0
  218. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/catalog_export/__init__.py +0 -0
  219. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/catalog_export/backstage.py +0 -0
  220. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/cli.py +0 -0
  221. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/__init__.py +0 -0
  222. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/from_init.py +0 -0
  223. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/loader.py +0 -0
  224. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/medallion.py +0 -0
  225. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/medallion_validate.py +0 -0
  226. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/runtime.py +0 -0
  227. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/validate.py +0 -0
  228. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/compile/wizard.py +0 -0
  229. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/config.py +0 -0
  230. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/dashboard/__init__.py +0 -0
  231. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/dashboard/cloudwatch.py +0 -0
  232. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/deploy/__init__.py +0 -0
  233. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/deploy/runner.py +0 -0
  234. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/exceptions.py +0 -0
  235. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/governance/__init__.py +0 -0
  236. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/governance/consumer_sla.py +0 -0
  237. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/lineage/__init__.py +0 -0
  238. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/lineage/openlineage.py +0 -0
  239. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/local/__init__.py +0 -0
  240. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/metrics/__init__.py +0 -0
  241. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/metrics/mesh_trust.py +0 -0
  242. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/observability/structured.py +0 -0
  243. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/orchestration/__init__.py +0 -0
  244. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/orchestration/canary.py +0 -0
  245. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/orchestration/reprocess.py +0 -0
  246. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/portable/__init__.py +0 -0
  247. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/portable/cloud.py +0 -0
  248. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/py.typed +0 -0
  249. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/readers/__init__.py +0 -0
  250. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/readers/s3_bronze.py +0 -0
  251. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/readers/upstream_parquet.py +0 -0
  252. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/rules/__init__.py +0 -0
  253. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/rules/gate.py +0 -0
  254. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/rules/sparkrules_connector.py +0 -0
  255. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/scaffold/__init__.py +0 -0
  256. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/scaffold/init_domain.py +0 -0
  257. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/templates/medallion-starter.mesh.yaml +0 -0
  258. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/templates/single-pipeline.mesh.yaml +0 -0
  259. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/types/__init__.py +0 -0
  260. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/types/workload.py +0 -0
  261. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/ui/__init__.py +0 -0
  262. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/ui/server.py +0 -0
  263. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/verification/backend.py +0 -0
  264. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/src/serverless_data_mesh/verification/kms_sign.py +0 -0
  265. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/__init__.py +0 -0
  266. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/eval/test_consumer_safety.py +0 -0
  267. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/__init__.py +0 -0
  268. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_attestation_kms.py +0 -0
  269. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_auto_repair_demo.py +0 -0
  270. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_canary.py +0 -0
  271. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_catalog.py +0 -0
  272. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_catalog_export.py +0 -0
  273. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_cli_scaffold.py +0 -0
  274. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_compile.py +0 -0
  275. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_config.py +0 -0
  276. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_consumer_sla.py +0 -0
  277. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_deploy.py +0 -0
  278. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_example_workload.py +0 -0
  279. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_fallback_verifier.py +0 -0
  280. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_local_runtime.py +0 -0
  281. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_medallion.py +0 -0
  282. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_observability.py +0 -0
  283. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_openlineage.py +0 -0
  284. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_reference_readers.py +0 -0
  285. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_reprocess.py +0 -0
  286. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_schemas.py +0 -0
  287. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_sparkrules_connector.py +0 -0
  288. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_types.py +0 -0
  289. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_ui_server.py +0 -0
  290. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_verification.py +0 -0
  291. {serverless_data_mesh-1.2.0 → serverless_data_mesh-1.3.0}/tests/unit/test_version.py +0 -0
  292. {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.4
1
+ Metadata-Version: 2.5
2
2
  Name: serverless-data-mesh
3
- Version: 1.2.0
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 Execution + Step Functions (90+ min) |
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 Execution + Step Functions (90+ min) |
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
- <div align="center">
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
  [![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-blue.svg)](https://www.python.org/downloads/)
8
- [![PyPI](https://img.shields.io/pypi/v/serverless-data-mesh.svg)](https://pypi.org/project/serverless-data-mesh/)
8
+ [![PyPI version](https://img.shields.io/pypi/v/serverless-data-mesh.svg)](https://pypi.org/project/serverless-data-mesh/)
9
+ [![PyPI downloads/month](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypistats.org%2Fapi%2Fpackages%2Fserverless-data-mesh%2Frecent&query=%24.data.last_month&label=downloads%2Fmonth&color=blue)](https://pypistats.org/packages/serverless-data-mesh)
10
+ [![PyPI downloads/week](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypistats.org%2Fapi%2Fpackages%2Fserverless-data-mesh%2Frecent&query=%24.data.last_week&label=downloads%2Fweek&color=brightgreen)](https://pypistats.org/packages/serverless-data-mesh)
11
+ [![Docker](https://img.shields.io/badge/ghcr.io-serverless--data--mesh-blue?logo=docker)](https://github.com/vaquarkhan/aws-serverless-datamesh-framework/pkgs/container/serverless-data-mesh)
9
12
  [![License](https://img.shields.io/badge/license-Apache--2.0-green.svg)](LICENSE)
10
13
  [![AWS Lambda](https://img.shields.io/badge/AWS-Lambda%20%2B%20Durable%20Execution-orange.svg)](https://docs.aws.amazon.com/lambda/)
11
14
  [![Iceberg](https://img.shields.io/badge/Apache-Iceberg-00A4EF.svg)](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** · **Steward** notaries enforce **federated computational governance** · **Publisher** zones expose consumer-ready **Iceberg data products** to the mesh.
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/) · [**Walkthrough (in README)**](#how-to-start--walkthrough-gifs--benefits) · [**GIF gallery**](docs/visual-tutorial.md) · [**Durable compute**](examples/durable-compute/) · [**Vaquar Pattern**](docs/vaquar-pattern.md) · [**Deploy**](infrastructure/terraform/README.md)
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 — walkthrough (GIFs + benefits)
30
+ ## How to start - walkthrough (GIFs + benefits)
28
31
 
29
- Read this section in the README — no extra docs required.
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) — clean commit, corrupt blocked
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 — Install & prove the gate
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** — in &lt;60s, **no AWS** |
90
+ | **You get** | Clean write **commits**; corrupt write is **blocked** - in &lt;60s, **no AWS** |
88
91
  | **Benefit** | Proof that “pipeline succeeded” ≠ trustworthy data |
89
92
 
90
- ### Step 2 — Create mesh YAML
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 — not a central Glue ticket queue |
108
+ | **Benefit** | Domain teams own the contract - not a central Glue ticket queue |
106
109
 
107
- ### Step 3 — Apply (compile pipelines)
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 — Start the control center UI
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 — Deploy Durable Lambda (AWS)
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 — see examples/durable-compute/terraform.tfvars.example
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 (e.g. 900s × 5400s) |
160
- | **Benefit** | 90+ minute backfills without idle EMR/Glue clusters |
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 — Observe & attest
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 — consumers only see snapshots after **VRP PASS** |
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 (control center image)
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
- # Pull (after publish)
189
- docker pull ghcr.io/vaquarkhan/serverless-data-mesh:1.2.0
190
- docker run --rm -p 8765:8765 ghcr.io/vaquarkhan/serverless-data-mesh:1.2.0
191
- # → http://127.0.0.1:8765/
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
- # Or build locally
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
- **PyPI:** `pip install serverless-data-mesh==1.2.0`
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 Execution + Step Functions resume → **90+ minutes** |
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)** — a proprietary architectural method invented by **Vaquar Khan** for proof-gated serverless lakehouse publication.
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 — Physical Verify Durable Metadata" width="920" />
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** — `IceGuardDurableCoordinator` + IceGuard watchdog |
275
- | **Verify** | veridata-recon | VRP proof stored; `validate_then_commit` gate | **Yes** — PASS blocks FAIL before metadata |
276
- | **Durable** | AWS Durable SDK + Step Functions | 15-min segments → 90+ min workloads | **Yes** — `@durable_execution` + SFN resume |
277
- | **Metadata** | GlueCatalogConnector | Iceberg snapshot **only after** VRP PASS | **Yes** — proof-gated commit |
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. No EC2 on-demand fleet.** Domain writers run on **AWS Lambda** with **Durable Execution**, Firecracker isolation, and **fully configurable dual clocks**.
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** scaling (scale to zero) | EC2 on-demand / ASG fleets; provisioned concurrency (optional later) |
300
- | **Configurable time** | Per-invoke timeout **and** durable total budget | Fixed 15-min wall clock for the whole backfill |
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 | 1–**900** s (AWS hard max) |
307
- | **Workload clock** | `durable_execution_timeout_seconds` | Total durable budget across replays | Default **5400** s (90 min), up to ~1 year |
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` | Tunable |
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 # 15 min per segment
315
- durable_execution_timeout_seconds = 5400 # 90 min total durable budget
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 # yield 30s before timeout
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 — on Lambda, not Glue ETL.
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 — see the [consumer safety benchmark](eval/validate_then_commit_benchmark.py) (`make benchmark`).
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 — sub-ms per fact, small Lambda zip |
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 — compiler emits SparkRules hook in readers.py
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 → 90+ min backfills
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** — 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).
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 E2E example](examples/medallion-e2e/README.md)
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, up to 90+ min total)
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** — pure-Python verifier fallback when Rust wheels unavailable.
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.2.0](https://pypi.org/project/serverless-data-mesh/1.2.0/)
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.2.0)** | https://pypi.org/project/serverless-data-mesh/1.2.0/#files |
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.2.0
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
- | **[Terraform (production)](infrastructure/terraform/README.md)** | Step Functions, DLQ, monitoring, configurable timeouts |
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) | Manual Lambda / IAM setup |
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
- | **[Vaquar Pattern (proprietary method)](docs/vaquar-pattern.md)** | Formal PVDM spec — cite this; inventor attribution |
759
- | **[Durable compute example](examples/durable-compute/README.md)** | Lambda dual clocks, Firecracker, on-demand, tfvars |
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 E2E example](examples/medallion-e2e/README.md)** | One YAML → 6 pipelines + orchestrators |
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)** | **Full article: images, E2E journey, adoption playbook** |
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
- | **[End-to-end guide](docs/data-mesh-end-to-end.md)** | Three-account journey, IAM, deploy order |
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, 90-min execution |
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, E2E)
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) — proprietary method by Vaquar Khan · reference implementation Apache-2.0*
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