From 3eb8f415037142cc53ef9b48e463f8658f7e6d1e Mon Sep 17 00:00:00 2001 From: Sander van Hooft <7265703+sandervanhooft@users.noreply.github.com> Date: Fri, 13 Nov 2026 17:16:16 +0000 Subject: [PATCH] Link initial orders to subscriptions via relatedResources.subscriptionId Require vatly-api-python==0.1.0a3 from PyPI and read lines[].relatedResources.subscriptionId in link_order and reconcile_checkout. Report unresolved signup lines separately from historical plan lines. Release 0.1.0a3. Co-authored-by: Amp Amp-Thread-ID: https://ampcode.com/threads/T-01a1d5e3-961e-74df-837f-34c2eb0f5a62 --- CHANGELOG.md | 9 ++++- PORTING.md | 10 ++--- README.md | 16 ++++---- docs/Development.md | 13 ++---- docs/Subscriptions.md | 11 +++-- pyproject.toml | 9 ++--- scripts/check_package.py | 5 +-- src/vatly_fluent/__init__.py | 2 +- src/vatly_fluent/client.py | 24 ++++++----- src/vatly_fluent/linkage.py | 28 +++++++++---- tests/test_fluent.py | 38 +++++++++++++----- uv.lock | 18 +++------ vendor/README.md | 18 --------- vendor/SHA256SUMS | 1 - .../vatly_api_python-0.1.0a2-py3-none-any.whl | Bin 38207 -> 0 bytes 15 files changed, 107 insertions(+), 95 deletions(-) delete mode 100644 vendor/README.md delete mode 100644 vendor/SHA256SUMS delete mode 100644 vendor/vatly_api_python-0.1.0a2-py3-none-any.whl diff --git a/CHANGELOG.md b/CHANGELOG.md index 83e79da..96a9edb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,14 @@ # Changelog -## Unreleased +## 0.1.0a3 — 2026-11-13 +- Link initial orders to their subscriptions through + `lines[].relatedResources.subscriptionId` in `order.paid`/`checkout.paid` reactions + and `reconcile_checkout`. +- `reconcile_checkout` reports signup lines with a still-null `subscriptionId` as + `unresolved_line_ids`; `legacy_plan_ids` now lists only plan lines without + `relatedResources` (historical orders). +- Require `vatly-api-python==0.1.0a3` from PyPI; drop the vendored SDK wheel. - Refresh installation, European positioning and published-package documentation. ## 0.1.0a2 — 2026-11-12 diff --git a/PORTING.md b/PORTING.md index cb2e986..c6fdfd1 100644 --- a/PORTING.md +++ b/PORTING.md @@ -30,11 +30,11 @@ customer-binding fallback. `EntityRef(kind, id)` supports teams/users/organizati billing identities and cannot establish entitlement ownership. Drivers enforce immutable links and scope every lookup by tenant, storefront and API mode. -The original port targeted an earlier design of core -[PR #2910](https://github.com/sandervanhooft/vatlify/pull/2910). As of 2026-11-12, -that unmerged proposal instead adds nullable `relatedResources.subscriptionId` -and preserves `productType`/`productId`. This alpha does not consume the new field; -initial subscription linkage needs a separately tested compatibility update. +Core [PR #2910](https://github.com/sandervanhooft/vatlify/pull/2910) adds nullable +`lines[].relatedResources.subscriptionId` and preserves `productType`/`productId`. +Linkage reads that field (and `subscription` renewal product IDs) to link a checkout's +order to its subscriptions. A null `subscriptionId` on a signup line means core has +not resolved it yet; frozen webhook snapshots keep the original value. `subscription_plan` lines are preserved but never treated as subscription IDs. Quantity does not multiply subscription IDs; two checkout plan lines can produce distinct subscription IDs for the same plan. `reconcile_checkout` explicitly reads diff --git a/README.md b/README.md index a1d6dad..eddcbc1 100644 --- a/README.md +++ b/README.md @@ -15,10 +15,8 @@ transactions and jobs. Python 3.10+, fully typed, **async-first**. pip install vatly-fluent-python==0.1.0a2 vatly-api-python==0.1.0a2 ``` -For development, run `.agents/setup` or `uv sync --locked`. The retained versioned -wheel under `vendor/` pins the SDK for uv; normal package metadata depends on the -exact SDK version from PyPI. It is not copied into Fluent's wheel. -See [provenance](vendor/README.md). +For development, run `.agents/setup` or `uv sync --locked`. Both development and +package metadata use the exact SDK version from PyPI. ## First checkout @@ -69,11 +67,11 @@ falls back to `customerId`, which is only billing identity and may be shared or Metadata is correlation data, not authorization. A signed webhook authenticates Vatly's snapshot; it does not authorize a browser-provided entity ID. -Current linkage follows `productType="subscription"` lines and their subscription -IDs; `subscription_plan` lines remain plan references. The revised core PR #2910 -proposes additive `relatedResources.subscriptionId` instead of changing initial -product references. This alpha does not consume that new field yet: initial -subscription ownership remains unresolved. See the [compatibility notes](docs/Subscriptions.md). +Linkage follows each order line's `relatedResources.subscriptionId`, which names +the signup's subscription on the initial order, and `productType="subscription"` +renewal lines. `subscription_plan` product IDs remain plan references. A signed +`order.paid` snapshot can carry a null `subscriptionId`; reconcile the checkout to +read the current order. See [Subscriptions](docs/Subscriptions.md). Fluent never guesses a subscription from a customer, plan or quantity. ## Learn the integration diff --git a/docs/Development.md b/docs/Development.md index cf2e6cc..aafc6ca 100644 --- a/docs/Development.md +++ b/docs/Development.md @@ -50,15 +50,10 @@ imports and `py.typed`. These commands do not publish anything. ## Pinned SDK dependency -Development uses the SDK wheel in `vendor/`. Published Fluent metadata declares -the normal, exact PyPI dependency instead. Verify the pinned file before updating: - -```bash -sha256sum --check vendor/SHA256SUMS -``` - -Keep published wheels immutable. Use a new alpha version when dependency behavior -changes; do not silently replace a version's wheel. +Fluent pins one exact `vatly-api-python` version from PyPI in `pyproject.toml`; +`uv.lock` records its hashes. To move to a new SDK version, change the pin, run +`uv lock`, and run the full checks. Use a new Fluent alpha version when dependency +behavior changes. ## Documentation sync diff --git a/docs/Subscriptions.md b/docs/Subscriptions.md index 29f6297..3d178e2 100644 --- a/docs/Subscriptions.md +++ b/docs/Subscriptions.md @@ -87,10 +87,13 @@ async def example(vatly: Vatly): ``` Authorize the checkout and wrap local writes in your driver's transaction. Reads -follow checkout → order → distinct subscription IDs; repeated 404s remain pending. -This alpha reports plan-valued lines as `legacy_plan_ids` and does not consume the -proposed `relatedResources.subscriptionId` addition. A plan/customer match is -never an ownership fallback. Trial flows can lack `order.paid`, so reconciliation +follow checkout → order → distinct subscription IDs from each line's +`relatedResources.subscriptionId` and from `subscription` renewal lines; repeated +404s remain pending. A signup line whose `subscriptionId` is still null is +reported in `unresolved_line_ids`: core has not resolved that subscription yet, so +reconcile again later; it may never resolve. Plan lines on historical orders +without `relatedResources` are reported as `legacy_plan_ids`. A plan/customer +match is never an ownership fallback. Trial flows can lack `order.paid`, so reconciliation must be explicit. Unknown linkage must not grant access. [Subscription API reference](https://docs.vatly.com/api-reference/subscriptions) diff --git a/pyproject.toml b/pyproject.toml index 637b75b..0bf321b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,13 +4,13 @@ build-backend = "hatchling.build" [project] name = "vatly-fluent-python" -version = "0.1.0a2" +version = "0.1.0a3" description = "Framework-independent fluent billing integrations built on the Vatly Python SDK" keywords = ["vatly", "merchant-of-record", "billing", "payments", "subscriptions", "vat", "ai"] requires-python = ">=3.10" readme = "README.md" license = "MIT" -dependencies = ["vatly-api-python==0.1.0a2"] +dependencies = ["vatly-api-python==0.1.0a3"] classifiers = ["Development Status :: 3 - Alpha", "Typing :: Typed", "Programming Language :: Python :: 3"] [project.urls] @@ -31,14 +31,11 @@ dev = [ [tool.uv] required-version = ">=0.12.9" -[tool.uv.sources] -vatly-api-python = {path = "vendor/vatly_api_python-0.1.0a2-py3-none-any.whl"} - [tool.hatch.build.targets.wheel] packages = ["src/vatly_fluent"] [tool.hatch.build.targets.sdist] -include = ["src", "tests", "examples", "scripts", "vendor", "docs", "README.md", "PORTING.md", "CHANGELOG.md", "LICENSE", "pyproject.toml"] +include = ["src", "tests", "examples", "scripts", "docs", "README.md", "PORTING.md", "CHANGELOG.md", "LICENSE", "pyproject.toml"] [tool.pytest.ini_options] asyncio_mode = "auto" diff --git a/scripts/check_package.py b/scripts/check_package.py index 46da629..dde2a8e 100644 --- a/scripts/check_package.py +++ b/scripts/check_package.py @@ -1,4 +1,4 @@ -"""Isolated wheel installation including the unpublished SDK bootstrap.""" +"""Isolated wheel installation; the pinned SDK resolves from PyPI.""" import pathlib import subprocess @@ -6,12 +6,11 @@ root = pathlib.Path(__file__).resolve().parents[1] wheel = next((root / "dist").glob("*.whl")) -sdk = next((root / "vendor").glob("*.whl")) with tempfile.TemporaryDirectory() as tmp: env = pathlib.Path(tmp) / "venv" subprocess.run(["uv", "venv", str(env)], check=True) python = str(env / "bin/python") - subprocess.run(["uv", "pip", "install", "--python", python, str(sdk), str(wheel)], check=True) + subprocess.run(["uv", "pip", "install", "--python", python, str(wheel)], check=True) subprocess.run( [ python, diff --git a/src/vatly_fluent/__init__.py b/src/vatly_fluent/__init__.py index b308af8..17b79ec 100644 --- a/src/vatly_fluent/__init__.py +++ b/src/vatly_fluent/__init__.py @@ -27,7 +27,7 @@ from .handles import OrderHandle, SubscriptionHandle from .webhooks import WebhookProcessor -__version__ = "0.1.0a2" +__version__ = "0.1.0a3" __all__ = [ "Vatly", diff --git a/src/vatly_fluent/client.py b/src/vatly_fluent/client.py index c4c1924..65e417d 100644 --- a/src/vatly_fluent/client.py +++ b/src/vatly_fluent/client.py @@ -12,7 +12,7 @@ from .contracts import CustomerProfile, FluentError, LocalSubscription, Wiring, required from .customers import CustomerHandle, CustomerService from .handles import OrderHandle, SubscriptionHandle -from .linkage import link_order +from .linkage import link_order, subscription_ids from .webhooks import WebhookProcessor @@ -22,6 +22,7 @@ class CheckoutResolution: subscriptions: tuple[Subscription, ...] = () pending_subscription_ids: tuple[str, ...] = () legacy_plan_ids: tuple[str, ...] = () + unresolved_line_ids: tuple[str, ...] = () class TestHelpers: @@ -126,6 +127,9 @@ async def reconcile_checkout(self, id: str, *, attempts: int = 3) -> CheckoutRes Caller authorizes the checkout and runs own-record writes in a transaction. No customerId fallback and no plan->subscription guessing. A pending ID can remain absent forever when the core deliberately skips subscription start. + ``unresolved_line_ids`` are signup lines whose subscription core has not + resolved yet; they may resolve on a later call, or never. + ``legacy_plan_ids`` are plan lines on historical orders without a reference. """ if isinstance(attempts, bool) or not isinstance(attempts, int) or not 1 <= attempts <= 10: raise FluentError("attempts must be an integer between 1 and 10") @@ -142,12 +146,7 @@ async def reconcile_checkout(self, id: str, *, attempts: int = 3) -> CheckoutRes await link_order(self.wiring, record, order) found = [] pending = [] - ids = dict.fromkeys( - line.product_id - for line in order.lines - if line.product_type == "subscription" and line.product_id - ) - for sub_id in ids: + for sub_id in subscription_ids(order): for attempt in range(attempts): try: subscription = await self.api.subscriptions.get(sub_id) @@ -164,7 +163,14 @@ async def reconcile_checkout(self, id: str, *, attempts: int = 3) -> CheckoutRes dict.fromkeys( line.product_id for line in order.lines - if line.product_type == "subscription_plan" and line.product_id + if line.product_type == "subscription_plan" + and line.product_id + and line.related_resources is None ) ) - return CheckoutResolution(order, tuple(found), tuple(pending), legacy) + unresolved = tuple( + line.id + for line in order.lines + if line.related_resources is not None and not line.related_resources.subscription_id + ) + return CheckoutResolution(order, tuple(found), tuple(pending), legacy, unresolved) diff --git a/src/vatly_fluent/linkage.py b/src/vatly_fluent/linkage.py index 8c29aac..93c380e 100644 --- a/src/vatly_fluent/linkage.py +++ b/src/vatly_fluent/linkage.py @@ -31,14 +31,28 @@ async def link_order(wiring: Wiring, record: CheckoutRecord, order: Order) -> No await wiring.orders.update( order.id, {"entity": preserve_entity(existing.entity, record.entity)} ) - for line in order.lines: - # Never mistake historical subscription_plan IDs for subscription IDs. - if line.product_type != "subscription" or not line.product_id: - continue - await records.link(record.checkout_id, "subscription", line.product_id) + for sub_id in subscription_ids(order): + await records.link(record.checkout_id, "subscription", sub_id) if wiring.subscriptions: - sub = await wiring.subscriptions.find_by_vatly_id(line.product_id) + sub = await wiring.subscriptions.find_by_vatly_id(sub_id) if sub: await wiring.subscriptions.update( - line.product_id, {"entity": preserve_entity(sub.entity, record.entity)} + sub_id, {"entity": preserve_entity(sub.entity, record.entity)} ) + + +def subscription_ids(order: Order) -> tuple[str, ...]: + """Distinct subscription IDs the order's lines reference, in line order. + + Signup lines carry their subscription in ``relatedResources.subscriptionId`` + (null until core resolves it); renewal lines also reference it as their + product. A ``subscription_plan`` product ID is a plan, never a subscription. + """ + ids: dict[str, None] = {} + for line in order.lines: + related = line.related_resources + if related is not None and related.subscription_id: + ids[related.subscription_id] = None + if line.product_type == "subscription" and line.product_id: + ids[line.product_id] = None + return tuple(ids) diff --git a/tests/test_fluent.py b/tests/test_fluent.py index 0a935e6..e215026 100644 --- a/tests/test_fluent.py +++ b/tests/test_fluent.py @@ -176,9 +176,14 @@ async def test_out_of_order_own_record_linkage_not_customer_id(harness, order_of await db.checkouts.record(CheckoutRecord("checkout_a", TEAM, True)) await db.bindings.bind("customer_shared", "WRONG_ENTITY") order = resource("Order", id="order_a", customerId="customer_shared", status="paid") - order["lines"][0].update(productType="subscription", productId="subscription_a", quantity=3) + # Signup lines reference the plan; relatedResources names each line's subscription. + signup = {**order["lines"][0], "productType": "subscription_plan", "quantity": 3} + signup.update( + productId="subscription_plan_pro", relatedResources={"subscriptionId": "subscription_a"} + ) # Two plan lines may be the same plan, but own distinct subscription IDs. - order["lines"].append({**order["lines"][0], "id": "line_b", "productId": "subscription_b"}) + second = {**signup, "id": "line_b", "relatedResources": {"subscriptionId": "subscription_b"}} + order["lines"] = [signup, second] checkout = resource( "Checkout", id="checkout_a", orderId="order_a", customerId="customer_shared", status="paid" ) @@ -194,6 +199,7 @@ async def test_out_of_order_own_record_linkage_not_customer_id(harness, order_of assert (await db.orders.find_by_vatly_id("order_a")).entity == TEAM assert (await db.subscriptions.find_by_vatly_id("subscription_a")).entity == TEAM assert (await db.checkouts.find_for_resource("subscription", "subscription_b")).entity == TEAM + assert await db.checkouts.find_for_resource("subscription", "subscription_plan_pro") is None assert db.db.execute("SELECT COUNT(*) FROM webhook_calls").fetchone()[0] == 3 assert db.db.execute("SELECT COUNT(*) FROM outbox").fetchone()[0] == 5 assert not calls @@ -456,7 +462,7 @@ async def test_handles_use_remote_response_for_scheduled_swap_and_decimal_money( @pytest.mark.parametrize("delay_first", [False, True]) -async def test_reconcile_initial_subscription_ids_bounded_404_and_legacy( +async def test_reconcile_related_subscription_ids_bounded_404_unresolved_and_legacy( harness, monkeypatch, delay_first ): vatly, db, calls, responses = harness @@ -468,20 +474,26 @@ async def no_sleep(t): await db.checkouts.record(CheckoutRecord("checkout_a", TEAM, True)) order = resource("Order", id="order_a") line = order["lines"][0] + plan_line = {**line, "productType": "subscription_plan", "productId": "subscription_plan_pro"} order["lines"] = [ - {**line, "productType": "subscription", "productId": "subscription_a", "quantity": 7}, + {**plan_line, "quantity": 7, "relatedResources": {"subscriptionId": "subscription_a"}}, { **line, "id": "line_b", "productType": "subscription", "productId": "subscription_missing", + "relatedResources": {"subscriptionId": "subscription_missing"}, }, + # Historical plan lines: relatedResources omitted or null. + {**plan_line, "id": "line_c", "productId": "subscription_plan_legacy"}, { - **line, - "id": "line_c", - "productType": "subscription_plan", - "productId": "subscription_plan_legacy", + **plan_line, + "id": "line_d", + "productId": "subscription_plan_old", + "relatedResources": None, }, + # A signup whose subscription core has not resolved yet. + {**plan_line, "id": "line_e", "relatedResources": {"subscriptionId": None}}, ] responses.extend([resource("Checkout", id="checkout_a", orderId="order_a"), order]) if delay_first: @@ -492,9 +504,15 @@ async def no_sleep(t): result = await vatly.reconcile_checkout("checkout_a", attempts=2) assert [sub.id for sub in result.subscriptions] == ["subscription_a"] assert result.pending_subscription_ids == ("subscription_missing",) - assert result.legacy_plan_ids == ("subscription_plan_legacy",) - assert not any("subscription_plan_legacy" in str(call.url) for call in calls) + assert result.legacy_plan_ids == ("subscription_plan_legacy", "subscription_plan_old") + assert result.unresolved_line_ids == ("line_e",) + assert not any("subscription_plan" in str(call.url) for call in calls) + assert not responses assert (await db.checkouts.find_for_resource("subscription", "subscription_a")).entity == TEAM + assert ( + await db.checkouts.find_for_resource("subscription", "subscription_missing") + ).entity == TEAM + assert await db.checkouts.find_for_resource("subscription", "subscription_plan_pro") is None def test_state_boundaries(): diff --git a/uv.lock b/uv.lock index 06ba692..5e0b44b 100644 --- a/uv.lock +++ b/uv.lock @@ -1571,27 +1571,21 @@ wheels = [ [[package]] name = "vatly-api-python" -version = "0.1.0a2" -source = { path = "vendor/vatly_api_python-0.1.0a2-py3-none-any.whl" } +version = "0.1.0a3" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, { name = "pydantic" }, { name = "typing-extensions" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/24/06/3fe5113356153b6619552c6e0c7f33c6c7771d27fda2085172276edc26d8/vatly_api_python-0.1.0a3.tar.gz", hash = "sha256:aa8af3f52d6570a869aceb7a7c6ee64ddf85f124ed1bf504eabc28228b3ad07d", size = 112463, upload-time = "2026-11-13T16:59:55.29Z" } wheels = [ - { filename = "vatly_api_python-0.1.0a2-py3-none-any.whl", hash = "sha256:c85d3d4fdc6573820b0916010c8f968c2201bccdb50fc791d88274794b8fd774" }, -] - -[package.metadata] -requires-dist = [ - { name = "httpx", specifier = ">=0.27,<1" }, - { name = "pydantic", specifier = ">=2.11,<3" }, - { name = "typing-extensions", specifier = ">=4.12,<5" }, + { url = "https://files.pythonhosted.org/packages/32/d3/510c5b139fc8a180d82d0ae0dd7b6ccc46a732493bd4cdab198c47d5a5b9/vatly_api_python-0.1.0a3-py3-none-any.whl", hash = "sha256:436f4d2ec62a96fdb71fd8431996a69bb0358fd690d792df643a344ea961029b", size = 39347, upload-time = "2026-11-13T16:59:54.028Z" }, ] [[package]] name = "vatly-fluent-python" -version = "0.1.0a2" +version = "0.1.0a3" source = { editable = "." } dependencies = [ { name = "vatly-api-python" }, @@ -1608,7 +1602,7 @@ dev = [ ] [package.metadata] -requires-dist = [{ name = "vatly-api-python", path = "vendor/vatly_api_python-0.1.0a2-py3-none-any.whl" }] +requires-dist = [{ name = "vatly-api-python", specifier = "==0.1.0a3" }] [package.metadata.requires-dev] dev = [ diff --git a/vendor/README.md b/vendor/README.md deleted file mode 100644 index df8de19..0000000 --- a/vendor/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Pinned SDK development wheel - -`vatly_api_python-0.1.0a2-py3-none-any.whl` is built from the MIT-licensed -`vatly/vatly-api-python` 0.1.0a2 source at commit -`26adc74d8553238bcc94da2f650619de93e9cbd6`. See `SHA256SUMS` for exact wheel bytes. - -It lets standalone CI and fresh orbs use the pinned SDK -without a machine-relative sibling checkout. uv's -development source override uses this file; Fluent's wheel only contains -`vatly_fluent` and declares the ordinary `vatly-api-python==0.1.0a2` dependency. -The SDK wheel carries its own MIT license. Source is in the repository above. - -The SDK is now [published on PyPI](https://pypi.org/project/vatly-api-python/0.1.0a2/). -This retained development override is not used by ordinary PyPI installations. -To switch development to PyPI, remove the wheel and `[tool.uv.sources]` override, -run `uv lock`, and test index-based installation. -Do not rebuild or replace this version's wheel silently: bump the alpha version -when SDK behavior changes. Keep release tags and their provenance immutable. diff --git a/vendor/SHA256SUMS b/vendor/SHA256SUMS deleted file mode 100644 index 2e60b55..0000000 --- a/vendor/SHA256SUMS +++ /dev/null @@ -1 +0,0 @@ -c85d3d4fdc6573820b0916010c8f968c2201bccdb50fc791d88274794b8fd774 vendor/vatly_api_python-0.1.0a2-py3-none-any.whl diff --git a/vendor/vatly_api_python-0.1.0a2-py3-none-any.whl b/vendor/vatly_api_python-0.1.0a2-py3-none-any.whl deleted file mode 100644 index 038969afa0e499e0cdef82ddba98ddfca9792138..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38207 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