diff --git a/README.md b/README.md index 80c593c..25814c7 100644 --- a/README.md +++ b/README.md @@ -431,7 +431,6 @@ runtimes/ Peer runtime implementations, currently Python contracts/ OpenAPI-derived public SDK catalog and JSON schemas conformance/ Language-neutral cross-runtime fixtures examples/ Short HTTP client recipes -experiments/ Consumer-neutral provider proofs that are not published packages samples/ Runnable .NET and execution examples tests/ Unit, integration, conformance, and adapter suites qualification/ Versioned adapter qualification report and policy diff --git a/docs/concepts/generation-bound-retrieval.md b/docs/concepts/generation-bound-retrieval.md index 9821ba6..4754e31 100644 --- a/docs/concepts/generation-bound-retrieval.md +++ b/docs/concepts/generation-bound-retrieval.md @@ -58,7 +58,7 @@ those operations can be promoted into a credible portable contract. The Cloudflare service-reader topology gives the public query Worker no R2 binding. A separate non-public Worker alone binds the bucket and exposes only an authenticated, allowlisted read operation over a service binding. The query Worker fails closed when neither or both read modes are -configured. See the [reference implementation and proof harness](../../experiments/worker-r2-generation-projection). +configured. See the [reference implementation and proof harness](../../src/Vyral.Cloudflare/WorkerR2GenerationProjection). The consumer validation used a small synthetic corpus and does not establish representative traffic, production capacity, availability, cost, or provider observability. The public evidence diff --git a/qualification/retrieval-projection-qualification.json b/qualification/retrieval-projection-qualification.json index 17f253e..6bf08bc 100644 --- a/qualification/retrieval-projection-qualification.json +++ b/qualification/retrieval-projection-qualification.json @@ -2,7 +2,7 @@ "$schema": "https://openvyral.com/qualification/retrieval-projection-qualification.schema.json", "schemaVersion": "1.0", "coreContractVersion": "0.3.0", - "generatedAtUtc": "2026-08-27T18:41:00Z", + "generatedAtUtc": "2026-08-27T19:17:00Z", "qualificationExpiresAfterDays": 90, "adapters": [ { @@ -128,10 +128,10 @@ { "adapterId": "worker-r2-generation-direct", "displayName": "Cloudflare Worker/R2 generation-bound projection (direct R2)", - "implementation": "experiments/worker-r2-generation-projection/src/worker.mjs", + "implementation": "src/Vyral.Cloudflare/WorkerR2GenerationProjection/src/worker.mjs", "implementationArtifacts": [ { - "path": "experiments/worker-r2-generation-projection/src/worker.mjs", + "path": "src/Vyral.Cloudflare/WorkerR2GenerationProjection/src/worker.mjs", "sha256": "sha256:e9311869f2e671397b6f2a017882002bde33b46b9a78d4367d3e7ea192f0d6fc" } ], @@ -155,24 +155,24 @@ "evidence": [ { "kind": "unit_gate", - "observedAtUtc": "2026-08-27T18:38:00Z", - "expiresAtUtc": "2026-11-25T18:38:00Z", - "reference": "experiments/worker-r2-generation-projection/verify.mjs", + "observedAtUtc": "2026-08-27T19:15:12Z", + "expiresAtUtc": "2026-11-25T19:15:12Z", + "reference": "src/Vyral.Cloudflare/WorkerR2GenerationProjection/verify.mjs", "disclosure": "public", - "sourceCommit": "3f35a88b5e9d7e4e6840ab64dfe786fe612d14a2", - "sourceTreeDigest": "sha256:2663cd143a60fb2f54522116f9b63c9c5549f36073855e6b230d5ec770bd28f7", + "sourceCommit": "7db0be8d97b151752105c4efb54d6c06f04cfda0", + "sourceTreeDigest": "sha256:c49743c03747580a291cd1e032120fbf192264ddec456be8ff5010c6636a8fb6", "sourceDirty": false, "generationIds": [], "descriptorDigests": [] }, { "kind": "local_gate", - "observedAtUtc": "2026-08-27T18:38:00Z", - "expiresAtUtc": "2026-11-25T18:38:00Z", + "observedAtUtc": "2026-08-27T19:15:12Z", + "expiresAtUtc": "2026-11-25T19:15:12Z", "reference": "scripts/verify-worker-r2-generation-projection.py", "disclosure": "public", - "sourceCommit": "3f35a88b5e9d7e4e6840ab64dfe786fe612d14a2", - "sourceTreeDigest": "sha256:2663cd143a60fb2f54522116f9b63c9c5549f36073855e6b230d5ec770bd28f7", + "sourceCommit": "7db0be8d97b151752105c4efb54d6c06f04cfda0", + "sourceTreeDigest": "sha256:c49743c03747580a291cd1e032120fbf192264ddec456be8ff5010c6636a8fb6", "sourceDirty": false, "generationIds": [], "descriptorDigests": [] @@ -182,14 +182,14 @@ { "adapterId": "worker-r2-generation-service-reader", "displayName": "Cloudflare Worker/R2 generation-bound projection (service reader)", - "implementation": "experiments/worker-r2-generation-projection/src/worker.mjs + src/object-reader.mjs", + "implementation": "src/Vyral.Cloudflare/WorkerR2GenerationProjection/src/worker.mjs + src/object-reader.mjs", "implementationArtifacts": [ { - "path": "experiments/worker-r2-generation-projection/src/object-reader.mjs", + "path": "src/Vyral.Cloudflare/WorkerR2GenerationProjection/src/object-reader.mjs", "sha256": "sha256:9fe0cba9c743210314ef6a91d9306a867527a6267068f75108fd5d868bd15a28" }, { - "path": "experiments/worker-r2-generation-projection/src/worker.mjs", + "path": "src/Vyral.Cloudflare/WorkerR2GenerationProjection/src/worker.mjs", "sha256": "sha256:e9311869f2e671397b6f2a017882002bde33b46b9a78d4367d3e7ea192f0d6fc" } ], @@ -213,24 +213,24 @@ "evidence": [ { "kind": "unit_gate", - "observedAtUtc": "2026-08-27T18:38:00Z", - "expiresAtUtc": "2026-11-25T18:38:00Z", - "reference": "experiments/worker-r2-generation-projection/src/object-reader.mjs", + "observedAtUtc": "2026-08-27T19:15:12Z", + "expiresAtUtc": "2026-11-25T19:15:12Z", + "reference": "src/Vyral.Cloudflare/WorkerR2GenerationProjection/src/object-reader.mjs", "disclosure": "public", - "sourceCommit": "3f35a88b5e9d7e4e6840ab64dfe786fe612d14a2", - "sourceTreeDigest": "sha256:2663cd143a60fb2f54522116f9b63c9c5549f36073855e6b230d5ec770bd28f7", + "sourceCommit": "7db0be8d97b151752105c4efb54d6c06f04cfda0", + "sourceTreeDigest": "sha256:c49743c03747580a291cd1e032120fbf192264ddec456be8ff5010c6636a8fb6", "sourceDirty": false, "generationIds": [], "descriptorDigests": [] }, { "kind": "local_gate", - "observedAtUtc": "2026-08-27T18:38:00Z", - "expiresAtUtc": "2026-11-25T18:38:00Z", + "observedAtUtc": "2026-08-27T19:15:12Z", + "expiresAtUtc": "2026-11-25T19:15:12Z", "reference": "scripts/verify-worker-r2-generation-projection.py", "disclosure": "public", - "sourceCommit": "3f35a88b5e9d7e4e6840ab64dfe786fe612d14a2", - "sourceTreeDigest": "sha256:2663cd143a60fb2f54522116f9b63c9c5549f36073855e6b230d5ec770bd28f7", + "sourceCommit": "7db0be8d97b151752105c4efb54d6c06f04cfda0", + "sourceTreeDigest": "sha256:c49743c03747580a291cd1e032120fbf192264ddec456be8ff5010c6636a8fb6", "sourceDirty": false, "generationIds": [], "descriptorDigests": [] diff --git a/scripts/export-public-tree.py b/scripts/export-public-tree.py index 845e016..02c34c0 100755 --- a/scripts/export-public-tree.py +++ b/scripts/export-public-tree.py @@ -45,7 +45,6 @@ "contracts", "deploy", "examples", - "experiments", "packaging", "qualification", "runtimes", @@ -166,12 +165,12 @@ "examples/python/retrieval_migration.py", "examples/python/canonical_store_cutover.py", "examples/python/stateless_mcp_round_robin.py", - "experiments/worker-r2-generation-projection/README.md", - "experiments/worker-r2-generation-projection/package-lock.json", - "experiments/worker-r2-generation-projection/package.json", - "experiments/worker-r2-generation-projection/src/object-reader.mjs", - "experiments/worker-r2-generation-projection/src/worker.mjs", - "experiments/worker-r2-generation-projection/verify.mjs", + "src/Vyral.Cloudflare/WorkerR2GenerationProjection/README.md", + "src/Vyral.Cloudflare/WorkerR2GenerationProjection/package-lock.json", + "src/Vyral.Cloudflare/WorkerR2GenerationProjection/package.json", + "src/Vyral.Cloudflare/WorkerR2GenerationProjection/src/object-reader.mjs", + "src/Vyral.Cloudflare/WorkerR2GenerationProjection/src/worker.mjs", + "src/Vyral.Cloudflare/WorkerR2GenerationProjection/verify.mjs", "LICENSE", "packaging/nuget/README.md", "packaging/container-security-release.json", diff --git a/scripts/verify-worker-r2-generation-projection.py b/scripts/verify-worker-r2-generation-projection.py index 9526317..8d28142 100755 --- a/scripts/verify-worker-r2-generation-projection.py +++ b/scripts/verify-worker-r2-generation-projection.py @@ -18,7 +18,7 @@ ROOT = Path(__file__).resolve().parent.parent -EXPERIMENT = ROOT / "experiments" / "worker-r2-generation-projection" +PROJECTION = ROOT / "src" / "Vyral.Cloudflare" / "WorkerR2GenerationProjection" CONTRACT_SCHEMA = ( ROOT / "src" @@ -460,13 +460,13 @@ def main() -> int: completed = subprocess.run( [ "node", - str(EXPERIMENT / "verify.mjs"), + str(PROJECTION / "verify.mjs"), "--bundle", str(bundle_path), "--mode", mode, ], - cwd=EXPERIMENT, + cwd=PROJECTION, check=False, stdout=subprocess.PIPE, text=True, @@ -485,9 +485,9 @@ def main() -> int: "status": "complete", "generation": generation, "implementation": { - "workerSha256": digest_bytes((EXPERIMENT / "src" / "worker.mjs").read_bytes()), + "workerSha256": digest_bytes((PROJECTION / "src" / "worker.mjs").read_bytes()), "objectReaderSha256": digest_bytes( - (EXPERIMENT / "src" / "object-reader.mjs").read_bytes() + (PROJECTION / "src" / "object-reader.mjs").read_bytes() ), }, "verification": { diff --git a/experiments/worker-r2-generation-projection/README.md b/src/Vyral.Cloudflare/WorkerR2GenerationProjection/README.md similarity index 90% rename from experiments/worker-r2-generation-projection/README.md rename to src/Vyral.Cloudflare/WorkerR2GenerationProjection/README.md index cfc2f97..febbb43 100644 --- a/experiments/worker-r2-generation-projection/README.md +++ b/src/Vyral.Cloudflare/WorkerR2GenerationProjection/README.md @@ -1,8 +1,8 @@ # Worker/R2 generation-bound projection -This experiment implements Vyral's optional generation-bound candidate contract on Cloudflare -Workers and R2. It is consumer-neutral reference code, not a published package or a portable index -file format. +This reference integration implements Vyral's optional generation-bound candidate contract on +Cloudflare Workers and R2. It is consumer-neutral reference code, not a published package or a +portable index file format. The query Worker: @@ -53,7 +53,7 @@ Install the exact locked dependency graph and exercise both topologies against a consumer-neutral fixture: ```shell -npm ci --ignore-scripts --prefix experiments/worker-r2-generation-projection +npm ci --ignore-scripts --prefix src/Vyral.Cloudflare/WorkerR2GenerationProjection python3 scripts/verify-worker-r2-generation-projection.py \ --output /tmp/vyral-worker-r2-proof.json ``` diff --git a/experiments/worker-r2-generation-projection/package-lock.json b/src/Vyral.Cloudflare/WorkerR2GenerationProjection/package-lock.json similarity index 100% rename from experiments/worker-r2-generation-projection/package-lock.json rename to src/Vyral.Cloudflare/WorkerR2GenerationProjection/package-lock.json diff --git a/experiments/worker-r2-generation-projection/package.json b/src/Vyral.Cloudflare/WorkerR2GenerationProjection/package.json similarity index 100% rename from experiments/worker-r2-generation-projection/package.json rename to src/Vyral.Cloudflare/WorkerR2GenerationProjection/package.json diff --git a/experiments/worker-r2-generation-projection/src/object-reader.mjs b/src/Vyral.Cloudflare/WorkerR2GenerationProjection/src/object-reader.mjs similarity index 100% rename from experiments/worker-r2-generation-projection/src/object-reader.mjs rename to src/Vyral.Cloudflare/WorkerR2GenerationProjection/src/object-reader.mjs diff --git a/experiments/worker-r2-generation-projection/src/worker.mjs b/src/Vyral.Cloudflare/WorkerR2GenerationProjection/src/worker.mjs similarity index 100% rename from experiments/worker-r2-generation-projection/src/worker.mjs rename to src/Vyral.Cloudflare/WorkerR2GenerationProjection/src/worker.mjs diff --git a/experiments/worker-r2-generation-projection/verify.mjs b/src/Vyral.Cloudflare/WorkerR2GenerationProjection/verify.mjs similarity index 100% rename from experiments/worker-r2-generation-projection/verify.mjs rename to src/Vyral.Cloudflare/WorkerR2GenerationProjection/verify.mjs