diff --git a/PUBLICATION_MANIFEST.md b/PUBLICATION_MANIFEST.md new file mode 100644 index 0000000..fe26425 --- /dev/null +++ b/PUBLICATION_MANIFEST.md @@ -0,0 +1,137 @@ +# Unreleased 0.3.0 publication manifest + +Status: **incomplete; publication held**. This records evidence and remaining gates, +not approval to tag, publish, create a release, dispatch a release workflow or deploy. +The [reopened scope audit](https://github.com/fruwehq/determa-state-examples/issues/21) +supersedes the earlier completion statement. Contracts remain version 1 and machine +documents use numeric `format: 1`. + +## Source identity and review + +These are interim public checkpoints. Final engine, documentation and example +heads, reviewed trees, gate results and package inventories must be replaced together +after the remaining implementations land. + +| Repository | Verified merged main | Evidence | +|---|---|---| +| Specification | `77c0a2e60cd0771a6d44ae170a079ddd51d7d9f0` | PR111, executable-slot/provider identity clarification | +| Conformance | `dc84ed81ea36a5f2140181a97660477a14347ccc` | PR106/109/110/112, independent reviews and validation; last-moment timer lease vectors | +| Python | `2f27a78bd9ab114da0e971e90ba548d55913330c` | PR109, exact reviewed/merged tree match, seven CI checks, independent review | +| Rust | `3edad6322011accf81ece6a30134fa183548aceb` | PR63, exact reviewed/merged tree match, four CI checks, independent review | +| Documentation | `7619c16f8de5c90b660d66badb826ba9be563c06` | Historical candidate; source pins and full manual audit need refresh | +| Examples | `1f339af40ce4f13a88331f89a8f69b7eaf26ead9` | Historical catalog; infrastructure acceptance and final audit remain open | + +Python's merged runtime-provider implementation passed all 52 operational vectors, +505 unit tests (six PostgreSQL skips in that offline run), six actual PostgreSQL +tests, 1,083 conformance tests, 46 authority tests and 43 committed-effect tests. +Rust's merged native implementation passed all seven native inspections, 487 artifact +documents, 52 operational provider vectors, all-features Rust1.86 build/tests +(115 tests including vector loops), Clippy, packaging and 19 fresh native store gates. +These counts establish those checkpoints' scope, not completion of the remaining +optional host implementations. + +Draft Python PR111 and Rust PR65 continue timer and authority/effect integration. +Python timer checkpoint `fd90681c534707ba24826d02b0f962f3b1b84445` passed scoped +independent review, 569 unit tests, 1,083 pinned conformance tests and six dedicated +tests against actual PostgreSQL. It includes spawned-process SIGKILL before and after +coordinated commit, immutable storage-bound original-request/result/artifact evidence +and strictly local native-fate reclaim. Replacement fencing requires the native +writer lock, complete history, permanent checkpoint receipts and unchanged trusted +implementation/configuration. Independently admitted matching events do not become +helper completion proof. Review caught replaceable-method and mutable-code bypasses; +pre-invocation dispatch checks and regression tests resolve them. Verified installation, +archive/recovery/authority composition and the full operational profile are unfinished. +Rust authority checkpoint `9da236c98243d5644d282dd6f61f169f9c64d4c6` passed the full +pinned all-feature run of 131 tests with actual PostgreSQL. Its output-only correction +`85c4c1d1b3c41de2f3f50b241ea4bb5576181659` passed scoped independent review, +all 19 required fresh native execution-store gates with actual PostgreSQL, +all-target Rust1.86 Clippy and all four CI checks. Guarded checkpoint loads +and conflict-return bytes share the same validated native snapshot; immutable allocation +binds original owner bytes/digest. Real staged-write failure and SIGKILL before/after +commit use the same production native SQL; fresh reopen verifies retained replay. +Child stdout isolation preserves strict gate reporting. Complete frozen inventories, +worker fences, fate profile, relocation and committed native effects remain unfinished. +Infrastructure draft PR24 at `10790a63013a657eef7d295892085e873982f505` has a separate +durable provider and bounded foreground process bridge. Eleven tests and scoped +independent review passed, including SIGKILL/SIGSTOP/timeout/restart and exact retained +native evidence. Canonical-byte verification preserves JSON boolean/integer distinctions. +Host/machine/verified-handler integration and the full lifecycle matrix remain unfinished. +Evolving checkpoint SHAs and CI results are recorded in PR bodies and the scope audit. +Scoped review does not approve a full profile. +Only ordinary pushes are permitted; verify each remote head. Earlier force pushes +remain an acknowledged process violation. + +## Distribution contents and registry destinations + +| Artifact | Registry target | Interim reviewed package | +|---|---|---| +| Python wheel | [PyPI determa-state](https://pypi.org/project/determa-state/) | `determa_state-0.3.0-py3-none-any.whl`, 76 files | +| Python source distribution | Same PyPI project | `determa_state-0.3.0.tar.gz`, 125 files | +| Rust crate | [crates.io determa-state](https://crates.io/crates/determa-state) | `determa-state-0.3.0.crate`, 102 files | + +The complete interim file lists, byte sizes and SHA-256 digests are retained in +[Python inventory](audit/packages/python-native-interim.json) and +[Rust inventory](audit/packages/rust-native-interim.json). Python inventory binds +reviewed head `d1d626a15a909d176f915013d88c0fa7a6ba7597`; Rust binds reviewed head +`dadd601ab0587c4b0693a62749b145a7910fcf65` and its merged main. They are **not the final +release artifacts**: timer/authority changes are newer. Regenerate wheel, source +distribution and crate from final reviewed sources, verify metadata and exact contents, +record their digests, and verify exclusions before any publication decision. + +Python's distribution is `determa-state`, import `determa.state`; its namespace package +and declared version-1 JSON schemas are included. Rust's crate/library is +`determa-state`/`determa_state`, with `determa-state` and `determa-state-rust` +validation binaries. Repository-only conformance observations, adapters and excluded +test fixtures must stay outside the published crate. Check new files against package +manifests; an old packaging pass does not prove new files are present or excluded. + +Specification and conformance are public Git repositories, not engine registry +packages. Documentation and examples remain public source and validation artifacts. +No website deployment is authorized. + +## Release workflow and manual approval evidence + +| Repository | Workflow behavior read from source | Actual approval evidence | +|---|---|---| +| Python | `.github/workflows/release.yml`, push `v*`; verifies tag/version, builds wheel/sdist, checks metadata and contents, uploads `dist`; publish job uses `environment: pypi` and OIDC | **Blocked**: live `pypi` reviewers, self-review restriction, branch/tag rules and PyPI Trusted Publisher binding not verified | +| Rust | `.github/workflows/release.yml`, push `v*` or manual dispatch of an existing tag; verifies tag/version, OIDC, `cargo publish --locked` | **Gap**: current job declares no GitHub Environment. Live crates.io Trusted Publisher binding and a required manual publishing gate are not proved | +| Documentation | Only `.github/workflows/docs.yml`; validation on PR/main/schedule/dispatch. `PUBLICATION_HOLD.md` and input hashes prohibit Pages publication steps | Hold present; strict validation required again after final source/content updates | +| Conformance | `.github/workflows/validate.yml` validates public source | No engine package publication workflow | +| Specification | No `.github/workflows` directory at the checkpoint | No package publication workflow | +| Examples | Seven application validation workflows at the historical catalog main | Infrastructure workflow and complete final acceptance remain pending | + +Workflow YAML is evidence of requested behavior, not evidence that GitHub's live +Environment protections or registry Trusted Publisher configuration exist. The +Rust [draft PR67](https://github.com/fruwehq/determa-state-rust/pull/67) proposes a +`crates-io` Environment declaration; it is unmerged and live protection remains unproved. +The connector rejects Environment endpoints and the prepared Cloud proxy blocks +`api.github.com`; do not bypass that boundary or substitute workflow comments for +live settings. Required evidence includes exact repository/environment, required +reviewers, prevention of self-review where applicable, permitted deployment +branches/tags, and the registry's exact repository/workflow/environment binding. +No credential material belongs in this manifest. + +The intended coordinated version is `v0.3.0`, but no tag is authorized or created. +A later publication decision must choose exact final commits and an execution order +for spec, conformance, Python and Rust tags, account for tag-triggered publication, +and provide manual approval at each publishing boundary. This manifest does not +authorize a workflow dispatch or create a registry publisher. + +## Acceptance still required + +- Concrete synchronized Python/Rust timer, archive and recovery providers, registered + against actual source/configuration, with full operational profile vectors. +- Rust committed native effects and complete guarded authority host composition, + inventories, worker fences and proven native transaction fate. +- Same-authority local relocation with source retirement and one-use destination + activation; immutable quarantine and explicit fresh-scope takeover/clone/reconciliation. +- Infrastructure lifecycle application with a separate durable fake provider and + actual process-kill/restart matrix; timer/recovery/relocation examples. +- Final documentation/example source closure and exact immutable engine pins; + regenerated final package inventories and all required gates. +- Live manual approval/registry publisher proof, exact-head independent final audit, + and a separate publication decision. + +Unsupported topologies must refuse explicitly. Schema validation, conditional vectors, +a clock timeout or a readable copy do not prove an operational provider, transaction +rollback, safe takeover or completion of this checklist. diff --git a/README.md b/README.md index 89bba4b..c6b71eb 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,29 @@ MkDocs build. Use `make serve` to preview the site locally. +## What the scripts do + +The scripts maintain this manual and check its runnable examples. They are not +part of the Determa State engine and do not install timers, HTTP endpoints, +archive exporters, or recovery providers. + +| Script | Purpose | Side effects | +|---|---|---| +| [`fetch_sources.py`](scripts/fetch_sources.py) | Fetch the four public repositories at the exact commits in `sources.lock.yaml`; verify checkout identity and cleanliness. | Network reads and local source checkouts. | +| [`source_lock.py`](scripts/source_lock.py) | Read and validate the source-lock metadata. | Reads local files; used by the other scripts. | +| [`install_candidate.py`](scripts/install_candidate.py) | Install the pinned unreleased Python engine and its dependencies for tutorial validation. | Network reads; replaces the engine installation in the Python environment running the command. Use a dedicated virtual environment. | +| [`validate.py`](scripts/validate.py) | Check versions, coverage and links; extract named Markdown fences; validate their syntax/schema; run Python and Rust traces and persistence checks. | Temporary files, local builds and subprocess execution; Cargo may fetch dependencies. `--extract-only` writes `.cache/examples`. | +| [`check_latest.py`](scripts/check_latest.py) | Check public commit identities and that planned coverage issues remain open. For released locks, also check tag identity and latest published versions. | Read-only GitHub API requests. Candidate mode does not require a published 0.3.0 tag. | +| [`publication_hold_bootstrap.py`](scripts/publication_hold_bootstrap.py) | Compare documentation and validation inputs with the local hash inventory before CI installs dependencies or runs Make. | Reads local files. | +| [`check_publication_hold.py`](scripts/check_publication_hold.py) | Check that hash inventory and the expected validation-only workflow/Make recipe. | Reads local files. | + +The publication-hold checks make changes visible; their hashes do not establish +independent review or release readiness. They currently include authored chapters, +so an intended chapter edit also requires refreshing `publication-hold-inputs.json`. +The documentation workflow has read-only repository permissions and no deployment +step. `make check` builds the site locally; none of these scripts publishes it or +publishes engine packages. + ## Status The 0.3.0 tutorial migration is in progress in [#28](https://github.com/fruwehq/determa-state-docs/issues/28). diff --git a/audit/packages/python-native-interim.json b/audit/packages/python-native-interim.json new file mode 100644 index 0000000..c96d180 --- /dev/null +++ b/audit/packages/python-native-interim.json @@ -0,0 +1,221 @@ +{ + "source_head": "d1d626a15a909d176f915013d88c0fa7a6ba7597", + "unreleased_version": "0.3.0", + "artifacts": [ + { + "file": "determa_state-0.3.0-py3-none-any.whl", + "sha256": "c4a19ed58cd2b2ba2825ca2588dca33178564936a82aa7386b58993154a66339", + "bytes": 253744, + "contents": [ + "determa/state/__about__.py", + "determa/state/__init__.py", + "determa/state/__main__.py", + "determa/state/_platform_bindings.py", + "determa/state/application_projection.py", + "determa/state/authority.py", + "determa/state/cel.py", + "determa/state/checkpoint.py", + "determa/state/checkpoint_v1.py", + "determa/state/cli.py", + "determa/state/codes.py", + "determa/state/compilation.py", + "determa/state/data/aggregate-state-package-v1.schema.json", + "determa/state/data/aggregate-state-v1.schema.json", + "determa/state/data/archive-export-request-v1.schema.json", + "determa/state/data/archive-import-request-v1.schema.json", + "determa/state/data/archive-participant-v1.schema.json", + "determa/state/data/archive-result-v1.schema.json", + "determa/state/data/archive-v1.schema.json", + "determa/state/data/compilation-manifest-v1.schema.json", + "determa/state/data/core-step-result-v1.schema.json", + "determa/state/data/effect-cancellation-request-v1.schema.json", + "determa/state/data/effect-cancellation-response-v1.schema.json", + "determa/state/data/effect-result-request-v1.schema.json", + "determa/state/data/effect-result-response-v1.schema.json", + "determa/state/data/execution-checkpoint-v1.schema.json", + "determa/state/data/extension-capability-report-v1.schema.json", + "determa/state/data/extension-capability-requirement-v1.schema.json", + "determa/state/data/extension-descriptor-v1.schema.json", + "determa/state/data/host-authority-operation-v1.schema.json", + "determa/state/data/host-authority-profile-report-v1.schema.json", + "determa/state/data/host-effect-claim-v1.schema.json", + "determa/state/data/host-effect-journal-v1.schema.json", + "determa/state/data/inspection-v1.schema.json", + "determa/state/data/language-source-v1.schema.json", + "determa/state/data/machine.schema.json", + "determa/state/data/migration-descriptor-v1.schema.json", + "determa/state/data/provider-reference-v1.schema.json", + "determa/state/data/public-host-request-v1.schema.json", + "determa/state/data/public-host-response-v1.schema.json", + "determa/state/data/recovery-operation-v1.schema.json", + "determa/state/data/recovery-record-v1.schema.json", + "determa/state/data/runtime-action-output-v1.schema.json", + "determa/state/data/runtime-provider-descriptor-v1.schema.json", + "determa/state/data/timer-helper-operation-v1.schema.json", + "determa/state/definition.py", + "determa/state/effects.py", + "determa/state/engine.py", + "determa/state/errors.py", + "determa/state/extensions.py", + "determa/state/host.py", + "determa/state/inspection.py", + "determa/state/inspection_cel.py", + "determa/state/migration.py", + "determa/state/model.py", + "determa/state/persistence.py", + "determa/state/public_client.py", + "determa/state/public_host.py", + "determa/state/py.typed", + "determa/state/queueing.py", + "determa/state/runtime_providers.py", + "determa/state/stores/__init__.py", + "determa/state/stores/base.py", + "determa/state/stores/file.py", + "determa/state/stores/memory.py", + "determa/state/stores/postgresql.py", + "determa/state/stores/registry.py", + "determa/state/stores/sqlite.py", + "determa/state/validator.py", + "determa/state/wire.py", + "determa/state/yaml12.py", + "determa_state-0.3.0.dist-info/METADATA", + "determa_state-0.3.0.dist-info/RECORD", + "determa_state-0.3.0.dist-info/WHEEL", + "determa_state-0.3.0.dist-info/entry_points.txt", + "determa_state-0.3.0.dist-info/licenses/LICENSE" + ] + }, + { + "file": "determa_state-0.3.0.tar.gz", + "sha256": "348cab807a0e1dde616ac47f7eb00a4b55265928a00ffacab7aa5523435ef625", + "bytes": 324458, + "contents": [ + "determa_state-0.3.0/.github/workflows/release.yml", + "determa_state-0.3.0/.github/workflows/test.yml", + "determa_state-0.3.0/.gitignore", + "determa_state-0.3.0/AGENTS.md", + "determa_state-0.3.0/CONTRIBUTING.md", + "determa_state-0.3.0/LICENSE", + "determa_state-0.3.0/Makefile", + "determa_state-0.3.0/PKG-INFO", + "determa_state-0.3.0/README.md", + "determa_state-0.3.0/conformance/__init__.py", + "determa_state-0.3.0/conformance/authority_adapter.py", + "determa_state-0.3.0/conformance/conftest.py", + "determa_state-0.3.0/conformance/durable_host.py", + "determa_state-0.3.0/conformance/effects_adapter.py", + "determa_state-0.3.0/conformance/extension_negotiation_adapter.py", + "determa_state-0.3.0/conformance/harness.py", + "determa_state-0.3.0/conformance/persistence_host.py", + "determa_state-0.3.0/conformance/pins.py", + "determa_state-0.3.0/conformance/provider_fixture.py", + "determa_state-0.3.0/conformance/runtime_provider_adapter.py", + "determa_state-0.3.0/conformance/test_application_projection.py", + "determa_state-0.3.0/conformance/test_conformance.py", + "determa_state-0.3.0/conformance/test_extension_negotiation.py", + "determa_state-0.3.0/conformance/test_inspection.py", + "determa_state-0.3.0/conformance/test_inspection_provider.py", + "determa_state-0.3.0/conformance/test_public_host.py", + "determa_state-0.3.0/conformance/test_runtime_provider.py", + "determa_state-0.3.0/conformance/version1.py", + "determa_state-0.3.0/conformance/worker_authority_adapter.py", + "determa_state-0.3.0/examples/format-1.yaml", + "determa_state-0.3.0/pyproject.toml", + "determa_state-0.3.0/scripts/sync_schema.py", + "determa_state-0.3.0/scripts/verify_distribution.py", + "determa_state-0.3.0/scripts/verify_release_tag.py", + "determa_state-0.3.0/src/determa/state/__about__.py", + "determa_state-0.3.0/src/determa/state/__init__.py", + "determa_state-0.3.0/src/determa/state/__main__.py", + "determa_state-0.3.0/src/determa/state/_platform_bindings.py", + "determa_state-0.3.0/src/determa/state/application_projection.py", + "determa_state-0.3.0/src/determa/state/authority.py", + "determa_state-0.3.0/src/determa/state/cel.py", + "determa_state-0.3.0/src/determa/state/checkpoint.py", + "determa_state-0.3.0/src/determa/state/checkpoint_v1.py", + "determa_state-0.3.0/src/determa/state/cli.py", + "determa_state-0.3.0/src/determa/state/codes.py", + "determa_state-0.3.0/src/determa/state/compilation.py", + "determa_state-0.3.0/src/determa/state/data/aggregate-state-package-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/aggregate-state-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/archive-export-request-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/archive-import-request-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/archive-participant-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/archive-result-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/archive-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/compilation-manifest-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/core-step-result-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/effect-cancellation-request-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/effect-cancellation-response-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/effect-result-request-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/effect-result-response-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/execution-checkpoint-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/extension-capability-report-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/extension-capability-requirement-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/extension-descriptor-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/host-authority-operation-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/host-authority-profile-report-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/host-effect-claim-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/host-effect-journal-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/inspection-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/language-source-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/machine.schema.json", + "determa_state-0.3.0/src/determa/state/data/migration-descriptor-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/provider-reference-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/public-host-request-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/public-host-response-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/recovery-operation-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/recovery-record-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/runtime-action-output-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/runtime-provider-descriptor-v1.schema.json", + "determa_state-0.3.0/src/determa/state/data/timer-helper-operation-v1.schema.json", + "determa_state-0.3.0/src/determa/state/definition.py", + "determa_state-0.3.0/src/determa/state/effects.py", + "determa_state-0.3.0/src/determa/state/engine.py", + "determa_state-0.3.0/src/determa/state/errors.py", + "determa_state-0.3.0/src/determa/state/extensions.py", + "determa_state-0.3.0/src/determa/state/host.py", + "determa_state-0.3.0/src/determa/state/inspection.py", + "determa_state-0.3.0/src/determa/state/inspection_cel.py", + "determa_state-0.3.0/src/determa/state/migration.py", + "determa_state-0.3.0/src/determa/state/model.py", + "determa_state-0.3.0/src/determa/state/persistence.py", + "determa_state-0.3.0/src/determa/state/public_client.py", + "determa_state-0.3.0/src/determa/state/public_host.py", + "determa_state-0.3.0/src/determa/state/py.typed", + "determa_state-0.3.0/src/determa/state/queueing.py", + "determa_state-0.3.0/src/determa/state/runtime_providers.py", + "determa_state-0.3.0/src/determa/state/stores/__init__.py", + "determa_state-0.3.0/src/determa/state/stores/base.py", + "determa_state-0.3.0/src/determa/state/stores/file.py", + "determa_state-0.3.0/src/determa/state/stores/memory.py", + "determa_state-0.3.0/src/determa/state/stores/postgresql.py", + "determa_state-0.3.0/src/determa/state/stores/registry.py", + "determa_state-0.3.0/src/determa/state/stores/sqlite.py", + "determa_state-0.3.0/src/determa/state/validator.py", + "determa_state-0.3.0/src/determa/state/wire.py", + "determa_state-0.3.0/src/determa/state/yaml12.py", + "determa_state-0.3.0/tests/.gitkeep", + "determa_state-0.3.0/tests/__init__.py", + "determa_state-0.3.0/tests/test_application_projection_postgresql.py", + "determa_state-0.3.0/tests/test_cel.py", + "determa_state-0.3.0/tests/test_checkpoint_v1.py", + "determa_state-0.3.0/tests/test_cli.py", + "determa_state-0.3.0/tests/test_committed_effects.py", + "determa_state-0.3.0/tests/test_engine.py", + "determa_state-0.3.0/tests/test_execution_stores.py", + "determa_state-0.3.0/tests/test_extensions.py", + "determa_state-0.3.0/tests/test_inspection.py", + "determa_state-0.3.0/tests/test_loading.py", + "determa_state-0.3.0/tests/test_local_authority.py", + "determa_state-0.3.0/tests/test_portable_codes.py", + "determa_state-0.3.0/tests/test_postgresql_store.py", + "determa_state-0.3.0/tests/test_public_client.py", + "determa_state-0.3.0/tests/test_public_host.py", + "determa_state-0.3.0/tests/test_release_checks.py", + "determa_state-0.3.0/tests/test_runtime_import_edges.py", + "determa_state-0.3.0/tests/test_runtime_providers.py" + ] + } + ] +} diff --git a/audit/packages/rust-native-interim.json b/audit/packages/rust-native-interim.json new file mode 100644 index 0000000..0ef5f97 --- /dev/null +++ b/audit/packages/rust-native-interim.json @@ -0,0 +1,416 @@ +{ + "reviewed_head": "dadd601ab0587c4b0693a62749b145a7910fcf65", + "merged_head": "3edad6322011accf81ece6a30134fa183548aceb", + "package": "determa-state-0.3.0.crate", + "sha256": "ba6072f78cb870e3698a9423c28bdec383c4b4e9005e401ff244122edd2d7621", + "contents": [ + { + "path": "determa-state-0.3.0/.cargo_vcs_info.json", + "bytes": 94 + }, + { + "path": "determa-state-0.3.0/.gitignore", + "bytes": 918 + }, + { + "path": "determa-state-0.3.0/.gitmodules", + "bytes": 122 + }, + { + "path": "determa-state-0.3.0/AGENTS.md", + "bytes": 5231 + }, + { + "path": "determa-state-0.3.0/Cargo.lock", + "bytes": 44888 + }, + { + "path": "determa-state-0.3.0/Cargo.toml", + "bytes": 3072 + }, + { + "path": "determa-state-0.3.0/Cargo.toml.orig", + "bytes": 2215 + }, + { + "path": "determa-state-0.3.0/LICENSE", + "bytes": 1080 + }, + { + "path": "determa-state-0.3.0/README.md", + "bytes": 14772 + }, + { + "path": "determa-state-0.3.0/build.rs", + "bytes": 1571 + }, + { + "path": "determa-state-0.3.0/examples/full.yaml", + "bytes": 6291 + }, + { + "path": "determa-state-0.3.0/examples/minimal.yaml", + "bytes": 577 + }, + { + "path": "determa-state-0.3.0/schema/aggregate-state-package-v1.schema.json", + "bytes": 1734 + }, + { + "path": "determa-state-0.3.0/schema/aggregate-state-v1.schema.json", + "bytes": 22822 + }, + { + "path": "determa-state-0.3.0/schema/application-projection-v1.schema.json", + "bytes": 15704 + }, + { + "path": "determa-state-0.3.0/schema/archive-export-request-v1.schema.json", + "bytes": 1310 + }, + { + "path": "determa-state-0.3.0/schema/archive-import-request-v1.schema.json", + "bytes": 1449 + }, + { + "path": "determa-state-0.3.0/schema/archive-participant-v1.schema.json", + "bytes": 2219 + }, + { + "path": "determa-state-0.3.0/schema/archive-result-v1.schema.json", + "bytes": 8575 + }, + { + "path": "determa-state-0.3.0/schema/archive-v1.schema.json", + "bytes": 11886 + }, + { + "path": "determa-state-0.3.0/schema/compilation-manifest-v1.schema.json", + "bytes": 1210 + }, + { + "path": "determa-state-0.3.0/schema/core-step-result-v1.schema.json", + "bytes": 6040 + }, + { + "path": "determa-state-0.3.0/schema/delivery-v1.schema.json", + "bytes": 23828 + }, + { + "path": "determa-state-0.3.0/schema/durable-host-call-log-v1.schema.json", + "bytes": 1080 + }, + { + "path": "determa-state-0.3.0/schema/durable-host-inputs-v1.schema.json", + "bytes": 18038 + }, + { + "path": "determa-state-0.3.0/schema/durable-host-responses-v1.schema.json", + "bytes": 14400 + }, + { + "path": "determa-state-0.3.0/schema/durable-host-results-v1.schema.json", + "bytes": 1671 + }, + { + "path": "determa-state-0.3.0/schema/durable-host-store-v1.schema.json", + "bytes": 1620 + }, + { + "path": "determa-state-0.3.0/schema/effect-cancellation-request-v1.schema.json", + "bytes": 702 + }, + { + "path": "determa-state-0.3.0/schema/effect-cancellation-response-v1.schema.json", + "bytes": 4396 + }, + { + "path": "determa-state-0.3.0/schema/effect-result-request-v1.schema.json", + "bytes": 1155 + }, + { + "path": "determa-state-0.3.0/schema/effect-result-response-v1.schema.json", + "bytes": 4291 + }, + { + "path": "determa-state-0.3.0/schema/execution-checkpoint-v1.schema.json", + "bytes": 27494 + }, + { + "path": "determa-state-0.3.0/schema/extension-capability-report-v1.schema.json", + "bytes": 7665 + }, + { + "path": "determa-state-0.3.0/schema/extension-capability-requirement-v1.schema.json", + "bytes": 6317 + }, + { + "path": "determa-state-0.3.0/schema/extension-descriptor-v1.schema.json", + "bytes": 7681 + }, + { + "path": "determa-state-0.3.0/schema/host-authority-operation-v1.schema.json", + "bytes": 13883 + }, + { + "path": "determa-state-0.3.0/schema/host-authority-profile-report-v1.schema.json", + "bytes": 5311 + }, + { + "path": "determa-state-0.3.0/schema/host-effect-journal-v1.schema.json", + "bytes": 9436 + }, + { + "path": "determa-state-0.3.0/schema/inspection-v1.schema.json", + "bytes": 12929 + }, + { + "path": "determa-state-0.3.0/schema/language-source-v1.schema.json", + "bytes": 1573 + }, + { + "path": "determa-state-0.3.0/schema/lossless-delivery-v1.schema.json", + "bytes": 8592 + }, + { + "path": "determa-state-0.3.0/schema/machine.schema.json", + "bytes": 34570 + }, + { + "path": "determa-state-0.3.0/schema/migration-descriptor-v1.schema.json", + "bytes": 16739 + }, + { + "path": "determa-state-0.3.0/schema/provider-reference-v1.schema.json", + "bytes": 810 + }, + { + "path": "determa-state-0.3.0/schema/public-host-request-v1.schema.json", + "bytes": 16398 + }, + { + "path": "determa-state-0.3.0/schema/public-host-response-v1.schema.json", + "bytes": 107760 + }, + { + "path": "determa-state-0.3.0/schema/recovery-operation-v1.schema.json", + "bytes": 37830 + }, + { + "path": "determa-state-0.3.0/schema/recovery-record-v1.schema.json", + "bytes": 6751 + }, + { + "path": "determa-state-0.3.0/schema/runtime-action-output-v1.schema.json", + "bytes": 3167 + }, + { + "path": "determa-state-0.3.0/schema/runtime-provider-descriptor-v1.schema.json", + "bytes": 813 + }, + { + "path": "determa-state-0.3.0/schema/timer-helper-operation-v1.schema.json", + "bytes": 14303 + }, + { + "path": "determa-state-0.3.0/schema/version1-operation-failures.schema.json", + "bytes": 1005 + }, + { + "path": "determa-state-0.3.0/schema/version1-operation-inputs.schema.json", + "bytes": 10274 + }, + { + "path": "determa-state-0.3.0/schema/version1-operation-result.schema.json", + "bytes": 9818 + }, + { + "path": "determa-state-0.3.0/scripts/native-gates.json", + "bytes": 5526 + }, + { + "path": "determa-state-0.3.0/scripts/native_gate_report.py", + "bytes": 4432 + }, + { + "path": "determa-state-0.3.0/scripts/test_native_gate_report.py", + "bytes": 1616 + }, + { + "path": "determa-state-0.3.0/scripts/test_release_metadata.py", + "bytes": 2683 + }, + { + "path": "determa-state-0.3.0/scripts/verify_msrv.py", + "bytes": 1622 + }, + { + "path": "determa-state-0.3.0/scripts/verify_release_tag.py", + "bytes": 1193 + }, + { + "path": "determa-state-0.3.0/src/bin/determa_state.rs", + "bytes": 133 + }, + { + "path": "determa-state-0.3.0/src/bin/determa_state_rust.rs", + "bytes": 133 + }, + { + "path": "determa-state-0.3.0/src/checkpoint/adapter_policy.rs", + "bytes": 8266 + }, + { + "path": "determa-state-0.3.0/src/checkpoint/adapters/file.rs", + "bytes": 8350 + }, + { + "path": "determa-state-0.3.0/src/checkpoint/adapters/memory.rs", + "bytes": 3371 + }, + { + "path": "determa-state-0.3.0/src/checkpoint/adapters/mod.rs", + "bytes": 460 + }, + { + "path": "determa-state-0.3.0/src/checkpoint/adapters/postgresql.rs", + "bytes": 24130 + }, + { + "path": "determa-state-0.3.0/src/checkpoint/adapters/sqlite.rs", + "bytes": 31281 + }, + { + "path": "determa-state-0.3.0/src/checkpoint/host.rs", + "bytes": 98873 + }, + { + "path": "determa-state-0.3.0/src/checkpoint/mod.rs", + "bytes": 2565 + }, + { + "path": "determa-state-0.3.0/src/checkpoint/store.rs", + "bytes": 34758 + }, + { + "path": "determa-state-0.3.0/src/checkpoint/types.rs", + "bytes": 7962 + }, + { + "path": "determa-state-0.3.0/src/checkpoint/v1.rs", + "bytes": 110484 + }, + { + "path": "determa-state-0.3.0/src/cli.rs", + "bytes": 1414 + }, + { + "path": "determa-state-0.3.0/src/extensions.rs", + "bytes": 50679 + }, + { + "path": "determa-state-0.3.0/src/format1/cel.rs", + "bytes": 35974 + }, + { + "path": "determa-state-0.3.0/src/format1/compile.rs", + "bytes": 77357 + }, + { + "path": "determa-state-0.3.0/src/format1/contracts.rs", + "bytes": 10614 + }, + { + "path": "determa-state-0.3.0/src/format1/counter.rs", + "bytes": 2641 + }, + { + "path": "determa-state-0.3.0/src/format1/inspection.rs", + "bytes": 19261 + }, + { + "path": "determa-state-0.3.0/src/format1/inspection_cel.rs", + "bytes": 28678 + }, + { + "path": "determa-state-0.3.0/src/format1/migration.rs", + "bytes": 60917 + }, + { + "path": "determa-state-0.3.0/src/format1/mod.rs", + "bytes": 1867 + }, + { + "path": "determa-state-0.3.0/src/format1/model.rs", + "bytes": 9620 + }, + { + "path": "determa-state-0.3.0/src/format1/native.rs", + "bytes": 74957 + }, + { + "path": "determa-state-0.3.0/src/format1/package.rs", + "bytes": 6819 + }, + { + "path": "determa-state-0.3.0/src/format1/persistence.rs", + "bytes": 2859 + }, + { + "path": "determa-state-0.3.0/src/format1/providers/common.rs", + "bytes": 6672 + }, + { + "path": "determa-state-0.3.0/src/format1/providers/compilation.rs", + "bytes": 10329 + }, + { + "path": "determa-state-0.3.0/src/format1/providers.rs", + "bytes": 22574 + }, + { + "path": "determa-state-0.3.0/src/format1/runtime.rs", + "bytes": 183131 + }, + { + "path": "determa-state-0.3.0/src/format1/source.rs", + "bytes": 22072 + }, + { + "path": "determa-state-0.3.0/src/format1/strict_json.rs", + "bytes": 6682 + }, + { + "path": "determa-state-0.3.0/src/format1/v1.rs", + "bytes": 88628 + }, + { + "path": "determa-state-0.3.0/src/lib.rs", + "bytes": 1893 + }, + { + "path": "determa-state-0.3.0/src/public_host/local.rs", + "bytes": 26638 + }, + { + "path": "determa-state-0.3.0/src/public_host.rs", + "bytes": 25898 + }, + { + "path": "determa-state-0.3.0/src/value.rs", + "bytes": 8659 + }, + { + "path": "determa-state-0.3.0/tests/adapter_selection.rs", + "bytes": 19841 + }, + { + "path": "determa-state-0.3.0/tests/native_worker_composition.rs", + "bytes": 15646 + }, + { + "path": "determa-state-0.3.0/tests/public_api.rs", + "bytes": 10235 + } + ] +} diff --git a/docs/guides/optional-host-profiles.md b/docs/guides/optional-host-profiles.md index 4c0711b..a11f732 100644 --- a/docs/guides/optional-host-profiles.md +++ b/docs/guides/optional-host-profiles.md @@ -11,6 +11,29 @@ capabilities. Registration identifies a provider; operational verification must prove the configured instance, source closure, health and transaction boundary. A provider name or a Boolean claim cannot establish those facts. +## Application choices and candidate acceptance + +These profiles are optional for an application: select the host boundaries your +application needs. The approved 0.3.0 implementation plan requires concrete providers +in both engines and executable evidence for each promised boundary. Schemas, +conditional vectors and a provider descriptor alone do not satisfy that plan. +Publication remains held in the [reopened scope audit](https://github.com/fruwehq/determa-state-examples/issues/21). + +Python and Rust now both execute the seven native inspection vectors and all 52 +runtime-provider vectors through reviewed production operations. Rust's native-effect +journal, complete local authority profile and the synchronized archive, timer and +recovery implementations are still under development. Python's timer draft includes +actual coordinated admission, strictly local native-fate reclaim and process-kill +restart tests; verified installation, archive/recovery/authority composition and the +full operational profile are unfinished. Those draft tests +prove their stated transaction cuts, not the entire recovery or relocation contract. + +The [publication manifest](https://github.com/fruwehq/determa-state-docs/blob/fruwe/publication-manifest-v030/PUBLICATION_MANIFEST.md) +records interim package inventories, source identities and remaining approval evidence. +Use the exact reviewed checkpoint and its scope when assessing a capability. Final +manual pins and examples will be refreshed after the implementations pass their +complete operational gates and independent reviews. + ## Select only the capabilities you can prove A host resolves an exact provider reference and configuration, then verifies its @@ -28,7 +51,7 @@ do not establish distributed coordination or exactly-once external delivery. ## Scope authority and worker fencing -The local authority implementation stores epochs, generations, guarded writes, worker +Python's local authority implementation stores epochs, generations, guarded writes, worker claims and inventory evidence in the same tested SQLite boundary as the checkpoint. A guarded commit checks the current authority and worker fence again at commit. Freezing stops new authorized work; retirement and destination activation require @@ -94,7 +117,7 @@ all observable decisions; ignoring any of them prevents a lossless claim. An unhandled machine input differs from a malformed ingress item. Outbox retention and idempotent destinations govern external delivery independently of machine handling. -## Archives, timers and recovery remain conditional +## Archives, timers and recovery require concrete providers An archive is a consistent snapshot of explicitly selected root checkpoints and their complete declared participant closure. It retains queues, receipts, tombstones, diff --git a/publication-hold-inputs.json b/publication-hold-inputs.json index 3989129..9b3aa82 100644 --- a/publication-hold-inputs.json +++ b/publication-hold-inputs.json @@ -3,7 +3,10 @@ "inputs": { ".github/workflows/docs.yml": "98feb6fb55f8f94a373b867e1d8df881ae76a7ecc85bd719e374f85f3666be39", "Makefile": "b45013c9f49a46d8674279c9c510b21662c30f7d442842143c296ce08a067cc6", + "PUBLICATION_MANIFEST.md": "7eeb0fe65d466c58c61915aa82efe11857d8388035230b986f3dd89c6a89ae6d", "STATE_VERSION": "d915cc95d6ca8f47ae297713ed46d4e5c5d99ddd29fc3c61e263bdf305f2b5b0", + "audit/packages/python-native-interim.json": "b5a263ce51f26cf15c3dcb2bc09acea9de3794b14a00fc3a9f4fb904ab8cf129", + "audit/packages/rust-native-interim.json": "f920c990b2ea3fbc8f79eaa45cefe986b60eb3c67aa8b1059a518ad1fd9d9f65", "coverage.yaml": "a178158574a9c1b905475ad177aea6183fb211a80d8625c3f2e2143897432bab", "docs/getting-started/first-machine.md": "284d101d28a235693039a9bc9ec1bfe9d853d9397a0cd7f025bc802a0a418c73", "docs/guides/cel-and-actions.md": "120992ac43c9dd4d521076bb4ea2917bb79b68d53daf647e38bd3a3858d4293b", @@ -12,7 +15,7 @@ "docs/guides/effects-faults-hosting.md": "b114c279433a5c70c4fbdfed762f7821e3b3aa11b542a9cc743f926daacdce69", "docs/guides/execution-checkpoint-hosting.md": "ba872d3984a1c016a7a358dd998fcc546ea0085e830c37042ca49d9d792b85de", "docs/guides/mailboxes-and-inspection.md": "20bf6ab2c3c5cd10438e5e79c42d9af4d4f63f944d68c3eebc8eba8caecb1779", - "docs/guides/optional-host-profiles.md": "aa263546c0ff81d966dd1177e61b4171b2e00d75f065a1c5c83bfe129a4ce6b0", + "docs/guides/optional-host-profiles.md": "9162da9a97ecaea8e9b1b20cfde224d7264edaf20ee58579aedf5a3f9aa23acc", "docs/guides/persistence-and-migration.md": "cb73026ee3fcbb4bc1ca9fc3e760f8e11e01152f3f5effeee2bd4c30d783fcc2", "docs/guides/persistence-migration-reference.md": "8dc9d7f7073fdd705403dac5822600923ce2e817dee247f5770f4362c346325f", "docs/guides/public-host-client.md": "ab845f75729568f830a3e1357bc1afcb2d0db95e7556f9ad230c3a26bf9a0c5a", @@ -24,10 +27,10 @@ "scripts/check_publication_hold.py": "a1a3e558d0645c62e92e4dff16fb20bfc1126fc5b0edc560ccba9f656d398b1c", "scripts/fetch_sources.py": "6121fcbcac44c2866b0a2fffbfaf88cd97c8e9acf99aece602afd7ee68c2298e", "scripts/install_candidate.py": "b065a9b6ac2db841d84230c8b217647384019f4b96cdb790c095345ba050db6a", - "scripts/publication_hold_bootstrap.py": "5b294b526f474b94a07e424d725210988ca6cbbfcc59a6e7a2b27fb6ef3af1c4", + "scripts/publication_hold_bootstrap.py": "cace2dd6d3f9a1f2c1e6a57bd921e338598da50f4b6d2f6dc100c2010f04e2e2", "scripts/source_lock.py": "f546284e8701dadd01ae053be30ffc13e08bdfcfc15edf9b98c4fc41ce93cfb0", "scripts/validate.py": "37a061f5714db590d98a17781604aa64bcef6dfad63666e5547a05798937fb39", "sources.lock.yaml": "153650e624f737cd46417b478e8a737c7038e6086d2264a1ff966632da5f244b", - "tests/test_publication_hold.py": "438dea3a3fd0bb971683a683c64555e58cca267f533e1032f7af7cd1111c466e" + "tests/test_publication_hold.py": "feee38212c5416827b176e17f05a4175973ecfd80193d8ccacb54b78fe9d91c4" } } diff --git a/scripts/publication_hold_bootstrap.py b/scripts/publication_hold_bootstrap.py index 22c3ca3..d06c033 100644 --- a/scripts/publication_hold_bootstrap.py +++ b/scripts/publication_hold_bootstrap.py @@ -20,9 +20,10 @@ def reviewed_inputs(root: Path) -> dict[str, str]: "sources.lock.yaml", "STATE_VERSION", "coverage.yaml", + "PUBLICATION_MANIFEST.md", ) ] - for directory in (".github/workflows", "docs", "scripts", "tests"): + for directory in (".github/workflows", "docs", "scripts", "tests", "audit"): files.extend( path for path in (root / directory).rglob("*") if path.is_file() and "__pycache__" not in path.parts and path.suffix != ".pyc" diff --git a/tests/test_publication_hold.py b/tests/test_publication_hold.py index a5c4a7d..5cc60b0 100644 --- a/tests/test_publication_hold.py +++ b/tests/test_publication_hold.py @@ -75,10 +75,16 @@ def test_pages_hold_covers_every_workflow_trigger(tmp_path): "split_gh_api_argv", "imported_dependency_change", "runnable_markdown_change", + "publication_manifest_change", + "package_inventory_change", ]) def test_publication_hold_rejects_other_paths(tmp_path, attack): workflow = hold_fixture(tmp_path) - if attack == "second_workflow": + if attack == "publication_manifest_change": + (tmp_path / "PUBLICATION_MANIFEST.md").write_text("Publication approved\n") + elif attack == "package_inventory_change": + (tmp_path / "audit/packages/python-native-interim.json").write_text("{}\n") + elif attack == "second_workflow": (workflow.parent / "deploy.yml").write_text("jobs: {}\n") elif attack == "local_action": action = tmp_path / ".github/actions/deploy/action.yml"